From d8a7fd2a145711e588fb7d67908ac23c8b47e3c7 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Fri, 4 Mar 2022 20:14:07 +0100 Subject: [PATCH] Handle configure requests and GTK MOVERESIZE message --- src/defines.hpp | 7 ++++++- src/events/events.cpp | 23 +++++++++++++++++++++++ src/events/events.hpp | 1 + src/windowManager.cpp | 31 +++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/defines.hpp b/src/defines.hpp index 451ee10..ab6a3f6 100644 --- a/src/defines.hpp +++ b/src/defines.hpp @@ -92,4 +92,9 @@ #define RETURNIFBAR if (g_pWindowManager->statusBar) return; #define RETURNIFMAIN if (!g_pWindowManager->statusBar) return; -#define COLORDELTAOVERX(c, c1, d) (abs(RED(c) - RED(c1)) > d / 255.f || abs(GREEN(c) - GREEN(c1)) > d / 255.f || abs(BLUE(c) - BLUE(c1)) > d / 255.f || abs(ALPHA(c) - ALPHA(c1)) > d / 255.f) \ No newline at end of file +#define COLORDELTAOVERX(c, c1, d) (abs(RED(c) - RED(c1)) > d / 255.f || abs(GREEN(c) - GREEN(c1)) > d / 255.f || abs(BLUE(c) - BLUE(c1)) > d / 255.f || abs(ALPHA(c) - ALPHA(c1)) > d / 255.f) + +#define _NET_MOVERESIZE_WINDOW_X (1 << 8) +#define _NET_MOVERESIZE_WINDOW_Y (1 << 9) +#define _NET_MOVERESIZE_WINDOW_WIDTH (1 << 10) +#define _NET_MOVERESIZE_WINDOW_HEIGHT (1 << 11) \ No newline at end of file diff --git a/src/events/events.cpp b/src/events/events.cpp index a9104c3..82da796 100644 --- a/src/events/events.cpp +++ b/src/events/events.cpp @@ -863,6 +863,29 @@ void Events::eventClientMessage(xcb_generic_event_t* event) { } } +void Events::eventConfigure(xcb_generic_event_t* event) { + const auto E = reinterpret_cast(event); + + Debug::log(LOG, "Window " + std::to_string(E->window) + " requests XY: " + std::to_string(E->x) + ", " + std::to_string(E->y) + ", WH: " + std::to_string(E->width) + "x" + std::to_string(E->height)); + + auto *const PWINDOW = g_pWindowManager->getWindowFromDrawable(E->window); + + if (!PWINDOW) { + Debug::log(LOG, "CONFIGURE: Window doesn't exist, ignoring."); + return; + } + + if (!PWINDOW->getIsFloating()) { + Debug::log(LOG, "CONFIGURE: Window isn't floating, ignoring."); + return; + } + + PWINDOW->setDefaultPosition(Vector2D(E->x, E->y)); + PWINDOW->setDefaultSize(Vector2D(E->width, E->height)); + PWINDOW->setEffectiveSize(PWINDOW->getDefaultSize()); + PWINDOW->setEffectivePosition(PWINDOW->getDefaultPosition()); +} + void Events::eventRandRScreenChange(xcb_generic_event_t* event) { // fix sus randr events, that sometimes happen diff --git a/src/events/events.hpp b/src/events/events.hpp index 47bc660..abbe107 100644 --- a/src/events/events.hpp +++ b/src/events/events.hpp @@ -16,6 +16,7 @@ namespace Events { EVENT(KeyPress); EVENT(MotionNotify); EVENT(ClientMessage); + EVENT(Configure); EVENT(RandRScreenChange); diff --git a/src/windowManager.cpp b/src/windowManager.cpp index fc14641..f2337d7 100644 --- a/src/windowManager.cpp +++ b/src/windowManager.cpp @@ -313,6 +313,10 @@ void CWindowManager::recieveEvent() { Events::eventClientMessage(ev); Debug::log(LOG, "Event dispatched CLIENT_MESSAGE"); break; + case XCB_CONFIGURE_REQUEST: + Events::eventConfigure(ev); + Debug::log(LOG, "Event dispatched CONFIGURE"); + break; default: @@ -2231,6 +2235,33 @@ void CWindowManager::handleClientMessage(xcb_client_message_event_t* E) { setFocusedWindow(PWINDOW->getDrawable()); Debug::log(LOG, "Message recieved to set active for " + std::to_string(PWINDOW->getDrawable())); + } else if (E->type == HYPRATOMS["_NET_MOVERESIZE_WINDOW"]) { + void *const PEVENT = calloc(32, 1); + xcb_configure_request_event_t* const GENEV = (xcb_configure_request_event_t*)PEVENT; + + GENEV->window = E->window; + GENEV->response_type = XCB_CONFIGURE_REQUEST; + + GENEV->value_mask = 0; + if (E->data.data32[0] & _NET_MOVERESIZE_WINDOW_X) { + GENEV->value_mask |= XCB_CONFIG_WINDOW_X; + GENEV->x = E->data.data32[1]; + } + if (E->data.data32[0] & _NET_MOVERESIZE_WINDOW_Y) { + GENEV->value_mask |= XCB_CONFIG_WINDOW_Y; + GENEV->y = E->data.data32[2]; + } + if (E->data.data32[0] & _NET_MOVERESIZE_WINDOW_WIDTH) { + GENEV->value_mask |= XCB_CONFIG_WINDOW_WIDTH; + GENEV->width = E->data.data32[3]; + } + if (E->data.data32[0] & _NET_MOVERESIZE_WINDOW_HEIGHT) { + GENEV->value_mask |= XCB_CONFIG_WINDOW_HEIGHT; + GENEV->height = E->data.data32[4]; + } + + Events::eventConfigure((xcb_generic_event_t*)GENEV); + free(GENEV); } }