JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
move some things into setup_globals()
[spectrwm.git] / spectrwm.c
index 4b5adf9..829bba0 100644 (file)
@@ -843,7 +843,6 @@ ewmh_autoquirk(struct ws_win *win)
 {
        uint32_t                i, n;
        xcb_atom_t              *type;
-
        xcb_get_property_cookie_t       c;
        xcb_get_property_reply_t        *r;
 
@@ -2156,11 +2155,11 @@ fake_keypress(struct ws_win *win, xcb_keysym_t keysym, uint16_t modifiers)
 
        event.response_type = XCB_KEY_PRESS;
        xcb_send_event(conn, True, win->id,
-           XCB_EVENT_MASK_KEY_PRESS, (char *)&event);
+           XCB_EVENT_MASK_KEY_PRESS, (const char *)&event);
 
        event.response_type = XCB_KEY_RELEASE;
        xcb_send_event(conn, True, win->id,
-           XCB_EVENT_MASK_KEY_RELEASE, (char *)&event);
+           XCB_EVENT_MASK_KEY_RELEASE, (const char *)&event);
 }
 
 void
@@ -2189,8 +2188,8 @@ restart(struct swm_region *r, union arg *args)
 struct swm_region *
 root_to_region(xcb_window_t root)
 {
-       struct swm_region       *r = NULL;
-       int                     i, num_screens;
+       struct swm_region               *r = NULL;
+       int                             i, num_screens;
        xcb_query_pointer_reply_t       *qpr;
 
        DNPRINTF(SWM_D_MISC, "root_to_region: window: 0x%x\n", root);
@@ -2241,7 +2240,6 @@ find_window(xcb_window_t id)
 {
        struct ws_win           *win;
        int                     i, j, num_screens;
-       xcb_query_tree_cookie_t c;
        xcb_query_tree_reply_t  *r;
 
        num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
@@ -2251,8 +2249,7 @@ find_window(xcb_window_t id)
                                if (id == win->id)
                                        return (win);
 
-       c = xcb_query_tree(conn, id);
-       r = xcb_query_tree_reply(conn, c, NULL);
+       r = xcb_query_tree_reply(conn, xcb_query_tree(conn, id), NULL);
        if (!r)
                return (NULL);
 
@@ -2456,7 +2453,6 @@ void
 focus_win(struct ws_win *win)
 {
        struct ws_win           *cfw = NULL;
-       xcb_get_input_focus_cookie_t    c;
        xcb_get_input_focus_reply_t     *r;
        xcb_window_t                    cur_focus = XCB_WINDOW_NONE;
 
@@ -2480,8 +2476,7 @@ focus_win(struct ws_win *win)
                return;
        }
 
-       c = xcb_get_input_focus(conn);
-       r = xcb_get_input_focus_reply(conn, c, NULL);
+       r = xcb_get_input_focus_reply(conn, xcb_get_input_focus(conn), NULL);
        if (r) {
                cur_focus = r->focus;
                free(r);
@@ -2520,6 +2515,20 @@ focus_win(struct ws_win *win)
 }
 
 void
+event_drain(uint8_t rt)
+{
+       xcb_generic_event_t     *evt;
+
+       xcb_flush(conn);
+       while ((evt = xcb_poll_for_event(conn))) {
+               if (XCB_EVENT_RESPONSE_TYPE(evt) != rt)
+                       event_handle(evt);
+
+               free(evt);
+       }
+}
+
+void
 switchws(struct swm_region *r, union arg *args)
 {
        int                     wsid = args->id, unmap_old = 0;
@@ -2573,7 +2582,10 @@ switchws(struct swm_region *r, union arg *args)
                TAILQ_FOREACH(win, &old_ws->winlist, entry)
                        unmap_window(win);
 
-       xcb_flush(conn);
+       if (focus_mode == SWM_FOCUS_DEFAULT)
+               event_drain(XCB_ENTER_NOTIFY);
+       else
+               xcb_flush(conn);
 }
 
 void
@@ -2985,9 +2997,12 @@ cycle_layout(struct swm_region *r, union arg *args)
                ws->cur_layout = &layouts[0];
 
        stack();
+       bar_update();
 
-       a.id = SWM_ARG_ID_FOCUSCUR;
+       if (focus_mode == SWM_FOCUS_DEFAULT)
+               event_drain(XCB_ENTER_NOTIFY);
 
+       a.id = SWM_ARG_ID_FOCUSCUR;
        focus(r, &a);
 }
 
@@ -3045,6 +3060,9 @@ stack(void) {
        if (font_adjusted)
                font_adjusted--;
 
+       if (focus_mode == SWM_FOCUS_DEFAULT)
+               event_drain(XCB_ENTER_NOTIFY);
+
        DNPRINTF(SWM_D_STACK, "stack: end\n");
 }
 
@@ -4117,6 +4135,7 @@ floating_toggle(struct swm_region *r, union arg *args)
        }
 
        xcb_flush(conn);
+       event_drain(XCB_ENTER_NOTIFY);
 }
 
 void
@@ -6834,11 +6853,6 @@ void
 enternotify(xcb_enter_notify_event_t *e)
 {
        struct ws_win           *win;
-#if 0
-       struct ws_win           *w;
-       Window                  focus_return;
-       int                     revert_to_return;
-#endif
        DNPRINTF(SWM_D_FOCUS, "enternotify: window: 0x%x, mode: %d, detail: "
            "%d, root: 0x%x, subwindow: 0x%x, same_screen_focus: %s, "
            "state: %d\n", e->event, e->mode, e->detail, e->root,
@@ -6856,74 +6870,6 @@ enternotify(xcb_enter_notify_event_t *e)
        case SWM_FOCUS_FOLLOW:
                break;
        case SWM_FOCUS_SYNERGY:
-#if 0
-       /*
-        * all these checks need to be in this order because the
-        * XCheckTypedWindowEvent relies on weeding out the previous events
-        *
-        * making this code an option would enable a follow mouse for focus
-        * feature
-        */
-
-       /*
-        * state is set when we are switching workspaces and focus is set when
-        * the window or a subwindow already has focus (occurs during restart).
-        *
-        * Only honor the focus flag if last_focus_event is not FocusOut,
-        * this allows spectrwm to continue to control focus when another
-        * program is also playing with it.
-        */
-       if (ev->state || (ev->focus && last_focus_event != FocusOut)) {
-               DNPRINTF(SWM_D_EVENT, "ignoring enternotify: focus\n");
-               return;
-       }
-
-       /*
-        * happens when a window is created or destroyed and the border
-        * crosses the mouse pointer and when switching ws
-        *
-        * we need the subwindow test to see if we came from root in order
-        * to give focus to floaters
-        */
-       if (ev->mode == NotifyNormal && ev->detail == NotifyVirtual &&
-           ev->subwindow == 0) {
-               DNPRINTF(SWM_D_EVENT, "ignoring enternotify: NotifyVirtual\n");
-               return;
-       }
-
-       /* this window already has focus */
-       if (ev->mode == NotifyNormal && ev->detail == NotifyInferior) {
-               DNPRINTF(SWM_D_EVENT, "ignoring enternotify: win has focus\n");
-               return;
-       }
-
-       /* this window is being deleted or moved to another ws */
-       if (XCheckTypedWindowEvent(display, ev->window, ConfigureNotify,
-           &cne) == True) {
-               DNPRINTF(SWM_D_EVENT, "ignoring enternotify: configurenotify\n");
-               XPutBackEvent(display, &cne);
-               return;
-       }
-
-       if ((win = find_window(ev->window)) == NULL) {
-               DNPRINTF(SWM_D_EVENT, "ignoring enternotify: win == NULL\n");
-               return;
-       }
-
-       /*
-        * In fullstack kill all enters unless they come from a different ws
-        * (i.e. another region) or focus has been grabbed externally.
-        */
-       if (win->ws->cur_layout->flags & SWM_L_FOCUSPREV &&
-           last_focus_event != FocusOut) {
-               XGetInputFocus(display, &focus_return, &revert_to_return);
-               if ((w = find_window(focus_return)) == NULL ||
-                   w->ws == win->ws) {
-                       DNPRINTF(SWM_D_EVENT, "ignoring event: fullstack\n");
-                       return;
-               }
-       }
-#endif
                break;
        }
 
@@ -7045,20 +6991,6 @@ propertynotify(xcb_property_notify_event_t *e)
        }
 
        switch (e->atom) {
-#if 0
-       case XCB_ATOM_WM_NORMAL_HINTS:
-               xcb_icccm_get_wm_normal_hints(conn,
-                       xcb_iccom_get_wm_normal_hints(conn, win->id),
-                       &win->sh, NULL);
-               warnx("normal hints: flag 0x%x", win->sh.flags);
-               if (win->sh.flags & XCB_SIZE_HINT_P_MIN_SIZE) {
-                       WIDTH(win) = win->sh.min_width;
-                       HEIGHT(win) = win->sh.min_height;
-                       warnx("min %d %d", WIDTH(win), HEIGHT(win));
-               }
-               XMoveResizeWindow(display, win->id,
-                   X(win), Y(win), WIDTH(win), HEIGHT(win));
-#endif
        case XCB_ATOM_WM_CLASS:
        case XCB_ATOM_WM_NAME:
                bar_update();
@@ -7540,6 +7472,19 @@ setup_globals(void)
 
        if ((clock_format = strdup("%a %b %d %R %Z %Y")) == NULL)
                err(1, "setup_globals: strdup: failed to allocate memory.");
+
+       if ((syms = xcb_key_symbols_alloc(conn)) == NULL)
+               errx(1, "unable to allocate key symbols");
+
+       astate = get_atom_from_string("WM_STATE");
+       aprot = get_atom_from_string("WM_PROTOCOLS");
+       adelete = get_atom_from_string("WM_DELETE_WINDOW");
+       takefocus = get_atom_from_string("WM_TAKE_FOCUS");
+       a_wmname = get_atom_from_string("WM_NAME");
+       a_netwmname = get_atom_from_string("_NET_WM_NAME");
+       a_utf8_string = get_atom_from_string("UTF8_STRING");
+       a_string = get_atom_from_string("STRING");
+       a_swm_iconic = get_atom_from_string("_SWM_ICONIC");
 }
 
 void
@@ -7683,19 +7628,6 @@ main(int argc, char *argv[])
                errx(1, "can not get XCB connection");
 
        xfd = xcb_get_file_descriptor(conn);
-       syms = xcb_key_symbols_alloc(conn);
-       if (!syms)
-               errx(1, "unable to allocate key symbols");
-
-       astate = get_atom_from_string("WM_STATE");
-       aprot = get_atom_from_string("WM_PROTOCOLS");
-       adelete = get_atom_from_string("WM_DELETE_WINDOW");
-       takefocus = get_atom_from_string("WM_TAKE_FOCUS");
-       a_wmname = get_atom_from_string("WM_NAME");
-       a_netwmname = get_atom_from_string("_NET_WM_NAME");
-       a_utf8_string = get_atom_from_string("UTF8_STRING");
-       a_string = get_atom_from_string("STRING");
-       a_swm_iconic = get_atom_from_string("_SWM_ICONIC");
 
        /* look for local and global conf file */
        pwd = getpwuid(getuid());