+/*
+ * Copyright (c) 2011, Andy Spencer <andy753421@gmail.com>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ */
+
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
} color_t;
/* Global data */
+static int running;
static void *cache;
static Atom atoms[natoms];
static int (*xerrorxlib)(Display *, XErrorEvent *);
return focus;
}
-/* Helpers */
-static int copy_strut(win_t *to, win_t *from, int scale)
+/* Strut functions
+ * Struts are spaces at the edges of the screen that are used by
+ * toolbars and statusbars such as dzen. */
+static int strut_copy(win_t *to, win_t *from, int scale)
{
int left = from->sys->strut.left;
int right = from->sys->strut.right;
return 1;
}
-static int add_strut(win_t *root, win_t *win)
+static int strut_add(win_t *root, win_t *win)
{
/* Get X11 strut data */
Atom ret_type;
win->sys->strut.top = ((int*)xdata)[2];
win->sys->strut.bottom = ((int*)xdata)[3];
for (list_t *cur = screens; cur; cur = cur->next)
- copy_strut(cur->data, win, 1);
- return copy_strut(root, win, 1);
+ strut_copy(cur->data, win, 1);
+ return strut_copy(root, win, 1);
}
-static int del_strut(win_t *root, win_t *win)
+static int strut_del(win_t *root, win_t *win)
{
for (list_t *cur = screens; cur; cur = cur->next)
- copy_strut(cur->data, win, -1);
- return copy_strut(root, win, -1);
+ strut_copy(cur->data, win, -1);
+ return strut_copy(root, win, -1);
}
/* Window functions */
}
/* Drawing functions */
-unsigned long get_color(Display *dpy, const char *name)
+static unsigned long get_color(Display *dpy, const char *name)
{
XColor color;
int screen = DefaultScreen(dpy);
//printf("event: %d\n", type);
/* Common data for all these events ... */
- ptr_t ptr; mod_t mod;
+ ptr_t ptr = {}; mod_t mod = {};
if (type == KeyPress || type == KeyRelease ||
type == ButtonPress || type == ButtonRelease ||
type == MotionNotify) {
else if (type == UnmapNotify) {
if ((win = win_find(dpy,ev->xunmap.window,0)) &&
win->sys->state == st_show) {
- if (!del_strut(root, win))
+ if (!strut_del(root, win))
wm_remove(win);
else
wm_update();
.height = cre->height,
});
- /* This seems necessasairy for, but causes flicker
+ /* This seems necessary for, but causes flicker
* there could be a better way to do this */
if ((win = win_find(dpy,ev->xmaprequest.window,0)))
sys_move(win, win->x, win->y, win->w, win->h);
else if (type == MapRequest) {
printf("map_req: %d\n", type);
if ((win = win_find(dpy,ev->xmaprequest.window,1))) {
- if (!add_strut(root, win))
+ if (!strut_add(root, win))
wm_insert(win);
else
wm_update();
return xerrorxlib(dpy, err);
}
-/*****************
- * Sys functions *
- *****************/
+/********************
+ * System functions *
+ ********************/
void sys_move(win_t *win, int x, int y, int w, int h)
{
//printf("sys_move: %p - %d,%d %dx%d\n", win, x, y, w, h);
w = MAX(w-b,1); h = MAX(h-b,1);
XMoveResizeWindow(win->sys->dpy, win->sys->xid, x, y, w, h);
- /* Flush events, so moving window doesn't cuase re-focus
+ /* Flush events, so moving window doesn't cause re-focus
* There's probably a better way to do this */
XEvent ev;
XSync(win->sys->dpy, False);
colors[clr_urgent] = get_color(dpy, "#ff0000");
printf("colors = #%06lx #%06lx #%06lx\n", colors[0], colors[1], colors[2]);
- /* Selec Window Managmenet events */
+ /* Select window management events */
XSelectInput(dpy, xid, SubstructureRedirectMask|SubstructureNotifyMask);
XSetInputFocus(dpy, None, RevertToNone, CurrentTime);
xerrorxlib = XSetErrorHandler(xerror);
&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) && !add_strut(root,win))
+ if (win && win_viewable(win) && !strut_add(root,win))
wm_insert(win);
}
wm_update(); // For struts
/* Main loop */
- for(;;)
+ running = 1;
+ while (running)
{
XEvent ev;
XNextEvent(root->sys->dpy, &ev);
process_event(ev.type, &ev, root);
}
}
+
+void sys_exit(void)
+{
+ running = 0;
+}