signal(SIGINT, on_sigint);
conf_init(argc, argv);
- win_t *root = sys_init();
- wm_init(root);
+ sys_init();
+ wm_init();
- sys_run(root);
+ sys_run();
- wm_free(root);
- sys_free(root);
+ wm_free();
+ sys_free();
return 0;
}
/* Global data */
static int shellhookid;
static void *cache;
-static win_t *root;
+static HWND root;
static list_t *screens;
/* Conversion functions */
msg, wParam, lParam,
st->vkCode, st->scanCode, st->flags,
ev, mod2int(mod));
- return wm_handle_event(win_focused() ?: root, ev, mod, getptr())
+ return wm_handle_event(win_focused(), ev, mod, getptr())
|| CallNextHookEx(0, msg, wParam, lParam);
}
//printf("sys_unwatch: %p\n", win);
}
-list_t *sys_info(win_t *win)
+list_t *sys_info(void)
{
if (screens == NULL)
EnumDisplayMonitors(NULL, NULL, MonProc, (LPARAM)&screens);
return screens;
}
-win_t *sys_init(void)
+void sys_init(void)
{
HINSTANCE hInst = GetModuleHandle(NULL);
- HWND hwnd = NULL;
/* Load configuration */
no_capture = conf_get_int("main.no-capture", no_capture);
SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0);
/* Create shell hook window */
- if (!(hwnd = CreateWindowEx(0, "wmpus_class", "wmpus", 0,
+ if (!(root = CreateWindowEx(0, "wmpus_class", "wmpus", 0,
rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
HWND_MESSAGE, NULL, hInst, NULL)))
printf("sys_init: Error Creating Shell Hook Window - %lu\n", GetLastError());
GetModuleHandle("USER32.DLL"), "RegisterShellHookWindow");
if (!RegisterShellHookWindow)
printf("sys_init: Error Finding RegisterShellHookWindow - %lu\n", GetLastError());
- if (!RegisterShellHookWindow(hwnd))
+ if (!RegisterShellHookWindow(root))
printf("sys_init: Error Registering ShellHook Window - %lu\n", GetLastError());
shellhookid = RegisterWindowMessage("SHELLHOOK");
//SetWindowsHookEx(WH_SHELL, ShlProc, hInst, 0);
/* Alternate ways to get input */
- //if (!RegisterHotKey(hwnd, 123, MOD_CONTROL, VK_LBUTTON))
+ //if (!RegisterHotKey(root, 123, MOD_CONTROL, VK_LBUTTON))
// printf("sys_init: Error Registering Hotkey - %lu\n", GetLastError());
//if (!RegisterHotKey(NULL, 123, MOD_CONTROL, VK_LBUTTON))
// printf("sys_init: Error Registering Hotkey - %lu\n", GetLastError());
/* Capture ctrl-c and console widnow close */
SetConsoleCtrlHandler(CtrlProc, TRUE);
-
- return root = win_new(hwnd,0);
}
-void sys_run(win_t *root)
+void sys_run(void)
{
MSG msg = {};
if (!no_capture)
void sys_exit(void)
{
- PostMessage(root->sys->hwnd, WM_QUIT, 0, 0);
+ PostMessage(root, WM_QUIT, 0, 0);
}
-void sys_free(win_t *root)
+void sys_free(void)
{
/* I don't really care about this
* since I don't know how to use
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) {
/* Return a list of windows representing the geometry of the
* physical displays attached to the computer. */
-list_t *sys_info(win_t *root);
+list_t *sys_info(void);
/* First call, calls wm_insert for each existing window */
-win_t *sys_init(void);
+void sys_init(void);
/* Starts the main loop */
-void sys_run(win_t *root);
+void sys_run(void);
/* Exit main loop */
void sys_exit(void);
/* Free all static data, for memory debugging */
-void sys_free(win_t *root);
+void sys_free(void);
wins = list_remove(wins, node, 0);
}
-void wm_init(win_t *root)
+void wm_init(void)
{
- screens = sys_info(root);
- sys_watch(root, 'j', MOD(.MODKEY=1));
- sys_watch(root, 'k', MOD(.MODKEY=1));
- sys_watch(root, 'c', MOD(.MODKEY=1,.shift=1));
- sys_watch(root, 'q', MOD(.MODKEY=1,.shift=1));
+ screens = sys_info();
+ sys_watch(NULL, 'j', MOD(.MODKEY=1));
+ sys_watch(NULL, 'k', MOD(.MODKEY=1));
+ sys_watch(NULL, 'c', MOD(.MODKEY=1,.shift=1));
+ sys_watch(NULL, 'q', MOD(.MODKEY=1,.shift=1));
}
-void wm_free(win_t *root)
+void wm_free(void)
{
while (wins)
wins = list_remove(wins, wins, 0);
}
}
-void wm_init(win_t *root)
+void wm_init(void)
{
event_t keys[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
for (int i = 0; i < countof(keys); i++) {
- sys_watch(root, keys[i], MOD(.MODKEY=1));
- sys_watch(root, keys[i], MOD(.MODKEY=1,.shift=1));
+ sys_watch(NULL, keys[i], MOD(.MODKEY=1));
+ sys_watch(NULL, keys[i], MOD(.MODKEY=1,.shift=1));
}
}
-void wm_free(win_t *root)
+void wm_free(void)
{
for (int i = 0; i < 10; i++) {
while (tags[i]) {
typedef struct {
list_t *tags; // of tag_t
tag_t *tag; // focused tag
- win_t *root; // root/background window
list_t *screens; // display geometry
} wm_t;
* it as the currently focused window */
static void set_focus(win_t *win)
{
- if (win == NULL || win == wm->root) {
- sys_focus(wm->root);
+ if (win == NULL) {
+ sys_focus(NULL);
return;
}
if (ncol && COL(ncol) && COL(ncol)->row)
set_focus(COL(ncol)->row->win);
else
- sys_focus(wm->root);
+ sys_focus(NULL);
}
}
*******************************/
int wm_handle_event(win_t *win, event_t ev, mod_t mod, ptr_t ptr)
{
- if (!win || win == wm_dpy->geom)
- return 0;
//printf("wm_handle_event: %p - %x %c%c%c%c%c\n", win, ev,
// mod.up ? '^' : 'v',
// mod.alt ? 'a' : '-',
// mod.win ? 'w' : '-');
/* Mouse events */
- if (EV_MOUSE0 <= ev && ev <= EV_MOUSE7) {
+ if (win && EV_MOUSE0 <= ev && ev <= EV_MOUSE7) {
if (ev == EV_MOUSE1 && !mod.MODKEY && !mod.up)
return raise_float(win), 0;
if ((ev == EV_MOUSE3 && mod.MODKEY && !mod.up) ||
return mod.MODKEY || ev == EV_ALT;
/* Misc */
- if (mod.MODKEY) {
#ifdef DEBUG
+ if (win && mod.MODKEY) {
if (ev == EV_F1) return raise_float(win), 1;
if (ev == EV_F2) return set_focus(win), 1;
if (ev == EV_F3) return sys_show(win, ST_SHOW), 1;
if (ev == EV_F4) return sys_show(win, ST_HIDE), 1;
if (ev == EV_F7) return sys_show(win, ST_SHADE), 1;
+ }
#endif
+ if (mod.MODKEY) {
if (ev == EV_F5) return wm_update(), 1;
if (ev == EV_F6) return print_txt(), 1;
if (ev == 'q') return sys_exit(), 1;
+ }
+ if (win && mod.MODKEY) {
if (ev == 'f') return wm_handle_state(win, win->state,
win->state == ST_FULL ? ST_SHOW : ST_FULL);
if (ev == 'g') return wm_handle_state(win, win->state,
win->state == ST_MAX ? ST_SHOW : ST_MAX);
}
- if (mod.MODKEY && mod.shift) {
+ if (win && mod.MODKEY && mod.shift) {
if (ev == 'c') return sys_show(win, ST_CLOSE), 1;
}
/* Floating layer */
if (ev == ' ') {
- if (mod.MODKEY && mod.shift)
+ if (win && mod.MODKEY && mod.shift)
return set_layer(win), 1;
if (mod.MODKEY)
return switch_layer(), 1;
/* Tag switching */
if (mod.MODKEY && '0' <= ev && ev <= '9') {
char name[] = {ev, '\0'};
- if (mod.shift)
+ if (win && mod.shift)
tag_set(win, name);
- else
+ if (!mod.shift)
tag_switch(name);
wm_update();
}
/* Focus change */
- if (ev == EV_ENTER && win->state != ST_SHADE)
+ if (win && ev == EV_ENTER && win->state != ST_SHADE)
return set_focus(win), 1;
/* Reset focus after after focus change,
* not sure what is causing the focus change in the first place
* but preventing that would be a better solution */
if (ev == EV_FOCUS)
- sys_focus(wm_focus ?: wm->root);
+ sys_focus(wm_focus);
return mod.MODKEY;
}
print_txt();
}
-void wm_init(win_t *root)
+void wm_init(void)
{
- printf("wm_init: %p\n", root);
+ printf("wm_init\n");
/* Load configuration */
margin = conf_get_int("main.margin", margin);
stack = conf_get_int("main.stack", stack);
wm = new0(wm_t);
- wm->root = root;
- wm->screens = list_sort(sys_info(root), 0, sort_win);
+ wm->screens = list_sort(sys_info(), 0, sort_win);
wm->tag = tag_new(wm->screens, "1");
wm->tags = list_insert(NULL, wm->tag);
EV_F7, EV_F8, EV_F9, EV_F10, EV_F11, EV_F12,
EV_MOUSE1, EV_MOUSE3};
for (int i = 0; i < countof(ev_e); i++)
- sys_watch(root, ev_e[i], MOD());
+ sys_watch(NULL, ev_e[i], MOD());
for (int i = 0; i < countof(ev_m); i++)
- sys_watch(root, ev_m[i], MOD(.MODKEY=1));
+ sys_watch(NULL, ev_m[i], MOD(.MODKEY=1));
for (int i = 0; i < countof(ev_s); i++)
- sys_watch(root, ev_s[i], MOD(.MODKEY=1,.shift=1));
+ sys_watch(NULL, ev_s[i], MOD(.MODKEY=1,.shift=1));
}
-void wm_free(win_t *root)
+void wm_free(void)
{
/* Re-show and free all windows */
while ( wm->tags) { tag_t *tag = wm->tags->data;
void wm_remove(win_t *win);
/* First call, sets up key bindings, etc */
-void wm_init(win_t *root);
+void wm_init(void);
/* First call, sets up key bindings, etc */
-void wm_free(win_t *root);
+void wm_free(void);