| 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 *****************************************************************************/ |