4 * ROX-Filer, filer for the ROX desktop project
5 * Copyright (C) 2000, Thomas Leonard, <tal197@ecs.soton.ac.uk>.
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
19 * Place, Suite 330, Boston, MA 02111-1307 USA
22 /* pixmaps.c - code for handling pixmaps */
25 * 2000/04/11 Imlib support added
26 * Christiansen Merel <c.merel@wanadoo.fr>
32 /* Remove pixmaps from the cache when they haven't been accessed for
33 * this period of time (seconds).
36 #define PIXMAP_PURGE_TIME 1200
43 #include <gdk/gdkprivate.h> /* XXX - find another way to do this */
44 #include "collection.h"
46 # include <gdk_imlib.h>
51 #include "gui_support.h"
54 GFSCache
*pixmap_cache
= NULL
;
56 static char * bad_xpm
[] = {
74 MaskedPixmap
*default_pixmap
[LAST_DEFAULT_PIXMAP
];
76 /* Static prototypes */
78 static MaskedPixmap
*load_pixmap(char *name
);
79 static void load_default_pixmaps(void);
80 static MaskedPixmap
*load(char *pathname
, gpointer data
);
81 static void ref(MaskedPixmap
*mp
, gpointer data
);
82 static void unref(MaskedPixmap
*mp
, gpointer data
);
83 static int getref(MaskedPixmap
*mp
);
84 static gint
purge(gpointer data
);
85 static MaskedPixmap
*image_from_file(char *path
);
86 static MaskedPixmap
*get_bad_image(void);
89 /****************************************************************
90 * EXTERNAL INTERFACE *
91 ****************************************************************/
93 void pixmaps_init(void)
99 pixmap_cache
= g_fscache_new((GFSLoadFunc
) load
,
102 (GFSGetRefFunc
) getref
,
103 NULL
, /* Update func */
106 gtk_timeout_add(10000, purge
, NULL
);
108 load_default_pixmaps();
111 /* 'name' is relative to APP_DIR. Always returns with a valid image. */
112 MaskedPixmap
*load_pixmap(char *name
)
114 MaskedPixmap
*retval
;
116 retval
= image_from_file(make_path(getenv("APP_DIR"), name
)->str
);
118 retval
= get_bad_image();
122 /* Load all the standard pixmaps */
123 static void load_default_pixmaps(void)
125 default_pixmap
[TYPE_ERROR
] = load_pixmap("pixmaps/error.xpm");
126 default_pixmap
[TYPE_UNKNOWN
] = load_pixmap("pixmaps/unknown.xpm");
127 default_pixmap
[TYPE_SYMLINK
] = load_pixmap("pixmaps/symlink.xpm");
128 default_pixmap
[TYPE_FILE
] = load_pixmap("pixmaps/file.xpm");
129 default_pixmap
[TYPE_DIRECTORY
] = load_pixmap("pixmaps/directory.xpm");
130 default_pixmap
[TYPE_CHAR_DEVICE
] = load_pixmap("pixmaps/char.xpm");
131 default_pixmap
[TYPE_BLOCK_DEVICE
] = load_pixmap("pixmaps/block.xpm");
132 default_pixmap
[TYPE_PIPE
] = load_pixmap("pixmaps/pipe.xpm");
133 default_pixmap
[TYPE_SOCKET
] = load_pixmap("pixmaps/socket.xpm");
135 default_pixmap
[TYPE_UNMOUNTED
] = load_pixmap("pixmaps/mount.xpm");
136 default_pixmap
[TYPE_MOUNTED
] = load_pixmap("pixmaps/mounted.xpm");
137 default_pixmap
[TYPE_MULTIPLE
] = load_pixmap("pixmaps/multiple.xpm");
138 default_pixmap
[TYPE_EXEC_FILE
] = load_pixmap("pixmaps/exec.xpm");
139 default_pixmap
[TYPE_APPDIR
] = load_pixmap("pixmaps/application.xpm");
141 default_pixmap
[TOOLBAR_UP_ICON
] = load_pixmap("pixmaps/up.xpm");
142 default_pixmap
[TOOLBAR_HOME_ICON
] = load_pixmap("pixmaps/home.xpm");
143 default_pixmap
[TOOLBAR_REFRESH_ICON
] =
144 load_pixmap("pixmaps/refresh.xpm");
147 void pixmap_ref(MaskedPixmap
*mp
)
149 ref(mp
, pixmap_cache
->user_data
);
152 void pixmap_unref(MaskedPixmap
*mp
)
154 unref(mp
, pixmap_cache
->user_data
);
157 /****************************************************************
158 * INTERNAL FUNCTIONS *
159 ****************************************************************/
161 /* Load the image 'path' and return a pointer to the resulting
162 * MaskedPixmap. NULL on failure.
164 static MaskedPixmap
*image_from_file(char *path
)
172 GdkImlibImage
*image
;
174 image
= gdk_imlib_load_image(path
);
178 if (!gdk_imlib_render(image
, image
->rgb_width
, image
->rgb_height
))
180 gdk_imlib_kill_image(image
);
184 pixmap
= image
->pixmap
;
185 mask
= image
->shape_mask
;
186 width
= image
->width
;
187 height
= image
->height
;
189 pixmap
= gdk_pixmap_colormap_create_from_xpm(NULL
,
190 gtk_widget_get_default_colormap(),
197 width
= ((GdkPixmapPrivate
*) mp
->pixmap
)->width
;
198 height
= ((GdkPixmapPrivate
*) mp
->pixmap
)->height
;
201 mp
= g_new(MaskedPixmap
, 1);
214 /* Return a pointer to the (static) bad image. The ref counter will ensure
215 * that the image is never freed.
217 static MaskedPixmap
*get_bad_image(void)
219 static MaskedPixmap
*image
= NULL
;
223 image
= g_new(MaskedPixmap
, 1);
226 image
->pixmap
= gdk_pixmap_colormap_create_from_xpm_d(NULL
,
227 gtk_widget_get_default_colormap(),
228 &image
->mask
, NULL
, bad_xpm
);
235 image
->width
= ((GdkPixmapPrivate
*) image
->pixmap
)->width
;
236 image
->height
= ((GdkPixmapPrivate
*) image
->pixmap
)->height
;
241 static MaskedPixmap
*load(char *pathname
, gpointer user_data
)
243 return image_from_file(pathname
);
246 static void ref(MaskedPixmap
*mp
, gpointer data
)
248 /* printf("[ ref %p %d->%d ]\n", mp, mp->ref, mp->ref + 1); */
254 static void unref(MaskedPixmap
*mp
, gpointer data
)
256 /* printf("[ unref %p %d->%d ]\n", mp, mp->ref, mp->ref - 1); */
258 if (mp
&& --mp
->ref
== 0)
262 gdk_imlib_destroy_image(mp
->image
);
266 gdk_pixmap_unref(mp
->pixmap
);
267 gdk_bitmap_unref(mp
->mask
);
273 static int getref(MaskedPixmap
*mp
)
278 /* Called now and then to clear out old pixmaps */
279 static gint
purge(gpointer data
)
281 g_fscache_purge(pixmap_cache
, PIXMAP_PURGE_TIME
);