dwm-mark-new-6.1.diff (5815B)
1 diff -urp -x config.mk dwm-6.1/drw.h dwm-6.1-patched/drw.h 2 --- dwm-6.1/drw.h 2015-11-09 06:39:37.000000000 +0800 3 +++ dwm-6.1-patched/drw.h 2016-03-09 15:12:58.966751900 +0800 4 @@ -23,6 +23,7 @@ typedef struct { 5 Clr *fg; 6 Clr *bg; 7 Clr *border; 8 + Clr *mark; 9 } ClrScheme; 10 11 typedef struct { 12 diff -urp -x config.mk dwm-6.1/dwm.c dwm-6.1-patched/dwm.c 13 --- dwm-6.1/dwm.c 2015-11-09 06:39:37.000000000 +0800 14 +++ dwm-6.1-patched/dwm.c 2016-03-09 15:55:35.723676356 +0800 15 @@ -201,16 +201,20 @@ static void setclientstate(Client *c, lo 16 static void setfocus(Client *c); 17 static void setfullscreen(Client *c, int fullscreen); 18 static void setlayout(const Arg *arg); 19 +static void setmark(Client *c); 20 static void setmfact(const Arg *arg); 21 static void setup(void); 22 static void showhide(Client *c); 23 static void sigchld(int unused); 24 static void spawn(const Arg *arg); 25 +static void swapclient(const Arg *arg); 26 +static void swapfocus(const Arg *arg); 27 static void tag(const Arg *arg); 28 static void tagmon(const Arg *arg); 29 static void tile(Monitor *); 30 static void togglebar(const Arg *arg); 31 static void togglefloating(const Arg *arg); 32 +static void togglemark(const Arg *arg); 33 static void toggletag(const Arg *arg); 34 static void toggleview(const Arg *arg); 35 static void unfocus(Client *c, int setfocus); 36 @@ -266,6 +270,7 @@ static Display *dpy; 37 static Drw *drw; 38 static Monitor *mons, *selmon; 39 static Window root; 40 +static Client *mark; 41 42 /* configuration, allows nested code to access above variables */ 43 #include "config.h" 44 @@ -482,6 +487,7 @@ cleanup(void) 45 for (i = 0; i < CurLast; i++) 46 drw_cur_free(drw, cursor[i]); 47 for (i = 0; i < SchemeLast; i++) { 48 + drw_clr_free(scheme[i].mark); 49 drw_clr_free(scheme[i].border); 50 drw_clr_free(scheme[i].bg); 51 drw_clr_free(scheme[i].fg); 52 @@ -807,7 +813,10 @@ focus(Client *c) 53 detachstack(c); 54 attachstack(c); 55 grabbuttons(c, 1); 56 - XSetWindowBorder(dpy, c->win, scheme[SchemeSel].border->pix); 57 + if (c == mark) 58 + XSetWindowBorder(dpy, c->win, scheme[SchemeSel].mark->pix); 59 + else 60 + XSetWindowBorder(dpy, c->win, scheme[SchemeSel].border->pix); 61 setfocus(c); 62 } else { 63 XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); 64 @@ -1065,7 +1074,10 @@ manage(Window w, XWindowAttributes *wa) 65 66 wc.border_width = c->bw; 67 XConfigureWindow(dpy, w, CWBorderWidth, &wc); 68 - XSetWindowBorder(dpy, w, scheme[SchemeNorm].border->pix); 69 + if (c == mark) 70 + XSetWindowBorder(dpy, w, scheme[SchemeNorm].mark->pix); 71 + else 72 + XSetWindowBorder(dpy, w, scheme[SchemeNorm].border->pix); 73 configure(c); /* propagates border_width, if size doesn't change */ 74 updatewindowtype(c); 75 updatesizehints(c); 76 @@ -1528,6 +1540,23 @@ setlayout(const Arg *arg) 77 drawbar(selmon); 78 } 79 80 +void 81 +setmark(Client *c) 82 +{ 83 + if (c == mark) 84 + return; 85 + if (mark) { 86 + XSetWindowBorder(dpy, mark->win, scheme[mark == selmon->sel 87 + ? SchemeSel : SchemeNorm].border->pix); 88 + mark = 0; 89 + } 90 + if (c) { 91 + XSetWindowBorder(dpy, c->win, scheme[c == selmon->sel 92 + ? SchemeSel : SchemeNorm].mark->pix); 93 + mark = c; 94 + } 95 +} 96 + 97 /* arg > 1.0 will set mfact absolutly */ 98 void 99 setmfact(const Arg *arg) 100 @@ -1580,9 +1609,11 @@ setup(void) 101 cursor[CurResize] = drw_cur_create(drw, XC_sizing); 102 cursor[CurMove] = drw_cur_create(drw, XC_fleur); 103 /* init appearance */ 104 + scheme[SchemeNorm].mark = drw_clr_create(drw, normmarkcolor); 105 scheme[SchemeNorm].border = drw_clr_create(drw, normbordercolor); 106 scheme[SchemeNorm].bg = drw_clr_create(drw, normbgcolor); 107 scheme[SchemeNorm].fg = drw_clr_create(drw, normfgcolor); 108 + scheme[SchemeSel].mark = drw_clr_create(drw, selmarkcolor); 109 scheme[SchemeSel].border = drw_clr_create(drw, selbordercolor); 110 scheme[SchemeSel].bg = drw_clr_create(drw, selbgcolor); 111 scheme[SchemeSel].fg = drw_clr_create(drw, selfgcolor); 112 @@ -1646,6 +1677,66 @@ spawn(const Arg *arg) 113 } 114 115 void 116 +swapclient(const Arg *arg) 117 +{ 118 + Client *s, *m, t; 119 + 120 + if (!mark || !selmon->sel || mark == selmon->sel 121 + || !selmon->lt[selmon->sellt]->arrange) 122 + return; 123 + s = selmon->sel; 124 + m = mark; 125 + t = *s; 126 + strcpy(s->name, m->name); 127 + s->win = m->win; 128 + s->x = m->x; 129 + s->y = m->y; 130 + s->w = m->w; 131 + s->h = m->h; 132 + 133 + m->win = t.win; 134 + strcpy(m->name, t.name); 135 + m->x = t.x; 136 + m->y = t.y; 137 + m->w = t.w; 138 + m->h = t.h; 139 + 140 + selmon->sel = m; 141 + mark = s; 142 + focus(s); 143 + setmark(m); 144 + 145 + arrange(s->mon); 146 + if (s->mon != m->mon) { 147 + arrange(m->mon); 148 + } 149 +} 150 + 151 +void 152 +swapfocus(const Arg *arg) 153 +{ 154 + Client *t; 155 + 156 + if (!selmon->sel || !mark || selmon->sel == mark) 157 + return; 158 + t = selmon->sel; 159 + if (mark->mon != selmon) { 160 + unfocus(selmon->sel, 0); 161 + selmon = mark->mon; 162 + } 163 + if (ISVISIBLE(mark)) { 164 + focus(mark); 165 + restack(selmon); 166 + } else { 167 + selmon->seltags ^= 1; 168 + selmon->tagset[selmon->seltags] = mark->tags; 169 + focus(mark); 170 + arrange(selmon); 171 + } 172 + setmark(t); 173 +} 174 + 175 +void 176 tag(const Arg *arg) 177 { 178 if (selmon->sel && arg->ui & TAGMASK) { 179 @@ -1713,6 +1804,14 @@ togglefloating(const Arg *arg) 180 } 181 182 void 183 +togglemark(const Arg *arg) 184 +{ 185 + if (!selmon->sel) 186 + return; 187 + setmark(selmon->sel == mark ? 0 : selmon->sel); 188 +} 189 + 190 +void 191 toggletag(const Arg *arg) 192 { 193 unsigned int newtags; 194 @@ -1745,7 +1844,10 @@ unfocus(Client *c, int setfocus) 195 if (!c) 196 return; 197 grabbuttons(c, 0); 198 - XSetWindowBorder(dpy, c->win, scheme[SchemeNorm].border->pix); 199 + if (c == mark) 200 + XSetWindowBorder(dpy, c->win, scheme[SchemeNorm].mark->pix); 201 + else 202 + XSetWindowBorder(dpy, c->win, scheme[SchemeNorm].border->pix); 203 if (setfocus) { 204 XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); 205 XDeleteProperty(dpy, root, netatom[NetActiveWindow]); 206 @@ -1758,6 +1860,8 @@ unmanage(Client *c, int destroyed) 207 Monitor *m = c->mon; 208 XWindowChanges wc; 209 210 + if (c == mark) 211 + setmark(0); 212 /* The server grab construct avoids race conditions. */ 213 detach(c); 214 detachstack(c);