comparison pidgin/pidginstock.c @ 23694:2d419a0fc0e4

partially working status icon theme stuff
author Justin Rodriguez <ffdragon@soc.pidgin.im>
date Fri, 08 Aug 2008 01:42:46 +0000
parents 62b5d52c3d66
children f29e173320a7
comparison
equal deleted inserted replaced
23693:d93578eb7244 23694:2d419a0fc0e4
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA 24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
25 * 25 *
26 */ 26 */
27 #include "internal.h" 27 #include "internal.h"
28 #include "pidgin.h" 28 #include "pidgin.h"
29 #include "prefs.h"
30
31 #include "gtkicon-loader.h"
32 #include "theme-manager.h"
29 33
30 #include "pidginstock.h" 34 #include "pidginstock.h"
35
36 /**************************************************************************
37 * Globals
38 **************************************************************************/
39
40 static gboolean stock_initted = FALSE;
41 static GtkIconSize microscopic, extra_small, small, medium, large, huge;
42
43 /**************************************************************************
44 * Structures
45 **************************************************************************/
31 46
32 static struct StockIcon 47 static struct StockIcon
33 { 48 {
34 const char *name; 49 const char *name;
35 const char *dir; 50 const char *dir;
36 const char *filename; 51 const char *filename;
37 52
38 } const stock_icons[] = 53 } const stock_icons[] = {
39 { 54
40 { PIDGIN_STOCK_ACTION, NULL, GTK_STOCK_EXECUTE }, 55 { PIDGIN_STOCK_ACTION, NULL, GTK_STOCK_EXECUTE },
41 #if GTK_CHECK_VERSION(2,6,0) 56 #if GTK_CHECK_VERSION(2,6,0)
42 { PIDGIN_STOCK_ALIAS, NULL, GTK_STOCK_EDIT }, 57 { PIDGIN_STOCK_ALIAS, NULL, GTK_STOCK_EDIT },
43 #else 58 #else
44 { PIDGIN_STOCK_ALIAS, "buttons", "edit.png" }, 59 { PIDGIN_STOCK_ALIAS, "buttons", "edit.png" },
93 { PIDGIN_STOCK_MODIFY, N_("_Modify"), 0, 0, NULL }, 108 { PIDGIN_STOCK_MODIFY, N_("_Modify"), 0, 0, NULL },
94 { PIDGIN_STOCK_OPEN_MAIL, N_("_Open Mail"), 0, 0, NULL }, 109 { PIDGIN_STOCK_OPEN_MAIL, N_("_Open Mail"), 0, 0, NULL },
95 { PIDGIN_STOCK_PAUSE, N_("_Pause"), 0, 0, NULL }, 110 { PIDGIN_STOCK_PAUSE, N_("_Pause"), 0, 0, NULL },
96 }; 111 };
97 112
98 static struct SizedStockIcon { 113 typedef struct {
99 const char *name; 114 const char *name;
100 const char *dir; 115 const char *dir;
101 const char *filename; 116 const char *filename;
102 gboolean microscopic; 117 gboolean microscopic;
103 gboolean extra_small; 118 gboolean extra_small;
105 gboolean medium; 120 gboolean medium;
106 gboolean large; 121 gboolean large;
107 gboolean huge; 122 gboolean huge;
108 gboolean rtl; 123 gboolean rtl;
109 const char *translucent_name; 124 const char *translucent_name;
110 } const sized_stock_icons [] = { 125 } SizedStockIcon;
111 { PIDGIN_STOCK_STATUS_AVAILABLE, "status", "available.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_AVAILABLE_I }, 126
112 { PIDGIN_STOCK_STATUS_AWAY, "status", "away.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_AWAY_I }, 127 const SizedStockIcon sized_stock_icons [] = {
113 { PIDGIN_STOCK_STATUS_BUSY, "status", "busy.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_BUSY_I },
114 { PIDGIN_STOCK_STATUS_CHAT, "status", "chat.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
115 { PIDGIN_STOCK_STATUS_INVISIBLE,"status", "invisible.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
116 { PIDGIN_STOCK_STATUS_XA, "status", "extended-away.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, PIDGIN_STOCK_STATUS_XA_I },
117 { PIDGIN_STOCK_STATUS_LOGIN, "status", "log-in.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
118 { PIDGIN_STOCK_STATUS_LOGOUT, "status", "log-out.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
119 { PIDGIN_STOCK_STATUS_OFFLINE, "status", "offline.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_OFFLINE_I },
120 { PIDGIN_STOCK_STATUS_PERSON, "status", "person.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
121 { PIDGIN_STOCK_STATUS_MESSAGE, "toolbar", "message-new.png", TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
122 128
123 { PIDGIN_STOCK_STATUS_IGNORED, "emblems", "blocked.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 129 { PIDGIN_STOCK_STATUS_IGNORED, "emblems", "blocked.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
124 { PIDGIN_STOCK_STATUS_FOUNDER, "emblems", "founder.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 130 { PIDGIN_STOCK_STATUS_FOUNDER, "emblems", "founder.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
125 { PIDGIN_STOCK_STATUS_OPERATOR, "emblems", "operator.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 131 { PIDGIN_STOCK_STATUS_OPERATOR, "emblems", "operator.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
126 { PIDGIN_STOCK_STATUS_HALFOP, "emblems", "half-operator.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 132 { PIDGIN_STOCK_STATUS_HALFOP, "emblems", "half-operator.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
148 { PIDGIN_STOCK_ANIMATION_TYPING2, "animations", "typing2.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 154 { PIDGIN_STOCK_ANIMATION_TYPING2, "animations", "typing2.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
149 { PIDGIN_STOCK_ANIMATION_TYPING3, "animations", "typing3.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 155 { PIDGIN_STOCK_ANIMATION_TYPING3, "animations", "typing3.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
150 { PIDGIN_STOCK_ANIMATION_TYPING4, "animations", "typing4.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 156 { PIDGIN_STOCK_ANIMATION_TYPING4, "animations", "typing4.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
151 { PIDGIN_STOCK_ANIMATION_TYPING5, "animations", "typing5.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 157 { PIDGIN_STOCK_ANIMATION_TYPING5, "animations", "typing5.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
152 158
153 { PIDGIN_STOCK_TOOLBAR_ACCOUNTS, "toolbar", "accounts.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 159 { PIDGIN_STOCK_TOOLBAR_ACCOUNTS, "toolbar", "accounts.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
154 { PIDGIN_STOCK_TOOLBAR_BGCOLOR, "toolbar", "change-bgcolor.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 160 { PIDGIN_STOCK_TOOLBAR_BGCOLOR, "toolbar", "change-bgcolor.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
155 { PIDGIN_STOCK_TOOLBAR_BLOCK, "emblems", "blocked.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 161 { PIDGIN_STOCK_TOOLBAR_BLOCK, "emblems", "blocked.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
156 { PIDGIN_STOCK_TOOLBAR_FGCOLOR, "toolbar", "change-fgcolor.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 162 { PIDGIN_STOCK_TOOLBAR_FGCOLOR, "toolbar", "change-fgcolor.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
157 { PIDGIN_STOCK_TOOLBAR_SMILEY, "toolbar", "emote-select.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 163 { PIDGIN_STOCK_TOOLBAR_SMILEY, "toolbar", "emote-select.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
158 { PIDGIN_STOCK_TOOLBAR_FONT_FACE, "toolbar", "font-face.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 164 { PIDGIN_STOCK_TOOLBAR_FONT_FACE, "toolbar", "font-face.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
159 { PIDGIN_STOCK_TOOLBAR_TEXT_SMALLER, "toolbar", "font-size-down.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 165 { PIDGIN_STOCK_TOOLBAR_TEXT_SMALLER, "toolbar", "font-size-down.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
160 { PIDGIN_STOCK_TOOLBAR_TEXT_LARGER, "toolbar", "font-size-up.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 166 { PIDGIN_STOCK_TOOLBAR_TEXT_LARGER, "toolbar", "font-size-up.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
161 { PIDGIN_STOCK_TOOLBAR_INSERT, "toolbar", "insert.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 167 { PIDGIN_STOCK_TOOLBAR_INSERT, "toolbar", "insert.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
162 { PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE, "toolbar", "insert-image.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 168 { PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE, "toolbar", "insert-image.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
163 { PIDGIN_STOCK_TOOLBAR_INSERT_LINK, "toolbar", "insert-link.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 169 { PIDGIN_STOCK_TOOLBAR_INSERT_LINK, "toolbar", "insert-link.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
164 { PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW, "toolbar", "message-new.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 170 { PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW, "toolbar", "message-new.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
165 { PIDGIN_STOCK_TOOLBAR_PENDING, "toolbar", "message-new.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 171 { PIDGIN_STOCK_TOOLBAR_PENDING, "toolbar", "message-new.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
166 { PIDGIN_STOCK_TOOLBAR_PLUGINS, "toolbar", "plugins.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 172 { PIDGIN_STOCK_TOOLBAR_PLUGINS, "toolbar", "plugins.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
167 { PIDGIN_STOCK_TOOLBAR_TYPING, "toolbar", "typing.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 173 { PIDGIN_STOCK_TOOLBAR_TYPING, "toolbar", "typing.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
168 { PIDGIN_STOCK_TOOLBAR_UNBLOCK, "toolbar", "unblock.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 174 { PIDGIN_STOCK_TOOLBAR_UNBLOCK, "toolbar", "unblock.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
169 { PIDGIN_STOCK_TOOLBAR_SELECT_AVATAR, "toolbar", "select-avatar.png", FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, NULL }, 175 { PIDGIN_STOCK_TOOLBAR_SELECT_AVATAR, "toolbar", "select-avatar.png", FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, NULL },
170 { PIDGIN_STOCK_TOOLBAR_SEND_FILE, "toolbar", "send-file.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 176 { PIDGIN_STOCK_TOOLBAR_SEND_FILE, "toolbar", "send-file.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
171 { PIDGIN_STOCK_TOOLBAR_TRANSFER, "toolbar", "transfer.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, 177 { PIDGIN_STOCK_TOOLBAR_TRANSFER, "toolbar", "transfer.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }
172
173 { PIDGIN_STOCK_TRAY_AVAILABLE, "tray", "tray-online.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
174 { PIDGIN_STOCK_TRAY_INVISIBLE, "tray", "tray-invisible.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
175 { PIDGIN_STOCK_TRAY_AWAY, "tray", "tray-away.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
176 { PIDGIN_STOCK_TRAY_BUSY, "tray", "tray-busy.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
177 { PIDGIN_STOCK_TRAY_XA, "tray", "tray-extended-away.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
178 { PIDGIN_STOCK_TRAY_OFFLINE, "tray", "tray-offline.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
179 { PIDGIN_STOCK_TRAY_CONNECT, "tray", "tray-connecting.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
180 { PIDGIN_STOCK_TRAY_PENDING, "tray", "tray-new-im.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
181 { PIDGIN_STOCK_TRAY_EMAIL, "tray", "tray-message.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }
182 }; 178 };
179
180 const SizedStockIcon sized_status_icons [] = {
181
182 { PIDGIN_STOCK_STATUS_AVAILABLE, "status", "available.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_AVAILABLE_I },
183 { PIDGIN_STOCK_STATUS_AWAY, "status", "away.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_AWAY_I },
184 { PIDGIN_STOCK_STATUS_BUSY, "status", "busy.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_BUSY_I },
185 { PIDGIN_STOCK_STATUS_CHAT, "status", "chat.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
186 { PIDGIN_STOCK_STATUS_INVISIBLE, "status", "invisible.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
187 { PIDGIN_STOCK_STATUS_XA, "status", "extended-away.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, PIDGIN_STOCK_STATUS_XA_I },
188 { PIDGIN_STOCK_STATUS_LOGIN, "status", "log-in.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
189 { PIDGIN_STOCK_STATUS_LOGOUT, "status", "log-out.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
190 { PIDGIN_STOCK_STATUS_OFFLINE, "status", "offline.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_OFFLINE_I },
191 { PIDGIN_STOCK_STATUS_PERSON, "status", "person.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
192 { PIDGIN_STOCK_STATUS_MESSAGE, "toolbar", "message-new.png", TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
193
194 { PIDGIN_STOCK_TRAY_AVAILABLE, "tray", "tray-online.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
195 { PIDGIN_STOCK_TRAY_INVISIBLE, "tray", "tray-invisible.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
196 { PIDGIN_STOCK_TRAY_AWAY, "tray", "tray-away.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
197 { PIDGIN_STOCK_TRAY_BUSY, "tray", "tray-busy.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
198 { PIDGIN_STOCK_TRAY_XA, "tray", "tray-extended-away.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
199 { PIDGIN_STOCK_TRAY_OFFLINE, "tray", "tray-offline.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
200 { PIDGIN_STOCK_TRAY_CONNECT, "tray", "tray-connecting.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
201 { PIDGIN_STOCK_TRAY_PENDING, "tray", "tray-new-im.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
202 { PIDGIN_STOCK_TRAY_EMAIL, "tray", "tray-message.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }
203 };
204
205 /*****************************************************************************
206 * Private functions
207 *****************************************************************************/
183 208
184 static gchar * 209 static gchar *
185 find_file(const char *dir, const char *base) 210 find_file(const char *dir, const char *base)
186 { 211 {
187 char *filename; 212 char *filename;
333 gtk_icon_set_add_source(iconset, source); 358 gtk_icon_set_add_source(iconset, source);
334 g_free(filename); 359 g_free(filename);
335 g_object_unref(pixbuf); 360 g_object_unref(pixbuf);
336 gtk_icon_source_free(source); 361 gtk_icon_source_free(source);
337 } 362 }
338 363 }
339 364
340 } 365 static void
341 366 build_sized_icon_sets(GtkIconSet *normal, GtkIconSet *translucent, SizedStockIcon icon,
367 GtkIconSize size, PidginIconTheme *theme, const gchar *pix)
368 {
369 const gchar *file, *dir;
370 gchar *file_full;
371 gboolean use_theme;
372
373 if ((use_theme = theme != NULL)) {
374 file = pidgin_icon_theme_get_file(theme, icon.name);
375 dir = purple_theme_get_dir(PURPLE_THEME(theme));
376
377 file_full = g_build_filename(dir, pix, file, NULL);
378 use_theme = g_file_test(file_full, G_FILE_TEST_IS_REGULAR);
379 g_free(file_full);
380 }
381
382 if (!use_theme) {
383 file = icon.filename;
384 dir = icon.dir;
385 }
386
387 add_sized_icon(normal, size, dir, icon.rtl, pix, file);
388 if (translucent != NULL)
389 add_translucent_sized_icon(translucent, size, dir, icon.rtl, pix, file);
390 }
391
392 /*****************************************************************************
393 * Public API functions
394 *****************************************************************************/
395
396 void
397 pidgin_stock_load_status_icon_theme(PidginIconTheme *theme)
398 {
399 GtkIconFactory *icon_factory;
400 gint i;
401 GtkIconSet *normal;
402 GtkIconSet *translucent = NULL;
403 GtkWidget *win;
404
405 g_return_if_fail(stock_initted);
406
407 icon_factory = gtk_icon_factory_new();
408
409 gtk_icon_factory_add_default(icon_factory);
410
411 win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
412 gtk_widget_realize(win);
413
414 for (i = 0; i < G_N_ELEMENTS(sized_status_icons); i++)
415 {
416 normal = gtk_icon_set_new();
417 if (sized_status_icons[i].translucent_name)
418 translucent = gtk_icon_set_new();
419
420 if (sized_status_icons[i].microscopic)
421 build_sized_icon_sets(normal, translucent, sized_status_icons[i], microscopic, theme, "11");
422 if (sized_status_icons[i].extra_small)
423 build_sized_icon_sets(normal, translucent, sized_status_icons[i], extra_small, theme, "16");
424 if (sized_status_icons[i].small)
425 build_sized_icon_sets(normal, translucent, sized_status_icons[i], small, theme, "22");
426 if (sized_status_icons[i].medium)
427 build_sized_icon_sets(normal, translucent, sized_status_icons[i], medium, theme, "32");
428 if (sized_status_icons[i].large)
429 build_sized_icon_sets(normal, translucent, sized_status_icons[i], large, theme, "48");
430 if (sized_status_icons[i].huge)
431 build_sized_icon_sets(normal, translucent, sized_status_icons[i], huge, theme, "64");
432
433 gtk_icon_factory_add(icon_factory, sized_status_icons[i].name, normal);
434 gtk_icon_set_unref(normal);
435
436 if (sized_status_icons[i].translucent_name) {
437 gtk_icon_factory_add(icon_factory, sized_status_icons[i].translucent_name, translucent);
438 gtk_icon_set_unref(translucent);
439 }
440 }
441
442 gtk_widget_destroy(win);
443 g_object_unref(G_OBJECT(icon_factory));
444 }
342 445
343 void 446 void
344 pidgin_stock_init(void) 447 pidgin_stock_init(void)
345 { 448 {
346 static gboolean stock_initted = FALSE;
347 GtkIconFactory *icon_factory; 449 GtkIconFactory *icon_factory;
348 size_t i; 450 size_t i;
349 GtkWidget *win; 451 GtkWidget *win;
350 GtkIconSize microscopic, extra_small, small, medium, large, huge;
351 452
352 if (stock_initted) 453 if (stock_initted)
353 return; 454 return;
354 455
355 stock_initted = TRUE; 456 stock_initted = TRUE;
457
458 /* Setup the theme */
459 purple_theme_manager_register_type(g_object_new(PIDGIN_TYPE_ICON_THEME_LOADER, "type", "icon", NULL));
460 purple_prefs_add_none(PIDGIN_PREFS_ROOT "/icon/status");
461 purple_prefs_add_string(PIDGIN_PREFS_ROOT "/icon/status/theme", "");
356 462
357 /* Setup the icon factory. */ 463 /* Setup the icon factory. */
358 icon_factory = gtk_icon_factory_new(); 464 icon_factory = gtk_icon_factory_new();
359 465
360 gtk_icon_factory_add_default(icon_factory); 466 gtk_icon_factory_add_default(icon_factory);
400 506
401 gtk_icon_set_unref(iconset); 507 gtk_icon_set_unref(iconset);
402 } 508 }
403 509
404 /* register custom icon sizes */ 510 /* register custom icon sizes */
405
406 microscopic = gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_MICROSCOPIC, 11, 11); 511 microscopic = gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_MICROSCOPIC, 11, 11);
407 extra_small = gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL, 16, 16); 512 extra_small = gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL, 16, 16);
408 small = gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_SMALL, 22, 22); 513 small = gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_SMALL, 22, 22);
409 medium = gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_MEDIUM, 32, 32); 514 medium = gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_MEDIUM, 32, 32);
410 large = gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_LARGE, 48, 48); 515 large = gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_LARGE, 48, 48);
414 { 519 {
415 GtkIconSet *iconset; 520 GtkIconSet *iconset;
416 521
417 iconset = gtk_icon_set_new(); 522 iconset = gtk_icon_set_new();
418 523
419 #define ADD_SIZED_ICON(name, size) do { \ 524 if (sized_stock_icons[i].microscopic)
420 if (sized_stock_icons[i].name) \ 525 build_sized_icon_sets(iconset, NULL, sized_stock_icons[i], microscopic, NULL, "11");
421 add_sized_icon(iconset, name, \ 526 if (sized_stock_icons[i].extra_small)
422 sized_stock_icons[i].dir, sized_stock_icons[i].rtl, \ 527 build_sized_icon_sets(iconset, NULL, sized_stock_icons[i], extra_small, NULL, "16");
423 size, sized_stock_icons[i].filename); \ 528 if (sized_stock_icons[i].small)
424 } while (0) 529 build_sized_icon_sets(iconset, NULL, sized_stock_icons[i], small, NULL, "22");
425 ADD_SIZED_ICON(microscopic, "11"); 530 if (sized_stock_icons[i].medium)
426 ADD_SIZED_ICON(extra_small, "16"); 531 build_sized_icon_sets(iconset, NULL, sized_stock_icons[i], medium, NULL, "32");
427 ADD_SIZED_ICON(small, "22"); 532 if (sized_stock_icons[i].large)
428 ADD_SIZED_ICON(medium, "32"); 533 build_sized_icon_sets(iconset, NULL, sized_stock_icons[i], large, NULL, "48");
429 ADD_SIZED_ICON(large, "48"); 534 if (sized_stock_icons[i].huge)
430 ADD_SIZED_ICON(huge, "64"); 535 build_sized_icon_sets(iconset, NULL, sized_stock_icons[i], huge, NULL, "64");
431 #undef ADD_SIZED_ICON
432 536
433 gtk_icon_factory_add(icon_factory, sized_stock_icons[i].name, iconset); 537 gtk_icon_factory_add(icon_factory, sized_stock_icons[i].name, iconset);
434 gtk_icon_set_unref(iconset); 538 gtk_icon_set_unref(iconset);
435
436 if (sized_stock_icons[i].translucent_name) {
437 iconset = gtk_icon_set_new();
438
439 #define ADD_TRANS_ICON(name, size) do { \
440 if (sized_stock_icons[i].name) \
441 add_translucent_sized_icon(iconset, name, \
442 sized_stock_icons[i].dir, sized_stock_icons[i].rtl, \
443 size, sized_stock_icons[i].filename); \
444 } while (0)
445 ADD_TRANS_ICON(microscopic, "11");
446 ADD_TRANS_ICON(extra_small, "16");
447 ADD_TRANS_ICON(small, "22");
448 ADD_TRANS_ICON(medium, "32");
449 ADD_TRANS_ICON(large, "48");
450 ADD_TRANS_ICON(huge, "64");
451 #undef ADD_TRANS_ICON
452
453 gtk_icon_factory_add(icon_factory, sized_stock_icons[i].translucent_name, iconset);
454 gtk_icon_set_unref(iconset);
455 }
456 } 539 }
457 540
458 gtk_widget_destroy(win); 541 gtk_widget_destroy(win);
459 g_object_unref(G_OBJECT(icon_factory)); 542 g_object_unref(G_OBJECT(icon_factory));
460 543
544 pidgin_stock_load_status_icon_theme(NULL);
545
461 /* Register the stock items. */ 546 /* Register the stock items. */
462 gtk_stock_add_static(stock_items, G_N_ELEMENTS(stock_items)); 547 gtk_stock_add_static(stock_items, G_N_ELEMENTS(stock_items));
463 } 548 }