On 12:34 Thu 04 Jun , Jeremy Jay wrote: > On Thu 04 Jun 2009 - 03:55PM, thomasspur...@gmail.com wrote: > > On 16:07 Thu 04 Jun , pancake wrote: > > > isn't meta-0 the exposee you are looking for? didnt check your patch but > > > I prefer not to depend on composite or gl extensions that never work fine > > > > Thanks, but meta-0 is not what I am looking for; when I have a cluttered > > X session: > > 1) I can't actually see much of the individual windows > > 2) Any floating windows (gimp etc.) occlude the windows underneath > > 3) Selecting and jumping to one of the windows is a pain > > I must be missing something here.... You're using dwm, but you're using > the tags as virtual screens instead of tags? The whole point of tiling > window managers like dwm is that you don't have to do window management > (ie expose-like features)... If you have too many windows on your tags, > add more tags! If you can't find a window then you're doing it wrong. > > I suggest kicking your virtual-screen habits and using it as it was > intended, you'll save yourself a lot of time and effort. > > Jeremy
I think the main problem is that dwm cannot dynamically adjust the number/name of tags. I find it very hard to keep track of the number->application/task mapping in my head. I could change the names of the tags to meaningful names, but then I would end up with task(s) that have no corresponding tag - and I'm back to confusion. I have therefore implemented a patch to allow tags names to be changed dynamically. It basically allows commands to be sent to dwm by setting the DWM_COMMAND Property on the root window (in the same way that the status text works), the first letter of the string is the command. Currently only N is recognised, and changes the name of all the selected tags to n(<str>) where n is the tag number, and str is the remainder of the command string. I could not find a small shell program that could change a named property of the root window, so wrote my own (also attached). Example usage: xsetatom DWM_COMMAND NWork-dwm with tag 2 selected would cause tag two's name to become '2(Work-dwm)'. Setting the command to just N will cause the names of the selected tags to revert to just numbers. I have a nice little dmenu script so I can type in new tag names, and find it very useful. This patch allows other commands to be easily added (see runcommand()). Tom -- Thomas Spurden
/* * Set an XAtom to a single text value. * gcc xsetatom.c -lX11 -o xsetatom */ #include <X11/Xatom.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { Display* dpy; Window root; Atom atom; XTextProperty prop; if(argc < 3) { printf("Usage: xsetatom <name> <value>\n"); exit(EXIT_FAILURE); } dpy = XOpenDisplay(0); if(dpy == None) { fprintf(stderr, "Could not open display\n"); exit(EXIT_FAILURE); } root = DefaultRootWindow(dpy); atom = XInternAtom(dpy, argv[1], False); XStringListToTextProperty(&argv[2], 1, &prop); XSetTextProperty(dpy, root, &prop, atom); XSync(dpy, False); XCloseDisplay(dpy); exit(EXIT_SUCCESS); }
diff -r 440dda47ae5b config.def.h --- a/config.def.h Fri May 29 09:29:22 2009 +0100 +++ b/config.def.h Fri Jun 05 13:16:51 2009 +0100 @@ -14,7 +14,7 @@ static Bool topbar = True; /* False means bottom bar */ /* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; +static char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; static unsigned int tagset[] = {1, 1}; /* after start, first tag is selected */ static Rule rules[] = { diff -r 440dda47ae5b dwm.c --- a/dwm.c Fri May 29 09:29:22 2009 +0100 +++ b/dwm.c Fri Jun 05 13:16:51 2009 +0100 @@ -54,6 +54,8 @@ #define TAGMASK ((int)((1LL << LENGTH(tags)) - 1)) #define TEXTW(x) (textnw(x, strlen(x)) + dc.font.height) +#define MAXTAGLEN 64 + /* enums */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ enum { ColBorder, ColFG, ColBG, ColLast }; /* color */ @@ -202,6 +204,7 @@ static int xerrordummy(Display *dpy, XErrorEvent *ee); static int xerrorstart(Display *dpy, XErrorEvent *ee); static void zoom(const Arg *arg); +static void runcommand(void); /* variables */ static char stext[256]; @@ -226,7 +229,7 @@ [PropertyNotify] = propertynotify, [UnmapNotify] = unmapnotify }; -static Atom wmatom[WMLast], netatom[NetLast]; +static Atom wmatom[WMLast], netatom[NetLast], commandatom; static Bool otherwm; static Bool running = True; static Client *clients = NULL; @@ -1063,8 +1066,13 @@ Window trans; XPropertyEvent *ev = &e->xproperty; - if((ev->window == root) && (ev->atom == XA_WM_NAME)) - updatestatus(); + if(ev->window == root) { + if (ev->atom == XA_WM_NAME) { + updatestatus(); + } else if(ev->atom == commandatom) { + runcommand(); + } + } else if(ev->state == PropertyDelete) return; /* ignore */ else if((c = getclient(ev->window))) { @@ -1279,6 +1287,7 @@ wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); + commandatom = XInternAtom(dpy, "DWM_COMMAND", False); /* init cursors */ wa.cursor = cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr); @@ -1614,6 +1623,45 @@ } void +runcommand(void) { + char cmd[256]; + if(!gettextprop(root, commandatom, cmd, sizeof(cmd))) { + /* Ignore empty commands, also prevents infinite loop */ + return; + } + switch(cmd[0]) { + case 'N': + { + unsigned int ts = tagset[seltags]; + unsigned int i; + for(i = 0; ts != 0; i++, ts >>= 1) { + if(ts & 1) { + if(cmd[1] == '\0') { + snprintf(tags[i], MAXTAGLEN, "%u", i); + } else { + snprintf(tags[i], MAXTAGLEN, "%u(%s)", i, cmd + 1); + } + } + } + drawbar(); + } + break; + default: + fprintf(stderr, "dwm: Unknown command '%c'\n", cmd[0]); + break; + } + { /* Clear the command */ + XTextProperty prop = { + .value = NULL, + .encoding = XA_STRING, + .format = 8, + .nitems = 0 + }; + XSetTextProperty(dpy, root, &prop, commandatom); + } +} + +void updatewmhints(Client *c) { XWMHints *wmh;
pgppj7KRej94y.pgp
Description: PGP signature