Skip to content

Commit ea52d62

Browse files
committed
nemo-application.c: Move theme init code to libnemo-private.
1 parent 1337cf0 commit ea52d62

4 files changed

Lines changed: 238 additions & 219 deletions

File tree

libnemo-private/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ nemo_private_sources = [
6969
'nemo-signaller.c',
7070
'nemo-thumbnails.c',
7171
'nemo-trash-monitor.c',
72+
'nemo-theme-utils.c',
7273
'nemo-tree-view-drag-dest.c',
7374
'nemo-ui-utilities.c',
7475
'nemo-undo-manager.c',

libnemo-private/nemo-theme-utils.c

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
#include "nemo-theme-utils.h"
2+
#include "nemo-global-preferences.h"
3+
4+
#include <eel/eel-string.h>
5+
6+
static GtkCssProvider *mandatory_css_provider = NULL;
7+
8+
static gboolean
9+
css_provider_load_from_resource (GtkCssProvider *provider,
10+
const char *resource_path,
11+
GError **error)
12+
{
13+
GBytes *data;
14+
gboolean retval;
15+
16+
data = g_resources_lookup_data (resource_path, 0, error);
17+
if (!data)
18+
return FALSE;
19+
20+
retval = gtk_css_provider_load_from_data (provider,
21+
g_bytes_get_data (data, NULL),
22+
g_bytes_get_size (data),
23+
error);
24+
g_bytes_unref (data);
25+
26+
return retval;
27+
}
28+
29+
static gchar *
30+
load_file_contents_from_resource (const char *resource_path,
31+
GError **error)
32+
{
33+
GBytes *data;
34+
gchar *retval;
35+
36+
data = g_resources_lookup_data (resource_path, 0, error);
37+
38+
if (!data) {
39+
return NULL;
40+
}
41+
42+
retval = g_strdup ((gchar *) g_bytes_get_data (data, NULL));
43+
44+
g_bytes_unref (data);
45+
46+
return retval;
47+
}
48+
49+
static void
50+
add_css_provider_at_priority (const gchar *rpath, guint priority)
51+
{
52+
GtkCssProvider *provider;
53+
GError *error = NULL;
54+
55+
provider = gtk_css_provider_new ();
56+
57+
if (!css_provider_load_from_resource (provider, rpath, &error))
58+
{
59+
g_warning ("Failed to load css file '%s': %s", rpath, error->message);
60+
g_clear_error (&error);
61+
goto out;
62+
}
63+
64+
gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
65+
GTK_STYLE_PROVIDER (provider),
66+
priority);
67+
68+
out:
69+
g_object_unref (provider);
70+
}
71+
72+
static void
73+
add_fallback_mandatory_css_provider (const gchar *theme_name)
74+
{
75+
GtkCssProvider *current_provider;
76+
g_autofree gchar *css = NULL;
77+
g_autofree gchar *init_fallback_css = NULL;
78+
g_autofree gchar *final_fallback_css = NULL;
79+
GError *error = NULL;
80+
81+
current_provider = gtk_css_provider_get_named (theme_name, NULL);
82+
83+
css = gtk_css_provider_to_string (current_provider);
84+
85+
if (!g_strstr_len (css, -1, "nemo")) {
86+
g_warning ("The theme appears to have no nemo support. Adding some...");
87+
88+
init_fallback_css = load_file_contents_from_resource ("/org/nemo/nemo-style-fallback-mandatory.css",
89+
&error);
90+
91+
if (!init_fallback_css) {
92+
g_warning ("Failed to load fallback mandatory css file: %s", error->message);
93+
g_clear_error (&error);
94+
95+
goto out;
96+
}
97+
} else {
98+
goto out;
99+
}
100+
101+
if (g_strstr_len (css, -1, "theme_selected_bg_color")) {
102+
final_fallback_css = g_strdup (init_fallback_css);
103+
104+
goto apply;
105+
}
106+
107+
/* Some themes don't prefix colors with theme_ - remove this from our fallback css */
108+
if (g_strstr_len (css, -1, "@define-color selected_bg_color")) {
109+
g_warning ("Replacing theme_selected_bg_color with selected_bg_color");
110+
final_fallback_css = eel_str_replace_substring (init_fallback_css,
111+
"@theme_",
112+
"@");
113+
} else {
114+
/* If we can find neither, just bail out */
115+
g_warning ("Theme lacks both theme_selected_bg_color and selected_bg_color - "
116+
"cannot apply fallback CSS");
117+
goto out;
118+
}
119+
120+
apply:
121+
mandatory_css_provider = gtk_css_provider_new ();
122+
123+
gtk_css_provider_load_from_data (mandatory_css_provider,
124+
final_fallback_css,
125+
-1,
126+
&error);
127+
128+
if (error) {
129+
g_warning ("Failed to create a fallback provider: %s", error->message);
130+
g_clear_error (&error);
131+
g_clear_object (&mandatory_css_provider);
132+
goto out;
133+
}
134+
135+
gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
136+
GTK_STYLE_PROVIDER (mandatory_css_provider),
137+
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
138+
out:
139+
;
140+
}
141+
142+
static const char *supported_theme_hints[] = {
143+
"mint",
144+
"arc",
145+
"numix",
146+
"matcha"
147+
};
148+
149+
static gboolean
150+
is_known_supported_theme (const gchar *theme_name)
151+
{
152+
gint i;
153+
gchar *name;
154+
gboolean ret;
155+
156+
name = g_utf8_casefold (theme_name, -1);
157+
ret = FALSE;
158+
159+
for (i = 0; i < G_N_ELEMENTS (supported_theme_hints); i++) {
160+
gchar *hint;
161+
162+
hint = g_utf8_casefold (supported_theme_hints[i], -1);
163+
164+
if (g_strstr_len (name, -1, hint)) {
165+
ret = TRUE;
166+
}
167+
168+
g_free (hint);
169+
170+
if (ret) {
171+
break;
172+
}
173+
}
174+
175+
g_free (name);
176+
177+
return ret;
178+
}
179+
180+
static void
181+
process_theme (GtkSettings *gtk_settings)
182+
{
183+
gchar *theme_name;
184+
185+
if (mandatory_css_provider != NULL) {
186+
gtk_style_context_remove_provider_for_screen (gdk_screen_get_default (),
187+
GTK_STYLE_PROVIDER (mandatory_css_provider));
188+
g_clear_object (&mandatory_css_provider);
189+
}
190+
191+
g_object_get (gtk_settings,
192+
"gtk-theme-name", &theme_name,
193+
NULL);
194+
195+
if (!is_known_supported_theme (theme_name)) {
196+
g_warning ("Current gtk theme is not known to have nemo support (%s) - checking...", theme_name);
197+
add_fallback_mandatory_css_provider (theme_name);
198+
}
199+
200+
gtk_style_context_reset_widgets (gdk_screen_get_default ());
201+
g_free (theme_name);
202+
}
203+
204+
void
205+
nemo_theme_utils_init_styles (void)
206+
{
207+
static gboolean initialized = FALSE;
208+
GtkSettings *gtk_settings;
209+
210+
if (initialized)
211+
return;
212+
213+
initialized = TRUE;
214+
215+
add_css_provider_at_priority ("/org/nemo/nemo-style-fallback.css",
216+
GTK_STYLE_PROVIDER_PRIORITY_FALLBACK);
217+
218+
add_css_provider_at_priority ("/org/nemo/nemo-style-application.css",
219+
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
220+
221+
gtk_settings = gtk_settings_get_default ();
222+
223+
g_signal_connect_swapped (gtk_settings, "notify::gtk-theme-name",
224+
G_CALLBACK (process_theme), gtk_settings);
225+
226+
process_theme (gtk_settings);
227+
}

libnemo-private/nemo-theme-utils.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#ifndef NEMO_THEME_UTILS_H
2+
#define NEMO_THEME_UTILS_H
3+
4+
#include <gtk/gtk.h>
5+
6+
void nemo_theme_utils_init_styles (void);
7+
8+
#endif /* NEMO_THEME_UTILS_H */

0 commit comments

Comments
 (0)