diff --git a/src/bar/Bar.cpp b/src/bar/Bar.cpp index 91ac3f1..f5ac9a5 100644 --- a/src/bar/Bar.cpp +++ b/src/bar/Bar.cpp @@ -164,6 +164,9 @@ void CStatusBar::setupTray() { XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL | XCB_CW_OVERRIDE_REDIRECT | XCB_CW_COLORMAP, values); + xcb_atom_t dockAtom[] = {HYPRATOMS["_NET_WM_WINDOW_TYPE_UTILITY"]}; + xcb_ewmh_set_wm_window_type(g_pWindowManager->EWMHConnection, m_iWindowID, 1, dockAtom); + const uint32_t ORIENTATION = 0; // Horizontal xcb_change_property(g_pWindowManager->DisplayConnection, XCB_PROP_MODE_REPLACE, trayWindowID, HYPRATOMS["_NET_SYSTEM_TRAY_ORIENTATION"], XCB_ATOM_CARDINAL, @@ -366,6 +369,7 @@ void CStatusBar::destroy() { saveTrayOnDestroy(); xcb_close_font(g_pWindowManager->DisplayConnection, m_mContexts["HITEXT"].Font); + xcb_unmap_window(g_pWindowManager->DisplayConnection, m_iWindowID); xcb_destroy_window(g_pWindowManager->DisplayConnection, m_iWindowID); xcb_destroy_window(g_pWindowManager->DisplayConnection, m_iPixmap); diff --git a/src/events/events.cpp b/src/events/events.cpp index b3eb18c..384eb35 100644 --- a/src/events/events.cpp +++ b/src/events/events.cpp @@ -620,6 +620,27 @@ void Events::eventClientMessage(xcb_generic_event_t* event) { xcb_map_window(g_pWindowManager->DisplayConnection, CLIENT); } } - +} +void Events::eventConfigureRequest(xcb_generic_event_t* event) { + const auto E = reinterpret_cast(event); + + RETURNIFBAR; + + const auto PWINDOW = g_pWindowManager->getWindowFromDrawable(E->window); + + if (!PWINDOW || !PWINDOW->getIsFloating()) + return; + + // correct delta + auto DELTA = PWINDOW->getDefaultSize() - Vector2D(E->width, E->height); + + PWINDOW->setDefaultSize(Vector2D(E->width, E->height)); + PWINDOW->setDefaultPosition(PWINDOW->getDefaultPosition() - (DELTA / 2.f)); // Center + + PWINDOW->setPosition(PWINDOW->getDefaultPosition()); + PWINDOW->setSize(PWINDOW->getDefaultSize()); + + PWINDOW->setRealPosition(PWINDOW->getDefaultPosition()); + PWINDOW->setRealSize(PWINDOW->getDefaultSize()); } \ No newline at end of file diff --git a/src/events/events.hpp b/src/events/events.hpp index 3bec0ce..41ba220 100644 --- a/src/events/events.hpp +++ b/src/events/events.hpp @@ -16,6 +16,7 @@ namespace Events { EVENT(KeyPress); EVENT(MotionNotify); EVENT(ClientMessage); + EVENT(ConfigureRequest); // Bypass some events for floating windows CWindow* remapWindow(int, bool floating = false, int forcemonitor = -1); diff --git a/src/window.cpp b/src/window.cpp index f4a29ed..815e749 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -1,7 +1,7 @@ #include "window.hpp" #include "windowManager.hpp" -CWindow::CWindow() { this->setLastUpdatePosition(Vector2D(0,0)); this->setLastUpdateSize(Vector2D(0,0)); this->setDock(false); this->setUnderFullscreen(false); this->setIsSleeping(true); this->setFirstAnimFrame(true); this->setIsAnimated(false); this->setDead(false); this->setMasterChildIndex(0); this->setMaster(false); this->setCanKill(false); this->setImmovable(false); this->setNoInterventions(false); this->setDirty(true); this->setFullscreen(false); this->setIsFloating(false); this->setParentNodeID(0); this->setChildNodeAID(0); this->setChildNodeBID(0); this->setName(""); } +CWindow::CWindow() { this->setRounded(false); this->setLastUpdatePosition(Vector2D(0,0)); this->setLastUpdateSize(Vector2D(0,0)); this->setDock(false); this->setUnderFullscreen(false); this->setIsSleeping(true); this->setFirstAnimFrame(true); this->setIsAnimated(false); this->setDead(false); this->setMasterChildIndex(0); this->setMaster(false); this->setCanKill(false); this->setImmovable(false); this->setNoInterventions(false); this->setDirty(true); this->setFullscreen(false); this->setIsFloating(false); this->setParentNodeID(0); this->setChildNodeAID(0); this->setChildNodeBID(0); this->setName(""); } CWindow::~CWindow() { } void CWindow::generateNodeID() { diff --git a/src/window.hpp b/src/window.hpp index d260916..5d77d08 100644 --- a/src/window.hpp +++ b/src/window.hpp @@ -94,6 +94,9 @@ public: // Docks EXPOSED_MEMBER(Dock, bool, b); + // Rounding + EXPOSED_MEMBER(Rounded, bool, b); + private: diff --git a/src/windowManager.cpp b/src/windowManager.cpp index 127507b..ac16bd5 100644 --- a/src/windowManager.cpp +++ b/src/windowManager.cpp @@ -264,6 +264,10 @@ void CWindowManager::recieveEvent() { Events::eventMapWindow(ev); Debug::log(LOG, "Event dispatched MAP"); break; + case XCB_CONFIGURE_REQUEST: + Events::eventConfigureRequest(ev); + Debug::log(LOG, "Event dispatched CONFIGURE_REQUEST"); + break; case XCB_BUTTON_PRESS: Events::eventButtonPress(ev); Debug::log(LOG, "Event dispatched BUTTON_PRESS"); @@ -407,7 +411,6 @@ void CWindowManager::refreshDirtyWindows() { Values[0] = (int)ConfigManager::getInt("border_size"); xcb_configure_window(DisplayConnection, window.getDrawable(), XCB_CONFIG_WINDOW_BORDER_WIDTH, Values); - // do border Values[0] = window.getRealBorderColor().getAsUint32(); xcb_change_window_attributes(DisplayConnection, window.getDrawable(), XCB_CW_BORDER_PIXEL, Values); @@ -437,7 +440,6 @@ void CWindowManager::refreshDirtyWindows() { } applyShapeToWindow(&window); - } } @@ -609,6 +611,13 @@ void CWindowManager::applyShapeToWindow(CWindow* pWindow) { const auto ROUNDING = pWindow->getFullscreen() ? 0 : ConfigManager::getInt("rounding"); + if (!pWindow->getRounded() && !ROUNDING) + return; + + if (!ROUNDING && pWindow->getRounded()) { + pWindow->setRounded(false); + } + const auto SHAPEQUERY = xcb_get_extension_data(DisplayConnection, &xcb_shape_id); if (!SHAPEQUERY || !SHAPEQUERY->present || pWindow->getNoInterventions()) @@ -696,6 +705,9 @@ void CWindowManager::applyShapeToWindow(CWindow* pWindow) { xcb_free_pixmap(DisplayConnection, PIXMAP1); xcb_free_pixmap(DisplayConnection, PIXMAP2); + + if (ROUNDING) + pWindow->setRounded(true); } void CWindowManager::setEffectiveSizePosUsingConfig(CWindow* pWindow) {