#endif
#endif
-#define SWM_DEBUG
/* #define SWM_DEBUG */
#ifdef SWM_DEBUG
#define DPRINTF(x...) do { if (swm_debug) fprintf(stderr, x); } while(0)
};
struct swm_screen *screens;
int num_screens;
-Window rootclick = 0;
struct ws_win *cur_focus = NULL;
if (screens[i].root == root)
break;
- if (rootclick != root && /* if root was just clicked in, use cursor */
- cur_focus && cur_focus->ws->r && cur_focus->s == &screens[i])
- r = cur_focus->ws->r;
- else {
- if (XQueryPointer(display, screens[i].root,
- &rr, &cr, &x, &y, &wx, &wy, &mask) == False) {
- r = TAILQ_FIRST(&screens[i].rl);
- } else {
- TAILQ_FOREACH(r, &screens[i].rl, entry) {
- if (x > X(r) && x < X(r) + WIDTH(r) &&
- y > Y(r) && y < Y(r) + HEIGHT(r))
- break;
- }
-
- if (r == NULL)
- r = TAILQ_FIRST(&screens[i].rl);
+ if (XQueryPointer(display, screens[i].root,
+ &rr, &cr, &x, &y, &wx, &wy, &mask) == False) {
+ /* if we can't query the pointer, grab the first region */
+ r = TAILQ_FIRST(&screens[i].rl);
+ } else {
+ /* otherwise, choose a region based on pointer location */
+ TAILQ_FOREACH(r, &screens[i].rl, entry) {
+ if (x > X(r) && x < X(r) + WIDTH(r) &&
+ y > Y(r) && y < Y(r) + HEIGHT(r))
+ break;
}
+
+ if (r == NULL)
+ r = TAILQ_FIRST(&screens[i].rl);
}
return (r);
}
if (win == NULL)
return;
- rootclick = 0;
unfocus_all();
win->ws->focus = win;
if (win->ws->r != NULL) {
{ MODKEY | ShiftMask, XK_Tab, focus, {.id = SWM_ARG_ID_FOCUSPREV} },
};
+#if 0
+/* mouse */
+enum { client_click, root_click };
+struct button {
+ unsigned int click;
+ unsigned int mask;
+ unsigned int button;
+ void (*func)(struct swm_region *r, union arg *);
+ union arg args;
+} buttons[] = {
+ /* action key mouse button func args */
+ { client_click, MODKEY, Button2, NULL, {0} },
+};
+#endif
+
void
updatenumlockmask(void)
{
DNPRINTF(SWM_D_EVENT, "buttonpress: window: %lu\n", ev->window);
- if (ev->window == ev->root) {
- rootclick = ev->root;
+ if (ev->window == ev->root)
return;
- }
if (ev->window == cur_focus->id)
return;
#ifdef SWM_CLICKTOFOCUS
{
XCrossingEvent *ev = &e->xcrossing;
struct ws_win *win;
- int i, j;
DNPRINTF(SWM_D_EVENT, "enternotify: window: %lu\n", ev->window);
- if ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) &&
- ev->window != ev->root)
- return;
if (ignore_enter) {
/* eat event(r) to prevent autofocus */
ignore_enter--;
return;
}
- /* brute force for now */
- for (i = 0; i < ScreenCount(display); i++) {
- for (j = 0; j < SWM_WS_MAX; j++) {
- TAILQ_FOREACH(win, &screens[i].ws[j].winlist , entry) {
- if (win->id == ev->window)
- focus_win(win);
- }
- }
- }
+
+ if ((win = find_window(ev->window)) != NULL)
+ focus_win(win);
}
void
screens[i].idx = i;
TAILQ_INIT(&screens[i].rl);
screens[i].root = RootWindow(display, i);
- XGetWindowAttributes(display, screens[i].root, &wa);
- XSelectInput(display, screens[i].root,
- ButtonPressMask | wa.your_event_mask);
/* set default colors */
screens[i].color_focus = name_to_color("red");