Xinqi Bao's Git
projects
/
dwm.git
/ blobdiff
summary
|
log
|
commit
|
diff
|
tree
raw
|
inline
| side by side
applied another patch of Hiltjo, thanks
[dwm.git]
/
dwm.c
diff --git
a/dwm.c
b/dwm.c
index
fedf069
..
1297b2b
100644
(file)
--- a/
dwm.c
+++ b/
dwm.c
@@
-84,10
+84,11
@@
struct Client {
char name[256];
float mina, maxa;
int x, y, w, h;
char name[256];
float mina, maxa;
int x, y, w, h;
+ int oldx, oldy, oldw, oldh;
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
int bw, oldbw;
unsigned int tags;
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
int bw, oldbw;
unsigned int tags;
- Bool isfixed, isfloating, isurgent;
+ Bool isfixed, isfloating, isurgent
, oldstate
;
Client *next;
Client *snext;
Monitor *mon;
Client *next;
Client *snext;
Monitor *mon;
@@
-202,6
+203,7
@@
static Monitor *ptrtomon(int x, int y);
static void propertynotify(XEvent *e);
static void quit(const Arg *arg);
static void resize(Client *c, int x, int y, int w, int h, Bool interact);
static void propertynotify(XEvent *e);
static void quit(const Arg *arg);
static void resize(Client *c, int x, int y, int w, int h, Bool interact);
+static void resizeclient(Client *c, int x, int y, int w, int h);
static void resizemouse(const Arg *arg);
static void restack(Monitor *m);
static void run(void);
static void resizemouse(const Arg *arg);
static void restack(Monitor *m);
static void run(void);
@@
-222,7
+224,7
@@
static void togglebar(const Arg *arg);
static void togglefloating(const Arg *arg);
static void toggletag(const Arg *arg);
static void toggleview(const Arg *arg);
static void togglefloating(const Arg *arg);
static void toggletag(const Arg *arg);
static void toggleview(const Arg *arg);
-static void unfocus(Client *c);
+static void unfocus(Client *c
, Bool setfocus
);
static void unmanage(Client *c, Bool destroyed);
static void unmapnotify(XEvent *e);
static Bool updategeom(void);
static void unmanage(Client *c, Bool destroyed);
static void unmapnotify(XEvent *e);
static Bool updategeom(void);
@@
-265,7
+267,6
@@
static void (*handler[LASTEvent]) (XEvent *) = {
[UnmapNotify] = unmapnotify
};
static Atom wmatom[WMLast], netatom[NetLast];
[UnmapNotify] = unmapnotify
};
static Atom wmatom[WMLast], netatom[NetLast];
-static Bool otherwm;
static Bool running = True;
static Cursor cursor[CurLast];
static Display *dpy;
static Bool running = True;
static Cursor cursor[CurLast];
static Display *dpy;
@@
-370,10
+371,8
@@
applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact) {
if(c->inch)
*h -= *h % c->inch;
/* restore base dimensions */
if(c->inch)
*h -= *h % c->inch;
/* restore base dimensions */
- *w += c->basew;
- *h += c->baseh;
- *w = MAX(*w, c->minw);
- *h = MAX(*h, c->minh);
+ *w = MAX(*w + c->basew, c->minw);
+ *h = MAX(*h + c->baseh, c->minh);
if(c->maxw)
*w = MIN(*w, c->maxw);
if(c->maxh)
if(c->maxw)
*w = MIN(*w, c->maxw);
if(c->maxh)
@@
-426,7
+425,7
@@
buttonpress(XEvent *e) {
click = ClkRootWin;
/* focus monitor if necessary */
if((m = wintomon(ev->window)) && m != selmon) {
click = ClkRootWin;
/* focus monitor if necessary */
if((m = wintomon(ev->window)) && m != selmon) {
- unfocus(selmon->sel);
+ unfocus(selmon->sel
, True
);
selmon = m;
focus(NULL);
}
selmon = m;
focus(NULL);
}
@@
-458,13
+457,10
@@
buttonpress(XEvent *e) {
void
checkotherwm(void) {
void
checkotherwm(void) {
- otherwm = False;
xerrorxlib = XSetErrorHandler(xerrorstart);
/* this causes an error if some other window manager is running */
XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask);
XSync(dpy, False);
xerrorxlib = XSetErrorHandler(xerrorstart);
/* this causes an error if some other window manager is running */
XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask);
XSync(dpy, False);
- if(otherwm)
- die("dwm: another window manager is already running\n");
XSetErrorHandler(xerror);
XSync(dpy, False);
}
XSetErrorHandler(xerror);
XSync(dpy, False);
}
@@
-788,20
+784,16
@@
drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
void
enternotify(XEvent *e) {
void
enternotify(XEvent *e) {
- Client *c;
Monitor *m;
XCrossingEvent *ev = &e->xcrossing;
if((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root)
return;
if((m = wintomon(ev->window)) && m != selmon) {
Monitor *m;
XCrossingEvent *ev = &e->xcrossing;
if((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root)
return;
if((m = wintomon(ev->window)) && m != selmon) {
- unfocus(selmon->sel);
+ unfocus(selmon->sel
, True
);
selmon = m;
}
selmon = m;
}
- if((c = wintoclient(ev->window)))
- focus(c);
- else
- focus(NULL);
+ focus((wintoclient(ev->window)));
}
void
}
void
@@
-817,8
+809,9
@@
void
focus(Client *c) {
if(!c || !ISVISIBLE(c))
for(c = selmon->stack; c && !ISVISIBLE(c); c = c->snext);
focus(Client *c) {
if(!c || !ISVISIBLE(c))
for(c = selmon->stack; c && !ISVISIBLE(c); c = c->snext);
- if(selmon->sel)
- unfocus(selmon->sel);
+ /* was if(selmon->sel) */
+ if(selmon->sel && selmon->sel != c)
+ unfocus(selmon->sel, False);
if(c) {
if(c->mon != selmon)
selmon = c->mon;
if(c) {
if(c->mon != selmon)
selmon = c->mon;
@@
-846,13
+839,13
@@
focusin(XEvent *e) { /* there are some broken focus acquiring clients */
void
focusmon(const Arg *arg) {
void
focusmon(const Arg *arg) {
- Monitor *m
= NULL
;
+ Monitor *m;
if(!mons->next)
return;
if((m = dirtomon(arg->i)) == selmon)
return;
if(!mons->next)
return;
if((m = dirtomon(arg->i)) == selmon)
return;
- unfocus(selmon->sel);
+ unfocus(selmon->sel
, True
);
selmon = m;
focus(NULL);
}
selmon = m;
focus(NULL);
}
@@
-904,15
+897,14
@@
getrootptr(int *x, int *y) {
long
getstate(Window w) {
long
getstate(Window w) {
- int format
, status
;
+ int format;
long result = -1;
unsigned char *p = NULL;
unsigned long n, extra;
Atom real;
long result = -1;
unsigned char *p = NULL;
unsigned long n, extra;
Atom real;
- status = XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState],
- &real, &format, &n, &extra, (unsigned char **)&p);
- if(status != Success)
+ if(XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState],
+ &real, &format, &n, &extra, (unsigned char **)&p) != Success)
return -1;
if(n != 0)
result = *p;
return -1;
if(n != 0)
result = *p;
@@
-988,7
+980,7
@@
grabkeys(void) {
void
initfont(const char *fontstr) {
char *def, **missing;
void
initfont(const char *fontstr) {
char *def, **missing;
- int
i,
n;
+ int n;
missing = NULL;
dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
missing = NULL;
dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
@@
-998,14
+990,13
@@
initfont(const char *fontstr) {
XFreeStringList(missing);
}
if(dc.font.set) {
XFreeStringList(missing);
}
if(dc.font.set) {
- XFontSetExtents *font_extents;
XFontStruct **xfonts;
char **font_names;
dc.font.ascent = dc.font.descent = 0;
XFontStruct **xfonts;
char **font_names;
dc.font.ascent = dc.font.descent = 0;
-
font_extents =
XExtentsOfFontSet(dc.font.set);
+ XExtentsOfFontSet(dc.font.set);
n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
-
for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++
) {
+
while(n--
) {
dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent);
dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent);
xfonts++;
dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent);
dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent);
xfonts++;
@@
-1023,14
+1014,13
@@
initfont(const char *fontstr) {
Bool
isprotodel(Client *c) {
Bool
isprotodel(Client *c) {
- int
i,
n;
+ int n;
Atom *protocols;
Bool ret = False;
if(XGetWMProtocols(dpy, c->win, &protocols, &n)) {
Atom *protocols;
Bool ret = False;
if(XGetWMProtocols(dpy, c->win, &protocols, &n)) {
- for(i = 0; !ret && i < n; i++)
- if(protocols[i] == wmatom[WMDelete])
- ret = True;
+ while(!ret && n--)
+ ret = protocols[n] == wmatom[WMDelete];
XFree(protocols);
}
return ret;
XFree(protocols);
}
return ret;
@@
-1038,12
+1028,10
@@
isprotodel(Client *c) {
#ifdef XINERAMA
static Bool
#ifdef XINERAMA
static Bool
-isuniquegeom(XineramaScreenInfo *unique, size_t len, XineramaScreenInfo *info) {
- unsigned int i;
-
- for(i = 0; i < len; i++)
- if(unique[i].x_org == info->x_org && unique[i].y_org == info->y_org
- && unique[i].width == info->width && unique[i].height == info->height)
+isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) {
+ while(n--)
+ if(unique[n].x_org == info->x_org && unique[n].y_org == info->y_org
+ && unique[n].width == info->width && unique[n].height == info->height)
return False;
return True;
}
return False;
return True;
}
@@
-1092,19
+1080,15
@@
killclient(const Arg *arg) {
void
manage(Window w, XWindowAttributes *wa) {
void
manage(Window w, XWindowAttributes *wa) {
- static Client cz;
Client *c, *t = NULL;
Window trans = None;
XWindowChanges wc;
Client *c, *t = NULL;
Window trans = None;
XWindowChanges wc;
- if(!(c =
malloc(
sizeof(Client))))
+ if(!(c =
calloc(1,
sizeof(Client))))
die("fatal: could not malloc() %u bytes\n", sizeof(Client));
die("fatal: could not malloc() %u bytes\n", sizeof(Client));
- *c = cz;
c->win = w;
updatetitle(c);
c->win = w;
updatetitle(c);
- if(XGetTransientForHint(dpy, w, &trans))
- t = wintoclient(trans);
- if(t) {
+ if(XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) {
c->mon = t->mon;
c->tags = t->tags;
}
c->mon = t->mon;
c->tags = t->tags;
}
@@
-1113,12
+1097,13
@@
manage(Window w, XWindowAttributes *wa) {
applyrules(c);
}
/* geometry */
applyrules(c);
}
/* geometry */
- c->x = wa->x + c->mon->wx;
- c->y = wa->y + c->mon->wy;
- c->w = wa->width;
- c->h = wa->height;
+ c->x =
c->oldx =
wa->x + c->mon->wx;
+ c->y =
c->oldy =
wa->y + c->mon->wy;
+ c->w =
c->oldw =
wa->width;
+ c->h =
c->oldh =
wa->height;
c->oldbw = wa->border_width;
if(c->w == c->mon->mw && c->h == c->mon->mh) {
c->oldbw = wa->border_width;
if(c->w == c->mon->mw && c->h == c->mon->mh) {
+ c->isfloating = True;
c->x = c->mon->mx;
c->y = c->mon->my;
c->bw = 0;
c->x = c->mon->mx;
c->y = c->mon->my;
c->bw = 0;
@@
-1142,7
+1127,7
@@
manage(Window w, XWindowAttributes *wa) {
XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
grabbuttons(c, False);
if(!c->isfloating)
XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
grabbuttons(c, False);
if(!c->isfloating)
- c->isfloating = trans != None || c->isfixed;
+ c->isfloating =
c->oldstate =
trans != None || c->isfixed;
if(c->isfloating)
XRaiseWindow(dpy, c->win);
attach(c);
if(c->isfloating)
XRaiseWindow(dpy, c->win);
attach(c);
@@
-1217,7
+1202,7
@@
movemouse(const Arg *arg) {
case MotionNotify:
nx = ocx + (ev.xmotion.x - x);
ny = ocy + (ev.xmotion.y - y);
case MotionNotify:
nx = ocx + (ev.xmotion.x - x);
ny = ocy + (ev.xmotion.y - y);
- if(
snap &&
nx >= selmon->wx && nx <= selmon->wx + selmon->ww
+ if(nx >= selmon->wx && nx <= selmon->wx + selmon->ww
&& ny >= selmon->wy && ny <= selmon->wy + selmon->wh) {
if(abs(selmon->wx - nx) < snap)
nx = selmon->wx;
&& ny >= selmon->wy && ny <= selmon->wy + selmon->wh) {
if(abs(selmon->wx - nx) < snap)
nx = selmon->wx;
@@
-1274,8
+1259,8
@@
propertynotify(XEvent *e) {
switch (ev->atom) {
default: break;
case XA_WM_TRANSIENT_FOR:
switch (ev->atom) {
default: break;
case XA_WM_TRANSIENT_FOR:
- XGetTransientForHint(dpy, c->win, &trans);
-
if(!c->isfloating && (c->isfloating = (wintoclient(trans) != NULL)
))
+ if(!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) &&
+
(c->isfloating = (wintoclient(trans)) != NULL
))
arrange(c->mon);
break;
case XA_WM_NORMAL_HINTS:
arrange(c->mon);
break;
case XA_WM_NORMAL_HINTS:
@@
-1297,14
+1282,33
@@
propertynotify(XEvent *e) {
void
clientmessage(XEvent *e) {
XClientMessageEvent *cme = &e->xclient;
void
clientmessage(XEvent *e) {
XClientMessageEvent *cme = &e->xclient;
+ Client *c;
- if(cme->message_type == netatom[NetWMState] && cme->data.l[1] == netatom[NetWMFullscreen]) {
- if(cme->data.l[0])
+ if((c = wintoclient(cme->window))
+ && (cme->message_type == netatom[NetWMState] && cme->data.l[1] == netatom[NetWMFullscreen]))
+ {
+ if(cme->data.l[0]) {
XChangeProperty(dpy, cme->window, netatom[NetWMState], XA_ATOM, 32,
PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1);
XChangeProperty(dpy, cme->window, netatom[NetWMState], XA_ATOM, 32,
PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1);
- else
+ c->oldstate = c->isfloating;
+ c->oldbw = c->bw;
+ c->bw = 0;
+ c->isfloating = True;
+ resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh);
+ XRaiseWindow(dpy, c->win);
+ }
+ else {
XChangeProperty(dpy, cme->window, netatom[NetWMState], XA_ATOM, 32,
PropModeReplace, (unsigned char*)0, 0);
XChangeProperty(dpy, cme->window, netatom[NetWMState], XA_ATOM, 32,
PropModeReplace, (unsigned char*)0, 0);
+ c->isfloating = c->oldstate;
+ c->bw = c->oldbw;
+ c->x = c->oldx;
+ c->y = c->oldy;
+ c->w = c->oldw;
+ c->h = c->oldh;
+ resizeclient(c, c->x, c->y, c->w, c->h);
+ arrange(c->mon);
+ }
}
}
}
}
@@
-1315,18
+1319,22
@@
quit(const Arg *arg) {
void
resize(Client *c, int x, int y, int w, int h, Bool interact) {
void
resize(Client *c, int x, int y, int w, int h, Bool interact) {
+ if(applysizehints(c, &x, &y, &w, &h, interact))
+ resizeclient(c, x, y, w, h);
+}
+
+void
+resizeclient(Client *c, int x, int y, int w, int h) {
XWindowChanges wc;
XWindowChanges wc;
- if(applysizehints(c, &x, &y, &w, &h, interact)) {
- c->x = wc.x = x;
- c->y = wc.y = y;
- c->w = wc.width = w;
- c->h = wc.height = h;
- wc.border_width = c->bw;
- XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
- configure(c);
- XSync(dpy, False);
- }
+ c->oldx = c->x; c->x = wc.x = x;
+ c->oldy = c->y; c->y = wc.y = y;
+ c->oldw = c->w; c->w = wc.width = w;
+ c->oldh = c->h; c->h = wc.height = h;
+ wc.border_width = c->bw;
+ XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
+ configure(c);
+ XSync(dpy, False);
}
void
}
void
@@
-1357,8
+1365,8
@@
resizemouse(const Arg *arg) {
case MotionNotify:
nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1);
nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1);
case MotionNotify:
nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1);
nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1);
- if(
snap && nw >= selmon->wx &&
nw <= selmon->wx + selmon->ww
- &&
nh >= selmon->wy &&
nh <= selmon->wy + selmon->wh)
+ if(
c->mon->wx + nw >= selmon->wx && c->mon->wx +
nw <= selmon->wx + selmon->ww
+ &&
c->mon->wy + nh >= selmon->wy && c->mon->wy +
nh <= selmon->wy + selmon->wh)
{
if(!c->isfloating && selmon->lt[selmon->sellt]->arrange
&& (abs(nw - c->w) > snap || abs(nh - c->h) > snap))
{
if(!c->isfloating && selmon->lt[selmon->sellt]->arrange
&& (abs(nw - c->w) > snap || abs(nh - c->h) > snap))
@@
-1444,7
+1452,7
@@
void
sendmon(Client *c, Monitor *m) {
if(c->mon == m)
return;
sendmon(Client *c, Monitor *m) {
if(c->mon == m)
return;
- unfocus(c);
+ unfocus(c
, True
);
detach(c);
detachstack(c);
c->mon = m;
detach(c);
detachstack(c);
c->mon = m;
@@
-1561,7
+1569,6
@@
showhide(Client *c) {
}
}
}
}
-
void
sigchld(int unused) {
if(signal(SIGCHLD, sigchld) == SIG_ERR)
void
sigchld(int unused) {
if(signal(SIGCHLD, sigchld) == SIG_ERR)
@@
-1681,12
+1688,13
@@
toggleview(const Arg *arg) {
}
void
}
void
-unfocus(Client *c) {
+unfocus(Client *c
, Bool setfocus
) {
if(!c)
return;
grabbuttons(c, False);
XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
if(!c)
return;
grabbuttons(c, False);
XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
- XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
+ if(setfocus)
+ XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
}
void
}
void
@@
-1764,7
+1772,6
@@
updategeom(void) {
XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn);
XineramaScreenInfo *unique = NULL;
XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn);
XineramaScreenInfo *unique = NULL;
- info = XineramaQueryScreens(dpy, &nn);
for(n = 0, m = mons; m; m = m->next, n++);
/* only consider unique geometries as separate screens */
if(!(unique = (XineramaScreenInfo *)malloc(sizeof(XineramaScreenInfo) * nn)))
for(n = 0, m = mons; m; m = m->next, n++);
/* only consider unique geometries as separate screens */
if(!(unique = (XineramaScreenInfo *)malloc(sizeof(XineramaScreenInfo) * nn)))
@@
-1997,7
+2004,7
@@
xerrordummy(Display *dpy, XErrorEvent *ee) {
* is already running. */
int
xerrorstart(Display *dpy, XErrorEvent *ee) {
* is already running. */
int
xerrorstart(Display *dpy, XErrorEvent *ee) {
-
otherwm = True
;
+
die("dwm: another window manager is already running\n")
;
return -1;
}
return -1;
}