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