Added toggleScreen function, using hot key to loop in all screens.

Comparing to switchToScreen, it is more handy since the user only need to hit one hotkey.
This commit is contained in:
zhexiwang 2020-05-29 13:35:00 +08:00
parent dbd10820c3
commit 018857c190
12 changed files with 160 additions and 58 deletions

3
.gitignore vendored
View File

@ -32,3 +32,6 @@ CMakeCache.txt
# Transient in-project-directory dependencies
/deps/
/out/build/x64-Debug
.clangd/
tags
compile_commands.json

View File

@ -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,8 @@ Action::Action() :
QString Action::text() const
{
QString text = QString(m_ActionTypeNames[keySequence().isMouseButton() ? type() + 6 : type() ]) + "(";
/* The server config parser don't support () with no argument inside, but support no () */
QString text = QString(m_ActionTypeNames[keySequence().isMouseButton() ? type() + 6 : type() ]);
switch (type())
{
@ -53,6 +55,7 @@ QString Action::text() const
case keyUp:
case keystroke:
{
text += "(";
text += keySequence().toString();
if (!keySequence().isMouseButton())
@ -72,19 +75,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 +105,6 @@ QString Action::text() const
break;
}
text += ")";
return text;
}

View File

@ -36,7 +36,7 @@ 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 };

View File

@ -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);

View File

@ -142,6 +142,17 @@
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout">
<item>
<widget class="QRadioButton" name="m_pRadioToggleScreen">
<property name="text">
<string>Toggle screen</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout">
<item>

View File

@ -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)

View File

@ -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. There 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;

View File

@ -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(<left|right|up|down>)");

View File

@ -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(), nullptr,
Event::kDeliverImmediately));
}
InputFilter::SwitchInDirectionAction::SwitchInDirectionAction(
IEventQueue* events, EDirection direction) :
m_direction(direction),

View File

@ -167,6 +167,21 @@ 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:

View File

@ -163,6 +163,10 @@ Server::Server(
m_inputFilter,
new TMethodEventJob<Server>(this,
&Server::handleSwitchToScreenEvent));
m_events->adoptHandler(m_events->forServer().toggleScreen(),
m_inputFilter,
new TMethodEventJob<Server>(this,
&Server::handleToggleScreenEvent));
m_events->adoptHandler(m_events->forServer().switchInDirection(),
m_inputFilter,
new TMethodEventJob<Server>(this,
@ -1407,6 +1411,22 @@ 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*)
{

View File

@ -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*);