Hi,

It's dishwasher time for my keyboard. For the days it'll be drying, any
ideas how to get a virtual keyboard like xkbd, xvkbd, or matchbox-keyboard
(last one seems nice enough) to run with dwm?

They all seem to work by drawing a window that is supposed to never receive
keyboard focus from the wm (see attachment), but *will* receive mouse button
clicks (?!).

Regards,
Peter
diff --git a/config.def.h b/config.def.h
index bb60471..38f765a 100644
--- a/config.def.h
+++ b/config.def.h
@@ -20,9 +20,9 @@ static const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", 
"5", "6", "7", "8",
 static unsigned int tagset[] = {1, 1}; /* after start, first tag is selected */
 
 static Rule rules[] = {
-       /* class      instance    title       tags mask     isfloating */
-       { "Gimp",     NULL,       NULL,       0,            True },
-       { "Firefox",  NULL,       NULL,       1 << 8,       True },
+       /* class      instance    title       tags mask     flags */
+       { "Gimp",     NULL,       NULL,       0,            Floating },
+       { "Firefox",  NULL,       NULL,       1 << 8,       Floating },
 };
 
 /* layout(s) */
diff --git a/dwm.c b/dwm.c
index 77a91ac..fbdae45 100644
--- a/dwm.c
+++ b/dwm.c
@@ -45,6 +45,7 @@
 #define CLEANMASK(mask)         (mask & ~(numlockmask|LockMask))
 #define INRECT(X,Y,RX,RY,RW,RH) ((X) >= (RX) && (X) < (RX) + (RW) && (Y) >= 
(RY) && (Y) < (RY) + (RH))
 #define ISVISIBLE(x)            (x->tags & tagset[seltags])
+#define ISFOCUSABLE(x)          (ISVISIBLE(x) && !(x)->nofocus)
 #define LENGTH(x)               (sizeof x / sizeof x[0])
 #define MAX(a, b)               ((a) > (b) ? (a) : (b))
 #define MIN(a, b)               ((a) < (b) ? (a) : (b))
@@ -62,6 +63,7 @@ enum { NetSupported, NetWMName, NetLast };              /* 
EWMH atoms */
 enum { WMProtocols, WMDelete, WMState, WMLast };        /* default atoms */
 enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
        ClkClientWin, ClkRootWin, ClkLast };             /* clicks */
+enum { Normal, Floating, NoFocus };                     /* flags */
 
 typedef union {
        int i;
@@ -86,7 +88,7 @@ struct Client {
        int basew, baseh, incw, inch, maxw, maxh, minw, minh;
        int bw, oldbw;
        unsigned int tags;
-       Bool isfixed, isfloating, isurgent;
+       Bool isfixed, isfloating, isurgent, nofocus;
        Client *next;
        Client *snext;
        Window win;
@@ -124,7 +126,7 @@ typedef struct {
        const char *instance;
        const char *title;
        unsigned int tags;
-       Bool isfloating;
+       unsigned int flags;
 } Rule;
 
 /* function declarations */
@@ -268,7 +270,8 @@ applyrules(Client *c) {
                        if((!r->title || strstr(c->name, r->title))
                        && (!r->class || (ch.res_class && strstr(ch.res_class, 
r->class)))
                        && (!r->instance || (ch.res_name && strstr(ch.res_name, 
r->instance)))) {
-                               c->isfloating = r->isfloating;
+                               c->isfloating = r->flags & Floating;
+                               c->nofocus = r->flags & NoFocus;
                                c->tags |= r->tags & TAGMASK ? r->tags & 
TAGMASK : tagset[seltags]; 
                        }
                }
@@ -614,8 +617,8 @@ expose(XEvent *e) {
 
 void
 focus(Client *c) {
-       if(!c || !ISVISIBLE(c))
-               for(c = stack; c && !ISVISIBLE(c); c = c->snext);
+       if(!c || !ISFOCUSABLE(c))
+               for(c = stack; c && !ISFOCUSABLE(c); c = c->snext);
        if(sel && sel != c) {
                grabbuttons(sel, False);
                XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]);
@@ -650,17 +653,17 @@ focusstack(const Arg *arg) {
        if(!sel)
                return;
        if (arg->i > 0) {
-               for(c = sel->next; c && !ISVISIBLE(c); c = c->next);
+               for(c = sel->next; c && !ISFOCUSABLE(c); c = c->next);
                if(!c)
-                       for(c = clients; c && !ISVISIBLE(c); c = c->next);
+                       for(c = clients; c && !ISFOCUSABLE(c); c = c->next);
        }
        else {
                for(i = clients; i != sel; i = i->next)
-                       if(ISVISIBLE(i))
+                       if(ISFOCUSABLE(i))
                                c = i;
                if(!c)
                        for(; i; i = i->next)
-                               if(ISVISIBLE(i))
+                               if(ISFOCUSABLE(i))
                                        c = i;
        }
        if(c) {

Reply via email to