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