tmerging __20h__s changes. - svkbd - Simple X11 onscreen keyboard.
 (HTM) git clone git://r-36.net/svkbd
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit 6ad5403859ab6e7f4480c3122de240bf7020cf8d
 (DIR) parent e485fdb9ebb0de21630c802f5bc3a1e6ca99d34e
 (HTM) Author: Enno Boland (tox) <tox@s01.de>
       Date:   Fri, 25 Mar 2011 15:14:12 +0100
       
       merging __20h__s changes.
       Diffstat:
         Makefile                            |      29 ++++++++++++++++-------------
         config.def.h                        |       2 +-
         config.mk                           |       3 +--
         svkbd.c                             |     111 +++++++++++++++++++------------
       
       4 files changed, 88 insertions(+), 57 deletions(-)
       ---
 (DIR) diff --git a/Makefile b/Makefile
       t@@ -4,7 +4,7 @@
        include config.mk
        
        SRC = svkbd.c
       -OBJ = ${SRC:.c=.o}
       +LAYOUTS = en de arrows
        
        all: options svkbd
        
       t@@ -15,29 +15,32 @@ options:
                @echo "CC       = ${CC}"
                @echo "LAYOUT   = ${LAYOUT}"
        
       -.c.o:
       -        @echo CC $<
       -        @${CC} ${CPPFLAGS} -c ${CFLAGS} $<
       -
       -${OBJ}: config.h config.mk
       -
       -config.h:
       +config.h: config.mk
                @echo creating $@ from config.def.h
                @cp config.def.h $@
        
       -svkbd: ${OBJ}
       +
       +svkbd: svkbd.en
       +        @echo CP $@
       +        @cp $< $@
       +
       +svkbd.%: layout.%.h config.h ${SRC}
       +        @echo creating layout.h from $<
       +        @cp $< layout.h
                @echo CC -o $@
       -        @${CC} -o $@ ${OBJ} ${LDFLAGS}
       +        @${CC} -o $@ ${SRC} ${LDFLAGS} ${CFLAGS}
        
        clean:
                @echo cleaning
       -        @rm -f svkbd ${OBJ} svkbd-${VERSION}.tar.gz
       +        @for i in ${LAYOUTS}; do rm svkbd.$$i 2> /dev/null; done; true
       +        @rm -f svkbd ${OBJ} svkbd-${VERSION}.tar.gz 2> /dev/null; true
        
        dist: clean
                @echo creating dist tarball
                @mkdir -p svkbd-${VERSION}
       -        @cp -R LICENSE Makefile README config.def.h config.mk \
       -                ${SRC} layouts svkbd-${VERSION}
       +        @cp LICENSE Makefile README config.def.h config.mk \
       +                ${SRC} svkbd-${VERSION}
       +        @for i in ${LAYOUTS}; do cp layout.$$i.h svkbd.${VERSION} || exit 1; done
                @tar -cf svkbd-${VERSION}.tar svkbd-${VERSION}
                @gzip svkbd-${VERSION}.tar
                @rm -rf svkbd-${VERSION}
 (DIR) diff --git a/config.def.h b/config.def.h
       t@@ -1,3 +1,4 @@
       +static const Bool wmborder          = True;
        static const char font[]            = "-*-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*";
        static const char normbgcolor[]     = "#cccccc";
        static const char normfgcolor[]     = "#000000";
       t@@ -5,4 +6,3 @@ static const char hovbgcolor[]      = "#ffffff";
        static const char hovfgcolor[]      = "#000000";
        static const char pressbgcolor[]    = "#0000cc";
        static const char pressfgcolor[]    = "#ffffff";
       -
 (DIR) diff --git a/config.mk b/config.mk
       t@@ -1,7 +1,7 @@
        # svkbd version
        VERSION = 0.1
        
       -LAYOUT?=def
       +LAYOUT ?= en
        
        # Customize below to fit your system
        
       t@@ -18,7 +18,6 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXtst
        
        # flags
        CPPFLAGS = -DVERSION=\"${VERSION}\" \
       -           -DCONFIGLAYOUT_H=\"layout.${LAYOUT}.h\" \
                   ${XINERAMAFLAGS}
        CFLAGS = -g -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
        LDFLAGS = -g ${LIBS}
 (DIR) diff --git a/svkbd.c b/svkbd.c
       t@@ -20,6 +20,7 @@
        
        /* enums */
        enum { ColFG, ColBG, ColLast };
       +enum { NetWMWindowType, NetLast };
        
        /* typedefs */
        typedef unsigned int uint;
       t@@ -57,6 +58,7 @@ static void buttonpress(XEvent *e);
        static void buttonrelease(XEvent *e);
        static void cleanup(void);
        static void configurenotify(XEvent *e);
       +static void countrows();
        static void unmapnotify(XEvent *e);
        static void die(const char *errstr, ...);
        static void drawkeyboard(void);
       t@@ -83,13 +85,18 @@ static void (*handler[LASTEvent]) (XEvent *) = {
                [Expose] = expose,
                [LeaveNotify] = leavenotify,
        };
       +static Atom netatom[NetLast];
        static Display *dpy;
        static DC dc;
        static Window root, win;
        static Bool running = True;
        static KeySym pressedmod = 0;
       +static int rows, ww = 0, wh = 0, wx = 0, wy = 0;
       +static char *name = "svkbd";
       +static char *wintype = "_NET_WM_WINDOW_TYPE_TOOLBAR";
        /* configuration, allows nested code to access above variables */
        #include "config.h"
       +#include "layout.h"
        
        void
        buttonpress(XEvent *e) {
       t@@ -143,6 +150,15 @@ configurenotify(XEvent *e) {
        }
        
        void
       +countrows() {
       +        int i = 0;
       +
       +        for(i = 0, rows = 1; i < LENGTH(keys); i++)
       +                if(keys[i].keysym == 0)
       +                        rows++;
       +}
       +
       +void
        die(const char *errstr, ...) {
                va_list ap;
        
       t@@ -308,30 +324,32 @@ run(void) {
        
        void
        setup(void) {
       -        int i;
       -        XWMHints *wmh;
                XSetWindowAttributes wa;
       +        XTextProperty str;
       +        XClassHint *ch;
       +        int i, sh, sw;
       +        XWMHints *wmh;
        
                /* init screen */
                screen = DefaultScreen(dpy);
                root = RootWindow(dpy, screen);
       +        sw = DisplayWidth(dpy, screen);
       +        sh = DisplayHeight(dpy, screen); 
                initfont(font);
        
       -        /* init appearance */
       -        if (!ww)
       -                ww = DisplayWidth(dpy, screen);
       -        if (ww < 0)
       -                ww = DisplayWidth(dpy, screen) / (ww * -1);
       -
       -        if (wh < 0)
       -                wh = DisplayHeight(dpy, screen) / (wh * -1); 
       -
       -        if (wy < 0)
       -                wy = DisplayHeight(dpy, screen) + wy;
       -
       -        if (wx < 0)
       -                wx = DisplayWidth(dpy, screen) + wx;
       +        /* init atoms */
       +        netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
        
       +        /* init appearance */
       +        countrows();
       +        if(!ww)
       +                ww = sw - wx;
       +        if(!wx)
       +                wx = 0;
       +        if(!wh)
       +                wh = sh * rows / 32;
       +        if(!wy)
       +                wy = sh - wh;
                dc.norm[ColBG] = getcolor(normbgcolor);
                dc.norm[ColFG] = getcolor(normfgcolor);
                dc.press[ColBG] = getcolor(pressbgcolor);
       t@@ -343,7 +361,7 @@ setup(void) {
                for(i = 0; i < LENGTH(keys); i++)
                        keys[i].pressed = 0;
        
       -        wa.override_redirect = True;
       +        wa.override_redirect = !wmborder;
                wa.border_pixel = dc.norm[ColFG];
                wa.background_pixel = dc.norm[ColBG];
                win = XCreateWindow(dpy, root, wx, wy, ww, wh, 0,
       t@@ -351,11 +369,27 @@ setup(void) {
                                    CWOverrideRedirect | CWBorderPixel | CWBackingPixel, &wa);
                XSelectInput(dpy, win, StructureNotifyMask|ButtonReleaseMask|
                                ButtonPressMask|ExposureMask|LeaveWindowMask);
       +
                wmh = XAllocWMHints();
                wmh->input = False;
                wmh->flags = InputHint;
                XSetWMHints(dpy, win, wmh);
       +        XStringListToTextProperty(&name, 1, &str);
       +        ch = XAllocClassHint();
       +        ch->res_class = name;
       +        ch->res_name = name;
       +
       +        XSetWMProperties(dpy, win, &str, &str, NULL, 0, NULL, wmh,
       +                        ch);
       +
       +        XFree(ch);
                XFree(wmh);
       +        XFree(str.value);
       +
       +        XStringListToTextProperty(&wintype, 1, &str);
       +        XSetTextProperty(dpy, win, &str, netatom[NetWMWindowType]);
       +        XFree(str.value);
       +
                XMapRaised(dpy, win);
                updatekeys();
                drawkeyboard();
       t@@ -399,12 +433,9 @@ unpress() {
        
        void
        updatekeys() {
       -        int rows, i, j;
       +        int i, j;
                int x = 0, y = 0, h, base;
        
       -        for(i = 0, rows = 1; i < LENGTH(keys); i++)
       -                if(keys[i].keysym == 0)
       -                        rows++;
                h = wh / rows;
                for(i = 0; i < LENGTH(keys); i++, rows--) {
                        for(j = i, base = 0; j < LENGTH(keys) && keys[j].keysym != 0; j++)
       t@@ -441,27 +472,25 @@ main(int argc, char *argv[]) {
                                die("svkbd-"VERSION", © 2006-2010 svkbd engineers,"
                                               " see LICENSE for details\n");
                        }
       -                if(!strcmp(argv[i], "-wh")) {
       -                        wh = atoi(argv[i+1]);
       -                        i++;
       -                        continue;
       -                }
       -                if(!strcmp(argv[i], "-ww")) {
       -                        ww = atoi(argv[i+1]);
       -                        i++;
       -                        continue;
       -                }
       -                if(!strcmp(argv[i], "-wx")) {
       -                        wx = atoi(argv[i+1]);
       -                        i++;
       -                        continue;
       -                }
       -                if(!strcmp(argv[i], "-wy")) {
       -                        wy = atoi(argv[i+1]);
       -                        i++;
       -                        continue;
       +                else if(argv[i][0] == '-' && argv[i][1] == 'w') {
       +                        switch(i >= argc - 1 ? 0 : argv[i][2]) {
       +                        case 'h':
       +                                wh = atoi(argv[i+1]);
       +                                break;
       +                        case 'w':
       +                                ww = atoi(argv[i+1]);
       +                                break;
       +                        case 'x':
       +                                wx = atoi(argv[i+1]);
       +                                break;
       +                        case 'y':
       +                                wy = atoi(argv[i+1]);
       +                                break;
       +                        default:
       +                                usage(argv[0]);
       +                        }
                        }
       -                if(!strcmp(argv[i], "-h"))
       +                else if(!strcmp(argv[i], "-h"))
                                usage(argv[0]);
                }