Merge lp:~larsu/overlay-scrollbar/only-enable-for-supported-themes into lp:overlay-scrollbar

Proposed by Lars Karlitski
Status: Needs review
Proposed branch: lp:~larsu/overlay-scrollbar/only-enable-for-supported-themes
Merge into: lp:overlay-scrollbar
Diff against target: 116 lines (+55/-11)
1 file modified
os/os-scrollbar.c (+55/-11)
To merge this branch: bzr merge lp:~larsu/overlay-scrollbar/only-enable-for-supported-themes
Reviewer Review Type Date Requested Status
Iain Lane (community) Needs Fixing
PS Jenkins bot (community) continuous-integration Approve
Ayatana Scrollbar Team Pending
Review via email: mp+228666@code.launchpad.net

Commit message

Only show scrollbars if the theme supports it

Keep the gsetting so that users can override this.

Description of the change

Only show scrollbars if the theme supports it

Keep the gsetting so that users can override this. This way we never accidentally enable overlay scrollbars in themes that don't support it.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Iain Lane (laney) wrote :

Just found this while proposing another MP. I guess it's still necessary so here is a small review. :)

review: Needs Fixing

Unmerged revisions

386. By Lars Karlitski

Only show scrollbars if the theme supports it

Keep the gsetting so that users can override this.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'os/os-scrollbar.c'
2--- os/os-scrollbar.c 2014-06-09 03:50:50 +0000
3+++ os/os-scrollbar.c 2014-07-29 12:56:53 +0000
4@@ -153,6 +153,7 @@
5 static GSList *scrollbar_list = NULL;
6 static GQuark os_quark_placement = 0;
7 static GQuark os_quark_qdata = 0;
8+static gboolean theme_supports_os = FALSE;
9 static ScrollbarMode scrollbar_mode = SCROLLBAR_MODE_NORMAL;
10 static cairo_region_t *os_workarea = NULL;
11
12@@ -3262,9 +3263,9 @@
13 use_overlay_scrollbar (void)
14 {
15 #ifdef USE_GTK3
16- return scrollbar_mode != SCROLLBAR_MODE_NORMAL;
17+ return theme_supports_os && scrollbar_mode != SCROLLBAR_MODE_NORMAL;
18 #else
19- return scrollbar_mode != SCROLLBAR_MODE_NORMAL && ubuntu_gtk_get_use_overlay_scrollbar ();
20+ return theme_supports_os && scrollbar_mode != SCROLLBAR_MODE_NORMAL && ubuntu_gtk_get_use_overlay_scrollbar ();
21 #endif
22 }
23
24@@ -4263,16 +4264,37 @@
25 gtk_widget_queue_resize (widget);
26 }
27
28-/* Callback called when scrollbar-mode changes. */
29+static gboolean
30+theme_supports_overlay_scrollbars ()
31+{
32+ gchar *theme;
33+ gchar **data_dirs;
34+ gchar *filename;
35+ GKeyFile *keyfile;
36+ gboolean ret = FALSE;
37+
38+ if (g_getenv ("XDG_DATA_DIRS") == NULL)
39+ return FALSE;
40+
41+ g_object_get (gtk_settings_get_default (), "gtk-theme-name", &theme, NULL);
42+ data_dirs = g_strsplit (g_getenv ("XDG_DATA_DIRS"), ":", 0);
43+ filename = g_build_path ("/", "themes", theme, "index.theme", NULL);
44+ keyfile = g_key_file_new ();
45+ if (g_key_file_load_from_dirs (keyfile, filename, (const gchar **) data_dirs, NULL, G_KEY_FILE_NONE, NULL))
46+ ret = g_key_file_get_boolean (keyfile, "X-GNOME-Metatheme", "X-Ubuntu-UseOverlayScrollbars", NULL);
47+
48+ g_key_file_unref (keyfile);
49+ g_free (filename);
50+ g_strfreev (data_dirs);
51+ g_free (theme);
52+ return ret;
53+}
54+
55 static void
56-scrollbar_mode_changed_cb (GObject *object,
57- GParamSpec *pspec,
58- gpointer user_data)
59+update_scrollbars ()
60 {
61- GSettings *settings;
62 GSList *tmp_list, *mapped_list;
63
64- settings = G_SETTINGS (object);
65 tmp_list = g_slist_copy (scrollbar_list);
66
67 /* Initialize the pointer by initializing its variable. */
68@@ -4281,9 +4303,6 @@
69 /* Unload all scrollbars, using previous scrollbar_mode. */
70 g_slist_foreach (tmp_list, scrollbar_mode_changed_unload_gfunc, &mapped_list);
71
72- /* Update the scrollbar_mode variable. */
73- scrollbar_mode = g_settings_get_enum (settings, "scrollbar-mode");
74-
75 #ifdef USE_GTK3
76 /* Load or unload custom style for overlay scrollbar. */
77 if (use_overlay_scrollbar ())
78@@ -4306,6 +4325,27 @@
79 g_slist_free (tmp_list);
80 }
81
82+static void
83+theme_changed_cb (GObject *object,
84+ GParamSpec *pspec,
85+ gpointer user_data)
86+{
87+ theme_supports_os = theme_supports_overlay_scrollbars ();
88+ update_scrollbars ();
89+}
90+
91+/* Callback called when scrollbar-mode changes. */
92+static void
93+scrollbar_mode_changed_cb (GObject *object,
94+ GParamSpec *pspec,
95+ gpointer user_data)
96+{
97+ GSettings *settings = G_SETTINGS (object);
98+
99+ scrollbar_mode = g_settings_get_enum (settings, "scrollbar-mode");
100+ update_scrollbars ();
101+}
102+
103 /* Suppress the warning 'missing-declarations'. */
104 void gtk_module_init (void);
105
106@@ -4376,6 +4416,10 @@
107 G_CALLBACK (scrollbar_mode_changed_cb), NULL);
108 scrollbar_mode = g_settings_get_enum (settings, "scrollbar-mode");
109
110+ g_signal_connect (gtk_settings_get_default (), "notify::gtk-theme-name",
111+ G_CALLBACK (theme_changed_cb), NULL);
112+ theme_supports_os = theme_supports_overlay_scrollbars ();
113+
114 #ifdef USE_GTK3
115 /* Initialize styling bits. */
116 provider = gtk_css_provider_new ();

Subscribers

People subscribed via source and target branches