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
6
This is a squash of commits
7
01b73072961f8c62255cf2b66dba4e55d36fd646 and
8
6e711beb0bdc2a30bfd948e5a6a077cd6fe82493.
10
gdk/mir/gdkmirscreen.c | 679 +++++++++++++++++++++++++++++++++++--------------
11
1 file changed, 492 insertions(+), 187 deletions(-)
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;
21
+ /* Display format */
25
GdkWindow *root_window;
28
+ GHashTable *settings_objects;
29
+ GHashTable *current_settings;
32
struct GdkMirScreenClass
33
@@ -168,6 +174,11 @@ _gdk_mir_screen_new (GdkDisplay *display)
35
gdk_mir_screen_dispose (GObject *object)
37
+ GdkMirScreen *screen = GDK_MIR_SCREEN (object);
39
+ g_clear_pointer (&screen->current_settings, g_hash_table_unref);
40
+ g_clear_pointer (&screen->settings_objects, g_hash_table_unref);
42
G_OBJECT_CLASS (gdk_mir_screen_parent_class)->dispose (object);
45
@@ -459,260 +470,551 @@ gdk_mir_screen_broadcast_client_message (GdkScreen *screen,
50
-gdk_mir_screen_get_setting (GdkScreen *screen,
53
+static void setting_changed (GSettings *settings,
55
+ GdkMirScreen *screen);
58
+get_settings (GdkMirScreen *screen,
59
+ const gchar *schema_id)
61
- if (strcmp (name, "gtk-theme-name") == 0)
63
- g_value_set_string (value, "Ambiance");
66
+ GSettings *settings;
67
+ GSettingsSchemaSource *source;
68
+ GSettingsSchema *schema;
70
- if (strcmp (name, "gtk-font-name") == 0)
72
- g_value_set_string (value, "Ubuntu");
75
+ settings = g_hash_table_lookup (screen->settings_objects, schema_id);
77
- if (strcmp (name, "gtk-enable-animations") == 0)
79
- g_value_set_boolean (value, TRUE);
83
+ return g_object_ref (settings);
85
- if (strcmp (name, "gtk-xft-dpi") == 0)
87
- g_value_set_int (value, 96 * 1024);
90
+ source = g_settings_schema_source_get_default ();
92
- if (strcmp (name, "gtk-xft-antialias") == 0)
95
- g_value_set_int (value, TRUE);
97
+ g_warning ("no schemas installed");
101
- if (strcmp (name, "gtk-xft-hinting") == 0)
103
- g_value_set_int (value, TRUE);
106
+ schema = g_settings_schema_source_lookup (source, schema_id, TRUE);
108
- if (strcmp (name, "gtk-xft-hintstyle") == 0)
111
- g_value_set_static_string (value, "hintfull");
113
+ g_warning ("schema not found: %s", schema_id);
117
- if (strcmp (name, "gtk-xft-rgba") == 0)
119
- g_value_set_static_string (value, "rgba");
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);
129
- if (g_str_equal (name, "gtk-modules"))
131
- g_value_set_string (value, NULL);
135
+read_setting (GdkMirScreen *screen,
136
+ const gchar *schema_id,
139
+ GSettings *settings;
142
- if (g_str_equal (name, "gtk-application-prefer-dark-theme"))
144
- g_value_set_boolean (value, FALSE);
147
+ settings = get_settings (screen, schema_id);
149
- if (g_str_equal (name, "gtk-key-theme-name"))
151
- g_value_set_string (value, NULL);
157
- if (g_str_equal (name, "gtk-double-click-time"))
159
- g_value_set_int (value, 250);
162
+ variant = g_settings_get_value (settings, key);
163
+ g_object_unref (settings);
167
- if (g_str_equal (name, "gtk-double-click-distance"))
169
- g_value_set_int (value, 5);
173
+change_setting (GdkMirScreen *screen,
177
+ GVariant *old_variant;
178
+ GdkEventSetting event;
180
- if (g_str_equal (name, "gtk-cursor-theme-name"))
182
- g_value_set_string (value, "Raleigh");
185
+ old_variant = g_hash_table_lookup (screen->current_settings, name);
187
- if (g_str_equal (name, "gtk-cursor-theme-size"))
189
- g_value_set_int (value, 128);
192
+ if (variant == old_variant)
195
- if (g_str_equal (name, "gtk-icon-theme-name"))
197
- g_value_set_string (value, "hicolor");
200
+ if (variant && old_variant && g_variant_equal (variant, old_variant))
203
- if (g_str_equal (name, "gtk-shell-shows-app-menu"))
205
- g_value_set_boolean (value, FALSE);
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);
213
- if (g_str_equal (name, "gtk-shell-shows-menubar"))
216
- g_value_set_boolean (value, FALSE);
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));
222
- if (g_str_equal (name, "gtk-shell-shows-desktop"))
225
- g_value_set_boolean (value, FALSE);
227
+ event.action = GDK_SETTING_ACTION_DELETED;
228
+ g_hash_table_remove (screen->current_settings, name);
231
- if (g_str_equal (name, "gtk-recent-files-enabled"))
233
- g_value_set_boolean (value, FALSE);
236
+ gdk_event_put ((const GdkEvent *) &event);
237
+ g_free (event.name);
240
- if (g_str_equal (name, "gtk-alternative-sort-arrows"))
242
- g_value_set_boolean (value, FALSE);
248
+ const gchar *schema_id;
250
+} SETTINGS_MAP[] = {
252
+ "gtk-double-click-time",
253
+ "org.gnome.settings-daemon.peripherals.mouse",
257
+ "gtk-cursor-blink",
258
+ "org.gnome.desktop.interface",
262
+ "gtk-cursor-blink-time",
263
+ "org.gnome.desktop.interface",
264
+ "cursor-blink-time"
267
+ "gtk-cursor-blink-timeout",
268
+ "org.gnome.desktop.interface",
269
+ "cursor-blink-timeout"
273
+ "org.gnome.desktop.interface",
277
+ "gtk-icon-theme-name",
278
+ "org.gnome.desktop.interface",
282
+ "gtk-key-theme-name",
283
+ "org.gnome.desktop.interface",
287
+ "gtk-dnd-drag-threshold",
288
+ "org.gnome.settings-daemon.peripherals.mouse",
293
+ "org.gnome.desktop.interface",
297
+ "gtk-xft-antialias",
298
+ "org.gnome.settings-daemon.plugins.xsettings",
303
+ "org.gnome.settings-daemon.plugins.xsettings",
307
+ "gtk-xft-hintstyle",
308
+ "org.gnome.settings-daemon.plugins.xsettings",
313
+ "org.gnome.settings-daemon.plugins.xsettings",
318
+ "org.gnome.desktop.interface",
319
+ "text-scaling-factor"
322
+ "gtk-cursor-theme-name",
323
+ "org.gnome.desktop.interface",
327
+ "gtk-cursor-theme-size",
328
+ "org.gnome.desktop.interface",
332
+ "gtk-enable-animations",
333
+ "org.gnome.desktop.interface",
334
+ "enable-animations"
338
+ "org.gnome.desktop.interface",
342
+ "gtk-recent-files-max-age",
343
+ "org.gnome.desktop.privacy",
344
+ "recent-files-max-age"
347
+ "gtk-sound-theme-name",
348
+ "org.gnome.desktop.sound",
352
+ "gtk-enable-input-feedback-sounds",
353
+ "org.gnome.desktop.sound",
354
+ "input-feedback-sounds"
357
+ "gtk-enable-event-sounds",
358
+ "org.gnome.desktop.sound",
362
+ "gtk-shell-shows-desktop",
363
+ "org.gnome.desktop.background",
364
+ "show-desktop-icons"
367
+ "gtk-decoration-layout",
368
+ "org.gnome.desktop.wm.preferences",
372
+ "gtk-titlebar-double-click",
373
+ "org.gnome.desktop.wm.preferences",
374
+ "action-double-click-titlebar"
377
+ "gtk-titlebar-middle-click",
378
+ "org.gnome.desktop.wm.preferences",
379
+ "action-middle-click-titlebar"
382
+ "gtk-titlebar-right-click",
383
+ "org.gnome.desktop.wm.preferences",
384
+ "action-right-click-titlebar"
387
+ "gtk-enable-primary-paste",
388
+ "org.gnome.desktop.interface",
389
+ "gtk-enable-primary-paste"
392
+ "gtk-recent-files-enabled",
393
+ "org.gnome.desktop.privacy",
394
+ "remember-recent-files"
397
+ "gtk-keynav-use-caret",
398
+ "org.gnome.desktop.a11y",
399
+ "always-show-text-caret"
404
- if (g_str_equal (name, "gtk-enable-accels"))
406
- g_value_set_boolean (value, TRUE);
410
+get_scaling_factor (GdkMirScreen *screen)
413
+ guint scaling_factor;
415
- if (g_str_equal (name, "gtk-enable-mnemonics"))
417
- g_value_set_boolean (value, TRUE);
420
+ variant = read_setting (screen, "org.gnome.desktop.interface", "scaling-factor");
422
- if (g_str_equal (name, "gtk-menu-images"))
425
- g_value_set_boolean (value, FALSE);
427
+ g_warning ("no scaling factor: org.gnome.desktop.interface.scaling-factor");
428
+ variant = g_variant_ref_sink (g_variant_new_uint32 (0));
431
- if (g_str_equal (name, "gtk-button-images"))
433
- g_value_set_boolean (value, FALSE);
436
+ scaling_factor = g_variant_get_uint32 (variant);
437
+ g_variant_unref (variant);
439
- if (g_str_equal (name, "gtk-split-cursor"))
441
- g_value_set_boolean (value, TRUE);
444
+ if (scaling_factor)
445
+ return scaling_factor;
447
- if (g_str_equal (name, "gtk-im-module"))
449
- g_value_set_string (value, NULL);
452
+ scaling_factor = 1;
454
- if (g_str_equal (name, "gtk-menu-bar-accel"))
456
- g_value_set_string (value, "F10");
459
+ /* TODO: scaling_factor = 2 if HiDPI >= 2 * 96 */
461
- if (g_str_equal (name, "gtk-cursor-blink"))
463
- g_value_set_boolean (value, TRUE);
466
+ return scaling_factor;
469
- if (g_str_equal (name, "gtk-cursor-blink-time"))
471
- g_value_set_int (value, 1200);
475
+update_setting (GdkMirScreen *screen,
479
+ GVariant *antialiasing_variant;
480
+ gboolean gtk_xft_antialias;
481
+ gboolean gtk_xft_hinting;
482
+ gdouble text_scaling_factor;
486
- if (g_str_equal (name, "gtk-cursor-blink-timeout"))
487
+ if (!g_strcmp0 (name, "gtk-modules"))
489
- g_value_set_int (value, 10);
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 */
497
- if (g_str_equal (name, "gtk-entry-select-on-focus"))
500
- g_value_set_boolean (value, FALSE);
502
+ for (i = 0; SETTINGS_MAP[i].name; i++)
503
+ if (!g_strcmp0 (name, SETTINGS_MAP[i].name))
506
+ if (!SETTINGS_MAP[i].name)
509
+ variant = read_setting (screen, SETTINGS_MAP[i].schema_id, SETTINGS_MAP[i].key);
513
+ g_warning ("no setting for %s: %s.%s", SETTINGS_MAP[i].name, SETTINGS_MAP[i].schema_id, SETTINGS_MAP[i].key);
518
- if (g_str_equal (name, "gtk-error-bell"))
519
+ if (!g_strcmp0 (name, "gtk-xft-antialias"))
521
- g_value_set_boolean (value, FALSE);
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));
528
- if (g_str_equal (name, "gtk-label-select-on-focus"))
529
+ else if (!g_strcmp0 (name, "gtk-xft-hinting"))
531
- g_value_set_boolean (value, FALSE);
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));
538
- if (g_str_equal (name, "gtk-decoration-layout"))
539
+ else if (!g_strcmp0 (name, "gtk-xft-hintstyle"))
541
- g_value_set_string (value, "menu:minimize,maximize,close");
543
+ if (!g_strcmp0 (g_variant_get_string (variant, NULL), "none"))
545
+ g_variant_unref (variant);
546
+ variant = g_variant_ref_sink (g_variant_new_string ("hintnone"));
548
+ else if (!g_strcmp0 (g_variant_get_string (variant, NULL), "slight"))
550
+ g_variant_unref (variant);
551
+ variant = g_variant_ref_sink (g_variant_new_string ("hintslight"));
553
+ else if (!g_strcmp0 (g_variant_get_string (variant, NULL), "medium"))
555
+ g_variant_unref (variant);
556
+ variant = g_variant_ref_sink (g_variant_new_string ("hintmedium"));
558
+ else if (!g_strcmp0 (g_variant_get_string (variant, NULL), "full"))
560
+ g_variant_unref (variant);
561
+ variant = g_variant_ref_sink (g_variant_new_string ("hintfull"));
565
+ g_warning ("unknown org.gnome.settings-daemon.plugins.xsettings.hinting value: %s", g_variant_get_string (variant, NULL));
566
+ g_variant_unref (variant);
570
+ else if (!g_strcmp0 (name, "gtk-xft-rgba"))
572
+ antialiasing_variant = read_setting (screen, "org.gnome.settings-daemon.plugins.xsettings", "antialiasing");
574
+ if (g_strcmp0 (g_variant_get_string (antialiasing_variant, NULL), "rgba"))
576
+ g_variant_unref (variant);
577
+ variant = g_variant_ref_sink (g_variant_new_string ("none"));
579
+ else if (g_strcmp0 (g_variant_get_string (variant, NULL), "rgba"))
581
+ g_variant_unref (variant);
582
+ variant = g_variant_ref_sink (g_variant_new_string ("rgb"));
585
- if (g_str_equal (name, "gtk-dnd-drag-threshold"))
586
+ g_variant_unref (antialiasing_variant);
588
+ else if (!g_strcmp0 (name, "gtk-xft-dpi"))
590
- g_value_set_int (value, 8);
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));
597
- if (g_str_equal (name, "gtk-dialogs-use-header"))
598
+ else if (!g_strcmp0 (name, "gtk-cursor-theme-size"))
600
- g_value_set_boolean (value, FALSE);
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));
607
- if (g_str_equal (name, "gtk-long-press-time"))
608
+ else if (!g_strcmp0 (name, "gtk-enable-animations"))
610
- g_value_set_uint (value, 500);
612
+ /* TODO: disable under vnc/vino/llvmpipe */
615
- if (g_str_equal (name, "gtk-primary-button-warps-slider"))
616
+ change_setting (screen, name, variant);
617
+ g_variant_unref (variant);
621
+setting_changed (GSettings *settings,
623
+ GdkMirScreen *screen)
628
+ g_object_get (settings, "schema-id", &schema_id, NULL);
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);
634
+ if (!g_strcmp0 (schema_id, "org.gnome.settings-daemon.plugins.xsettings"))
636
- g_value_set_boolean (value, 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");
646
- if (g_str_equal (name, "gtk-recent-files-max-age"))
647
+ else if (!g_strcmp0 (schema_id, "org.gnome.desktop.interface"))
649
- g_value_set_int (value, 30);
651
+ if (!g_strcmp0 (key, "scaling-factor"))
653
+ update_setting (screen, "gtk-xft-dpi");
654
+ update_setting (screen, "gtk-cursor-theme-size");
658
- if (g_str_equal (name, "gtk-titlebar-double-click"))
659
+ g_free (schema_id);
662
+static const gchar * const KNOWN_SETTINGS[] =
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",
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",
679
+ "gtk-xft-antialias",
681
+ "gtk-xft-hintstyle",
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",
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",
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",
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",
751
+gdk_mir_screen_get_setting (GdkScreen *screen,
755
+ GdkMirScreen *mir_screen;
758
+ mir_screen = GDK_MIR_SCREEN (screen);
759
+ variant = g_hash_table_lookup (mir_screen->current_settings, name);
762
+ update_setting (mir_screen, name);
764
+ variant = g_hash_table_lookup (mir_screen->current_settings, name);
768
- g_value_set_string (value, "toggle-maximize");
771
+ if (!g_strv_contains (KNOWN_SETTINGS, name))
772
+ g_warning ("unknown setting: %s", name);
774
- g_warning ("unknown property %s", name);
779
+ g_dbus_gvariant_to_gvalue (variant, value);
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;
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);