SMOLNET PORTAL home about changes
iInitial commit. - thingmenu - A simple graphical menu launcher for X11.	Err	bitreich.org	70
hgit clone git://bitreich.org/thingmenu	URL:git://bitreich.org/thingmenu	bitreich.org	70
1Log	/scm/thingmenu/log.gph	bitreich.org	70
1Files	/scm/thingmenu/files.gph	bitreich.org	70
1Refs	/scm/thingmenu/refs.gph	bitreich.org	70
1Tags	/scm/thingmenu/tag	bitreich.org	70
1LICENSE	/scm/thingmenu/file/LICENSE.gph	bitreich.org	70
i---	Err	bitreich.org	70
1commit 338b4a391a7991d938921284fe500afeceab1a1b	/scm/thingmenu/commit/338b4a391a7991d938921284fe500afeceab1a1b.gph	bitreich.org	70
hAuthor: Christoph Lohmann <20h@r-36.net>	URL:mailto:20h@r-36.net	bitreich.org	70
iDate:   Sun, 27 Mar 2011 22:10:02 +0200	Err	bitreich.org	70
i	Err	bitreich.org	70
iInitial commit.	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  A LICENSE                             |      22 ++++++++++++++++++++++	Err	bitreich.org	70
i  A Makefile                            |      60 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A README.md                           |      26 ++++++++++++++++++++++++++	Err	bitreich.org	70
i  A config.def.h                        |       7 +++++++	Err	bitreich.org	70
i  A config.h                            |       7 +++++++	Err	bitreich.org	70
i  A config.mk                           |      26 ++++++++++++++++++++++++++	Err	bitreich.org	70
i  A thingmenu.c                         |     555 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i	Err	bitreich.org	70
i7 files changed, 703 insertions(+), 0 deletions(-)	Err	bitreich.org	70
i---	Err	bitreich.org	70
1diff --git a/LICENSE b/LICENSE	/scm/thingmenu/file/LICENSE.gph	bitreich.org	70
i@@ -0,0 +1,22 @@	Err	bitreich.org	70
i+MIT/X Consortium License	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+© 2011 Christoph Lohmann <20h@r-36.net>	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+Permission is hereby granted, free of charge, to any person obtaining a	Err	bitreich.org	70
i+copy of this software and associated documentation files (the "Software"),	Err	bitreich.org	70
i+to deal in the Software without restriction, including without limitation	Err	bitreich.org	70
i+the rights to use, copy, modify, merge, publish, distribute, sublicense,	Err	bitreich.org	70
i+and/or sell copies of the Software, and to permit persons to whom the	Err	bitreich.org	70
i+Software is furnished to do so, subject to the following conditions:	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+The above copyright notice and this permission notice shall be included in	Err	bitreich.org	70
i+all copies or substantial portions of the Software.	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR	Err	bitreich.org	70
i+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,	Err	bitreich.org	70
i+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL	Err	bitreich.org	70
i+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER	Err	bitreich.org	70
i+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING	Err	bitreich.org	70
i+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER	Err	bitreich.org	70
i+DEALINGS IN THE SOFTWARE.	Err	bitreich.org	70
i+	Err	bitreich.org	70
1diff --git a/Makefile b/Makefile	/scm/thingmenu/file/Makefile.gph	bitreich.org	70
i@@ -0,0 +1,60 @@	Err	bitreich.org	70
i+# thinglaunch	Err	bitreich.org	70
i+# See LICENSE file for copyright and license details.	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+include config.mk	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+SRC = ${NAME}.c	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+OBJ = ${SRC:.c=.o}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+all: options ${NAME}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+options:	Err	bitreich.org	70
i+        @echo ${NAME} build options:	Err	bitreich.org	70
i+        @echo "CFLAGS   = ${CFLAGS}"	Err	bitreich.org	70
i+        @echo "LDFLAGS  = ${LDFLAGS}"	Err	bitreich.org	70
i+        @echo "CC       = ${CC}"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+config.h: config.mk	Err	bitreich.org	70
i+        @echo creating $@ from config.def.h	Err	bitreich.org	70
i+        @cp config.def.h $@	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+.c.o:	Err	bitreich.org	70
i+        @echo CC $<	Err	bitreich.org	70
i+        @${CC} -c ${CFLAGS} $<	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+${OBJ}: config.mk	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+${NAME}: ${OBJ}	Err	bitreich.org	70
i+        @echo CC -o $@	Err	bitreich.org	70
i+        @${CC} -o $@ ${OBJ} ${LDFLAGS}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+clean:	Err	bitreich.org	70
i+        @echo cleaning	Err	bitreich.org	70
i+        @rm -f ${NAME} ${OBJ} ${NAME}-${VERSION}.tar.gz	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+dist: clean	Err	bitreich.org	70
i+        @echo creating dist tarball	Err	bitreich.org	70
i+        @mkdir -p ${NAME}-${VERSION}	Err	bitreich.org	70
i+        @cp -R LICENSE Makefile README.md config.mk \	Err	bitreich.org	70
i+                ${SRC} *.h ${NAME}-${VERSION}	Err	bitreich.org	70
i+        @tar -cf ${NAME}-${VERSION}.tar ${NAME}-${VERSION}	Err	bitreich.org	70
i+        @gzip ${NAME}-${VERSION}.tar	Err	bitreich.org	70
i+        @rm -rf ${NAME}-${VERSION}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+etc:	Err	bitreich.org	70
i+        @echo installing etc files into ${DESTDIR}/etc/${NAME}	Err	bitreich.org	70
i+        @mkdir -p ${DESTDIR}/etc/${NAME}	Err	bitreich.org	70
i+        @cp -R etc/${NAME}/* ${DESTDIR}/etc/${NAME}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+install: all	Err	bitreich.org	70
i+        @echo installing executable file to ${DESTDIR}${PREFIX}/bin	Err	bitreich.org	70
i+        @mkdir -p ${DESTDIR}${PREFIX}/bin	Err	bitreich.org	70
i+        @cp -f ${NAME} ${DESTDIR}${PREFIX}/bin	Err	bitreich.org	70
i+        @chmod 755 ${DESTDIR}${PREFIX}/bin/${NAME}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+uninstall:	Err	bitreich.org	70
i+        @echo removing executable file from ${DESTDIR}${PREFIX}/bin	Err	bitreich.org	70
i+        @rm -f ${DESTDIR}${PREFIX}/bin/${NAME}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+.PHONY: all options clean dist install uninstall	Err	bitreich.org	70
1diff --git a/README.md b/README.md	/scm/thingmenu/file/README.md.gph	bitreich.org	70
i@@ -0,0 +1,26 @@	Err	bitreich.org	70
i+# Thingmenu - a simple X11 menu	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+This application evolved out of the need to be able to run commands	Err	bitreich.org	70
i+in a touchscreen environment.	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+## Installation	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        % tar -xzvf thingmenu-*.tar.gz	Err	bitreich.org	70
i+        % cd thingmenu	Err	bitreich.org	70
i+        % make	Err	bitreich.org	70
i+        % sudo PREFIX=/usr make install	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+## Usage	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        # This will open a 300px wide menu, which is showing an	Err	bitreich.org	70
i+        # entry "Reboot now". When being clicked this entry will run	Err	bitreich.org	70
i+        # "reboot". After that the menu will not exit (-s).	Err	bitreich.org	70
i+        % thingmenu -s -ww 300 -- "Reboot now:reboot"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        # This will create a centered menu, which is aligned based	Err	bitreich.org	70
i+        # on the length of the label texts. After the first clicked	Err	bitreich.org	70
i+        # entry it will exit.	Err	bitreich.org	70
i+        % thingmenu "Force reboot:reboot -f" "Shutdown:shutdown"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+Have fun!	Err	bitreich.org	70
i+	Err	bitreich.org	70
1diff --git a/config.def.h b/config.def.h	/scm/thingmenu/file/config.def.h.gph	bitreich.org	70
i@@ -0,0 +1,7 @@	Err	bitreich.org	70
i+static const Bool wmborder = True;	Err	bitreich.org	70
i+static const char *font = "-*-*-medium-*-*-*-14-*-*-*-*-*-*-*";	Err	bitreich.org	70
i+static const char *normbgcolor = "#222222";	Err	bitreich.org	70
i+static const char *normfgcolor = "#cccccc";	Err	bitreich.org	70
i+static const char *pressbgcolor = "#ffffff";	Err	bitreich.org	70
i+static const char *pressfgcolor = "#555555";	Err	bitreich.org	70
i+	Err	bitreich.org	70
1diff --git a/config.h b/config.h	/scm/thingmenu/file/config.h.gph	bitreich.org	70
i@@ -0,0 +1,7 @@	Err	bitreich.org	70
i+static const Bool wmborder = True;	Err	bitreich.org	70
i+static const char *font = "-*-*-medium-*-*-*-14-*-*-*-*-*-*-*";	Err	bitreich.org	70
i+static const char *normbgcolor = "#222222";	Err	bitreich.org	70
i+static const char *normfgcolor = "#cccccc";	Err	bitreich.org	70
i+static const char *pressbgcolor = "#ffffff";	Err	bitreich.org	70
i+static const char *pressfgcolor = "#555555";	Err	bitreich.org	70
i+	Err	bitreich.org	70
1diff --git a/config.mk b/config.mk	/scm/thingmenu/file/config.mk.gph	bitreich.org	70
i@@ -0,0 +1,26 @@	Err	bitreich.org	70
i+# thingmenu metadata	Err	bitreich.org	70
i+NAME = thingmenu	Err	bitreich.org	70
i+VERSION = 0.2	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# Customize below to fit your system	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# paths	Err	bitreich.org	70
i+PREFIX ?= /usr	Err	bitreich.org	70
i+MANPREFIX = ${PREFIX}/share/man	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+X11INC = /usr/X11R6/include	Err	bitreich.org	70
i+X11LIB = /usr/X11R6/lib	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# includes and libs	Err	bitreich.org	70
i+INCS = -I. -I/usr/include	Err	bitreich.org	70
i+LIBS = -L/usr/lib -L${X11LIB} -lc -lX11	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# flags	Err	bitreich.org	70
i+CPPFLAGS = -DVERSION=\"${VERSION}\"	Err	bitreich.org	70
i+CFLAGS = -g -std=gnu99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}	Err	bitreich.org	70
i+LDFLAGS = -g ${LIBS}	Err	bitreich.org	70
i+#LDFLAGS = -s ${LIBS}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# compiler and linker	Err	bitreich.org	70
i+CC = cc	Err	bitreich.org	70
i+	Err	bitreich.org	70
1diff --git a/thingmenu.c b/thingmenu.c	/scm/thingmenu/file/thingmenu.c.gph	bitreich.org	70
i@@ -0,0 +1,555 @@	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Copy me if you can.	Err	bitreich.org	70
i+ * by 20h	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+#include <unistd.h>	Err	bitreich.org	70
i+#include <locale.h>	Err	bitreich.org	70
i+#include <stdarg.h>	Err	bitreich.org	70
i+#include <stdio.h>	Err	bitreich.org	70
i+#include <string.h>	Err	bitreich.org	70
i+#include <stdlib.h>	Err	bitreich.org	70
i+#include <libgen.h>	Err	bitreich.org	70
i+#include <X11/keysym.h>	Err	bitreich.org	70
i+#include <X11/Xatom.h>	Err	bitreich.org	70
i+#include <X11/Xlib.h>	Err	bitreich.org	70
i+#include <X11/Xutil.h>	Err	bitreich.org	70
i+#include <X11/Xproto.h>	Err	bitreich.org	70
i+#include <X11/extensions/XTest.h>	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/* macros */	Err	bitreich.org	70
i+#define MAX(a, b)       ((a) > (b) ? (a) : (b))	Err	bitreich.org	70
i+#define LENGTH(x)       (sizeof x / sizeof x[0])	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/* enums */	Err	bitreich.org	70
i+enum { ColFG, ColBG, ColLast };	Err	bitreich.org	70
i+enum { NetWMWindowType, NetLast };	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/* typedefs */	Err	bitreich.org	70
i+typedef unsigned int uint;	Err	bitreich.org	70
i+typedef unsigned long ulong;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+typedef struct {	Err	bitreich.org	70
i+        ulong norm[ColLast];	Err	bitreich.org	70
i+        ulong press[ColLast];	Err	bitreich.org	70
i+        Drawable drawable;	Err	bitreich.org	70
i+        GC gc;	Err	bitreich.org	70
i+        struct {	Err	bitreich.org	70
i+                int ascent;	Err	bitreich.org	70
i+                int descent;	Err	bitreich.org	70
i+                int height;	Err	bitreich.org	70
i+                XFontSet set;	Err	bitreich.org	70
i+                XFontStruct *xfont;	Err	bitreich.org	70
i+        } font;	Err	bitreich.org	70
i+} DC; /* draw context */	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+typedef struct {	Err	bitreich.org	70
i+        char *label;	Err	bitreich.org	70
i+        char *cmd;	Err	bitreich.org	70
i+        uint width;	Err	bitreich.org	70
i+        int x, y, w, h;	Err	bitreich.org	70
i+        Bool pressed;	Err	bitreich.org	70
i+        Bool forceexit;	Err	bitreich.org	70
i+} Entry;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/* function declarations */	Err	bitreich.org	70
i+static void buttonpress(XEvent *e);	Err	bitreich.org	70
i+static void buttonrelease(XEvent *e);	Err	bitreich.org	70
i+static void cleanup(void);	Err	bitreich.org	70
i+static void configurenotify(XEvent *e);	Err	bitreich.org	70
i+static void unmapnotify(XEvent *e);	Err	bitreich.org	70
i+static void die(const char *errstr, ...);	Err	bitreich.org	70
i+static void drawmenu(void);	Err	bitreich.org	70
i+static void drawentry(Entry *e);	Err	bitreich.org	70
i+static void expose(XEvent *e);	Err	bitreich.org	70
i+static Entry *findentry(int x, int y);	Err	bitreich.org	70
i+static ulong getcolor(const char *colstr);	Err	bitreich.org	70
i+static void initfont(const char *fontstr);	Err	bitreich.org	70
i+static void leavenotify(XEvent *e);	Err	bitreich.org	70
i+static void press(Entry *e);	Err	bitreich.org	70
i+static void run(void);	Err	bitreich.org	70
i+static void setup(void);	Err	bitreich.org	70
i+static int textnw(const char *text, uint len);	Err	bitreich.org	70
i+static void unpress(void);	Err	bitreich.org	70
i+static void updateentries(void);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/* variables */	Err	bitreich.org	70
i+static int screen;	Err	bitreich.org	70
i+static void (*handler[LASTEvent]) (XEvent *) = {	Err	bitreich.org	70
i+        [ButtonPress] = buttonpress,	Err	bitreich.org	70
i+        [ButtonRelease] = buttonrelease,	Err	bitreich.org	70
i+        [ConfigureNotify] = configurenotify,	Err	bitreich.org	70
i+        [UnmapNotify] = unmapnotify,	Err	bitreich.org	70
i+        [Expose] = expose,	Err	bitreich.org	70
i+        [LeaveNotify] = leavenotify,	Err	bitreich.org	70
i+};	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static Display *dpy;	Err	bitreich.org	70
i+static DC dc;	Err	bitreich.org	70
i+static Window root, win;	Err	bitreich.org	70
i+static Bool running = True;	Err	bitreich.org	70
i+static int ww = 0, wh = 0, wx = 0, wy = 0;	Err	bitreich.org	70
i+static char *name = "thingmenu";	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+Entry **entries = NULL;	Err	bitreich.org	70
i+int nentries = 0;	Err	bitreich.org	70
i+int oneshot = 1;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/* configuration, allows nested code to access above variables */	Err	bitreich.org	70
i+#include "config.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+buttonpress(XEvent *e)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        XButtonPressedEvent *ev = &e->xbutton;	Err	bitreich.org	70
i+        Entry *en;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if((en = findentry(ev->x, ev->y)))	Err	bitreich.org	70
i+                press(en);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+buttonrelease(XEvent *e)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        XButtonPressedEvent *ev = &e->xbutton;	Err	bitreich.org	70
i+        Entry *en;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if((en = findentry(ev->x, ev->y)))	Err	bitreich.org	70
i+                unpress();	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+cleanup(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        if(dc.font.set)	Err	bitreich.org	70
i+                XFreeFontSet(dpy, dc.font.set);	Err	bitreich.org	70
i+        else	Err	bitreich.org	70
i+                XFreeFont(dpy, dc.font.xfont);	Err	bitreich.org	70
i+        XFreePixmap(dpy, dc.drawable);	Err	bitreich.org	70
i+        XFreeGC(dpy, dc.gc);	Err	bitreich.org	70
i+        XDestroyWindow(dpy, win);	Err	bitreich.org	70
i+        XSync(dpy, False);	Err	bitreich.org	70
i+        XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+configurenotify(XEvent *e)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        XConfigureEvent *ev = &e->xconfigure;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if(ev->window == win && (ev->width != ww || ev->height != wh)) {	Err	bitreich.org	70
i+                ww = ev->width;	Err	bitreich.org	70
i+                wh = ev->height;	Err	bitreich.org	70
i+                XFreePixmap(dpy, dc.drawable);	Err	bitreich.org	70
i+                dc.drawable = XCreatePixmap(dpy, root, ww, wh,	Err	bitreich.org	70
i+                                DefaultDepth(dpy, screen));	Err	bitreich.org	70
i+                updateentries();	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+die(const char *errstr, ...)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        va_list ap;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        va_start(ap, errstr);	Err	bitreich.org	70
i+        vfprintf(stderr, errstr, ap);	Err	bitreich.org	70
i+        va_end(ap);	Err	bitreich.org	70
i+        exit(EXIT_FAILURE);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+drawmenu(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int i;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for(i = 0; i < nentries; i++)	Err	bitreich.org	70
i+                drawentry(entries[i]);	Err	bitreich.org	70
i+        XSync(dpy, False);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+drawentry(Entry *e)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int x, y, h, len;	Err	bitreich.org	70
i+        XRectangle r = { e->x, e->y, e->w, e->h};	Err	bitreich.org	70
i+        const char *l;	Err	bitreich.org	70
i+        ulong *col;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if(e->pressed)	Err	bitreich.org	70
i+                col = dc.press;	Err	bitreich.org	70
i+        else	Err	bitreich.org	70
i+                col = dc.norm;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        XSetForeground(dpy, dc.gc, col[ColBG]);	Err	bitreich.org	70
i+        XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);	Err	bitreich.org	70
i+        XSetForeground(dpy, dc.gc, dc.norm[ColFG]);	Err	bitreich.org	70
i+        r.height -= 1;	Err	bitreich.org	70
i+        r.width -= 1;	Err	bitreich.org	70
i+        XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1);	Err	bitreich.org	70
i+        XSetForeground(dpy, dc.gc, col[ColFG]);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        l = e->label;	Err	bitreich.org	70
i+        len = strlen(l);	Err	bitreich.org	70
i+        h = dc.font.height;	Err	bitreich.org	70
i+        y = e->y + (e->h / 2) - (h / 2) + dc.font.ascent;	Err	bitreich.org	70
i+        x = e->x + (e->w / 2) - (textnw(l, len) / 2);	Err	bitreich.org	70
i+        if(dc.font.set) {	Err	bitreich.org	70
i+                XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, l,	Err	bitreich.org	70
i+                                len);	Err	bitreich.org	70
i+        } else	Err	bitreich.org	70
i+                XDrawString(dpy, dc.drawable, dc.gc, x, y, l, len);	Err	bitreich.org	70
i+        XCopyArea(dpy, dc.drawable, win, dc.gc, e->x, e->y, e->w, e->h,	Err	bitreich.org	70
i+                        e->x, e->y);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+unmapnotify(XEvent *e)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        running = False;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+expose(XEvent *e)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        XExposeEvent *ev = &e->xexpose;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if(ev->count == 0 && (ev->window == win))	Err	bitreich.org	70
i+                drawmenu();	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+Entry *	Err	bitreich.org	70
i+findentry(int x, int y)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int i;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for(i = 0; i < nentries; i++) {	Err	bitreich.org	70
i+                if(x > entries[i]->x && x < entries[i]->x + entries[i]->w	Err	bitreich.org	70
i+                                && y > entries[i]->y	Err	bitreich.org	70
i+                                && y < entries[i]->y + entries[i]->h)	Err	bitreich.org	70
i+                        return entries[i];	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        return NULL;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+ulong	Err	bitreich.org	70
i+getcolor(const char *colstr)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        Colormap cmap = DefaultColormap(dpy, screen);	Err	bitreich.org	70
i+        XColor color;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))	Err	bitreich.org	70
i+                die("error, cannot allocate color '%s'\n", colstr);	Err	bitreich.org	70
i+        return color.pixel;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+initfont(const char *fontstr)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *def, **missing;	Err	bitreich.org	70
i+        int i, n;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        missing = NULL;	Err	bitreich.org	70
i+        if(dc.font.set)	Err	bitreich.org	70
i+                XFreeFontSet(dpy, dc.font.set);	Err	bitreich.org	70
i+        dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);	Err	bitreich.org	70
i+        if(missing) {	Err	bitreich.org	70
i+                while(n--)	Err	bitreich.org	70
i+                        fprintf(stderr, "svkbd: missing fontset: %s\n", missing[n]);	Err	bitreich.org	70
i+                XFreeStringList(missing);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        if(dc.font.set) {	Err	bitreich.org	70
i+                XFontSetExtents *font_extents;	Err	bitreich.org	70
i+                XFontStruct **xfonts;	Err	bitreich.org	70
i+                char **font_names;	Err	bitreich.org	70
i+                dc.font.ascent = dc.font.descent = 0;	Err	bitreich.org	70
i+                font_extents = XExtentsOfFontSet(dc.font.set);	Err	bitreich.org	70
i+                n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);	Err	bitreich.org	70
i+                for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) {	Err	bitreich.org	70
i+                        dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent);	Err	bitreich.org	70
i+                        dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent);	Err	bitreich.org	70
i+                        xfonts++;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        else {	Err	bitreich.org	70
i+                if(dc.font.xfont)	Err	bitreich.org	70
i+                        XFreeFont(dpy, dc.font.xfont);	Err	bitreich.org	70
i+                dc.font.xfont = NULL;	Err	bitreich.org	70
i+                if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))	Err	bitreich.org	70
i+                && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed")))	Err	bitreich.org	70
i+                        die("error, cannot load font: '%s'\n", fontstr);	Err	bitreich.org	70
i+                dc.font.ascent = dc.font.xfont->ascent;	Err	bitreich.org	70
i+                dc.font.descent = dc.font.xfont->descent;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        dc.font.height = dc.font.ascent + dc.font.descent;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+leavenotify(XEvent *e)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        unpress();	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+runentry(Entry *e)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *shell;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (fork()) {	Err	bitreich.org	70
i+                if (oneshot || e->forceexit) {	Err	bitreich.org	70
i+                        XDestroyWindow(dpy, win);	Err	bitreich.org	70
i+                        exit(0);	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                return;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        if (fork())	Err	bitreich.org	70
i+                exit(0);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        shell = getenv("SHELL");	Err	bitreich.org	70
i+        if (!shell)	Err	bitreich.org	70
i+                shell = "/bin/sh";	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        execlp(shell, basename(shell), "-c", e->cmd, (char *)NULL);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+press(Entry *e)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        e->pressed = !e->pressed;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        runentry(e);	Err	bitreich.org	70
i+        drawentry(e);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+run(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        XEvent ev;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        /* main event loop */	Err	bitreich.org	70
i+        XSync(dpy, False);	Err	bitreich.org	70
i+        while(running) {	Err	bitreich.org	70
i+                XNextEvent(dpy, &ev);	Err	bitreich.org	70
i+                if(handler[ev.type])	Err	bitreich.org	70
i+                        (handler[ev.type])(&ev); /* call handler */	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+setup(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        XSetWindowAttributes wa;	Err	bitreich.org	70
i+        XTextProperty str;	Err	bitreich.org	70
i+        XSizeHints *sizeh;	Err	bitreich.org	70
i+        XClassHint *ch;	Err	bitreich.org	70
i+        int i, sh, sw, ls;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        /* init screen */	Err	bitreich.org	70
i+        screen = DefaultScreen(dpy);	Err	bitreich.org	70
i+        root = RootWindow(dpy, screen);	Err	bitreich.org	70
i+        sw = DisplayWidth(dpy, screen) - 1;	Err	bitreich.org	70
i+        sh = DisplayHeight(dpy, screen) - 1;	Err	bitreich.org	70
i+        initfont(font);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        /* init atoms */	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        /* init appearance */	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (ww == 0) {	Err	bitreich.org	70
i+                for (i = 0, ww = 0; i < nentries; i++) {	Err	bitreich.org	70
i+                        ls = textnw(entries[i]->label,	Err	bitreich.org	70
i+                                        strlen(entries[i]->label));	Err	bitreich.org	70
i+                        if (ls > ww)	Err	bitreich.org	70
i+                                ww = ls;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                ww *= 1.5;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        if (wh == 0)	Err	bitreich.org	70
i+                wh = (nentries + 2) * dc.font.height + 4;	Err	bitreich.org	70
i+        if (wy == 0)	Err	bitreich.org	70
i+                wy = (sh - wh) / 2;	Err	bitreich.org	70
i+        if (wx == 0)	Err	bitreich.org	70
i+                wx = (sw - ww) / 2;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        dc.norm[ColBG] = getcolor(normbgcolor);	Err	bitreich.org	70
i+        dc.norm[ColFG] = getcolor(normfgcolor);	Err	bitreich.org	70
i+        dc.press[ColBG] = getcolor(pressbgcolor);	Err	bitreich.org	70
i+        dc.press[ColFG] = getcolor(pressfgcolor);	Err	bitreich.org	70
i+        dc.drawable = XCreatePixmap(dpy, root, ww, wh, DefaultDepth(dpy, screen));	Err	bitreich.org	70
i+        dc.gc = XCreateGC(dpy, root, 0, 0);	Err	bitreich.org	70
i+        if(!dc.font.set)	Err	bitreich.org	70
i+                XSetFont(dpy, dc.gc, dc.font.xfont->fid);	Err	bitreich.org	70
i+        for(i = 0; i < nentries; i++)	Err	bitreich.org	70
i+                entries[i]->pressed = 0;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        wa.override_redirect = !wmborder;	Err	bitreich.org	70
i+        wa.border_pixel = dc.norm[ColFG];	Err	bitreich.org	70
i+        wa.background_pixel = dc.norm[ColBG];	Err	bitreich.org	70
i+        win = XCreateWindow(dpy, root, wx, wy, ww, wh, 0,	Err	bitreich.org	70
i+                            CopyFromParent, CopyFromParent, CopyFromParent,	Err	bitreich.org	70
i+                            CWOverrideRedirect | CWBorderPixel | CWBackingPixel, &wa);	Err	bitreich.org	70
i+        XSelectInput(dpy, win, StructureNotifyMask|ButtonReleaseMask|	Err	bitreich.org	70
i+                        ButtonPressMask|ExposureMask|LeaveWindowMask);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        sizeh = XAllocSizeHints();	Err	bitreich.org	70
i+        sizeh->flags = PMaxSize | PMinSize;	Err	bitreich.org	70
i+        sizeh->min_width = sizeh->max_width = ww;	Err	bitreich.org	70
i+        sizeh->min_height = sizeh->max_height = wh;	Err	bitreich.org	70
i+        XStringListToTextProperty(&name, 1, &str);	Err	bitreich.org	70
i+        ch = XAllocClassHint();	Err	bitreich.org	70
i+        ch->res_class = name;	Err	bitreich.org	70
i+        ch->res_name = name;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        XSetWMProperties(dpy, win, &str, &str, NULL, 0, sizeh, NULL,	Err	bitreich.org	70
i+                        ch);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        XFree(ch);	Err	bitreich.org	70
i+        XFree(str.value);	Err	bitreich.org	70
i+        XFree(sizeh);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        XMapRaised(dpy, win);	Err	bitreich.org	70
i+        updateentries();	Err	bitreich.org	70
i+        drawmenu();	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int	Err	bitreich.org	70
i+textnw(const char *text, uint len)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        XRectangle r;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if(dc.font.set) {	Err	bitreich.org	70
i+                XmbTextExtents(dc.font.set, text, len, NULL, &r);	Err	bitreich.org	70
i+                return r.width;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        return XTextWidth(dc.font.xfont, text, len);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+unpress()	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int i;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for(i = 0; i < nentries; i++) {	Err	bitreich.org	70
i+                if(entries[i]->pressed) {	Err	bitreich.org	70
i+                        entries[i]->pressed = 0;	Err	bitreich.org	70
i+                        drawentry(entries[i]);	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+updateentries(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int i, y = 0, h;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        h = wh / nentries;	Err	bitreich.org	70
i+        for(i = 0; i < nentries; i++) {	Err	bitreich.org	70
i+                entries[i]->x = 0;	Err	bitreich.org	70
i+                entries[i]->y = y;	Err	bitreich.org	70
i+                entries[i]->w = ww;	Err	bitreich.org	70
i+                entries[i]->h = h;	Err	bitreich.org	70
i+                y += h;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+usage(char *argv0)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        fprintf(stderr, "usage: %s [-hs] [-wh height] [-ww width] "	Err	bitreich.org	70
i+                        "[-wx x position] [-wy y position] [--] "	Err	bitreich.org	70
i+                        "label:cmd ...\n", argv0);	Err	bitreich.org	70
i+        exit(1);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int	Err	bitreich.org	70
i+main(int argc, char *argv[])	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *label, *cmd;	Err	bitreich.org	70
i+        int i;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (argc < 2)	Err	bitreich.org	70
i+                usage(argv[0]);	Err	bitreich.org	70
i+        i = 1;	Err	bitreich.org	70
i+        for (; argv[i]; i++) {	Err	bitreich.org	70
i+                if (argv[i][0] != '-')	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                if (argv[i][1] == '-') {	Err	bitreich.org	70
i+                        i++;	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                switch (argv[i][1]) {	Err	bitreich.org	70
i+                case 'h':	Err	bitreich.org	70
i+                        usage(argv[0]);	Err	bitreich.org	70
i+                case 's':	Err	bitreich.org	70
i+                        oneshot = 0;	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case 'w':	Err	bitreich.org	70
i+                        switch ((i >= argc - 1)? 0 : argv[i][2]) {	Err	bitreich.org	70
i+                        case 'h':	Err	bitreich.org	70
i+                                wh = atoi(argv[i+1]);	Err	bitreich.org	70
i+                                i++;	Err	bitreich.org	70
i+                                break;	Err	bitreich.org	70
i+                        case 'w':	Err	bitreich.org	70
i+                                ww = atoi(argv[i+1]);	Err	bitreich.org	70
i+                                i++;	Err	bitreich.org	70
i+                                break;	Err	bitreich.org	70
i+                        case 'x':	Err	bitreich.org	70
i+                                wx = atoi(argv[i+1]);	Err	bitreich.org	70
i+                                i++;	Err	bitreich.org	70
i+                                break;	Err	bitreich.org	70
i+                        case 'y':	Err	bitreich.org	70
i+                                wy = atoi(argv[i+1]);	Err	bitreich.org	70
i+                                i++;	Err	bitreich.org	70
i+                                break;	Err	bitreich.org	70
i+                        default:	Err	bitreich.org	70
i+                                usage(argv[0]);	Err	bitreich.org	70
i+                        }	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                default:	Err	bitreich.org	70
i+                        usage(argv[0]);	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (; argv[i]; i++) {	Err	bitreich.org	70
i+                sscanf(argv[i], "%1024m[^:]:%1024m[^\n]", &label, &cmd);	Err	bitreich.org	70
i+                if (label == NULL || cmd == NULL) {	Err	bitreich.org	70
i+                        if (label == NULL)	Err	bitreich.org	70
i+                                free(label);	Err	bitreich.org	70
i+                        if (cmd == NULL)	Err	bitreich.org	70
i+                                free(cmd);	Err	bitreich.org	70
i+                        usage(argv[0]);	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                entries = realloc(entries, sizeof(entries[0])*(++nentries));	Err	bitreich.org	70
i+                entries[nentries-1] = malloc(sizeof(*entries[0]));	Err	bitreich.org	70
i+                bzero(entries[nentries-1], sizeof(*entries[0]));	Err	bitreich.org	70
i+                entries[nentries-1]->label = label;	Err	bitreich.org	70
i+                entries[nentries-1]->cmd = cmd;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        if (nentries < 1)	Err	bitreich.org	70
i+                usage(argv[0]);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        entries = realloc(entries, sizeof(entries[0])*(++nentries));	Err	bitreich.org	70
i+        entries[nentries-1] = malloc(sizeof(*entries[0]));	Err	bitreich.org	70
i+        bzero(entries[nentries-1], sizeof(*entries[0]));	Err	bitreich.org	70
i+        entries[nentries-1]->label = strdup("cancel");	Err	bitreich.org	70
i+        entries[nentries-1]->cmd = "exit";	Err	bitreich.org	70
i+        entries[nentries-1]->forceexit = True;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())	Err	bitreich.org	70
i+                fprintf(stderr, "warning: no locale support\n");	Err	bitreich.org	70
i+        if(!(dpy = XOpenDisplay(0)))	Err	bitreich.org	70
i+                die("thingmenu: cannot open display\n");	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        setup();	Err	bitreich.org	70
i+        run();	Err	bitreich.org	70
i+        cleanup();	Err	bitreich.org	70
i+        XCloseDisplay(dpy);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (i = 0; i < nentries; i++)	Err	bitreich.org	70
i+                free(entries[i]);	Err	bitreich.org	70
i+        free(entries);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return 0;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/thingmenu/commit/338b4a391a79...
Content-Typetext/plain; charset=utf-8