dwm-canfocusrule-20200702-f709b19.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-canfocusrule-20200702-f709b19.diff (3070B)
       ---
            1 From f709b1910af85d8ff2fdd5c38215c204f8bb34e7 Mon Sep 17 00:00:00 2001
            2 From: Danil Demchenko <mail@d-demchenko.ru>
            3 Date: Fri, 7 Feb 2020 00:11:53 +0300
            4 Subject: [PATCH] Add  rule to remove the opportunity to focus certain windows.
            5  May be useful for tray applications.
            6 
            7 ---
            8  config.def.h |  6 +++---
            9  dwm.c        | 15 ++++++++++-----
           10  2 files changed, 13 insertions(+), 8 deletions(-)
           11 
           12 diff --git a/config.def.h b/config.def.h
           13 index 1c0b587..a4468eb 100644
           14 --- a/config.def.h
           15 +++ b/config.def.h
           16 @@ -26,9 +26,9 @@ static const Rule rules[] = {
           17           *        WM_CLASS(STRING) = instance, class
           18           *        WM_NAME(STRING) = title
           19           */
           20 -        /* class      instance    title       tags mask     isfloating   monitor */
           21 -        { "Gimp",     NULL,       NULL,       0,            1,           -1 },
           22 -        { "Firefox",  NULL,       NULL,       1 << 8,       0,           -1 },
           23 +        /* class      instance    title       tags mask     isfloating canfocus   monitor */
           24 +        { "Gimp",     NULL,       NULL,       0,            1,         1,         -1 },
           25 +        { "Firefox",  NULL,       NULL,       1 << 8,       0,         1,         -1 },
           26  };
           27  
           28  /* layout(s) */
           29 diff --git a/dwm.c b/dwm.c
           30 index 4465af1..c678e90 100644
           31 --- a/dwm.c
           32 +++ b/dwm.c
           33 @@ -92,7 +92,7 @@ struct Client {
           34          int basew, baseh, incw, inch, maxw, maxh, minw, minh;
           35          int bw, oldbw;
           36          unsigned int tags;
           37 -        int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
           38 +        int isfixed, isfloating, canfocus, isurgent, neverfocus, oldstate, isfullscreen;
           39          Client *next;
           40          Client *snext;
           41          Monitor *mon;
           42 @@ -138,6 +138,7 @@ typedef struct {
           43          const char *title;
           44          unsigned int tags;
           45          int isfloating;
           46 +    int canfocus;
           47          int monitor;
           48  } Rule;
           49  
           50 @@ -286,6 +287,7 @@ applyrules(Client *c)
           51  
           52          /* rule matching */
           53          c->isfloating = 0;
           54 +    c->canfocus = 1;
           55          c->tags = 0;
           56          XGetClassHint(dpy, c->win, &ch);
           57          class    = ch.res_class ? ch.res_class : broken;
           58 @@ -298,6 +300,7 @@ applyrules(Client *c)
           59                  && (!r->instance || strstr(instance, r->instance)))
           60                  {
           61                          c->isfloating = r->isfloating;
           62 +            c->canfocus = r->canfocus;
           63                          c->tags |= r->tags;
           64                          for (m = mons; m && m->num != r->monitor; m = m->next);
           65                          if (m)
           66 @@ -788,6 +791,8 @@ focus(Client *c)
           67          if (selmon->sel && selmon->sel != c)
           68                  unfocus(selmon->sel, 0);
           69          if (c) {
           70 +        if (!c->canfocus)
           71 +            return;
           72                  if (c->mon != selmon)
           73                          selmon = c->mon;
           74                  if (c->isurgent)
           75 @@ -837,16 +842,16 @@ focusstack(const Arg *arg)
           76          if (!selmon->sel)
           77                  return;
           78          if (arg->i > 0) {
           79 -                for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next);
           80 +                for (c = selmon->sel->next; c && (!ISVISIBLE(c) || !c->canfocus); c = c->next);
           81                  if (!c)
           82 -                        for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next);
           83 +                        for (c = selmon->clients; c && (!ISVISIBLE(c) || !c->canfocus); c = c->next);
           84          } else {
           85                  for (i = selmon->clients; i != selmon->sel; i = i->next)
           86 -                        if (ISVISIBLE(i))
           87 +                        if (ISVISIBLE(i) && i->canfocus)
           88                                  c = i;
           89                  if (!c)
           90                          for (; i; i = i->next)
           91 -                                if (ISVISIBLE(i))
           92 +                                if (ISVISIBLE(i) && i->canfocus)
           93                                          c = i;
           94          }
           95          if (c) {
           96 -- 
           97 2.25.0
           98