Skip to content

Commit

Permalink
Added toggleScreen function, using hot key to loop through all screens.
Browse files Browse the repository at this point in the history
Comparing to switchToScreen, it is more handy since the user only need
to hit one hotkey.
  • Loading branch information
zexee committed Jun 2, 2020
1 parent dbd1082 commit b477efa
Show file tree
Hide file tree
Showing 11 changed files with 112 additions and 5 deletions.
23 changes: 20 additions & 3 deletions src/gui/src/Action.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
const char* Action::m_ActionTypeNames[] =
{
"keyDown", "keyUp", "keystroke",
"switchToScreen", "switchInDirection", "lockCursorToScreen",
"switchToScreen", "toggleScreen",
"switchInDirection", "lockCursorToScreen",
"mouseDown", "mouseUp", "mousebutton"
};

Expand All @@ -45,14 +46,21 @@ 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())
{
case keyDown:
case keyUp:
case keystroke:
{
text += "(";
text += keySequence().toString();

if (!keySequence().isMouseButton())
Expand All @@ -72,27 +80,36 @@ 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:
Q_ASSERT(0);
break;
}

text += ")";

return text;
}
Expand Down
4 changes: 3 additions & 1 deletion src/gui/src/Action.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 };

Expand Down
2 changes: 1 addition & 1 deletion src/gui/src/ActionDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
11 changes: 11 additions & 0 deletions src/gui/src/ActionDialogBase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
1 change: 1 addition & 0 deletions src/lib/base/EventTypes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
9 changes: 9 additions & 0 deletions src/lib/base/EventTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,7 @@ class ServerEvents : public EventTypes {
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),
Expand Down Expand Up @@ -470,6 +471,13 @@ class ServerEvents : public EventTypes {
*/
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
Expand Down Expand Up @@ -508,6 +516,7 @@ class ServerEvents : public EventTypes {
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;
Expand Down
4 changes: 4 additions & 0 deletions src/lib/server/Config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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>)");
Expand Down
26 changes: 26 additions & 0 deletions src/lib/server/InputFilter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
14 changes: 14 additions & 0 deletions src/lib/server/InputFilter.h
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,20 @@ class InputFilter {
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:
Expand Down
22 changes: 22 additions & 0 deletions src/lib/server/Server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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*)
{
Expand Down
1 change: 1 addition & 0 deletions src/lib/server/Server.h
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,7 @@ class Server : public INode {
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*);
Expand Down

0 comments on commit b477efa

Please sign in to comment.