diff --git a/src/servers/app/server/Desktop.cpp b/src/servers/app/server/Desktop.cpp index 9fac059b74..54be22c1a2 100644 --- a/src/servers/app/server/Desktop.cpp +++ b/src/servers/app/server/Desktop.cpp @@ -234,18 +234,38 @@ int32 CountWorkspaces(void) set by BeOS. Making the limit higher will cause unreachable workspaces because of the API interface used to access them. Were this to change, the only limiting factor for workspace count would be the hardware itself. + */ void SetWorkspaceCount(int32 count) { + if(count<1 || count>32) + return; + lock_workspaces(); + Screen *scr; + for(int32 i=0;iCountItems();i++) + { + scr=(Screen*)desktop_private::screenlist->ItemAt(i); + if(!scr) + continue; + scr->SetWorkspaceCount(count); + } + unlock_workspaces(); } /*! \brief Returns the index of the active workspace - \return the index of the active workspace + \return the index of the active workspace or -1 if an internal error occurred. */ int32 CurrentWorkspace(void) { - return 0; + lock_workspaces(); + int32 id=-1; + + if(desktop_private::activescreen) + id=desktop_private::activescreen->CurrentWorkspace(); + unlock_workspaces(); + + return id; } /*! @@ -253,10 +273,12 @@ int32 CurrentWorkspace(void) */ Workspace *WorkspaceAt(int32 index) { + lock_workspaces(); + Workspace *w=NULL; if(desktop_private::activescreen) - return desktop_private::activescreen->GetWorkspace(index); - - return NULL; + w=desktop_private::activescreen->GetWorkspace(index); + unlock_workspaces(); + return w; } /*! @@ -268,6 +290,22 @@ Workspace *WorkspaceAt(int32 index) */ void SetWorkspace(int32 workspace) { + lock_workspaces(); + if(workspace<0 || workspace>(CountWorkspaces()-1)) + { + unlock_workspaces(); + return; + } + + Screen *scr; + for(int32 i=0;iCountItems();i++) + { + scr=(Screen*)desktop_private::screenlist->ItemAt(i); + if(!scr) + continue; + scr->SetWorkspace(workspace); + } + unlock_workspaces(); } /*! @@ -276,6 +314,19 @@ void SetWorkspace(int32 workspace) */ void SetScreen(screen_id id) { + Screen *scr; + for(int32 i=0;iCountItems();i++) + { + scr=(Screen*)desktop_private::screenlist->ItemAt(i); + if(!scr) + continue; + if(scr->GetID().id==id.id) + { + desktop_private::activescreen->Activate(false); + desktop_private::activescreen=scr; + desktop_private::activescreen->Activate(true); + } + } } /*! @@ -284,7 +335,7 @@ void SetScreen(screen_id id) */ int32 CountScreens(void) { - return 0; + return desktop_private::screenlist->CountItems();; } /*! @@ -293,7 +344,7 @@ int32 CountScreens(void) */ screen_id ActiveScreen(void) { - return B_MAIN_SCREEN_ID; + return desktop_private::activescreen->GetID(); } /*! @@ -355,13 +406,13 @@ void AddWindowToDesktop(ServerWindow *win, int32 workspace=B_CURRENT_WORKSPACE, */ void RemoveWindowFromDesktop(ServerWindow *win) { - desktop_private::workspacelock.Lock(); - desktop_private::layerlock.Lock(); + lock_workspaces(); + lock_layers(); win->SetWorkspace(NULL); - desktop_private::layerlock.Unlock(); - desktop_private::workspacelock.Unlock(); + unlock_layers(); + unlock_workspaces(); } /*! @@ -370,9 +421,9 @@ void RemoveWindowFromDesktop(ServerWindow *win) */ ServerWindow *GetActiveWindow(void) { - desktop_private::workspacelock.Lock(); + lock_workspaces(); ServerWindow *w=desktop_private::activescreen->ActiveWindow(); - desktop_private::workspacelock.Unlock(); + unlock_workspaces(); return w; } @@ -385,7 +436,7 @@ ServerWindow *GetActiveWindow(void) */ void SetActiveWindow(ServerWindow *win) { - desktop_private::workspacelock.Lock(); + lock_workspaces(); Workspace *w=desktop_private::activescreen->GetActiveWorkspace(); if(win->GetWorkspace()!=w) { @@ -396,8 +447,7 @@ void SetActiveWindow(ServerWindow *win) ServerWindow *oldwin=desktop_private::activescreen->ActiveWindow(); ActivateWindow(oldwin,win); - - desktop_private::workspacelock.Unlock(); + unlock_workspaces(); } /*! @@ -408,9 +458,11 @@ void SetActiveWindow(ServerWindow *win) */ Layer *GetRootLayer(int32 workspace=B_CURRENT_WORKSPACE, screen_id screen=B_MAIN_SCREEN_ID) { - desktop_private::workspacelock.Lock(); + lock_workspaces(); + lock_layers(); Layer *r=desktop_private::activescreen->GetRootLayer(); - desktop_private::workspacelock.Unlock(); + unlock_layers(); + unlock_workspaces(); return r; } @@ -429,7 +481,7 @@ Layer *GetRootLayer(int32 workspace=B_CURRENT_WORKSPACE, screen_id screen=B_MAIN */ void set_drag_message(int32 size, int8 *flattened) { - desktop_private::draglock.Lock(); + lock_dragdata(); if(desktop_private::dragmessage) { @@ -439,7 +491,7 @@ void set_drag_message(int32 size, int8 *flattened) desktop_private::dragmessage=flattened; desktop_private::dragmessagesize=size; - desktop_private::draglock.Unlock(); + unlock_dragdata(); } /*! @@ -456,27 +508,27 @@ int8 *get_drag_message(int32 *size) { int8 *ptr=NULL; - desktop_private::draglock.Lock(); + lock_dragdata(); if(desktop_private::dragmessage) { ptr=desktop_private::dragmessage; *size=desktop_private::dragmessagesize; } - desktop_private::draglock.Unlock(); + unlock_dragdata(); return ptr; } //! Empties current drag data and allows for new data to be assigned void empty_drag_message(void) { - desktop_private::draglock.Lock(); + lock_dragdata(); if(desktop_private::dragmessage) delete desktop_private::dragmessage; desktop_private::dragmessage=NULL; desktop_private::dragmessagesize=0; - desktop_private::draglock.Unlock(); + unlock_dragdata(); } diff --git a/src/servers/app/server/DesktopClasses.cpp b/src/servers/app/server/DesktopClasses.cpp index e9e53b76be..e27db8762c 100644 --- a/src/servers/app/server/DesktopClasses.cpp +++ b/src/servers/app/server/DesktopClasses.cpp @@ -145,7 +145,7 @@ Screen::Screen(DisplayDriver *gfxmodule, uint8 workspaces) _workspacecount=0; _init=false; _active=false; - _id=screen_id_handler.GetToken(); + _id.id=screen_id_handler.GetToken(); if (_driver) { diff --git a/src/servers/app/server/DesktopClasses.h b/src/servers/app/server/DesktopClasses.h index cd66045f99..8e851156ff 100644 --- a/src/servers/app/server/DesktopClasses.h +++ b/src/servers/app/server/DesktopClasses.h @@ -95,7 +95,7 @@ public: Workspace *GetWorkspace(int32 index); Workspace *GetActiveWorkspace(void); //! Returns the unique identifier for the screen - int32 GetID(void) { return _id; } + screen_id GetID(void) { return _id; } protected: int32 _resolution; ServerWindow *_activewin; @@ -107,7 +107,7 @@ protected: Workspace *_activeworkspace; graphics_card_info _gcinfo; frame_buffer_info _fbinfo; - int32 _id; + screen_id _id; }; #endif