16a0a0a80SAxel Dörfler /* 2773d5303STri-Edge AI * Copyright 2001-2020, Haiku. 36a0a0a80SAxel Dörfler * Distributed under the terms of the MIT License. 46a0a0a80SAxel Dörfler * 56a0a0a80SAxel Dörfler * Authors: 6773d5303STri-Edge AI * Adrian Oanca, adioanca@cotty.iren.ro 7773d5303STri-Edge AI * Stephan Aßmus, superstippi@gmx.de 8773d5303STri-Edge AI * Axel Dörfler, axeld@pinc-software.de 9773d5303STri-Edge AI * Andrej Spielmann, andrej.spielmann@seh.ox.ac.uk 10773d5303STri-Edge AI * Brecht Machiels, brecht@mos6581.org 11773d5303STri-Edge AI * Clemens Zeidler, haiku@clemens-zeidler.de 12773d5303STri-Edge AI * Joseph Groover, looncraz@looncraz.net 13773d5303STri-Edge AI * Tri-Edge AI 14773d5303STri-Edge AI * Jacob Secunda, secundja@gmail.com 156a0a0a80SAxel Dörfler */ 1627adb969SAxel Dörfler #ifndef DESKTOP_H 1727adb969SAxel Dörfler #define DESKTOP_H 1833bbe223SAxel Dörfler 1908f35604SAxel Dörfler 20d99d8dbdSX512 #include <AutoDeleter.h> 21b6ba2290SClemens Zeidler #include <Autolock.h> 22b6ba2290SClemens Zeidler #include <InterfaceDefs.h> 23b6ba2290SClemens Zeidler #include <List.h> 24b6ba2290SClemens Zeidler #include <Menu.h> 25b6ba2290SClemens Zeidler #include <ObjectList.h> 26b6ba2290SClemens Zeidler #include <Region.h> 27d99d8dbdSX512 #include <String.h> 28b6ba2290SClemens Zeidler #include <Window.h> 29b6ba2290SClemens Zeidler 307f9368caSlooncraz #include <ServerProtocolStructs.h> 317f9368caSlooncraz 323ddebe7eSMichael Lotz #include "CursorManager.h" 337f9368caSlooncraz #include "DelayedMessage.h" 34860dfc9aSClemens Zeidler #include "DesktopListener.h" 35ace2d5eeSStephan Aßmus #include "DesktopSettings.h" 3608f35604SAxel Dörfler #include "EventDispatcher.h" 37ace2d5eeSStephan Aßmus #include "MessageLooper.h" 3852ede95cSStephan Aßmus #include "MultiLocker.h" 39953d895eSAxel Dörfler #include "Screen.h" 40fd5bec1eSAxel Dörfler #include "ScreenManager.h" 41ace2d5eeSStephan Aßmus #include "ServerCursor.h" 426a0ed7daSClemens Zeidler #include "StackAndTile.h" 43fd5bec1eSAxel Dörfler #include "VirtualScreen.h" 44e83820edSAxel Dörfler #include "WindowList.h" 4527adb969SAxel Dörfler #include "Workspace.h" 465ca8477eSAxel Dörfler #include "WorkspacePrivate.h" 47fd5bec1eSAxel Dörfler 4823e00a25SAxel Dörfler 493dcb3b07SStephan Aßmus class BMessage; 506a0a0a80SAxel Dörfler 5189887831SClemens Zeidler class DecorAddOn; 5258468dfeSStephan Aßmus class DrawingEngine; 533dcb3b07SStephan Aßmus class HWInterface; 54e83820edSAxel Dörfler class ServerApp; 55953d895eSAxel Dörfler class Window; 56953d895eSAxel Dörfler class WorkspacesView; 576d5488e1SAxel Dörfler struct server_read_only_memory; 5833bbe223SAxel Dörfler 596a0a0a80SAxel Dörfler namespace BPrivate { 606a0a0a80SAxel Dörfler class LinkSender; 616a0a0a80SAxel Dörfler }; 626a0a0a80SAxel Dörfler 630eed9183SAxel Dörfler 64860dfc9aSClemens Zeidler class Desktop : public DesktopObservable, public MessageLooper, 65860dfc9aSClemens Zeidler public ScreenOwner { 6633bbe223SAxel Dörfler public: 677f9368caSlooncraz Desktop(uid_t userID, 687f9368caSlooncraz const char* targetScreen); 693dcb3b07SStephan Aßmus virtual ~Desktop(); 703dcb3b07SStephan Aßmus 71d6734c08SClemens Zeidler void RegisterListener(DesktopListener* listener); 72d6734c08SClemens Zeidler 736d5488e1SAxel Dörfler status_t Init(); 7436deda69SAxel Dörfler UserID()7536deda69SAxel Dörfler uid_t UserID() const { return fUserID; } TargetScreen()7668667bf4SMichael Lotz const char* TargetScreen() { return fTargetScreen; } MessagePort()77770c05d6SAxel Dörfler virtual port_id MessagePort() const { return fMessagePort; } SharedReadOnlyArea()789dbce7a4SAxel Dörfler area_id SharedReadOnlyArea() const 799dbce7a4SAxel Dörfler { return fSharedReadOnlyArea; } 80770c05d6SAxel Dörfler EventDispatcher()81f7598223SAxel Dörfler ::EventDispatcher& EventDispatcher() { return fEventDispatcher; } 826c17d025SAxel Dörfler 83770c05d6SAxel Dörfler void BroadcastToAllApps(int32 code); 840a3f410fSAxel Dörfler void BroadcastToAllWindows(int32 code); 8533bbe223SAxel Dörfler 867f9368caSlooncraz int32 GetAllWindowTargets(DelayedMessage& message); 877f9368caSlooncraz int32 GetAllAppTargets(DelayedMessage& message); 887f9368caSlooncraz 8983cdf43fSClemens Zeidler filter_result KeyEvent(uint32 what, int32 key, 90860dfc9aSClemens Zeidler int32 modifiers); 91cc93fbbbSAxel Dörfler // Locking LockSingleWindow()92cc93fbbbSAxel Dörfler bool LockSingleWindow() 93cc93fbbbSAxel Dörfler { return fWindowLock.ReadLock(); } UnlockSingleWindow()94cc93fbbbSAxel Dörfler void UnlockSingleWindow() 95cc93fbbbSAxel Dörfler { fWindowLock.ReadUnlock(); } 96cc93fbbbSAxel Dörfler LockAllWindows()97cc93fbbbSAxel Dörfler bool LockAllWindows() 98cc93fbbbSAxel Dörfler { return fWindowLock.WriteLock(); } UnlockAllWindows()99cc93fbbbSAxel Dörfler void UnlockAllWindows() 100cc93fbbbSAxel Dörfler { fWindowLock.WriteUnlock(); } 101cc93fbbbSAxel Dörfler WindowLocker()10278ca6157SAxel Dörfler const MultiLocker& WindowLocker() { return fWindowLock; } 103cc93fbbbSAxel Dörfler 1040eed9183SAxel Dörfler // Mouse and cursor methods 10533bbe223SAxel Dörfler 106195e980eSAxel Dörfler void SetCursor(ServerCursor* cursor); 107ace2d5eeSStephan Aßmus ServerCursorReference Cursor() const; 1088689fe06SIngo Weinhold void SetManagementCursor(ServerCursor* newCursor); 1098689fe06SIngo Weinhold 1104d1c4228SStephan Aßmus void SetLastMouseState(const BPoint& position, 11121b40eddSStephan Aßmus int32 buttons, Window* windowUnderMouse); 1124d1c4228SStephan Aßmus // for use by the mouse filter only 1134d1c4228SStephan Aßmus // both mouse position calls require 1144d1c4228SStephan Aßmus // the Desktop object to be locked 1154d1c4228SStephan Aßmus // already 1164d1c4228SStephan Aßmus void GetLastMouseState(BPoint* position, 1174d1c4228SStephan Aßmus int32* buttons) const; 1184d1c4228SStephan Aßmus // for use by ServerWindow 1190eed9183SAxel Dörfler GetCursorManager()1200eed9183SAxel Dörfler CursorManager& GetCursorManager() { return fCursorManager; } 1210eed9183SAxel Dörfler 122fe7f167dSAxel Dörfler // Screen and drawing related methods 123fe7f167dSAxel Dörfler 1240eed9183SAxel Dörfler status_t SetScreenMode(int32 workspace, int32 id, 1250eed9183SAxel Dörfler const display_mode& mode, bool makeDefault); 1260eed9183SAxel Dörfler status_t GetScreenMode(int32 workspace, int32 id, 1270eed9183SAxel Dörfler display_mode& mode); 128e18224cdSAxel Dörfler status_t GetScreenFrame(int32 workspace, int32 id, 129e18224cdSAxel Dörfler BRect& frame); 1305e3f4c41SAxel Dörfler void RevertScreenModes(uint32 workspaces); 1310eed9183SAxel Dörfler 1328b2b3010SAdrien Destugues status_t SetBrightness(int32 id, float brightness); 1338b2b3010SAdrien Destugues ScreenLocker()13478ca6157SAxel Dörfler MultiLocker& ScreenLocker() { return fScreenLock; } 13578ca6157SAxel Dörfler 1369fe35223SAxel Dörfler status_t LockDirectScreen(team_id team); 1379fe35223SAxel Dörfler status_t UnlockDirectScreen(team_id team); 1389fe35223SAxel Dörfler VirtualScreen()1395e3f4c41SAxel Dörfler const ::VirtualScreen& VirtualScreen() const 1405e3f4c41SAxel Dörfler { return fVirtualScreen; } GetDrawingEngine()14127adb969SAxel Dörfler DrawingEngine* GetDrawingEngine() const 14258468dfeSStephan Aßmus { return fVirtualScreen.DrawingEngine(); } HWInterface()14327adb969SAxel Dörfler ::HWInterface* HWInterface() const 144fd5bec1eSAxel Dörfler { return fVirtualScreen.HWInterface(); } 14594fa2bd2SAdi Oanca 1465483fa4eSClemens Zeidler void RebuildAndRedrawAfterWindowChange( 1475483fa4eSClemens Zeidler Window* window, BRegion& dirty); 1485483fa4eSClemens Zeidler // the window lock must be held when calling 1495483fa4eSClemens Zeidler // this function 1505483fa4eSClemens Zeidler 1510eed9183SAxel Dörfler // ScreenOwner implementation ScreenRemoved(Screen * screen)1525e3f4c41SAxel Dörfler virtual void ScreenRemoved(Screen* screen) {} ScreenAdded(Screen * screen)1535e3f4c41SAxel Dörfler virtual void ScreenAdded(Screen* screen) {} 154f3e8ed4dSMichael Lotz virtual void ScreenChanged(Screen* screen); ReleaseScreen(Screen * screen)1555e3f4c41SAxel Dörfler virtual bool ReleaseScreen(Screen* screen) { return false; } 1560eed9183SAxel Dörfler 15727adb969SAxel Dörfler // Workspace methods 15827adb969SAxel Dörfler 15947212dddSAxel Dörfler void SetWorkspaceAsync(int32 index, 16047212dddSAxel Dörfler bool moveFocusWindow = false); 16147212dddSAxel Dörfler void SetWorkspace(int32 index, 16247212dddSAxel Dörfler bool moveFocusWindow = false); CurrentWorkspace()16327adb969SAxel Dörfler int32 CurrentWorkspace() 16427adb969SAxel Dörfler { return fCurrentWorkspace; } WorkspaceAt(int32 index)1655ca8477eSAxel Dörfler Workspace::Private& WorkspaceAt(int32 index) 16627adb969SAxel Dörfler { return fWorkspaces[index]; } 16769f9a367SAxel Dörfler status_t SetWorkspacesLayout(int32 columns, int32 rows); 16827c43a2dSRene Gollent BRect WorkspaceFrame(int32 index) const; 16927adb969SAxel Dörfler 170cc93fbbbSAxel Dörfler void StoreWorkspaceConfiguration(int32 index); 171cc93fbbbSAxel Dörfler 172cc93fbbbSAxel Dörfler void AddWorkspacesView(WorkspacesView* view); 173cc93fbbbSAxel Dörfler void RemoveWorkspacesView(WorkspacesView* view); 174cc93fbbbSAxel Dörfler 175953d895eSAxel Dörfler // Window methods 17627adb969SAxel Dörfler 177926e63c8SBrecht Machiels void SelectWindow(Window* window); 178f33cf3fdSClemens Zeidler void ActivateWindow(Window* window); 179953d895eSAxel Dörfler void SendWindowBehind(Window* window, 180f33cf3fdSClemens Zeidler Window* behindOf = NULL, 181f33cf3fdSClemens Zeidler bool sendStack = true); 18227adb969SAxel Dörfler 183953d895eSAxel Dörfler void ShowWindow(Window* window); 184cd67c205SClemens Zeidler void HideWindow(Window* window, 185cd67c205SClemens Zeidler bool fromMinimize = false); 186860dfc9aSClemens Zeidler void MinimizeWindow(Window* window, bool minimize); 18715918e4fSAxel Dörfler 188953d895eSAxel Dörfler void MoveWindowBy(Window* window, float x, float y, 18914fe11cfSAxel Dörfler int32 workspace = -1); 1909dbce7a4SAxel Dörfler void ResizeWindowBy(Window* window, float x, 1919dbce7a4SAxel Dörfler float y); 192773d5303STri-Edge AI void SetWindowOutlinesDelta(Window* window, 193773d5303STri-Edge AI BPoint delta); 1949dbce7a4SAxel Dörfler bool SetWindowTabLocation(Window* window, 195bb2e9b06SClemens Zeidler float location, bool isShifting); 196953d895eSAxel Dörfler bool SetWindowDecoratorSettings(Window* window, 197b30e9021SStephan Aßmus const BMessage& settings); 19819d801a6SAxel Dörfler 199953d895eSAxel Dörfler void SetWindowWorkspaces(Window* window, 200a631158aSAxel Dörfler uint32 workspaces); 20127adb969SAxel Dörfler 202953d895eSAxel Dörfler void AddWindow(Window* window); 203953d895eSAxel Dörfler void RemoveWindow(Window* window); 20457be2866SAxel Dörfler 205953d895eSAxel Dörfler bool AddWindowToSubset(Window* subset, 206953d895eSAxel Dörfler Window* window); 207953d895eSAxel Dörfler void RemoveWindowFromSubset(Window* subset, 208953d895eSAxel Dörfler Window* window); 20934227d2cSAxel Dörfler 2100a3f410fSAxel Dörfler void FontsChanged(Window* window); 2117f9368caSlooncraz void ColorUpdated(Window* window, color_which which, 2127f9368caSlooncraz rgb_color color); 2130a3f410fSAxel Dörfler 214953d895eSAxel Dörfler void SetWindowLook(Window* window, window_look look); 215953d895eSAxel Dörfler void SetWindowFeel(Window* window, window_feel feel); 216953d895eSAxel Dörfler void SetWindowFlags(Window* window, uint32 flags); 2179dbce7a4SAxel Dörfler void SetWindowTitle(Window* window, 2189dbce7a4SAxel Dörfler const char* title); 21933bbe223SAxel Dörfler FocusWindow()220953d895eSAxel Dörfler Window* FocusWindow() const { return fFocus; } FrontWindow()221953d895eSAxel Dörfler Window* FrontWindow() const { return fFront; } BackWindow()222953d895eSAxel Dörfler Window* BackWindow() const { return fBack; } 223e83820edSAxel Dörfler 224953d895eSAxel Dörfler Window* WindowAt(BPoint where); 225e83820edSAxel Dörfler MouseEventWindow()2269dbce7a4SAxel Dörfler Window* MouseEventWindow() const 2279dbce7a4SAxel Dörfler { return fMouseEventWindow; } 228953d895eSAxel Dörfler void SetMouseEventWindow(Window* window); 229e83820edSAxel Dörfler 2309dbce7a4SAxel Dörfler void SetViewUnderMouse(const Window* window, 2319dbce7a4SAxel Dörfler int32 viewToken); 232953d895eSAxel Dörfler int32 ViewUnderMouse(const Window* window); 2331e766d46SAxel Dörfler 23407dc2c69SAxel Dörfler EventTarget* KeyboardEventTarget(); 235cc93fbbbSAxel Dörfler 236cc93fbbbSAxel Dörfler void SetFocusWindow(Window* window = NULL); 23721b40eddSStephan Aßmus void SetFocusLocked(const Window* window); 238e83820edSAxel Dörfler 239953d895eSAxel Dörfler Window* FindWindowByClientToken(int32 token, 240953d895eSAxel Dörfler team_id teamID); 24195530739SAxel Dörfler EventTarget* FindTarget(BMessenger& messenger); 2426a0a0a80SAxel Dörfler 243*b5ba4badSX512 void MarkDirty(BRegion& dirtyRegion, BRegion& exposeRegion); MarkDirty(BRegion & region)244*b5ba4badSX512 void MarkDirty(BRegion& region) 245*b5ba4badSX512 { return MarkDirty(region, region); } 246b09e2f6fSStephan Aßmus void Redraw(); 247cc93fbbbSAxel Dörfler void RedrawBackground(); 248e83820edSAxel Dörfler 24989887831SClemens Zeidler bool ReloadDecor(DecorAddOn* oldDecor); 250bb86786aSClemens Zeidler BackgroundRegion()251e83820edSAxel Dörfler BRegion& BackgroundRegion() 252e83820edSAxel Dörfler { return fBackgroundRegion; } 25333bbe223SAxel Dörfler 254f877af82SAxel Dörfler void MinimizeApplication(team_id team); 255f877af82SAxel Dörfler void BringApplicationToFront(team_id team); 256bfe69873SAxel Dörfler void WindowAction(int32 windowToken, int32 action); 257f877af82SAxel Dörfler 25827adb969SAxel Dörfler void WriteWindowList(team_id team, 25927adb969SAxel Dörfler BPrivate::LinkSender& sender); 26027adb969SAxel Dörfler void WriteWindowInfo(int32 serverToken, 26127adb969SAxel Dörfler BPrivate::LinkSender& sender); 262ae0606beSAxel Dörfler void WriteApplicationOrder(int32 workspace, 263ae0606beSAxel Dörfler BPrivate::LinkSender& sender); 264ae0606beSAxel Dörfler void WriteWindowOrder(int32 workspace, 265ae0606beSAxel Dörfler BPrivate::LinkSender& sender); 26633bbe223SAxel Dörfler 26752ede95cSStephan Aßmus //! The window lock must be held when accessing a window list! 268860dfc9aSClemens Zeidler WindowList& CurrentWindows(); 269d6734c08SClemens Zeidler WindowList& AllWindows(); 270860dfc9aSClemens Zeidler 271b8a44a25SClemens Zeidler Window* WindowForClientLooperPort(port_id port); 272b8a44a25SClemens Zeidler GetStackAndTile()2736a0ed7daSClemens Zeidler StackAndTile* GetStackAndTile() { return &fStackAndTile; } 27433bbe223SAxel Dörfler private: 2750265102fSClemens Zeidler WindowList& _Windows(int32 index); 2760265102fSClemens Zeidler 2777f9368caSlooncraz void _FlushPendingColors(); 2787f9368caSlooncraz 2796869c8a5SRyan Leavengood void _LaunchInputServer(); 280cc93fbbbSAxel Dörfler void _GetLooperName(char* name, size_t size); 281cc93fbbbSAxel Dörfler void _PrepareQuit(); 282cc93fbbbSAxel Dörfler void _DispatchMessage(int32 code, 283cc93fbbbSAxel Dörfler BPrivate::LinkReceiver &link); 284e83820edSAxel Dörfler 28534227d2cSAxel Dörfler void _UpdateFloating(int32 previousWorkspace = -1, 286d479fa7aSAxel Dörfler int32 nextWorkspace = -1, 287953d895eSAxel Dörfler Window* mouseEventWindow = NULL); 288e83820edSAxel Dörfler void _UpdateBack(); 28934227d2cSAxel Dörfler void _UpdateFront(bool updateFloating = true); 29034227d2cSAxel Dörfler void _UpdateFronts(bool updateFloating = true); 2914db1a8c6SAxel Dörfler bool _WindowHasModal(Window* window) const; 2924db1a8c6SAxel Dörfler bool _WindowCanHaveFocus(Window* window) const; 293e83820edSAxel Dörfler 294953d895eSAxel Dörfler void _WindowChanged(Window* window); 295953d895eSAxel Dörfler void _WindowRemoved(Window* window); 296ce8c4d79SAxel Dörfler 297cc93fbbbSAxel Dörfler void _ShowWindow(Window* window, 298cc93fbbbSAxel Dörfler bool affectsOtherWindows = true); 299cc93fbbbSAxel Dörfler void _HideWindow(Window* window); 3005f2edc0fSAxel Dörfler 301cc93fbbbSAxel Dörfler void _UpdateSubsetWorkspaces(Window* window, 302cc93fbbbSAxel Dörfler int32 previousIndex = -1, 303cc93fbbbSAxel Dörfler int32 newIndex = -1); 304cc93fbbbSAxel Dörfler void _ChangeWindowWorkspaces(Window* window, 305cc93fbbbSAxel Dörfler uint32 oldWorkspaces, uint32 newWorkspaces); 306cc93fbbbSAxel Dörfler void _BringWindowsToFront(WindowList& windows, 307cc93fbbbSAxel Dörfler int32 list, bool wereVisible); 308cc93fbbbSAxel Dörfler Window* _LastFocusSubsetWindow(Window* window); 309fa6fca91SAxel Dörfler bool _CheckSendFakeMouseMoved( 310fa6fca91SAxel Dörfler const Window* lastWindowUnderMouse); 311cc93fbbbSAxel Dörfler void _SendFakeMouseMoved(Window* window = NULL); 312cc93fbbbSAxel Dörfler 31378ca6157SAxel Dörfler Screen* _DetermineScreenFor(BRect frame); 314cc93fbbbSAxel Dörfler void _RebuildClippingForAllWindows( 315cc93fbbbSAxel Dörfler BRegion& stillAvailableOnScreen); 316cc93fbbbSAxel Dörfler void _TriggerWindowRedrawing( 317*b5ba4badSX512 BRegion& dirtyRegion, BRegion& exposeRegion); 318cc93fbbbSAxel Dörfler void _SetBackground(BRegion& background); 319cc93fbbbSAxel Dörfler 320cc93fbbbSAxel Dörfler status_t _ActivateApp(team_id team); 321cc93fbbbSAxel Dörfler 32278ca6157SAxel Dörfler void _SuspendDirectFrameBufferAccess(); 32378ca6157SAxel Dörfler void _ResumeDirectFrameBufferAccess(); 32478ca6157SAxel Dörfler 325cc93fbbbSAxel Dörfler void _ScreenChanged(Screen* screen); 326cc93fbbbSAxel Dörfler void _SetCurrentWorkspaceConfiguration(); 32747212dddSAxel Dörfler void _SetWorkspace(int32 index, 32847212dddSAxel Dörfler bool moveFocusWindow = false); 329e83820edSAxel Dörfler 3305f2edc0fSAxel Dörfler private: 331ef8810f2SAxel Dörfler friend class DesktopSettings; 332a17c3a48SAxel Dörfler friend class LockedDesktopSettings; 333ef8810f2SAxel Dörfler 33436deda69SAxel Dörfler uid_t fUserID; 335d65593aaSMichael Lotz char* fTargetScreen; 336fd5bec1eSAxel Dörfler ::VirtualScreen fVirtualScreen; 337d99d8dbdSX512 ObjectDeleter<DesktopSettingsPrivate> 338d99d8dbdSX512 fSettings; 3395f2edc0fSAxel Dörfler port_id fMessagePort; 340f7598223SAxel Dörfler ::EventDispatcher fEventDispatcher; 3416d5488e1SAxel Dörfler area_id fSharedReadOnlyArea; 3426d5488e1SAxel Dörfler server_read_only_memory* fServerReadOnlyMemory; 343770c05d6SAxel Dörfler 344e83820edSAxel Dörfler BLocker fApplicationsLock; 345e83820edSAxel Dörfler BObjectList<ServerApp> fApplications; 346770c05d6SAxel Dörfler 347770c05d6SAxel Dörfler sem_id fShutdownSemaphore; 348770c05d6SAxel Dörfler int32 fShutdownCount; 349770c05d6SAxel Dörfler 35082081c70SJérôme Duval ::Workspace::Private fWorkspaces[kMaxWorkspaces]; 35178ca6157SAxel Dörfler MultiLocker fScreenLock; 3529fe35223SAxel Dörfler BLocker fDirectScreenLock; 3539fe35223SAxel Dörfler team_id fDirectScreenTeam; 35427adb969SAxel Dörfler int32 fCurrentWorkspace; 3554932bc5eSAxel Dörfler int32 fPreviousWorkspace; 35627adb969SAxel Dörfler 357e83820edSAxel Dörfler WindowList fAllWindows; 35834227d2cSAxel Dörfler WindowList fSubsetWindows; 359d01879e5SAxel Dörfler WindowList fFocusList; 3600b63cc93SAxel Dörfler Window* fLastWorkspaceFocus[kMaxWorkspaces]; 361d8ebe612SAxel Dörfler 362953d895eSAxel Dörfler BObjectList<WorkspacesView> fWorkspacesViews; 363d8ebe612SAxel Dörfler BLocker fWorkspacesLock; 36433bbe223SAxel Dörfler 3653ddebe7eSMichael Lotz CursorManager fCursorManager; 3668689fe06SIngo Weinhold ServerCursorReference fCursor; 3678689fe06SIngo Weinhold ServerCursorReference fManagementCursor; 368e83820edSAxel Dörfler 369e83820edSAxel Dörfler MultiLocker fWindowLock; 370e83820edSAxel Dörfler 371e83820edSAxel Dörfler BRegion fBackgroundRegion; 372e83820edSAxel Dörfler BRegion fScreenRegion; 373e83820edSAxel Dörfler 374953d895eSAxel Dörfler Window* fMouseEventWindow; 375953d895eSAxel Dörfler const Window* fWindowUnderMouse; 37621b40eddSStephan Aßmus const Window* fLockedFocusWindow; 3771e766d46SAxel Dörfler int32 fViewUnderMouse; 3784d1c4228SStephan Aßmus BPoint fLastMousePosition; 3794d1c4228SStephan Aßmus int32 fLastMouseButtons; 3801e766d46SAxel Dörfler 381953d895eSAxel Dörfler Window* fFocus; 382953d895eSAxel Dörfler Window* fFront; 383953d895eSAxel Dörfler Window* fBack; 3846a0ed7daSClemens Zeidler 3856a0ed7daSClemens Zeidler StackAndTile fStackAndTile; 3867f9368caSlooncraz 3877f9368caSlooncraz BMessage fPendingColors; 38833bbe223SAxel Dörfler }; 38933bbe223SAxel Dörfler 39027adb969SAxel Dörfler #endif // DESKTOP_H 391