Mercurial > pidgin.yaz
comparison pidgin/pidginstock.c @ 24411:de3b12b70b5f
Try to be more compliant with the freedesktop.org icon spec thingy with
the stock icons, by looking in user and system data-directories for the
images before looking in DATADIR. Thanks to Thomas Reifferscheid aka
reiffert for the initial patch. Closes #4988.
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Mon, 17 Nov 2008 13:28:32 +0000 |
parents | b948081819a6 |
children | 8fa87801e203 9895d55d3877 adf153852bcf 24aa608c5388 |
comparison
equal
deleted
inserted
replaced
24410:9eafd4a52906 | 24411:de3b12b70b5f |
---|---|
204 { PIDGIN_STOCK_TRAY_CONNECT, "tray", "tray-connecting.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, | 204 { PIDGIN_STOCK_TRAY_CONNECT, "tray", "tray-connecting.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, |
205 { PIDGIN_STOCK_TRAY_PENDING, "tray", "tray-new-im.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, | 205 { PIDGIN_STOCK_TRAY_PENDING, "tray", "tray-new-im.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, |
206 { PIDGIN_STOCK_TRAY_EMAIL, "tray", "tray-message.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL } | 206 { PIDGIN_STOCK_TRAY_EMAIL, "tray", "tray-message.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL } |
207 }; | 207 }; |
208 | 208 |
209 static void | |
210 add_sized_icon_common(GtkIconSet *iconset, GtkIconSize sizeid, const char *dir, | |
211 gboolean rtl, const char *size, const char *file, | |
212 gboolean translucent); | |
213 | |
214 static gchar * | |
215 find_file_common(const char *name) | |
216 { | |
217 gchar *filename; | |
218 #if GLIB_CHECK_VERSION(2,6,0) | |
219 const gchar *userdir; | |
220 const gchar * const *sysdirs; | |
221 | |
222 userdir = g_get_user_data_dir(); | |
223 filename = g_build_filename(userdir, name, NULL); | |
224 if (g_file_test(filename, G_FILE_TEST_EXISTS)) | |
225 return filename; | |
226 g_free(filename); | |
227 | |
228 sysdirs = g_get_system_data_dirs(); | |
229 for (; *sysdirs; sysdirs++) { | |
230 filename = g_build_filename(*sysdirs, name, NULL); | |
231 if (g_file_test(filename, G_FILE_TEST_EXISTS)) | |
232 return filename; | |
233 g_free(filename); | |
234 } | |
235 #endif | |
236 filename = g_build_filename(DATADIR, name, NULL); | |
237 if (g_file_test(filename, G_FILE_TEST_EXISTS)) | |
238 return filename; | |
239 g_free(filename); | |
240 return NULL; | |
241 } | |
242 | |
209 static gchar * | 243 static gchar * |
210 find_file(const char *dir, const char *base) | 244 find_file(const char *dir, const char *base) |
211 { | 245 { |
212 char *filename; | 246 char *filename; |
247 char *ret; | |
213 | 248 |
214 if (base == NULL) | 249 if (base == NULL) |
215 return NULL; | 250 return NULL; |
216 | 251 |
217 if (!strcmp(dir, "pidgin")) | 252 if (!strcmp(dir, "pidgin")) |
218 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", base, NULL); | 253 filename = g_build_filename("pixmaps", "pidgin", base, NULL); |
219 else | 254 else |
220 { | 255 filename = g_build_filename("pixmaps", "pidgin", dir, base, NULL); |
221 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, | 256 |
222 base, NULL); | 257 ret = find_file_common(filename); |
223 } | 258 g_free(filename); |
224 | 259 return ret; |
225 return filename; | |
226 } | 260 } |
227 | 261 |
228 static void | 262 static void |
229 add_sized_icon(GtkIconSet *iconset, GtkIconSize sizeid, const char *dir, | 263 add_sized_icon(GtkIconSet *iconset, GtkIconSize sizeid, const char *dir, |
230 gboolean rtl, const char *size, const char *file) | 264 gboolean rtl, const char *size, const char *file) |
231 { | 265 { |
232 char *filename; | 266 add_sized_icon_common(iconset, sizeid, dir, rtl, size, file, FALSE); |
233 GtkIconSource *source; | |
234 | |
235 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, size, file, NULL); | |
236 source = gtk_icon_source_new(); | |
237 gtk_icon_source_set_filename(source, filename); | |
238 gtk_icon_source_set_direction(source, GTK_TEXT_DIR_LTR); | |
239 gtk_icon_source_set_direction_wildcarded(source, !rtl); | |
240 gtk_icon_source_set_size(source, sizeid); | |
241 gtk_icon_source_set_size_wildcarded(source, FALSE); | |
242 gtk_icon_source_set_state_wildcarded(source, TRUE); | |
243 gtk_icon_set_add_source(iconset, source); | |
244 gtk_icon_source_free(source); | |
245 | |
246 if (sizeid == gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)) { | |
247 source = gtk_icon_source_new(); | |
248 gtk_icon_source_set_filename(source, filename); | |
249 gtk_icon_source_set_direction_wildcarded(source, TRUE); | |
250 gtk_icon_source_set_size(source, GTK_ICON_SIZE_MENU); | |
251 gtk_icon_source_set_size_wildcarded(source, FALSE); | |
252 gtk_icon_source_set_state_wildcarded(source, TRUE); | |
253 gtk_icon_set_add_source(iconset, source); | |
254 gtk_icon_source_free(source); | |
255 } | |
256 g_free(filename); | |
257 | |
258 if (rtl) { | |
259 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, size, "rtl", file, NULL); | |
260 source = gtk_icon_source_new(); | |
261 gtk_icon_source_set_filename(source, filename); | |
262 gtk_icon_source_set_direction(source, GTK_TEXT_DIR_RTL); | |
263 gtk_icon_source_set_size(source, sizeid); | |
264 gtk_icon_source_set_size_wildcarded(source, FALSE); | |
265 gtk_icon_source_set_state_wildcarded(source, TRUE); | |
266 gtk_icon_set_add_source(iconset, source); | |
267 g_free(filename); | |
268 gtk_icon_source_free(source); | |
269 } | |
270 | |
271 | |
272 } | 267 } |
273 | 268 |
274 /* Altered from do_colorshift in gnome-panel */ | 269 /* Altered from do_colorshift in gnome-panel */ |
275 static void | 270 static void |
276 do_alphashift (GdkPixbuf *dest, GdkPixbuf *src) | 271 do_alphashift (GdkPixbuf *dest, GdkPixbuf *src) |
305 *(pixdest++) = a / 2; | 300 *(pixdest++) = a / 2; |
306 } | 301 } |
307 } | 302 } |
308 } | 303 } |
309 | 304 |
310 /* TODO: This is almost certainly not the best way to do this, but it's late, I'm tired, | |
311 * we're a few hours from getting this thing out, and copy/paste is EASY. | |
312 */ | |
313 static void | 305 static void |
314 add_translucent_sized_icon(GtkIconSet *iconset, GtkIconSize sizeid, const char *dir, | 306 add_translucent_sized_icon(GtkIconSet *iconset, GtkIconSize sizeid, const char *dir, |
315 gboolean rtl, const char *size, const char *file) | 307 gboolean rtl, const char *size, const char *file) |
316 { | 308 { |
317 char *filename; | 309 add_sized_icon_common(iconset, sizeid, dir, rtl, size, file, TRUE); |
318 GtkIconSource *source; | 310 } |
311 | |
312 static void | |
313 add_sized_icon_common(GtkIconSet *iconset, GtkIconSize sizeid, const char *dir, | |
314 gboolean rtl, const char *size, const char *file, | |
315 gboolean translucent) | |
316 { | |
317 char *filename, *subpath; | |
318 GtkIconSource *source; | |
319 GdkPixbuf *pixbuf; | 319 GdkPixbuf *pixbuf; |
320 | 320 |
321 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, size, file, NULL); | 321 subpath = g_build_filename("pixmaps", "pidgin", dir, size, file, NULL); |
322 filename = find_file_common(subpath); | |
323 g_free(subpath); | |
324 if (!filename) | |
325 return; | |
326 | |
322 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); | 327 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
323 do_alphashift(pixbuf, pixbuf); | 328 if (translucent) |
329 do_alphashift(pixbuf, pixbuf); | |
324 | 330 |
325 source = gtk_icon_source_new(); | 331 source = gtk_icon_source_new(); |
326 gtk_icon_source_set_pixbuf(source, pixbuf); | 332 gtk_icon_source_set_pixbuf(source, pixbuf); |
327 gtk_icon_source_set_direction(source, GTK_TEXT_DIR_LTR); | 333 gtk_icon_source_set_direction(source, GTK_TEXT_DIR_LTR); |
328 gtk_icon_source_set_direction_wildcarded(source, !rtl); | 334 gtk_icon_source_set_direction_wildcarded(source, !rtl); |
329 gtk_icon_source_set_size(source, sizeid); | 335 gtk_icon_source_set_size(source, sizeid); |
330 gtk_icon_source_set_size_wildcarded(source, FALSE); | 336 gtk_icon_source_set_size_wildcarded(source, FALSE); |
331 gtk_icon_source_set_state_wildcarded(source, TRUE); | 337 gtk_icon_source_set_state_wildcarded(source, TRUE); |
332 gtk_icon_set_add_source(iconset, source); | 338 gtk_icon_set_add_source(iconset, source); |
333 gtk_icon_source_free(source); | 339 gtk_icon_source_free(source); |
334 | 340 |
335 if (sizeid == gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)) { | 341 if (sizeid == gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)) { |
336 source = gtk_icon_source_new(); | 342 source = gtk_icon_source_new(); |
337 gtk_icon_source_set_pixbuf(source, pixbuf); | 343 gtk_icon_source_set_pixbuf(source, pixbuf); |
338 gtk_icon_source_set_direction_wildcarded(source, TRUE); | 344 gtk_icon_source_set_direction_wildcarded(source, TRUE); |
339 gtk_icon_source_set_size(source, GTK_ICON_SIZE_MENU); | 345 gtk_icon_source_set_size(source, GTK_ICON_SIZE_MENU); |
340 gtk_icon_source_set_size_wildcarded(source, FALSE); | 346 gtk_icon_source_set_size_wildcarded(source, FALSE); |
341 gtk_icon_source_set_state_wildcarded(source, TRUE); | 347 gtk_icon_source_set_state_wildcarded(source, TRUE); |
342 gtk_icon_set_add_source(iconset, source); | 348 gtk_icon_set_add_source(iconset, source); |
343 gtk_icon_source_free(source); | 349 gtk_icon_source_free(source); |
344 } | 350 } |
345 g_free(filename); | 351 g_free(filename); |
346 g_object_unref(pixbuf); | 352 g_object_unref(pixbuf); |
347 | 353 |
348 if (rtl) { | 354 if (rtl) { |
349 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, size, "rtl", file, NULL); | 355 subpath = g_build_filename("pixmaps", "pidgin", dir, size, "rtl", file, NULL); |
350 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); | 356 filename = find_file_common(subpath); |
351 do_alphashift(pixbuf, pixbuf); | 357 g_free(subpath); |
358 if (!filename) | |
359 return; | |
360 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); | |
361 if (translucent) | |
362 do_alphashift(pixbuf, pixbuf); | |
352 source = gtk_icon_source_new(); | 363 source = gtk_icon_source_new(); |
353 gtk_icon_source_set_pixbuf(source, pixbuf); | 364 gtk_icon_source_set_pixbuf(source, pixbuf); |
354 gtk_icon_source_set_direction(source, GTK_TEXT_DIR_RTL); | 365 gtk_icon_source_set_direction(source, GTK_TEXT_DIR_RTL); |
355 gtk_icon_source_set_size(source, sizeid); | 366 gtk_icon_source_set_size(source, sizeid); |
356 gtk_icon_source_set_size_wildcarded(source, FALSE); | 367 gtk_icon_source_set_size_wildcarded(source, FALSE); |
357 gtk_icon_source_set_state_wildcarded(source, TRUE); | 368 gtk_icon_source_set_state_wildcarded(source, TRUE); |
358 gtk_icon_set_add_source(iconset, source); | 369 gtk_icon_set_add_source(iconset, source); |
359 g_free(filename); | 370 g_free(filename); |
360 g_object_unref(pixbuf); | 371 g_object_unref(pixbuf); |
361 gtk_icon_source_free(source); | 372 gtk_icon_source_free(source); |
362 } | 373 } |
363 | 374 } |
364 | |
365 } | |
366 | |
367 | 375 |
368 void | 376 void |
369 pidgin_stock_init(void) | 377 pidgin_stock_init(void) |
370 { | 378 { |
371 static gboolean stock_initted = FALSE; | 379 static gboolean stock_initted = FALSE; |
410 source = gtk_icon_source_new(); | 418 source = gtk_icon_source_new(); |
411 gtk_icon_source_set_filename(source, filename); | 419 gtk_icon_source_set_filename(source, filename); |
412 gtk_icon_source_set_direction_wildcarded(source, TRUE); | 420 gtk_icon_source_set_direction_wildcarded(source, TRUE); |
413 gtk_icon_source_set_size_wildcarded(source, TRUE); | 421 gtk_icon_source_set_size_wildcarded(source, TRUE); |
414 gtk_icon_source_set_state_wildcarded(source, TRUE); | 422 gtk_icon_source_set_state_wildcarded(source, TRUE); |
415 | |
416 | 423 |
417 iconset = gtk_icon_set_new(); | 424 iconset = gtk_icon_set_new(); |
418 gtk_icon_set_add_source(iconset, source); | 425 gtk_icon_set_add_source(iconset, source); |
419 | 426 |
420 gtk_icon_source_free(source); | 427 gtk_icon_source_free(source); |