[haiku-commits] haiku: hrev48729 - in src: kits/interface add-ons/input_server/filters/switch_workspace add-ons/input_server/filters/minimize_all

  • From: jscipione@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 27 Jan 2015 00:33:18 +0100 (CET)

hrev48729 adds 3 changesets to branch 'master'
old head: fbc43a72791c50ba02c0c500551bf87afdd833b3
new head: a0c83527188c9e107f0cf4f8d898ca34f79168e3
overview: 
http://cgit.haiku-os.org/haiku/log/?qt=range&q=a0c83527188c+%5Efbc43a72791c

----------------------------------------------------------------------------

75e162f7d979: BWindow: style fixes
  
  Update copyright header

ccc66661560a: BWindow: remove workspace switching shortcuts
  
  These are going to be activated by an input server filter instead.

a0c83527188c: Add input server filters
  
  ... for switching workspaces (removed from BWindow) and
  minimize all (aka Show Desktop).
  
  This moves the workspace switch behavior out of the BWindow class
  and places it into it's own input server filter that does the same
  thing. The difference is that you may now uninstall the workspace
  switching filter to disable the behavior. These shortcuts were not
  included in the BeOS R5 version of BWindow so represent additional
  behavior added to Haiku.
  
  minimize_all (aka Show Desktop) is a new input server filter that
  allows you to minimize all windows by pressing cmd+ctrl+D. If
  you do not like this behavior you may uninstall the minimize_all
  input server filter.

                                     [ John Scipione <jscipione@xxxxxxxxx> ]

----------------------------------------------------------------------------

10 files changed, 309 insertions(+), 101 deletions(-)
build/jam/packages/Haiku                         |   2 +-
build/jam/packages/HaikuBootstrap                |   2 +-
src/add-ons/input_server/filters/Jamfile         |   2 +
.../input_server/filters/minimize_all/Jamfile    |  10 ++
.../minimize_all/MinimizeAllInputFilter.cpp      |  93 ++++++++++++++
.../minimize_all/MinimizeAllInputFilter.h        |  24 ++++
.../filters/switch_workspace/Jamfile             |  10 ++
.../SwitchWorkspaceInputFilter.cpp               | 121 ++++++++++++++++++
.../SwitchWorkspaceInputFilter.h                 |  24 ++++
src/kits/interface/Window.cpp                    | 122 ++++---------------

############################################################################

Commit:      75e162f7d979f99d659ae2d1dfcce1048d475eb1
URL:         http://cgit.haiku-os.org/haiku/commit/?id=75e162f7d979
Author:      John Scipione <jscipione@xxxxxxxxx>
Date:        Thu Jun 12 04:55:05 2014 UTC

BWindow: style fixes

Update copyright header

----------------------------------------------------------------------------

diff --git a/src/kits/interface/Window.cpp b/src/kits/interface/Window.cpp
index 534fc3a..ed9396d 100644
--- a/src/kits/interface/Window.cpp
+++ b/src/kits/interface/Window.cpp
@@ -1,11 +1,12 @@
 /*
- * Copyright 2001-2011, Haiku.
+ * Copyright 2001-2014 Haiku, Inc. All rights reserved
  * Distributed under the terms of the MIT License.
  *
  * Authors:
- *             Adrian Oanca <adioanca@xxxxxxxxxxxxx>
+ *             Stephan Aßmus, superstippi@xxxxxx
  *             Axel Dörfler, axeld@xxxxxxxxxxxxxxxx
- *             Stephan Aßmus, <superstippi@xxxxxx>
+ *             Adrian Oanca, adioanca@xxxxxxxxxxxxx
+ *             John Scipione, jscipione@xxxxxxxxx
  */
 
 
@@ -86,6 +87,7 @@ struct BWindow::unpack_cookie {
        bool            tokens_scanned;
 };
 
+
 class BWindow::Shortcut {
 public:
                                                        Shortcut(uint32 key, 
uint32 modifiers,
@@ -233,7 +235,7 @@ BWindow::unpack_cookie::unpack_cookie()
 }
 
 
-//     #pragma mark -
+//     #pragma mark - BWindow::Shortcut
 
 
 BWindow::Shortcut::Shortcut(uint32 key, uint32 modifiers, BMenuItem* item)
@@ -298,7 +300,7 @@ BWindow::Shortcut::PrepareKey(uint32 key)
 }
 
 
-//     #pragma mark -
+//     #pragma mark - BWindow
 
 
 BWindow::BWindow(BRect frame, const char* title, window_type type,
@@ -725,7 +727,8 @@ BWindow::MessageReceived(BMessage* message)
                        _KeyboardNavigation();
 
                if (message->what == (int32)kMsgAppServerRestarted) {
-                       
fLink->SetSenderPort(BApplication::Private::ServerLink()->SenderPort());
+                       fLink->SetSenderPort(
+                               
BApplication::Private::ServerLink()->SenderPort());
 
                        BPrivate::AppServerLink lockLink;
                                // we're talking to the server application 
using our own
@@ -1042,14 +1045,17 @@ BWindow::DispatchMessage(BMessage* message, BHandler* 
target)
                                && message->FindInt32("height", &height) == 
B_OK) {
                                // combine with pending resize notifications
                                BMessage* pendingMessage;
-                               while ((pendingMessage = 
MessageQueue()->FindMessage(B_WINDOW_RESIZED, 0))) {
+                               while ((pendingMessage
+                                               = 
MessageQueue()->FindMessage(B_WINDOW_RESIZED, 0))) {
                                        int32 nextWidth;
                                        if (pendingMessage->FindInt32("width", 
&nextWidth) == B_OK)
                                                width = nextWidth;
 
                                        int32 nextHeight;
-                                       if (pendingMessage->FindInt32("height", 
&nextHeight) == B_OK)
+                                       if (pendingMessage->FindInt32("height", 
&nextHeight)
+                                                       == B_OK) {
                                                height = nextHeight;
+                                       }
 
                                        
MessageQueue()->RemoveMessage(pendingMessage);
                                        delete pendingMessage;
@@ -2793,17 +2799,20 @@ BWindow::_InitData(BRect frame, const char* title, 
window_look look,
        fNoQuitShortcut = IsModal();
 
        if ((fFlags & B_NOT_CLOSABLE) == 0 && !IsModal()) {
-               // Modal windows default to non-closable, but you can add the 
shortcut manually,
-               // if a different behaviour is wanted
+               // Modal windows default to non-closable, but you can add the
+               // shortcut manually, if a different behaviour is wanted
                AddShortcut('W', B_COMMAND_KEY, new BMessage(B_QUIT_REQUESTED));
        }
 
+       // Edit modifier keys
+
        AddShortcut('X', B_COMMAND_KEY, new BMessage(B_CUT), NULL);
        AddShortcut('C', B_COMMAND_KEY, new BMessage(B_COPY), NULL);
        AddShortcut('V', B_COMMAND_KEY, new BMessage(B_PASTE), NULL);
        AddShortcut('A', B_COMMAND_KEY, new BMessage(B_SELECT_ALL), NULL);
 
        // Window modifier keys
+
        AddShortcut('M', B_COMMAND_KEY | B_CONTROL_KEY,
                new BMessage(_MINIMIZE_), NULL);
        AddShortcut('Z', B_COMMAND_KEY | B_CONTROL_KEY,
@@ -2817,6 +2826,7 @@ BWindow::_InitData(BRect frame, const char* title, 
window_look look,
 
        // Workspace modifier keys
        BMessage* message;
+
        message = new BMessage(_SWITCH_WORKSPACE_);
        message->AddInt32("delta_x", -1);
        AddShortcut(B_LEFT_ARROW, B_COMMAND_KEY | B_CONTROL_KEY, message, NULL);
@@ -2836,22 +2846,26 @@ BWindow::_InitData(BRect frame, const char* title, 
window_look look,
        message = new BMessage(_SWITCH_WORKSPACE_);
        message->AddBool("take_me_there", true);
        message->AddInt32("delta_x", -1);
-       AddShortcut(B_LEFT_ARROW, B_COMMAND_KEY | B_CONTROL_KEY | B_SHIFT_KEY, 
message, NULL);
+       AddShortcut(B_LEFT_ARROW, B_COMMAND_KEY | B_CONTROL_KEY | B_SHIFT_KEY,
+               message, NULL);
 
        message = new BMessage(_SWITCH_WORKSPACE_);
        message->AddBool("take_me_there", true);
        message->AddInt32("delta_x", 1);
-       AddShortcut(B_RIGHT_ARROW, B_COMMAND_KEY | B_CONTROL_KEY | B_SHIFT_KEY, 
message, NULL);
+       AddShortcut(B_RIGHT_ARROW, B_COMMAND_KEY | B_CONTROL_KEY | B_SHIFT_KEY,
+               message, NULL);
 
        message = new BMessage(_SWITCH_WORKSPACE_);
        message->AddBool("take_me_there", true);
        message->AddInt32("delta_y", -1);
-       AddShortcut(B_UP_ARROW, B_COMMAND_KEY | B_CONTROL_KEY | B_SHIFT_KEY, 
message, NULL);
+       AddShortcut(B_UP_ARROW, B_COMMAND_KEY | B_CONTROL_KEY | B_SHIFT_KEY,
+               message, NULL);
 
        message = new BMessage(_SWITCH_WORKSPACE_);
        message->AddBool("take_me_there", true);
        message->AddInt32("delta_y", 1);
-       AddShortcut(B_DOWN_ARROW, B_COMMAND_KEY | B_CONTROL_KEY | B_SHIFT_KEY, 
message, NULL);
+       AddShortcut(B_DOWN_ARROW, B_COMMAND_KEY | B_CONTROL_KEY | B_SHIFT_KEY,
+               message, NULL);
 
        // We set the default pulse rate, but we don't start the pulse
        fPulseRate = 500000;
@@ -2877,10 +2891,12 @@ BWindow::_InitData(BRect frame, const char* title, 
window_look look,
 
        // Create the server-side window
 
-       port_id receivePort = create_port(B_LOOPER_PORT_DEFAULT_CAPACITY, 
"w<app_server");
+       port_id receivePort = create_port(B_LOOPER_PORT_DEFAULT_CAPACITY,
+               "w<app_server");
        if (receivePort < B_OK) {
                // TODO: huh?
-               debugger("Could not create BWindow's receive port, used for 
interacting with the app_server!");
+               debugger("Could not create BWindow's receive port, used for "
+                                "interacting with the app_server!");
                delete this;
                return;
        }

############################################################################

Commit:      ccc66661560ab275eb7ac404f49adb20a89f7427
URL:         http://cgit.haiku-os.org/haiku/commit/?id=ccc66661560a
Author:      John Scipione <jscipione@xxxxxxxxx>
Date:        Fri Jun 13 05:35:18 2014 UTC

BWindow: remove workspace switching shortcuts

These are going to be activated by an input server filter instead.

----------------------------------------------------------------------------

diff --git a/src/kits/interface/Window.cpp b/src/kits/interface/Window.cpp
index ed9396d..bcd07de 100644
--- a/src/kits/interface/Window.cpp
+++ b/src/kits/interface/Window.cpp
@@ -69,7 +69,6 @@
 #define _ZOOM_                         '_WZO'
 #define _SEND_BEHIND_          '_WSB'
 #define _SEND_TO_FRONT_                '_WSF'
-#define _SWITCH_WORKSPACE_     '_SWS'
 
 
 void do_minimize_team(BRect zoomRect, team_id team, bool zoom);
@@ -964,54 +963,6 @@ BWindow::DispatchMessage(BMessage* message, BHandler* 
target)
                        Activate();
                        break;
 
-               case _SWITCH_WORKSPACE_:
-               {
-                       int32 deltaX = 0;
-                       message->FindInt32("delta_x", &deltaX);
-                       int32 deltaY = 0;
-                       message->FindInt32("delta_y", &deltaY);
-                       bool takeMeThere = false;
-                       message->FindBool("take_me_there", &takeMeThere);
-
-                       if (deltaX == 0 && deltaY == 0)
-                               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<int32>(&columns);
-                       link.Read<int32>(&rows);
-
-                       int32 current = current_workspace();
-
-                       int32 nextColumn = current % columns + deltaX;
-                       int32 nextRow = current / columns + deltaY;
-                       if (nextColumn >= columns)
-                               nextColumn = columns - 1;
-                       else if (nextColumn < 0)
-                               nextColumn = 0;
-                       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<int32>(next);
-                               link.Attach<bool>(takeMeThere);
-                               link.Flush();
-                       }
-                       break;
-               }
-
                case B_MINIMIZE:
                {
                        bool minimize;
@@ -2824,49 +2775,6 @@ BWindow::_InitData(BRect frame, const char* title, 
window_look look,
        AddShortcut('B', B_COMMAND_KEY | B_CONTROL_KEY,
                new BMessage(_SEND_BEHIND_), NULL);
 
-       // Workspace modifier keys
-       BMessage* message;
-
-       message = new BMessage(_SWITCH_WORKSPACE_);
-       message->AddInt32("delta_x", -1);
-       AddShortcut(B_LEFT_ARROW, B_COMMAND_KEY | B_CONTROL_KEY, message, NULL);
-
-       message = new BMessage(_SWITCH_WORKSPACE_);
-       message->AddInt32("delta_x", 1);
-       AddShortcut(B_RIGHT_ARROW, B_COMMAND_KEY | B_CONTROL_KEY, message, 
NULL);
-
-       message = new BMessage(_SWITCH_WORKSPACE_);
-       message->AddInt32("delta_y", -1);
-       AddShortcut(B_UP_ARROW, B_COMMAND_KEY | B_CONTROL_KEY, message, NULL);
-
-       message = new BMessage(_SWITCH_WORKSPACE_);
-       message->AddInt32("delta_y", 1);
-       AddShortcut(B_DOWN_ARROW, B_COMMAND_KEY | B_CONTROL_KEY, message, NULL);
-
-       message = new BMessage(_SWITCH_WORKSPACE_);
-       message->AddBool("take_me_there", true);
-       message->AddInt32("delta_x", -1);
-       AddShortcut(B_LEFT_ARROW, B_COMMAND_KEY | B_CONTROL_KEY | B_SHIFT_KEY,
-               message, NULL);
-
-       message = new BMessage(_SWITCH_WORKSPACE_);
-       message->AddBool("take_me_there", true);
-       message->AddInt32("delta_x", 1);
-       AddShortcut(B_RIGHT_ARROW, B_COMMAND_KEY | B_CONTROL_KEY | B_SHIFT_KEY,
-               message, NULL);
-
-       message = new BMessage(_SWITCH_WORKSPACE_);
-       message->AddBool("take_me_there", true);
-       message->AddInt32("delta_y", -1);
-       AddShortcut(B_UP_ARROW, B_COMMAND_KEY | B_CONTROL_KEY | B_SHIFT_KEY,
-               message, NULL);
-
-       message = new BMessage(_SWITCH_WORKSPACE_);
-       message->AddBool("take_me_there", true);
-       message->AddInt32("delta_y", 1);
-       AddShortcut(B_DOWN_ARROW, B_COMMAND_KEY | B_CONTROL_KEY | B_SHIFT_KEY,
-               message, NULL);
-
        // We set the default pulse rate, but we don't start the pulse
        fPulseRate = 500000;
        fPulseRunner = NULL;

############################################################################

Revision:    hrev48729
Commit:      a0c83527188c9e107f0cf4f8d898ca34f79168e3
URL:         http://cgit.haiku-os.org/haiku/commit/?id=a0c83527188c
Author:      John Scipione <jscipione@xxxxxxxxx>
Date:        Fri Jun 13 05:36:48 2014 UTC

Add input server filters

... for switching workspaces (removed from BWindow) and
minimize all (aka Show Desktop).

This moves the workspace switch behavior out of the BWindow class
and places it into it's own input server filter that does the same
thing. The difference is that you may now uninstall the workspace
switching filter to disable the behavior. These shortcuts were not
included in the BeOS R5 version of BWindow so represent additional
behavior added to Haiku.

minimize_all (aka Show Desktop) is a new input server filter that
allows you to minimize all windows by pressing cmd+ctrl+D. If
you do not like this behavior you may uninstall the minimize_all
input server filter.

----------------------------------------------------------------------------

diff --git a/build/jam/packages/Haiku b/build/jam/packages/Haiku
index 8720f35..c0e06d1 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
        : <input>keyboard <input>mouse <input>tablet <input>wacom ;
 AddFilesToPackage add-ons input_server filters
-       : screen_saver shortcut_catcher ;
+       : minimize_all screen_saver shortcut_catcher switch_workspace ;
 
 AddFilesToPackage add-ons kernel network : <net>notifications stack ;
 AddFilesToPackage add-ons kernel network : dns_resolver ;
diff --git a/build/jam/packages/HaikuBootstrap 
b/build/jam/packages/HaikuBootstrap
index 9a3c9c3..7c9b1e0 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
        : <input>keyboard <input>mouse <input>tablet <input>wacom ;
 AddFilesToPackage add-ons input_server filters
-       : screen_saver shortcut_catcher ;
+       : minimize_all screen_saver shortcut_catcher switch_workspace ;
 
 AddFilesToPackage add-ons kernel network : <net>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 6f5d3ef..1ad77e3 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 0000000..94b5039
--- /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 0000000..73d9d52
--- /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@xxxxxxxxx
+ */
+
+
+#include "MinimizeAllInputFilter.h"
+
+#include <string.h>
+
+#include <InterfaceDefs.h>
+#include <Message.h>
+#include <OS.h>
+#include <Roster.h>
+#include <WindowInfo.h>
+
+#include <tracker_private.h>
+
+
+#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 0000000..9e10321
--- /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 <InputServerFilter.h>
+
+
+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 0000000..851ecd6
--- /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 0000000..2190920
--- /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@xxxxxxxxxxxxxxxx
+ *             John Scipione, jscipione@xxxxxxxxx
+ */
+
+
+#include "SwitchWorkspaceInputFilter.h"
+
+#include <string.h>
+
+#include <AppServerLink.h>
+#include <InterfaceDefs.h>
+#include <Message.h>
+#include <ServerProtocol.h>
+
+
+#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<int32>(&columns);
+                       link.Read<int32>(&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<int32>(next);
+                               link.Attach<bool>(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 0000000..5b63214
--- /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 <InputServerFilter.h>
+
+
+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


Other related posts: