|
|
1.1 root 1: /*
2: * DO NOT EDIT THIS FILE - it is generated by Glade.
3: */
4:
5: #ifdef HAVE_CONFIG_H
6: # include <config.h>
7: #endif
8:
9: #include <sys/types.h>
10: #include <sys/stat.h>
11: #include <unistd.h>
12: #include <string.h>
13:
14: #include <gtk/gtk.h>
15:
16: #include "support.h"
17:
18: /* This is an internally used function to check if a pixmap file exists. */
19: static gchar* check_file_exists (const gchar *directory,
20: const gchar *filename);
21:
22: /* This is an internally used function to create pixmaps. */
23: static GtkWidget* create_dummy_pixmap (GtkWidget *widget);
24:
25: GtkWidget*
26: lookup_widget (GtkWidget *widget,
27: const gchar *widget_name)
28: {
29: GtkWidget *parent, *found_widget;
30:
31: for (;;)
32: {
33: if (GTK_IS_MENU (widget))
34: parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
35: else
36: parent = widget->parent;
37: if (parent == NULL)
38: break;
39: widget = parent;
40: }
41:
42: found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget),
43: widget_name);
44: if (!found_widget)
45: g_warning ("Widget not found: %s", widget_name);
46: return found_widget;
47: }
48:
49: /* This is a dummy pixmap we use when a pixmap can't be found. */
50: static char *dummy_pixmap_xpm[] = {
51: /* columns rows colors chars-per-pixel */
52: "1 1 1 1",
53: " c None",
54: /* pixels */
55: " "
56: };
57:
58: /* This is an internally used function to create pixmaps. */
59: static GtkWidget*
60: create_dummy_pixmap (GtkWidget *widget)
61: {
62: GdkColormap *colormap;
63: GdkPixmap *gdkpixmap;
64: GdkBitmap *mask;
65: GtkWidget *pixmap;
66:
67: colormap = gtk_widget_get_colormap (widget);
68: gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask,
69: NULL, dummy_pixmap_xpm);
70: if (gdkpixmap == NULL)
71: g_error ("Couldn't create replacement pixmap.");
72: pixmap = gtk_pixmap_new (gdkpixmap, mask);
73: gdk_pixmap_unref (gdkpixmap);
74: gdk_bitmap_unref (mask);
75: return pixmap;
76: }
77:
78: static GList *pixmaps_directories = NULL;
79:
80: /* Use this function to set the directory containing installed pixmaps. */
81: void
82: add_pixmap_directory (const gchar *directory)
83: {
84: pixmaps_directories = g_list_prepend (pixmaps_directories,
85: g_strdup (directory));
86: }
87:
88: /* This is an internally used function to create pixmaps. */
89: GtkWidget*
90: create_pixmap (GtkWidget *widget,
91: const gchar *filename)
92: {
93: gchar *found_filename = NULL;
94: GdkColormap *colormap;
95: GdkPixmap *gdkpixmap;
96: GdkBitmap *mask;
97: GtkWidget *pixmap;
98: GList *elem;
99:
100: if (!filename || !filename[0])
101: return create_dummy_pixmap (widget);
102:
103: /* We first try any pixmaps directories set by the application. */
104: elem = pixmaps_directories;
105: while (elem)
106: {
107: found_filename = check_file_exists ((gchar*)elem->data, filename);
108: if (found_filename)
109: break;
110: elem = elem->next;
111: }
112:
113: /* If we haven't found the pixmap, try the source directory. */
114: if (!found_filename)
115: {
116: found_filename = check_file_exists ("pixmaps", filename);
117: }
118:
119: if (!found_filename)
120: {
121: g_warning ("Couldn't find pixmap file: %s", filename);
122: return create_dummy_pixmap (widget);
123: }
124:
125: colormap = gtk_widget_get_colormap (widget);
126: gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask,
127: NULL, found_filename);
128: if (gdkpixmap == NULL)
129: {
130: g_warning ("Error loading pixmap file: %s", found_filename);
131: g_free (found_filename);
132: return create_dummy_pixmap (widget);
133: }
134: g_free (found_filename);
135: pixmap = gtk_pixmap_new (gdkpixmap, mask);
136: gdk_pixmap_unref (gdkpixmap);
137: gdk_bitmap_unref (mask);
138: return pixmap;
139: }
140:
141: /* This is an internally used function to check if a pixmap file exists. */
142: gchar*
143: check_file_exists (const gchar *directory,
144: const gchar *filename)
145: {
146: gchar *full_filename;
147: struct stat s;
148: gint status;
149:
150: full_filename = (gchar*) g_malloc (strlen (directory) + 1
151: + strlen (filename) + 1);
152: strcpy (full_filename, directory);
153: strcat (full_filename, G_DIR_SEPARATOR_S);
154: strcat (full_filename, filename);
155:
156: status = stat (full_filename, &s);
157: if (status == 0 && S_ISREG (s.st_mode))
158: return full_filename;
159: g_free (full_filename);
160: return NULL;
161: }
162:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.