* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <stdlib.h>
#include <stdbool.h>
#include "bspwm.h"
#include "ewmh.h"
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);
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);
}
}
} 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);
HANDLE_WM_STATE(SHADED)
HANDLE_WM_STATE(SKIP_TASKBAR)
HANDLE_WM_STATE(SKIP_PAGER)
- HANDLE_WM_STATE(HIDDEN)
}
#undef HANDLE_WM_STATE
}