X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=6a62c278dfe24f4e68df1d7efba8d3af979f75cf;hb=f2fa926aa1a0d2f1711671de27b2c4145b2408f9;hp=43de0ca1bc2e9a02ce46bd1176d71cf1e4ab8244;hpb=7921c5dfbb79a9d67d930c157b9006257cf7f1ce;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index 43de0ca..6a62c27 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -245,8 +245,8 @@ u_int32_t swm_debug = 0 #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) @@ -673,7 +673,6 @@ void configurenotify(xcb_configure_notify_event_t *); 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 *); @@ -683,7 +682,9 @@ void expose(xcb_expose_event_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 *); +void focus_win(struct ws_win *); #ifdef SWM_DEBUG void focusin(xcb_focus_in_event_t *); #endif @@ -696,7 +697,7 @@ char *get_notify_mode_label(uint8_t); xcb_screen_t *get_screen(int); char *get_win_name(xcb_window_t); uint32_t getstate(xcb_window_t); -void grabbuttons(struct ws_win *, int); +void grabbuttons(struct ws_win *); void keypress(xcb_key_press_event_t *); #ifdef SWM_DEBUG void leavenotify(xcb_leave_notify_event_t *); @@ -796,17 +797,12 @@ get_screen(int screen) } 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 @@ -1920,10 +1916,7 @@ bar_toggle(struct swm_region *r, union arg *args) /* must be after stack */ bar_update(); - if (focus_mode == SWM_FOCUS_DEFAULT) - event_drain(XCB_ENTER_NOTIFY); - else - xcb_flush(conn); + focus_flush(); } void @@ -2668,7 +2661,6 @@ unfocus_win(struct ws_win *win) win->ws->focus_prev = NULL; } - grabbuttons(win, 0); xcb_change_window_attributes(conn, win->id, XCB_CW_BORDER_PIXEL, &win->ws->r->s->c[SWM_S_COLOR_UNFOCUS].pixel); xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->s->root, @@ -2721,7 +2713,19 @@ focus_win(struct ws_win *win) cur_focus = r->focus; free(r); } - if ((cfw = find_window(cur_focus)) != NULL) + + cfw = find_window(cur_focus); + + if (cfw == win) { + if (win->ws->focus == win) { + DNPRINTF(SWM_D_FOCUS, "focus_win: already focused; " + "skipping.\n"); + return; + } else { + DNPRINTF(SWM_D_FOCUS, "focus_win: already has input " + "focus.\n"); + } + } else unfocus_win(cfw); win->ws->focus = win; @@ -2739,7 +2743,6 @@ focus_win(struct ws_win *win) if (win->java == 0) xcb_set_input_focus(conn, XCB_INPUT_FOCUS_PARENT, win->id, XCB_CURRENT_TIME); - grabbuttons(win, 1); xcb_change_window_attributes(conn, win->id, XCB_CW_BORDER_PIXEL, &win->ws->r->s->c[SWM_S_COLOR_FOCUS].pixel); @@ -2857,10 +2860,7 @@ switchws(struct swm_region *r, union arg *args) 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"); } @@ -3070,10 +3070,7 @@ swapwin(struct swm_region *r, union arg *args) stack(); - if (focus_mode == SWM_FOCUS_DEFAULT) - event_drain(XCB_ENTER_NOTIFY); - else - xcb_flush(conn); + focus_flush(); } void @@ -3287,10 +3284,7 @@ cycle_layout(struct swm_region *r, union arg *args) 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 @@ -3921,10 +3915,7 @@ send_to_ws(struct swm_region *r, union arg *args) stack(); bar_update(); - if (focus_mode == SWM_FOCUS_DEFAULT) - event_drain(XCB_ENTER_NOTIFY); - else - xcb_flush(conn); + focus_flush(); } void @@ -3954,10 +3945,7 @@ raise_toggle(struct swm_region *r, union arg *args) 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 @@ -3978,10 +3966,7 @@ iconify(struct swm_region *r, union arg *args) 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 * @@ -4493,10 +4478,7 @@ floating_toggle(struct swm_region *r, union arg *args) focus(win->ws->r, &a); } - if (focus_mode == SWM_FOCUS_DEFAULT) - event_drain(XCB_ENTER_NOTIFY); - else - xcb_flush(conn); + focus_flush(); } void @@ -4602,10 +4584,7 @@ resize(struct ws_win *win, union arg *args) 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: @@ -4725,8 +4704,8 @@ resize(struct ws_win *win, union arg *args) /* 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: @@ -4736,8 +4715,8 @@ resize(struct ws_win *win, union arg *args) free(evt); } if (timestamp) { - do_sync(); update_window(win); + xcb_flush(conn); } store_float_geom(win,r); @@ -4800,10 +4779,7 @@ move(struct ws_win *win, union arg *args) stack(); - if (focus_mode == SWM_FOCUS_DEFAULT) - event_drain(XCB_ENTER_NOTIFY); - else - xcb_flush(conn); + focus_flush(); move_step = 0; switch (args->id) { @@ -4872,8 +4848,8 @@ move(struct ws_win *win, union arg *args) /* 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: @@ -4883,8 +4859,8 @@ move(struct ws_win *win, union arg *args) free(evt); } if (timestamp) { - do_sync(); update_window(win); + xcb_flush(conn); } store_float_geom(win, r); free(qpr); @@ -5864,27 +5840,28 @@ grabkeys(void) } void -grabbuttons(struct ws_win *win, int focused) +grabbuttons(struct ws_win *win) { +#if 0 int i; +#endif + + DNPRINTF(SWM_D_MOUSE, "grabbuttons: win 0x%x\n", win->id); +#if 0 xcb_ungrab_button(conn, XCB_BUTTON_INDEX_ANY, win->id, XCB_BUTTON_MASK_ANY); - if (focused) { - for (i = 0; i < LENGTH(buttons); i++) - if (buttons[i].action == client_click) - xcb_grab_button(conn, 0, win->id, - BUTTONMASK, - XCB_GRAB_MODE_ASYNC, - XCB_GRAB_MODE_SYNC, - XCB_WINDOW_NONE, - XCB_CURSOR_NONE, - buttons[i].button, - buttons[i].mask); - } else - xcb_grab_button(conn, 0, win->id, BUTTONMASK, - XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_SYNC, XCB_WINDOW_NONE, - XCB_CURSOR_NONE, XCB_BUTTON_INDEX_ANY, XCB_BUTTON_MASK_ANY); + + for (i = 0; i < LENGTH(buttons); i++) + if (buttons[i].action == client_click) + xcb_grab_button(conn, 0, win->id, BUTTONMASK, + XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC, + XCB_WINDOW_NONE, XCB_CURSOR_NONE, + buttons[i].button, buttons[i].mask); +#endif + xcb_grab_button(conn, 0, win->id, BUTTONMASK, XCB_GRAB_MODE_SYNC, + XCB_GRAB_MODE_ASYNC, XCB_WINDOW_NONE, XCB_CURSOR_NONE, + XCB_BUTTON_INDEX_ANY, XCB_BUTTON_MASK_ANY); } const char *quirkname[] = { @@ -6209,8 +6186,8 @@ setconfvalue(char *selector, char *value, int flags) 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; @@ -6464,10 +6441,7 @@ setlayout(char *selector, char *value, int flags) } } - if (focus_mode == SWM_FOCUS_DEFAULT) - event_drain(XCB_ENTER_NOTIFY); - else - xcb_flush(conn); + focus_flush(); return (0); } @@ -6981,6 +6955,8 @@ out: /* Set initial _NET_WM_ALLOWED_ACTIONS */ ewmh_update_actions(win); + grabbuttons(win); + DNPRINTF(SWM_D_MISC, "manage_window: done. window: 0x%x, (x,y) w x h: " "(%d,%d) %d x %d, ws: %d, iconic: %s, transient: 0x%x\n", win->id, X(win), Y(win), WIDTH(win), HEIGHT(win), win->ws->idx, @@ -7094,7 +7070,7 @@ buttonpress(xcb_button_press_event_t *e) { struct ws_win *win; int i; - unsigned int action; + int handled = 0; DNPRINTF(SWM_D_EVENT, "buttonpress: window 0x%x, detail: %u\n", e->event, e->detail); @@ -7103,13 +7079,19 @@ buttonpress(xcb_button_press_event_t *e) return; focus_win(focus_magic(win)); - action = client_click; for (i = 0; i < LENGTH(buttons); i++) - if (action == buttons[i].action && buttons[i].func && + if (client_click == buttons[i].action && buttons[i].func && buttons[i].button == e->detail && - CLEANMASK(buttons[i].mask) == CLEANMASK(e->state)) + CLEANMASK(buttons[i].mask) == CLEANMASK(e->state)) { buttons[i].func(win, &buttons[i].args); + handled = 1; + } + + if (!handled) { + DNPRINTF(SWM_D_EVENT, "buttonpress: passing to window\n"); + xcb_allow_events(conn, XCB_ALLOW_REPLAY_POINTER, e->time); + } xcb_flush(conn); } @@ -7274,11 +7256,7 @@ configurerequest(xcb_configure_request_event_t *e) 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); @@ -7332,10 +7310,7 @@ destroynotify(xcb_destroy_notify_event_t *e) stack(); - if (focus_mode == SWM_FOCUS_DEFAULT) - event_drain(XCB_ENTER_NOTIFY); - else - xcb_flush(conn); + focus_flush(); } #ifdef SWM_DEBUG @@ -7406,23 +7381,21 @@ void 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; }