* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
*/
+#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
#include <X11/extensions/Xinerama.h>
#include "util.h"
+#include "conf.h"
#include "sys.h"
#include "wm.h"
-#ifndef BORDER
-#define BORDER 2
-#endif
+/* Configuration */
+static int BORDER = 2;
+static int NO_CAPTURE = 0;
/* Internal structures */
struct win_sys {
return new;
}
-static void win_remove(win_t *win)
+static void win_free(win_t *win)
{
- tdelete(win, &cache, win_cmp);
free(win->sys);
free(win);
}
+static void win_remove(win_t *win)
+{
+ tdelete(win, &cache, win_cmp);
+ win_free(win);
+}
+
static int win_viewable(win_t *win)
{
XWindowAttributes attr;
case st_show:
printf("sys_show: show\n");
XMapWindow(win->sys->dpy, win->sys->xid);
+ XSync(win->sys->dpy, False);
return;
case st_full:
printf("sys_show: full\n");
{
/* Use global copy of screens so we can add struts */
if (screens == NULL) {
- int n;
+ /* Add Xinerama screens */
+ int n = 0;
XineramaScreenInfo *info = NULL;
if (XineramaIsActive(win->sys->dpy))
info = XineramaQueryScreens(win->sys->dpy, &n);
- if (!info) {
- win_t *screen = new0(win_t);
- *screen = *win;
- return list_insert(NULL, screen);
- }
for (int i = 0; i < n; i++) {
win_t *screen = new0(win_t);
screen->x = info[i].x_org;
screens = list_append(screens, screen);
}
}
+ if (screens == NULL) {
+ /* No xinerama support */
+ win_t *screen = new0(win_t);
+ *screen = *win;
+ screens = list_insert(NULL, screen);
+ }
return screens;
}
Display *dpy;
Window xid;
+ /* Load configuration */
+ BORDER = conf_get_int("main.border", BORDER);
+ NO_CAPTURE = conf_get_int("main.no-capture", NO_CAPTURE);
+
/* Open the display */
if (!(dpy = XOpenDisplay(NULL)))
error("Unable to get display");
void sys_run(win_t *root)
{
/* Add each initial window */
- unsigned int nkids;
- Window par, xid, *kids = NULL;
- if (XQueryTree(root->sys->dpy, root->sys->xid,
- &par, &xid, &kids, &nkids))
- for(int i = 0; i < nkids; i++) {
- win_t *win = win_find(root->sys->dpy, kids[i], 1);
- if (win && win_viewable(win) && !strut_add(root,win))
- wm_insert(win);
+ if (!NO_CAPTURE) {
+ unsigned int nkids;
+ Window par, xid, *kids = NULL;
+ if (XQueryTree(root->sys->dpy, root->sys->xid,
+ &par, &xid, &kids, &nkids)) {
+ for(int i = 0; i < nkids; i++) {
+ win_t *win = win_find(root->sys->dpy, kids[i], 1);
+ if (win && win_viewable(win) && !strut_add(root,win))
+ wm_insert(win);
+ }
+ XFree(kids);
}
- wm_update(); // For struts
+ wm_update(); // For struts
+ }
/* Main loop */
running = 1;
{
running = 0;
}
+
+void sys_free(win_t *root)
+{
+ XCloseDisplay(root->sys->dpy);
+ while (screens)
+ screens = list_remove(screens, screens, 1);
+ tdestroy(cache, (void(*)(void*))win_free);
+}