[gnome-flashback] backends: add gf_settings_get_ui_scaling_factor
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-flashback] backends: add gf_settings_get_ui_scaling_factor
- Date: Sat, 23 Mar 2019 18:18:36 +0000 (UTC)
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]