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