/* * DO NOT EDIT THIS FILE - it is generated by Glade. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include "support.h" /* This is an internally used function to check if a pixmap file exists. */ static gchar* check_file_exists (const gchar *directory, const gchar *filename); /* This is an internally used function to create pixmaps. */ static GtkWidget* create_dummy_pixmap (GtkWidget *widget); GtkWidget* lookup_widget (GtkWidget *widget, const gchar *widget_name) { GtkWidget *parent, *found_widget; for (;;) { if (GTK_IS_MENU (widget)) parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); else parent = widget->parent; if (parent == NULL) break; widget = parent; } found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget), widget_name); if (!found_widget) g_warning ("Widget not found: %s", widget_name); return found_widget; } /* This is a dummy pixmap we use when a pixmap can't be found. */ static char *dummy_pixmap_xpm[] = { /* columns rows colors chars-per-pixel */ "1 1 1 1", " c None", /* pixels */ " " }; /* This is an internally used function to create pixmaps. */ static GtkWidget* create_dummy_pixmap (GtkWidget *widget) { GdkColormap *colormap; GdkPixmap *gdkpixmap; GdkBitmap *mask; GtkWidget *pixmap; colormap = gtk_widget_get_colormap (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."); pixmap = gtk_pixmap_new (gdkpixmap, mask); gdk_pixmap_unref (gdkpixmap); gdk_bitmap_unref (mask); return pixmap; } static GList *pixmaps_directories = NULL; /* Use this function to set the directory containing installed pixmaps. */ void add_pixmap_directory (const gchar *directory) { pixmaps_directories = g_list_prepend (pixmaps_directories, g_strdup (directory)); } /* This is an internally used function to create pixmaps. */ GtkWidget* create_pixmap (GtkWidget *widget, const gchar *filename) { GtkWidget *pixmap; GdkPixbuf *icon; GtkWidget *smallphotobutton; gint width, height; gfloat scale, scale_width = 2.72, scale_height = 3.14; //const guint maxwidth = 32, maxheight = 32; guint maxwidth = 32, maxheight = 32; icon = gpe_find_icon (filename); width = gdk_pixbuf_get_width (icon); height = gdk_pixbuf_get_height (icon); /* g_message ("image is %d x %d", width, height); */ smallphotobutton = lookup_widget (widget, "smallphotobutton"); maxwidth = smallphotobutton->allocation.width; maxheight = smallphotobutton->allocation.height; /* g_message ("allocation: %d x %d", maxwidth, maxheight); */ if (width > maxwidth) scale_width = (gfloat) maxwidth / width; else scale_width = 1.0; if (height > maxheight) scale_height = (gfloat) maxheight / height; else scale_height = 1.0; /* g_message ("scale_width: %f, scale_height: %f", scale_width, scale_height); */ scale = scale_width < scale_height ? scale_width : scale_height; /* g_message ("scale: %f", scale); */ pixmap = gpe_render_icon (widget->style, gdk_pixbuf_scale_simple (icon, width * scale, height * scale, GDK_INTERP_BILINEAR)); /* gdk_pixbuf_unref(icon); FIXME: needed? gives trouble... */ return pixmap; } /* This is an internally used function to create pixmaps. */ GtkWidget* create_pixmap_big (GtkWidget *widget, const gchar *filename) { GtkWidget *pixmap; GdkPixbuf *icon; gint width, height; gfloat scale, scale_width = 2.72, scale_height = 3.14; const guint maxwidth = 100, maxheight = 100; icon = gpe_find_icon (filename); width = gdk_pixbuf_get_width (icon); height = gdk_pixbuf_get_height (icon); /* g_message ("image is %d x %d", width, height); g_message ("big photo allocation: %d x %d", widget->allocation.width, widget->allocation.height); */ if (width > maxwidth) scale_width = (gfloat) maxwidth / width; else scale_width = 1.0; if (height > maxheight) scale_height = (gfloat) maxheight / height; else scale_height = 1.0; /* g_message ("scale_width: %f, scale_height: %f", scale_width, scale_height); */ scale = scale_width < scale_height ? scale_width : scale_height; /* g_message ("scale: %f", scale); */ pixmap = gpe_render_icon (widget->style, gdk_pixbuf_scale_simple (icon, width * scale, height * scale, GDK_INTERP_BILINEAR)); /* gdk_pixbuf_unref(icon); FIXME: needed? gives trouble... */ return pixmap; } /* This is an internally used function to create pixmaps. */ GtkWidget* create_pixmap_orig (GtkWidget *widget, const gchar *filename) { gchar *found_filename = NULL; GdkColormap *colormap; GdkPixmap *gdkpixmap; GdkBitmap *mask; GtkWidget *pixmap; GList *elem; if (!filename || !filename[0]) return create_dummy_pixmap (widget); /* We first try any pixmaps directories set by the application. */ elem = pixmaps_directories; while (elem) { found_filename = check_file_exists ((gchar*)elem->data, filename); if (found_filename) break; elem = elem->next; } /* If we haven't found the pixmap, try the source directory. */ if (!found_filename) { found_filename = check_file_exists ("../pixmaps", filename); } if (!found_filename) { g_warning (_("Couldn't find pixmap file: %s"), filename); return create_dummy_pixmap (widget); } colormap = gtk_widget_get_colormap (widget); gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask, NULL, found_filename); if (gdkpixmap == NULL) { g_warning (_("Error loading pixmap file: %s"), found_filename); g_free (found_filename); return create_dummy_pixmap (widget); } g_free (found_filename); pixmap = gtk_pixmap_new (gdkpixmap, mask); gdk_pixmap_unref (gdkpixmap); gdk_bitmap_unref (mask); return pixmap; } /* This is an internally used function to check if a pixmap file exists. */ static 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); status = stat (full_filename, &s); if (status == 0 && S_ISREG (s.st_mode)) return full_filename; g_free (full_filename); return NULL; }