SMOLNET PORTAL home about changes
iInitial commit of 2.0. - thinglaunch - A simple command and password promtper for X11.	Err	bitreich.org	70
hgit clone git://bitreich.org/thinglaunch	URL:git://bitreich.org/thinglaunch	bitreich.org	70
1Log	/scm/thinglaunch/log.gph	bitreich.org	70
1Files	/scm/thinglaunch/files.gph	bitreich.org	70
1Refs	/scm/thinglaunch/refs.gph	bitreich.org	70
1Tags	/scm/thinglaunch/tag	bitreich.org	70
1LICENSE	/scm/thinglaunch/file/LICENSE.gph	bitreich.org	70
i---	Err	bitreich.org	70
1commit 606c0f24754b284bacbb8de22ef5d0c73f065e8f	/scm/thinglaunch/commit/606c0f24754b284bacbb8de22ef5d0c73f065e8f.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 18:50:19 +0200	Err	bitreich.org	70
i	Err	bitreich.org	70
iInitial commit of 2.0.	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  A LICENSE                             |      23 +++++++++++++++++++++++	Err	bitreich.org	70
i  A LICENSE.orig                        |      41 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A Makefile                            |      58 ++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A README.md                           |      36 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A config.h                            |       5 +++++	Err	bitreich.org	70
i  A config.mk                           |      26 ++++++++++++++++++++++++++	Err	bitreich.org	70
i  A thinglaunch.c                       |     466 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i	Err	bitreich.org	70
i7 files changed, 655 insertions(+), 0 deletions(-)	Err	bitreich.org	70
i---	Err	bitreich.org	70
1diff --git a/LICENSE b/LICENSE	/scm/thinglaunch/file/LICENSE.gph	bitreich.org	70
i@@ -0,0 +1,23 @@	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
i+SEE LICENSE.orig FOR FURTHER APPLYING LICENSE TERMS.	Err	bitreich.org	70
1diff --git a/LICENSE.orig b/LICENSE.orig	/scm/thinglaunch/file/LICENSE.orig.gph	bitreich.org	70
i@@ -0,0 +1,41 @@	Err	bitreich.org	70
i+/* This program is a quick little launcher program for X.	Err	bitreich.org	70
i+ *	Err	bitreich.org	70
i+ * You run the program, it grabs the display (hopefully nothing else has it	Err	bitreich.org	70
i+ * grabbed), and you type what you want to run. The styling is minimalist.	Err	bitreich.org	70
i+ *	Err	bitreich.org	70
i+ * (c) 2003 Matt Johnston	Err	bitreich.org	70
i+ * matt (at) ucc.asn.au	Err	bitreich.org	70
i+ *	Err	bitreich.org	70
i+ * Compile it with	Err	bitreich.org	70
i+ * cc thinglaunch.c -o thinglaunch -lX11 -L/usr/X11R6/lib -lpthread	Err	bitreich.org	70
i+ * (works for Linux and OSF/1 anyway, for static you might need -ldl, and you	Err	bitreich.org	70
i+ * mightn't need -lpthread.)	Err	bitreich.org	70
i+ *	Err	bitreich.org	70
i+ * This program can be freely distributed in source or binary form, under a	Err	bitreich.org	70
i+ * quite permissive license. See the bottom of this file for the full license.	Err	bitreich.org	70
i+ * If that license is too restrictive, mail me and you can choose another one.	Err	bitreich.org	70
i+ *	Err	bitreich.org	70
i+ * $Id: thinglaunch.c,v 1.8 2004/09/20 14:27:48 matt Exp $	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+Copyright (c) 2003 Matt Johnston	Err	bitreich.org	70
i+All rights reserved.	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+Permission is hereby granted, free of charge, to any person obtaining a copy	Err	bitreich.org	70
i+of this software and associated documentation files (the "Software"), to deal	Err	bitreich.org	70
i+in the Software without restriction, including without limitation the rights	Err	bitreich.org	70
i+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell	Err	bitreich.org	70
i+copies of the Software, and to permit persons to whom the Software is	Err	bitreich.org	70
i+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 all	Err	bitreich.org	70
i+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 THE	Err	bitreich.org	70
i+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 FROM,	Err	bitreich.org	70
i+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE	Err	bitreich.org	70
i+SOFTWARE.	Err	bitreich.org	70
i+*/	Err	bitreich.org	70
1diff --git a/Makefile b/Makefile	/scm/thinglaunch/file/Makefile.gph	bitreich.org	70
i@@ -0,0 +1,58 @@	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+.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+        @ln -s ${NAME} thingaskpass	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} thingaskpass ${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 LICENSE.orig 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} thingaskpass ${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+        @rm -f ${DESTDIR}${PREFIX}/bin/thingaskpass	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/thinglaunch/file/README.md.gph	bitreich.org	70
i@@ -0,0 +1,36 @@	Err	bitreich.org	70
i+# Thinglaunch - a simple entry box for X11 	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+The first intention, as done by the original creator Matt Johnston	Err	bitreich.org	70
i+<matt@ucc.asn.au>, was to launch simple commandlines.	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+In 2011 the single file project was extended by features like Unicode	Err	bitreich.org	70
i+support, a prompt and an ssh-askpass compatibility layer.	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+## Installation	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        % tar -xzvf thinglaunch-*.tar.gz	Err	bitreich.org	70
i+        % cd thinglaunch	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+This will create the executable »thinglaunch« and »thingaskpass« in	Err	bitreich.org	70
i+»/usr/bin«. Thinglaunch will ask for a command and execute it and	Err	bitreich.org	70
i+thingaskpass can be used as a SSH_ASKPASS parameter value, which will	Err	bitreich.org	70
i+be used by ssh-agent to gather the password for private keys.	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+## Usage	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        # Get some input string and print it to stdout. There will	Err	bitreich.org	70
i+        # be the prompt prepended "to stdout> ".	Err	bitreich.org	70
i+        % thinglaunch -o -p "to stdout> "	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        # Ask for a command, which will be executed. During entering	Err	bitreich.org	70
i+        # the command, the entered string will be replaced by asterisks. 	Err	bitreich.org	70
i+        % thinglaunch -s -p "secret cmd> "	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        # This symlink predefines -s, -o and -p "secret> ".	Err	bitreich.org	70
i+        % ln -s thinglaunch thingaskpass	Err	bitreich.org	70
i+        % ./thingaskpass	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.h b/config.h	/scm/thinglaunch/file/config.h.gph	bitreich.org	70
i@@ -0,0 +1,5 @@	Err	bitreich.org	70
i+static const char *font = "-*-*-medium-*-*-*-14-*-*-*-*-*-*-*";	Err	bitreich.org	70
i+static const char *prompt = "exec> ";	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+	Err	bitreich.org	70
1diff --git a/config.mk b/config.mk	/scm/thinglaunch/file/config.mk.gph	bitreich.org	70
i@@ -0,0 +1,26 @@	Err	bitreich.org	70
i+# thinglaunch metadata	Err	bitreich.org	70
i+NAME = thinglaunch	Err	bitreich.org	70
i+VERSION = 2.00	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/thinglaunch.c b/thinglaunch.c	/scm/thinglaunch/file/thinglaunch.c.gph	bitreich.org	70
i@@ -0,0 +1,466 @@	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+ * For now this is a slightly modified version of the original from	Err	bitreich.org	70
i+ * Matt Johnston <matt@ucc.asn.au>. See LICENSE.orig for his messages.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+#include <unistd.h>	Err	bitreich.org	70
i+#include <X11/Xlib.h>	Err	bitreich.org	70
i+#include <X11/Xatom.h>	Err	bitreich.org	70
i+#include <X11/Xutil.h>	Err	bitreich.org	70
i+#include <X11/Xlocale.h>	Err	bitreich.org	70
i+#include <locale.h>	Err	bitreich.org	70
i+#include <unistd.h>	Err	bitreich.org	70
i+#include <stdio.h>	Err	bitreich.org	70
i+#include <stdlib.h>	Err	bitreich.org	70
i+#include <stdarg.h>	Err	bitreich.org	70
i+#include <string.h>	Err	bitreich.org	70
i+#include <strings.h>	Err	bitreich.org	70
i+#include <libgen.h>	Err	bitreich.org	70
i+#include <wchar.h>	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include "config.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+unsigned long getcolor(const char *colstr);	Err	bitreich.org	70
i+void createwindow(void);	Err	bitreich.org	70
i+void setupgc(void);	Err	bitreich.org	70
i+void eventloop(void);	Err	bitreich.org	70
i+void grabhack(void);	Err	bitreich.org	70
i+void redraw(void);	Err	bitreich.org	70
i+void keypress(XKeyEvent *keyevent);	Err	bitreich.org	70
i+void execcmd(void);	Err	bitreich.org	70
i+void die(char *errstr, ...);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+Display *dpy;	Err	bitreich.org	70
i+GC gc;	Err	bitreich.org	70
i+GC rectgc;	Err	bitreich.org	70
i+XIM im;	Err	bitreich.org	70
i+XIC ic;	Err	bitreich.org	70
i+Window win;	Err	bitreich.org	70
i+XFontStruct *font_info;	Err	bitreich.org	70
i+XFontSet fontset;	Err	bitreich.org	70
i+int screen, issecret = 0, tostdout = 0;	Err	bitreich.org	70
i+unsigned long fgcol, bgcol;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#define MAXCMD 255	Err	bitreich.org	70
i+#define WINWIDTH 640	Err	bitreich.org	70
i+#define WINHEIGHT 25	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/* the actual commandline */	Err	bitreich.org	70
i+wchar_t command[MAXCMD+1];	Err	bitreich.org	70
i+wchar_t secret[MAXCMD+1];	Err	bitreich.org	70
i+char cbuf[MAXCMD*4+1];	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 [-hos] [-p prompt]\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+        int i;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (strstr(argv[0], "thingaskpass")) {	Err	bitreich.org	70
i+                issecret = 1;	Err	bitreich.org	70
i+                tostdout = 1;	Err	bitreich.org	70
i+                prompt = "secret> ";	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        if (argc > 1) {	Err	bitreich.org	70
i+                for (i = 1; argv[i]; i++) {	Err	bitreich.org	70
i+                        if (argv[i][0] == '-') {	Err	bitreich.org	70
i+                                switch (argv[i][1]) {	Err	bitreich.org	70
i+                                case 'o':	Err	bitreich.org	70
i+                                        tostdout = 1;	Err	bitreich.org	70
i+                                        break;	Err	bitreich.org	70
i+                                case 's':	Err	bitreich.org	70
i+                                        issecret = 1;	Err	bitreich.org	70
i+                                        break;	Err	bitreich.org	70
i+                                case 'p':	Err	bitreich.org	70
i+                                        if (!argv[i+1])	Err	bitreich.org	70
i+                                                usage(argv[0]);	Err	bitreich.org	70
i+                                        prompt = 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+                                case 'h':	Err	bitreich.org	70
i+                                        usage(argv[0]);	Err	bitreich.org	70
i+                                        break;	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+	Err	bitreich.org	70
i+        bzero(command, sizeof(command));	Err	bitreich.org	70
i+        bzero(secret, sizeof(secret));	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        createwindow();	Err	bitreich.org	70
i+        setupgc();	Err	bitreich.org	70
i+        grabhack();	Err	bitreich.org	70
i+        eventloop();	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
i+unsigned long	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, canno 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+/*	Err	bitreich.org	70
i+ * Stolen from:	Err	bitreich.org	70
i+ * http://menehune.opt.wfu.edu/Kokua/Irix_6.5.21_doc_cd/usr/share/\	Err	bitreich.org	70
i+ * Insight/library/SGI_bookshelves/SGI_Developer/books/XLib_PG/sgi_\	Err	bitreich.org	70
i+ * html/ch11.html#S2-1002-11-11	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+XIMStyle	Err	bitreich.org	70
i+choosebetterstyle(XIMStyle style1, XIMStyle style2)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        XIMStyle s,t;	Err	bitreich.org	70
i+        XIMStyle preedit = XIMPreeditArea | XIMPreeditCallbacks |	Err	bitreich.org	70
i+                XIMPreeditPosition | XIMPreeditNothing | XIMPreeditNone;	Err	bitreich.org	70
i+        XIMStyle status = XIMStatusArea | XIMStatusCallbacks |	Err	bitreich.org	70
i+                XIMStatusNothing | XIMStatusNone;	Err	bitreich.org	70
i+        if (style1 == 0) return style2;	Err	bitreich.org	70
i+        if (style2 == 0) return style1;	Err	bitreich.org	70
i+        if ((style1 & (preedit | status)) == (style2 & (preedit | status)))	Err	bitreich.org	70
i+                return style1;	Err	bitreich.org	70
i+        s = style1 & preedit;	Err	bitreich.org	70
i+        t = style2 & preedit;	Err	bitreich.org	70
i+        if (s != t) {	Err	bitreich.org	70
i+                if (s | t | XIMPreeditCallbacks)	Err	bitreich.org	70
i+                        return (s == XIMPreeditCallbacks)?style1:style2;	Err	bitreich.org	70
i+                else if (s | t | XIMPreeditPosition)	Err	bitreich.org	70
i+                        return (s == XIMPreeditPosition)?style1:style2;	Err	bitreich.org	70
i+                else if (s | t | XIMPreeditArea)	Err	bitreich.org	70
i+                        return (s == XIMPreeditArea)?style1:style2;	Err	bitreich.org	70
i+                else if (s | t | XIMPreeditNothing)	Err	bitreich.org	70
i+                        return (s == XIMPreeditNothing)?style1:style2;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        else { /* if preedit flags are the same, compare status flags */	Err	bitreich.org	70
i+                s = style1 & status;	Err	bitreich.org	70
i+                t = style2 & status;	Err	bitreich.org	70
i+                if (s | t | XIMStatusCallbacks)	Err	bitreich.org	70
i+                        return (s == XIMStatusCallbacks)?style1:style2;	Err	bitreich.org	70
i+                else if (s | t | XIMStatusArea)	Err	bitreich.org	70
i+                        return (s == XIMStatusArea)?style1:style2;	Err	bitreich.org	70
i+                else if (s | t | XIMStatusNothing)	Err	bitreich.org	70
i+                        return (s == XIMStatusNothing)?style1:style2;	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+initim(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        XIMStyles *im_supported_styles;	Err	bitreich.org	70
i+        XIMStyle app_supported_styles;	Err	bitreich.org	70
i+        XIMStyle style;	Err	bitreich.org	70
i+        XIMStyle best_style;	Err	bitreich.org	70
i+        XVaNestedList list;	Err	bitreich.org	70
i+        char **missing_charsets;	Err	bitreich.org	70
i+        int num_missing_charsets = 0;	Err	bitreich.org	70
i+        char *default_string;	Err	bitreich.org	70
i+        int i;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        fontset = XCreateFontSet(dpy, font, &missing_charsets,	Err	bitreich.org	70
i+                        &num_missing_charsets, &default_string);	Err	bitreich.org	70
i+        if (num_missing_charsets > 0)	Err	bitreich.org	70
i+                XFreeStringList(missing_charsets);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (!(im = XOpenIM(dpy, NULL, NULL, NULL)))	Err	bitreich.org	70
i+                die("Couldn't open input method.\n");	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        XGetIMValues(im, XNQueryInputStyle, &im_supported_styles, NULL);	Err	bitreich.org	70
i+        app_supported_styles = XIMPreeditNone | XIMPreeditNothing \	Err	bitreich.org	70
i+               | XIMPreeditArea;	Err	bitreich.org	70
i+        app_supported_styles |= XIMStatusNone | XIMStatusNothing \	Err	bitreich.org	70
i+                                | XIMStatusArea;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for(i = 0, best_style = 0; i < im_supported_styles->count_styles;	Err	bitreich.org	70
i+                        i++) {	Err	bitreich.org	70
i+                style = im_supported_styles->supported_styles[i];	Err	bitreich.org	70
i+                if ((style & app_supported_styles) == style)	Err	bitreich.org	70
i+                        best_style = choosebetterstyle(style, best_style);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        if (best_style == 0)	Err	bitreich.org	70
i+                die("no common shared interaction style found.\n");	Err	bitreich.org	70
i+        XFree(im_supported_styles);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        list = XVaCreateNestedList(0, XNFontSet, fontset, NULL);	Err	bitreich.org	70
i+        ic = XCreateIC(im, XNInputStyle, best_style, XNClientWindow, win,	Err	bitreich.org	70
i+                        XNPreeditAttributes, list, XNStatusAttributes,	Err	bitreich.org	70
i+                        list, NULL);	Err	bitreich.org	70
i+        XFree(list);	Err	bitreich.org	70
i+        if (ic == NULL)	Err	bitreich.org	70
i+                die("Could not create input context.\n");	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+createwindow(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *display_name;	Err	bitreich.org	70
i+        int display_width, display_height;	Err	bitreich.org	70
i+        int top, left;	Err	bitreich.org	70
i+        XSizeHints *win_size_hints;	Err	bitreich.org	70
i+        XSetWindowAttributes attrib;	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+	Err	bitreich.org	70
i+        display_name = getenv("DISPLAY");	Err	bitreich.org	70
i+        if (display_name == NULL)	Err	bitreich.org	70
i+                die("DISPLAY not set");	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        dpy = XOpenDisplay(display_name);	Err	bitreich.org	70
i+        if (dpy == NULL)	Err	bitreich.org	70
i+                die("Couldn't connect to DISPLAY");	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (!XSetLocaleModifiers(""))	Err	bitreich.org	70
i+                fprintf(stderr, "warning: could not set local modifiers.\n");	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        initim();	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        screen = DefaultScreen(dpy);	Err	bitreich.org	70
i+        display_width = DisplayWidth(dpy, screen);	Err	bitreich.org	70
i+        display_height = DisplayHeight(dpy, screen);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        top = (display_height/2 - WINHEIGHT/2);	Err	bitreich.org	70
i+        left = (display_width/2 - WINWIDTH/2);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        bgcol = getcolor(normbgcolor);	Err	bitreich.org	70
i+        fgcol = getcolor(normfgcolor);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        /*win = XCreateSimpleWindow(dpy, RootWindow(dpy, screen),	Err	bitreich.org	70
i+                        left, top, WINWIDTH, WINHEIGHT, borderwidth,	Err	bitreich.org	70
i+                        bgcol, bgcol);*/	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        attrib.override_redirect= True;	Err	bitreich.org	70
i+        win = XCreateWindow(dpy, RootWindow(dpy, screen),	Err	bitreich.org	70
i+                        left, top, WINWIDTH, WINHEIGHT,	Err	bitreich.org	70
i+                        0, CopyFromParent,InputOutput,CopyFromParent,	Err	bitreich.org	70
i+                        CWOverrideRedirect,&attrib);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        /* set up the window hints etc */	Err	bitreich.org	70
i+        win_size_hints = XAllocSizeHints();	Err	bitreich.org	70
i+        if (!win_size_hints)	Err	bitreich.org	70
i+                die("out of memory allocating hints");	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        win_size_hints->flags = PMaxSize | PMinSize;	Err	bitreich.org	70
i+        win_size_hints->min_width = win_size_hints->max_width = WINWIDTH;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        win_size_hints->min_height = win_size_hints->max_height = WINHEIGHT;	Err	bitreich.org	70
i+        XSetWMNormalHints(dpy, win, win_size_hints);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        XFree(win_size_hints);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        XMapWindow(dpy, win);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+setupgc(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        XGCValues values;	Err	bitreich.org	70
i+        int valuemask = 0;	Err	bitreich.org	70
i+        int line_width = 1;	Err	bitreich.org	70
i+        int line_style = LineSolid;	Err	bitreich.org	70
i+        int cap_style = CapButt;	Err	bitreich.org	70
i+        int join_style = JoinBevel;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        gc = XCreateGC(dpy, win, valuemask, &values);	Err	bitreich.org	70
i+        rectgc = XCreateGC(dpy, win, valuemask, &values);	Err	bitreich.org	70
i+        XSetForeground(dpy, gc, fgcol);	Err	bitreich.org	70
i+        XSetBackground(dpy, gc, bgcol);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        XSetForeground(dpy, rectgc, bgcol);	Err	bitreich.org	70
i+        XSetBackground(dpy, rectgc, bgcol);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        XSetLineAttributes(dpy, gc, line_width, line_style,	Err	bitreich.org	70
i+                        cap_style, join_style);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        /* setup the font */	Err	bitreich.org	70
i+        font_info = XLoadQueryFont(dpy, font);	Err	bitreich.org	70
i+        if (!font_info)	Err	bitreich.org	70
i+                die("couldn't load font");	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        XSetFont(dpy, gc, font_info->fid);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+eventloop(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        XEvent e;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        redraw();	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        XSelectInput(dpy, win, ExposureMask | KeyPressMask);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (;;) {	Err	bitreich.org	70
i+                XNextEvent(dpy, &e);	Err	bitreich.org	70
i+                switch(e.type) {	Err	bitreich.org	70
i+                case Expose:	Err	bitreich.org	70
i+                        redraw();	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case KeyPress:	Err	bitreich.org	70
i+                        keypress(&e.xkey);	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                default:	Err	bitreich.org	70
i+                        break;	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+	Err	bitreich.org	70
i+/* this loop is required since pwm grabs the keyboard during the event loop */	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+grabhack(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int maxwait = 3000000; /* 3 seconds */	Err	bitreich.org	70
i+        int interval = 5000; /* 5 millisec */	Err	bitreich.org	70
i+        int i, x;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        redraw();	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        /* if it takes longer than maxwait, just die */	Err	bitreich.org	70
i+        for (i = 0; i < (maxwait / interval); i++) {	Err	bitreich.org	70
i+                usleep(interval);	Err	bitreich.org	70
i+                x = XGrabKeyboard(dpy, win, False, GrabModeAsync,	Err	bitreich.org	70
i+                                GrabModeAsync, CurrentTime);	Err	bitreich.org	70
i+                if (x == 0)	Err	bitreich.org	70
i+                        return;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        die("Couldn't grab keyboard");	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+redraw(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int font_height, textwidth, promptwidth, dir, ascent, descent;	Err	bitreich.org	70
i+        XCharStruct cs;	Err	bitreich.org	70
i+        XRectangle ink, logical;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        font_height = font_info->ascent + font_info->descent;	Err	bitreich.org	70
i+        XTextExtents(font_info, prompt, strlen(prompt), &dir, &ascent,	Err	bitreich.org	70
i+                        &descent, &cs);	Err	bitreich.org	70
i+        promptwidth = cs.width;	Err	bitreich.org	70
i+        XwcTextExtents(fontset, command, wcslen(command), &ink, &logical);	Err	bitreich.org	70
i+        textwidth = logical.width;	Err	bitreich.org	70
i+        textwidth += promptwidth;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        XFillRectangle(dpy, win, rectgc, 0, 0, WINWIDTH, WINHEIGHT);	Err	bitreich.org	70
i+        XDrawRectangle(dpy, win, gc, 0, 0, WINWIDTH-1, WINHEIGHT-1);	Err	bitreich.org	70
i+        XDrawString(dpy, win, gc, 2, font_height+2, prompt,	Err	bitreich.org	70
i+                        strlen(prompt));	Err	bitreich.org	70
i+        XwcDrawString(dpy, win, fontset, gc, 4 + promptwidth,	Err	bitreich.org	70
i+                        font_height+2, command, wcslen(command));	Err	bitreich.org	70
i+        XDrawLine(dpy, win, gc, 4 + textwidth, font_height + 2,	Err	bitreich.org	70
i+                        4 + textwidth + 10, font_height+2);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        XFlush(dpy);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+keypress(XKeyEvent *keyevent)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        KeySym key_symbol;	Err	bitreich.org	70
i+        int len;	Err	bitreich.org	70
i+        wchar_t buffer[3];	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        len = XwcLookupString(ic, keyevent, buffer, 3, &key_symbol, NULL);	Err	bitreich.org	70
i+        buffer[len] = L'\0';	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        switch(key_symbol) {	Err	bitreich.org	70
i+        case XK_Escape:	Err	bitreich.org	70
i+                exit(0);	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        case XK_BackSpace:	Err	bitreich.org	70
i+                len = wcslen(command);	Err	bitreich.org	70
i+                if (len > 0) {	Err	bitreich.org	70
i+                        command[len-1] = L'\0';	Err	bitreich.org	70
i+                        if (issecret)	Err	bitreich.org	70
i+                                secret[len-1] = L'\0';	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        case XK_Return:	Err	bitreich.org	70
i+        case XK_KP_Enter:	Err	bitreich.org	70
i+                execcmd();	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        default:	Err	bitreich.org	70
i+                if (key_symbol > 255)	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                len = wcslen(command);	Err	bitreich.org	70
i+                if (len < MAXCMD) {	Err	bitreich.org	70
i+                        if (issecret) {	Err	bitreich.org	70
i+                                secret[len] = buffer[0];	Err	bitreich.org	70
i+                                secret[len+1] = L'\0';	Err	bitreich.org	70
i+                                command[len] = L'*';	Err	bitreich.org	70
i+                                command[len+1] = L'\0';	Err	bitreich.org	70
i+                        } else {	Err	bitreich.org	70
i+                                command[len] = buffer[0];	Err	bitreich.org	70
i+                                command[len+1] = L'\0';	Err	bitreich.org	70
i+                        }	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        redraw();	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+execcmd(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *shell;	Err	bitreich.org	70
i+        char *argv[4];	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        XDestroyWindow(dpy, win);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        bzero(cbuf, sizeof(cbuf));	Err	bitreich.org	70
i+        if (issecret)	Err	bitreich.org	70
i+                wcstombs(cbuf, secret, sizeof(cbuf)-1);	Err	bitreich.org	70
i+        else	Err	bitreich.org	70
i+                wcstombs(cbuf, command, sizeof(cbuf)-1);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (tostdout) {	Err	bitreich.org	70
i+                printf("%s\n", cbuf);	Err	bitreich.org	70
i+                exit(0);	Err	bitreich.org	70
i+        }	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+        argv[0] = basename(shell);	Err	bitreich.org	70
i+        argv[1] = "-c";	Err	bitreich.org	70
i+        argv[2] = cbuf;	Err	bitreich.org	70
i+        argv[3] = NULL;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        execv(shell, argv);	Err	bitreich.org	70
i+        die("aiee, after exec");	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+die(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+	Err	bitreich.org	70
i+        exit(1);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/thinglaunch/commit/606c0f2475...
Content-Typetext/plain; charset=utf-8