#define YESNO(x) ((x) ? "yes" : "no")
#define SWM_FOCUS_DEFAULT (0)
-#define SWM_FOCUS_SYNERGY (1)
-#define SWM_FOCUS_FOLLOW (2)
+#define SWM_FOCUS_FOLLOW (1)
+#define SWM_FOCUS_MANUAL (2)
#define SWM_CONF_DEFAULT (0)
#define SWM_CONF_KEYMAPPING (1)
void configurerequest(xcb_configure_request_event_t *);
void constrain_window(struct ws_win *, struct swm_region *, int);
void destroynotify(xcb_destroy_notify_event_t *);
-void do_sync(void);
void enternotify(xcb_enter_notify_event_t *);
void event_drain(uint8_t);
void event_error(xcb_generic_error_t *);
struct ws_win *find_window(xcb_window_t);
int floating_toggle_win(struct ws_win *);
void focus(struct swm_region *, union arg *);
+void focus_flush(void);
struct ws_win *focus_magic(struct ws_win *);
#ifdef SWM_DEBUG
void focusin(xcb_focus_in_event_t *);
}
void
-do_sync(void)
+focus_flush(void)
{
- xcb_get_input_focus_cookie_t c;
- xcb_get_input_focus_reply_t *r;
-
- /* mimic XSync() */
- c = xcb_get_input_focus(conn);
- xcb_flush(conn);
- r = xcb_get_input_focus_reply(conn, c, NULL);
- if (r)
- free(r);
+ if (focus_mode == SWM_FOCUS_DEFAULT)
+ event_drain(XCB_ENTER_NOTIFY);
+ else
+ xcb_flush(conn);
}
void
/* must be after stack */
bar_update();
- if (focus_mode == SWM_FOCUS_DEFAULT)
- event_drain(XCB_ENTER_NOTIFY);
- else
- xcb_flush(conn);
+ focus_flush();
}
void
TAILQ_FOREACH(win, &old_ws->winlist, entry)
unmap_window(win);
- if (focus_mode == SWM_FOCUS_DEFAULT)
- event_drain(XCB_ENTER_NOTIFY);
- else
- xcb_flush(conn);
+ focus_flush();
DNPRINTF(SWM_D_WS, "switchws: done\n");
}
stack();
- if (focus_mode == SWM_FOCUS_DEFAULT)
- event_drain(XCB_ENTER_NOTIFY);
- else
- xcb_flush(conn);
+ focus_flush();
}
void
a.id = SWM_ARG_ID_FOCUSCUR;
focus(r, &a);
- if (focus_mode == SWM_FOCUS_DEFAULT)
- event_drain(XCB_ENTER_NOTIFY);
- else
- xcb_flush(conn);
+ focus_flush();
}
void
stack();
bar_update();
- if (focus_mode == SWM_FOCUS_DEFAULT)
- event_drain(XCB_ENTER_NOTIFY);
- else
- xcb_flush(conn);
+ focus_flush();
}
void
if (r->ws->always_raise == 0)
stack();
- if (focus_mode == SWM_FOCUS_DEFAULT)
- event_drain(XCB_ENTER_NOTIFY);
- else
- xcb_flush(conn);
+ focus_flush();
}
void
a.id = SWM_ARG_ID_FOCUSCUR;
focus(r, &a);
- if (focus_mode == SWM_FOCUS_DEFAULT)
- event_drain(XCB_ENTER_NOTIFY);
- else
- xcb_flush(conn);
+ focus_flush();
}
char *
focus(win->ws->r, &a);
}
- if (focus_mode == SWM_FOCUS_DEFAULT)
- event_drain(XCB_ENTER_NOTIFY);
- else
- xcb_flush(conn);
+ focus_flush();
}
void
stack();
- if (focus_mode == SWM_FOCUS_DEFAULT)
- event_drain(XCB_ENTER_NOTIFY);
- else
- xcb_flush(conn);
+ focus_flush();
switch (args->id) {
case SWM_ARG_ID_WIDTHSHRINK:
/* not free, don't sync more than 120 times / second */
if ((mne->time - timestamp) > (1000 / 120) ) {
timestamp = mne->time;
- do_sync();
update_window(win);
+ xcb_flush(conn);
}
break;
default:
free(evt);
}
if (timestamp) {
- do_sync();
update_window(win);
+ xcb_flush(conn);
}
store_float_geom(win,r);
stack();
- if (focus_mode == SWM_FOCUS_DEFAULT)
- event_drain(XCB_ENTER_NOTIFY);
- else
- xcb_flush(conn);
+ focus_flush();
move_step = 0;
switch (args->id) {
/* not free, don't sync more than 120 times / second */
if ((mne->time - timestamp) > (1000 / 120) ) {
timestamp = mne->time;
- do_sync();
update_window(win);
+ xcb_flush(conn);
}
break;
default:
free(evt);
}
if (timestamp) {
- do_sync();
update_window(win);
+ xcb_flush(conn);
}
store_float_geom(win, r);
free(qpr);
focus_mode = SWM_FOCUS_DEFAULT;
else if (!strcmp(value, "follow_cursor"))
focus_mode = SWM_FOCUS_FOLLOW;
- else if (!strcmp(value, "synergy"))
- focus_mode = SWM_FOCUS_SYNERGY;
+ else if (!strcmp(value, "manual"))
+ focus_mode = SWM_FOCUS_MANUAL;
else
errx(1, "focus_mode");
break;
}
}
- if (focus_mode == SWM_FOCUS_DEFAULT)
- event_drain(XCB_ENTER_NOTIFY);
- else
- xcb_flush(conn);
+ focus_flush();
return (0);
}
stack_floater(win, win->ws->r);
- if (focus_mode == SWM_FOCUS_DEFAULT) {
- event_drain(XCB_ENTER_NOTIFY);
- } else {
- xcb_flush(conn);
- }
+ focus_flush();
} else {
config_win(win, e);
xcb_flush(conn);
stack();
- if (focus_mode == SWM_FOCUS_DEFAULT)
- event_drain(XCB_ENTER_NOTIFY);
- else
- xcb_flush(conn);
+ focus_flush();
}
#ifdef SWM_DEBUG
enternotify(xcb_enter_notify_event_t *e)
{
struct ws_win *win;
+
DNPRINTF(SWM_D_FOCUS, "enternotify: window: 0x%x, mode: %s(%d), "
"detail: %s(%d), root: 0x%x, subwindow: 0x%x, same_screen_focus: "
"%s, state: %d\n", e->event, get_notify_mode_label(e->mode),
e->mode, get_notify_detail_label(e->detail), e->detail, e->root,
e->child, YESNO(e->same_screen_focus), e->state);
- switch (focus_mode) {
- case SWM_FOCUS_DEFAULT:
- break;
- case SWM_FOCUS_FOLLOW:
- break;
- case SWM_FOCUS_SYNERGY:
- break;
+ if (focus_mode == SWM_FOCUS_MANUAL &&
+ e->mode == XCB_NOTIFY_MODE_NORMAL) {
+ DNPRINTF(SWM_D_EVENT, "enternotify: manual focus; ignoring.\n");
+ return;
}
if ((win = find_window(e->event)) == NULL) {
- DNPRINTF(SWM_D_EVENT, "skip enternotify: window is NULL\n");
+ DNPRINTF(SWM_D_EVENT, "enternotify: window is NULL; ignoring\n");
return;
}