]> git.lizzy.rs Git - bspwm.git/blobdiff - events.c
Fix silly mistakes in `send_desktop_to`
[bspwm.git] / events.c
index e3f9968cde830ebfba61f22cbafc31daaca06267..c7fd4a093798963b1b3d31c0fbde77ebb443cfc5 100644 (file)
--- a/events.c
+++ b/events.c
@@ -2,6 +2,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <xcb/xcb.h>
+#include <xcb/randr.h>
 #include <xcb/xcb_event.h>
 #include <xcb/xcb_icccm.h>
 #include "types.h"
@@ -16,7 +17,8 @@
 
 void handle_event(xcb_generic_event_t *evt)
 {
-    switch (XCB_EVENT_RESPONSE_TYPE(evt)) {
+    uint8_t resp_type = XCB_EVENT_RESPONSE_TYPE(evt);
+    switch (resp_type) {
         case XCB_MAP_REQUEST:
             map_request(evt);
             break;
@@ -42,6 +44,8 @@ void handle_event(xcb_generic_event_t *evt)
             motion_notify();
             break;
         default:
+            if (resp_type == randr_base + XCB_RANDR_SCREEN_CHANGE_NOTIFY)
+                import_monitors();
             break;
     }
 }
@@ -194,10 +198,8 @@ void client_message(xcb_generic_event_t *evt)
 
     if (e->type == ewmh->_NET_CURRENT_DESKTOP) {
         desktop_location_t loc;
-        if (ewmh_locate_desktop(e->data.data32[0], &loc)) {
-            select_monitor(loc.monitor);
-            select_desktop(loc.desktop);
-        }
+        if (ewmh_locate_desktop(e->data.data32[0], &loc))
+            focus_node(loc.monitor, loc.desktop, loc.desktop->focus);
         return;
     }
 
@@ -209,12 +211,11 @@ void client_message(xcb_generic_event_t *evt)
         handle_state(loc.monitor, loc.desktop, loc.node, e->data.data32[1], e->data.data32[0]);
         handle_state(loc.monitor, loc.desktop, loc.node, e->data.data32[2], e->data.data32[0]);
     } else if (e->type == ewmh->_NET_ACTIVE_WINDOW) {
-        if (loc.desktop->focus->client->fullscreen && loc.desktop->focus != loc.node)
+        if (loc.desktop->focus->client->fullscreen && loc.desktop->focus != loc.node) {
             toggle_fullscreen(loc.monitor, loc.desktop->focus->client);
-        select_monitor(loc.monitor);
-        select_desktop(loc.desktop);
-        focus_node(loc.monitor, loc.desktop, loc.node, true);
-        arrange(loc.monitor, loc.desktop);
+            arrange(loc.monitor, loc.desktop);
+        }
+        focus_node(loc.monitor, loc.desktop, loc.node);
     }
 }
 
@@ -292,7 +293,8 @@ void grab_pointer(pointer_action_t pac)
 
         switch (pac)  {
             case ACTION_FOCUS:
-                focus_node(loc.monitor, loc.desktop, loc.node, true);
+                if (loc.node != mon->desk->focus)
+                    focus_node(loc.monitor, loc.desktop, loc.node);
                 break;
             case ACTION_MOVE:
             case ACTION_RESIZE_SIDE:
@@ -425,7 +427,7 @@ void track_pointer(int root_x, int root_y)
                 window_location_t loc;
                 bool is_managed = (pwin == XCB_NONE ? false : locate_window(pwin, &loc));
                 if (is_managed && is_tiled(loc.node->client) && loc.monitor == m) {
-                    swap_nodes(d, n, loc.desktop, loc.node);
+                    swap_nodes(n, loc.node);
                     arrange(m, d);
                 } else {
                     if (is_managed && loc.monitor == m) {
@@ -553,6 +555,6 @@ void ungrab_pointer(void)
     monitor_t *m = underlying_monitor(frozen_pointer->client);
     if (m != NULL && m != frozen_pointer->monitor) {
         transfer_node(frozen_pointer->monitor, frozen_pointer->desktop, m, m->desk, frozen_pointer->node);
-        select_monitor(m);
+        focus_node(m, m->desk, m->desk->focus);
     }
 }