Jeremy Jay wrote:
I do a lot of roaming, and long story short, nm-applet is nearly a
requirement for me.  No biggie, I just run it in stalonetray and set
it to all tags, shoved up in the corner, only I've ran into two
little issues:

1) sticky windows put an indicator on every tag in the bar.  I know
   it's on every tag, I put it there, tell me something I don't know.
   The patch hides any window which has tags=~0 from the indicators.
     ( this is simply the 2 lines in drawbar() )

2) since it's on every tag, every time i switch tags, it is the first
   thing focused.  I dont need to type into a system tray, so the
   patch also adds a flag to designate a window as "nofocus" which
   tells dwm to skip it when trying to find a window to focus.

   To do this, I had to add a way to designate a window as nofocus, so
   Rule.isfloating is now a bitmask Rule.flags, with enums for the 3
   settings right now: Normal, Floating, NoFocus.

So my config.h, for example, has this Rule:
   { "stalonetray", NULL, NULL, ~0, Floating|NoFocus },

I've had a similar problem - I switch tags with keyboard very often and I don't want stalonetray to be moved away from the view.

I add another flag for the window, "islocked":

    { "stalonetray", NULL,  NULL,       0x1ff,     True,  True  },

The new flag means: "do not allow to change tags, and do not display tag indicator".

Probably this behaviour could/should be combined with your "nofocus" feature, i.e. locked windows should never get focus *at first*.

What do you think?

--Marcin
--- dwm.c.orig  2008-09-09 21:46:17.000000000 +0200
+++ dwm.c       2008-12-05 06:53:32.883218767 +0100
@@ -88,7 +88,7 @@
        int basew, baseh, incw, inch, maxw, maxh, minw, minh;
        int bw, oldbw;
        unsigned int tags;
-       Bool isfixed, isfloating, isurgent;
+       Bool isfixed, isfloating, isurgent, islocked;
        Client *next;
        Client *snext;
        Window win;
@@ -127,6 +127,7 @@
        const char *title;
        unsigned int tags;
        Bool isfloating;
+       Bool islocked;
 } Rule;
 
 /* function declarations */
@@ -259,6 +260,7 @@
                        && (!r->instance || (ch.res_name && strstr(ch.res_name, 
r->instance)))) {
                                c->isfloating = r->isfloating;
                                c->tags |= r->tags & TAGMASK;
+                               c->islocked = r->islocked;
                        }
                }
                if(ch.res_class)
@@ -497,9 +499,11 @@
        Client *c;
 
        for(c = clients; c; c = c->next) {
-               occ |= c->tags;
-               if(c->isurgent)
-                       urg |= c->tags;
+               if (!c->islocked) {
+                       occ |= c->tags;
+                       if(c->isurgent)
+                               urg |= c->tags;
+               }
        }
 
        dc.x = 0;
@@ -1405,8 +1409,10 @@
 void
 tag(const Arg *arg) {
        if(sel && arg->ui & TAGMASK) {
-               sel->tags = arg->ui & TAGMASK;
-               arrange();
+               if (!sel->islocked) {
+                       sel->tags = arg->ui & TAGMASK;
+                       arrange();
+               }
        }
 }
 
@@ -1467,6 +1473,9 @@
 togglefloating(const Arg *arg) {
        if(!sel)
                return;
+       if (sel->islocked)
+               return;
+
        sel->isfloating = !sel->isfloating || sel->isfixed;
        if(sel->isfloating)
                resize(sel, sel->x, sel->y, sel->w, sel->h, True);
@@ -1479,6 +1488,8 @@
 
        if (!sel)
                return;
+       if (sel->islocked)
+               return;
        
        mask = sel->tags ^ (arg->ui & TAGMASK);
        if(sel && mask) {

Reply via email to