| 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 { |