1/*
2 * Copyright 2015 Haiku, Inc. All rights reserved
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		John Scipione, jscipione@gmail.com
7 */
8
9
10#include "MinimizeAllInputFilter.h"
11
12#include <string.h>
13
14#include <new>
15
16#include <InterfaceDefs.h>
17#include <Message.h>
18#include <OS.h>
19#include <Roster.h>
20#include <WindowInfo.h>
21
22#include <tracker_private.h>
23
24
25#define _MINIMIZE_ALL_		'_WMA'
26
27
28extern "C" BInputServerFilter* instantiate_input_filter() {
29	return new(std::nothrow) MinimizeAllInputFilter();
30}
31
32
33MinimizeAllInputFilter::MinimizeAllInputFilter()
34{
35}
36
37
38filter_result
39MinimizeAllInputFilter::Filter(BMessage* message, BList* _list)
40{
41	switch (message->what) {
42		case B_KEY_DOWN:
43		{
44			const char* bytes;
45			if (message->FindString("bytes", &bytes) != B_OK)
46				break;
47
48			int32 modifiers;
49			if (message->FindInt32("modifiers", &modifiers) != B_OK)
50				break;
51
52			int32 modifiersHeld = modifiers & (B_COMMAND_KEY
53				| B_CONTROL_KEY | B_OPTION_KEY | B_MENU_KEY | B_SHIFT_KEY);
54
55			bool minimize;
56			if (modifiersHeld == (B_COMMAND_KEY | B_CONTROL_KEY))
57				minimize = true;
58			else if (modifiersHeld
59					== (B_COMMAND_KEY | B_CONTROL_KEY | B_SHIFT_KEY)) {
60				minimize = false;
61			} else
62				break;
63
64			int32 cookie = 0;
65			team_info teamInfo;
66			while (get_next_team_info(&cookie, &teamInfo) == B_OK) {
67				app_info appInfo;
68				be_roster->GetRunningAppInfo(teamInfo.team, &appInfo);
69				team_id team = appInfo.team;
70				be_roster->ActivateApp(team);
71
72				if (be_roster->GetActiveAppInfo(&appInfo) == B_OK
73					&& (appInfo.flags & B_BACKGROUND_APP) == 0
74					&& strcasecmp(appInfo.signature, kDeskbarSignature) != 0) {
75					BRect zoomRect;
76					if (minimize)
77						do_minimize_team(zoomRect, team, false);
78					else
79						do_bring_to_front_team(zoomRect, team, false);
80				}
81			}
82
83			return B_SKIP_MESSAGE;
84		}
85	}
86
87	return B_DISPATCH_MESSAGE;
88}
89
90
91status_t
92MinimizeAllInputFilter::InitCheck()
93{
94	return B_OK;
95}
96