From e9725cec41565e2324f9de8b7fae6beacbca4adc Mon Sep 17 00:00:00 2001 From: Ludwig Nussel Date: Fri, 28 Nov 2003 22:50:04 +0000 Subject: [PATCH] - split up load_pixmap in load_pixmap, load_pixmap_as_pixmap and load_pixmap_as_pixbuf - set minimize icon as suggested by Jordi (someone know how to make this work properly with windowmaker?) - work around gcc complaining about %c in strftime git-svn-id: http://svn.code.sf.net/p/xqf/code/trunk@563 d2ac09be-c843-0410-8b1f-f8a84130e0ec --- xqf/ChangeLog | 7 +++ xqf/src/Makefile.am | 1 + xqf/src/loadpixmap.c | 137 +++++++++++++++++++++++++++++-------------- xqf/src/loadpixmap.h | 14 +++-- xqf/src/splash.c | 1 + xqf/src/utils.c | 7 ++- xqf/src/xqf.c | 10 ++++ xqf/src/xqf.h | 2 + xqf/src/xutils.c | 24 ++++++++ xqf/src/xutils.h | 2 + 10 files changed, 154 insertions(+), 51 deletions(-) diff --git a/xqf/ChangeLog b/xqf/ChangeLog index 850b05f..e6c0e25 100644 --- a/xqf/ChangeLog +++ b/xqf/ChangeLog @@ -1,3 +1,10 @@ +Nov 28, 2003: Ludwig Nussel +- split up load_pixmap in load_pixmap, load_pixmap_as_pixmap and + load_pixmap_as_pixbuf +- set minimize icon as suggested by Jordi (someone know how to make this + work properly with windowmaker?) +- work around gcc complaining about %c in strftime + Nov 27, 2003: Alex - Changed version to 0.9.13.1 diff --git a/xqf/src/Makefile.am b/xqf/src/Makefile.am index 7352e17..549a549 100644 --- a/xqf/src/Makefile.am +++ b/xqf/src/Makefile.am @@ -4,6 +4,7 @@ localedir = $(datadir)/locale INCLUDES = -I$(top_srcdir)/intl \ -DLOCALEDIR=\"$(localedir)\" \ -DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" \ + -DPIXMAPSDIR=\"$(datadir)/pixmaps\" \ $(GTK_CFLAGS) \ $(QSTAT23) \ $(DEBUG) \ diff --git a/xqf/src/loadpixmap.c b/xqf/src/loadpixmap.c index 46e3f5c..23feca6 100644 --- a/xqf/src/loadpixmap.c +++ b/xqf/src/loadpixmap.c @@ -30,10 +30,12 @@ #include #include "loadpixmap.h" +#include "pixmaps.h" #include "i18n.h" +#include "debug.h" /* This is an internally used function to check if a pixmap file exists. */ -static gchar* check_file_exists (const gchar *directory, +gchar* check_file_exists (const gchar *directory, const gchar *filename); /* This is an internally used function to create pixmaps. */ @@ -62,7 +64,7 @@ create_dummy_pixmap (GtkWidget *widget) gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask, NULL, dummy_pixmap_xpm); if (gdkpixmap == NULL) - g_error ("Couldn't create replacement pixmap."); + xqf_error ("Couldn't create replacement pixmap."); pixmap = gtk_pixmap_new (gdkpixmap, mask); gdk_pixmap_unref (gdkpixmap); gdk_bitmap_unref (mask); @@ -95,40 +97,62 @@ gchar* find_pixmap_directory(const gchar* filename) return found_filename; } -/* This is an internally used function to create pixmaps. */ -GtkWidget* -load_pixmap (GtkWidget *widget, - const gchar *filename) +GtkWidget* load_pixmap (GtkWidget* widget, const gchar* filename) +{ + GtkWidget *pixmap; + struct pixmap pix; + if(!load_pixmap_as_pixmap(widget, filename, &pix)) + { + return create_dummy_pixmap(widget); + } + + pixmap = gtk_pixmap_new (pix.pix, pix.mask); + gdk_pixmap_unref (pix.pix); + if(pix.mask) gdk_bitmap_unref (pix.mask); + return pixmap; +} + +/** find a pixmap file either absolute or in the pixmap search path. + * @returns filename if file exists, NULL otherwise. must be freed + */ +static char* find_pixmap_file(const char* filename) +{ + char *found_filename = NULL; + + g_return_val_if_fail(filename!=NULL,NULL); + + if (!filename[0]) + return NULL; + + // load absolute paths directly + if(filename[0]=='/') + found_filename = check_file_exists(NULL, filename); + else + found_filename = find_pixmap_directory(filename); + + return found_filename; +} + +struct pixmap* load_pixmap_as_pixmap (GtkWidget* widget, const gchar* filename, struct pixmap* pix) { gchar *found_filename = NULL; - GdkColormap *colormap; - GdkPixmap *gdkpixmap; - GdkBitmap *mask; - GtkWidget *pixmap; + GdkColormap *colormap = NULL; - if (!filename || !filename[0]) - return create_dummy_pixmap (widget); + g_return_val_if_fail(widget!=NULL,NULL); + g_return_val_if_fail(pix!=NULL,NULL); - found_filename = find_pixmap_directory(filename); + found_filename = find_pixmap_file(filename); -#if 0 //crap... - /* If we haven't found the pixmap, try the source directory. */ - if (!found_filename) + if(!found_filename) { - found_filename = check_file_exists ("src/xpm", filename); - } -#endif - - if (!found_filename) - { - g_warning (_("Couldn't find pixmap file: %s"), filename); - return create_dummy_pixmap (widget); + xqf_warning (_("Error loading pixmap file: %s"), filename); + return NULL; } if(strlen(found_filename)>4 && !strcmp(found_filename+strlen(found_filename)-4,".xpm")) { colormap = gtk_widget_get_colormap (widget); - gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask, + pix->pix = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &pix->mask, NULL, found_filename); } else @@ -142,43 +166,67 @@ load_pixmap (GtkWidget *widget, #endif if (pixbuf == NULL) { - g_warning (_("Error loading pixmap file: %s"), found_filename); + xqf_warning (_("Error loading pixmap file: %s"), found_filename); g_free (found_filename); - return create_dummy_pixmap (widget); + return NULL; } - gdk_pixbuf_render_pixmap_and_mask(pixbuf,&gdkpixmap,&mask,255); + gdk_pixbuf_render_pixmap_and_mask(pixbuf,&pix->pix,&pix->mask,255); gdk_pixbuf_unref(pixbuf); } - if (gdkpixmap == NULL) + if (pix->pix == NULL) { - g_warning (_("Error loading pixmap file: %s"), found_filename); + xqf_warning (_("Error loading pixmap file: %s"), found_filename); g_free (found_filename); - return create_dummy_pixmap (widget); + return NULL; } g_free (found_filename); - pixmap = gtk_pixmap_new (gdkpixmap, mask); - gdk_pixmap_unref (gdkpixmap); - if(mask) gdk_bitmap_unref (mask); - return pixmap; + + return pix; } -/* This is an internally used function to check if a pixmap file exists. */ -static gchar* -check_file_exists (const gchar *directory, - const gchar *filename) +void* load_pixmap_as_pixbuf (GtkWidget* widget, const gchar* filename) +{ + gchar *found_filename = NULL; + GdkPixbuf* pixbuf = NULL; + + g_return_val_if_fail(widget!=NULL,NULL); + + found_filename = find_pixmap_file(filename); + + if(!found_filename) + { + xqf_warning (_("Error loading pixmap file: %s"), filename); + return NULL; + } + +/*FIXME_GTK2: need GError*/ +#ifdef USE_GTK2 + pixbuf = gdk_pixbuf_new_from_file(found_filename, NULL); +#else + pixbuf = gdk_pixbuf_new_from_file(found_filename); +#endif + if (pixbuf == NULL) + xqf_warning (_("Error loading pixmap file: %s"), found_filename); + + g_free (found_filename); + + return pixbuf; +} + +/** directory may be null */ +gchar* check_file_exists (const gchar* directory, const gchar* filename) { gchar *full_filename; struct stat s; gint status; - full_filename = (gchar*) g_malloc (strlen (directory) + 1 - + strlen (filename) + 1); - strcpy (full_filename, directory); - strcat (full_filename, G_DIR_SEPARATOR_S); - strcat (full_filename, filename); + if(directory) + full_filename = g_strconcat(directory, G_DIR_SEPARATOR_S, filename, NULL); + else + full_filename = g_strdup(filename); status = stat (full_filename, &s); if (status == 0 && S_ISREG (s.st_mode)) @@ -186,4 +234,3 @@ check_file_exists (const gchar *directory, g_free (full_filename); return NULL; } - diff --git a/xqf/src/loadpixmap.h b/xqf/src/loadpixmap.h index 3143458..fcff5a7 100644 --- a/xqf/src/loadpixmap.h +++ b/xqf/src/loadpixmap.h @@ -29,10 +29,14 @@ void add_pixmap_directory (const gchar* directory); */ gchar* find_pixmap_directory(const gchar* filename); -/* - * Private Functions. - */ - -/* This is used to create the pixmaps in the interface. */ +/** This is used to create the pixmaps in the interface. */ GtkWidget* load_pixmap (GtkWidget* widget, const gchar* filename); + +/** fill in passed pixmap struct, return pointer to this struct on success, + * NULL otherwise + */ +struct pixmap* load_pixmap_as_pixmap (GtkWidget* widget, const gchar* filename, struct pixmap* pix); + +/** load a pixmap in search path as GdkPixbuf, void* just to avoid a special header */ +void* load_pixmap_as_pixbuf (GtkWidget* widget, const gchar* filename); #endif diff --git a/xqf/src/splash.c b/xqf/src/splash.c index f391b36..ee55231 100644 --- a/xqf/src/splash.c +++ b/xqf/src/splash.c @@ -32,6 +32,7 @@ #include "loadpixmap.h" #include "i18n.h" #include "pref.h" +#include "xutils.h" static GtkWidget* splashscreen; diff --git a/xqf/src/utils.c b/xqf/src/utils.c index e0063b6..549c368 100644 --- a/xqf/src/utils.c +++ b/xqf/src/utils.c @@ -753,6 +753,11 @@ char* resolve_path(const char* path) return dir; } +/** workaround to prevent gcc from complaining about %c as suggested by "man strftime" */ +static inline size_t my_strftime(char *s, size_t max, const char *fmt, const struct tm *tm) { + return strftime(s, max, fmt, tm); +} + // return locale's string representation of t. must be freed manually char* timet2string(const time_t* t) { @@ -762,7 +767,7 @@ char* timet2string(const time_t* t) char* str; gmtime_r(t,&tm_s); - if(!strftime(timebuf,timebuf_len,"%c",&tm_s)) + if(!my_strftime(timebuf,timebuf_len,"%c",&tm_s)) { // error converting time to string representation, shouldn't happen str=_(""); diff --git a/xqf/src/xqf.c b/xqf/src/xqf.c index 47548d6..bef17a4 100644 --- a/xqf/src/xqf.c +++ b/xqf/src/xqf.c @@ -92,6 +92,8 @@ time_t xqf_start_time; char* xqf_PACKAGE_DATA_DIR = PACKAGE_DATA_DIR; char* xqf_LOCALEDIR = LOCALEDIR; +char* xqf_PIXMAPSDIR = PIXMAPSDIR; + char* qstat_configfile = NULL; GtkWidget *main_window = NULL; @@ -3580,6 +3582,8 @@ void create_main_window (void) { restore_main_window_geometry (); + window_set_icon(main_window); + gtk_widget_show (main_window); gtk_window_add_accel_group (GTK_WINDOW (main_window), accel_group); @@ -3750,6 +3754,10 @@ int main (int argc, char *argv[]) { if(var) xqf_LOCALEDIR = var; + var = getenv("xqf_PIXMAPSDIR"); + if(var) + xqf_PIXMAPSDIR = var; + #ifdef ENABLE_NLS setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, xqf_LOCALEDIR); @@ -3785,6 +3793,8 @@ int main (int argc, char *argv[]) { g_free(defaultpixmapdir); } + add_pixmap_directory (xqf_PIXMAPSDIR); + qstat_configfile = g_strconcat(xqf_PACKAGE_DATA_DIR, "/qstat.cfg", NULL); dns_gtk_init (); diff --git a/xqf/src/xqf.h b/xqf/src/xqf.h index dc00731..08540c6 100644 --- a/xqf/src/xqf.h +++ b/xqf/src/xqf.h @@ -239,6 +239,8 @@ struct master { extern time_t xqf_start_time; extern char* xqf_PACKAGE_DATA_DIR; extern char* xqf_LOCALEDIR; +extern char* xqf_PIXMAPSDIR; + extern char* qstat_configfile; extern GSList *cur_source; /* GSList */ diff --git a/xqf/src/xutils.c b/xqf/src/xutils.c index bec9d04..8d13549 100644 --- a/xqf/src/xutils.c +++ b/xqf/src/xutils.c @@ -20,6 +20,9 @@ #include #include +#include "pixmaps.h" +#include "loadpixmap.h" + void iconify_window (GdkWindow *window) { Window xwindow; @@ -35,4 +38,25 @@ void iconify_window (GdkWindow *window) { XIconifyWindow (GDK_DISPLAY (), xwindow, DefaultScreen (GDK_DISPLAY ())); } +static const char* minimize_icon = "xqf_48x48.png"; +void window_set_icon (GtkWidget *win) +{ +#ifdef USE_GTK2 + GdkPixbuf* pixbuf; + pixbuf = load_pixmap_as_pixbuf(minimize_icon); + if(pixbuf) + { + gtk_window_set_icon (GTK_WINDOW (main_window), pixbuf); + gdk_pixbuf_unref (pixbuf); + } +#else + static struct pixmap pix; + + if(!load_pixmap_as_pixmap(win, minimize_icon, &pix)) + return; + + gdk_window_set_icon(win->window, NULL, pix.pix, pix.mask); + gdk_window_set_icon_name(win->window, "XQF"); +#endif +} diff --git a/xqf/src/xutils.h b/xqf/src/xutils.h index 6a9c59f..fbe8235 100644 --- a/xqf/src/xutils.h +++ b/xqf/src/xutils.h @@ -24,5 +24,7 @@ extern void iconify_window (GdkWindow *window); +void window_set_icon (GtkWidget *window); + #endif /* __XUTILS_H__ */