pidgin/pidginstock.c

changeset 41097
e0b11d28b39e
parent 41093
13d97dcd0e67
equal deleted inserted replaced
41096:8883d8d17678 41097:e0b11d28b39e
44 44
45 /************************************************************************** 45 /**************************************************************************
46 * Structures 46 * Structures
47 **************************************************************************/ 47 **************************************************************************/
48 48
49 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
50 static struct StockIcon
51 {
52 const char *name;
53 const char *dir;
54 const char *filename;
55
56 } const stock_icons[] = {
57
58 { PIDGIN_STOCK_ACTION, NULL, GTK_STOCK_EXECUTE },
59 { PIDGIN_STOCK_ALIAS, NULL, GTK_STOCK_EDIT },
60 { PIDGIN_STOCK_CHAT, NULL, GTK_STOCK_JUMP_TO },
61 { PIDGIN_STOCK_CLEAR, NULL, GTK_STOCK_CLEAR },
62 { PIDGIN_STOCK_CLOSE_TABS, NULL, GTK_STOCK_CLOSE },
63 { PIDGIN_STOCK_DEBUG, NULL, GTK_STOCK_PROPERTIES },
64 { PIDGIN_STOCK_DOWNLOAD, NULL, GTK_STOCK_GO_DOWN },
65 { PIDGIN_STOCK_DISCONNECT, NULL, GTK_STOCK_DISCONNECT },
66 { PIDGIN_STOCK_FGCOLOR, "buttons", "change-fgcolor-small.png" },
67 { PIDGIN_STOCK_EDIT, NULL, GTK_STOCK_EDIT },
68 { PIDGIN_STOCK_FILE_CANCELLED, NULL, GTK_STOCK_CANCEL },
69 { PIDGIN_STOCK_FILE_DONE, NULL, GTK_STOCK_APPLY },
70 { PIDGIN_STOCK_IGNORE, NULL, GTK_STOCK_DIALOG_ERROR },
71 { PIDGIN_STOCK_INVITE, NULL, GTK_STOCK_JUMP_TO },
72 { PIDGIN_STOCK_MODIFY, NULL, GTK_STOCK_PREFERENCES },
73 { PIDGIN_STOCK_ADD, NULL, GTK_STOCK_ADD },
74 { PIDGIN_STOCK_PAUSE, NULL, GTK_STOCK_MEDIA_PAUSE },
75 { PIDGIN_STOCK_OPEN_MAIL, NULL, GTK_STOCK_JUMP_TO },
76 { PIDGIN_STOCK_SIGN_ON, NULL, GTK_STOCK_EXECUTE },
77 { PIDGIN_STOCK_SIGN_OFF, NULL, GTK_STOCK_CLOSE },
78 { PIDGIN_STOCK_TYPED, "pidgin", "typed.png" },
79 { PIDGIN_STOCK_UPLOAD, NULL, GTK_STOCK_GO_UP },
80 { PIDGIN_STOCK_INFO, NULL, GTK_STOCK_INFO },
81 { PIDGIN_STOCK_NEXT, NULL, GTK_STOCK_GO_FORWARD },
82 };
83 G_GNUC_END_IGNORE_DEPRECATIONS
84
85 static const GtkStockItem stock_items[] =
86 {
87 { PIDGIN_STOCK_ALIAS, N_("_Alias"), 0, 0, PACKAGE },
88 { PIDGIN_STOCK_CHAT, N_("_Join"), 0, 0, PACKAGE },
89 { PIDGIN_STOCK_CLOSE_TABS, N_("Close _tabs"), 0, 0, PACKAGE },
90 { PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW, N_("I_M"), 0, 0, PACKAGE },
91 { PIDGIN_STOCK_TOOLBAR_USER_INFO, N_("_Get Info"), 0, 0, PACKAGE },
92 { PIDGIN_STOCK_INVITE, N_("_Invite"), 0, 0, PACKAGE },
93 { PIDGIN_STOCK_MODIFY, N_("_Modify..."), 0, 0, PACKAGE },
94 { PIDGIN_STOCK_ADD, N_("_Add..."), 0, 0, PACKAGE },
95 { PIDGIN_STOCK_OPEN_MAIL, N_("_Open Mail"), 0, 0, PACKAGE },
96 { PIDGIN_STOCK_PAUSE, N_("_Pause"), 0, 0, PACKAGE },
97 { PIDGIN_STOCK_EDIT, N_("_Edit"), 0, 0, PACKAGE },
98 { PIDGIN_STOCK_NEXT, N_("_Next"), 0, 0, PACKAGE },
99 };
100
101 typedef struct {
102 const char *name;
103 const char *dir;
104 const char *filename;
105 gboolean microscopic;
106 gboolean extra_small;
107 gboolean small;
108 gboolean medium;
109 gboolean large;
110 gboolean huge;
111 gboolean rtl;
112 const char *translucent_name;
113 } SizedStockIcon;
114
115 const SizedStockIcon sized_stock_icons [] = {
116
117 { PIDGIN_STOCK_TOOLBAR_BGCOLOR, "actions", "change-bgcolor.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
118 { PIDGIN_STOCK_TOOLBAR_BLOCK, "emblems", "emblem-blocked.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
119 { PIDGIN_STOCK_TOOLBAR_FGCOLOR, "actions", "change-fgcolor.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
120 { PIDGIN_STOCK_TOOLBAR_FONT_FACE, "actions", "font-face.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
121 { PIDGIN_STOCK_TOOLBAR_TEXT_SMALLER, "actions", "font-size-down.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
122 { PIDGIN_STOCK_TOOLBAR_TEXT_LARGER, "actions", "font-size-up.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
123 { PIDGIN_STOCK_TOOLBAR_INSERT, "actions", "insert.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
124 { PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE, "actions", "insert-image.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
125 { PIDGIN_STOCK_TOOLBAR_INSERT_SCREENSHOT, "actions", "insert-screenshot.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
126 { PIDGIN_STOCK_TOOLBAR_INSERT_LINK, "actions", "insert-link.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
127 { PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW, "actions", "message-new.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
128 { PIDGIN_STOCK_TOOLBAR_PENDING, "actions", "message-new.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
129 { PIDGIN_STOCK_TOOLBAR_PLUGINS, "actions", "plugins.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
130 { PIDGIN_STOCK_TOOLBAR_UNBLOCK, "actions", "unblock.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
131 { PIDGIN_STOCK_TOOLBAR_SELECT_AVATAR, "actions", "select-avatar.png", FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, NULL },
132 { PIDGIN_STOCK_TOOLBAR_SEND_FILE, "actions", "send-file.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
133 { PIDGIN_STOCK_TOOLBAR_TRANSFER, "actions", "transfer.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
134 #ifdef USE_VV
135 { PIDGIN_STOCK_TOOLBAR_AUDIO_CALL, "actions", "audio-call.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
136 { PIDGIN_STOCK_TOOLBAR_VIDEO_CALL, "actions", "video-call.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
137 { PIDGIN_STOCK_TOOLBAR_AUDIO_VIDEO_CALL, "actions", "audio-video-call.png", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
138 #endif
139 { PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION, "actions", "get-attention.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }
140 };
141
142 const SizedStockIcon sized_status_icons [] = {
143
144 { PIDGIN_STOCK_STATUS_AVAILABLE, "status", "user-available.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_AVAILABLE_I },
145 { PIDGIN_STOCK_STATUS_AWAY, "status", "user-away.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_AWAY_I },
146 { PIDGIN_STOCK_STATUS_BUSY, "status", "user-busy.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_BUSY_I },
147 { PIDGIN_STOCK_STATUS_CHAT, "status", "chat.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
148 { PIDGIN_STOCK_STATUS_INVISIBLE, "status", "user-invisible.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
149 { PIDGIN_STOCK_STATUS_XA, "status", "user-extended-away.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, PIDGIN_STOCK_STATUS_XA_I },
150 { PIDGIN_STOCK_STATUS_LOGIN, "status", "log-in.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
151 { PIDGIN_STOCK_STATUS_LOGOUT, "status", "log-out.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
152 { PIDGIN_STOCK_STATUS_OFFLINE, "status", "user-offline.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_OFFLINE_I },
153 { PIDGIN_STOCK_STATUS_PERSON, "status", "person.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
154 { PIDGIN_STOCK_STATUS_MESSAGE, "actions", "message-new.png", TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }
155 };
156
157 const SizedStockIcon sized_tray_icons [] = {
158 #define SIZED_TRAY_ICON(name) \
159 { name, "status", name ".png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }
160 SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_AVAILABLE ),
161 SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_INVISIBLE ),
162 SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_AWAY ),
163 SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_BUSY ),
164 SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_XA ),
165 SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_OFFLINE ),
166 SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_CONNECT ),
167 SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_PENDING ),
168 SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_EMAIL )
169 #undef SIZED_TRAY_ICON
170 };
171
172 /*****************************************************************************
173 * Private functions
174 *****************************************************************************/
175
176 static gchar *
177 find_file_common(const char *name)
178 {
179 gchar *filename;
180 const gchar *userdir;
181 const gchar * const *sysdirs;
182
183 userdir = g_get_user_data_dir();
184 filename = g_build_filename(userdir, name, NULL);
185 if (g_file_test(filename, G_FILE_TEST_EXISTS))
186 return filename;
187 g_free(filename);
188
189 sysdirs = g_get_system_data_dirs();
190 for (; *sysdirs; sysdirs++) {
191 filename = g_build_filename(*sysdirs, name, NULL);
192 if (g_file_test(filename, G_FILE_TEST_EXISTS))
193 return filename;
194 g_free(filename);
195 }
196 filename = g_build_filename(PURPLE_DATADIR, name, NULL);
197 if (g_file_test(filename, G_FILE_TEST_EXISTS))
198 return filename;
199 g_free(filename);
200 return NULL;
201 }
202
203 static gchar *
204 find_file(const char *dir, const char *base)
205 {
206 char *filename;
207 char *ret;
208
209 if (base == NULL)
210 return NULL;
211
212 if (purple_strequal(dir, "pidgin"))
213 filename = g_build_filename("pixmaps", "pidgin", base, NULL);
214 else
215 filename = g_build_filename("pixmaps", "pidgin", dir, base, NULL);
216
217 ret = find_file_common(filename);
218 g_free(filename);
219 return ret;
220 }
221
222
223 /* Altered from do_colorshift in gnome-panel */
224 static void
225 do_alphashift(GdkPixbuf *pixbuf)
226 {
227 gint i, j;
228 gint width, height, padding;
229 guchar *pixels;
230 guchar a;
231
232 if (!gdk_pixbuf_get_has_alpha(pixbuf))
233 return;
234
235 width = gdk_pixbuf_get_width(pixbuf);
236 height = gdk_pixbuf_get_height(pixbuf);
237 padding = gdk_pixbuf_get_rowstride(pixbuf) - width * 4;
238 pixels = gdk_pixbuf_get_pixels(pixbuf);
239
240 for (i = 0; i < height; i++) {
241 for (j = 0; j < width; j++) {
242 pixels++;
243 pixels++;
244 pixels++;
245 a = *(pixels);
246 *(pixels++) = a / 2;
247 }
248 pixels += padding;
249 }
250 }
251
252 static gchar *
253 find_icon_file(PidginIconTheme *theme, const gchar *size, SizedStockIcon sized_icon, gboolean rtl)
254 {
255 const gchar *file, *dir;
256 gchar *file_full = NULL;
257 gchar *tmp;
258
259 if (theme != NULL) {
260 file = pidgin_icon_theme_get_icon(PIDGIN_ICON_THEME(theme), sized_icon.name);
261 dir = purple_theme_get_dir(PURPLE_THEME(theme));
262
263 if (rtl)
264 file_full = g_build_filename(dir, size, "rtl", file, NULL);
265 else
266 file_full = g_build_filename(dir, size, file, NULL);
267
268 if (g_file_test(file_full, G_FILE_TEST_IS_REGULAR))
269 return file_full;
270
271 g_free(file_full);
272 }
273
274 if (rtl)
275 tmp = g_build_filename("pixmaps", "pidgin", sized_icon.dir, size, "rtl", sized_icon.filename, NULL);
276 else
277 tmp = g_build_filename("pixmaps", "pidgin", sized_icon.dir, size, sized_icon.filename, NULL);
278
279 file_full = find_file_common(tmp);
280 g_free(tmp);
281
282 if (file_full == NULL) {
283 gchar *size_dir = g_strdup_printf("%sx%s", size, size);
284
285 if (rtl)
286 tmp = g_build_filename("pidgin", "icons", "hicolor",
287 size_dir, sized_icon.dir, "rtl",
288 sized_icon.filename, NULL);
289 else
290 tmp = g_build_filename("pidgin", "icons", "hicolor",
291 size_dir, sized_icon.dir,
292 sized_icon.filename, NULL);
293 g_free(size_dir);
294
295 file_full = find_file_common(tmp);
296 g_free(tmp);
297 }
298
299 return file_full;
300 }
301
302 static void
303 add_sized_icon(GtkIconSet *iconset, GtkIconSize sizeid, PidginIconTheme *theme,
304 const char *size, SizedStockIcon sized_icon, gboolean translucent)
305 {
306 char *filename;
307 GtkIconSource *source;
308 GdkPixbuf *pixbuf;
309
310 filename = find_icon_file(theme, size, sized_icon, FALSE);
311 g_return_if_fail(filename != NULL);
312 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
313 if (translucent)
314 do_alphashift(pixbuf);
315
316 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
317 source = gtk_icon_source_new();
318 gtk_icon_source_set_pixbuf(source, pixbuf);
319 gtk_icon_source_set_direction(source, GTK_TEXT_DIR_LTR);
320 gtk_icon_source_set_direction_wildcarded(source, !sized_icon.rtl);
321 gtk_icon_source_set_size(source, sizeid);
322 gtk_icon_source_set_size_wildcarded(source, FALSE);
323 gtk_icon_source_set_state_wildcarded(source, TRUE);
324 gtk_icon_set_add_source(iconset, source);
325 gtk_icon_source_free(source);
326
327 if (sizeid == gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)) {
328 source = gtk_icon_source_new();
329 gtk_icon_source_set_pixbuf(source, pixbuf);
330 gtk_icon_source_set_direction_wildcarded(source, TRUE);
331 gtk_icon_source_set_size(source, GTK_ICON_SIZE_MENU);
332 gtk_icon_source_set_size_wildcarded(source, FALSE);
333 gtk_icon_source_set_state_wildcarded(source, TRUE);
334 gtk_icon_set_add_source(iconset, source);
335 gtk_icon_source_free(source);
336 }
337 g_free(filename);
338 g_object_unref(pixbuf);
339
340 if (sized_icon.rtl) {
341 filename = find_icon_file(theme, size, sized_icon, TRUE);
342 g_return_if_fail(filename != NULL);
343 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
344 if (translucent)
345 do_alphashift(pixbuf);
346
347 source = gtk_icon_source_new();
348 gtk_icon_source_set_pixbuf(source, pixbuf);
349 gtk_icon_source_set_filename(source, filename);
350 gtk_icon_source_set_direction(source, GTK_TEXT_DIR_RTL);
351 gtk_icon_source_set_size(source, sizeid);
352 gtk_icon_source_set_size_wildcarded(source, FALSE);
353 gtk_icon_source_set_state_wildcarded(source, TRUE);
354 gtk_icon_set_add_source(iconset, source);
355 g_free(filename);
356 g_object_unref(pixbuf);
357 gtk_icon_source_free(source);
358 }
359 G_GNUC_END_IGNORE_DEPRECATIONS
360 }
361
362 static void
363 reload_settings(void)
364 {
365 gtk_style_context_reset_widgets(gdk_screen_get_default());
366 }
367
368 /***************************************************************************** 49 /*****************************************************************************
369 * Public API functions 50 * Public API functions
370 *****************************************************************************/ 51 *****************************************************************************/
371 52
372 void 53 void
373 pidgin_stock_load_status_icon_theme(PidginStatusIconTheme *theme) 54 pidgin_stock_load_status_icon_theme(PidginStatusIconTheme *theme)
374 { 55 {
375 GtkIconFactory *icon_factory;
376 gsize i;
377 GtkIconSet *normal;
378 GtkIconSet *translucent = NULL;
379 GtkWidget *win;
380
381 if (theme != NULL) { 56 if (theme != NULL) {
382 purple_prefs_set_string(PIDGIN_PREFS_ROOT "/status/icon-theme", 57 purple_prefs_set_string(PIDGIN_PREFS_ROOT "/status/icon-theme",
383 purple_theme_get_name(PURPLE_THEME(theme))); 58 purple_theme_get_name(PURPLE_THEME(theme)));
384 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/status/icon-theme-dir", 59 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/status/icon-theme-dir",
385 purple_theme_get_dir(PURPLE_THEME(theme))); 60 purple_theme_get_dir(PURPLE_THEME(theme)));
386 } 61 }
387 else { 62 else {
388 purple_prefs_set_string(PIDGIN_PREFS_ROOT "/status/icon-theme", ""); 63 purple_prefs_set_string(PIDGIN_PREFS_ROOT "/status/icon-theme", "");
389 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/status/icon-theme-dir", ""); 64 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/status/icon-theme-dir", "");
390 } 65 }
391
392 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
393 icon_factory = gtk_icon_factory_new();
394
395 gtk_icon_factory_add_default(icon_factory);
396 G_GNUC_END_IGNORE_DEPRECATIONS
397
398 win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
399 gtk_widget_realize(win);
400
401 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
402 for (i = 0; i < G_N_ELEMENTS(sized_status_icons); i++)
403 {
404 normal = gtk_icon_set_new();
405 if (sized_status_icons[i].translucent_name)
406 translucent = gtk_icon_set_new();
407
408 #define ADD_SIZED_ICON(name, size) \
409 if (sized_status_icons[i].name) { \
410 add_sized_icon(normal, name, PIDGIN_ICON_THEME(theme), size, sized_status_icons[i], FALSE); \
411 if (sized_status_icons[i].translucent_name) \
412 add_sized_icon(translucent, name, PIDGIN_ICON_THEME(theme), size, sized_status_icons[i], TRUE); \
413 }
414 ADD_SIZED_ICON(microscopic, "11");
415 ADD_SIZED_ICON(extra_small, "16");
416 ADD_SIZED_ICON(small, "22");
417 ADD_SIZED_ICON(medium, "32");
418 ADD_SIZED_ICON(large, "48");
419 ADD_SIZED_ICON(huge, "64");
420 #undef ADD_SIZED_ICON
421
422 gtk_icon_factory_add(icon_factory, sized_status_icons[i].name, normal);
423 gtk_icon_set_unref(normal);
424
425 if (sized_status_icons[i].translucent_name) {
426 gtk_icon_factory_add(icon_factory, sized_status_icons[i].translucent_name, translucent);
427 gtk_icon_set_unref(translucent);
428 }
429 }
430
431 for (i = 0; i < G_N_ELEMENTS(sized_tray_icons); i++)
432 {
433 normal = gtk_icon_set_new();
434 if (sized_tray_icons[i].translucent_name)
435 translucent = gtk_icon_set_new();
436
437 #define ADD_SIZED_ICON(name, size) \
438 if (sized_tray_icons[i].name) { \
439 add_sized_icon(normal, name, PIDGIN_ICON_THEME(theme), size, sized_tray_icons[i], FALSE); \
440 if (sized_tray_icons[i].translucent_name) \
441 add_sized_icon(translucent, name, PIDGIN_ICON_THEME(theme), size, sized_tray_icons[i], TRUE); \
442 }
443 ADD_SIZED_ICON(extra_small, "16");
444 ADD_SIZED_ICON(small, "22");
445 ADD_SIZED_ICON(medium, "32");
446 ADD_SIZED_ICON(large, "48");
447 #undef ADD_SIZED_ICON
448
449 gtk_icon_factory_add(icon_factory, sized_tray_icons[i].name, normal);
450 gtk_icon_set_unref(normal);
451
452 if (sized_tray_icons[i].translucent_name) {
453 gtk_icon_factory_add(icon_factory, sized_tray_icons[i].translucent_name, translucent);
454 gtk_icon_set_unref(translucent);
455 }
456 }
457 G_GNUC_END_IGNORE_DEPRECATIONS
458
459 gtk_widget_destroy(win);
460 g_object_unref(G_OBJECT(icon_factory));
461 reload_settings();
462 } 66 }
463 67
464 void 68 void
465 pidgin_stock_load_stock_icon_theme(PidginStockIconTheme *theme) 69 pidgin_stock_load_stock_icon_theme(PidginStockIconTheme *theme)
466 { 70 {
467 GtkIconFactory *icon_factory;
468 gsize i;
469 GtkWidget *win;
470
471 if (theme != NULL) { 71 if (theme != NULL) {
472 purple_prefs_set_string(PIDGIN_PREFS_ROOT "/stock/icon-theme", 72 purple_prefs_set_string(PIDGIN_PREFS_ROOT "/stock/icon-theme",
473 purple_theme_get_name(PURPLE_THEME(theme))); 73 purple_theme_get_name(PURPLE_THEME(theme)));
474 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/stock/icon-theme-dir", 74 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/stock/icon-theme-dir",
475 purple_theme_get_dir(PURPLE_THEME(theme))); 75 purple_theme_get_dir(PURPLE_THEME(theme)));
476 } 76 }
477 else { 77 else {
478 purple_prefs_set_string(PIDGIN_PREFS_ROOT "/stock/icon-theme", ""); 78 purple_prefs_set_string(PIDGIN_PREFS_ROOT "/stock/icon-theme", "");
479 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/stock/icon-theme-dir", ""); 79 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/stock/icon-theme-dir", "");
480 } 80 }
481
482 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
483 icon_factory = gtk_icon_factory_new();
484
485 gtk_icon_factory_add_default(icon_factory);
486 G_GNUC_END_IGNORE_DEPRECATIONS
487
488 win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
489 gtk_widget_realize(win);
490
491 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
492 /* All non-sized icons */
493 for (i = 0; i < G_N_ELEMENTS(stock_icons); i++) {
494 GtkIconSource *source;
495 GtkIconSet *iconset;
496 gchar *filename;
497
498 if (stock_icons[i].dir == NULL) {
499 /* GTK Stock icon */
500 iconset = gtk_style_context_lookup_icon_set(gtk_widget_get_style_context(win),
501 stock_icons[i].filename);
502 } else {
503 filename = find_file(stock_icons[i].dir, stock_icons[i].filename);
504
505 if (filename == NULL)
506 continue;
507
508 source = gtk_icon_source_new();
509 gtk_icon_source_set_filename(source, filename);
510 gtk_icon_source_set_direction_wildcarded(source, TRUE);
511 gtk_icon_source_set_size_wildcarded(source, TRUE);
512 gtk_icon_source_set_state_wildcarded(source, TRUE);
513
514 iconset = gtk_icon_set_new();
515 gtk_icon_set_add_source(iconset, source);
516
517 gtk_icon_source_free(source);
518 g_free(filename);
519 }
520
521 gtk_icon_factory_add(icon_factory, stock_icons[i].name, iconset);
522
523 gtk_icon_set_unref(iconset);
524 }
525
526 /* All non-status sized icons */
527 for (i = 0; i < G_N_ELEMENTS(sized_stock_icons); i++)
528 {
529 GtkIconSet *iconset = gtk_icon_set_new();
530
531 #define ADD_SIZED_ICON(name, size) \
532 if (sized_stock_icons[i].name) \
533 add_sized_icon(iconset, name, PIDGIN_ICON_THEME(theme), size, sized_stock_icons[i], FALSE);
534 ADD_SIZED_ICON(microscopic, "11");
535 ADD_SIZED_ICON(extra_small, "16");
536 ADD_SIZED_ICON(small, "22");
537 ADD_SIZED_ICON(medium, "32");
538 ADD_SIZED_ICON(large, "48");
539 ADD_SIZED_ICON(huge, "64");
540 #undef ADD_SIZED_ICON
541
542 gtk_icon_factory_add(icon_factory, sized_stock_icons[i].name, iconset);
543 gtk_icon_set_unref(iconset);
544 }
545 G_GNUC_END_IGNORE_DEPRECATIONS
546
547 gtk_widget_destroy(win);
548 g_object_unref(G_OBJECT(icon_factory));
549 reload_settings();
550 } 81 }
551 82
552 void 83 void
553 pidgin_stock_init(void) 84 pidgin_stock_init(void)
554 { 85 {
595 g_object_unref(G_OBJECT(theme)); 126 g_object_unref(G_OBJECT(theme));
596 127
597 } 128 }
598 else 129 else
599 pidgin_stock_load_status_icon_theme(NULL); 130 pidgin_stock_load_status_icon_theme(NULL);
600
601 /* Register the stock items. */
602 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
603 gtk_stock_add_static(stock_items, G_N_ELEMENTS(stock_items));
604 G_GNUC_END_IGNORE_DEPRECATIONS
605 } 131 }
606 132
607 static void 133 static void
608 pidgin_stock_icon_theme_class_init(PidginStockIconThemeClass *klass) 134 pidgin_stock_icon_theme_class_init(PidginStockIconThemeClass *klass)
609 { 135 {

mercurial