creating new workspaces
This commit is contained in:
parent
4ace4c2398
commit
1339fb3148
5 changed files with 90 additions and 2 deletions
|
@ -6,7 +6,7 @@ set(CMAKE_AUTOUIC ON)
|
||||||
set(CMAKE_AUTOMOC ON)
|
set(CMAKE_AUTOMOC ON)
|
||||||
set(CMAKE_AUTORCC ON)
|
set(CMAKE_AUTORCC ON)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets LinguistTools)
|
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets LinguistTools)
|
||||||
|
@ -35,6 +35,7 @@ set(PROJECT_SOURCES
|
||||||
Keys/AbstractKeyListener.h
|
Keys/AbstractKeyListener.h
|
||||||
Keys/HelpKeyListener.h
|
Keys/HelpKeyListener.h
|
||||||
Keys/CloseHelpKeyListener.h
|
Keys/CloseHelpKeyListener.h
|
||||||
|
Keys/CreateWorkspaceKeyListener.h
|
||||||
)
|
)
|
||||||
|
|
||||||
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
|
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
|
||||||
|
|
71
Keys/CreateWorkspaceKeyListener.h
Normal file
71
Keys/CreateWorkspaceKeyListener.h
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
//
|
||||||
|
// Created by grimmauld on 07.03.24.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SWAYMUX_CREATEWORKSPACEKEYLISTENER_H
|
||||||
|
#define SWAYMUX_CREATEWORKSPACEKEYLISTENER_H
|
||||||
|
|
||||||
|
#include <QTreeView>
|
||||||
|
#include <iostream>
|
||||||
|
#include "AbstractKeyListener.h"
|
||||||
|
#include "../tree/SwayTreeModel.h"
|
||||||
|
|
||||||
|
class CreateWorkspaceKeyListener : public AbstractKeyListener {
|
||||||
|
public:
|
||||||
|
explicit CreateWorkspaceKeyListener(SwayTreeModel *swayTreeModel, QTreeView *treeView) : swayTreeModel(
|
||||||
|
swayTreeModel), treeView(treeView) {}
|
||||||
|
|
||||||
|
void handleKeyEvent(const QKeyEvent *keyEvent) const override {
|
||||||
|
auto *root = swayTreeModel->getRoot();
|
||||||
|
if (root == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Formatter cmd;
|
||||||
|
auto indexes = treeView->selectionModel()->selectedIndexes();
|
||||||
|
for (auto i: indexes) {
|
||||||
|
std::vector<int> indices;
|
||||||
|
for (auto j = i; j.isValid(); j = j.parent()) {
|
||||||
|
indices.insert(indices.cbegin(), j.row());
|
||||||
|
}
|
||||||
|
|
||||||
|
auto *head = root;
|
||||||
|
const SwayTreeNode *output;
|
||||||
|
for (auto j: indices) {
|
||||||
|
head = head->child(j);
|
||||||
|
if (head == nullptr)
|
||||||
|
goto hell;
|
||||||
|
}
|
||||||
|
|
||||||
|
output = head->findOutput();
|
||||||
|
if (output != nullptr) {
|
||||||
|
cmd << "focus output " << output->node.name << " , ";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
hell:;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto used_workspaces = root->accumulateWorkspaces();
|
||||||
|
int i = 1; // workspace 1 is the first one. We don't expect our users to be programmers.
|
||||||
|
for (; used_workspaces.contains(std::to_string(i)); ++i) {}
|
||||||
|
cmd << "workspace number " << i;
|
||||||
|
auto resp = SwayTreeModel::sway.sendIPC(swaymsg(0, cmd.str().c_str(), cmd.str().length()));
|
||||||
|
std::cout << resp.msg << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getDescription() override {
|
||||||
|
return "Create and switch to new empty workspace on selected output";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getKeyText() override {
|
||||||
|
return "C";
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] bool canAcceptKey(int key) const override {
|
||||||
|
return key == Qt::Key_C;
|
||||||
|
}
|
||||||
|
|
||||||
|
SwayTreeModel *swayTreeModel;
|
||||||
|
QTreeView *treeView;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //SWAYMUX_CREATEWORKSPACEKEYLISTENER_H
|
|
@ -3,6 +3,7 @@
|
||||||
#include "tree/SwayTreeModel.h"
|
#include "tree/SwayTreeModel.h"
|
||||||
#include "Keys/HelpKeyListener.h"
|
#include "Keys/HelpKeyListener.h"
|
||||||
#include "Keys/CloseHelpKeyListener.h"
|
#include "Keys/CloseHelpKeyListener.h"
|
||||||
|
#include "Keys/CreateWorkspaceKeyListener.h"
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
@ -28,6 +29,7 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
|
|
||||||
swayTreeKeyHandler = new KeyHandler();
|
swayTreeKeyHandler = new KeyHandler();
|
||||||
swayTreeKeyHandler->addListener(new HelpKeyListener(ui->help_page));
|
swayTreeKeyHandler->addListener(new HelpKeyListener(ui->help_page));
|
||||||
|
swayTreeKeyHandler->addListener(new CreateWorkspaceKeyListener(model, ui->treeView));
|
||||||
|
|
||||||
closeHelpKeyHandler = new KeyHandler(ui->tree_page);
|
closeHelpKeyHandler = new KeyHandler(ui->tree_page);
|
||||||
closeHelpKeyHandler->addListener(new CloseHelpKeyListener(ui->tree_page));
|
closeHelpKeyHandler->addListener(new CloseHelpKeyListener(ui->tree_page));
|
||||||
|
|
|
@ -76,7 +76,7 @@ public:
|
||||||
if (parent == nullptr)
|
if (parent == nullptr)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
return this->findParentRecursive(test);
|
return parent->findParentRecursive(test);
|
||||||
};
|
};
|
||||||
|
|
||||||
void removeChild(int i) {
|
void removeChild(int i) {
|
||||||
|
|
|
@ -169,6 +169,20 @@ public:
|
||||||
return this->findParentRecursive(matchNodeType(NodeType::workspace));
|
return this->findParentRecursive(matchNodeType(NodeType::workspace));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] std::set<std::string> accumulateWorkspaces() const {
|
||||||
|
std::set<std::string> workspaces;
|
||||||
|
if (node.type == NodeType::workspace) {
|
||||||
|
workspaces.insert(node.name);
|
||||||
|
return workspaces; // assumption: no workspaces within workspaces. This might be dangerous for the future, but is currently not a sway feature.
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < childCount(); ++i) {
|
||||||
|
auto child_workspaces = child(i)->accumulateWorkspaces();
|
||||||
|
workspaces.insert(child_workspaces.cbegin(), child_workspaces.cend());
|
||||||
|
}
|
||||||
|
return workspaces;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
[[nodiscard]] static std::function<bool(const SwayTreeNode *)> matchNodeType(const NodeType::NodeType type) {
|
[[nodiscard]] static std::function<bool(const SwayTreeNode *)> matchNodeType(const NodeType::NodeType type) {
|
||||||
return [type](const SwayTreeNode *testNode) {
|
return [type](const SwayTreeNode *testNode) {
|
||||||
|
|
Loading…
Reference in a new issue