File: | capplets/appearance/appearance-themes.c |
Warning: | line 601, column 21 Null pointer passed to 1st parameter expecting 'nonnull' |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* | |||
2 | * Copyright (C) 2007, 2010 The GNOME Foundation | |||
3 | * Written by Thomas Wood <thos@gnome.org> | |||
4 | * Jens Granseuer <jensgr@gmx.net> | |||
5 | * All Rights Reserved | |||
6 | * | |||
7 | * This program is free software; you can redistribute it and/or modify | |||
8 | * it under the terms of the GNU General Public License as published by | |||
9 | * the Free Software Foundation; either version 2 of the License, or | |||
10 | * (at your option) any later version. | |||
11 | * | |||
12 | * This program is distributed in the hope that it will be useful, | |||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
15 | * GNU General Public License for more details. | |||
16 | * | |||
17 | * You should have received a copy of the GNU General Public License along | |||
18 | * with this program; if not, write to the Free Software Foundation, Inc., | |||
19 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |||
20 | */ | |||
21 | ||||
22 | #include "appearance.h" | |||
23 | #include "theme-thumbnail.h" | |||
24 | #include "cafe-theme-apply.h" | |||
25 | #include "theme-installer.h" | |||
26 | #include "theme-save.h" | |||
27 | #include "theme-util.h" | |||
28 | #include "ctkrc-utils.h" | |||
29 | ||||
30 | #include <glib/gi18n.h> | |||
31 | #include <libwindow-settings/cafe-wm-manager.h> | |||
32 | #include <string.h> | |||
33 | #include <libcafe-desktop/cafe-desktop-thumbnail.h> | |||
34 | #include <libcafe-desktop/cafe-gsettings.h> | |||
35 | ||||
36 | #define CUSTOM_THEME_NAME"__custom__" "__custom__" | |||
37 | ||||
38 | enum { | |||
39 | RESPONSE_APPLY_BG, | |||
40 | RESPONSE_REVERT_FONT, | |||
41 | RESPONSE_APPLY_FONT, | |||
42 | RESPONSE_INSTALL_ENGINE | |||
43 | }; | |||
44 | ||||
45 | enum { | |||
46 | TARGET_URI_LIST, | |||
47 | TARGET_NS_URL | |||
48 | }; | |||
49 | ||||
50 | static const CtkTargetEntry drop_types[] = | |||
51 | { | |||
52 | {"text/uri-list", 0, TARGET_URI_LIST}, | |||
53 | {"_NETSCAPE_URL", 0, TARGET_NS_URL} | |||
54 | }; | |||
55 | ||||
56 | static void theme_message_area_update(AppearanceData* data); | |||
57 | ||||
58 | static time_t theme_get_mtime(const char* name) | |||
59 | { | |||
60 | CafeThemeMetaInfo* theme; | |||
61 | time_t mtime = -1; | |||
62 | ||||
63 | theme = cafe_theme_meta_info_find(name); | |||
64 | if (theme != NULL((void*)0)) | |||
65 | { | |||
66 | GFile* file; | |||
67 | GFileInfo* file_info; | |||
68 | ||||
69 | file = g_file_new_for_path(theme->path); | |||
70 | file_info = g_file_query_info(file, G_FILE_ATTRIBUTE_TIME_MODIFIED"time::modified", G_FILE_QUERY_INFO_NONE, NULL((void*)0), NULL((void*)0)); | |||
71 | g_object_unref(file); | |||
72 | ||||
73 | if (file_info != NULL((void*)0)) | |||
74 | { | |||
75 | mtime = g_file_info_get_attribute_uint64(file_info, G_FILE_ATTRIBUTE_TIME_MODIFIED"time::modified"); | |||
76 | g_object_unref(file_info); | |||
77 | } | |||
78 | } | |||
79 | ||||
80 | return mtime; | |||
81 | } | |||
82 | ||||
83 | static void theme_thumbnail_update(GdkPixbuf* pixbuf, gchar* theme_name, AppearanceData* data, gboolean cache) | |||
84 | { | |||
85 | CtkTreeIter iter; | |||
86 | CtkTreeModel* model = CTK_TREE_MODEL(data->theme_store)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((data->theme_store)), ((ctk_tree_model_get_type ())))) )); | |||
87 | ||||
88 | /* find item in model and update thumbnail */ | |||
89 | if (!pixbuf) | |||
90 | return; | |||
91 | ||||
92 | if (theme_find_in_model(model, theme_name, &iter)) | |||
93 | { | |||
94 | time_t mtime; | |||
95 | ||||
96 | ctk_list_store_set(data->theme_store, &iter, COL_THUMBNAIL, pixbuf, -1); | |||
97 | ||||
98 | /* cache thumbnail */ | |||
99 | if (cache && (mtime = theme_get_mtime(theme_name)) != -1) | |||
100 | { | |||
101 | gchar* path; | |||
102 | ||||
103 | /* try to share thumbs with baul, use themes:/// */ | |||
104 | path = g_strconcat("themes:///", theme_name, NULL((void*)0)); | |||
105 | ||||
106 | cafe_desktop_thumbnail_factory_save_thumbnail(data->thumb_factory, pixbuf, path, mtime); | |||
107 | ||||
108 | g_free(path); | |||
109 | } | |||
110 | } | |||
111 | } | |||
112 | ||||
113 | static GdkPixbuf* theme_get_thumbnail_from_cache(CafeThemeMetaInfo* info, AppearanceData* data) | |||
114 | { | |||
115 | GdkPixbuf* thumb = NULL((void*)0); | |||
116 | gchar* path, *thumb_filename; | |||
117 | time_t mtime; | |||
118 | ||||
119 | if (info == data->theme_custom) | |||
120 | return NULL((void*)0); | |||
121 | ||||
122 | mtime = theme_get_mtime(info->name); | |||
123 | ||||
124 | if (mtime == -1) | |||
125 | return NULL((void*)0); | |||
126 | ||||
127 | /* try to share thumbs with baul, use themes:/// */ | |||
128 | path = g_strconcat ("themes:///", info->name, NULL((void*)0)); | |||
129 | thumb_filename = cafe_desktop_thumbnail_factory_lookup(data->thumb_factory, path, mtime); | |||
130 | g_free(path); | |||
131 | ||||
132 | if (thumb_filename != NULL((void*)0)) | |||
133 | { | |||
134 | thumb = gdk_pixbuf_new_from_file(thumb_filename, NULL((void*)0)); | |||
135 | g_free(thumb_filename); | |||
136 | } | |||
137 | ||||
138 | return thumb; | |||
139 | } | |||
140 | ||||
141 | static void | |||
142 | theme_thumbnail_done_cb (GdkPixbuf *pixbuf, gchar *theme_name, AppearanceData *data) | |||
143 | { | |||
144 | theme_thumbnail_update (pixbuf, theme_name, data, TRUE(!(0))); | |||
145 | } | |||
146 | ||||
147 | static void theme_thumbnail_generate(CafeThemeMetaInfo* info, AppearanceData* data) | |||
148 | { | |||
149 | GdkPixbuf* thumb = theme_get_thumbnail_from_cache(info, data); | |||
150 | ||||
151 | if (thumb != NULL((void*)0)) | |||
152 | { | |||
153 | theme_thumbnail_update(thumb, info->name, data, FALSE(0)); | |||
154 | g_object_unref(thumb); | |||
155 | } | |||
156 | else | |||
157 | { | |||
158 | generate_meta_theme_thumbnail_async(info, (ThemeThumbnailFunc) theme_thumbnail_done_cb, data, NULL((void*)0)); | |||
159 | } | |||
160 | } | |||
161 | ||||
162 | static void theme_changed_on_disk_cb(CafeThemeCommonInfo* theme, CafeThemeChangeType change_type, CafeThemeElement element_type, AppearanceData* data) | |||
163 | { | |||
164 | if (theme->type == CAFE_THEME_TYPE_METATHEME) | |||
165 | { | |||
166 | CafeThemeMetaInfo* meta = (CafeThemeMetaInfo*) theme; | |||
167 | ||||
168 | if (change_type == CAFE_THEME_CHANGE_CREATED) | |||
169 | { | |||
170 | ctk_list_store_insert_with_values (data->theme_store, NULL((void*)0), 0, COL_LABEL, meta->readable_name, COL_NAME, meta->name, COL_THUMBNAIL, data->theme_icon, -1); | |||
171 | theme_thumbnail_generate(meta, data); | |||
172 | } | |||
173 | else if (change_type == CAFE_THEME_CHANGE_DELETED) | |||
174 | { | |||
175 | CtkTreeIter iter; | |||
176 | ||||
177 | if (theme_find_in_model(CTK_TREE_MODEL(data->theme_store)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((data->theme_store)), ((ctk_tree_model_get_type ())))) )), meta->name, &iter)) | |||
178 | { | |||
179 | ctk_list_store_remove(data->theme_store, &iter); | |||
180 | } | |||
181 | } | |||
182 | else if (change_type == CAFE_THEME_CHANGE_CHANGED) | |||
183 | { | |||
184 | theme_thumbnail_generate(meta, data); | |||
185 | } | |||
186 | } | |||
187 | } | |||
188 | ||||
189 | /* Find out if the lockdown key has been set. */ | |||
190 | static gboolean is_locked_down() | |||
191 | { | |||
192 | gboolean is_locked; | |||
193 | GSettings *settings; | |||
194 | settings = g_settings_new (LOCKDOWN_SCHEMA"org.cafe.lockdown"); | |||
195 | is_locked = g_settings_get_boolean (settings, DISABLE_THEMES_SETTINGS_KEY"disable-theme-settings"); | |||
196 | g_object_unref (settings); | |||
197 | return is_locked; | |||
198 | } | |||
199 | ||||
200 | static CafeThemeMetaInfo * | |||
201 | theme_load_from_gsettings (AppearanceData *data) | |||
202 | { | |||
203 | CafeThemeMetaInfo *theme; | |||
204 | gchar *scheme; | |||
205 | ||||
206 | theme = cafe_theme_meta_info_new (); | |||
207 | ||||
208 | theme->ctk_theme_name = g_settings_get_string (data->interface_settings, CTK_THEME_KEY"ctk-theme"); | |||
209 | if (theme->ctk_theme_name == NULL((void*)0)) | |||
210 | theme->ctk_theme_name = g_strdup ("ClassicOk")g_strdup_inline ("ClassicOk"); | |||
211 | ||||
212 | scheme = g_settings_get_string (data->interface_settings, COLOR_SCHEME_KEY"ctk-color-scheme"); | |||
213 | if (scheme == NULL((void*)0) || !strcmp (scheme, "")) { | |||
214 | g_free (scheme); | |||
215 | scheme = ctkrc_get_color_scheme_for_theme (theme->ctk_theme_name); | |||
216 | } | |||
217 | theme->ctk_color_scheme = scheme; | |||
218 | ||||
219 | theme->croma_theme_name = g_settings_get_string (data->croma_settings, CROMA_THEME_KEY"theme"); | |||
220 | if (theme->croma_theme_name == NULL((void*)0)) | |||
221 | theme->croma_theme_name = g_strdup ("ClassicOk")g_strdup_inline ("ClassicOk"); | |||
222 | ||||
223 | theme->icon_theme_name = g_settings_get_string (data->interface_settings, ICON_THEME_KEY"icon-theme"); | |||
224 | if (theme->icon_theme_name == NULL((void*)0)) | |||
225 | theme->icon_theme_name = g_strdup ("cafe")g_strdup_inline ("cafe"); | |||
226 | ||||
227 | if (cafe_gsettings_schema_exists (NOTIFICATION_SCHEMA"org.cafe.NotificationDaemon")) { | |||
228 | GSettings *notification_settings; | |||
229 | notification_settings = g_settings_new (NOTIFICATION_SCHEMA"org.cafe.NotificationDaemon"); | |||
230 | theme->notification_theme_name = g_settings_get_string (notification_settings, NOTIFICATION_THEME_KEY"theme"); | |||
231 | g_object_unref (notification_settings); | |||
232 | } | |||
233 | else | |||
234 | theme->notification_theme_name = NULL((void*)0); | |||
235 | ||||
236 | theme->cursor_theme_name = g_settings_get_string (data->mouse_settings, CURSOR_THEME_KEY"cursor-theme"); | |||
237 | theme->cursor_size = g_settings_get_int (data->mouse_settings, CURSOR_SIZE_KEY"cursor-size"); | |||
238 | ||||
239 | if (theme->cursor_theme_name == NULL((void*)0)) | |||
240 | theme->cursor_theme_name = g_strdup ("default")g_strdup_inline ("default"); | |||
241 | ||||
242 | theme->application_font = g_settings_get_string (data->interface_settings, CTK_FONT_KEY"font-name"); | |||
243 | ||||
244 | return theme; | |||
245 | } | |||
246 | ||||
247 | static gchar * | |||
248 | theme_get_selected_name (CtkIconView *icon_view, AppearanceData *data) | |||
249 | { | |||
250 | gchar *name = NULL((void*)0); | |||
251 | GList *selected = ctk_icon_view_get_selected_items (icon_view); | |||
252 | ||||
253 | if (selected) { | |||
254 | CtkTreePath *path = selected->data; | |||
255 | CtkTreeModel *model = ctk_icon_view_get_model (icon_view); | |||
256 | CtkTreeIter iter; | |||
257 | ||||
258 | if (ctk_tree_model_get_iter (model, &iter, path)) | |||
259 | ctk_tree_model_get (model, &iter, COL_NAME, &name, -1); | |||
260 | ||||
261 | g_list_foreach (selected, (GFunc) ctk_tree_path_free, NULL((void*)0)); | |||
262 | g_list_free (selected); | |||
263 | } | |||
264 | ||||
265 | return name; | |||
266 | } | |||
267 | ||||
268 | static const CafeThemeMetaInfo * | |||
269 | theme_get_selected (CtkIconView *icon_view, AppearanceData *data) | |||
270 | { | |||
271 | CafeThemeMetaInfo *theme = NULL((void*)0); | |||
272 | gchar *name = theme_get_selected_name (icon_view, data); | |||
273 | ||||
274 | if (name != NULL((void*)0)) { | |||
275 | if (!strcmp (name, data->theme_custom->name)) { | |||
276 | theme = data->theme_custom; | |||
277 | } else { | |||
278 | theme = cafe_theme_meta_info_find (name); | |||
279 | } | |||
280 | ||||
281 | g_free (name); | |||
282 | } | |||
283 | ||||
284 | return theme; | |||
285 | } | |||
286 | ||||
287 | static void | |||
288 | theme_select_iter (CtkIconView *icon_view, CtkTreeIter *iter) | |||
289 | { | |||
290 | CtkTreePath *path; | |||
291 | ||||
292 | path = ctk_tree_model_get_path (ctk_icon_view_get_model (icon_view), iter); | |||
293 | ctk_icon_view_select_path (icon_view, path); | |||
294 | ctk_icon_view_scroll_to_path (icon_view, path, FALSE(0), 0.5, 0.0); | |||
295 | ctk_tree_path_free (path); | |||
296 | } | |||
297 | ||||
298 | static void | |||
299 | theme_select_name (CtkIconView *icon_view, const gchar *theme) | |||
300 | { | |||
301 | CtkTreeIter iter; | |||
302 | CtkTreeModel *model = ctk_icon_view_get_model (icon_view); | |||
303 | ||||
304 | if (theme_find_in_model (model, theme, &iter)) | |||
305 | theme_select_iter (icon_view, &iter); | |||
306 | } | |||
307 | ||||
308 | static gboolean | |||
309 | theme_is_equal (const CafeThemeMetaInfo *a, const CafeThemeMetaInfo *b) | |||
310 | { | |||
311 | gboolean a_set, b_set; | |||
312 | ||||
313 | if (!(a->ctk_theme_name && b->ctk_theme_name) || | |||
314 | strcmp (a->ctk_theme_name, b->ctk_theme_name)) | |||
315 | return FALSE(0); | |||
316 | ||||
317 | if (!(a->icon_theme_name && b->icon_theme_name) || | |||
318 | strcmp (a->icon_theme_name, b->icon_theme_name)) | |||
319 | return FALSE(0); | |||
320 | ||||
321 | if (!(a->croma_theme_name && b->croma_theme_name) || | |||
322 | strcmp (a->croma_theme_name, b->croma_theme_name)) | |||
323 | return FALSE(0); | |||
324 | ||||
325 | if (!(a->cursor_theme_name && b->cursor_theme_name) || | |||
326 | strcmp (a->cursor_theme_name, b->cursor_theme_name)) | |||
327 | return FALSE(0); | |||
328 | ||||
329 | if (a->cursor_size != b->cursor_size) | |||
330 | return FALSE(0); | |||
331 | ||||
332 | a_set = a->ctk_color_scheme && strcmp (a->ctk_color_scheme, ""); | |||
333 | b_set = b->ctk_color_scheme && strcmp (b->ctk_color_scheme, ""); | |||
334 | if ((a_set != b_set) || | |||
335 | (a_set && !cafe_theme_color_scheme_equal (a->ctk_color_scheme, b->ctk_color_scheme))) | |||
336 | return FALSE(0); | |||
337 | ||||
338 | return TRUE(!(0)); | |||
339 | } | |||
340 | ||||
341 | static void | |||
342 | theme_set_custom_from_theme (const CafeThemeMetaInfo *info, AppearanceData *data) | |||
343 | { | |||
344 | CafeThemeMetaInfo *custom = data->theme_custom; | |||
345 | CtkIconView *icon_view = CTK_ICON_VIEW (appearance_capplet_get_widget (data, "theme_list"))((((CtkIconView*) (void *) g_type_check_instance_cast ((GTypeInstance *) (((CtkWidget*) ctk_builder_get_object(data->ui, "theme_list" ))), ((ctk_icon_view_get_type ())))))); | |||
346 | CtkTreeModel *model; | |||
347 | CtkTreeIter iter; | |||
348 | CtkTreePath *path; | |||
349 | ||||
350 | if (info == custom) | |||
351 | return; | |||
352 | ||||
353 | /* if info is not NULL, we'll copy those theme settings over */ | |||
354 | if (info != NULL((void*)0)) { | |||
355 | g_free (custom->ctk_theme_name); | |||
356 | g_free (custom->icon_theme_name); | |||
357 | g_free (custom->croma_theme_name); | |||
358 | g_free (custom->ctk_color_scheme); | |||
359 | g_free (custom->cursor_theme_name); | |||
360 | g_free (custom->application_font); | |||
361 | custom->ctk_color_scheme = NULL((void*)0); | |||
362 | custom->application_font = NULL((void*)0); | |||
363 | ||||
364 | /* these settings are guaranteed to be non-NULL */ | |||
365 | custom->ctk_theme_name = g_strdup (info->ctk_theme_name)g_strdup_inline (info->ctk_theme_name); | |||
366 | custom->icon_theme_name = g_strdup (info->icon_theme_name)g_strdup_inline (info->icon_theme_name); | |||
367 | custom->croma_theme_name = g_strdup (info->croma_theme_name)g_strdup_inline (info->croma_theme_name); | |||
368 | custom->cursor_theme_name = g_strdup (info->cursor_theme_name)g_strdup_inline (info->cursor_theme_name); | |||
369 | custom->cursor_size = info->cursor_size; | |||
370 | ||||
371 | /* these can be NULL */ | |||
372 | if (info->ctk_color_scheme) | |||
373 | custom->ctk_color_scheme = g_strdup (info->ctk_color_scheme)g_strdup_inline (info->ctk_color_scheme); | |||
374 | else | |||
375 | custom->ctk_color_scheme = g_strdup ("")g_strdup_inline (""); | |||
376 | ||||
377 | if (info->application_font) | |||
378 | custom->application_font = g_strdup (info->application_font)g_strdup_inline (info->application_font); | |||
379 | else | |||
380 | custom->application_font = g_strdup (CTK_FONT_DEFAULT_VALUE)g_strdup_inline ("Sans 10"); | |||
381 | } | |||
382 | ||||
383 | /* select the custom theme */ | |||
384 | model = ctk_icon_view_get_model (icon_view); | |||
385 | if (!theme_find_in_model (model, custom->name, &iter)) { | |||
386 | CtkTreeIter child; | |||
387 | ||||
388 | ctk_list_store_insert_with_values (data->theme_store, &child, 0, | |||
389 | COL_LABEL, custom->readable_name, | |||
390 | COL_NAME, custom->name, | |||
391 | COL_THUMBNAIL, data->theme_icon, | |||
392 | -1); | |||
393 | ctk_tree_model_sort_convert_child_iter_to_iter ( | |||
394 | CTK_TREE_MODEL_SORT (model)((((CtkTreeModelSort*) (void *) g_type_check_instance_cast (( GTypeInstance*) ((model)), ((ctk_tree_model_sort_get_type ()) ))))), &iter, &child); | |||
395 | } | |||
396 | ||||
397 | path = ctk_tree_model_get_path (model, &iter); | |||
398 | ctk_icon_view_select_path (icon_view, path); | |||
399 | ctk_icon_view_scroll_to_path (icon_view, path, FALSE(0), 0.5, 0.0); | |||
400 | ctk_tree_path_free (path); | |||
401 | ||||
402 | /* update the theme thumbnail */ | |||
403 | theme_thumbnail_generate (custom, data); | |||
404 | } | |||
405 | ||||
406 | /** GUI Callbacks **/ | |||
407 | ||||
408 | static void custom_font_cb(CtkWidget* button, AppearanceData* data) | |||
409 | { | |||
410 | g_free(data->revert_application_font); | |||
411 | g_free(data->revert_documents_font); | |||
412 | g_free(data->revert_desktop_font); | |||
413 | g_free(data->revert_windowtitle_font); | |||
414 | g_free(data->revert_monospace_font); | |||
415 | data->revert_application_font = NULL((void*)0); | |||
416 | data->revert_documents_font = NULL((void*)0); | |||
417 | data->revert_desktop_font = NULL((void*)0); | |||
418 | data->revert_windowtitle_font = NULL((void*)0); | |||
419 | data->revert_monospace_font = NULL((void*)0); | |||
420 | } | |||
421 | ||||
422 | static void | |||
423 | theme_message_area_response_cb (CtkWidget *w, | |||
424 | gint response_id, | |||
425 | AppearanceData *data) | |||
426 | { | |||
427 | const CafeThemeMetaInfo *theme; | |||
428 | gchar *tmpfont; | |||
429 | gchar *engine_path; | |||
430 | ||||
431 | theme = theme_get_selected (CTK_ICON_VIEW (appearance_capplet_get_widget (data, "theme_list"))((((CtkIconView*) (void *) g_type_check_instance_cast ((GTypeInstance *) (((CtkWidget*) ctk_builder_get_object(data->ui, "theme_list" ))), ((ctk_icon_view_get_type ())))))), data); | |||
432 | if (!theme) | |||
433 | return; | |||
434 | ||||
435 | switch (response_id) | |||
436 | { | |||
437 | case RESPONSE_APPLY_BG: | |||
438 | g_settings_set_string (data->wp_settings, WP_FILE_KEY"picture-filename", theme->background_image); | |||
439 | break; | |||
440 | ||||
441 | case RESPONSE_REVERT_FONT: | |||
442 | if (data->revert_application_font != NULL((void*)0)) { | |||
443 | g_settings_set_string (data->interface_settings, CTK_FONT_KEY"font-name", data->revert_application_font); | |||
444 | g_free (data->revert_application_font); | |||
445 | data->revert_application_font = NULL((void*)0); | |||
446 | } | |||
447 | ||||
448 | if (data->revert_documents_font != NULL((void*)0)) { | |||
449 | g_settings_set_string (data->interface_settings, DOCUMENT_FONT_KEY"document-font-name", data->revert_documents_font); | |||
450 | g_free (data->revert_documents_font); | |||
451 | data->revert_documents_font = NULL((void*)0); | |||
452 | } | |||
453 | ||||
454 | if (data->baul_settings && data->revert_desktop_font != NULL((void*)0)) { | |||
455 | g_settings_set_string (data->baul_settings, DESKTOP_FONT_KEY"font", data->revert_desktop_font); | |||
456 | g_free (data->revert_desktop_font); | |||
457 | data->revert_desktop_font = NULL((void*)0); | |||
458 | } | |||
459 | ||||
460 | if (data->revert_windowtitle_font != NULL((void*)0)) { | |||
461 | g_settings_set_string (data->croma_settings, WINDOW_TITLE_FONT_KEY"titlebar-font", data->revert_windowtitle_font); | |||
462 | g_free (data->revert_windowtitle_font); | |||
463 | data->revert_windowtitle_font = NULL((void*)0); | |||
464 | } | |||
465 | ||||
466 | if (data->revert_monospace_font != NULL((void*)0)) { | |||
467 | g_settings_set_string (data->interface_settings, MONOSPACE_FONT_KEY"monospace-font-name", data->revert_monospace_font); | |||
468 | g_free (data->revert_monospace_font); | |||
469 | data->revert_monospace_font = NULL((void*)0); | |||
470 | } | |||
471 | break; | |||
472 | ||||
473 | case RESPONSE_APPLY_FONT: | |||
474 | if (theme->application_font) { | |||
475 | tmpfont = g_settings_get_string (data->interface_settings, CTK_FONT_KEY"font-name"); | |||
476 | if (tmpfont != NULL((void*)0)) { | |||
477 | g_free (data->revert_application_font); | |||
478 | ||||
479 | if (strcmp (theme->application_font, tmpfont) == 0) { | |||
480 | g_free (tmpfont); | |||
481 | data->revert_application_font = NULL((void*)0); | |||
482 | } else | |||
483 | data->revert_application_font = tmpfont; | |||
484 | } | |||
485 | g_settings_set_string (data->interface_settings, CTK_FONT_KEY"font-name", theme->application_font); | |||
486 | } | |||
487 | ||||
488 | if (theme->documents_font) { | |||
489 | tmpfont = g_settings_get_string (data->interface_settings, DOCUMENT_FONT_KEY"document-font-name"); | |||
490 | if (tmpfont != NULL((void*)0)) { | |||
491 | g_free (data->revert_documents_font); | |||
492 | ||||
493 | if (strcmp (theme->documents_font, tmpfont) == 0) { | |||
494 | g_free (tmpfont); | |||
495 | data->revert_documents_font = NULL((void*)0); | |||
496 | } else | |||
497 | data->revert_documents_font = tmpfont; | |||
498 | } | |||
499 | g_settings_set_string (data->interface_settings, DOCUMENT_FONT_KEY"document-font-name", theme->documents_font); | |||
500 | } | |||
501 | ||||
502 | if (data->baul_settings && theme->desktop_font) { | |||
503 | tmpfont = g_settings_get_string (data->baul_settings, DESKTOP_FONT_KEY"font"); | |||
504 | if (tmpfont != NULL((void*)0)) { | |||
505 | g_free (data->revert_desktop_font); | |||
506 | ||||
507 | if (strcmp (theme->desktop_font, tmpfont) == 0) { | |||
508 | g_free (tmpfont); | |||
509 | data->revert_desktop_font = NULL((void*)0); | |||
510 | } else | |||
511 | data->revert_desktop_font = tmpfont; | |||
512 | } | |||
513 | g_settings_set_string (data->baul_settings, DESKTOP_FONT_KEY"font", theme->desktop_font); | |||
514 | } | |||
515 | ||||
516 | if (theme->windowtitle_font) { | |||
517 | tmpfont = g_settings_get_string (data->croma_settings, WINDOW_TITLE_FONT_KEY"titlebar-font"); | |||
518 | if (tmpfont != NULL((void*)0)) { | |||
519 | g_free (data->revert_windowtitle_font); | |||
520 | ||||
521 | if (strcmp (theme->windowtitle_font, tmpfont) == 0) { | |||
522 | g_free (tmpfont); | |||
523 | data->revert_windowtitle_font = NULL((void*)0); | |||
524 | } else | |||
525 | data->revert_windowtitle_font = tmpfont; | |||
526 | } | |||
527 | g_settings_set_string (data->croma_settings, WINDOW_TITLE_FONT_KEY"titlebar-font", theme->windowtitle_font); | |||
528 | } | |||
529 | ||||
530 | if (theme->monospace_font) { | |||
531 | tmpfont = g_settings_get_string (data->interface_settings, MONOSPACE_FONT_KEY"monospace-font-name"); | |||
532 | if (tmpfont != NULL((void*)0)) { | |||
533 | g_free (data->revert_monospace_font); | |||
534 | ||||
535 | if (strcmp (theme->monospace_font, tmpfont) == 0) { | |||
536 | g_free (tmpfont); | |||
537 | data->revert_monospace_font = NULL((void*)0); | |||
538 | } else | |||
539 | data->revert_monospace_font = tmpfont; | |||
540 | } | |||
541 | g_settings_set_string (data->interface_settings, MONOSPACE_FONT_KEY"monospace-font-name", theme->monospace_font); | |||
542 | } | |||
543 | break; | |||
544 | ||||
545 | case RESPONSE_INSTALL_ENGINE: | |||
546 | engine_path = ctk_theme_info_missing_engine(theme->ctk_theme_name, FALSE(0)); | |||
547 | ||||
548 | if (engine_path != NULL((void*)0)) { | |||
549 | theme_install_file(CTK_WINDOW(ctk_widget_get_toplevel(data->install_button))((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((ctk_widget_get_toplevel(data->install_button))), ((ctk_window_get_type ())))))), engine_path); | |||
550 | g_free (engine_path); | |||
551 | } | |||
552 | ||||
553 | theme_message_area_update(data); | |||
554 | break; | |||
555 | } | |||
556 | } | |||
557 | ||||
558 | static void | |||
559 | theme_message_area_update (AppearanceData *data) | |||
560 | { | |||
561 | const CafeThemeMetaInfo *theme; | |||
562 | gboolean show_apply_background = FALSE(0); | |||
563 | gboolean show_apply_font = FALSE(0); | |||
564 | gboolean show_revert_font = FALSE(0); | |||
565 | gboolean show_error; | |||
566 | const gchar *message; | |||
567 | GError *error = NULL((void*)0); | |||
568 | ||||
569 | theme = theme_get_selected (CTK_ICON_VIEW (appearance_capplet_get_widget (data, "theme_list"))((((CtkIconView*) (void *) g_type_check_instance_cast ((GTypeInstance *) (((CtkWidget*) ctk_builder_get_object(data->ui, "theme_list" ))), ((ctk_icon_view_get_type ())))))), data); | |||
570 | ||||
571 | if (!theme
| |||
572 | if (data->theme_message_area != NULL((void*)0)) | |||
573 | ctk_widget_hide (data->theme_message_area); | |||
574 | return; | |||
575 | } | |||
576 | ||||
577 | show_error = !cafe_theme_meta_info_validate (theme, &error); | |||
578 | ||||
579 | if (!show_error
| |||
580 | gchar *font; | |||
581 | ||||
582 | if (theme->background_image != NULL((void*)0)) { | |||
583 | gchar *background; | |||
584 | ||||
585 | background = g_settings_get_string (data->wp_settings, WP_FILE_KEY"picture-filename"); | |||
586 | show_apply_background = | |||
587 | (!background || strcmp (theme->background_image, background) != 0); | |||
588 | g_free (background); | |||
589 | } | |||
590 | ||||
591 | if (theme->application_font) { | |||
592 | font = g_settings_get_string (data->interface_settings, CTK_FONT_KEY"font-name"); | |||
593 | show_apply_font = | |||
594 | (!font || strcmp (theme->application_font, font) != 0); | |||
595 | g_free (font); | |||
596 | } | |||
597 | ||||
598 | if (!show_apply_font
| |||
599 | font = g_settings_get_string (data->interface_settings, DOCUMENT_FONT_KEY"document-font-name"); | |||
600 | show_apply_font = | |||
601 | (!font || strcmp (theme->application_font, font) != 0); | |||
| ||||
602 | g_free (font); | |||
603 | } | |||
604 | ||||
605 | if (data->baul_settings && !show_apply_font && theme->desktop_font) { | |||
606 | font = g_settings_get_string (data->baul_settings, DESKTOP_FONT_KEY"font"); | |||
607 | show_apply_font = | |||
608 | (!font || strcmp (theme->application_font, font) != 0); | |||
609 | g_free (font); | |||
610 | } | |||
611 | ||||
612 | if (!show_apply_font && theme->windowtitle_font) { | |||
613 | font = g_settings_get_string (data->croma_settings, WINDOW_TITLE_FONT_KEY"titlebar-font"); | |||
614 | show_apply_font = | |||
615 | (!font || strcmp (theme->application_font, font) != 0); | |||
616 | g_free (font); | |||
617 | } | |||
618 | ||||
619 | if (!show_apply_font && theme->monospace_font) { | |||
620 | font = g_settings_get_string (data->interface_settings, MONOSPACE_FONT_KEY"monospace-font-name"); | |||
621 | show_apply_font = | |||
622 | (!font || strcmp (theme->application_font, font) != 0); | |||
623 | g_free (font); | |||
624 | } | |||
625 | ||||
626 | show_revert_font = (data->revert_application_font != NULL((void*)0) || | |||
627 | data->revert_documents_font != NULL((void*)0) || data->revert_desktop_font != NULL((void*)0) || | |||
628 | data->revert_windowtitle_font != NULL((void*)0) || data->revert_monospace_font != NULL((void*)0)); | |||
629 | } | |||
630 | ||||
631 | if (data->theme_message_area == NULL((void*)0)) { | |||
632 | CtkWidget *hbox; | |||
633 | CtkWidget *parent; | |||
634 | CtkWidget *content; | |||
635 | ||||
636 | if (!show_apply_background && !show_revert_font && !show_apply_font && !show_error) | |||
637 | return; | |||
638 | ||||
639 | data->theme_message_area = ctk_info_bar_new (); | |||
640 | ctk_widget_set_no_show_all (data->theme_message_area, TRUE(!(0))); | |||
641 | ||||
642 | g_signal_connect (data->theme_message_area, "response",g_signal_connect_data ((data->theme_message_area), ("response" ), ((GCallback) theme_message_area_response_cb), (data), ((void *)0), (GConnectFlags) 0) | |||
643 | (GCallback) theme_message_area_response_cb, data)g_signal_connect_data ((data->theme_message_area), ("response" ), ((GCallback) theme_message_area_response_cb), (data), ((void *)0), (GConnectFlags) 0); | |||
644 | ||||
645 | data->apply_background_button = ctk_info_bar_add_button ( | |||
646 | CTK_INFO_BAR (data->theme_message_area)((((CtkInfoBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((data->theme_message_area)), ((ctk_info_bar_get_type() )))))), | |||
647 | _("Apply Background")gettext ("Apply Background"), | |||
648 | RESPONSE_APPLY_BG); | |||
649 | data->apply_font_button = ctk_info_bar_add_button ( | |||
650 | CTK_INFO_BAR (data->theme_message_area)((((CtkInfoBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((data->theme_message_area)), ((ctk_info_bar_get_type() )))))), | |||
651 | _("Apply Font")gettext ("Apply Font"), | |||
652 | RESPONSE_APPLY_FONT); | |||
653 | data->revert_font_button = ctk_info_bar_add_button ( | |||
654 | CTK_INFO_BAR (data->theme_message_area)((((CtkInfoBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((data->theme_message_area)), ((ctk_info_bar_get_type() )))))), | |||
655 | _("Revert Font")gettext ("Revert Font"), | |||
656 | RESPONSE_REVERT_FONT); | |||
657 | data->install_button = ctk_info_bar_add_button ( | |||
658 | CTK_INFO_BAR (data->theme_message_area)((((CtkInfoBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((data->theme_message_area)), ((ctk_info_bar_get_type() )))))), | |||
659 | _("Install")gettext ("Install"), | |||
660 | RESPONSE_INSTALL_ENGINE); | |||
661 | ||||
662 | data->theme_message_label = ctk_label_new (NULL((void*)0)); | |||
663 | ctk_widget_show (data->theme_message_label); | |||
664 | ctk_label_set_line_wrap (CTK_LABEL (data->theme_message_label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((data->theme_message_label)), ((ctk_label_get_type ()) ))))), TRUE(!(0))); | |||
665 | ctk_label_set_xalign (CTK_LABEL (data->theme_message_label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((data->theme_message_label)), ((ctk_label_get_type ()) ))))), 0.0); | |||
666 | ||||
667 | hbox = ctk_box_new (CTK_ORIENTATION_HORIZONTAL, 9); | |||
668 | ctk_widget_show (hbox); | |||
669 | data->theme_info_icon = ctk_image_new_from_icon_name ("dialog-information", CTK_ICON_SIZE_DIALOG); | |||
670 | data->theme_error_icon = ctk_image_new_from_icon_name ("dialog-warning", CTK_ICON_SIZE_DIALOG); | |||
671 | ctk_widget_set_halign (data->theme_info_icon, CTK_ALIGN_CENTER); | |||
672 | ctk_widget_set_valign (data->theme_info_icon, CTK_ALIGN_START); | |||
673 | ctk_widget_set_halign (data->theme_error_icon, CTK_ALIGN_CENTER); | |||
674 | ctk_widget_set_valign (data->theme_error_icon, CTK_ALIGN_START); | |||
675 | ctk_box_pack_start (CTK_BOX (hbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((hbox)), ((ctk_box_get_type ())))))), data->theme_info_icon, FALSE(0), FALSE(0), 0); | |||
676 | ctk_box_pack_start (CTK_BOX (hbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((hbox)), ((ctk_box_get_type ())))))), data->theme_error_icon, FALSE(0), FALSE(0), 0); | |||
677 | ctk_box_pack_start (CTK_BOX (hbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((hbox)), ((ctk_box_get_type ())))))), data->theme_message_label, TRUE(!(0)), TRUE(!(0)), 0); | |||
678 | content = ctk_info_bar_get_content_area (CTK_INFO_BAR (data->theme_message_area)((((CtkInfoBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((data->theme_message_area)), ((ctk_info_bar_get_type() ))))))); | |||
679 | ctk_container_add (CTK_CONTAINER (content)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((content)), ((ctk_container_get_type ())))))), hbox); | |||
680 | ||||
681 | parent = appearance_capplet_get_widget (data, "theme_list_vbox")(CtkWidget*) ctk_builder_get_object(data->ui, "theme_list_vbox" ); | |||
682 | ctk_box_pack_start (CTK_BOX (parent)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((parent)), ((ctk_box_get_type ())))))), data->theme_message_area, FALSE(0), FALSE(0), 0); | |||
683 | } | |||
684 | ||||
685 | if (show_error) | |||
686 | message = error->message; | |||
687 | else if (show_apply_background && show_apply_font && show_revert_font) | |||
688 | message = _("The current theme suggests a background and a font. Also, the last applied font suggestion can be reverted.")gettext ("The current theme suggests a background and a font. Also, the last applied font suggestion can be reverted." ); | |||
689 | else if (show_apply_background && show_revert_font) | |||
690 | message = _("The current theme suggests a background. Also, the last applied font suggestion can be reverted.")gettext ("The current theme suggests a background. Also, the last applied font suggestion can be reverted." ); | |||
691 | else if (show_apply_background && show_apply_font) | |||
692 | message = _("The current theme suggests a background and a font.")gettext ("The current theme suggests a background and a font." ); | |||
693 | else if (show_apply_font && show_revert_font) | |||
694 | message = _("The current theme suggests a font. Also, the last applied font suggestion can be reverted.")gettext ("The current theme suggests a font. Also, the last applied font suggestion can be reverted." ); | |||
695 | else if (show_apply_background) | |||
696 | message = _("The current theme suggests a background.")gettext ("The current theme suggests a background."); | |||
697 | else if (show_revert_font) | |||
698 | message = _("The last applied font suggestion can be reverted.")gettext ("The last applied font suggestion can be reverted."); | |||
699 | else if (show_apply_font) | |||
700 | message = _("The current theme suggests a font.")gettext ("The current theme suggests a font."); | |||
701 | else | |||
702 | message = NULL((void*)0); | |||
703 | ||||
704 | if (show_apply_background) | |||
705 | ctk_widget_show (data->apply_background_button); | |||
706 | else | |||
707 | ctk_widget_hide (data->apply_background_button); | |||
708 | ||||
709 | if (show_apply_font) | |||
710 | ctk_widget_show (data->apply_font_button); | |||
711 | else | |||
712 | ctk_widget_hide (data->apply_font_button); | |||
713 | ||||
714 | if (show_revert_font) | |||
715 | ctk_widget_show (data->revert_font_button); | |||
716 | else | |||
717 | ctk_widget_hide (data->revert_font_button); | |||
718 | ||||
719 | if (show_error | |||
720 | && g_error_matches (error, CAFE_THEME_ERRORcafe_theme_info_error_quark(), CAFE_THEME_ERROR_CTK_ENGINE_NOT_AVAILABLE) | |||
721 | && packagekit_available ()) | |||
722 | ctk_widget_show (data->install_button); | |||
723 | else | |||
724 | ctk_widget_hide (data->install_button); | |||
725 | ||||
726 | if (show_error || show_apply_background || show_apply_font || show_revert_font) { | |||
727 | ctk_widget_show (data->theme_message_area); | |||
728 | ctk_widget_queue_draw (data->theme_message_area); | |||
729 | ||||
730 | if (show_error) { | |||
731 | ctk_widget_show (data->theme_error_icon); | |||
732 | ctk_widget_hide (data->theme_info_icon); | |||
733 | } else { | |||
734 | ctk_widget_show (data->theme_info_icon); | |||
735 | ctk_widget_hide (data->theme_error_icon); | |||
736 | } | |||
737 | } else { | |||
738 | ctk_widget_hide (data->theme_message_area); | |||
739 | } | |||
740 | ||||
741 | ctk_label_set_text (CTK_LABEL (data->theme_message_label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((data->theme_message_label)), ((ctk_label_get_type ()) ))))), message); | |||
742 | g_clear_error (&error); | |||
743 | } | |||
744 | ||||
745 | static void | |||
746 | theme_selection_changed_cb (CtkWidget *icon_view, AppearanceData *data) | |||
747 | { | |||
748 | GList *selection; | |||
749 | CafeThemeMetaInfo *theme = NULL((void*)0); | |||
750 | ||||
751 | selection = ctk_icon_view_get_selected_items (CTK_ICON_VIEW (icon_view)((((CtkIconView*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((icon_view)), ((ctk_icon_view_get_type ()))))))); | |||
752 | ||||
753 | if (selection) { | |||
754 | CtkTreeModel *model; | |||
755 | CtkTreeIter iter; | |||
756 | gchar *name; | |||
757 | gboolean is_custom; | |||
758 | ||||
759 | model = ctk_icon_view_get_model (CTK_ICON_VIEW (icon_view)((((CtkIconView*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((icon_view)), ((ctk_icon_view_get_type ()))))))); | |||
760 | ctk_tree_model_get_iter (model, &iter, selection->data); | |||
761 | ctk_tree_model_get (model, &iter, COL_NAME, &name, -1); | |||
762 | ||||
763 | is_custom = !strcmp (name, CUSTOM_THEME_NAME"__custom__"); | |||
764 | ||||
765 | if (is_custom) | |||
766 | theme = data->theme_custom; | |||
767 | else | |||
768 | theme = cafe_theme_meta_info_find (name); | |||
769 | ||||
770 | if (theme) { | |||
771 | cafe_meta_theme_set (theme); | |||
772 | theme_message_area_update (data); | |||
773 | } | |||
774 | ||||
775 | g_free (name); | |||
776 | g_list_foreach (selection, (GFunc) ctk_tree_path_free, NULL((void*)0)); | |||
777 | g_list_free (selection); | |||
778 | ||||
779 | ctk_widget_set_sensitive (appearance_capplet_get_widget (data, "theme_delete")(CtkWidget*) ctk_builder_get_object(data->ui, "theme_delete" ), | |||
780 | theme_is_writable (theme)); | |||
781 | ctk_widget_set_sensitive (appearance_capplet_get_widget (data, "theme_save")(CtkWidget*) ctk_builder_get_object(data->ui, "theme_save" ), is_custom); | |||
782 | } | |||
783 | } | |||
784 | ||||
785 | static void | |||
786 | theme_custom_cb (CtkWidget *button, AppearanceData *data) | |||
787 | { | |||
788 | CtkWidget *w, *parent; | |||
789 | ||||
790 | w = appearance_capplet_get_widget (data, "theme_details")(CtkWidget*) ctk_builder_get_object(data->ui, "theme_details" ); | |||
791 | parent = appearance_capplet_get_widget (data, "appearance_window")(CtkWidget*) ctk_builder_get_object(data->ui, "appearance_window" ); | |||
792 | ctk_window_set_transient_for (CTK_WINDOW (w)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((w)), ((ctk_window_get_type ())))))), CTK_WINDOW (parent)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((parent)), ((ctk_window_get_type ()))))))); | |||
793 | ctk_widget_show_all (w); | |||
794 | } | |||
795 | ||||
796 | static void | |||
797 | theme_save_cb (CtkWidget *button, AppearanceData *data) | |||
798 | { | |||
799 | theme_save_dialog_run (data->theme_custom, data); | |||
800 | } | |||
801 | ||||
802 | static void | |||
803 | theme_install_cb (CtkWidget *button, AppearanceData *data) | |||
804 | { | |||
805 | cafe_theme_installer_run ( | |||
806 | CTK_WINDOW (appearance_capplet_get_widget (data, "appearance_window"))((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) (((CtkWidget*) ctk_builder_get_object(data->ui, "appearance_window" ))), ((ctk_window_get_type ()))))))); | |||
807 | } | |||
808 | ||||
809 | static void | |||
810 | theme_delete_cb (CtkWidget *button, AppearanceData *data) | |||
811 | { | |||
812 | CtkIconView *icon_view = CTK_ICON_VIEW (appearance_capplet_get_widget (data, "theme_list"))((((CtkIconView*) (void *) g_type_check_instance_cast ((GTypeInstance *) (((CtkWidget*) ctk_builder_get_object(data->ui, "theme_list" ))), ((ctk_icon_view_get_type ())))))); | |||
813 | GList *selected = ctk_icon_view_get_selected_items (icon_view); | |||
814 | ||||
815 | if (selected) { | |||
816 | CtkTreePath *path = selected->data; | |||
817 | CtkTreeModel *model = ctk_icon_view_get_model (icon_view); | |||
818 | CtkTreeIter iter; | |||
819 | gchar *name = NULL((void*)0); | |||
820 | ||||
821 | if (ctk_tree_model_get_iter (model, &iter, path)) | |||
822 | ctk_tree_model_get (model, &iter, COL_NAME, &name, -1); | |||
823 | ||||
824 | if (name != NULL((void*)0) && | |||
825 | strcmp (name, data->theme_custom->name) && | |||
826 | theme_delete (name, THEME_TYPE_META)) { | |||
827 | /* remove theme from the model, too */ | |||
828 | CtkTreeIter child; | |||
829 | ||||
830 | if (ctk_tree_model_iter_next (model, &iter) || | |||
831 | theme_model_iter_last (model, &iter)) | |||
832 | theme_select_iter (icon_view, &iter); | |||
833 | ||||
834 | ctk_tree_model_get_iter (model, &iter, path); | |||
835 | ctk_tree_model_sort_convert_iter_to_child_iter ( | |||
836 | CTK_TREE_MODEL_SORT (model)((((CtkTreeModelSort*) (void *) g_type_check_instance_cast (( GTypeInstance*) ((model)), ((ctk_tree_model_sort_get_type ()) ))))), &child, &iter); | |||
837 | ctk_list_store_remove (data->theme_store, &child); | |||
838 | } | |||
839 | ||||
840 | g_list_foreach (selected, (GFunc) ctk_tree_path_free, NULL((void*)0)); | |||
841 | g_list_free (selected); | |||
842 | g_free (name); | |||
843 | } | |||
844 | } | |||
845 | ||||
846 | static void | |||
847 | theme_details_changed_cb (AppearanceData *data) | |||
848 | { | |||
849 | CafeThemeMetaInfo *gsettings_theme; | |||
850 | const CafeThemeMetaInfo *selected; | |||
851 | CtkIconView *icon_view; | |||
852 | gboolean done = FALSE(0); | |||
853 | ||||
854 | /* load new state from gsettings */ | |||
855 | gsettings_theme = theme_load_from_gsettings (data); | |||
856 | ||||
857 | /* check if it's our currently selected theme */ | |||
858 | icon_view = CTK_ICON_VIEW (appearance_capplet_get_widget (data, "theme_list"))((((CtkIconView*) (void *) g_type_check_instance_cast ((GTypeInstance *) (((CtkWidget*) ctk_builder_get_object(data->ui, "theme_list" ))), ((ctk_icon_view_get_type ())))))); | |||
859 | selected = theme_get_selected (icon_view, data); | |||
860 | ||||
861 | if (!selected || !(done = theme_is_equal (selected, gsettings_theme))) { | |||
862 | /* look for a matching metatheme */ | |||
863 | GList *theme_list, *l; | |||
864 | ||||
865 | theme_list = cafe_theme_meta_info_find_all (); | |||
866 | ||||
867 | for (l = theme_list; l; l = l->next) { | |||
868 | CafeThemeMetaInfo *info = l->data; | |||
869 | ||||
870 | if (theme_is_equal (gsettings_theme, info)) { | |||
871 | theme_select_name (icon_view, info->name); | |||
872 | done = TRUE(!(0)); | |||
873 | break; | |||
874 | } | |||
875 | } | |||
876 | g_list_free (theme_list); | |||
877 | } | |||
878 | ||||
879 | if (!done) | |||
880 | /* didn't find a match, set or update custom */ | |||
881 | theme_set_custom_from_theme (gsettings_theme, data); | |||
882 | ||||
883 | cafe_theme_meta_info_free (gsettings_theme); | |||
884 | } | |||
885 | ||||
886 | static void | |||
887 | theme_setting_changed_cb (GObject *settings, | |||
888 | GParamSpec *pspec, | |||
889 | AppearanceData *data) | |||
890 | { | |||
891 | theme_details_changed_cb (data); | |||
892 | } | |||
893 | ||||
894 | static void | |||
895 | theme_gsettings_changed (GSettings *settings, | |||
896 | gchar *key, | |||
897 | AppearanceData *data) | |||
898 | { | |||
899 | theme_details_changed_cb (data); | |||
900 | } | |||
901 | ||||
902 | static gint | |||
903 | theme_list_sort_func (CafeThemeMetaInfo *a, | |||
904 | CafeThemeMetaInfo *b) | |||
905 | { | |||
906 | return strcmp (a->readable_name, b->readable_name); | |||
907 | } | |||
908 | ||||
909 | static gint | |||
910 | theme_store_sort_func (CtkTreeModel *model, | |||
911 | CtkTreeIter *a, | |||
912 | CtkTreeIter *b, | |||
913 | gpointer user_data) | |||
914 | { | |||
915 | gchar *a_name, *a_label; | |||
916 | gint rc; | |||
917 | ||||
918 | ctk_tree_model_get (model, a, COL_NAME, &a_name, COL_LABEL, &a_label, -1); | |||
919 | ||||
920 | if (!strcmp (a_name, CUSTOM_THEME_NAME"__custom__")) { | |||
921 | rc = -1; | |||
922 | } else { | |||
923 | gchar *b_name, *b_label; | |||
924 | ||||
925 | ctk_tree_model_get (model, b, COL_NAME, &b_name, COL_LABEL, &b_label, -1); | |||
926 | ||||
927 | if (!strcmp (b_name, CUSTOM_THEME_NAME"__custom__")) { | |||
928 | rc = 1; | |||
929 | } else { | |||
930 | gchar *a_case, *b_case; | |||
931 | ||||
932 | a_case = g_utf8_casefold (a_label, -1); | |||
933 | b_case = g_utf8_casefold (b_label, -1); | |||
934 | rc = g_utf8_collate (a_case, b_case); | |||
935 | g_free (a_case); | |||
936 | g_free (b_case); | |||
937 | } | |||
938 | ||||
939 | g_free (b_name); | |||
940 | g_free (b_label); | |||
941 | } | |||
942 | ||||
943 | g_free (a_name); | |||
944 | g_free (a_label); | |||
945 | ||||
946 | return rc; | |||
947 | } | |||
948 | ||||
949 | static void | |||
950 | theme_drag_data_received_cb (CtkWidget *widget, | |||
951 | CdkDragContext *context, | |||
952 | gint x, gint y, | |||
953 | CtkSelectionData *selection_data, | |||
954 | guint info, guint time, | |||
955 | AppearanceData *data) | |||
956 | { | |||
957 | gchar **uris; | |||
958 | ||||
959 | if (!(info == TARGET_URI_LIST || info == TARGET_NS_URL)) | |||
960 | return; | |||
961 | ||||
962 | uris = g_uri_list_extract_uris ((gchar *) ctk_selection_data_get_data (selection_data)); | |||
963 | ||||
964 | if (uris != NULL((void*)0) && uris[0] != NULL((void*)0)) { | |||
965 | GFile *f = g_file_new_for_uri (uris[0]); | |||
966 | ||||
967 | cafe_theme_install (f, | |||
968 | CTK_WINDOW (appearance_capplet_get_widget (data, "appearance_window"))((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) (((CtkWidget*) ctk_builder_get_object(data->ui, "appearance_window" ))), ((ctk_window_get_type ()))))))); | |||
969 | g_object_unref (f); | |||
970 | } | |||
971 | ||||
972 | g_strfreev (uris); | |||
973 | } | |||
974 | ||||
975 | static void background_or_font_changed(GSettings *settings, gchar *key, AppearanceData* data) | |||
976 | { | |||
977 | theme_message_area_update(data); | |||
| ||||
978 | } | |||
979 | ||||
980 | void themes_init(AppearanceData* data) | |||
981 | { | |||
982 | CtkWidget *w, *del_button; | |||
983 | GList *theme_list, *l; | |||
984 | CtkListStore *theme_store; | |||
985 | CtkTreeModel *sort_model; | |||
986 | CafeThemeMetaInfo *meta_theme = NULL((void*)0); | |||
987 | CtkIconView *icon_view; | |||
988 | CtkCellRenderer *renderer; | |||
989 | CtkSettings *settings; | |||
990 | char *url; | |||
991 | ||||
992 | /* initialise some stuff */ | |||
993 | cafe_theme_init (); | |||
994 | cafe_wm_manager_init (); | |||
995 | ||||
996 | data->revert_application_font = NULL((void*)0); | |||
997 | data->revert_documents_font = NULL((void*)0); | |||
998 | data->revert_desktop_font = NULL((void*)0); | |||
999 | data->revert_windowtitle_font = NULL((void*)0); | |||
1000 | data->revert_monospace_font = NULL((void*)0); | |||
1001 | data->theme_save_dialog = NULL((void*)0); | |||
1002 | data->theme_message_area = NULL((void*)0); | |||
1003 | data->theme_info_icon = NULL((void*)0); | |||
1004 | data->theme_error_icon = NULL((void*)0); | |||
1005 | data->theme_icon = gdk_pixbuf_new_from_file (CAFECC_PIXMAP_DIR"/usr/local/share/cafe-control-center/pixmaps" "/theme-thumbnailing.png", NULL((void*)0)); | |||
1006 | data->theme_store = theme_store = | |||
1007 | ctk_list_store_new (NUM_COLS, GDK_TYPE_PIXBUF(gdk_pixbuf_get_type ()), G_TYPE_STRING((GType) ((16) << (2))), G_TYPE_STRING((GType) ((16) << (2)))); | |||
1008 | ||||
1009 | /* set up theme list */ | |||
1010 | theme_list = cafe_theme_meta_info_find_all (); | |||
1011 | cafe_theme_info_register_theme_change ((ThemeChangedCallback) theme_changed_on_disk_cb, data); | |||
1012 | ||||
1013 | data->theme_custom = theme_load_from_gsettings (data); | |||
1014 | data->theme_custom->name = g_strdup (CUSTOM_THEME_NAME)g_strdup_inline ("__custom__"); | |||
1015 | data->theme_custom->readable_name = g_strdup_printf ("<i>%s</i>", _("Custom")gettext ("Custom")); | |||
1016 | ||||
1017 | for (l = theme_list; l; l = l->next) { | |||
1018 | CafeThemeMetaInfo *info = l->data; | |||
1019 | ||||
1020 | ctk_list_store_insert_with_values (theme_store, NULL((void*)0), 0, | |||
1021 | COL_LABEL, info->readable_name, | |||
1022 | COL_NAME, info->name, | |||
1023 | COL_THUMBNAIL, data->theme_icon, | |||
1024 | -1); | |||
1025 | ||||
1026 | if (!meta_theme && theme_is_equal (data->theme_custom, info)) | |||
1027 | meta_theme = info; | |||
1028 | } | |||
1029 | ||||
1030 | if (!meta_theme) { | |||
1031 | /* add custom theme */ | |||
1032 | meta_theme = data->theme_custom; | |||
1033 | ||||
1034 | ctk_list_store_insert_with_values (theme_store, NULL((void*)0), 0, | |||
1035 | COL_LABEL, meta_theme->readable_name, | |||
1036 | COL_NAME, meta_theme->name, | |||
1037 | COL_THUMBNAIL, data->theme_icon, | |||
1038 | -1); | |||
1039 | ||||
1040 | theme_thumbnail_generate (meta_theme, data); | |||
1041 | } | |||
1042 | ||||
1043 | theme_list = g_list_sort (theme_list, (GCompareFunc) theme_list_sort_func); | |||
1044 | ||||
1045 | g_list_foreach (theme_list, (GFunc) theme_thumbnail_generate, data); | |||
1046 | g_list_free (theme_list); | |||
1047 | ||||
1048 | icon_view = CTK_ICON_VIEW (appearance_capplet_get_widget (data, "theme_list"))((((CtkIconView*) (void *) g_type_check_instance_cast ((GTypeInstance *) (((CtkWidget*) ctk_builder_get_object(data->ui, "theme_list" ))), ((ctk_icon_view_get_type ())))))); | |||
1049 | ||||
1050 | renderer = ctk_cell_renderer_pixbuf_new (); | |||
1051 | g_object_set (renderer, "xpad", 5, "ypad", 5, | |||
1052 | "xalign", 0.5, "yalign", 1.0, NULL((void*)0)); | |||
1053 | ctk_cell_layout_pack_start (CTK_CELL_LAYOUT (icon_view)((((CtkCellLayout*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((icon_view)), ((ctk_cell_layout_get_type ())))))), renderer, FALSE(0)); | |||
1054 | ctk_cell_layout_set_attributes (CTK_CELL_LAYOUT (icon_view)((((CtkCellLayout*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((icon_view)), ((ctk_cell_layout_get_type ())))))), renderer, | |||
1055 | "pixbuf", COL_THUMBNAIL, NULL((void*)0)); | |||
1056 | ||||
1057 | renderer = ctk_cell_renderer_text_new (); | |||
1058 | g_object_set (renderer, "alignment", PANGO_ALIGN_CENTER, | |||
1059 | "wrap-mode", PANGO_WRAP_WORD_CHAR, | |||
1060 | "wrap-width", ctk_icon_view_get_item_width (icon_view), | |||
1061 | "width", ctk_icon_view_get_item_width (icon_view), | |||
1062 | "xalign", 0.5, "yalign", 0.0, NULL((void*)0)); | |||
1063 | ||||
1064 | ctk_cell_layout_pack_end (CTK_CELL_LAYOUT (icon_view)((((CtkCellLayout*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((icon_view)), ((ctk_cell_layout_get_type ())))))), renderer, FALSE(0)); | |||
1065 | ctk_cell_layout_set_attributes (CTK_CELL_LAYOUT (icon_view)((((CtkCellLayout*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((icon_view)), ((ctk_cell_layout_get_type ())))))), renderer, | |||
1066 | "markup", COL_LABEL, NULL((void*)0)); | |||
1067 | ||||
1068 | sort_model = ctk_tree_model_sort_new_with_model (CTK_TREE_MODEL (theme_store)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((theme_store)), ((ctk_tree_model_get_type ()))))))); | |||
1069 | ctk_tree_sortable_set_sort_func (CTK_TREE_SORTABLE (sort_model)((((CtkTreeSortable*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((sort_model)), ((ctk_tree_sortable_get_type ())))))), COL_LABEL, theme_store_sort_func, NULL((void*)0), NULL((void*)0)); | |||
1070 | ctk_tree_sortable_set_sort_column_id (CTK_TREE_SORTABLE (sort_model)((((CtkTreeSortable*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((sort_model)), ((ctk_tree_sortable_get_type ())))))), COL_LABEL, CTK_SORT_ASCENDING); | |||
1071 | ctk_icon_view_set_model (icon_view, CTK_TREE_MODEL (sort_model)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((sort_model)), ((ctk_tree_model_get_type ()))))))); | |||
1072 | ||||
1073 | g_signal_connect (icon_view, "selection-changed", (GCallback) theme_selection_changed_cb, data)g_signal_connect_data ((icon_view), ("selection-changed"), (( GCallback) theme_selection_changed_cb), (data), ((void*)0), ( GConnectFlags) 0); | |||
1074 | g_signal_connect_after (icon_view, "realize", (GCallback) theme_select_name, meta_theme->name)g_signal_connect_data ((icon_view), ("realize"), ((GCallback) theme_select_name), (meta_theme->name), ((void*)0), G_CONNECT_AFTER ); | |||
1075 | ||||
1076 | w = appearance_capplet_get_widget (data, "theme_install")(CtkWidget*) ctk_builder_get_object(data->ui, "theme_install" ); | |||
1077 | ctk_button_set_image (CTK_BUTTON (w)((((CtkButton*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((w)), ((ctk_button_get_type ())))))), | |||
1078 | ctk_image_new_from_icon_name ("document-open", CTK_ICON_SIZE_BUTTON)); | |||
1079 | g_signal_connect (w, "clicked", (GCallback) theme_install_cb, data)g_signal_connect_data ((w), ("clicked"), ((GCallback) theme_install_cb ), (data), ((void*)0), (GConnectFlags) 0); | |||
1080 | ||||
1081 | w = appearance_capplet_get_widget (data, "theme_save")(CtkWidget*) ctk_builder_get_object(data->ui, "theme_save" ); | |||
1082 | ctk_button_set_image (CTK_BUTTON (w)((((CtkButton*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((w)), ((ctk_button_get_type ())))))), | |||
1083 | ctk_image_new_from_icon_name ("document-save-as", CTK_ICON_SIZE_BUTTON)); | |||
1084 | g_signal_connect (w, "clicked", (GCallback) theme_save_cb, data)g_signal_connect_data ((w), ("clicked"), ((GCallback) theme_save_cb ), (data), ((void*)0), (GConnectFlags) 0); | |||
1085 | ||||
1086 | w = appearance_capplet_get_widget (data, "theme_custom")(CtkWidget*) ctk_builder_get_object(data->ui, "theme_custom" ); | |||
1087 | ctk_button_set_image (CTK_BUTTON (w)((((CtkButton*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((w)), ((ctk_button_get_type ())))))), | |||
1088 | ctk_image_new_from_icon_name ("ctk-edit", CTK_ICON_SIZE_BUTTON)); | |||
1089 | g_signal_connect (w, "clicked", (GCallback) theme_custom_cb, data)g_signal_connect_data ((w), ("clicked"), ((GCallback) theme_custom_cb ), (data), ((void*)0), (GConnectFlags) 0); | |||
1090 | ||||
1091 | del_button = appearance_capplet_get_widget (data, "theme_delete")(CtkWidget*) ctk_builder_get_object(data->ui, "theme_delete" ); | |||
1092 | g_signal_connect (del_button, "clicked", (GCallback) theme_delete_cb, data)g_signal_connect_data ((del_button), ("clicked"), ((GCallback ) theme_delete_cb), (data), ((void*)0), (GConnectFlags) 0); | |||
1093 | ||||
1094 | w = appearance_capplet_get_widget (data, "theme_vbox")(CtkWidget*) ctk_builder_get_object(data->ui, "theme_vbox" ); | |||
1095 | ctk_drag_dest_set (w, CTK_DEST_DEFAULT_ALL, | |||
1096 | drop_types, G_N_ELEMENTS (drop_types)(sizeof (drop_types) / sizeof ((drop_types)[0])), | |||
1097 | CDK_ACTION_COPY | CDK_ACTION_LINK | CDK_ACTION_MOVE); | |||
1098 | g_signal_connect (w, "drag-data-received", (GCallback) theme_drag_data_received_cb, data)g_signal_connect_data ((w), ("drag-data-received"), ((GCallback ) theme_drag_data_received_cb), (data), ((void*)0), (GConnectFlags ) 0); | |||
1099 | if (is_locked_down ()) | |||
1100 | ctk_widget_set_sensitive (w, FALSE(0)); | |||
1101 | ||||
1102 | w = appearance_capplet_get_widget (data, "more_themes_linkbutton")(CtkWidget*) ctk_builder_get_object(data->ui, "more_themes_linkbutton" ); | |||
1103 | url = g_settings_get_string (data->settings, MORE_THEMES_URL_KEY"more-themes-url"); | |||
1104 | if (url != NULL((void*)0) && url[0] != '\0') { | |||
1105 | ctk_link_button_set_uri (CTK_LINK_BUTTON (w)((((CtkLinkButton*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((w)), ((ctk_link_button_get_type ())))))), url); | |||
1106 | ctk_widget_show (w); | |||
1107 | } else { | |||
1108 | ctk_widget_hide (w); | |||
1109 | } | |||
1110 | g_free (url); | |||
1111 | ||||
1112 | /* listen to gsettings changes, too */ | |||
1113 | g_signal_connect (data->croma_settings, "changed::" CROMA_THEME_KEY, G_CALLBACK (theme_gsettings_changed), data)g_signal_connect_data ((data->croma_settings), ("changed::" "theme"), (((GCallback) (theme_gsettings_changed))), (data), ((void*)0), (GConnectFlags) 0); | |||
1114 | g_signal_connect (data->mouse_settings, "changed::" CURSOR_THEME_KEY, G_CALLBACK (theme_gsettings_changed), data)g_signal_connect_data ((data->mouse_settings), ("changed::" "cursor-theme"), (((GCallback) (theme_gsettings_changed))), ( data), ((void*)0), (GConnectFlags) 0); | |||
1115 | g_signal_connect (data->mouse_settings, "changed::" CURSOR_SIZE_KEY, G_CALLBACK (theme_gsettings_changed), data)g_signal_connect_data ((data->mouse_settings), ("changed::" "cursor-size"), (((GCallback) (theme_gsettings_changed))), ( data), ((void*)0), (GConnectFlags) 0); | |||
1116 | g_signal_connect (data->wp_settings, "changed::" WP_FILE_KEY, G_CALLBACK (background_or_font_changed), data)g_signal_connect_data ((data->wp_settings), ("changed::" "picture-filename" ), (((GCallback) (background_or_font_changed))), (data), ((void *)0), (GConnectFlags) 0); | |||
1117 | g_signal_connect (data->interface_settings, "changed::" CTK_FONT_KEY, G_CALLBACK (background_or_font_changed), data)g_signal_connect_data ((data->interface_settings), ("changed::" "font-name"), (((GCallback) (background_or_font_changed))), ( data), ((void*)0), (GConnectFlags) 0); | |||
1118 | g_signal_connect (data->interface_settings, "changed::" DOCUMENT_FONT_KEY, G_CALLBACK (background_or_font_changed), data)g_signal_connect_data ((data->interface_settings), ("changed::" "document-font-name"), (((GCallback) (background_or_font_changed ))), (data), ((void*)0), (GConnectFlags) 0); | |||
1119 | ||||
1120 | if (data->baul_settings) | |||
1121 | g_signal_connect (data->baul_settings, "changed::" DESKTOP_FONT_KEY, G_CALLBACK (background_or_font_changed), data)g_signal_connect_data ((data->baul_settings), ("changed::" "font"), (((GCallback) (background_or_font_changed))), (data ), ((void*)0), (GConnectFlags) 0); | |||
1122 | ||||
1123 | g_signal_connect (data->croma_settings, "changed::" WINDOW_TITLE_FONT_KEY, G_CALLBACK (background_or_font_changed), data)g_signal_connect_data ((data->croma_settings), ("changed::" "titlebar-font"), (((GCallback) (background_or_font_changed) )), (data), ((void*)0), (GConnectFlags) 0); | |||
1124 | g_signal_connect (data->interface_settings, "changed::" MONOSPACE_FONT_KEY, G_CALLBACK (background_or_font_changed), data)g_signal_connect_data ((data->interface_settings), ("changed::" "monospace-font-name"), (((GCallback) (background_or_font_changed ))), (data), ((void*)0), (GConnectFlags) 0); | |||
1125 | ||||
1126 | settings = ctk_settings_get_default (); | |||
1127 | g_signal_connect (settings, "notify::ctk-color-scheme", (GCallback) theme_setting_changed_cb, data)g_signal_connect_data ((settings), ("notify::ctk-color-scheme" ), ((GCallback) theme_setting_changed_cb), (data), ((void*)0) , (GConnectFlags) 0); | |||
1128 | g_signal_connect (settings, "notify::ctk-theme-name", (GCallback) theme_setting_changed_cb, data)g_signal_connect_data ((settings), ("notify::ctk-theme-name") , ((GCallback) theme_setting_changed_cb), (data), ((void*)0), (GConnectFlags) 0); | |||
1129 | g_signal_connect (settings, "notify::ctk-icon-theme-name", (GCallback) theme_setting_changed_cb, data)g_signal_connect_data ((settings), ("notify::ctk-icon-theme-name" ), ((GCallback) theme_setting_changed_cb), (data), ((void*)0) , (GConnectFlags) 0); | |||
1130 | ||||
1131 | /* monitor individual font choice buttons, so | |||
1132 | "revert font" option (if any) can be cleared */ | |||
1133 | w = appearance_capplet_get_widget (data, "application_font")(CtkWidget*) ctk_builder_get_object(data->ui, "application_font" ); | |||
1134 | g_signal_connect (w, "font_set", (GCallback) custom_font_cb, data)g_signal_connect_data ((w), ("font_set"), ((GCallback) custom_font_cb ), (data), ((void*)0), (GConnectFlags) 0); | |||
1135 | w = appearance_capplet_get_widget (data, "document_font")(CtkWidget*) ctk_builder_get_object(data->ui, "document_font" ); | |||
1136 | g_signal_connect (w, "font_set", (GCallback) custom_font_cb, data)g_signal_connect_data ((w), ("font_set"), ((GCallback) custom_font_cb ), (data), ((void*)0), (GConnectFlags) 0); | |||
1137 | w = appearance_capplet_get_widget (data, "desktop_font")(CtkWidget*) ctk_builder_get_object(data->ui, "desktop_font" ); | |||
1138 | g_signal_connect (w, "font_set", (GCallback) custom_font_cb, data)g_signal_connect_data ((w), ("font_set"), ((GCallback) custom_font_cb ), (data), ((void*)0), (GConnectFlags) 0); | |||
1139 | w = appearance_capplet_get_widget (data, "window_title_font")(CtkWidget*) ctk_builder_get_object(data->ui, "window_title_font" ); | |||
1140 | g_signal_connect (w, "font_set", (GCallback) custom_font_cb, data)g_signal_connect_data ((w), ("font_set"), ((GCallback) custom_font_cb ), (data), ((void*)0), (GConnectFlags) 0); | |||
1141 | w = appearance_capplet_get_widget (data, "monospace_font")(CtkWidget*) ctk_builder_get_object(data->ui, "monospace_font" ); | |||
1142 | g_signal_connect (w, "font_set", (GCallback) custom_font_cb, data)g_signal_connect_data ((w), ("font_set"), ((GCallback) custom_font_cb ), (data), ((void*)0), (GConnectFlags) 0); | |||
1143 | } | |||
1144 | ||||
1145 | void | |||
1146 | themes_shutdown (AppearanceData *data) | |||
1147 | { | |||
1148 | cafe_theme_meta_info_free (data->theme_custom); | |||
1149 | ||||
1150 | if (data->theme_icon) | |||
1151 | g_object_unref (data->theme_icon); | |||
1152 | if (data->theme_save_dialog) | |||
1153 | ctk_widget_destroy (data->theme_save_dialog); | |||
1154 | g_free (data->revert_application_font); | |||
1155 | g_free (data->revert_documents_font); | |||
1156 | g_free (data->revert_desktop_font); | |||
1157 | g_free (data->revert_windowtitle_font); | |||
1158 | g_free (data->revert_monospace_font); | |||
1159 | } |