~ken-vandine/gtk/ubuntugtk3

« back to all changes in this revision

Viewing changes to debian/patches/0024-mir-re-write-settings-implementation.patch

  • Committer: Jeremy Bicha
  • Author(s): William Hua
  • Date: 2017-04-04 18:31:06 UTC
  • mfrom: (557.1.2 gtk-mir)
  • Revision ID: jbicha@ubuntu.com-20170404183106-jshjeztm3zaj3ost
* debian/patches/0001-mir-always-emit-a-resize-when-creating-windows.patch:
* debian/patches/0024-mir-re-write-settings-implementation.patch:
* debian/patches/0025-mir-remove-keymap-and-input-device-state-warnings.patch:
* debian/patches/0026-mir-set-application-name-when-creating-connection.patch:
  - Add upstream patches from gtk-3-22 branch
  - Fix LP: #1670390, LP: #1666435, LP: #1618298

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
From ec70eb8ae0c2e941d0677803f4b1bdf9f7273be6 Mon Sep 17 00:00:00 2001
 
2
From: William Hua <william.hua@canonical.com>
 
3
Date: Fri, 31 Mar 2017 15:14:16 -0400
 
4
Subject: [PATCH 24/32] mir: re-write settings implementation
 
5
 
 
6
This is a squash of commits
 
7
01b73072961f8c62255cf2b66dba4e55d36fd646 and
 
8
6e711beb0bdc2a30bfd948e5a6a077cd6fe82493.
 
9
---
 
10
 gdk/mir/gdkmirscreen.c | 679 +++++++++++++++++++++++++++++++++++--------------
 
11
 1 file changed, 492 insertions(+), 187 deletions(-)
 
12
 
 
13
diff --git a/gdk/mir/gdkmirscreen.c b/gdk/mir/gdkmirscreen.c
 
14
index c1a189908e..0ddcb8787a 100644
 
15
--- a/gdk/mir/gdkmirscreen.c
 
16
+++ b/gdk/mir/gdkmirscreen.c
 
17
@@ -48,9 +48,15 @@ struct GdkMirScreen
 
18
   /* Current monitor configuration */
 
19
   MirDisplayConfig *display_config;
 
20
 
 
21
+  /* Display format */
 
22
   GdkVisual *visual;
 
23
 
 
24
+  /* Root window */
 
25
   GdkWindow *root_window;
 
26
+
 
27
+  /* Settings */
 
28
+  GHashTable *settings_objects;
 
29
+  GHashTable *current_settings;
 
30
 };
 
31
 
 
32
 struct GdkMirScreenClass
 
33
@@ -168,6 +174,11 @@ _gdk_mir_screen_new (GdkDisplay *display)
 
34
 static void
 
35
 gdk_mir_screen_dispose (GObject *object)
 
36
 {
 
37
+  GdkMirScreen *screen = GDK_MIR_SCREEN (object);
 
38
+
 
39
+  g_clear_pointer (&screen->current_settings, g_hash_table_unref);
 
40
+  g_clear_pointer (&screen->settings_objects, g_hash_table_unref);
 
41
+
 
42
   G_OBJECT_CLASS (gdk_mir_screen_parent_class)->dispose (object);
 
43
 }
 
44
 
 
45
@@ -459,260 +470,551 @@ gdk_mir_screen_broadcast_client_message (GdkScreen *screen,
 
46
   // FIXME
 
47
 }
 
48
 
 
49
-static gboolean
 
50
-gdk_mir_screen_get_setting (GdkScreen   *screen,
 
51
-                            const gchar *name,
 
52
-                            GValue      *value)
 
53
+static void setting_changed (GSettings    *settings,
 
54
+                             const gchar  *key,
 
55
+                             GdkMirScreen *screen);
 
56
+
 
57
+static GSettings *
 
58
+get_settings (GdkMirScreen *screen,
 
59
+              const gchar  *schema_id)
 
60
 {
 
61
-  if (strcmp (name, "gtk-theme-name") == 0)
 
62
-    {
 
63
-      g_value_set_string (value, "Ambiance");
 
64
-      return TRUE;
 
65
-    }
 
66
+  GSettings *settings;
 
67
+  GSettingsSchemaSource *source;
 
68
+  GSettingsSchema *schema;
 
69
 
 
70
-  if (strcmp (name, "gtk-font-name") == 0)
 
71
-    {
 
72
-      g_value_set_string (value, "Ubuntu");
 
73
-      return TRUE;
 
74
-    }
 
75
+  settings = g_hash_table_lookup (screen->settings_objects, schema_id);
 
76
 
 
77
-  if (strcmp (name, "gtk-enable-animations") == 0)
 
78
-    {
 
79
-      g_value_set_boolean (value, TRUE);
 
80
-      return TRUE;
 
81
-    }
 
82
+  if (settings)
 
83
+    return g_object_ref (settings);
 
84
 
 
85
-  if (strcmp (name, "gtk-xft-dpi") == 0)
 
86
-    {
 
87
-      g_value_set_int (value, 96 * 1024);
 
88
-      return TRUE;
 
89
-    }
 
90
+  source = g_settings_schema_source_get_default ();
 
91
 
 
92
-  if (strcmp (name, "gtk-xft-antialias") == 0)
 
93
+  if (!source)
 
94
     {
 
95
-      g_value_set_int (value, TRUE);
 
96
-      return TRUE;
 
97
+      g_warning ("no schemas installed");
 
98
+      return NULL;
 
99
     }
 
100
 
 
101
-  if (strcmp (name, "gtk-xft-hinting") == 0)
 
102
-    {
 
103
-      g_value_set_int (value, TRUE);
 
104
-      return TRUE;
 
105
-    }
 
106
+  schema = g_settings_schema_source_lookup (source, schema_id, TRUE);
 
107
 
 
108
-  if (strcmp (name, "gtk-xft-hintstyle") == 0)
 
109
+  if (!schema)
 
110
     {
 
111
-      g_value_set_static_string (value, "hintfull");
 
112
-      return TRUE;
 
113
+      g_warning ("schema not found: %s", schema_id);
 
114
+      return NULL;
 
115
     }
 
116
 
 
117
-  if (strcmp (name, "gtk-xft-rgba") == 0)
 
118
-    {
 
119
-      g_value_set_static_string (value, "rgba");
 
120
-      return TRUE;
 
121
-    }
 
122
+  settings = g_settings_new_full (schema, NULL, NULL);
 
123
+  g_signal_connect (settings, "changed", G_CALLBACK (setting_changed), screen);
 
124
+  g_hash_table_insert (screen->settings_objects, g_strdup (schema_id), g_object_ref (settings));
 
125
+  g_settings_schema_unref (schema);
 
126
+  return settings;
 
127
+}
 
128
 
 
129
-  if (g_str_equal (name, "gtk-modules"))
 
130
-    {
 
131
-      g_value_set_string (value, NULL);
 
132
-      return TRUE;
 
133
-    }
 
134
+static GVariant *
 
135
+read_setting (GdkMirScreen *screen,
 
136
+              const gchar  *schema_id,
 
137
+              const gchar  *key)
 
138
+{
 
139
+  GSettings *settings;
 
140
+  GVariant *variant;
 
141
 
 
142
-  if (g_str_equal (name, "gtk-application-prefer-dark-theme"))
 
143
-    {
 
144
-      g_value_set_boolean (value, FALSE);
 
145
-      return TRUE;
 
146
-    }
 
147
+  settings = get_settings (screen, schema_id);
 
148
 
 
149
-  if (g_str_equal (name, "gtk-key-theme-name"))
 
150
-    {
 
151
-      g_value_set_string (value, NULL);
 
152
-      return TRUE;
 
153
-    }
 
154
+  if (!settings)
 
155
+    return NULL;
 
156
 
 
157
-  if (g_str_equal (name, "gtk-double-click-time"))
 
158
-    {
 
159
-      g_value_set_int (value, 250);
 
160
-      return TRUE;
 
161
-    }
 
162
+  variant = g_settings_get_value (settings, key);
 
163
+  g_object_unref (settings);
 
164
+  return variant;
 
165
+}
 
166
 
 
167
-  if (g_str_equal (name, "gtk-double-click-distance"))
 
168
-    {
 
169
-      g_value_set_int (value, 5);
 
170
-      return TRUE;
 
171
-    }
 
172
+static void
 
173
+change_setting (GdkMirScreen *screen,
 
174
+                const gchar  *name,
 
175
+                GVariant     *variant)
 
176
+{
 
177
+  GVariant *old_variant;
 
178
+  GdkEventSetting event;
 
179
 
 
180
-  if (g_str_equal (name, "gtk-cursor-theme-name"))
 
181
-    {
 
182
-      g_value_set_string (value, "Raleigh");
 
183
-      return TRUE;
 
184
-    }
 
185
+  old_variant = g_hash_table_lookup (screen->current_settings, name);
 
186
 
 
187
-  if (g_str_equal (name, "gtk-cursor-theme-size"))
 
188
-    {
 
189
-      g_value_set_int (value, 128);
 
190
-      return TRUE;
 
191
-    }
 
192
+  if (variant == old_variant)
 
193
+    return;
 
194
 
 
195
-  if (g_str_equal (name, "gtk-icon-theme-name"))
 
196
-    {
 
197
-      g_value_set_string (value, "hicolor");
 
198
-      return TRUE;
 
199
-    }
 
200
+  if (variant && old_variant && g_variant_equal (variant, old_variant))
 
201
+    return;
 
202
 
 
203
-  if (g_str_equal (name, "gtk-shell-shows-app-menu"))
 
204
-    {
 
205
-      g_value_set_boolean (value, FALSE);
 
206
-      return TRUE;
 
207
-    }
 
208
+  event.type = GDK_SETTING;
 
209
+  event.window = gdk_screen_get_root_window (GDK_SCREEN (screen));
 
210
+  event.send_event = FALSE;
 
211
+  event.name = g_strdup (name);
 
212
 
 
213
-  if (g_str_equal (name, "gtk-shell-shows-menubar"))
 
214
+  if (variant)
 
215
     {
 
216
-      g_value_set_boolean (value, FALSE);
 
217
-      return TRUE;
 
218
+      event.action = old_variant ? GDK_SETTING_ACTION_CHANGED : GDK_SETTING_ACTION_NEW;
 
219
+      g_hash_table_insert (screen->current_settings, g_strdup (name), g_variant_ref_sink (variant));
 
220
     }
 
221
-
 
222
-  if (g_str_equal (name, "gtk-shell-shows-desktop"))
 
223
+  else
 
224
     {
 
225
-      g_value_set_boolean (value, FALSE);
 
226
-      return TRUE;
 
227
+      event.action = GDK_SETTING_ACTION_DELETED;
 
228
+      g_hash_table_remove (screen->current_settings, name);
 
229
     }
 
230
 
 
231
-  if (g_str_equal (name, "gtk-recent-files-enabled"))
 
232
-    {
 
233
-      g_value_set_boolean (value, FALSE);
 
234
-      return TRUE;
 
235
-    }
 
236
+  gdk_event_put ((const GdkEvent *) &event);
 
237
+  g_free (event.name);
 
238
+}
 
239
 
 
240
-  if (g_str_equal (name, "gtk-alternative-sort-arrows"))
 
241
-    {
 
242
-      g_value_set_boolean (value, FALSE);
 
243
-      return TRUE;
 
244
-    }
 
245
+static const struct
 
246
+{
 
247
+  const gchar *name;
 
248
+  const gchar *schema_id;
 
249
+  const gchar *key;
 
250
+} SETTINGS_MAP[] = {
 
251
+  {
 
252
+    "gtk-double-click-time",
 
253
+    "org.gnome.settings-daemon.peripherals.mouse",
 
254
+    "double-click"
 
255
+  },
 
256
+  {
 
257
+    "gtk-cursor-blink",
 
258
+    "org.gnome.desktop.interface",
 
259
+    "cursor-blink"
 
260
+  },
 
261
+  {
 
262
+    "gtk-cursor-blink-time",
 
263
+    "org.gnome.desktop.interface",
 
264
+    "cursor-blink-time"
 
265
+  },
 
266
+  {
 
267
+    "gtk-cursor-blink-timeout",
 
268
+    "org.gnome.desktop.interface",
 
269
+    "cursor-blink-timeout"
 
270
+  },
 
271
+  {
 
272
+    "gtk-theme-name",
 
273
+    "org.gnome.desktop.interface",
 
274
+    "gtk-theme"
 
275
+  },
 
276
+  {
 
277
+    "gtk-icon-theme-name",
 
278
+    "org.gnome.desktop.interface",
 
279
+    "icon-theme"
 
280
+  },
 
281
+  {
 
282
+    "gtk-key-theme-name",
 
283
+    "org.gnome.desktop.interface",
 
284
+    "gtk-key-theme"
 
285
+  },
 
286
+  {
 
287
+    "gtk-dnd-drag-threshold",
 
288
+    "org.gnome.settings-daemon.peripherals.mouse",
 
289
+    "drag-threshold"
 
290
+  },
 
291
+  {
 
292
+    "gtk-font-name",
 
293
+    "org.gnome.desktop.interface",
 
294
+    "font-name"
 
295
+  },
 
296
+  {
 
297
+    "gtk-xft-antialias",
 
298
+    "org.gnome.settings-daemon.plugins.xsettings",
 
299
+    "antialiasing"
 
300
+  },
 
301
+  {
 
302
+    "gtk-xft-hinting",
 
303
+    "org.gnome.settings-daemon.plugins.xsettings",
 
304
+    "hinting"
 
305
+  },
 
306
+  {
 
307
+    "gtk-xft-hintstyle",
 
308
+    "org.gnome.settings-daemon.plugins.xsettings",
 
309
+    "hinting"
 
310
+  },
 
311
+  {
 
312
+    "gtk-xft-rgba",
 
313
+    "org.gnome.settings-daemon.plugins.xsettings",
 
314
+    "rgba-order"
 
315
+  },
 
316
+  {
 
317
+    "gtk-xft-dpi",
 
318
+    "org.gnome.desktop.interface",
 
319
+    "text-scaling-factor"
 
320
+  },
 
321
+  {
 
322
+    "gtk-cursor-theme-name",
 
323
+    "org.gnome.desktop.interface",
 
324
+    "cursor-theme"
 
325
+  },
 
326
+  {
 
327
+    "gtk-cursor-theme-size",
 
328
+    "org.gnome.desktop.interface",
 
329
+    "cursor-size"
 
330
+  },
 
331
+  {
 
332
+    "gtk-enable-animations",
 
333
+    "org.gnome.desktop.interface",
 
334
+    "enable-animations"
 
335
+  },
 
336
+  {
 
337
+    "gtk-im-module",
 
338
+    "org.gnome.desktop.interface",
 
339
+    "gtk-im-module"
 
340
+  },
 
341
+  {
 
342
+    "gtk-recent-files-max-age",
 
343
+    "org.gnome.desktop.privacy",
 
344
+    "recent-files-max-age"
 
345
+  },
 
346
+  {
 
347
+    "gtk-sound-theme-name",
 
348
+    "org.gnome.desktop.sound",
 
349
+    "theme-name"
 
350
+  },
 
351
+  {
 
352
+    "gtk-enable-input-feedback-sounds",
 
353
+    "org.gnome.desktop.sound",
 
354
+    "input-feedback-sounds"
 
355
+  },
 
356
+  {
 
357
+    "gtk-enable-event-sounds",
 
358
+    "org.gnome.desktop.sound",
 
359
+    "event-sounds"
 
360
+  },
 
361
+  {
 
362
+    "gtk-shell-shows-desktop",
 
363
+    "org.gnome.desktop.background",
 
364
+    "show-desktop-icons"
 
365
+  },
 
366
+  {
 
367
+    "gtk-decoration-layout",
 
368
+    "org.gnome.desktop.wm.preferences",
 
369
+    "button-layout"
 
370
+  },
 
371
+  {
 
372
+    "gtk-titlebar-double-click",
 
373
+    "org.gnome.desktop.wm.preferences",
 
374
+    "action-double-click-titlebar"
 
375
+  },
 
376
+  {
 
377
+    "gtk-titlebar-middle-click",
 
378
+    "org.gnome.desktop.wm.preferences",
 
379
+    "action-middle-click-titlebar"
 
380
+  },
 
381
+  {
 
382
+    "gtk-titlebar-right-click",
 
383
+    "org.gnome.desktop.wm.preferences",
 
384
+    "action-right-click-titlebar"
 
385
+  },
 
386
+  {
 
387
+    "gtk-enable-primary-paste",
 
388
+    "org.gnome.desktop.interface",
 
389
+    "gtk-enable-primary-paste"
 
390
+  },
 
391
+  {
 
392
+    "gtk-recent-files-enabled",
 
393
+    "org.gnome.desktop.privacy",
 
394
+    "remember-recent-files"
 
395
+  },
 
396
+  {
 
397
+    "gtk-keynav-use-caret",
 
398
+    "org.gnome.desktop.a11y",
 
399
+    "always-show-text-caret"
 
400
+  },
 
401
+  { NULL }
 
402
+};
 
403
 
 
404
-  if (g_str_equal (name, "gtk-enable-accels"))
 
405
-    {
 
406
-      g_value_set_boolean (value, TRUE);
 
407
-      return TRUE;
 
408
-    }
 
409
+static guint
 
410
+get_scaling_factor (GdkMirScreen *screen)
 
411
+{
 
412
+  GVariant *variant;
 
413
+  guint scaling_factor;
 
414
 
 
415
-  if (g_str_equal (name, "gtk-enable-mnemonics"))
 
416
-    {
 
417
-      g_value_set_boolean (value, TRUE);
 
418
-      return TRUE;
 
419
-    }
 
420
+  variant = read_setting (screen, "org.gnome.desktop.interface", "scaling-factor");
 
421
 
 
422
-  if (g_str_equal (name, "gtk-menu-images"))
 
423
+  if (!variant)
 
424
     {
 
425
-      g_value_set_boolean (value, FALSE);
 
426
-      return TRUE;
 
427
+      g_warning ("no scaling factor: org.gnome.desktop.interface.scaling-factor");
 
428
+      variant = g_variant_ref_sink (g_variant_new_uint32 (0));
 
429
     }
 
430
 
 
431
-  if (g_str_equal (name, "gtk-button-images"))
 
432
-    {
 
433
-      g_value_set_boolean (value, FALSE);
 
434
-      return TRUE;
 
435
-    }
 
436
+  scaling_factor = g_variant_get_uint32 (variant);
 
437
+  g_variant_unref (variant);
 
438
 
 
439
-  if (g_str_equal (name, "gtk-split-cursor"))
 
440
-    {
 
441
-      g_value_set_boolean (value, TRUE);
 
442
-      return TRUE;
 
443
-    }
 
444
+  if (scaling_factor)
 
445
+    return scaling_factor;
 
446
 
 
447
-  if (g_str_equal (name, "gtk-im-module"))
 
448
-    {
 
449
-      g_value_set_string (value, NULL);
 
450
-      return TRUE;
 
451
-    }
 
452
+  scaling_factor = 1;
 
453
 
 
454
-  if (g_str_equal (name, "gtk-menu-bar-accel"))
 
455
-    {
 
456
-      g_value_set_string (value, "F10");
 
457
-      return TRUE;
 
458
-    }
 
459
+  /* TODO: scaling_factor = 2 if HiDPI >= 2 * 96 */
 
460
 
 
461
-  if (g_str_equal (name, "gtk-cursor-blink"))
 
462
-    {
 
463
-      g_value_set_boolean (value, TRUE);
 
464
-      return TRUE;
 
465
-    }
 
466
+  return scaling_factor;
 
467
+}
 
468
 
 
469
-  if (g_str_equal (name, "gtk-cursor-blink-time"))
 
470
-    {
 
471
-      g_value_set_int (value, 1200);
 
472
-      return TRUE;
 
473
-    }
 
474
+static void
 
475
+update_setting (GdkMirScreen *screen,
 
476
+                const gchar  *name)
 
477
+{
 
478
+  GVariant *variant;
 
479
+  GVariant *antialiasing_variant;
 
480
+  gboolean gtk_xft_antialias;
 
481
+  gboolean gtk_xft_hinting;
 
482
+  gdouble text_scaling_factor;
 
483
+  gint cursor_size;
 
484
+  gint i;
 
485
 
 
486
-  if (g_str_equal (name, "gtk-cursor-blink-timeout"))
 
487
+  if (!g_strcmp0 (name, "gtk-modules"))
 
488
     {
 
489
-      g_value_set_int (value, 10);
 
490
-      return TRUE;
 
491
+      /* TODO: X-GTK-Module-Enabled-Schema, X-GTK-Module-Enabled-Key */
 
492
+      /* TODO: org.gnome.settings-daemon.plugins.xsettings.enabled-gtk-modules */
 
493
+      /* TODO: org.gnome.settings-daemon.plugins.xsettings.disabled-gtk-modules */
 
494
+      return;
 
495
     }
 
496
-
 
497
-  if (g_str_equal (name, "gtk-entry-select-on-focus"))
 
498
+  else
 
499
     {
 
500
-      g_value_set_boolean (value, FALSE);
 
501
-      return TRUE;
 
502
+      for (i = 0; SETTINGS_MAP[i].name; i++)
 
503
+        if (!g_strcmp0 (name, SETTINGS_MAP[i].name))
 
504
+          break;
 
505
+
 
506
+      if (!SETTINGS_MAP[i].name)
 
507
+        return;
 
508
+
 
509
+      variant = read_setting (screen, SETTINGS_MAP[i].schema_id, SETTINGS_MAP[i].key);
 
510
+
 
511
+      if (!variant)
 
512
+        {
 
513
+          g_warning ("no setting for %s: %s.%s", SETTINGS_MAP[i].name, SETTINGS_MAP[i].schema_id, SETTINGS_MAP[i].key);
 
514
+          return;
 
515
+        }
 
516
     }
 
517
 
 
518
-  if (g_str_equal (name, "gtk-error-bell"))
 
519
+  if (!g_strcmp0 (name, "gtk-xft-antialias"))
 
520
     {
 
521
-      g_value_set_boolean (value, FALSE);
 
522
-      return TRUE;
 
523
+      gtk_xft_antialias = g_strcmp0 (g_variant_get_string (variant, NULL), "none");
 
524
+      g_variant_unref (variant);
 
525
+      variant = g_variant_ref_sink (g_variant_new_int32 (gtk_xft_antialias ? 1 : 0));
 
526
     }
 
527
-
 
528
-  if (g_str_equal (name, "gtk-label-select-on-focus"))
 
529
+  else if (!g_strcmp0 (name, "gtk-xft-hinting"))
 
530
     {
 
531
-      g_value_set_boolean (value, FALSE);
 
532
-      return TRUE;
 
533
+      gtk_xft_hinting = g_strcmp0 (g_variant_get_string (variant, NULL), "none");
 
534
+      g_variant_unref (variant);
 
535
+      variant = g_variant_ref_sink (g_variant_new_int32 (gtk_xft_hinting ? 1 : 0));
 
536
     }
 
537
-
 
538
-  if (g_str_equal (name, "gtk-decoration-layout"))
 
539
+  else if (!g_strcmp0 (name, "gtk-xft-hintstyle"))
 
540
     {
 
541
-      g_value_set_string (value, "menu:minimize,maximize,close");
 
542
-      return TRUE;
 
543
+      if (!g_strcmp0 (g_variant_get_string (variant, NULL), "none"))
 
544
+        {
 
545
+          g_variant_unref (variant);
 
546
+          variant = g_variant_ref_sink (g_variant_new_string ("hintnone"));
 
547
+        }
 
548
+      else if (!g_strcmp0 (g_variant_get_string (variant, NULL), "slight"))
 
549
+        {
 
550
+          g_variant_unref (variant);
 
551
+          variant = g_variant_ref_sink (g_variant_new_string ("hintslight"));
 
552
+        }
 
553
+      else if (!g_strcmp0 (g_variant_get_string (variant, NULL), "medium"))
 
554
+        {
 
555
+          g_variant_unref (variant);
 
556
+          variant = g_variant_ref_sink (g_variant_new_string ("hintmedium"));
 
557
+        }
 
558
+      else if (!g_strcmp0 (g_variant_get_string (variant, NULL), "full"))
 
559
+        {
 
560
+          g_variant_unref (variant);
 
561
+          variant = g_variant_ref_sink (g_variant_new_string ("hintfull"));
 
562
+        }
 
563
+      else
 
564
+        {
 
565
+          g_warning ("unknown org.gnome.settings-daemon.plugins.xsettings.hinting value: %s", g_variant_get_string (variant, NULL));
 
566
+          g_variant_unref (variant);
 
567
+          return;
 
568
+        }
 
569
     }
 
570
+  else if (!g_strcmp0 (name, "gtk-xft-rgba"))
 
571
+    {
 
572
+      antialiasing_variant = read_setting (screen, "org.gnome.settings-daemon.plugins.xsettings", "antialiasing");
 
573
+
 
574
+      if (g_strcmp0 (g_variant_get_string (antialiasing_variant, NULL), "rgba"))
 
575
+        {
 
576
+          g_variant_unref (variant);
 
577
+          variant = g_variant_ref_sink (g_variant_new_string ("none"));
 
578
+        }
 
579
+      else if (g_strcmp0 (g_variant_get_string (variant, NULL), "rgba"))
 
580
+        {
 
581
+          g_variant_unref (variant);
 
582
+          variant = g_variant_ref_sink (g_variant_new_string ("rgb"));
 
583
+        }
 
584
 
 
585
-  if (g_str_equal (name, "gtk-dnd-drag-threshold"))
 
586
+      g_variant_unref (antialiasing_variant);
 
587
+    }
 
588
+  else if (!g_strcmp0 (name, "gtk-xft-dpi"))
 
589
     {
 
590
-      g_value_set_int (value, 8);
 
591
-      return TRUE;
 
592
+      text_scaling_factor = g_variant_get_double (variant);
 
593
+      g_variant_unref (variant);
 
594
+      variant = g_variant_ref_sink (g_variant_new_int32 (1024 * get_scaling_factor (screen) * text_scaling_factor + 0.5));
 
595
     }
 
596
-
 
597
-  if (g_str_equal (name, "gtk-dialogs-use-header"))
 
598
+  else if (!g_strcmp0 (name, "gtk-cursor-theme-size"))
 
599
     {
 
600
-      g_value_set_boolean (value, FALSE);
 
601
-      return TRUE;
 
602
+      cursor_size = g_variant_get_int32 (variant);
 
603
+      g_variant_unref (variant);
 
604
+      variant = g_variant_ref_sink (g_variant_new_int32 (get_scaling_factor (screen) * cursor_size));
 
605
     }
 
606
-
 
607
-  if (g_str_equal (name, "gtk-long-press-time"))
 
608
+  else if (!g_strcmp0 (name, "gtk-enable-animations"))
 
609
     {
 
610
-      g_value_set_uint (value, 500);
 
611
-      return TRUE;
 
612
+      /* TODO: disable under vnc/vino/llvmpipe */
 
613
     }
 
614
 
 
615
-  if (g_str_equal (name, "gtk-primary-button-warps-slider"))
 
616
+  change_setting (screen, name, variant);
 
617
+  g_variant_unref (variant);
 
618
+}
 
619
+
 
620
+static void
 
621
+setting_changed (GSettings    *settings,
 
622
+                 const gchar  *key,
 
623
+                 GdkMirScreen *screen)
 
624
+{
 
625
+  gchar *schema_id;
 
626
+  gint i;
 
627
+
 
628
+  g_object_get (settings, "schema-id", &schema_id, NULL);
 
629
+
 
630
+  for (i = 0; SETTINGS_MAP[i].name; i++)
 
631
+    if (!g_strcmp0 (schema_id, SETTINGS_MAP[i].schema_id) && !g_strcmp0 (key, SETTINGS_MAP[i].key))
 
632
+      update_setting (screen, SETTINGS_MAP[i].name);
 
633
+
 
634
+  if (!g_strcmp0 (schema_id, "org.gnome.settings-daemon.plugins.xsettings"))
 
635
     {
 
636
-      g_value_set_boolean (value, TRUE);
 
637
-      return TRUE;
 
638
+      if (!g_strcmp0 (key, "enabled-gtk-modules"))
 
639
+        update_setting (screen, "gtk-modules");
 
640
+      else if (!g_strcmp0 (key, "disabled-gtk-modules"))
 
641
+        update_setting (screen, "gtk-modules");
 
642
+      else if (!g_strcmp0 (key, "antialiasing"))
 
643
+        update_setting (screen, "rgba-order");
 
644
     }
 
645
-
 
646
-  if (g_str_equal (name, "gtk-recent-files-max-age"))
 
647
+  else if (!g_strcmp0 (schema_id, "org.gnome.desktop.interface"))
 
648
     {
 
649
-      g_value_set_int (value, 30);
 
650
-      return TRUE;
 
651
+      if (!g_strcmp0 (key, "scaling-factor"))
 
652
+        {
 
653
+          update_setting (screen, "gtk-xft-dpi");
 
654
+          update_setting (screen, "gtk-cursor-theme-size");
 
655
+        }
 
656
     }
 
657
 
 
658
-  if (g_str_equal (name, "gtk-titlebar-double-click"))
 
659
+  g_free (schema_id);
 
660
+}
 
661
+
 
662
+static const gchar * const KNOWN_SETTINGS[] =
 
663
+{
 
664
+  "gtk-double-click-time",
 
665
+  "gtk-double-click-distance",
 
666
+  "gtk-cursor-blink",
 
667
+  "gtk-cursor-blink-time",
 
668
+  "gtk-cursor-blink-timeout",
 
669
+  "gtk-split-cursor",
 
670
+  "gtk-theme-name",
 
671
+  "gtk-icon-theme-name",
 
672
+  "gtk-fallback-icon-theme",
 
673
+  "gtk-key-theme-name",
 
674
+  "gtk-menu-bar-accel",
 
675
+  "gtk-dnd-drag-threshold",
 
676
+  "gtk-font-name",
 
677
+  "gtk-icon-sizes",
 
678
+  "gtk-modules",
 
679
+  "gtk-xft-antialias",
 
680
+  "gtk-xft-hinting",
 
681
+  "gtk-xft-hintstyle",
 
682
+  "gtk-xft-rgba",
 
683
+  "gtk-xft-dpi",
 
684
+  "gtk-cursor-theme-name",
 
685
+  "gtk-cursor-theme-size",
 
686
+  "gtk-alternative-button-order",
 
687
+  "gtk-alternative-sort-arrows",
 
688
+  "gtk-show-input-method-menu",
 
689
+  "gtk-show-unicode-menu",
 
690
+  "gtk-timeout-initial",
 
691
+  "gtk-timeout-repeat",
 
692
+  "gtk-timeout-expand",
 
693
+  "gtk-color-scheme",
 
694
+  "gtk-enable-animations",
 
695
+  "gtk-touchscreen-mode",
 
696
+  "gtk-tooltip-timeout",
 
697
+  "gtk-tooltip-browse-timeout",
 
698
+  "gtk-tooltip-browse-mode-timeout",
 
699
+  "gtk-keynav-cursor-only",
 
700
+  "gtk-keynav-wrap-around",
 
701
+  "gtk-error-bell",
 
702
+  "color-hash",
 
703
+  "gtk-file-chooser-backend",
 
704
+  "gtk-print-backends",
 
705
+  "gtk-print-preview-command",
 
706
+  "gtk-enable-mnemonics",
 
707
+  "gtk-enable-accels",
 
708
+  "gtk-recent-files-limit",
 
709
+  "gtk-im-module",
 
710
+  "gtk-recent-files-max-age",
 
711
+  "gtk-fontconfig-timestamp",
 
712
+  "gtk-sound-theme-name",
 
713
+  "gtk-enable-input-feedback-sounds",
 
714
+  "gtk-enable-event-sounds",
 
715
+  "gtk-enable-tooltips",
 
716
+  "gtk-toolbar-style",
 
717
+  "gtk-toolbar-icon-size",
 
718
+  "gtk-auto-mnemonics",
 
719
+  "gtk-primary-button-warps-slider",
 
720
+  "gtk-visible-focus",
 
721
+  "gtk-application-prefer-dark-theme",
 
722
+  "gtk-button-images",
 
723
+  "gtk-entry-select-on-focus",
 
724
+  "gtk-entry-password-hint-timeout",
 
725
+  "gtk-menu-images",
 
726
+  "gtk-menu-bar-popup-delay",
 
727
+  "gtk-scrolled-window-placement",
 
728
+  "gtk-can-change-accels",
 
729
+  "gtk-menu-popup-delay",
 
730
+  "gtk-menu-popdown-delay",
 
731
+  "gtk-label-select-on-focus",
 
732
+  "gtk-color-palette",
 
733
+  "gtk-im-preedit-style",
 
734
+  "gtk-im-status-style",
 
735
+  "gtk-shell-shows-app-menu",
 
736
+  "gtk-shell-shows-menubar",
 
737
+  "gtk-shell-shows-desktop",
 
738
+  "gtk-decoration-layout",
 
739
+  "gtk-titlebar-double-click",
 
740
+  "gtk-titlebar-middle-click",
 
741
+  "gtk-titlebar-right-click",
 
742
+  "gtk-dialogs-use-header",
 
743
+  "gtk-enable-primary-paste",
 
744
+  "gtk-recent-files-enabled",
 
745
+  "gtk-long-press-time",
 
746
+  "gtk-keynav-use-caret",
 
747
+  NULL
 
748
+};
 
749
+
 
750
+static gboolean
 
751
+gdk_mir_screen_get_setting (GdkScreen   *screen,
 
752
+                            const gchar *name,
 
753
+                            GValue      *value)
 
754
+{
 
755
+  GdkMirScreen *mir_screen;
 
756
+  GVariant *variant;
 
757
+
 
758
+  mir_screen = GDK_MIR_SCREEN (screen);
 
759
+  variant = g_hash_table_lookup (mir_screen->current_settings, name);
 
760
+
 
761
+  if (!variant)
 
762
+    update_setting (mir_screen, name);
 
763
+
 
764
+  variant = g_hash_table_lookup (mir_screen->current_settings, name);
 
765
+
 
766
+  if (!variant)
 
767
     {
 
768
-      g_value_set_string (value, "toggle-maximize");
 
769
-      return TRUE;
 
770
-    }
 
771
+      if (!g_strv_contains (KNOWN_SETTINGS, name))
 
772
+        g_warning ("unknown setting: %s", name);
 
773
 
 
774
-  g_warning ("unknown property %s", name);
 
775
+      return FALSE;
 
776
+    }
 
777
 
 
778
-  return FALSE;
 
779
+  g_dbus_gvariant_to_gvalue (variant, value);
 
780
+  return TRUE;
 
781
 }
 
782
 
 
783
 static gint
 
784
@@ -790,6 +1092,9 @@ gdk_mir_screen_init (GdkMirScreen *screen)
 
785
   screen->visual->screen = GDK_SCREEN (screen);
 
786
   screen->visual->type = VISUAL_TYPE;
 
787
   screen->visual->depth = VISUAL_DEPTH;
 
788
+
 
789
+  screen->settings_objects = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
 
790
+  screen->current_settings = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref);
 
791
 }
 
792
 
 
793
 static void
 
794
-- 
 
795
2.11.0
 
796