]> git.lizzy.rs Git - bspwm.git/blobdiff - events.c
Mention the default reference
[bspwm.git] / events.c
index ec936238c9e3d88222833fbbda175fcf36b1a1fc..b368eee9519425587dac4ec61a00d0f100488c18 100644 (file)
--- a/events.c
+++ b/events.c
@@ -22,7 +22,6 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <stdlib.h>
 #include <stdbool.h>
 #include "bspwm.h"
 #include "ewmh.h"
@@ -160,8 +159,16 @@ void configure_request(xcb_generic_event_t *evt)
                c->floating_rectangle.height = height;
                xcb_rectangle_t r = c->floating_rectangle;
 
+               if (focus_follows_pointer) {
+                       listen_enter_notify(loc.desktop->root, false);
+               }
+
                window_move_resize(e->window, r.x, r.y, r.width, r.height);
 
+               if (focus_follows_pointer) {
+                       listen_enter_notify(loc.desktop->root, true);
+               }
+
                put_status(SBSC_MASK_NODE_GEOMETRY, "node_geometry 0x%08X 0x%08X 0x%08X %ux%u+%i+%i\n", loc.monitor->id, loc.desktop->id, e->window, r.width, r.height, r.x, r.y);
 
                monitor_t *m = monitor_from_client(c);
@@ -339,25 +346,36 @@ void enter_notify(xcb_generic_event_t *evt)
        xcb_enter_notify_event_t *e = (xcb_enter_notify_event_t *) evt;
        xcb_window_t win = e->event;
 
-       if (e->mode != XCB_NOTIFY_MODE_NORMAL) {
+       if (e->mode != XCB_NOTIFY_MODE_NORMAL || e->detail == XCB_NOTIFY_DETAIL_INFERIOR) {
+               return;
+       }
+
+       xcb_point_t pt = {e->root_x, e->root_y};
+       monitor_t *m = monitor_from_point(pt);
+
+       if (m == NULL) {
                return;
        }
 
-       coordinates_t loc;
        bool pff = pointer_follows_focus;
        bool pfm = pointer_follows_monitor;
        pointer_follows_focus = false;
        pointer_follows_monitor = false;
        auto_raise = false;
 
-       if (locate_window(win, &loc)) {
-               if (loc.monitor->desk == loc.desktop && loc.node != mon->desk->focus) {
-                       focus_node(loc.monitor, loc.desktop, loc.node);
+       desktop_t *d = m->desk;
+       node_t *n = NULL;
+
+       for (n = first_extrema(d->root); n != NULL; n = next_leaf(n, d->root)) {
+               if (n->id == win || (n->presel != NULL && n->presel->feedback == win)) {
+                       break;
                }
-       } else {
-               xcb_point_t pt = {e->root_x, e->root_y};
-               monitor_t *m = monitor_from_point(pt);
-               if (m != NULL && m != mon) {
+       }
+
+       if (n != mon->desk->focus) {
+               if (n != NULL) {
+                       focus_node(m, d, n);
+               } else if (m != mon) {
                        focus_node(m, m->desk, m->desk->focus);
                }
        }
@@ -400,6 +418,14 @@ void handle_state(monitor_t *m, desktop_t *d, node_t *n, xcb_atom_t state, unsig
                } else if (action == XCB_EWMH_WM_STATE_TOGGLE) {
                        set_layer(m, d, n, n->client->layer == LAYER_ABOVE ? n->client->last_layer : LAYER_ABOVE);
                }
+       } else if (state == ewmh->_NET_WM_STATE_HIDDEN) {
+               if (action == XCB_EWMH_WM_STATE_ADD) {
+                       set_hidden(m, d, n, true);
+               } else if (action == XCB_EWMH_WM_STATE_REMOVE) {
+                       set_hidden(m, d, n, false);
+               } else if (action == XCB_EWMH_WM_STATE_TOGGLE) {
+                       set_hidden(m, d, n, !n->hidden);
+               }
        } else if (state == ewmh->_NET_WM_STATE_STICKY) {
                if (action == XCB_EWMH_WM_STATE_ADD) {
                        set_sticky(m, d, n, true);
@@ -432,7 +458,6 @@ void handle_state(monitor_t *m, desktop_t *d, node_t *n, xcb_atom_t state, unsig
        HANDLE_WM_STATE(SHADED)
        HANDLE_WM_STATE(SKIP_TASKBAR)
        HANDLE_WM_STATE(SKIP_PAGER)
-       HANDLE_WM_STATE(HIDDEN)
        }
 #undef HANDLE_WM_STATE
 }