]> git.mdlowis.com Git - proto/anvil.git/commitdiff
added support for withdrawing windows
authorMichael D. Lowis <mike@mdlowis.com>
Sat, 4 Apr 2020 17:50:10 +0000 (13:50 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Sat, 4 Apr 2020 17:50:10 +0000 (13:50 -0400)
anvil.c
anvil.h
client.c
mons.c
mouse.c

diff --git a/anvil.c b/anvil.c
index 2f06ab4a89db1fb17f240a0e68f5dd24951f2946..b5d6cf18f6ba97b73be029014b1afac0e94d9ba1 100644 (file)
--- a/anvil.c
+++ b/anvil.c
@@ -17,13 +17,13 @@ static void xbtnpress(XEvent* e)
     XGrabPointer(X.disp, ev->window, False,
         ButtonPressMask | ButtonReleaseMask | ButtonMotionMask,
         GrabModeAsync, GrabModeAsync, None, X.csr_move, CurrentTime);
-    printf("BTN_DN(w: 0x%lx x: %d y: %d rx: %d ry: %d)\n", ev->window, ev->x, ev->y, ev->x_root, ev->y_root);
+    printf("BTN_DN(w: 0x%lx s: %d x: %d y: %d rx: %d ry: %d)\n", ev->window, ev->state, ev->x, ev->y, ev->x_root, ev->y_root);
     X.start_x = ev->x_root, X.start_y = ev->y_root;
     X.last_x  = ev->x_root, X.last_y  = ev->y_root;
-    Location loc;
-    Client* c = client_get(e->xbutton.window, &loc);
-    if (c && (ev->window == c->frame))
+    Location loc = {0};
+    if (mons_find(ev->window, &loc) && (loc.client->frame == ev->window))
     {
+        Client* c = loc.client;
         if (ev->y < MIN_HEIGHT)
         {
             X.edge = E_TOP;
@@ -52,9 +52,8 @@ static void xbtnrelease(XEvent* e)
 {
     XButtonEvent* ev = &(e->xbutton);
     printf("BTN_UP(w: 0x%lx x: %d y: %d rx: %d ry: %d)\n", ev->window, ev->x, ev->y, ev->x_root, ev->y_root);
-    Location loc;
-    Client* c = client_get(e->xbutton.window, &loc);
-    if (c && (ev->window == c->frame))
+    Location loc = {0};
+    if (mons_find(ev->window, &loc) && (loc.client->frame == ev->window))
     {
         mouse_up(ev, &loc);
     }
@@ -68,9 +67,8 @@ static void xbtnmotion(XEvent* e)
     XMotionEvent *ev = &e->xmotion;
     printf("BTN_MV(w: 0x%lx x: %d y: %d rx: %d ry: %d)\n", ev->window, ev->x, ev->y, ev->x_root, ev->y_root);
     while (XCheckTypedWindowEvent(X.disp, ev->window, ev->type, e));
-    Location loc;
-    Client* c = client_get(ev->window, &loc);
-    if (c && (ev->window == c->frame))
+    Location loc = {0};
+    if (mons_find(ev->window, &loc) && (loc.client->frame == ev->window))
     {
         mouse_drag(ev, &loc);
     }
@@ -89,15 +87,15 @@ static void xconfigrequest(XEvent* e)
     wc.border_width = ev->border_width;
     wc.sibling = ev->above;
     wc.stack_mode = ev->detail;
-    Client* c = client_get(ev->window, NULL);
-    if (c && c->win == ev->window)
+    Location loc = {0};
+    if (mons_find(ev->window, &loc) && (loc.client->win == ev->window))
     {
-        c->w = wc.width;
-        c->h = wc.height;
-        client_adjust(c);
-        if (X.mode == M_RESIZE && Focused == c)
+        loc.client->w = wc.width;
+        loc.client->h = wc.height;
+        client_adjust(loc.client);
+        if (X.mode == M_RESIZE && Focused == loc.client)
         {
-            warp_mouse(c);
+            warp_mouse(loc.client);
         }
     }
     else
@@ -111,7 +109,8 @@ static void xmaprequest(XEvent* e)
     XMapRequestEvent* ev = &(e->xmaprequest);
     printf("MAP(w: 0x%lx)\n", ev->window);
     XWindowAttributes attr;
-    if (!client_get(ev->window, NULL))
+    Location loc = {0};
+    if (!mons_find(ev->window, &loc))
     {
         if (XGetWindowAttributes(X.disp, ev->window, &attr) && !attr.override_redirect)
         {
@@ -123,11 +122,18 @@ static void xmaprequest(XEvent* e)
 static void xunmapnotify(XEvent* e)
 {
     XUnmapEvent* ev = &(e->xunmap);
-    printf("UNMAP(w: 0x%lx)\n", ev->window);
-    Client* c = client_get(ev->window, NULL);
-    if (c && c->win == ev->window && !(c->flags & F_SHADED))
+    printf("UNMAP(e: 0x%lx w: 0x%lx %d)\n", ev->event, ev->window, ev->from_configure);
+    Location loc = {0};
+    if (mons_find(ev->window, &loc))// && loc.client->win == ev->window)
     {
-        XUnmapWindow(X.disp, c->frame);
+        if (ev->event == X.root && ev->window == loc.client->win)
+        {
+            mons_delclient(&loc);
+        }
+        else if ( !(loc.client->flags & F_SHADED) )
+        {
+            XUnmapWindow(X.disp, loc.client->frame);
+        }
     }
 }
 
@@ -138,10 +144,6 @@ static void xdestroynotify(XEvent* e)
     Location loc = {0};
     if (mons_find(ev->window, &loc))
     {
-        if (Focused == loc.client)
-        {
-            Focused = NULL;
-        }
         mons_delclient(&loc);
     }
 }
@@ -152,7 +154,6 @@ static void xclientmsg(XEvent* e)
     printf("CLIENT_MSG(w: 0x%lx a: '%s')\n", ev->window, XGetAtomName(X.disp, ev->message_type));
     if (ev->message_type == atom("_NET_ACTIVE_WINDOW"))
     {
-        printf("ACTIVATE(w: %lx)\n", ev->window);
         mons_activate(ev->window);
     }
 }
@@ -161,22 +162,22 @@ static void xpropnotify(XEvent* e)
 {
     XPropertyEvent* ev = &(e->xproperty);
     printf("PROP_NOTIFY(w: 0x%lx)\n", ev->window);
-    Client* c = client_get(ev->window, NULL);
-    if (c)
+    Location loc = {0};
+    if (mons_find(ev->window, &loc))
     {
-        client_readprops(c);
-        client_draw(c);
+        client_readprops(loc.client);
+        client_draw(loc.client);
     }
 }
 
 static void xenternotify(XEvent* e)
 {
     XCrossingEvent* ev = &(e->xcrossing);
-    Client* c = client_get(ev->window, NULL);
-    printf("ENTER(w: 0x%lx c: 0x%lx)\n", ev->window, c ? c->win : 0);
-    if (c)
+    Location loc = {0};
+    if (mons_find(ev->window, &loc))
     {
-        client_focus(c);
+        printf("ENTER(w: 0x%lx c: 0x%lx)\n", ev->window, loc.client->win);
+        client_focus(loc.client);
     }
 }
 
@@ -186,10 +187,10 @@ static void xexpose(XEvent* e)
     if (ev->count == 0)
     {
         printf("EXPOSE(w: 0x%lx)\n", ev->window);
-        Client* c = client_get(ev->window, NULL);
-        if (c)
+        Location loc = {0};
+        if (mons_find(ev->window, &loc))
         {
-            client_draw(c);
+            client_draw(loc.client);
         }
     }
 }
diff --git a/anvil.h b/anvil.h
index 603529538f6f895af953d4ac71f27befca675ee7..13b9331f6543147a77af3955ecde173ae5838071 100644 (file)
--- a/anvil.h
+++ b/anvil.h
@@ -156,7 +156,6 @@ extern Client* Focused;
 void client_initall(void);
 Client* client_add(Window win, XWindowAttributes* attr);
 void client_draw(Client* c);
-Client* client_get(Window w, Location* loc);
 void client_adjust(Client* c);
 void client_move(Client* c, int xdiff, int ydiff);
 void client_resize(Client* c, int xdiff, int ydiff);
index 8ad5ef5de94cb2adc58e7d4662b4d58f58a850b7..3be402220556f282ad2b3eb18fa81a9e5be55b89 100644 (file)
--- a/client.c
+++ b/client.c
@@ -77,25 +77,13 @@ void client_draw(Client* c)
     }
 }
 
-Client* client_get(Window w, Location* loc)
-{
-    Location local_loc;
-    Client* c = NULL;
-    loc = (loc ? loc : &local_loc);
-    if (mons_find(w, loc))
-    {
-        c = loc->client;
-    }
-    return c;
-}
-
 void client_adjust(Client* c)
 {
     int shaded = (c->flags & F_SHADED);
     int minheight = (shaded ? MIN_HEIGHT : 3*MIN_HEIGHT);
     if (c->w < minheight) c->w = minheight;
     if (c->h < minheight) c->h = minheight;
-    XMoveResizeWindow(X.disp, c->frame, c->x, c->y, c->w, c->h);
+    XMoveResizeWindow(X.disp, c->frame, c->x, c->y, c->w, (shaded ? minheight : c->h));
     printf("CONFIG(c: %lx x: %d y: %d w: %d h: %d)\n", c->frame, c->x, c->y, c->w, c->h);
     if ( !(c->flags & F_SHADED) )
     {
diff --git a/mons.c b/mons.c
index 69d1de94fff69e974e235f8c4c357bafc04f7bed..93002ddf1828550c460322ba1145bcc1ec9237e7 100644 (file)
--- a/mons.c
+++ b/mons.c
@@ -99,6 +99,10 @@ void mons_addclient(Client* c)
 
 void mons_delclient(Location* loc)
 {
+    if (Focused == loc->client)
+    {
+        Focused = NULL;
+    }
     remove_client(loc, loc->client);
     xfree(loc->client->name);
     XDestroyWindow(X.disp, loc->client->frame);
diff --git a/mouse.c b/mouse.c
index cd940dfbbc74a582b387d422c4de7012e3918f90..2b81e63c59d8dc170c77e0b0e90802eecdc284fe 100644 (file)
--- a/mouse.c
+++ b/mouse.c
@@ -8,6 +8,11 @@ static inline int PRESSED(int mods, int btn)
     return ((mods & (1 << (btn + 7))) == (1 << (btn + 7)));
 }
 
+static inline int FLAGS_SET(int state, int flags)
+{
+    return ((state & flags) == flags);
+}
+
 static void float_click(XButtonEvent* ev, Location* loc)
 {
     if ((ev->button == Button1) && (ev->y > MIN_HEIGHT))
@@ -17,17 +22,17 @@ static void float_click(XButtonEvent* ev, Location* loc)
     }
     else if (ev->button == Button2)
     {
-        if (ev->state & MODKEY)
+        if (FLAGS_SET(ev->state, (MODKEY|ShiftMask)))
         {
-            client_close(loc->client);
+            mons_togglefloat(loc);
         }
-        else if (ev->state & (MODKEY|ShiftMask))
+        else if (FLAGS_SET(ev->state, MODKEY))
         {
-            mons_togglefloat(loc);
+            client_close(loc->client);
         }
         else
         {
-            puts("undefined");
+            /* nothing to do */
         }
     }
     else if (ev->button == Button3)
@@ -52,17 +57,17 @@ static void monocled_click(XButtonEvent* ev, Location* loc)
     }
     else if (ev->button == Button2)
     {
-        if (ev->state & MODKEY)
+        if (FLAGS_SET(ev->state, (MODKEY|ShiftMask)))
         {
-            client_close(loc->client);
+            mons_togglefloat(loc);
         }
-        else if (ev->state & (MODKEY|ShiftMask))
+        else if (FLAGS_SET(ev->state, MODKEY))
         {
-            mons_togglefloat(loc);
+            client_close(loc->client);
         }
-        else
+       else
         {
-            puts("expand client");
+            /* nothing to do */
         }
     }
     else if (ev->button == Button3)
@@ -88,13 +93,13 @@ static void stacked_click(XButtonEvent* ev, Location* loc)
     }
     else if (ev->button == Button2)
     {
-        if (ev->state & MODKEY)
+        if (FLAGS_SET(ev->state, (MODKEY|ShiftMask)))
         {
-            client_close(loc->client);
+            mons_togglefloat(loc);
         }
-        else if (ev->state & (MODKEY|ShiftMask))
+        else if (FLAGS_SET(ev->state, MODKEY))
         {
-            mons_togglefloat(loc);
+            client_close(loc->client);
         }
         else
         {
@@ -163,4 +168,3 @@ void mouse_drag(XMotionEvent* ev, Location* loc)
         float_drag(ev, loc);
     }
 }
-