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 e3056be4..a47a3917 100644
--- a/src/lib/server/Config.cpp
+++ b/src/lib/server/Config.cpp
@@ -1156,6 +1156,10 @@ void Config::parseAction(ConfigReadContext& s, const std::string& name,
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 872d15ee..38d9a847 100644
--- a/src/lib/server/InputFilter.cpp
+++ b/src/lib/server/InputFilter.cpp
@@ -363,6 +363,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 1f016f44..0cb99da0 100644
--- a/src/lib/server/InputFilter.h
+++ b/src/lib/server/InputFilter.h
@@ -166,6 +166,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 234dda6c..334049cf 100644
--- a/src/lib/server/Server.cpp
+++ b/src/lib/server/Server.cpp
@@ -162,6 +162,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,
@@ -1405,6 +1409,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 1f5f1ef2..bfd0a7d0 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*);