talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 5afb1c001ef1dcc080b49772c715c86f5e66f728
parent d02ea3969d2ea7051c74ac0547ee3b36f7705e20
Author: Colin Leroy <colin@colino.net>
Date:   Thu, 20 Mar 2008 17:42:00 +0000

2008-03-20 [colin]	3.3.1cvs33

	* src/stock_pixmap.c
		Add support for png themes

Diffstat:
MChangeLog | 5+++++
MPATCHSETS | 1+
Mconfigure.ac | 2+-
Msrc/stock_pixmap.c | 203++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
4 files changed, 146 insertions(+), 65 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,8 @@ +2008-03-20 [colin] 3.3.1cvs33 + + * src/stock_pixmap.c + Add support for png themes + 2008-03-19 [wwp] 3.3.1cvs32 * src/procheader.c diff --git a/PATCHSETS b/PATCHSETS @@ -3267,3 +3267,4 @@ ( cvs diff -u -r 1.179.2.213 -r 1.179.2.214 src/imap.c; ) > 3.3.1cvs30.patchset ( cvs diff -u -r 1.36.2.135 -r 1.36.2.136 src/common/utils.c; cvs diff -u -r 1.20.2.59 -r 1.20.2.60 src/common/utils.h; ) > 3.3.1cvs31.patchset ( cvs diff -u -r 1.47.2.46 -r 1.47.2.47 src/procheader.c; ) > 3.3.1cvs32.patchset +( cvs diff -u -r 1.25.2.52 -r 1.25.2.53 src/stock_pixmap.c; ) > 3.3.1cvs33.patchset diff --git a/configure.ac b/configure.ac @@ -11,7 +11,7 @@ MINOR_VERSION=3 MICRO_VERSION=1 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=32 +EXTRA_VERSION=33 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/stock_pixmap.c b/src/stock_pixmap.c @@ -203,10 +203,15 @@ typedef struct _OverlayData OverlayData; struct _OverlayData { + gboolean is_pixmap; GdkPixmap *base_pixmap; GdkBitmap *base_mask; GdkPixmap *overlay_pixmap; GdkBitmap *overlay_mask; + + GdkPixbuf *base_pixbuf; + GdkPixbuf *overlay_pixbuf; + guint base_height; guint base_width; guint overlay_height; @@ -386,14 +391,13 @@ static StockPixmapData pixmaps[] = /* return newly constructed GtkPixmap from GdkPixmap */ GtkWidget *stock_pixmap_widget(GtkWidget *window, StockPixmap icon) { - GdkPixmap *pixmap; - GdkBitmap *mask; + GdkPixbuf *pixbuf; g_return_val_if_fail(window != NULL, NULL); g_return_val_if_fail(icon >= 0 && icon < N_STOCK_PIXMAPS, NULL); - if (stock_pixmap_gdk(window, icon, &pixmap, &mask) != -1) - return gtk_image_new_from_pixmap(pixmap, mask); + if (stock_pixbuf_gdk(window, icon, &pixbuf) != -1) + return gtk_image_new_from_pixbuf(pixbuf); return NULL; } @@ -404,6 +408,8 @@ GtkWidget *stock_pixmap_widget(GtkWidget *window, StockPixmap icon) gint stock_pixbuf_gdk(GtkWidget *window, StockPixmap icon, GdkPixbuf **pixbuf) { StockPixmapData *pix_d; + static const char *extension[]={".png", ".xpm", NULL}; + int i = 0; if (pixbuf) *pixbuf = NULL; @@ -418,11 +424,11 @@ gint stock_pixbuf_gdk(GtkWidget *window, StockPixmap icon, GdkPixbuf **pixbuf) if (strcmp(prefs_common.pixmap_theme_path, DEFAULT_PIXMAP_THEME) != 0) { if (is_dir_exist(prefs_common.pixmap_theme_path)) { char *icon_file_name; - +try_next_extension: icon_file_name = g_strconcat(prefs_common.pixmap_theme_path, G_DIR_SEPARATOR_S, pix_d->file, - ".xpm", + extension[i], NULL); if (is_file_exist(icon_file_name)) { GError *err = NULL; @@ -434,6 +440,11 @@ gint stock_pixbuf_gdk(GtkWidget *window, StockPixmap icon, GdkPixbuf **pixbuf) pix_d->icon_path = g_strdup(prefs_common.pixmap_theme_path); } g_free(icon_file_name); + if (!pix) { + i++; + if (extension[i]) + goto try_next_extension; + } } else { /* even the path does not exist (deleted between two sessions), so set the preferences to the internal theme */ @@ -466,6 +477,8 @@ gint stock_pixmap_gdk(GtkWidget *window, StockPixmap icon, GdkPixmap **pixmap, GdkBitmap **mask) { StockPixmapData *pix_d; + static const char *extension[]={".png", ".xpm", NULL}; + int i = 0; if (pixmap) *pixmap = NULL; if (mask) *mask = NULL; @@ -481,11 +494,11 @@ gint stock_pixmap_gdk(GtkWidget *window, StockPixmap icon, if (strcmp(prefs_common.pixmap_theme_path, DEFAULT_PIXMAP_THEME) != 0) { if ( is_dir_exist(prefs_common.pixmap_theme_path) ) { char *icon_file_name; - +try_next_extension: icon_file_name = g_strconcat(prefs_common.pixmap_theme_path, G_DIR_SEPARATOR_S, pix_d->file, - ".xpm", + extension[i], NULL); if (is_file_exist(icon_file_name)) PIXMAP_CREATE_FROM_FILE(window, pix, pix_d->mask, icon_file_name); @@ -494,6 +507,11 @@ gint stock_pixmap_gdk(GtkWidget *window, StockPixmap icon, pix_d->icon_path = g_strdup(prefs_common.pixmap_theme_path); } g_free(icon_file_name); + if (!pix) { + i++; + if (extension[i]) + goto try_next_extension; + } } else { /* even the path does not exist (deleted between two sessions), so set the preferences to the internal theme */ @@ -525,6 +543,7 @@ static void stock_pixmap_find_themes_in_dir(GList **list, const gchar *dirname) { struct dirent *d; DIR *dp; + static const char *extension[]={".png", ".xpm", NULL}; if ((dp = opendir(dirname)) == NULL) { debug_print("dir %s not found, skipping theme scan", dirname?dirname:"(null)"); @@ -540,16 +559,18 @@ static void stock_pixmap_find_themes_in_dir(GList **list, const gchar *dirname) if (strcmp(entry, ".") != 0 && strcmp(entry, "..") != 0 && is_dir_exist(fullentry)) { gchar *filetoexist; + gboolean found = FALSE; int i; - - for (i = 0; i < N_STOCK_PIXMAPS; i++) { - filetoexist = g_strconcat(fullentry, G_DIR_SEPARATOR_S, pixmaps[i].file, ".xpm", NULL); - if (is_file_exist(filetoexist)) { - *list = g_list_append(*list, fullentry); + int j; + for (i = 0; i < N_STOCK_PIXMAPS && !found; i++) { + for (j = 0; extension[j] && !found; j++) { + filetoexist = g_strconcat(fullentry, G_DIR_SEPARATOR_S, pixmaps[i].file, extension[j], NULL); + if (is_file_exist(filetoexist)) { + *list = g_list_append(*list, fullentry); + found = TRUE; + } g_free(filetoexist); - break; } - g_free(filetoexist); } if (i == N_STOCK_PIXMAPS) g_free(fullentry); @@ -618,9 +639,12 @@ static gboolean pixmap_with_overlay_expose_event_cb(GtkWidget *widget, GdkEventE gint left = 0; gint top = 0; - g_return_val_if_fail(data->base_pixmap != NULL, FALSE); - g_return_val_if_fail(data->base_mask != NULL, FALSE); - + if (data->is_pixmap) { + g_return_val_if_fail(data->base_pixmap != NULL, FALSE); + g_return_val_if_fail(data->base_mask != NULL, FALSE); + } else { + g_return_val_if_fail(data->base_pixbuf != NULL, FALSE); + } gc_pix = gdk_gc_new((GdkWindow *)drawable); gdk_window_clear_area (drawable, expose->area.x, expose->area.y, @@ -643,21 +667,22 @@ static gboolean pixmap_with_overlay_expose_event_cb(GtkWidget *widget, GdkEventE } } - gdk_gc_set_tile(gc_pix, data->base_pixmap); - gdk_gc_set_ts_origin(gc_pix, data->border_x, data->border_y); - gdk_gc_set_clip_mask(gc_pix, data->base_mask); - gdk_gc_set_clip_origin(gc_pix, data->border_x, data->border_y); - gdk_gc_set_fill(gc_pix, GDK_TILED); - - gdk_draw_rectangle(drawable, gc_pix, TRUE, data->border_x, data->border_y, + if (data->is_pixmap) { + gdk_gc_set_tile(gc_pix, data->base_pixmap); + gdk_gc_set_ts_origin(gc_pix, data->border_x, data->border_y); + gdk_gc_set_clip_mask(gc_pix, data->base_mask); + gdk_gc_set_clip_origin(gc_pix, data->border_x, data->border_y); + gdk_gc_set_fill(gc_pix, GDK_TILED); + gdk_draw_rectangle(drawable, gc_pix, TRUE, data->border_x, data->border_y, data->base_width, data->base_height); + } else { + gdk_draw_pixbuf(drawable, gc_pix, data->base_pixbuf, + 0, 0, data->border_x, data->border_y, + -1, -1, GDK_RGB_DITHER_NONE, 0, 0); + } - if (data->position != OVERLAY_NONE) { - g_return_val_if_fail(data->overlay_pixmap != NULL, FALSE); - g_return_val_if_fail(data->overlay_mask != NULL, FALSE); - gdk_gc_set_tile(gc_pix, data->overlay_pixmap); - gdk_gc_set_clip_mask(gc_pix, data->overlay_mask); + if (data->position != OVERLAY_NONE) { switch (data->position) { case OVERLAY_TOP_LEFT: @@ -703,12 +728,26 @@ static gboolean pixmap_with_overlay_expose_event_cb(GtkWidget *widget, GdkEventE default: break; } - - gdk_gc_set_ts_origin(gc_pix, left, top); - gdk_gc_set_clip_origin(gc_pix, left, top); - gdk_gc_set_fill(gc_pix, GDK_TILED); - gdk_draw_rectangle(drawable, gc_pix, TRUE, left, top, + } + if (data->position != OVERLAY_NONE) { + if (data->is_pixmap) { + g_return_val_if_fail(data->overlay_pixmap != NULL, FALSE); + g_return_val_if_fail(data->overlay_mask != NULL, FALSE); + gdk_gc_set_tile(gc_pix, data->overlay_pixmap); + gdk_gc_set_clip_mask(gc_pix, data->overlay_mask); + + gdk_gc_set_ts_origin(gc_pix, left, top); + gdk_gc_set_clip_origin(gc_pix, left, top); + gdk_gc_set_fill(gc_pix, GDK_TILED); + gdk_draw_rectangle(drawable, gc_pix, TRUE, left, top, data->overlay_width, data->overlay_height); + } else { + g_return_val_if_fail(data->overlay_pixbuf != NULL, FALSE); + gdk_draw_pixbuf(drawable, gc_pix, data->overlay_pixbuf, + 0, 0, left, top, + -1, -1, GDK_RGB_DITHER_NONE, 0, 0); + + } } g_object_unref(gc_pix); @@ -717,11 +756,18 @@ static gboolean pixmap_with_overlay_expose_event_cb(GtkWidget *widget, GdkEventE static void pixmap_with_overlay_destroy_cb(GtkObject *object, OverlayData *data) { - g_object_unref(data->base_pixmap); - g_object_unref(data->base_mask); - if (data->position != OVERLAY_NONE) { - g_object_unref(data->overlay_pixmap); - g_object_unref(data->overlay_mask); + if (data->is_pixmap) { + g_object_unref(data->base_pixmap); + g_object_unref(data->base_mask); + if (data->position != OVERLAY_NONE) { + g_object_unref(data->overlay_pixmap); + g_object_unref(data->overlay_mask); + } + } else { + g_object_unref(data->base_pixbuf); + if (data->position != OVERLAY_NONE) { + g_object_unref(data->overlay_pixbuf); + } } g_free(data); } @@ -743,40 +789,69 @@ GtkWidget *stock_pixmap_widget_with_overlay(GtkWidget *window, StockPixmap icon, StockPixmap overlay, OverlayPosition pos, gint border_x, gint border_y) { - GdkPixmap *stock_pixmap; - GdkBitmap *stock_mask; - GtkWidget *widget; - GtkWidget *stock_wid; - OverlayData *data; + GdkPixmap *stock_pixmap = NULL; + GdkBitmap *stock_mask = NULL; + GdkPixbuf *stock_pixbuf = NULL; + GtkWidget *widget = NULL; + GtkWidget *stock_wid = NULL; + OverlayData *data = NULL; data = g_new0(OverlayData, 1); stock_wid = stock_pixmap_widget(window, icon); - gtk_image_get_pixmap(GTK_IMAGE(stock_wid), &stock_pixmap, &stock_mask); - g_object_ref(stock_pixmap); - g_object_ref(stock_mask); - data->base_pixmap = stock_pixmap; - data->base_mask = stock_mask; - data->base_height = stock_wid->requisition.height; - data->base_width = stock_wid->requisition.width; - gtk_widget_destroy(stock_wid); - - if (pos == OVERLAY_NONE) { - data->overlay_pixmap = NULL; - data->overlay_mask = NULL; - } else { - stock_wid = stock_pixmap_widget(window, overlay); + + if (gtk_image_get_storage_type(GTK_IMAGE(stock_wid)) == GTK_IMAGE_PIXMAP) + data->is_pixmap = TRUE; + else + data->is_pixmap = FALSE; + + if (data->is_pixmap) { gtk_image_get_pixmap(GTK_IMAGE(stock_wid), &stock_pixmap, &stock_mask); g_object_ref(stock_pixmap); g_object_ref(stock_mask); - data->overlay_pixmap = stock_pixmap; - data->overlay_mask = stock_mask; - data->overlay_height = stock_wid->requisition.height; - data->overlay_width = stock_wid->requisition.width; + data->base_pixmap = stock_pixmap; + data->base_mask = stock_mask; + data->base_height = stock_wid->requisition.height; + data->base_width = stock_wid->requisition.width; + gtk_widget_destroy(stock_wid); + if (pos == OVERLAY_NONE) { + data->overlay_pixmap = NULL; + data->overlay_mask = NULL; + } else { + stock_wid = stock_pixmap_widget(window, overlay); + gtk_image_get_pixmap(GTK_IMAGE(stock_wid), &stock_pixmap, &stock_mask); + g_object_ref(stock_pixmap); + g_object_ref(stock_mask); + data->overlay_pixmap = stock_pixmap; + data->overlay_mask = stock_mask; + data->overlay_height = stock_wid->requisition.height; + data->overlay_width = stock_wid->requisition.width; + + gtk_widget_destroy(stock_wid); + } + } else { + data->is_pixmap = FALSE; + stock_pixbuf = gtk_image_get_pixbuf(GTK_IMAGE(stock_wid)); + g_object_ref(stock_pixbuf); + data->base_pixbuf = stock_pixbuf; + data->base_height = stock_wid->requisition.height; + data->base_width = stock_wid->requisition.width; gtk_widget_destroy(stock_wid); + if (pos == OVERLAY_NONE) { + data->overlay_pixmap = NULL; + data->overlay_mask = NULL; + } else { + stock_wid = stock_pixmap_widget(window, overlay); + stock_pixbuf = gtk_image_get_pixbuf(GTK_IMAGE(stock_wid)); + g_object_ref(stock_pixbuf); + data->overlay_pixbuf = stock_pixbuf; + data->overlay_height = stock_wid->requisition.height; + data->overlay_width = stock_wid->requisition.width; + + gtk_widget_destroy(stock_wid); + } } - data->position = pos; data->border_x = border_x; data->border_y = border_y;