|
@@ -10,6 +10,8 @@
|
|
|
#include "util.h"
|
|
#include "util.h"
|
|
|
#include "wm.h"
|
|
#include "wm.h"
|
|
|
|
|
|
|
|
|
|
+#define CLIENT_MASK (StructureNotifyMask | PropertyChangeMask | EnterWindowMask)
|
|
|
|
|
+
|
|
|
void
|
|
void
|
|
|
update_name(Client *c)
|
|
update_name(Client *c)
|
|
|
{
|
|
{
|
|
@@ -70,7 +72,7 @@ manage(Window w, XWindowAttributes *wa)
|
|
|
c->r[RFloat].height = wa->height;
|
|
c->r[RFloat].height = wa->height;
|
|
|
c->border = wa->border_width;
|
|
c->border = wa->border_width;
|
|
|
XSetWindowBorderWidth(dpy, c->win, 0);
|
|
XSetWindowBorderWidth(dpy, c->win, 0);
|
|
|
- XSelectInput(dpy, c->win, StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
|
|
|
|
|
|
|
+ XSelectInput(dpy, c->win, CLIENT_MASK);
|
|
|
XGetTransientForHint(dpy, c->win, &c->trans);
|
|
XGetTransientForHint(dpy, c->win, &c->trans);
|
|
|
if(!XGetWMNormalHints(dpy, c->win, &c->size, &msize) || !c->size.flags)
|
|
if(!XGetWMNormalHints(dpy, c->win, &c->size, &msize) || !c->size.flags)
|
|
|
c->size.flags = PSize;
|
|
c->size.flags = PSize;
|
|
@@ -95,9 +97,34 @@ manage(Window w, XWindowAttributes *wa)
|
|
|
c->snext = stack;
|
|
c->snext = stack;
|
|
|
stack = c;
|
|
stack = c;
|
|
|
XMapWindow(dpy, c->win);
|
|
XMapWindow(dpy, c->win);
|
|
|
|
|
+ XGrabButton(dpy, AnyButton, Mod1Mask, c->win, False, ButtonPressMask,
|
|
|
|
|
+ GrabModeAsync, GrabModeSync, None, None);
|
|
|
focus(c);
|
|
focus(c);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void
|
|
|
|
|
+resize(Client *c)
|
|
|
|
|
+{
|
|
|
|
|
+ XConfigureEvent e;
|
|
|
|
|
+
|
|
|
|
|
+ XMoveResizeWindow(dpy, c->win, c->r[RFloat].x, c->r[RFloat].y,
|
|
|
|
|
+ c->r[RFloat].width, c->r[RFloat].height);
|
|
|
|
|
+ e.type = ConfigureNotify;
|
|
|
|
|
+ e.event = c->win;
|
|
|
|
|
+ e.window = c->win;
|
|
|
|
|
+ e.x = c->r[RFloat].x;
|
|
|
|
|
+ e.y = c->r[RFloat].y;
|
|
|
|
|
+ e.width = c->r[RFloat].width;
|
|
|
|
|
+ e.height = c->r[RFloat].height;
|
|
|
|
|
+ e.border_width = c->border;
|
|
|
|
|
+ e.above = None;
|
|
|
|
|
+ e.override_redirect = False;
|
|
|
|
|
+ XSelectInput(dpy, c->win, CLIENT_MASK & ~StructureNotifyMask);
|
|
|
|
|
+ XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e);
|
|
|
|
|
+ XSelectInput(dpy, c->win, CLIENT_MASK);
|
|
|
|
|
+ XFlush(dpy);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
static int
|
|
static int
|
|
|
dummy_error_handler(Display *dpy, XErrorEvent *error)
|
|
dummy_error_handler(Display *dpy, XErrorEvent *error)
|
|
|
{
|
|
{
|
|
@@ -112,6 +139,7 @@ unmanage(Client *c)
|
|
|
XGrabServer(dpy);
|
|
XGrabServer(dpy);
|
|
|
XSetErrorHandler(dummy_error_handler);
|
|
XSetErrorHandler(dummy_error_handler);
|
|
|
|
|
|
|
|
|
|
+ XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
|
|
|
XUnmapWindow(dpy, c->win);
|
|
XUnmapWindow(dpy, c->win);
|
|
|
XDestroyWindow(dpy, c->title);
|
|
XDestroyWindow(dpy, c->title);
|
|
|
|
|
|
|
@@ -126,7 +154,7 @@ unmanage(Client *c)
|
|
|
XFlush(dpy);
|
|
XFlush(dpy);
|
|
|
XSetErrorHandler(error_handler);
|
|
XSetErrorHandler(error_handler);
|
|
|
XUngrabServer(dpy);
|
|
XUngrabServer(dpy);
|
|
|
- flush_events(EnterWindowMask);
|
|
|
|
|
|
|
+ discard_events(EnterWindowMask);
|
|
|
if(stack)
|
|
if(stack)
|
|
|
focus(stack);
|
|
focus(stack);
|
|
|
}
|
|
}
|