Printdesks command (#42)

* feat: start of printdesks command

* feat: update README, finish printdesks print

* fix: support for new pointer wrapper for monitors

* feat: easier printdesks implementation

* feat: rename printdesks to printstate, only use active layout
This commit is contained in:
WhySoBad 2024-05-10 12:53:41 +02:00 committed by GitHub
parent b57c6c002f
commit 6bbcc08fe0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 68 additions and 2 deletions

1
.gitignore vendored
View File

@ -3,3 +3,4 @@ compile_flags.txt
compile_commands.json
.cache
result/
.idea

View File

@ -116,6 +116,7 @@ Since version 2.2, this plugin exposes a couple of `hyprctl` commands. That is,
| Command | description | args | example|
|------------|-------------|------|--------|
| printdesk (vdesk)| Prints to Hyprland log the specified vdesk or the currently active vdesk* (if no argument is given) | optional vdesk, see [above](#hyprctl-dispatchers) | `hyprctl printdesk` or `hyprctl printdesk 2` or `hyprctl printdesk coding`|
| printstate | Prints state of all vdesks | `none` | `hyprctl printstate` |
| printlayout | print to Hyprland logs the current layout | `none` | `hyprctl printlayout` |

View File

@ -14,6 +14,7 @@
#include <hyprland/src/helpers/memory/SharedPtr.hpp>
typedef std::unordered_map<int, int> WorkspaceMap;
// map with CMonitor* -> hyprland workspace id
typedef std::unordered_map<const CMonitor*, int> Layout;
typedef std::string MonitorName;

View File

@ -37,6 +37,7 @@ const std::string BACKCYCLE_DISPATCH_STR = "backcyclevdesks";
const std::string RESET_VDESK_DISPATCH_STR = "vdeskreset";
const std::string PRINTDESK_DISPATCH_STR = "printdesk";
const std::string PRINTSTATE_DISPATCH_STR = "printstate";
const std::string PRINTLAYOUT_DISPATCH_STR = "printlayout";
const std::string REMEMBER_NONE = "none";

View File

@ -292,4 +292,4 @@ CMonitor* VirtualDeskManager::getCurrentMonitor() {
return nullptr;
}
return currentMonitor;
}
}

View File

@ -174,6 +174,60 @@ std::string printVDeskDispatch(eHyprCtlOutputFormat format, std::string arg) {
return "";
}
std::string printStateDispatch(eHyprCtlOutputFormat format, std::string arg) {
std::string out;
if (format == eHyprCtlOutputFormat::FORMAT_NORMAL) {
out += "Virtual desks\n";
int index = 0;
for(auto const& [vdeskId, desk] : manager->vdesksMap) {
unsigned int windows = 0;
std::string workspaces;
bool first = true;
for(auto const& [monitor, workspaceId] : desk->activeLayout(manager->conf)) {
windows += g_pCompositor->getWindowsOnWorkspace(workspaceId);
if(!first) workspaces += ", ";
else first = false;
workspaces += std::format("{}", workspaceId);
}
out += std::format(
"- {}: {}\n Focused: {}\n Populated: {}\n Workspaces: {}\n Windows: {}\n",
desk->name,
desk->id,
manager->activeVdesk().get() == desk.get(),
windows > 0,
workspaces,
windows
);
if(index++ < manager->vdesksMap.size() - 1) out += "\n";
}
} else if(format == eHyprCtlOutputFormat::FORMAT_JSON) {
std::string vdesks;
int index = 0;
for(auto const& [vdeskId, desk] : manager->vdesksMap) {
unsigned int windows = 0;
std::string workspaces;
bool first = true;
for(auto const& [monitor, workspaceId] : desk->activeLayout(manager->conf)) {
windows += g_pCompositor->getWindowsOnWorkspace(workspaceId);
if(!first) workspaces += ", ";
else first = false;
workspaces += std::format("{}", workspaceId);
}
vdesks += std::format(R"#({{
"id": {},
"name": "{}",
"focused": {},
"populated": {},
"workspaces": [{}],
"windows": {}
}})#", vdeskId, desk->name, manager->activeVdesk().get() == desk.get(), windows > 0, workspaces, windows);
if(index++ < manager->vdesksMap.size() - 1) vdesks += ",";
}
out += std::format(R"#([{}])#", vdesks);
}
return out;
}
std::string printLayoutDispatch(eHyprCtlOutputFormat format, std::string arg) {
auto activeDesk = manager->activeVdesk();
auto layout = activeDesk->activeLayout(manager->conf);
@ -290,13 +344,21 @@ void registerHyprctlCommands() {
if (!ptr)
printLog(std::format("Failed to register hyprctl command: {}", PRINTLAYOUT_DISPATCH_STR));
// Register printstate
cmd.name = PRINTSTATE_DISPATCH_STR;
cmd.fn = printStateDispatch;
cmd.exact = true;
ptr = HyprlandAPI::registerHyprCtlCommand(PHANDLE, cmd);
if (!ptr)
printLog(std::format("Failed to register hyprctl command: {}", PRINTSTATE_DISPATCH_STR));
// Register printdesk
cmd.name = PRINTDESK_DISPATCH_STR;
cmd.fn = printVDeskDispatch;
cmd.exact = false;
ptr = HyprlandAPI::registerHyprCtlCommand(PHANDLE, cmd);
if (!ptr)
printLog(std::format("Failed to register hyprctl command: {}", VDESK_DISPATCH_STR));
printLog(std::format("Failed to register hyprctl command: {}", PRINTDESK_DISPATCH_STR));
}
// Do NOT change this function.