mate-desktop/0001-add-the-gdk-window-scale-settings.patch

231 lines
6.9 KiB
Diff
Raw Normal View History

From 85ff3ca6b09f8fb72cb070ae21105c8a4d058234 Mon Sep 17 00:00:00 2001
From: wangxiaoqing <wangxiaoqing@kylinos.com.cn>
Date: Fri, 22 May 2020 19:11:59 +0800
Subject: [PATCH] add the gdk window scale settings
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 添加gdk窗口缩放设置接口Related #25310
---
libmate-desktop/mate-rr-config.c | 61 ++++++++++++++++++++++++---
libmate-desktop/mate-rr-output-info.c | 14 ++++++
libmate-desktop/mate-rr-private.h | 2 +
3 files changed, 71 insertions(+), 6 deletions(-)
diff --git a/libmate-desktop/mate-rr-config.c b/libmate-desktop/mate-rr-config.c
index 3609292..d2831df 100644
--- a/libmate-desktop/mate-rr-config.c
+++ b/libmate-desktop/mate-rr-config.c
@@ -44,6 +44,9 @@
#define CONFIG_INTENDED_BASENAME "monitors.xml"
#define CONFIG_BACKUP_BASENAME "monitors.xml.backup"
+#define MSD_INTERFACE_SCHEMA "org.mate.interface"
+#define WINDOW_SCALE_KEY "window-scaling-factor"
+
/* In version 0 of the config file format, we had several <configuration>
* toplevel elements and no explicit version number. So, the filed looked
* like
@@ -341,6 +344,21 @@ handle_text (GMarkupParseContext *context,
parser->output->priv->rotation |= MATE_RR_ROTATION_270;
}
}
+ else if (stack_is (parser, "scale", "output", "configuration", TOPLEVEL_ELEMENT, NULL))
+ {
+ if (strcmp (text, "100%") == 0)
+ {
+ parser->output->priv->scale = 1;
+ }
+ else if (strcmp (text, "200%") == 0)
+ {
+ parser->output->priv->scale = 2;
+ }
+ else
+ {
+ parser->output->priv->scale = 0;
+ }
+ }
else if (stack_is (parser, "reflect_x", "output", "configuration", TOPLEVEL_ELEMENT, NULL))
{
if (strcmp (text, "yes") == 0)
@@ -454,6 +472,7 @@ mate_rr_config_init (MateRRConfig *self)
self->priv->clone = FALSE;
self->priv->screen = NULL;
self->priv->outputs = NULL;
+ self->priv->ws_settings = g_settings_new (MSD_INTERFACE_SCHEMA);
}
static void
@@ -487,6 +506,8 @@ mate_rr_config_finalize (GObject *gobject)
}
g_free (self->priv->outputs);
}
+
+ g_object_unref (self->priv->ws_settings);
G_OBJECT_CLASS (mate_rr_config_parent_class)->finalize (gobject);
}
@@ -500,6 +521,7 @@ mate_rr_config_load_current (MateRRConfig *config, GError **error)
int clone_width = -1;
int clone_height = -1;
int last_x;
+ int scale = 0;
g_return_val_if_fail (MATE_IS_RR_CONFIG (config), FALSE);
@@ -507,6 +529,9 @@ mate_rr_config_load_current (MateRRConfig *config, GError **error)
rr_outputs = mate_rr_screen_list_outputs (config->priv->screen);
config->priv->clone = FALSE;
+
+ /*window scale for gdk */
+ scale = g_settings_get_int(config->priv->ws_settings, WINDOW_SCALE_KEY);
for (i = 0; rr_outputs[i] != NULL; ++i)
{
@@ -519,6 +544,7 @@ mate_rr_config_load_current (MateRRConfig *config, GError **error)
output->priv->name = g_strdup (mate_rr_output_get_name (rr_output));
output->priv->connected = mate_rr_output_is_connected (rr_output);
output->priv->hotplug_mode_update = mate_rr_output_has_hotplug_mode_update (rr_output);
+ output->priv->scale = scale;
if (!output->priv->connected)
{
@@ -962,6 +988,7 @@ make_outputs (MateRRConfig *config)
new->priv->width = first_on->priv->width;
new->priv->height = first_on->priv->height;
new->priv->rotation = first_on->priv->rotation;
+ new->priv->scale = first_on->priv->scale;
new->priv->x = 0;
new->priv->y = 0;
}
@@ -1045,6 +1072,17 @@ get_rotation_name (MateRRRotation r)
return "normal";
}
+static const char *
+get_scale_name (int scale)
+{
+ if ( scale == 2)
+ return "200%";
+ if ( scale == 1)
+ return "100%";
+
+ return "auto";
+}
+
static const char *
yes_no (int x)
{
@@ -1105,6 +1143,8 @@ emit_configuration (MateRRConfig *config,
string, " <y>%d</y>\n", output->priv->y);
g_string_append_printf (
string, " <rotation>%s</rotation>\n", get_rotation_name (output->priv->rotation));
+ g_string_append_printf (
+ string, " <scale>%s</scale>\n", get_scale_name (output->priv->scale));
g_string_append_printf (
string, " <reflect_x>%s</reflect_x>\n", get_reflect_x (output->priv->rotation));
g_string_append_printf (
@@ -1279,6 +1319,14 @@ mate_rr_config_save (MateRRConfig *configuration, GError **error)
return result;
}
+struct CrtcAssignment
+{
+ MateRRScreen *screen;
+ GHashTable *info;
+ MateRROutput *primary;
+ int scale;
+};
+
gboolean
mate_rr_config_apply_with_time (MateRRConfig *config,
MateRRScreen *screen,
@@ -1307,10 +1355,14 @@ mate_rr_config_apply_with_time (MateRRConfig *config,
if (crtc_assignment_apply (assignment, timestamp, error))
result = TRUE;
+ g_settings_set_int(config->priv->ws_settings, WINDOW_SCALE_KEY, assignment->scale);
+
crtc_assignment_free (assignment);
display = gdk_display_get_default ();
gdk_display_flush (display);
+
+
}
return result;
@@ -1439,12 +1491,6 @@ struct CrtcInfo
GPtrArray *outputs;
};
-struct CrtcAssignment
-{
- MateRRScreen *screen;
- GHashTable *info;
- MateRROutput *primary;
-};
static gboolean
can_clone (CrtcInfo *info,
@@ -1693,6 +1739,9 @@ real_assign_crtcs (MateRRScreen *screen,
tried_mode = FALSE;
accumulated_error = g_string_new (NULL);
+ /* all outputs use a scale */
+ assignment->scale = output->priv->scale;
+
for (i = 0; crtcs[i] != NULL; ++i)
{
MateRRCrtc *crtc = crtcs[i];
diff --git a/libmate-desktop/mate-rr-output-info.c b/libmate-desktop/mate-rr-output-info.c
index 85ee50b..3c56930 100644
--- a/libmate-desktop/mate-rr-output-info.c
+++ b/libmate-desktop/mate-rr-output-info.c
@@ -162,6 +162,20 @@ void mate_rr_output_info_set_rotation (MateRROutputInfo *self, MateRRRotation ro
self->priv->rotation = rotation;
}
+int mate_rr_output_info_get_scale (MateRROutputInfo *self)
+{
+ g_return_val_if_fail (MATE_IS_RR_OUTPUT_INFO (self), 0);
+
+ return self->priv->scale;
+}
+
+void mate_rr_output_info_set_scale (MateRROutputInfo *self, int scale)
+{
+ g_return_if_fail (MATE_IS_RR_OUTPUT_INFO (self));
+
+ self->priv->scale = scale;
+}
+
/**
* mate_rr_output_info_is_connected:
*
diff --git a/libmate-desktop/mate-rr-private.h b/libmate-desktop/mate-rr-private.h
index fa14368..ee3ec42 100644
--- a/libmate-desktop/mate-rr-private.h
+++ b/libmate-desktop/mate-rr-private.h
@@ -60,6 +60,7 @@ struct MateRROutputInfoPrivate
int x;
int y;
MateRRRotation rotation;
+ int scale;
gboolean connected;
gchar vendor[4];
@@ -78,6 +79,7 @@ struct MateRRConfigPrivate
gboolean clone;
MateRRScreen *screen;
MateRROutputInfo **outputs;
+ GSettings *ws_settings;
};
gboolean _mate_rr_output_name_is_laptop (const char *name);
--
2.20.1