Hi folks, A few things:
1. Below is a very simple patch to dwm to make it play nice with onscreen keyboards. It could be improved, and especially I want to implement this: * If the osk (on screen keyboard, e.g., xvkbd) has the focus but it is focused on, say, app Q, then app Q and not osk should show up in the drawbar title. This is a pretty minor aesthetic problem. Otherwise, enjoy. 2. I noticed today that dmenu doesn't play nice with osks. If dmenu is opened first, and then I open an osk, everything is fine. If the osk is opened first, and then I open dmenu, dmenu hogs the focus and so I can't interact with it. Anyone have a fix for this? Here's the patch (sorry if its in a bit of a rough state): diff -r 23b71491e149 dwm.c --- a/dwm.c Thu Dec 02 10:16:47 2010 +0000 +++ b/dwm.c Mon Dec 20 15:42:40 2010 -0500 @@ -53,6 +53,7 @@ #define HEIGHT(X) ((X)->h + 2 * (X)->bw) #define TAGMASK ((1 << LENGTH(tags)) - 1) #define TEXTW(X) (textnw(X, strlen(X)) + dc.font.height) +#define ISPANEL(x) (ISVISIBLE(x)&&(strcmp("xvkbd - Virtual Keyboard",x->name) == 0)) /* enums */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ @@ -88,7 +89,7 @@ int basew, baseh, incw, inch, maxw, maxh, minw, minh; int bw, oldbw; unsigned int tags; - Bool isfixed, isfloating, isurgent, oldstate; + Bool isfixed, isfloating, isurgent, oldstate, isfocusable; Client *next; Client *snext; Monitor *mon; @@ -821,7 +822,8 @@ attachstack(c); grabbuttons(c, True); XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]); - XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); + if(c->isfocusable) + XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); } else XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); @@ -857,17 +859,17 @@ if(!selmon->sel) return; if(arg->i > 0) { - for(c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); + for(c = selmon->sel->next; c && (!ISVISIBLE(c) || ISPANEL(c)); c = c->next); if(!c) - for(c = selmon->clients; c && !ISVISIBLE(c); c = c->next); + for(c = selmon->clients; c && (!ISVISIBLE(c) || ISPANEL(c)); c = c->next); } else { for(i = selmon->clients; i != selmon->sel; i = i->next) - if(ISVISIBLE(i)) + if(ISVISIBLE(i) && !ISPANEL(i)) c = i; if(!c) for(; i; i = i->next) - if(ISVISIBLE(i)) + if(ISVISIBLE(i) && !ISPANEL(i)) c = i; } if(c) { @@ -1105,6 +1107,7 @@ c->w = c->oldw = wa->width; c->h = c->oldh = wa->height; c->oldbw = wa->border_width; + c->isfocusable = True; if(c->w == c->mon->mw && c->h == c->mon->mh) { c->isfloating = True; c->x = c->mon->mx; @@ -1936,6 +1939,7 @@ } else c->isurgent = (wmh->flags & XUrgencyHint) ? True : False; + c->isfocusable = !(wmh->flags & InputHint) || wmh->input; XFree(wmh); } } I also like to do the following and tuck the osk in underneath the drawbar: In dwm.c:setup() change: bh = dc.h = dc.font.height + 2; to: dc.h = dc.font.height + 2; bh = MAX(dc.font.height +2, barheight); Best, Peter -- sic dicit magister P PhD Candidate Collaborative Programme in Ancient and Medieval Philosophy University of Toronto http://individual.utoronto.ca/peterjh