diff --git a/build/jam/packages/Haiku b/build/jam/packages/Haiku
index 8720f3573d..c0e06d153a 100644
--- a/build/jam/packages/Haiku
+++ b/build/jam/packages/Haiku
@@ -230,7 +230,7 @@ AddSymlinkToPackage add-ons Tracker
AddFilesToPackage add-ons input_server devices
: keyboard mouse tablet wacom ;
AddFilesToPackage add-ons input_server filters
- : screen_saver shortcut_catcher ;
+ : minimize_all screen_saver shortcut_catcher switch_workspace ;
AddFilesToPackage add-ons kernel network : notifications stack ;
AddFilesToPackage add-ons kernel network : dns_resolver ;
diff --git a/build/jam/packages/HaikuBootstrap b/build/jam/packages/HaikuBootstrap
index 9a3c9c30ee..7c9b1e0320 100644
--- a/build/jam/packages/HaikuBootstrap
+++ b/build/jam/packages/HaikuBootstrap
@@ -198,7 +198,7 @@ AddSymlinkToPackage add-ons Tracker
AddFilesToPackage add-ons input_server devices
: keyboard mouse tablet wacom ;
AddFilesToPackage add-ons input_server filters
- : screen_saver shortcut_catcher ;
+ : minimize_all screen_saver shortcut_catcher switch_workspace ;
AddFilesToPackage add-ons kernel network : notifications stack ;
AddFilesToPackage add-ons kernel network : dns_resolver ;
diff --git a/src/add-ons/input_server/filters/Jamfile b/src/add-ons/input_server/filters/Jamfile
index 6f5d3ef100..1ad77e3b28 100644
--- a/src/add-ons/input_server/filters/Jamfile
+++ b/src/add-ons/input_server/filters/Jamfile
@@ -1,4 +1,6 @@
SubDir HAIKU_TOP src add-ons input_server filters ;
+SubInclude HAIKU_TOP src add-ons input_server filters minimize_all ;
SubInclude HAIKU_TOP src add-ons input_server filters screen_saver ;
SubInclude HAIKU_TOP src add-ons input_server filters shortcut_catcher ;
+SubInclude HAIKU_TOP src add-ons input_server filters switch_workspace ;
diff --git a/src/add-ons/input_server/filters/minimize_all/Jamfile b/src/add-ons/input_server/filters/minimize_all/Jamfile
new file mode 100644
index 0000000000..94b5039cfe
--- /dev/null
+++ b/src/add-ons/input_server/filters/minimize_all/Jamfile
@@ -0,0 +1,10 @@
+SubDir HAIKU_TOP src add-ons input_server filters minimize_all ;
+
+SetSubDirSupportedPlatformsBeOSCompatible ;
+
+UsePrivateHeaders interface tracker ;
+
+Addon minimize_all
+ : MinimizeAllInputFilter.cpp
+ : be input_server $(TARGET_LIBSUPC++)
+ ;
diff --git a/src/add-ons/input_server/filters/minimize_all/MinimizeAllInputFilter.cpp b/src/add-ons/input_server/filters/minimize_all/MinimizeAllInputFilter.cpp
new file mode 100644
index 0000000000..73d9d52c09
--- /dev/null
+++ b/src/add-ons/input_server/filters/minimize_all/MinimizeAllInputFilter.cpp
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2014 Haiku, Inc. All rights reserved
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ * John Scipione, jscipione@gmail.com
+ */
+
+
+#include "MinimizeAllInputFilter.h"
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+
+#define _MINIMIZE_ALL_ '_WMA'
+
+
+extern "C" BInputServerFilter* instantiate_input_filter() {
+ return new MinimizeAllInputFilter();
+}
+
+
+MinimizeAllInputFilter::MinimizeAllInputFilter()
+{
+}
+
+
+filter_result
+MinimizeAllInputFilter::Filter(BMessage* message, BList* _list)
+{
+ switch (message->what) {
+ case B_KEY_DOWN:
+ {
+ const char* bytes;
+ if (message->FindString("bytes", &bytes) != B_OK)
+ break;
+
+ int32 modifiers;
+ if (message->FindInt32("modifiers", &modifiers) != B_OK)
+ break;
+
+ int32 modifiersHeld = modifiers & (B_COMMAND_KEY
+ | B_CONTROL_KEY | B_OPTION_KEY | B_MENU_KEY | B_SHIFT_KEY);
+
+ bool minimize;
+ if (modifiersHeld == (B_COMMAND_KEY | B_CONTROL_KEY))
+ minimize = true;
+ else if (modifiersHeld
+ == (B_COMMAND_KEY | B_CONTROL_KEY | B_SHIFT_KEY)) {
+ minimize = false;
+ } else
+ break;
+
+ int32 cookie = 0;
+ team_info teamInfo;
+ while (get_next_team_info(&cookie, &teamInfo) == B_OK) {
+ app_info appInfo;
+ be_roster->GetRunningAppInfo(teamInfo.team, &appInfo);
+ team_id team = appInfo.team;
+ be_roster->ActivateApp(team);
+
+ if (be_roster->GetActiveAppInfo(&appInfo) == B_OK
+ && (appInfo.flags & B_BACKGROUND_APP) == 0
+ && strcasecmp(appInfo.signature, kDeskbarSignature) != 0) {
+ BRect zoomRect;
+ if (minimize)
+ do_minimize_team(zoomRect, team, false);
+ else
+ do_bring_to_front_team(zoomRect, team, false);
+ }
+ }
+
+ return B_SKIP_MESSAGE;
+ }
+ }
+
+ return B_DISPATCH_MESSAGE;
+}
+
+
+status_t
+MinimizeAllInputFilter::InitCheck()
+{
+ return B_OK;
+}
diff --git a/src/add-ons/input_server/filters/minimize_all/MinimizeAllInputFilter.h b/src/add-ons/input_server/filters/minimize_all/MinimizeAllInputFilter.h
new file mode 100644
index 0000000000..9e10321e49
--- /dev/null
+++ b/src/add-ons/input_server/filters/minimize_all/MinimizeAllInputFilter.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2014 Haiku, Inc. All rights reserved
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _MINIMIZE_ALL_INPUT_FILTER_H
+#define _MINIMIZE_ALL_INPUT_FILTER_H
+
+
+#include
+
+
+extern "C" _EXPORT BInputServerFilter* instantiate_input_filter();
+
+
+class MinimizeAllInputFilter : public BInputServerFilter {
+public:
+ MinimizeAllInputFilter();
+
+ virtual filter_result Filter(BMessage* message, BList* _list);
+ virtual status_t InitCheck();
+};
+
+
+#endif // _MINIMIZE_ALL_INPUT_FILTER_H
diff --git a/src/add-ons/input_server/filters/switch_workspace/Jamfile b/src/add-ons/input_server/filters/switch_workspace/Jamfile
new file mode 100644
index 0000000000..851ecd6171
--- /dev/null
+++ b/src/add-ons/input_server/filters/switch_workspace/Jamfile
@@ -0,0 +1,10 @@
+SubDir HAIKU_TOP src add-ons input_server filters switch_workspace ;
+
+SetSubDirSupportedPlatformsBeOSCompatible ;
+
+UsePrivateHeaders app ;
+
+Addon switch_workspace
+ : SwitchWorkspaceInputFilter.cpp
+ : be input_server $(TARGET_LIBSUPC++)
+ ;
diff --git a/src/add-ons/input_server/filters/switch_workspace/SwitchWorkspaceInputFilter.cpp b/src/add-ons/input_server/filters/switch_workspace/SwitchWorkspaceInputFilter.cpp
new file mode 100644
index 0000000000..2190920e97
--- /dev/null
+++ b/src/add-ons/input_server/filters/switch_workspace/SwitchWorkspaceInputFilter.cpp
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2009-2014 Haiku, Inc. All rights reserved
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ * Axel Dörfler, axeld@pinc-software.de
+ * John Scipione, jscipione@gmail.com
+ */
+
+
+#include "SwitchWorkspaceInputFilter.h"
+
+#include
+
+#include
+#include
+#include
+#include
+
+
+#define _SWITCH_WORKSPACE_ '_SWS'
+
+
+extern "C" BInputServerFilter* instantiate_input_filter() {
+ return new SwitchWorkspaceInputFilter();
+}
+
+
+SwitchWorkspaceInputFilter::SwitchWorkspaceInputFilter()
+{
+}
+
+
+filter_result
+SwitchWorkspaceInputFilter::Filter(BMessage* message, BList* _list)
+{
+ switch (message->what) {
+ case B_KEY_DOWN:
+ {
+ const char* bytes;
+ if (message->FindString("bytes", &bytes) != B_OK)
+ break;
+
+ int32 modifiers;
+ if (message->FindInt32("modifiers", &modifiers) != B_OK)
+ break;
+
+ int32 modifiersHeld = modifiers & (B_COMMAND_KEY
+ | B_CONTROL_KEY | B_OPTION_KEY | B_MENU_KEY | B_SHIFT_KEY);
+
+ bool takeMeThere;
+ if (modifiersHeld == (B_COMMAND_KEY | B_CONTROL_KEY))
+ takeMeThere = false;
+ else if (modifiersHeld
+ == (B_COMMAND_KEY | B_CONTROL_KEY | B_SHIFT_KEY)) {
+ takeMeThere = true;
+ } else
+ break;
+
+ int32 deltaX = 0;
+ int32 deltaY = 0;
+
+ if (bytes[0] == B_LEFT_ARROW)
+ deltaX = -1;
+ else if (bytes[0] == B_UP_ARROW)
+ deltaY = -1;
+ else if (bytes[0] == B_RIGHT_ARROW)
+ deltaX = 1;
+ else if (bytes[0] == B_DOWN_ARROW)
+ deltaY = 1;
+ else
+ break;
+
+ BPrivate::AppServerLink link;
+ link.StartMessage(AS_GET_WORKSPACE_LAYOUT);
+
+ status_t status;
+ int32 columns;
+ int32 rows;
+ if (link.FlushWithReply(status) != B_OK || status != B_OK)
+ break;
+
+ link.Read(&columns);
+ link.Read(&rows);
+
+ int32 current = current_workspace();
+
+ int32 nextColumn = current % columns + deltaX;
+ if (nextColumn >= columns)
+ nextColumn = columns - 1;
+ else if (nextColumn < 0)
+ nextColumn = 0;
+
+ int32 nextRow = current / columns + deltaY;
+ if (nextRow >= rows)
+ nextRow = rows - 1;
+ else if (nextRow < 0)
+ nextRow = 0;
+
+ int32 next = nextColumn + nextRow * columns;
+ if (next != current) {
+ BPrivate::AppServerLink link;
+ link.StartMessage(AS_ACTIVATE_WORKSPACE);
+ link.Attach(next);
+ link.Attach(takeMeThere);
+ link.Flush();
+ }
+
+ return B_SKIP_MESSAGE;
+ }
+ }
+
+ return B_DISPATCH_MESSAGE;
+}
+
+
+status_t
+SwitchWorkspaceInputFilter::InitCheck()
+{
+ return B_OK;
+}
diff --git a/src/add-ons/input_server/filters/switch_workspace/SwitchWorkspaceInputFilter.h b/src/add-ons/input_server/filters/switch_workspace/SwitchWorkspaceInputFilter.h
new file mode 100644
index 0000000000..5b63214ee9
--- /dev/null
+++ b/src/add-ons/input_server/filters/switch_workspace/SwitchWorkspaceInputFilter.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2014 Haiku, Inc. All rights reserved
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _SWITCH_WORKSPACE_INPUT_FILTER_H
+#define _SWITCH_WORKSPACE_INPUT_FILTER_H
+
+
+#include
+
+
+extern "C" _EXPORT BInputServerFilter* instantiate_input_filter();
+
+
+class SwitchWorkspaceInputFilter : public BInputServerFilter {
+public:
+ SwitchWorkspaceInputFilter();
+
+ virtual filter_result Filter(BMessage* message, BList* _list);
+ virtual status_t InitCheck();
+};
+
+
+#endif // _SWITCH_WORKSPACE_INPUT_FILTER_H