aboutsummaryrefslogtreecommitdiffstats
path: root/icons.c
diff options
context:
space:
mode:
authorkraxel <kraxel>2004-03-28 11:31:57 +0000
committerkraxel <kraxel>2004-03-28 11:31:57 +0000
commite9e9684117719204929821028ba9dbb7915ea119 (patch)
tree6dd2d71940b33a9f960945335e9124ef4fea9fe7 /icons.c
downloadfbida-e9e9684117719204929821028ba9dbb7915ea119.tar.gz
Initial revision
Diffstat (limited to 'icons.c')
-rw-r--r--icons.c130
1 files changed, 130 insertions, 0 deletions
diff --git a/icons.c b/icons.c
new file mode 100644
index 0000000..0b4e6ce
--- /dev/null
+++ b/icons.c
@@ -0,0 +1,130 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <X11/Xlib.h>
+#include <X11/Intrinsic.h>
+#include <X11/xpm.h>
+#include <Xm/Xm.h>
+
+#include "icons.h"
+#include "misc.h"
+
+#include "xpm/cw.xpm"
+#include "xpm/ccw.xpm"
+#include "xpm/fliph.xpm"
+#include "xpm/flipv.xpm"
+#include "xpm/prev.xpm"
+#include "xpm/next.xpm"
+#include "xpm/zoomin.xpm"
+#include "xpm/zoomout.xpm"
+#include "xpm/exit.xpm"
+
+#include "xpm/question.xpm"
+#include "xpm/dir.xpm"
+#include "xpm/file.xpm"
+#include "xpm/unknown.xpm"
+
+static void patch_bg(XImage *image, XImage *shape,
+ int width, int height, Pixel bg)
+{
+ unsigned int x,y;
+
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++)
+ if (!XGetPixel(shape, x, y))
+ XPutPixel(image, x, y, bg);
+}
+
+static void
+add_pixmap(Display *dpy, Pixel bg, char *name, char **data)
+{
+ XImage *image,*shape;
+ XpmAttributes attr;
+ char sname[32];
+
+ memset(&attr,0,sizeof(attr));
+ XpmCreateImageFromData(dpy,data,&image,&shape,&attr);
+
+ if (shape) {
+ patch_bg(image,shape,attr.width,attr.height,bg);
+ snprintf(sname,sizeof(sname),"%s_shape",name);
+ XmInstallImage(shape,sname);
+ }
+ XmInstallImage(image,name);
+}
+
+Pixmap x11_icon_fit(Display *dpy, Pixmap icon, unsigned long bg,
+ int width, int height)
+{
+ Pixmap pix;
+ GC gc;
+ XGCValues values;
+ Window root;
+ unsigned int w,h,b,d;
+ int x,y;
+
+ XGetGeometry(dpy,icon,&root,&x,&y,&w,&h,&b,&d);
+ pix = XCreatePixmap(dpy,icon,width,height,d);
+
+ /* fill background */
+ values.foreground = bg;
+ values.background = bg;
+ values.fill_style = FillSolid;
+ gc = XCreateGC(dpy, icon, GCForeground | GCBackground | GCFillStyle,
+ &values);
+ XFillRectangle(dpy,pix,gc,0,0,width,height);
+
+ /* blit */
+ if (w <= width && h <= height) {
+ /* just center ... */
+ x = (width - w) / 2;
+ y = (height - h) / 2;
+ XCopyArea(dpy,icon,pix,gc,0,0,w,h,x,y);
+ } else {
+ /* must scale down */
+#if 0
+ float xs,ys,scale;
+
+ xs = (float)width / w;
+ ys = (float)height / h;
+ scale = (xs < ys) ? xs : ys;
+ w = w * scale;
+ h = h * scale;
+ if (0 == w) w = 1;
+ if (0 == h) h = 1;
+
+ x = (width - w) / 2;
+ y = (height - h) / 2;
+ XCopyArea(dpy,icon,pix,gc,0,0,w,h,x,y);
+#endif
+ x = (width - w) / 2;
+ y = (height - h) / 2;
+ if (x < 0)
+ x = 0;
+ if (y < 0)
+ y = 0;
+ XCopyArea(dpy,icon,pix,gc,0,0,w,h,0,0);
+ }
+
+ XFreeGC(dpy, gc);
+ return pix;
+}
+
+void
+x11_icons_init(Display *dpy, unsigned long bg)
+{
+ add_pixmap(dpy, bg, "rotcw", cw_xpm);
+ add_pixmap(dpy, bg, "rotccw", ccw_xpm);
+ add_pixmap(dpy, bg, "fliph", fliph_xpm);
+ add_pixmap(dpy, bg, "flipv", flipv_xpm);
+ add_pixmap(dpy, bg, "prev", prev_xpm);
+ add_pixmap(dpy, bg, "next", next_xpm);
+ add_pixmap(dpy, bg, "zoomin", zoomin_xpm);
+ add_pixmap(dpy, bg, "zoomout", zoomout_xpm);
+ add_pixmap(dpy, bg, "exit", exit_xpm);
+
+ add_pixmap(dpy, bg, "question", question_xpm);
+ add_pixmap(dpy, bg, "dir", dir_xpm);
+ add_pixmap(dpy, bg, "file", file_xpm);
+ add_pixmap(dpy, bg, "unknown", unknown_xpm);
+}