[gnome-flashback] backends: add gf_settings_get_ui_scaling_factor



commit 7ed22d42d62e0bebff970f069fdc9738a0d9e7bb
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sat Mar 23 20:02:45 2019 +0200

    backends: add gf_settings_get_ui_scaling_factor

 backends/gf-backend.c          |  3 ++
 backends/gf-settings-private.h |  6 ++-
 backends/gf-settings.c         | 89 +++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 95 insertions(+), 3 deletions(-)
---
diff --git a/backends/gf-backend.c b/backends/gf-backend.c
index fb69dbc..81d8862 100644
--- a/backends/gf-backend.c
+++ b/backends/gf-backend.c
@@ -134,6 +134,7 @@ gf_backend_new (GfBackendType type)
 {
   GType gtype;
   GfBackend *backend;
+  GfBackendPrivate *priv;
   GError *error;
 
   switch (type)
@@ -156,6 +157,7 @@ gf_backend_new (GfBackendType type)
     }
 
   backend = g_object_new (gtype, NULL);
+  priv = gf_backend_get_instance_private (backend);
 
   error = NULL;
   if (!g_initable_init (G_INITABLE (backend), NULL, &error))
@@ -169,6 +171,7 @@ gf_backend_new (GfBackendType type)
     }
 
   GF_BACKEND_GET_CLASS (backend)->post_init (backend);
+  gf_settings_post_init (priv->settings);
 
   return backend;
 }
diff --git a/backends/gf-settings-private.h b/backends/gf-settings-private.h
index fae5406..62d11bf 100644
--- a/backends/gf-settings-private.h
+++ b/backends/gf-settings-private.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 Alberts Muktupāvels
+ * Copyright (C) 2017-2019 Alberts Muktupāvels
  * Copyright (C) 2017 Red Hat
  *
  * This program is free software: you can redistribute it and/or modify
@@ -32,6 +32,10 @@ G_DECLARE_FINAL_TYPE (GfSettings, gf_settings, GF, SETTINGS, GObject)
 
 GfSettings *gf_settings_new                       (GfBackend  *backend);
 
+void        gf_settings_post_init                 (GfSettings *settings);
+
+gint        gf_settings_get_ui_scaling_factor     (GfSettings *settings);
+
 gboolean    gf_settings_get_global_scaling_factor (GfSettings *settings,
                                                    gint       *global_scaling_factor);
 
diff --git a/backends/gf-settings.c b/backends/gf-settings.c
index 9fbaf85..35940d6 100644
--- a/backends/gf-settings.c
+++ b/backends/gf-settings.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 Alberts Muktupāvels
+ * Copyright (C) 2017-2019 Alberts Muktupāvels
  * Copyright (C) 2017 Red Hat
  *
  * This program is free software: you can redistribute it and/or modify
@@ -20,11 +20,13 @@
  */
 
 #include "config.h"
+#include "gf-settings-private.h"
 
 #include <gio/gio.h>
 
 #include "gf-backend-private.h"
-#include "gf-settings-private.h"
+#include "gf-logical-monitor-private.h"
+#include "gf-monitor-manager-private.h"
 
 struct _GfSettings
 {
@@ -34,6 +36,7 @@ struct _GfSettings
 
   GSettings *interface;
 
+  gint       ui_scaling_factor;
   gint       global_scaling_factor;
 };
 
@@ -50,6 +53,7 @@ static GParamSpec *settings_properties[LAST_PROP] = { NULL };
 
 enum
 {
+  UI_SCALING_FACTOR_CHANGED,
   GLOBAL_SCALING_FACTOR_CHANGED,
 
   LAST_SIGNAL
@@ -59,6 +63,57 @@ static guint settings_signals[LAST_SIGNAL] = { 0 };
 
 G_DEFINE_TYPE (GfSettings, gf_settings, G_TYPE_OBJECT)
 
+static gint
+calculate_ui_scaling_factor (GfSettings *settings)
+{
+  GfMonitorManager *monitor_manager;
+  GfLogicalMonitor *primary_logical_monitor;
+
+  monitor_manager = gf_backend_get_monitor_manager (settings->backend);
+
+  if (!monitor_manager)
+    return 1;
+
+  primary_logical_monitor = gf_monitor_manager_get_primary_logical_monitor (monitor_manager);
+
+  if (!primary_logical_monitor)
+    return 1;
+
+  return (gint) gf_logical_monitor_get_scale (primary_logical_monitor);
+}
+
+static gboolean
+update_ui_scaling_factor (GfSettings *settings)
+{
+  gint ui_scaling_factor;
+
+  ui_scaling_factor = calculate_ui_scaling_factor (settings);
+
+  if (settings->ui_scaling_factor != ui_scaling_factor)
+    {
+      settings->ui_scaling_factor = ui_scaling_factor;
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+static void
+monitors_changed_cb (GfMonitorManager *monitor_manager,
+                     GfSettings       *settings)
+{
+  if (update_ui_scaling_factor (settings))
+    g_signal_emit (settings, settings_signals[UI_SCALING_FACTOR_CHANGED], 0);
+}
+
+static void
+global_scaling_factor_changed_cb (GfSettings *settings,
+                                  gpointer    user_data)
+{
+  if (update_ui_scaling_factor (settings))
+    g_signal_emit (settings, settings_signals[UI_SCALING_FACTOR_CHANGED], 0);
+}
+
 static gboolean
 update_global_scaling_factor (GfSettings *settings)
 {
@@ -163,6 +218,11 @@ gf_settings_install_properties (GObjectClass *object_class)
 static void
 gf_settings_install_signals (GObjectClass *object_class)
 {
+  settings_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);
+
   settings_signals[GLOBAL_SCALING_FACTOR_CHANGED] =
     g_signal_new ("global-scaling-factor-changed",
                   G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
@@ -192,6 +252,10 @@ gf_settings_init (GfSettings *settings)
   g_signal_connect (settings->interface, "changed",
                     G_CALLBACK (interface_changed_cb), settings);
 
+  /* Chain up inter-dependent settings. */
+  g_signal_connect (settings, "global-scaling-factor-changed",
+                    G_CALLBACK (global_scaling_factor_changed_cb), NULL);
+
   update_global_scaling_factor (settings);
 }
 
@@ -207,6 +271,27 @@ gf_settings_new (GfBackend *backend)
   return settings;
 }
 
+void
+gf_settings_post_init (GfSettings *settings)
+{
+  GfMonitorManager *monitor_manager;
+
+  monitor_manager = gf_backend_get_monitor_manager (settings->backend);
+  g_signal_connect_object (monitor_manager, "monitors-changed",
+                           G_CALLBACK (monitors_changed_cb),
+                           settings, G_CONNECT_AFTER);
+
+  update_ui_scaling_factor (settings);
+}
+
+gint
+gf_settings_get_ui_scaling_factor (GfSettings *settings)
+{
+  g_assert (settings->ui_scaling_factor != 0);
+
+  return settings->ui_scaling_factor;
+}
+
 gboolean
 gf_settings_get_global_scaling_factor (GfSettings *settings,
                                        gint       *global_scaling_factor)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]