#include "util.h"
#include "conf.h"
+#include "types.h"
#include "sys.h"
#include "wm.h"
/* Global data */
static win_t *root;
+static win_t *last;
static int running;
static void *cache;
static Atom atoms[NATOMS];
static void win_free(win_t *win)
{
+ if (win == last)
+ last = NULL;
free(win->sys);
free(win);
}
printf("configure_req: %lx - (0x%lx) %dx%d @ %d,%d\n",
cre->window, cre->value_mask,
cre->height, cre->width, cre->x, cre->y);
- if ((win = win_find(dpy,xe->xconfigurerequest.window,1))) {
+ if ((win = win_find(dpy,cre->window,1))) {
+ int border_width = (win->type == TYPE_TOOLBAR ? 0 : border);
XSendEvent(dpy, cre->window, False, StructureNotifyMask, &(XEvent){
- .xconfigure.type = ConfigureNotify,
- .xconfigure.display = win->sys->dpy,
- .xconfigure.event = win->sys->xid,
- .xconfigure.window = win->sys->xid,
- .xconfigure.x = win->x,
- .xconfigure.y = win->y,
- .xconfigure.width = win->w,
- .xconfigure.height = win->h,
- .xconfigure.border_width = border,
+ .xconfigure.type = ConfigureNotify,
+ .xconfigure.display = win->sys->dpy,
+ .xconfigure.event = win->sys->xid,
+ .xconfigure.window = win->sys->xid,
+ .xconfigure.x = win->x,
+ .xconfigure.y = win->y,
+ .xconfigure.width = win->w,
+ .xconfigure.height = win->h,
+ .xconfigure.border_width = border_width,
});
XSync(win->sys->dpy, False);
}
//win_msg(win, WM_FOCUS);
/* Set border on focused window */
- static win_t *last = NULL;
if (last)
XSetWindowBorder(last->sys->dpy, last->sys->xid, colors[CLR_UNFOCUS]);
XSync(win->sys->dpy, False);
PropModeReplace, (unsigned char*)0, 0);
/* Update border */
- if (state == ST_SHOW || state == ST_MAX || state == ST_SHADE)
- XSetWindowBorderWidth(win->sys->dpy, win->sys->xid, border);
- else if (state == ST_FULL)
+ if (win->type == TYPE_TOOLBAR || state == ST_FULL)
XSetWindowBorderWidth(win->sys->dpy, win->sys->xid, 0);
+ else if (state == ST_SHOW || state == ST_MAX || state == ST_SHADE)
+ XSetWindowBorderWidth(win->sys->dpy, win->sys->xid, border);
/* Map/Unmap window */
if (state == ST_SHOW || state == ST_FULL || state == ST_MAX || state == ST_SHADE)
.width = screen->w + screen->sys->strut.left + screen->sys->strut.right,
.height = screen->h + screen->sys->strut.top + screen->sys->strut.bottom
};
+ win->x = wc.x; win->y = wc.y;
+ win->w = wc.width; win->h = wc.height;
XConfigureWindow(win->sys->dpy, win->sys->xid, CWX|CWY|CWWidth|CWHeight, &wc);
XMoveResizeWindow(win->sys->dpy, win->sys->xid, wc.x, wc.y, wc.width, wc.height);
} else if (state == ST_SHADE) {
void sys_watch(win_t *win, event_t ev, mod_t mod)
{
//printf("sys_watch: %p - %x %hhx\n", win, ev, mod);
+ if (win == NULL)
+ win = root;
XWindowAttributes attr;
XGetWindowAttributes(win->sys->dpy, win->sys->xid, &attr);
long mask = attr.your_event_mask;
void sys_unwatch(win_t *win, event_t ev, mod_t mod)
{
+ if (win == NULL)
+ win = root;
if (EV_MOUSE0 <= ev && ev <= EV_MOUSE7)
XUngrabButton(win->sys->dpy, ev2xb(ev), mod2x(mod), win->sys->xid);
}
-list_t *sys_info(win_t *win)
+list_t *sys_info(void)
{
/* Use global copy of screens so we can add struts */
if (screens == NULL) {
/* Add Xinerama screens */
int n = 0;
XineramaScreenInfo *info = NULL;
- if (XineramaIsActive(win->sys->dpy))
- info = XineramaQueryScreens(win->sys->dpy, &n);
+ if (XineramaIsActive(root->sys->dpy))
+ info = XineramaQueryScreens(root->sys->dpy, &n);
for (int i = 0; i < n; i++) {
win_t *screen = new0(win_t);
screen->x = info[i].x_org;
if (screens == NULL) {
/* No xinerama support */
win_t *screen = new0(win_t);
- *screen = *win;
+ *screen = *root;
screens = list_insert(NULL, screen);
}
return screens;
}
-win_t *sys_init(void)
+void sys_init(void)
{
Display *dpy;
Window xid;
XSelectInput(dpy, xid, SubstructureRedirectMask|SubstructureNotifyMask);
xerrorxlib = XSetErrorHandler(xerror);
- return root = win_find(dpy, xid, 1);
+ root = win_find(dpy, xid, 1);
}
-void sys_run(win_t *root)
+void sys_run(void)
{
/* Add each initial window */
if (!no_capture) {
running = 0;
}
-void sys_free(win_t *root)
+void sys_free(void)
{
XCloseDisplay(root->sys->dpy);
while (screens) {