1/*
2 * Copyright 2010-2014 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * John Scipione, jscipione@gmail.com
7 * Clemens Zeidler, haiku@clemens-zeidler.de
8 */
9#ifndef STACK_AND_TILE_H
10#define STACK_AND_TILE_H
11
12
13#include <map>
14
15#include <Message.h>
16#include <MessageFilter.h>
17
18#include "DesktopListener.h"
19#include "ObjectList.h"
20#include "WindowList.h"
21
22
23//#define DEBUG_STACK_AND_TILE
24
25#ifdef DEBUG_STACK_AND_TILE
26# define STRACE_SAT(x...) debug_printf("SAT: "x)
27#else
28# define STRACE_SAT(x...) ;
29#endif
30
31
32class SATGroup;
33class SATWindow;
34class Window;
35class WindowArea;
36
37
38typedef std::map<Window*, SATWindow*> SATWindowMap;
39
40
41class StackAndTile : public DesktopListener {
42public:
43 StackAndTile();
44 virtual ~StackAndTile();
45
46 virtual int32 Identifier();
47
48 // DesktopListener hooks
49 virtual void ListenerRegistered(Desktop* desktop);
50 virtual void ListenerUnregistered();
51
52 virtual bool HandleMessage(Window* sender,
53 BPrivate::LinkReceiver& link,
54 BPrivate::LinkSender& reply);
55
56 virtual void WindowAdded(Window* window);
57 virtual void WindowRemoved(Window* window);
58
59 virtual bool KeyPressed(uint32 what, int32 key,
60 int32 modifiers);
61 virtual void MouseEvent(BMessage* message) {}
62 virtual void MouseDown(Window* window, BMessage* message,
63 const BPoint& where);
64 virtual void MouseUp(Window* window, BMessage* message,
65 const BPoint& where);
66 virtual void MouseMoved(Window* window, BMessage* message,
67 const BPoint& where) {}
68
69 virtual void WindowMoved(Window* window);
70 virtual void WindowResized(Window* window);
71 virtual void WindowActivated(Window* window);
72 virtual void WindowSentBehind(Window* window,
73 Window* behindOf);
74 virtual void WindowWorkspacesChanged(Window* window,
75 uint32 workspaces);
76 virtual void WindowHidden(Window* window, bool fromMinimize);
77 virtual void WindowMinimized(Window* window, bool minimize);
78
79 virtual void WindowTabLocationChanged(Window* window,
80 float location, bool isShifting);
81 virtual void SizeLimitsChanged(Window* window,
82 int32 minWidth, int32 maxWidth,
83 int32 minHeight, int32 maxHeight);
84 virtual void WindowLookChanged(Window* window,
85 window_look look);
86 virtual void WindowFeelChanged(Window* window,
87 window_feel feel);
88
89 virtual bool SetDecoratorSettings(Window* window,
90 const BMessage& settings);
91 virtual void GetDecoratorSettings(Window* window,
92 BMessage& settings);
93
94 bool SATKeyPressed()
95 { return fSATKeyPressed; }
96
97 SATWindow* GetSATWindow(Window* window);
98 SATWindow* FindSATWindow(uint64 id);
99
100private:
101 void _StartSAT();
102 void _StopSAT();
103 void _ActivateWindow(SATWindow* window);
104 bool _HandleMessage(BPrivate::LinkReceiver& link,
105 BPrivate::LinkSender& reply);
106 SATGroup* _GetSATGroup(SATWindow* window);
107
108 Desktop* fDesktop;
109
110 bool fSATKeyPressed;
111
112 SATWindowMap fSATWindowMap;
113 BObjectList<SATWindow> fGrouplessWindows;
114
115 SATWindow* fCurrentSATWindow;
116};
117
118
119class GroupIterator {
120public:
121 GroupIterator(StackAndTile* sat,
122 Desktop* desktop);
123
124 SATGroup* CurrentGroup(void) const
125 { return fCurrentGroup; };
126 void SetCurrentGroup(SATGroup* group)
127 { fCurrentGroup = group; };
128
129 void RewindToFront();
130 SATGroup* NextGroup();
131
132private:
133 StackAndTile* fStackAndTile;
134 Desktop* fDesktop;
135 Window* fCurrentWindow;
136 SATGroup* fCurrentGroup;
137};
138
139
140class WindowIterator {
141public:
142 WindowIterator(SATGroup* group,
143 bool reverseLayerOrder = false);
144
145 void Rewind();
146 /*! Iterates over all areas in the group and return the windows in
147 the areas. Within one area the windows are ordered by their layer
148 position. If reverseLayerOrder is false the bottommost window comes
149 first. */
150 SATWindow* NextWindow();
151
152private:
153 SATWindow* _ReverseNextWindow();
154 void _ReverseRewind();
155
156 SATGroup* fGroup;
157 bool fReverseLayerOrder;
158
159 WindowArea* fCurrentArea;
160 int32 fAreaIndex;
161 int32 fWindowIndex;
162};
163
164
165class SATSnappingBehaviour {
166public:
167 virtual ~SATSnappingBehaviour() {};
168
169 /*! Find all window candidates which possibly can join the group. Found
170 candidates are marked here visual. */
171 virtual bool FindSnappingCandidates(SATGroup* group) = 0;
172 /*! Join all candidates found in FindSnappingCandidates to the group.
173 Previously visually mark should be removed here. \return true if
174 integration has been succeed. */
175 virtual bool JoinCandidates() = 0;
176 /*! Update the window tab values, solve the layout and move all windows in
177 the group accordantly. */
178 virtual void RemovedFromArea(WindowArea* area) {}
179 virtual void WindowLookChanged(window_look look) {}
180};
181
182
183typedef BObjectList<SATSnappingBehaviour> SATSnappingBehaviourList;
184
185
186#endif