Various fixes (#103)

* Update README.md

* Update README.md

* Added relative workspace switching

* Added a haiku to readme

* haiku in readme

* Limit workspace from 1 to 10 (relative switching)

* Fixed workspace animation direction

* move window to relative workspace

* faster split ratio change

* turns out relative workspace is already there lol

* Adjustable splitratio

* removed vscode stuff

* a

* Fixed y resize speed

* clean

* Added a separate config value for resize speed

* Update hypr.conf

* Update hypr.conf

* Apply requested changes by vaxry

* use new config name for RESIZEANIMATIONSPEED
This commit is contained in:
end-4 2023-01-25 20:00:56 +07:00 committed by GitHub
parent 03daf47f50
commit d1e83d16c2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 79 additions and 39 deletions

View file

@ -55,11 +55,12 @@ col.inactive_border=0x77222222
# animations # animations
Animations { Animations {
enabled=1 enabled=1 # For windows
speed=5 window_resize_speed=5 # This is for windows resizing
workspaces=1 # For workspace animations (fixed, enabling by default)
speed=5 # This is for workspaces
cheap=1 # highly recommended cheap=1 # highly recommended
borders=0 borders=0
workspaces=0 # not really recommended
} }
# example window rules, more in the wiki # example window rules, more in the wiki

View file

@ -171,6 +171,18 @@ void KeybindManager::movefocus(std::string arg) {
g_pWindowManager->moveActiveFocusTo(arg[0]); g_pWindowManager->moveActiveFocusTo(arg[0]);
} }
void KeybindManager::movetorelativeworkspace(std::string arg) {
try {
if (arg == "+")
g_pWindowManager->moveActiveWindowToRelativeWorkspace(1);
else if (arg == "-")
g_pWindowManager->moveActiveWindowToRelativeWorkspace(-1);
} catch (...) {
Debug::log(ERR, "Invalid arg in movetoworkspace, arg: " + arg);
}
}
void KeybindManager::movetoworkspace(std::string arg) { void KeybindManager::movetoworkspace(std::string arg) {
try { try {
if (arg == "scratchpad") if (arg == "scratchpad")
@ -260,7 +272,7 @@ void KeybindManager::toggleActiveWindowFloating(std::string arg) {
} }
void KeybindManager::changeSplitRatio(std::string args) { void KeybindManager::changeSplitRatio(std::string args) {
g_pWindowManager->changeSplitRatioCurrent(args[0]); g_pWindowManager->changeSplitRatioCurrent(args);
} }
void KeybindManager::togglePseudoActive(std::string args) { void KeybindManager::togglePseudoActive(std::string args) {

View file

@ -27,6 +27,7 @@ namespace KeybindManager {
void toggleActiveWindowFullscreen(std::string args); void toggleActiveWindowFullscreen(std::string args);
void toggleActiveWindowFloating(std::string args); void toggleActiveWindowFloating(std::string args);
void movetoworkspace(std::string args); void movetoworkspace(std::string args);
void movetorelativeworkspace(std::string args);
void changeSplitRatio(std::string args); void changeSplitRatio(std::string args);
void togglePseudoActive(std::string args); void togglePseudoActive(std::string args);
void toggleScratchpad(std::string args); void toggleScratchpad(std::string args);

View file

@ -51,10 +51,11 @@ void ConfigManager::init() {
// animations // animations
configValues["animations:speed"].floatValue = 1; configValues["animations:speed"].floatValue = 1;
configValues["animations:window_resize_speed"].floatValue = 1;
configValues["animations:enabled"].intValue = 0; configValues["animations:enabled"].intValue = 0;
configValues["animations:cheap"].intValue = 1; configValues["animations:cheap"].intValue = 1;
configValues["animations:borders"].intValue = 1; configValues["animations:borders"].intValue = 1;
configValues["animations:workspaces"].intValue = 0; configValues["animations:workspaces"].intValue = 1;
configValues["autogenerated"].intValue = 0; configValues["autogenerated"].intValue = 0;
@ -129,6 +130,7 @@ void handleBind(const std::string& command, const std::string& value) {
if (HANDLER == "movewindow") dispatcher = KeybindManager::movewindow; if (HANDLER == "movewindow") dispatcher = KeybindManager::movewindow;
if (HANDLER == "movefocus") dispatcher = KeybindManager::movefocus; if (HANDLER == "movefocus") dispatcher = KeybindManager::movefocus;
if (HANDLER == "movetoworkspace") dispatcher = KeybindManager::movetoworkspace; if (HANDLER == "movetoworkspace") dispatcher = KeybindManager::movetoworkspace;
if (HANDLER == "movetorelativeworkspace") dispatcher = KeybindManager::movetorelativeworkspace;
if (HANDLER == "workspace") dispatcher = KeybindManager::changeworkspace; if (HANDLER == "workspace") dispatcher = KeybindManager::changeworkspace;
if (HANDLER == "lastworkspace") dispatcher = KeybindManager::changetolastworkspace; if (HANDLER == "lastworkspace") dispatcher = KeybindManager::changetolastworkspace;
if (HANDLER == "togglefloating") dispatcher = KeybindManager::toggleActiveWindowFloating; if (HANDLER == "togglefloating") dispatcher = KeybindManager::toggleActiveWindowFloating;

View file

@ -8,6 +8,7 @@ void AnimationUtil::move() {
lastFrame = std::chrono::high_resolution_clock::now(); lastFrame = std::chrono::high_resolution_clock::now();
const double ANIMATIONSPEED = std::max(1.f / ((double)ConfigManager::getFloat("animations:speed") * DELTA) * 462.f, (double)1.f); const double ANIMATIONSPEED = std::max(1.f / ((double)ConfigManager::getFloat("animations:speed") * DELTA) * 462.f, (double)1.f);
const double RESIZEANIMATIONSPEED = std::max(1.f / ((double)ConfigManager::getFloat("animations:window_resize_speed") * DELTA) * 462.f, (double)1.f);
bool updateRequired = false; bool updateRequired = false;
// Now we are (or should be, lul) thread-safe. // Now we are (or should be, lul) thread-safe.
@ -77,7 +78,7 @@ void AnimationUtil::move() {
const auto REALSIZ = window.getRealSize(); const auto REALSIZ = window.getRealSize();
const auto EFFSIZ = window.getEffectiveSize(); const auto EFFSIZ = window.getEffectiveSize();
window.setRealSize(Vector2D(parabolic(REALSIZ.x, EFFSIZ.x, ANIMATIONSPEED), parabolic(REALSIZ.y, EFFSIZ.y, ANIMATIONSPEED))); window.setRealSize(Vector2D(parabolic(REALSIZ.x, EFFSIZ.x, RESIZEANIMATIONSPEED), parabolic(REALSIZ.y, EFFSIZ.y, RESIZEANIMATIONSPEED)));
} }
// set not animated if already done here // set not animated if already done here

View file

@ -1553,6 +1553,11 @@ void CWindowManager::warpCursorTo(Vector2D to) {
free(pointerreply); free(pointerreply);
} }
void CWindowManager::moveActiveWindowToRelativeWorkspace(int relativenum) {
if (activeWorkspaceID + relativenum < 1) return;
moveActiveWindowToWorkspace(activeWorkspaceID + relativenum);
}
void CWindowManager::moveActiveWindowToWorkspace(int workspace) { void CWindowManager::moveActiveWindowToWorkspace(int workspace) {
auto PWINDOW = getWindowFromDrawable(LastWindow); auto PWINDOW = getWindowFromDrawable(LastWindow);
@ -1756,7 +1761,6 @@ void CWindowManager::moveActiveFocusTo(char dir) {
} }
void CWindowManager::changeWorkspaceByID(int ID) { void CWindowManager::changeWorkspaceByID(int ID) {
auto MONITOR = getMonitorFromCursor(); auto MONITOR = getMonitorFromCursor();
if (!MONITOR) { if (!MONITOR) {
@ -1775,7 +1779,7 @@ void CWindowManager::changeWorkspaceByID(int ID) {
// mark old workspace dirty // mark old workspace dirty
setAllWorkspaceWindowsDirtyByID(activeWorkspaces[MONITOR->ID]); setAllWorkspaceWindowsDirtyByID(activeWorkspaces[MONITOR->ID]);
// save old workspace for anim // save old workspace for animation
auto OLDWORKSPACE = activeWorkspaces[MONITOR->ID]; auto OLDWORKSPACE = activeWorkspaces[MONITOR->ID];
lastActiveWorkspaceID = OLDWORKSPACE; lastActiveWorkspaceID = OLDWORKSPACE;
@ -1794,8 +1798,9 @@ void CWindowManager::changeWorkspaceByID(int ID) {
// if fullscreen, set to the fullscreen window // if fullscreen, set to the fullscreen window
focusOnWorkspace(ID); focusOnWorkspace(ID);
// Update bar info // Update bar info, activeWorkspaceID
updateBarInfo(); updateBarInfo();
activeWorkspaceID = ID;
Debug::log(LOG, "Bar info updated with workspace changed."); Debug::log(LOG, "Bar info updated with workspace changed.");
@ -1816,8 +1821,9 @@ void CWindowManager::changeWorkspaceByID(int ID) {
activeWorkspaces[MONITOR->ID] = workspaces[workspaces.size() - 1].getID(); activeWorkspaces[MONITOR->ID] = workspaces[workspaces.size() - 1].getID();
LastWindow = -1; LastWindow = -1;
// Update bar info // Update bar info, activeWorkspaceID
updateBarInfo(); updateBarInfo();
activeWorkspaceID = ID;
// Wipe animation // Wipe animation
startWipeAnimOnWorkspace(OLDWORKSPACE, ID); startWipeAnimOnWorkspace(OLDWORKSPACE, ID);
@ -2481,21 +2487,41 @@ void CWindowManager::recalcAllDocks() {
void CWindowManager::startWipeAnimOnWorkspace(const int& oldwork, const int& newwork) { void CWindowManager::startWipeAnimOnWorkspace(const int& oldwork, const int& newwork) {
const auto PMONITOR = getMonitorFromWorkspace(newwork); const auto PMONITOR = getMonitorFromWorkspace(newwork);
for (auto& work : workspaces) { if (newwork < oldwork) { // Wipe from left to right
if (work.getID() == oldwork) { for (auto& work : workspaces) {
if (ConfigManager::getInt("animations:workspaces") == 1) if (work.getID() == oldwork) {
work.setCurrentOffset(Vector2D(0,0)); if (ConfigManager::getInt("animations:workspaces") == 1)
else work.setCurrentOffset(Vector2D(0,0));
work.setCurrentOffset(Vector2D(150000, 150000)); else
work.setGoalOffset(Vector2D(PMONITOR->vecSize.x, 0)); work.setCurrentOffset(Vector2D(150000, 150000));
work.setAnimationInProgress(true); work.setGoalOffset(Vector2D(PMONITOR->vecSize.x, 0));
} else if (work.getID() == newwork) { work.setAnimationInProgress(true);
if (ConfigManager::getInt("animations:workspaces") == 1) } else if (work.getID() == newwork) {
work.setCurrentOffset(Vector2D(-PMONITOR->vecSize.x, 0)); if (ConfigManager::getInt("animations:workspaces") == 1)
else work.setCurrentOffset(Vector2D(-PMONITOR->vecSize.x, 0));
work.setCurrentOffset(Vector2D(0, 0)); else
work.setGoalOffset(Vector2D(0, 0)); work.setCurrentOffset(Vector2D(0, 0));
work.setAnimationInProgress(true); work.setGoalOffset(Vector2D(0, 0));
work.setAnimationInProgress(true);
}
}
} else { // Wipe from right to left (oldwork < newwork)
for (auto& work : workspaces) {
if (work.getID() == oldwork) {
if (ConfigManager::getInt("animations:workspaces") == 1)
work.setCurrentOffset(Vector2D(0,0));
else
work.setCurrentOffset(Vector2D(150000, 150000));
work.setGoalOffset(Vector2D(-PMONITOR->vecSize.x, 0));
work.setAnimationInProgress(true);
} else if (work.getID() == newwork) {
if (ConfigManager::getInt("animations:workspaces") == 1)
work.setCurrentOffset(Vector2D(PMONITOR->vecSize.x, 0));
else
work.setCurrentOffset(Vector2D(0, 0));
work.setGoalOffset(Vector2D(0, 0));
work.setAnimationInProgress(true);
}
} }
} }
} }
@ -2541,7 +2567,7 @@ SMonitor* CWindowManager::getMonitorFromCoord(const Vector2D coord) {
return nullptr; return nullptr;
} }
void CWindowManager::changeSplitRatioCurrent(const char& dir) { void CWindowManager::changeSplitRatioCurrent(std::string dir) {
const auto CURRENT = getWindowFromDrawable(LastWindow); const auto CURRENT = getWindowFromDrawable(LastWindow);
@ -2557,17 +2583,12 @@ void CWindowManager::changeSplitRatioCurrent(const char& dir) {
return; return;
} }
switch(dir) { if (dir == "+")
case '+': PARENT->setSplitRatio(PARENT->getSplitRatio() + 0.05f);
PARENT->setSplitRatio(PARENT->getSplitRatio() + 0.05f); else if (dir == "-")
break; PARENT->setSplitRatio(PARENT->getSplitRatio() - 0.05f);
case '-': else
PARENT->setSplitRatio(PARENT->getSplitRatio() - 0.05f); PARENT->setSplitRatio(PARENT->getSplitRatio() + std::stof(dir));
break;
default:
Debug::log(ERR, "changeSplitRatioCurrent called with an invalid dir!");
return;
}
PARENT->setSplitRatio(std::clamp(PARENT->getSplitRatio(), 0.1f, 1.9f)); PARENT->setSplitRatio(std::clamp(PARENT->getSplitRatio(), 0.1f, 1.9f));
@ -2650,7 +2671,7 @@ void CWindowManager::processCursorDeltaOnWindowResizeTiled(CWindow* pWindow, con
const auto TOPCONTAINER = PARENTSIDEBYSIDE ? PPARENT2 : PPARENT; const auto TOPCONTAINER = PARENTSIDEBYSIDE ? PPARENT2 : PPARENT;
allowedMovement.x *= 2.f / SIDECONTAINER->getSize().x; allowedMovement.x *= 2.f / SIDECONTAINER->getSize().x;
allowedMovement.y *= 2.f / TOPCONTAINER->getSize().x; allowedMovement.y *= 2.f / TOPCONTAINER->getSize().y;
SIDECONTAINER->setSplitRatio(std::clamp(SIDECONTAINER->getSplitRatio() + allowedMovement.x, (double)0.05f, (double)1.95f)); SIDECONTAINER->setSplitRatio(std::clamp(SIDECONTAINER->getSplitRatio() + allowedMovement.x, (double)0.05f, (double)1.95f));
TOPCONTAINER->setSplitRatio(std::clamp(TOPCONTAINER->getSplitRatio() + allowedMovement.y, (double)0.05f, (double)1.95f)); TOPCONTAINER->setSplitRatio(std::clamp(TOPCONTAINER->getSplitRatio() + allowedMovement.y, (double)0.05f, (double)1.95f));

View file

@ -53,6 +53,7 @@ public:
// holds the IDs of open workspaces, Monitor ID -> workspace ID // holds the IDs of open workspaces, Monitor ID -> workspace ID
std::deque<int> activeWorkspaces; std::deque<int> activeWorkspaces;
int lastActiveWorkspaceID = 1; int lastActiveWorkspaceID = 1;
int activeWorkspaceID = 1;
// Not really pipes, but files. Oh well. Used for IPC. // Not really pipes, but files. Oh well. Used for IPC.
SIPCPipe m_sIPCBarPipeIn = {ISDEBUG ? "/tmp/hypr/hyprbarind" : "/tmp/hypr/hyprbarin", 0}; SIPCPipe m_sIPCBarPipeIn = {ISDEBUG ? "/tmp/hypr/hyprbarind" : "/tmp/hypr/hyprbarin", 0};
@ -93,6 +94,7 @@ public:
void moveActiveWindowTo(char); void moveActiveWindowTo(char);
void moveActiveFocusTo(char); void moveActiveFocusTo(char);
void moveActiveWindowToWorkspace(int); void moveActiveWindowToWorkspace(int);
void moveActiveWindowToRelativeWorkspace(int);
void warpCursorTo(Vector2D); void warpCursorTo(Vector2D);
void toggleWindowFullscrenn(const int&); void toggleWindowFullscrenn(const int&);
void recalcAllDocks(); void recalcAllDocks();
@ -148,7 +150,7 @@ public:
bool shouldBeManaged(const int&); bool shouldBeManaged(const int&);
void changeSplitRatioCurrent(const char& dir); void changeSplitRatioCurrent(std::string dir);
void processCursorDeltaOnWindowResizeTiled(CWindow*, const Vector2D&); void processCursorDeltaOnWindowResizeTiled(CWindow*, const Vector2D&);