From b477efa7069d55750aa1bb5fad5afa8b31d0f94e Mon Sep 17 00:00:00 2001 From: zhexiwang Date: Tue, 2 Jun 2020 21:49:06 +0800 Subject: [PATCH] Added toggleScreen function, using hot key to loop through all screens. Comparing to switchToScreen, it is more handy since the user only need to hit one hotkey. --- src/gui/src/Action.cpp | 23 ++++++++++++++++++++--- src/gui/src/Action.h | 4 +++- src/gui/src/ActionDialog.cpp | 2 +- src/gui/src/ActionDialogBase.ui | 11 +++++++++++ src/lib/base/EventTypes.cpp | 1 + src/lib/base/EventTypes.h | 9 +++++++++ src/lib/server/Config.cpp | 4 ++++ src/lib/server/InputFilter.cpp | 26 ++++++++++++++++++++++++++ src/lib/server/InputFilter.h | 14 ++++++++++++++ src/lib/server/Server.cpp | 22 ++++++++++++++++++++++ src/lib/server/Server.h | 1 + 11 files changed, 112 insertions(+), 5 deletions(-) diff --git a/src/gui/src/Action.cpp b/src/gui/src/Action.cpp index 2e0f3397..909e983b 100644 --- a/src/gui/src/Action.cpp +++ b/src/gui/src/Action.cpp @@ -24,7 +24,8 @@ const char* Action::m_ActionTypeNames[] = { "keyDown", "keyUp", "keystroke", - "switchToScreen", "switchInDirection", "lockCursorToScreen", + "switchToScreen", "toggleScreen", + "switchInDirection", "lockCursorToScreen", "mouseDown", "mouseUp", "mousebutton" }; @@ -45,7 +46,13 @@ Action::Action() : QString Action::text() const { - QString text = QString(m_ActionTypeNames[keySequence().isMouseButton() ? type() + 6 : type() ]) + "("; + /* This function is used to save to config file which is for barriers to + * read. However the server config parse does not support functions with () + * in the end but now argument inside. If you need a function with no + * argument, it can not have () in the end. + */ + QString text = QString(m_ActionTypeNames[keySequence().isMouseButton() ? + type() + int(mouseDown) : type()]); switch (type()) { @@ -53,6 +60,7 @@ QString Action::text() const case keyUp: case keystroke: { + text += "("; text += keySequence().toString(); if (!keySequence().isMouseButton()) @@ -72,19 +80,29 @@ QString Action::text() const else text += ",*"; } + text += ")"; } break; case switchToScreen: + text += "("; text += switchScreenName(); + text += ")"; + break; + + case toggleScreen: break; case switchInDirection: + text += "("; text += m_SwitchDirectionNames[m_SwitchDirection]; + text += ")"; break; case lockCursorToScreen: + text += "("; text += m_LockCursorModeNames[m_LockCursorMode]; + text += ")"; break; default: @@ -92,7 +110,6 @@ QString Action::text() const break; } - text += ")"; return text; } diff --git a/src/gui/src/Action.h b/src/gui/src/Action.h index 27868422..b738f3b9 100644 --- a/src/gui/src/Action.h +++ b/src/gui/src/Action.h @@ -36,7 +36,9 @@ class Action friend QTextStream& operator<<(QTextStream& outStream, const Action& action); public: - enum ActionType { keyDown, keyUp, keystroke, switchToScreen, switchInDirection, lockCursorToScreen, mouseDown, mouseUp, mousebutton }; + enum ActionType { keyDown, keyUp, keystroke, + switchToScreen, toggleScreen, switchInDirection, + lockCursorToScreen, mouseDown, mouseUp, mousebutton }; enum SwitchDirection { switchLeft, switchRight, switchUp, switchDown }; enum LockCursorMode { lockCursorToggle, lockCursonOn, lockCursorOff }; diff --git a/src/gui/src/ActionDialog.cpp b/src/gui/src/ActionDialog.cpp index 3565cfbc..27968852 100644 --- a/src/gui/src/ActionDialog.cpp +++ b/src/gui/src/ActionDialog.cpp @@ -39,7 +39,7 @@ ActionDialog::ActionDialog(QWidget* parent, ServerConfig& config, Hotkey& hotkey // work around Qt Designer's lack of a QButtonGroup; we need it to get // at the button id of the checked radio button - QRadioButton* const typeButtons[] = { m_pRadioPress, m_pRadioRelease, m_pRadioPressAndRelease, m_pRadioSwitchToScreen, m_pRadioSwitchInDirection, m_pRadioLockCursorToScreen }; + QRadioButton* const typeButtons[] = { m_pRadioPress, m_pRadioRelease, m_pRadioPressAndRelease, m_pRadioSwitchToScreen, m_pRadioToggleScreen, m_pRadioSwitchInDirection, m_pRadioLockCursorToScreen }; for (unsigned int i = 0; i < sizeof(typeButtons) / sizeof(typeButtons[0]); i++) m_pButtonGroupType->addButton(typeButtons[i], i); diff --git a/src/gui/src/ActionDialogBase.ui b/src/gui/src/ActionDialogBase.ui index f6dff784..9c6ad0a0 100644 --- a/src/gui/src/ActionDialogBase.ui +++ b/src/gui/src/ActionDialogBase.ui @@ -142,6 +142,17 @@ + + + + + + Toggle screen + + + + + diff --git a/src/lib/base/EventTypes.cpp b/src/lib/base/EventTypes.cpp index 9a3e46c6..2ba20778 100644 --- a/src/lib/base/EventTypes.cpp +++ b/src/lib/base/EventTypes.cpp @@ -133,6 +133,7 @@ REGISTER_EVENT(Server, error) REGISTER_EVENT(Server, connected) REGISTER_EVENT(Server, disconnected) REGISTER_EVENT(Server, switchToScreen) +REGISTER_EVENT(Server, toggleScreen) REGISTER_EVENT(Server, switchInDirection) REGISTER_EVENT(Server, keyboardBroadcast) REGISTER_EVENT(Server, lockCursorToScreen) diff --git a/src/lib/base/EventTypes.h b/src/lib/base/EventTypes.h index d044c86f..f81617e0 100644 --- a/src/lib/base/EventTypes.h +++ b/src/lib/base/EventTypes.h @@ -432,6 +432,7 @@ public: m_connected(Event::kUnknown), m_disconnected(Event::kUnknown), m_switchToScreen(Event::kUnknown), + m_toggleScreen(Event::kUnknown), m_switchInDirection(Event::kUnknown), m_keyboardBroadcast(Event::kUnknown), m_lockCursorToScreen(Event::kUnknown), @@ -470,6 +471,13 @@ public: */ Event::Type switchToScreen(); + //! Get toggle screen event type + /*! + Returns the toggle screen event type. The server responds to this + by toggling screens. These is no event data. + */ + Event::Type toggleScreen(); + //! Get switch in direction event type /*! Returns the switch in direction event type. The server responds to this @@ -508,6 +516,7 @@ private: Event::Type m_connected; Event::Type m_disconnected; Event::Type m_switchToScreen; + Event::Type m_toggleScreen; Event::Type m_switchInDirection; Event::Type m_keyboardBroadcast; Event::Type m_lockCursorToScreen; diff --git a/src/lib/server/Config.cpp b/src/lib/server/Config.cpp index 3cf60a5b..8156ed68 100644 --- a/src/lib/server/Config.cpp +++ b/src/lib/server/Config.cpp @@ -1182,6 +1182,10 @@ Config::parseAction(ConfigReadContext& s, action = new InputFilter::SwitchToScreenAction(m_events, screen); } + else if (name == "toggleScreen") { + action = new InputFilter::ToggleScreenAction(m_events); + } + else if (name == "switchInDirection") { if (args.size() != 1) { throw XConfigRead(s, "syntax for action: switchInDirection()"); diff --git a/src/lib/server/InputFilter.cpp b/src/lib/server/InputFilter.cpp index 9e73f45e..3df9d749 100644 --- a/src/lib/server/InputFilter.cpp +++ b/src/lib/server/InputFilter.cpp @@ -369,6 +369,32 @@ InputFilter::SwitchToScreenAction::perform(const Event& event) Event::kDeliverImmediately)); } +InputFilter::ToggleScreenAction::ToggleScreenAction(IEventQueue* events) : + m_events(events) +{ + // do nothing +} + +InputFilter::Action* +InputFilter::ToggleScreenAction::clone() const +{ + return new ToggleScreenAction(*this); +} + +String +InputFilter::ToggleScreenAction::format() const +{ + return barrier::string::sprintf("toggleScreen"); +} + +void +InputFilter::ToggleScreenAction::perform(const Event& event) +{ + m_events->addEvent(Event(m_events->forServer().toggleScreen(), + event.getTarget(), NULL, + Event::kDeliverImmediately)); +} + InputFilter::SwitchInDirectionAction::SwitchInDirectionAction( IEventQueue* events, EDirection direction) : m_direction(direction), diff --git a/src/lib/server/InputFilter.h b/src/lib/server/InputFilter.h index 73afe970..1d5987c0 100644 --- a/src/lib/server/InputFilter.h +++ b/src/lib/server/InputFilter.h @@ -167,6 +167,20 @@ public: IEventQueue* m_events; }; + // ToggleScreenAction + class ToggleScreenAction : public Action { + public: + ToggleScreenAction(IEventQueue* events); + + // Action overrides + virtual Action* clone() const; + virtual String format() const; + virtual void perform(const Event&); + + private: + IEventQueue* m_events; + }; + // SwitchInDirectionAction class SwitchInDirectionAction : public Action { public: diff --git a/src/lib/server/Server.cpp b/src/lib/server/Server.cpp index 12aedd0b..92194d95 100644 --- a/src/lib/server/Server.cpp +++ b/src/lib/server/Server.cpp @@ -163,6 +163,10 @@ Server::Server( m_inputFilter, new TMethodEventJob(this, &Server::handleSwitchToScreenEvent)); + m_events->adoptHandler(m_events->forServer().toggleScreen(), + m_inputFilter, + new TMethodEventJob(this, + &Server::handleToggleScreenEvent)); m_events->adoptHandler(m_events->forServer().switchInDirection(), m_inputFilter, new TMethodEventJob(this, @@ -1407,6 +1411,24 @@ Server::handleSwitchToScreenEvent(const Event& event, void*) } } +void +Server::handleToggleScreenEvent(const Event& event, void*) +{ + std::string current = getName(m_active); + ClientList::const_iterator index = m_clients.find(current); + if (index == m_clients.end()) { + LOG((CLOG_DEBUG1 "screen \"%s\" not active", current.c_str())); + } + else { + ++index; + if (index == m_clients.end()) { + index = m_clients.begin(); + } + jumpToScreen(index->second); + } +} + + void Server::handleSwitchInDirectionEvent(const Event& event, void*) { diff --git a/src/lib/server/Server.h b/src/lib/server/Server.h index 609af212..ed20a4d6 100644 --- a/src/lib/server/Server.h +++ b/src/lib/server/Server.h @@ -308,6 +308,7 @@ private: void handleClientDisconnected(const Event&, void*); void handleClientCloseTimeout(const Event&, void*); void handleSwitchToScreenEvent(const Event&, void*); + void handleToggleScreenEvent(const Event&, void*); void handleSwitchInDirectionEvent(const Event&, void*); void handleKeyboardBroadcastEvent(const Event&,void*); void handleLockCursorToScreenEvent(const Event&, void*);