From 85ff3ca6b09f8fb72cb070ae21105c8a4d058234 Mon Sep 17 00:00:00 2001 From: wangxiaoqing 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 * 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, " %d\n", output->priv->y); g_string_append_printf ( string, " %s\n", get_rotation_name (output->priv->rotation)); + g_string_append_printf ( + string, " %s\n", get_scale_name (output->priv->scale)); g_string_append_printf ( string, " %s\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