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);