mirror of https://github.com/hyprwm/Hypr.git
seems like I fixed the docks
This commit is contained in:
parent
2effe5902e
commit
43ea3674d4
|
@ -205,8 +205,49 @@ CWindow* Events::remapFloatingWindow(int windowID, int forcemonitor) {
|
||||||
window.setDefaultPosition(Vector2D(GEOMETRY->x, GEOMETRY->y));
|
window.setDefaultPosition(Vector2D(GEOMETRY->x, GEOMETRY->y));
|
||||||
window.setDefaultSize(Vector2D(GEOMETRY->width, GEOMETRY->height));
|
window.setDefaultSize(Vector2D(GEOMETRY->width, GEOMETRY->height));
|
||||||
|
|
||||||
Debug::log(LOG, "New dock created, setting default XYWH to: " + std::to_string(GEOMETRY->x) + ", " + std::to_string(GEOMETRY->y)
|
window.setDockAlign(DOCK_TOP);
|
||||||
+ ", " + std::to_string(GEOMETRY->width) + ", " + std::to_string(GEOMETRY->height));
|
|
||||||
|
// Check reserved
|
||||||
|
const auto STRUTREPLY = xcb_get_property_reply(g_pWindowManager->DisplayConnection, xcb_get_property(g_pWindowManager->DisplayConnection, false, windowID, HYPRATOMS["_NET_WM_STRUT_PARTIAL"], XCB_GET_PROPERTY_TYPE_ANY, 0, (4294967295U)), NULL);
|
||||||
|
|
||||||
|
if (!STRUTREPLY || xcb_get_property_value_length(STRUTREPLY) == 0) {
|
||||||
|
Debug::log(ERR, "Couldn't get strut for dock.");
|
||||||
|
} else {
|
||||||
|
const uint32_t* STRUT = (uint32_t*)xcb_get_property_value(STRUTREPLY);
|
||||||
|
|
||||||
|
if (!STRUT) {
|
||||||
|
Debug::log(ERR, "Couldn't get strut for dock. (2)");
|
||||||
|
} else {
|
||||||
|
// Set the dock's align
|
||||||
|
// LEFT RIGHT TOP BOTTOM
|
||||||
|
// 0 1 2 3
|
||||||
|
if (STRUT[2] > 0 && STRUT[3] == 0) {
|
||||||
|
// top
|
||||||
|
window.setDockAlign(DOCK_TOP);
|
||||||
|
} else if (STRUT[2] == 0 && STRUT[3] > 0) {
|
||||||
|
// bottom
|
||||||
|
window.setDockAlign(DOCK_BOTTOM);
|
||||||
|
}
|
||||||
|
|
||||||
|
// little todo: support left/right docks
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(STRUTREPLY);
|
||||||
|
|
||||||
|
switch (window.getDockAlign()) {
|
||||||
|
case DOCK_TOP:
|
||||||
|
window.setDefaultPosition(Vector2D(g_pWindowManager->monitors[CURRENTSCREEN].vecPosition.x, g_pWindowManager->monitors[CURRENTSCREEN].vecPosition.y));
|
||||||
|
break;
|
||||||
|
case DOCK_BOTTOM:
|
||||||
|
window.setDefaultPosition(Vector2D(g_pWindowManager->monitors[CURRENTSCREEN].vecPosition.x, g_pWindowManager->monitors[CURRENTSCREEN].vecPosition.y + g_pWindowManager->monitors[CURRENTSCREEN].vecSize.y - window.getDefaultSize().y));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug::log(LOG, "New dock created, setting default XYWH to: " + std::to_string(window.getDefaultPosition().x) + ", " + std::to_string(window.getDefaultPosition().y)
|
||||||
|
+ ", " + std::to_string(window.getDefaultSize().x) + ", " + std::to_string(window.getDefaultSize().y));
|
||||||
|
|
||||||
window.setDock(true);
|
window.setDock(true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,13 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum EDockAlign {
|
||||||
|
DOCK_LEFT = 0,
|
||||||
|
DOCK_RIGHT,
|
||||||
|
DOCK_TOP,
|
||||||
|
DOCK_BOTTOM
|
||||||
|
};
|
||||||
|
|
||||||
std::string exec(const char* cmd);
|
std::string exec(const char* cmd);
|
||||||
void clearLogs();
|
void clearLogs();
|
||||||
void emptyEvent(xcb_drawable_t window = 0);
|
void emptyEvent(xcb_drawable_t window = 0);
|
||||||
|
|
|
@ -93,6 +93,7 @@ public:
|
||||||
|
|
||||||
// Docks
|
// Docks
|
||||||
EXPOSED_MEMBER(Dock, bool, b);
|
EXPOSED_MEMBER(Dock, bool, b);
|
||||||
|
EXPOSED_MEMBER(DockAlign, EDockAlign, e);
|
||||||
|
|
||||||
// Rounding
|
// Rounding
|
||||||
EXPOSED_MEMBER(Rounded, bool, b);
|
EXPOSED_MEMBER(Rounded, bool, b);
|
||||||
|
|
|
@ -337,7 +337,7 @@ void CWindowManager::refreshDirtyWindows() {
|
||||||
window.setDirty(false);
|
window.setDirty(false);
|
||||||
|
|
||||||
// Check if the window isn't a node or has the noInterventions prop
|
// Check if the window isn't a node or has the noInterventions prop
|
||||||
if (window.getChildNodeAID() != 0 || window.getNoInterventions())
|
if (window.getChildNodeAID() != 0 || window.getNoInterventions() || window.getDock())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
setEffectiveSizePosUsingConfig(&window);
|
setEffectiveSizePosUsingConfig(&window);
|
||||||
|
@ -941,7 +941,7 @@ void CWindowManager::calculateNewFloatingWindow(CWindow* pWindow) {
|
||||||
if (!pWindow)
|
if (!pWindow)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!pWindow->getNoInterventions()) {
|
if (!pWindow->getNoInterventions() && !pWindow->getDock()) {
|
||||||
pWindow->setPosition(pWindow->getEffectivePosition() + Vector2D(3,3));
|
pWindow->setPosition(pWindow->getEffectivePosition() + Vector2D(3,3));
|
||||||
pWindow->setSize(pWindow->getEffectiveSize() - Vector2D(6, 6));
|
pWindow->setSize(pWindow->getEffectiveSize() - Vector2D(6, 6));
|
||||||
|
|
||||||
|
@ -1877,5 +1877,14 @@ void CWindowManager::recalcAllDocks() {
|
||||||
MONITOR->vecReservedBottomRight = Vector2D(0, w.getSize().y);
|
MONITOR->vecReservedBottomRight = Vector2D(0, w.getSize().y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Move it
|
||||||
|
Values[0] = w.getDefaultPosition().x;
|
||||||
|
Values[1] = w.getDefaultPosition().y;
|
||||||
|
xcb_configure_window(DisplayConnection, w.getDrawable(), XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, Values);
|
||||||
|
|
||||||
|
Values[0] = w.getDefaultSize().x;
|
||||||
|
Values[1] = w.getDefaultSize().y;
|
||||||
|
xcb_configure_window(DisplayConnection, w.getDrawable(), XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, Values);
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue