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

