mirror of
https://github.com/hyprwm/Hypr.git
synced 2024-12-25 02:39:49 +01:00
multiple small changes, bar better, fullscreen, updating
This commit is contained in:
parent
ca6a375e62
commit
c6cd584410
5 changed files with 66 additions and 32 deletions
|
@ -116,10 +116,7 @@ void KeybindManager::changeworkspace(std::string arg) {
|
|||
MONITOR = g_pWindowManager->getMonitorFromCursor();
|
||||
}
|
||||
|
||||
|
||||
g_pWindowManager->setAllWorkspaceWindowsDirtyByID(g_pWindowManager->activeWorkspaces[MONITOR->ID]);
|
||||
g_pWindowManager->changeWorkspaceByID(ID);
|
||||
g_pWindowManager->setAllWorkspaceWindowsDirtyByID(ID);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -132,31 +132,33 @@ void CStatusBar::draw() {
|
|||
if (WORKSPACE->getHasFullscreenWindow())
|
||||
return; // Do not draw a bar on a fullscreen window.
|
||||
|
||||
xcb_rectangle_t rectangles[] = {{m_vecPosition.x, m_vecPosition.y, m_vecSize.x + m_vecPosition.x, m_vecPosition.y + m_vecSize.y}};
|
||||
// TODO: CRIT! Status bar flashes, workspaces are wonky (wrong IDs?)
|
||||
|
||||
xcb_rectangle_t rectangles[] = {{(int)0, (int)0, (int)m_vecSize.x, (int)m_vecSize.y}};
|
||||
xcb_poly_fill_rectangle(g_pWindowManager->DisplayConnection, m_iPixmap, m_mContexts["BG"].GContext, 1, rectangles);
|
||||
|
||||
// Draw workspaces
|
||||
int drawnWorkspaces = 0;
|
||||
for (int i = 0; i <= g_pWindowManager->getHighestWorkspaceID(); ++i) {
|
||||
for (int i = 0; i < openWorkspaces.size(); ++i) {
|
||||
|
||||
const auto WORKSPACE = g_pWindowManager->getWorkspaceByID(i);
|
||||
const auto WORKSPACE = openWorkspaces[i];
|
||||
|
||||
// The LastWindow may be on a different one. This is where the mouse is.
|
||||
const auto MOUSEWORKSPACEID = g_pWindowManager->activeWorkspaces[g_pWindowManager->getMonitorFromCursor()->ID];
|
||||
const auto MOUSEWORKSPACEID = m_iCurrentWorkspace;
|
||||
|
||||
if (!WORKSPACE)
|
||||
continue;
|
||||
|
||||
std::string workspaceName = std::to_string(i);
|
||||
std::string workspaceName = std::to_string(openWorkspaces[i]);
|
||||
|
||||
if (WORKSPACE->getID() == MOUSEWORKSPACEID) {
|
||||
if (WORKSPACE == MOUSEWORKSPACEID) {
|
||||
xcb_rectangle_t rectangleActive[] = { { m_vecSize.y * drawnWorkspaces, 0, m_vecSize.y, m_vecSize.y } };
|
||||
xcb_poly_fill_rectangle(g_pWindowManager->DisplayConnection, m_iPixmap, m_mContexts["MEDBG"].GContext, 1, rectangleActive);
|
||||
}
|
||||
|
||||
xcb_image_text_8(g_pWindowManager->DisplayConnection, workspaceName.length(), m_iPixmap,
|
||||
WORKSPACE->getID() == MOUSEWORKSPACEID ? m_mContexts["HITEXT"].GContext : m_mContexts["BASETEXT"].GContext,
|
||||
m_vecSize.y * drawnWorkspaces + m_vecSize.y / 2.f - 2, m_vecSize.y - (m_vecSize.y - 10) / 2, workspaceName.c_str());
|
||||
WORKSPACE == MOUSEWORKSPACEID ? m_mContexts["HITEXT"].GContext : m_mContexts["BASETEXT"].GContext,
|
||||
m_vecSize.y * drawnWorkspaces + m_vecSize.y / 2.f - (WORKSPACE > 9 ? 4 : 2), m_vecSize.y - (m_vecSize.y - 10) / 2, workspaceName.c_str());
|
||||
|
||||
drawnWorkspaces++;
|
||||
}
|
||||
|
|
|
@ -19,6 +19,9 @@ public:
|
|||
void setup(int MonitorID);
|
||||
void destroy();
|
||||
|
||||
std::vector<int> openWorkspaces;
|
||||
EXPOSED_MEMBER(CurrentWorkspace, int, i);
|
||||
|
||||
private:
|
||||
Vector2D m_vecSize;
|
||||
Vector2D m_vecPosition;
|
||||
|
|
|
@ -147,6 +147,9 @@ void CWindowManager::setupManager() {
|
|||
}
|
||||
}
|
||||
|
||||
// Update bar info
|
||||
updateBarInfo();
|
||||
|
||||
// start its' update thread
|
||||
Events::setThread();
|
||||
|
||||
|
@ -267,6 +270,9 @@ void CWindowManager::cleanupUnusedWorkspaces() {
|
|||
workspaces.push_back(work);
|
||||
}
|
||||
}
|
||||
|
||||
// Update bar info
|
||||
updateBarInfo();
|
||||
}
|
||||
|
||||
void CWindowManager::refreshDirtyWindows() {
|
||||
|
@ -303,12 +309,14 @@ void CWindowManager::refreshDirtyWindows() {
|
|||
Values[0] = 0x555555; // GRAY :)
|
||||
xcb_change_window_attributes(DisplayConnection, window.getDrawable(), XCB_CW_BORDER_PIXEL, Values);
|
||||
|
||||
Values[0] = (int)Screen->width_in_pixels;
|
||||
Values[1] = (int)Screen->height_in_pixels;
|
||||
const auto MONITOR = getMonitorFromWindow(&window);
|
||||
|
||||
Values[0] = (int)MONITOR->vecSize.x;
|
||||
Values[1] = (int)MONITOR->vecSize.y;
|
||||
xcb_configure_window(DisplayConnection, window.getDrawable(), XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, Values);
|
||||
|
||||
Values[0] = (int)0;
|
||||
Values[1] = (int)0;
|
||||
Values[0] = (int)MONITOR->vecPosition.x;
|
||||
Values[1] = (int)MONITOR->vecPosition.y;
|
||||
xcb_configure_window(DisplayConnection, window.getDrawable(), XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, Values);
|
||||
|
||||
continue;
|
||||
|
@ -318,8 +326,10 @@ void CWindowManager::refreshDirtyWindows() {
|
|||
Values[1] = (int)window.getEffectiveSize().y;
|
||||
xcb_configure_window(DisplayConnection, window.getDrawable(), XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, Values);
|
||||
|
||||
Values[0] = (int)window.getEffectivePosition().x;
|
||||
Values[1] = (int)window.getEffectivePosition().y;
|
||||
// Update the position because the border makes the window jump
|
||||
// I have added the bordersize vec2d before in the setEffectiveSizePosUsingConfig function.
|
||||
Values[0] = (int)window.getEffectivePosition().x - ConfigManager::getInt("border_size");
|
||||
Values[1] = (int)window.getEffectivePosition().y - ConfigManager::getInt("border_size");
|
||||
xcb_configure_window(DisplayConnection, window.getDrawable(), XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, Values);
|
||||
|
||||
// Focused special border.
|
||||
|
@ -327,19 +337,11 @@ void CWindowManager::refreshDirtyWindows() {
|
|||
Values[0] = (int)ConfigManager::getInt("border_size");
|
||||
xcb_configure_window(DisplayConnection, window.getDrawable(), XCB_CONFIG_WINDOW_BORDER_WIDTH, Values);
|
||||
|
||||
// Update the position because the border makes the window jump
|
||||
// I have added the bordersize vec2d before in the setEffectiveSizePosUsingConfig function.
|
||||
Values[0] = (int)window.getEffectivePosition().x - ConfigManager::getInt("border_size");
|
||||
Values[1] = (int)window.getEffectivePosition().y - ConfigManager::getInt("border_size");
|
||||
xcb_configure_window(DisplayConnection, window.getDrawable(), XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, Values);
|
||||
|
||||
Values[0] = 0xFF3333; // RED :)
|
||||
xcb_change_window_attributes(DisplayConnection, window.getDrawable(), XCB_CW_BORDER_PIXEL, Values);
|
||||
} else {
|
||||
Values[0] = 0;
|
||||
xcb_configure_window(DisplayConnection, window.getDrawable(), XCB_CONFIG_WINDOW_BORDER_WIDTH, Values);
|
||||
|
||||
Values[0] = 0x555555; // GRAY :)
|
||||
Values[0] = 0x222222; // GRAY :)
|
||||
xcb_change_window_attributes(DisplayConnection, window.getDrawable(), XCB_CW_BORDER_PIXEL, Values);
|
||||
}
|
||||
|
||||
|
@ -355,8 +357,11 @@ void CWindowManager::setFocusedWindow(xcb_drawable_t window) {
|
|||
xcb_set_input_focus(DisplayConnection, XCB_INPUT_FOCUS_POINTER_ROOT, window, XCB_CURRENT_TIME);
|
||||
|
||||
// Fix border from the old window that was in focus.
|
||||
if (const auto PLASTWINDOW = getWindowFromDrawable(LastWindow); PLASTWINDOW)
|
||||
PLASTWINDOW->setDirty(true);
|
||||
Values[0] = 0x555555; // GRAY :)
|
||||
xcb_change_window_attributes(DisplayConnection, LastWindow, XCB_CW_BORDER_PIXEL, Values);
|
||||
|
||||
Values[0] = 0xFF3333; // RED :)
|
||||
xcb_change_window_attributes(DisplayConnection, window, XCB_CW_BORDER_PIXEL, Values);
|
||||
|
||||
LastWindow = window;
|
||||
}
|
||||
|
@ -412,10 +417,12 @@ void CWindowManager::setEffectiveSizePosUsingConfig(CWindow* pWindow) {
|
|||
pWindow->setEffectivePosition(pWindow->getPosition() + Vector2D(ConfigManager::getInt("border_size"), ConfigManager::getInt("border_size")));
|
||||
pWindow->setEffectiveSize(pWindow->getSize() - (Vector2D(ConfigManager::getInt("border_size"), ConfigManager::getInt("border_size")) * 2));
|
||||
|
||||
//TODO: make windows with no bar taller, this aint working chief
|
||||
|
||||
// do gaps, set top left
|
||||
pWindow->setEffectivePosition(pWindow->getEffectivePosition() + Vector2D(DISPLAYLEFT ? ConfigManager::getInt("gaps_out") : ConfigManager::getInt("gaps_in"), DISPLAYTOP ? ConfigManager::getInt("gaps_out") + ConfigManager::getInt("bar_height") : ConfigManager::getInt("gaps_in")));
|
||||
pWindow->setEffectivePosition(pWindow->getEffectivePosition() + Vector2D(DISPLAYLEFT ? ConfigManager::getInt("gaps_out") : ConfigManager::getInt("gaps_in"), DISPLAYTOP ? ConfigManager::getInt("gaps_out") + (MONITOR->ID != statusBar.getMonitorID() ? ConfigManager::getInt("bar_height") : 0) : ConfigManager::getInt("gaps_in")));
|
||||
// fix to old size bottom right
|
||||
pWindow->setEffectiveSize(pWindow->getEffectiveSize() - Vector2D(DISPLAYLEFT ? ConfigManager::getInt("gaps_out") : ConfigManager::getInt("gaps_in"), DISPLAYTOP ? ConfigManager::getInt("gaps_out") + ConfigManager::getInt("bar_height") : ConfigManager::getInt("gaps_in")));
|
||||
pWindow->setEffectiveSize(pWindow->getEffectiveSize() - Vector2D(DISPLAYLEFT ? ConfigManager::getInt("gaps_out") : ConfigManager::getInt("gaps_in"), DISPLAYTOP ? ConfigManager::getInt("gaps_out") + (MONITOR->ID != statusBar.getMonitorID() ? ConfigManager::getInt("bar_height") : 0) : ConfigManager::getInt("gaps_in")));
|
||||
// set bottom right
|
||||
pWindow->setEffectiveSize(pWindow->getEffectiveSize() - Vector2D(DISPLAYRIGHT ? ConfigManager::getInt("gaps_out") : ConfigManager::getInt("gaps_in"), DISPLAYBOTTOM ? ConfigManager::getInt("gaps_out") : ConfigManager::getInt("gaps_in")));
|
||||
}
|
||||
|
@ -700,8 +707,10 @@ void CWindowManager::moveActiveWindowTo(char dir) {
|
|||
|
||||
void CWindowManager::changeWorkspaceByID(int ID) {
|
||||
|
||||
const auto MONITOR = g_pWindowManager->getWindowFromDrawable(g_pWindowManager->LastWindow)
|
||||
? g_pWindowManager->getMonitorFromWindow(g_pWindowManager->getWindowFromDrawable(g_pWindowManager->LastWindow)) : getMonitorFromCursor();
|
||||
const auto MONITOR = getMonitorFromCursor();
|
||||
|
||||
// mark old workspace dirty
|
||||
setAllWorkspaceWindowsDirtyByID(activeWorkspaces[MONITOR->ID]);
|
||||
|
||||
for (auto& workspace : workspaces) {
|
||||
if (workspace.getID() == ID) {
|
||||
|
@ -711,6 +720,12 @@ void CWindowManager::changeWorkspaceByID(int ID) {
|
|||
// Perform a sanity check for the new workspace
|
||||
performSanityCheckForWorkspace(ID);
|
||||
|
||||
// Update bar info
|
||||
updateBarInfo();
|
||||
|
||||
// mark new as dirty
|
||||
setAllWorkspaceWindowsDirtyByID(activeWorkspaces[MONITOR->ID]);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -725,6 +740,11 @@ void CWindowManager::changeWorkspaceByID(int ID) {
|
|||
|
||||
// Perform a sanity check for the new workspace
|
||||
performSanityCheckForWorkspace(ID);
|
||||
|
||||
// Update bar info
|
||||
updateBarInfo();
|
||||
|
||||
// no need for the new dirty, it's empty
|
||||
}
|
||||
|
||||
void CWindowManager::setAllWindowsDirty() {
|
||||
|
@ -806,3 +826,14 @@ bool CWindowManager::isWorkspaceVisible(int workspaceID) {
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
void CWindowManager::updateBarInfo() {
|
||||
statusBar.openWorkspaces.clear();
|
||||
for (auto& workspace : workspaces) {
|
||||
statusBar.openWorkspaces.push_back(workspace.getID());
|
||||
}
|
||||
|
||||
std::sort(statusBar.openWorkspaces.begin(), statusBar.openWorkspaces.end());
|
||||
|
||||
statusBar.setCurrentWorkspace(activeWorkspaces[getMonitorFromCursor()->ID]);
|
||||
}
|
|
@ -81,6 +81,7 @@ public:
|
|||
void setEffectiveSizePosUsingConfig(CWindow* pWindow);
|
||||
void cleanupUnusedWorkspaces();
|
||||
xcb_visualtype_t* setupColors();
|
||||
void updateBarInfo();
|
||||
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue