comparison pidgin/pidginstock.c @ 25332:9895d55d3877

explicit merge of 'a9579fef71ff6820f390a986132d30b079f590a0' and '1ca0231d066e176a833be6e44e4a933acf14963a' to branch 'im.pidgin.pidgin.next.minor'
author Richard Laager <rlaager@wiktel.com>
date Thu, 27 Nov 2008 06:46:25 +0000
parents 051c29d275de de3b12b70b5f
children 244863136504
comparison
equal deleted inserted replaced
25331:10e1f3c1d0db 25332:9895d55d3877
230 /***************************************************************************** 230 /*****************************************************************************
231 * Private functions 231 * Private functions
232 *****************************************************************************/ 232 *****************************************************************************/
233 233
234 static gchar * 234 static gchar *
235 find_file_common(const char *name)
236 {
237 gchar *filename;
238 #if GLIB_CHECK_VERSION(2,6,0)
239 const gchar *userdir;
240 const gchar * const *sysdirs;
241
242 userdir = g_get_user_data_dir();
243 filename = g_build_filename(userdir, name, NULL);
244 if (g_file_test(filename, G_FILE_TEST_EXISTS))
245 return filename;
246 g_free(filename);
247
248 sysdirs = g_get_system_data_dirs();
249 for (; *sysdirs; sysdirs++) {
250 filename = g_build_filename(*sysdirs, name, NULL);
251 if (g_file_test(filename, G_FILE_TEST_EXISTS))
252 return filename;
253 g_free(filename);
254 }
255 #endif
256 filename = g_build_filename(DATADIR, name, NULL);
257 if (g_file_test(filename, G_FILE_TEST_EXISTS))
258 return filename;
259 g_free(filename);
260 return NULL;
261 }
262
263 static gchar *
235 find_file(const char *dir, const char *base) 264 find_file(const char *dir, const char *base)
236 { 265 {
237 char *filename; 266 char *filename;
267 char *ret;
238 268
239 if (base == NULL) 269 if (base == NULL)
240 return NULL; 270 return NULL;
241 271
242 if (!strcmp(dir, "pidgin")) 272 if (!strcmp(dir, "pidgin"))
243 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", base, NULL); 273 filename = g_build_filename("pixmaps", "pidgin", base, NULL);
244 else 274 else
245 { 275 filename = g_build_filename("pixmaps", "pidgin", dir, base, NULL);
246 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, 276
247 base, NULL); 277 ret = find_file_common(filename);
248 } 278 g_free(filename);
249 279 return ret;
250 return filename;
251 } 280 }
252 281
253 282
254 /* Altered from do_colorshift in gnome-panel */ 283 /* Altered from do_colorshift in gnome-panel */
255 static void 284 static void
290 static gchar * 319 static gchar *
291 find_icon_file(PidginStatusIconTheme *theme, const gchar *size, SizedStockIcon sized_icon, gboolean rtl) 320 find_icon_file(PidginStatusIconTheme *theme, const gchar *size, SizedStockIcon sized_icon, gboolean rtl)
292 { 321 {
293 const gchar *file, *dir; 322 const gchar *file, *dir;
294 gchar *file_full = NULL; 323 gchar *file_full = NULL;
324 gchar *tmp;
295 325
296 if (theme != NULL) { 326 if (theme != NULL) {
297 file = pidgin_icon_theme_get_icon(PIDGIN_ICON_THEME(theme), sized_icon.name); 327 file = pidgin_icon_theme_get_icon(PIDGIN_ICON_THEME(theme), sized_icon.name);
298 dir = purple_theme_get_dir(PURPLE_THEME(theme)); 328 dir = purple_theme_get_dir(PURPLE_THEME(theme));
299 329
300 if (rtl) 330 if (rtl)
301 file_full = g_build_filename(dir, size, "rtl", file, NULL); 331 file_full = g_build_filename(dir, size, "rtl", file, NULL);
302 else file_full = g_build_filename(dir, size, file, NULL); 332 else
333 file_full = g_build_filename(dir, size, file, NULL);
303 334
304 if (g_file_test(file_full, G_FILE_TEST_IS_REGULAR)) 335 if (g_file_test(file_full, G_FILE_TEST_IS_REGULAR))
305 return file_full; 336 return file_full;
306 337
307 g_free(file_full); 338 g_free(file_full);
308 } 339 }
309 340
310 if (rtl) 341 if (rtl)
311 return g_build_filename(DATADIR, "pixmaps", "pidgin", sized_icon.dir, size, sized_icon.filename, NULL); 342 tmp = g_build_filename("pixmaps", "pidgin", sized_icon.dir, size, "rtl", sized_icon.filename, NULL);
312 else return g_build_filename(DATADIR, "pixmaps", "pidgin", sized_icon.dir, size, sized_icon.filename, NULL); 343 else
344 tmp = g_build_filename("pixmaps", "pidgin", sized_icon.dir, size, sized_icon.filename, NULL);
345
346 file_full = find_file_common(tmp);
347 g_free(tmp);
348 return file_full;
313 } 349 }
314 350
315 static void 351 static void
316 add_sized_icon(GtkIconSet *iconset, GtkIconSize sizeid, PidginStatusIconTheme *theme, 352 add_sized_icon(GtkIconSet *iconset, GtkIconSize sizeid, PidginStatusIconTheme *theme,
317 const char *size, SizedStockIcon sized_icon, gboolean translucent) 353 const char *size, SizedStockIcon sized_icon, gboolean translucent)
318 { 354 {
319 char *filename; 355 char *filename;
356 char *subpath;
320 GtkIconSource *source; 357 GtkIconSource *source;
321 GdkPixbuf *pixbuf; 358 GdkPixbuf *pixbuf;
322 359
323 filename = find_icon_file(theme, size, sized_icon, FALSE); 360 filename = find_icon_file(theme, size, sized_icon, FALSE);
361 g_return_if_fail(filename != NULL);
324 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); 362 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
325 if (translucent) 363 if (translucent)
326 do_alphashift(pixbuf, pixbuf); 364 do_alphashift(pixbuf, pixbuf);
327 365
328 source = gtk_icon_source_new(); 366 source = gtk_icon_source_new();
329 gtk_icon_source_set_pixbuf(source, pixbuf); 367 gtk_icon_source_set_pixbuf(source, pixbuf);
330 gtk_icon_source_set_direction(source, GTK_TEXT_DIR_LTR); 368 gtk_icon_source_set_direction(source, GTK_TEXT_DIR_LTR);
331 gtk_icon_source_set_direction_wildcarded(source, !sized_icon.rtl); 369 gtk_icon_source_set_direction_wildcarded(source, !sized_icon.rtl);
332 gtk_icon_source_set_size(source, sizeid); 370 gtk_icon_source_set_size(source, sizeid);
333 gtk_icon_source_set_size_wildcarded(source, FALSE); 371 gtk_icon_source_set_size_wildcarded(source, FALSE);
334 gtk_icon_source_set_state_wildcarded(source, TRUE); 372 gtk_icon_source_set_state_wildcarded(source, TRUE);
335 gtk_icon_set_add_source(iconset, source); 373 gtk_icon_set_add_source(iconset, source);
336 gtk_icon_source_free(source); 374 gtk_icon_source_free(source);
337 375
338 if (sizeid == gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)) { 376 if (sizeid == gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)) {
339 source = gtk_icon_source_new(); 377 source = gtk_icon_source_new();
340 gtk_icon_source_set_pixbuf(source, pixbuf); 378 gtk_icon_source_set_pixbuf(source, pixbuf);
341 gtk_icon_source_set_direction_wildcarded(source, TRUE); 379 gtk_icon_source_set_direction_wildcarded(source, TRUE);
342 gtk_icon_source_set_size(source, GTK_ICON_SIZE_MENU); 380 gtk_icon_source_set_size(source, GTK_ICON_SIZE_MENU);
343 gtk_icon_source_set_size_wildcarded(source, FALSE); 381 gtk_icon_source_set_size_wildcarded(source, FALSE);
344 gtk_icon_source_set_state_wildcarded(source, TRUE); 382 gtk_icon_source_set_state_wildcarded(source, TRUE);
345 gtk_icon_set_add_source(iconset, source); 383 gtk_icon_set_add_source(iconset, source);
346 gtk_icon_source_free(source); 384 gtk_icon_source_free(source);
347 } 385 }
348 g_free(filename); 386 g_free(filename);
349 g_object_unref(pixbuf); 387 g_object_unref(pixbuf);
350 388
351 if (sized_icon.rtl) { 389 if (sized_icon.rtl) {
352 filename = find_icon_file(theme, size, sized_icon, TRUE); 390 filename = find_icon_file(theme, size, sized_icon, TRUE);
391 g_return_if_fail(filename != NULL);
353 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); 392 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
354 if (translucent) 393 if (translucent)
355 do_alphashift(pixbuf, pixbuf); 394 do_alphashift(pixbuf, pixbuf);
356 395
357 source = gtk_icon_source_new(); 396 source = gtk_icon_source_new();
358 gtk_icon_source_set_pixbuf(source, pixbuf); 397 gtk_icon_source_set_pixbuf(source, pixbuf);
359 gtk_icon_source_set_filename(source, filename); 398 gtk_icon_source_set_filename(source, filename);
360 gtk_icon_source_set_direction(source, GTK_TEXT_DIR_RTL); 399 gtk_icon_source_set_direction(source, GTK_TEXT_DIR_RTL);
361 gtk_icon_source_set_size(source, sizeid); 400 gtk_icon_source_set_size(source, sizeid);
362 gtk_icon_source_set_size_wildcarded(source, FALSE); 401 gtk_icon_source_set_size_wildcarded(source, FALSE);
363 gtk_icon_source_set_state_wildcarded(source, TRUE); 402 gtk_icon_source_set_state_wildcarded(source, TRUE);
364 gtk_icon_set_add_source(iconset, source); 403 gtk_icon_set_add_source(iconset, source);
365 g_free(filename); 404 g_free(filename);
366 g_object_unref(pixbuf); 405 g_object_unref(pixbuf);
367 gtk_icon_source_free(source); 406 gtk_icon_source_free(source);
368 } 407 }
369 } 408 }
370 409
371 /***************************************************************************** 410 /*****************************************************************************
372 * Public API functions 411 * Public API functions
373 *****************************************************************************/ 412 *****************************************************************************/
485 gtk_icon_source_set_filename(source, filename); 524 gtk_icon_source_set_filename(source, filename);
486 gtk_icon_source_set_direction_wildcarded(source, TRUE); 525 gtk_icon_source_set_direction_wildcarded(source, TRUE);
487 gtk_icon_source_set_size_wildcarded(source, TRUE); 526 gtk_icon_source_set_size_wildcarded(source, TRUE);
488 gtk_icon_source_set_state_wildcarded(source, TRUE); 527 gtk_icon_source_set_state_wildcarded(source, TRUE);
489 528
490
491 iconset = gtk_icon_set_new(); 529 iconset = gtk_icon_set_new();
492 gtk_icon_set_add_source(iconset, source); 530 gtk_icon_set_add_source(iconset, source);
493 531
494 gtk_icon_source_free(source); 532 gtk_icon_source_free(source);
495 g_free(filename); 533 g_free(filename);