[mutter] backend: Add API to get UI scaling
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] backend: Add API to get UI scaling
- Date: Fri, 7 Apr 2017 14:37:31 +0000 (UTC)
commit 1bdadfa3e11d684e2e0d5578f5cff0ce4170a370
Author: Jonas Ådahl <jadahl gmail com>
Date: Wed Mar 29 17:33:13 2017 +0800
backend: Add API to get UI scaling
The UI scaling depends on whether the framebuffers are scaled. Enable
the caller to determine the what scale its UI should be drawn in, in
relation to the stage coordinate space by calling this function. A new
singal "ui-scaling-factor-changed" is added in order to liston for for
changes.
https://bugzilla.gnome.org/show_bug.cgi?id=777732
src/backends/meta-backend-private.h | 4 +++
src/backends/meta-backend.c | 46 +++++++++++++++++++++++++++++++++++
src/backends/meta-monitor-manager.c | 1 +
src/core/display.c | 2 +
src/meta/meta-backend.h | 2 +
5 files changed, 55 insertions(+), 0 deletions(-)
---
diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h
index e5acc1c..08ba04f 100644
--- a/src/backends/meta-backend-private.h
+++ b/src/backends/meta-backend-private.h
@@ -106,6 +106,8 @@ typedef enum _MetaExperimentalFeature
void meta_init_backend (GType backend_gtype);
+void meta_backend_display_opened (MetaBackend *backend);
+
ClutterBackend * meta_backend_get_clutter_backend (MetaBackend *backend);
MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend *backend,
@@ -172,4 +174,6 @@ void meta_backend_notify_keymap_changed (MetaBackend *backend);
void meta_backend_notify_keymap_layout_group_changed (MetaBackend *backend,
unsigned int locked_group);
+void meta_backend_notify_ui_scaling_factor_changed (MetaBackend *backend);
+
#endif /* META_BACKEND_PRIVATE_H */
diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
index f33e300..7281a37 100644
--- a/src/backends/meta-backend.c
+++ b/src/backends/meta-backend.c
@@ -43,6 +43,7 @@
#include "backends/meta-idle-monitor-private.h"
#include "backends/meta-logical-monitor.h"
#include "backends/meta-monitor-manager-dummy.h"
+#include "ui/theme-private.h"
enum
{
@@ -50,6 +51,7 @@ enum
KEYMAP_LAYOUT_GROUP_CHANGED,
LAST_DEVICE_CHANGED,
EXPERIMENTAL_FEATURES_CHANGED,
+ UI_SCALING_FACTOR_CHANGED,
N_SIGNALS
};
@@ -556,6 +558,13 @@ meta_backend_class_init (MetaBackendClass *klass)
0,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
+ signals[UI_SCALING_FACTOR_CHANGED] =
+ g_signal_new ("ui-scaling-factor-changed",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL, NULL,
+ G_TYPE_NONE, 0);
}
static gboolean
@@ -965,6 +974,28 @@ meta_clutter_init (void)
meta_backend_post_init (_backend);
}
+static void
+xft_dpi_changed (GtkSettings *settings,
+ GParamSpec *pspec,
+ MetaBackend *backend)
+{
+ meta_backend_notify_ui_scaling_factor_changed (backend);
+}
+
+void
+meta_backend_display_opened (MetaBackend *backend)
+{
+ /*
+ * gdk-window-scaling-factor is not exported to gtk-settings
+ * because it is handled inside gdk, so we use gtk-xft-dpi instead
+ * which also changes when the scale factor changes.
+ *
+ * TODO: Don't rely on GtkSettings for this
+ */
+ g_signal_connect (gtk_settings_get_default (), "notify::gtk-xft-dpi",
+ G_CALLBACK (xft_dpi_changed), backend);
+}
+
gboolean
meta_is_stage_views_enabled (void)
{
@@ -1034,3 +1065,18 @@ meta_backend_notify_keymap_layout_group_changed (MetaBackend *backend,
g_signal_emit (backend, signals[KEYMAP_LAYOUT_GROUP_CHANGED], 0,
locked_group);
}
+
+int
+meta_backend_get_ui_scaling_factor (MetaBackend *backend)
+{
+ if (meta_is_stage_views_scaled ())
+ return 1;
+ else
+ return meta_theme_get_window_scaling_factor ();
+}
+
+void
+meta_backend_notify_ui_scaling_factor_changed (MetaBackend *backend)
+{
+ g_signal_emit (backend, signals[UI_SCALING_FACTOR_CHANGED], 0);
+}
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 85441f7..7bd9afa 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -537,6 +537,7 @@ experimental_features_changed (MetaBackend *backend,
skeleton, is_config_manager_enabled);
meta_monitor_manager_on_hotplug (manager);
+ meta_backend_notify_ui_scaling_factor_changed (backend);
}
}
diff --git a/src/core/display.c b/src/core/display.c
index 64c41d1..3779543 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -963,6 +963,8 @@ meta_display_open (void)
meta_screen_init_workspaces (screen);
+ meta_backend_display_opened (meta_get_backend ());
+
enable_compositor (display);
meta_screen_create_guard_window (screen);
diff --git a/src/meta/meta-backend.h b/src/meta/meta-backend.h
index 152cfc1..3010fa5 100644
--- a/src/meta/meta-backend.h
+++ b/src/meta/meta-backend.h
@@ -48,6 +48,8 @@ void meta_backend_lock_layout_group (MetaBackend *backend,
void meta_backend_set_numlock (MetaBackend *backend,
gboolean numlock_state);
+int meta_backend_get_ui_scaling_factor (MetaBackend *backend);
+
ClutterActor *meta_backend_get_stage (MetaBackend *backend);
MetaDnd *meta_backend_get_dnd (MetaBackend *backend);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]