dwm-mutlimonitorscratchpads-20211210-a786211.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-mutlimonitorscratchpads-20211210-a786211.diff (5125B)
       ---
            1 From 8c32f5ce2ed65cdb47452d658578bfe3f1dba81b Mon Sep 17 00:00:00 2001
            2 From: Hai Nguyen <hhai2105@gmail.com>
            3 Date: Fri, 10 Dec 2021 20:19:56 -0500
            4 Subject: [PATCH] added scratchpad struct, added togglescratch program, change
            5  struct Rule to have floating dimensions
            6 
            7 ---
            8  config.def.h | 11 +++++---
            9  dwm.c        | 72 +++++++++++++++++++++++++++++++++++++++++++++-------
           10  2 files changed, 71 insertions(+), 12 deletions(-)
           11 
           12 diff --git a/config.def.h b/config.def.h
           13 index a2ac963..bbd132a 100644
           14 --- a/config.def.h
           15 +++ b/config.def.h
           16 @@ -26,11 +26,14 @@ 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 +
           24 +        /* class        instance title        tags mask                isfloating                x, y, w, h                monitor */
           25 +
           26 +        {"Gimp",                        NULL,        NULL,        0,                1,                                -1,-1,-1,-1,                -1},
           27 +        {"Qalculate-gtk",        NULL,        NULL,        0,                1,                                .35,35,.3,.5,                -1},
           28  };
           29  
           30 +
           31  /* layout(s) */
           32  static const float mfact     = 0.55; /* factor of master area size [0.05..0.95] */
           33  static const int nmaster     = 1;    /* number of clients in master area */
           34 @@ -59,9 +62,11 @@ static const Layout layouts[] = {
           35  static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
           36  static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
           37  static const char *termcmd[]  = { "st", NULL };
           38 +static const scratchpad qalculate = {.class = "Qalculate-gtk", .v = (char *[]){"qalculate-gtk", NULL}};
           39  
           40  static Key keys[] = {
           41          /* modifier                     key        function        argument */
           42 +        {ControlMask,                                        XK_s,                togglescratch,                {.v = &qalculate } },
           43          { MODKEY,                       XK_p,      spawn,          {.v = dmenucmd } },
           44          { MODKEY|ShiftMask,             XK_Return, spawn,          {.v = termcmd } },
           45          { MODKEY,                       XK_b,      togglebar,      {0} },
           46 diff --git a/dwm.c b/dwm.c
           47 index 5e4d494..ba7dd1e 100644
           48 --- a/dwm.c
           49 +++ b/dwm.c
           50 @@ -82,6 +82,12 @@ typedef struct {
           51          const Arg arg;
           52  } Button;
           53  
           54 +typedef struct {
           55 +        const char* class;
           56 +        const char* title;
           57 +        const void* v;
           58 +} scratchpad;
           59 +
           60  typedef struct Monitor Monitor;
           61  typedef struct Client Client;
           62  struct Client {
           63 @@ -138,6 +144,7 @@ typedef struct {
           64          const char *title;
           65          unsigned int tags;
           66          int isfloating;
           67 +        float floatx, floaty, floatw, floath;
           68          int monitor;
           69  } Rule;
           70  
           71 @@ -214,6 +221,7 @@ static void togglebar(const Arg *arg);
           72  static void togglefloating(const Arg *arg);
           73  static void toggletag(const Arg *arg);
           74  static void toggleview(const Arg *arg);
           75 +static void togglescratch(const Arg *arg);
           76  static void unfocus(Client *c, int setfocus);
           77  static void unmanage(Client *c, int destroyed);
           78  static void unmapnotify(XEvent *e);
           79 @@ -295,15 +303,21 @@ applyrules(Client *c)
           80          for (i = 0; i < LENGTH(rules); i++) {
           81                  r = &rules[i];
           82                  if ((!r->title || strstr(c->name, r->title))
           83 -                && (!r->class || strstr(class, r->class))
           84 -                && (!r->instance || strstr(instance, r->instance)))
           85 -                {
           86 -                        c->isfloating = r->isfloating;
           87 -                        c->tags |= r->tags;
           88 -                        for (m = mons; m && m->num != r->monitor; m = m->next);
           89 -                        if (m)
           90 -                                c->mon = m;
           91 -                }
           92 +                        && (!r->class || strstr(class, r->class))
           93 +                        && (!r->instance || strstr(instance, r->instance)))
           94 +                        {
           95 +                                c->isfloating = r->isfloating;
           96 +                                c->tags |= r->tags;
           97 +                                for (m = mons; m && m->num != r->monitor; m = m->next);
           98 +                                if (m)
           99 +                                        c->mon = m;
          100 +                                if(c->isfloating){
          101 +                                        if (r->floatx >= 0) c->x = c->mon->mx + (int)((float)c->mon->mw * r->floatx);
          102 +                                        if (r->floaty >= 0) c->y = c->mon->my + (int)((float)c->mon->mh * r->floaty);
          103 +                                        if (r->floatw >= 0) c->w = (int)((float)c->mon->mw * r->floatw);
          104 +                                        if (r->floath >= 0) c->h = (int)((float)c->mon->mh * r->floath);
          105 +                                }
          106 +                        }
          107          }
          108          if (ch.res_class)
          109                  XFree(ch.res_class);
          110 @@ -1749,6 +1763,46 @@ toggleview(const Arg *arg)
          111          }
          112  }
          113  
          114 +void
          115 +togglescratch(const Arg *arg)
          116 +{
          117 +        Client *c;
          118 +        char found = 0;
          119 +        Monitor *m;
          120 +        for(m = mons; m; m = m->next){
          121 +                for (c = m->clients; c; c = c->next){
          122 +                        const char *class;
          123 +                        XClassHint ch = { NULL, NULL };
          124 +                        XGetClassHint(dpy, c->win, &ch);
          125 +                        class = ch.res_class ? ch.res_class : broken;
          126 +                        found = (((char *)((scratchpad *)arg->v)->class != NULL) && strcmp(class,(char *)((scratchpad *)arg->v)->class) == 0) || (((char *)((scratchpad *)arg->v)->title != NULL) && strcmp(c->name, (char *)((scratchpad *)arg->v)->title) == 0);
          127 +                        if(found){
          128 +                                break;
          129 +                        }
          130 +                }
          131 +                if(found){
          132 +                        break;
          133 +                }
          134 +        }
          135 +        if (found) {
          136 +                if(m != selmon){
          137 +                        sendmon(c, selmon);
          138 +                        c->tags = selmon->tagset[selmon->seltags];
          139 +                        applyrules(c);
          140 +                }else{
          141 +                        c->tags = ISVISIBLE(c) ? 1 << 31 : selmon->tagset[selmon->seltags];
          142 +                }
          143 +                focus(NULL);
          144 +                arrange(selmon);
          145 +                if (ISVISIBLE(c)) {
          146 +                        restack(selmon);
          147 +                        focus(c);
          148 +                }
          149 +        } else{
          150 +                spawn(&((Arg){.v = ((scratchpad *)arg->v)->v}));
          151 +        }
          152 +}
          153 +
          154  void
          155  unfocus(Client *c, int setfocus)
          156  {
          157 -- 
          158 2.34.1
          159