changeset: 1822:6171d971355e
tag: tip
user: Kris Maglione <jg_AT_suckless.org>
date: Fri Feb 09 22:06:07 2007 -0500
summary: Unmap and set Iconic state of iconic or out-of-view windows
diff -r 12b661434242 -r 6171d971355e client.c
--- a/client.c Fri Feb 09 21:29:21 2007 -0500
+++ b/client.c Fri Feb 09 22:06:07 2007 -0500
@@ -155,14 +155,6 @@ update_client_grab(Client *c) {
}
void
-set_client_state(Client * c, int state)
-{
- long data[] = { state, None };
- XChangeProperty(blz.dpy, c->win, wm_atom[WMState], wm_atom[WMState], 32,
- PropModeReplace, (unsigned char *) data, 2);
-}
-
-void
focus_client(Client *c, Bool restack) {
Client *old_in_area;
Client *old;
@@ -213,19 +205,31 @@ focus_client(Client *c, Bool restack) {
}
void
+set_client_state(Client * c, int state)
+{
+ long data[] = { state, None };
+ XChangeProperty(blz.dpy, c->win, wm_atom[WMState], wm_atom[WMState], 32,
+ PropModeReplace, (unsigned char *) data, 2);
+}
+
+void
map_client(Client *c) {
XSelectInput(blz.dpy, c->win, CLIENT_MASK & ~StructureNotifyMask);
XMapWindow(blz.dpy, c->win);
XSelectInput(blz.dpy, c->win, CLIENT_MASK);
set_client_state(c, NormalState);
-}
-
-void
-unmap_client(Client *c) {
+ c->mapped = 1;
+}
+
+void
+unmap_client(Client *c, int state) {
XSelectInput(blz.dpy, c->win, CLIENT_MASK & ~StructureNotifyMask);
XUnmapWindow(blz.dpy, c->win);
XSelectInput(blz.dpy, c->win, CLIENT_MASK);
- set_client_state(c, WithdrawnState);
+ set_client_state(c, state);
+ c->mapped = 0;
+ /* Always set this, since we don't care anymore once it's been destroyed */
+ c->unmapped++;
}
void
@@ -399,14 +403,15 @@ destroy_client(Client *c) {
c->rect.x = c->sel->rect.x;
c->rect.y = c->sel->rect.y;
}
+ for(tc=&client; *tc && *tc != c; tc=&(*tc)->next)
+ if(*tc == c) break;
+ assert(*tc == c);
+ *tc = c->next;
update_client_views(c, &dummy);
- unmap_client(c);
+ unmap_client(c, WithdrawnState);
reparent_client(c, blz.root, c->rect.x, c->rect.y);
XFreeGC(blz.dpy, c->gc);
XDestroyWindow(blz.dpy, c->framewin);
- for(tc=&client; *tc && *tc != c; tc=&(*tc)->next);
- assert(*tc == c);
- *tc = c->next;
update_views();
free(c);
XSync(blz.dpy, False);
@@ -502,19 +507,22 @@ resize_client(Client *c, XRectangle *r)
if(f->area->view == screen->sel)
XMoveResizeWindow(blz.dpy, c->framewin, f->rect.x,
f->rect.y, f->rect.width, f->rect.height);
- else
- XMoveResizeWindow(blz.dpy, c->framewin, 2 * screen->rect.width + f->rect.x,
- f->rect.y, f->rect.width, f->rect.height);
+ else {
+ unmap_client(c, IconicState);
+ XUnmapWindow(blz.dpy, c->framewin);
+ }
c->rect.x = def.border;
c->rect.y = labelh(&def.font);
if((f->area->sel == f) || (f->area->mode != Colstack)) {
+ if(!c->mapped)
+ map_client(c);
c->rect.width = f->rect.width - 2 * def.border;
c->rect.height = f->rect.height - def.border - labelh(&def.font);
- }
-
- XMoveResizeWindow(blz.dpy, c->win, c->rect.x, c->rect.y,
+ XMoveResizeWindow(blz.dpy, c->win, c->rect.x, c->rect.y,
c->rect.width, c->rect.height);
+ }else
+ unmap_client(c, IconicState);
configure_client(c);
}
diff -r 12b661434242 -r 6171d971355e event.c
--- a/event.c Fri Feb 09 21:29:21 2007 -0500
+++ b/event.c Fri Feb 09 22:06:07 2007 -0500
@@ -262,7 +262,8 @@ unmapnotify(XEvent *e) {
XUnmapEvent *ev = &e->xunmap;
if((c = client_of_win(ev->window)))
- destroy_client(c);
+ if(!c->unmapped--)
+ destroy_client(c);
}
void (*handler[LASTEvent]) (XEvent *) = {
diff -r 12b661434242 -r 6171d971355e view.c
--- a/view.c Fri Feb 09 21:29:21 2007 -0500
+++ b/view.c Fri Feb 09 22:06:07 2007 -0500
@@ -116,11 +116,14 @@ focus_view(WMScreen *s, View *v) {
for(c=client; c; c=c->next)
if((f = c->sel)) {
if(f->view == v) {
+ map_client(c);
+ XMapWindow(blz.dpy, c->framewin);
resize_client(c, &f->rect);
update_client_grab(c);
- }else
- XMoveWindow(blz.dpy, c->framewin, 2 * s->rect.width + f->rect.x,
- f->rect.y);
+ } else {
+ XUnmapWindow(blz.dpy, c->framewin);
+ unmap_client(c, IconicState);
+ }
}
if((c = sel_client()))
focus_client(c, True);
diff -r 12b661434242 -r 6171d971355e wmii.h
--- a/wmii.h Fri Feb 09 21:29:21 2007 -0500
+++ b/wmii.h Fri Feb 09 22:06:07 2007 -0500
@@ -144,6 +144,8 @@ struct Client {
Bool floating;
Bool fixedsize;
Bool urgent;
+ Bool mapped;
+ int unmapped;
Window win;
Window trans;
Window framewin;
@@ -270,7 +272,7 @@ extern void prop_client(Client *c, XProp
extern void prop_client(Client *c, XPropertyEvent *e);
extern void kill_client(Client *c);
extern void gravitate_client(Client *c, Bool invert);
-extern void unmap_client(Client *c);
+extern void unmap_client(Client *c, int state);
extern void map_client(Client *c);
extern void reparent_client(Client *c, Window w, int x, int y);
extern void manage_client(Client *c);
Received on Sat Feb 10 2007 - 04:08:46 UTC
This archive was generated by hypermail 2.2.0 : Sun Jul 13 2008 - 15:55:07 UTC