dwm-dualstatus-6.0.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
dwm-dualstatus-6.0.diff (4794B) | |
--- | |
1 diff --git a/config.def.h b/config.def.h | |
2 index 77ff358..ea9758d 100644 | |
3 --- a/config.def.h | |
4 +++ b/config.def.h | |
5 @@ -12,6 +12,7 @@ static const unsigned int borderpx = 1; /* bor… | |
6 static const unsigned int snap = 32; /* snap pixel */ | |
7 static const Bool showbar = True; /* False means no bar */ | |
8 static const Bool topbar = True; /* False means bottom b… | |
9 +static const Bool extrabar = True; /* False means no extra… | |
10 | |
11 /* tagging */ | |
12 static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "… | |
13 @@ -54,6 +55,7 @@ static Key keys[] = { | |
14 { MODKEY, XK_p, spawn, {.v … | |
15 { MODKEY|ShiftMask, XK_Return, spawn, {.v … | |
16 { MODKEY, XK_b, togglebar, {0} … | |
17 + { MODKEY, XK_b, toggleextrabar, {0} … | |
18 { MODKEY, XK_j, focusstack, {.i … | |
19 { MODKEY, XK_k, focusstack, {.i … | |
20 { MODKEY, XK_i, incnmaster, {.i … | |
21 diff --git a/dwm.c b/dwm.c | |
22 index 1d78655..b322ff5 100644 | |
23 --- a/dwm.c | |
24 +++ b/dwm.c | |
25 @@ -154,6 +154,13 @@ typedef struct { | |
26 int monitor; | |
27 } Rule; | |
28 | |
29 +typedef struct { | |
30 + int y; | |
31 + Bool show; | |
32 + Window win; | |
33 + char text[256]; | |
34 +} Bar; | |
35 + | |
36 /* function declarations */ | |
37 static void applyrules(Client *c); | |
38 static Bool applysizehints(Client *c, int *x, int *y, int *w, int *h, B… | |
39 @@ -229,6 +236,7 @@ static void tagmon(const Arg *arg); | |
40 static int textnw(const char *text, unsigned int len); | |
41 static void tile(Monitor *); | |
42 static void togglebar(const Arg *arg); | |
43 +static void toggleextrabar(const Arg *arg); | |
44 static void togglefloating(const Arg *arg); | |
45 static void toggletag(const Arg *arg); | |
46 static void toggleview(const Arg *arg); | |
47 @@ -283,6 +291,7 @@ static Display *dpy; | |
48 static DC dc; | |
49 static Monitor *mons = NULL, *selmon = NULL; | |
50 static Window root; | |
51 +static Bar eb; | |
52 | |
53 /* configuration, allows nested code to access above variables */ | |
54 #include "config.h" | |
55 @@ -495,6 +504,8 @@ cleanup(void) { | |
56 XFreeCursor(dpy, cursor[CurNormal]); | |
57 XFreeCursor(dpy, cursor[CurResize]); | |
58 XFreeCursor(dpy, cursor[CurMove]); | |
59 + XUnmapWindow(dpy, eb.win); | |
60 + XDestroyWindow(dpy, eb.win); | |
61 while(mons) | |
62 cleanupmon(mons); | |
63 XSync(dpy, False); | |
64 @@ -584,6 +595,7 @@ configurenotify(XEvent *e) { | |
65 updatebars(); | |
66 for(m = mons; m; m = m->next) | |
67 XMoveResizeWindow(dpy, m->barwin, m->wx… | |
68 + XMoveResizeWindow(dpy, eb.win, mons->wx, eb.y, … | |
69 focus(NULL); | |
70 arrange(NULL); | |
71 } | |
72 @@ -762,6 +774,10 @@ drawbar(Monitor *m) { | |
73 drawtext(NULL, dc.norm, False); | |
74 } | |
75 XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->ww, bh, … | |
76 + dc.x = 0; | |
77 + dc.w = m->ww; | |
78 + drawtext(eb.text, dc.norm, False); | |
79 + XCopyArea(dpy, dc.drawable, eb.win, dc.gc, 0, 0, m->ww, bh, 0, … | |
80 XSync(dpy, False); | |
81 } | |
82 | |
83 @@ -1594,6 +1610,7 @@ setup(void) { | |
84 sw = DisplayWidth(dpy, screen); | |
85 sh = DisplayHeight(dpy, screen); | |
86 bh = dc.h = dc.font.height + 2; | |
87 + eb.show = extrabar; | |
88 updategeom(); | |
89 /* init atoms */ | |
90 wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); | |
91 @@ -1736,6 +1753,16 @@ togglebar(const Arg *arg) { | |
92 } | |
93 | |
94 void | |
95 +toggleextrabar(const Arg *arg) { | |
96 + if(selmon == mons) { | |
97 + eb.show = !eb.show; | |
98 + updatebarpos(selmon); | |
99 + XMoveResizeWindow(dpy, eb.win, selmon->wx, eb.y, selmon… | |
100 + arrange(selmon); | |
101 + } | |
102 +} | |
103 + | |
104 +void | |
105 togglefloating(const Arg *arg) { | |
106 if(!selmon->sel) | |
107 return; | |
108 @@ -1833,6 +1860,13 @@ updatebars(void) { | |
109 XDefineCursor(dpy, m->barwin, cursor[CurNormal]); | |
110 XMapRaised(dpy, m->barwin); | |
111 } | |
112 + if(!eb.win) { | |
113 + eb.win = XCreateWindow(dpy, root, mons->wx, eb.y, mons-… | |
114 + CopyFromParent, DefaultVisual(dp… | |
115 + CWOverrideRedirect|CWBackPixmap|… | |
116 + XDefineCursor(dpy, eb.win, cursor[CurNormal]); | |
117 + XMapRaised(dpy, eb.win); | |
118 + } | |
119 } | |
120 | |
121 void | |
122 @@ -1846,6 +1880,13 @@ updatebarpos(Monitor *m) { | |
123 } | |
124 else | |
125 m->by = -bh; | |
126 + if(m == mons && eb.show) { | |
127 + m->wh -= bh; | |
128 + eb.y = topbar ? m->wy + m->wh : m->wy; | |
129 + m->wy = m->topbar ? m->wy : m->wy + bh; | |
130 + } | |
131 + else | |
132 + eb.y = -bh; | |
133 } | |
134 | |
135 Bool | |
136 @@ -2005,8 +2046,21 @@ updatetitle(Client *c) { | |
137 | |
138 void | |
139 updatestatus(void) { | |
140 - if(!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) | |
141 + char text[512]; | |
142 + if(!gettextprop(root, XA_WM_NAME, text, sizeof(text))) { | |
143 strcpy(stext, "dwm-"VERSION); | |
144 + eb.text[0] = '\0'; | |
145 + } | |
146 + else { | |
147 + char *e = strchr(text, ';'); | |
148 + if(e) { | |
149 + *e = '\0'; e++; | |
150 + strncpy(eb.text, e, sizeof(eb.text)-1); | |
151 + } | |
152 + else | |
153 + eb.text[0] = '\0'; | |
154 + strncpy(stext, text, sizeof(stext)-1); | |
155 + } | |
156 drawbar(selmon); | |
157 } | |
158 |