mate-desktop/0001-add-the-gdk-window-scale-settings.patch
2022-08-04 10:23:27 +08:00

231 lines
6.9 KiB
Diff
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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