1 /* 2 * Copyright 2001-2005, Haiku. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Adrian Oanca <adioanca@cotty.iren.ro> 7 * Stephan Aßmus <superstippi@gmx.de> 8 * Axel Dörfler, axeld@pinc-software.de 9 */ 10 #ifndef _DESKTOP_H_ 11 #define _DESKTOP_H_ 12 13 14 #include "CursorManager.h" 15 #include "EventDispatcher.h" 16 #include "ScreenManager.h" 17 #include "ServerScreen.h" 18 #include "VirtualScreen.h" 19 #include "DesktopSettings.h" 20 #include "MessageLooper.h" 21 22 #include <InterfaceDefs.h> 23 #include <List.h> 24 #include <Locker.h> 25 #include <Menu.h> 26 #include <Autolock.h> 27 #include <ObjectList.h> 28 29 30 class BMessage; 31 32 class DrawingEngine; 33 class HWInterface; 34 class Layer; 35 class RootLayer; 36 class WindowLayer; 37 38 namespace BPrivate { 39 class LinkSender; 40 }; 41 42 43 class Desktop : public MessageLooper, public ScreenOwner { 44 public: 45 // startup methods 46 Desktop(uid_t userID); 47 virtual ~Desktop(); 48 49 void Init(); 50 51 uid_t UserID() const { return fUserID; } 52 virtual port_id MessagePort() const { return fMessagePort; } 53 54 ::EventDispatcher& EventDispatcher() { return fEventDispatcher; } 55 56 void BroadcastToAllApps(int32 code); 57 58 // Methods for multiple monitors. 59 inline Screen* ScreenAt(int32 index) const 60 { return fActiveScreen; } 61 inline Screen* ActiveScreen() const 62 { return fActiveScreen; } 63 inline ::RootLayer* RootLayer() const { return fRootLayer; } 64 inline CursorManager& GetCursorManager() { return fCursorManager; } 65 66 void ScreenChanged(Screen* screen); 67 68 virtual void ScreenRemoved(Screen* screen) {} 69 virtual void ScreenAdded(Screen* screen) {} 70 virtual bool ReleaseScreen(Screen* screen) { return false; } 71 72 const ::VirtualScreen& VirtualScreen() const { return fVirtualScreen; } 73 inline DrawingEngine* GetDrawingEngine() const 74 { return fVirtualScreen.DrawingEngine(); } 75 inline ::HWInterface* HWInterface() const 76 { return fVirtualScreen.HWInterface(); } 77 78 // Methods for layer(WindowLayer) manipulation. 79 void AddWindowLayer(WindowLayer *winBorder); 80 void RemoveWindowLayer(WindowLayer *winBorder); 81 void SetWindowLayerFeel(WindowLayer *winBorder, 82 uint32 feel); 83 void AddWindowLayerToSubset(WindowLayer *winBorder, 84 WindowLayer *toWindowLayer); 85 void RemoveWindowLayerFromSubset(WindowLayer *winBorder, 86 WindowLayer *fromWindowLayer); 87 88 WindowLayer* FindWindowLayerByClientToken(int32 token, team_id teamID); 89 //WindowLayer* FindWindowLayerByServerToken(int32 token); 90 91 // get list of registed windows 92 const BObjectList<WindowLayer>& WindowList() const; 93 94 void WriteWindowList(team_id team, BPrivate::LinkSender& sender); 95 void WriteWindowInfo(int32 serverToken, BPrivate::LinkSender& sender); 96 97 private: 98 status_t _ActivateApp(team_id team); 99 virtual void _GetLooperName(char* name, size_t size); 100 virtual void _PrepareQuit(); 101 virtual void _DispatchMessage(int32 code, BPrivate::LinkReceiver &link); 102 103 private: 104 friend class DesktopSettings; 105 106 uid_t fUserID; 107 ::VirtualScreen fVirtualScreen; 108 DesktopSettings::Private* fSettings; 109 port_id fMessagePort; 110 ::EventDispatcher fEventDispatcher; 111 port_id fInputPort; 112 113 BLocker fAppListLock; 114 BList fAppList; 115 116 sem_id fShutdownSemaphore; 117 int32 fShutdownCount; 118 119 BObjectList<WindowLayer> fWindowLayerList; 120 121 ::RootLayer* fRootLayer; 122 Screen* fActiveScreen; 123 124 CursorManager fCursorManager; 125 }; 126 127 #endif // _DESKTOP_H_ 128