diff --git a/src/servers/app/server/DesktopClasses.cpp b/src/servers/app/server/DesktopClasses.cpp index a3f4919af2..6ae8afa787 100644 --- a/src/servers/app/server/DesktopClasses.cpp +++ b/src/servers/app/server/DesktopClasses.cpp @@ -34,13 +34,15 @@ extern RGBColor workspace_default_color; \brief Sets up internal variables needed by the Workspace \param gcinfo The graphics card info \param fbinfo The frame buffer info + \param gfxdriver DisplayDriver for the associated RootLayer */ -Workspace::Workspace(const graphics_card_info &gcinfo, const frame_buffer_info &fbinfo) +Workspace::Workspace(const graphics_card_info &gcinfo, const frame_buffer_info &fbinfo, DisplayDriver *gfxdriver) { _gcinfo=gcinfo; _fbinfo=fbinfo; - _rootlayer=new RootLayer(BRect(0,0,fbinfo.display_width-1,fbinfo.display_height-1), "Workspace Root"); + _rootlayer=new RootLayer(BRect(0,0,fbinfo.display_width-1,fbinfo.display_height-1), + "Workspace Root",gfxdriver); _rootlayer->SetColor(workspace_default_color); } @@ -150,7 +152,7 @@ Screen::Screen(DisplayDriver *gfxmodule, uint8 workspaces) _workspacecount = workspaces; for (int i=0; iAddItem(new Workspace(_gcinfo,_fbinfo)); + _workspacelist->AddItem(new Workspace(_gcinfo,_fbinfo,_driver)); } _resolution=_driver->GetMode(); _currentworkspace=0; @@ -183,7 +185,7 @@ Screen::~Screen(void) */ void Screen::AddWorkspace(int32 index) { - Workspace *workspace = new Workspace(_gcinfo,_fbinfo); + Workspace *workspace = new Workspace(_gcinfo,_fbinfo,_driver); if ( (index == -1) || !_workspacelist->AddItem(workspace,index) ) _workspacelist->AddItem(workspace); } diff --git a/src/servers/app/server/DesktopClasses.h b/src/servers/app/server/DesktopClasses.h index ea543fd402..812087b2fa 100644 --- a/src/servers/app/server/DesktopClasses.h +++ b/src/servers/app/server/DesktopClasses.h @@ -40,7 +40,7 @@ class RGBColor; class Workspace { public: - Workspace(const graphics_card_info &gcinfo, const frame_buffer_info &fbinfo); + Workspace(const graphics_card_info &gcinfo, const frame_buffer_info &fbinfo, DisplayDriver *gfxdriver); ~Workspace(void); void SetBGColor(const RGBColor &c); RGBColor BGColor(); diff --git a/src/servers/app/server/Jamfile b/src/servers/app/server/Jamfile index 70cc2a0279..cd0fb0785f 100644 --- a/src/servers/app/server/Jamfile +++ b/src/servers/app/server/Jamfile @@ -45,7 +45,11 @@ Server app_server : ViewDriver.cpp WinBorder.cpp ; -LinkSharedOSLibs app_server : be root game translation + +LINKFLAGS on app_server ?= $(LINKFLAGS) ; +LINKFLAGS on app_server += -lbe ; + +LinkSharedOSLibs app_server : root game translation libopenbeos.so libfreetype.so ; diff --git a/src/servers/app/server/RootLayer.cpp b/src/servers/app/server/RootLayer.cpp index 86147f1b6c..e81e591693 100644 --- a/src/servers/app/server/RootLayer.cpp +++ b/src/servers/app/server/RootLayer.cpp @@ -31,20 +31,19 @@ /*! \brief Sets up internal variables needed by the RootLayer - \param frame - \param name + \param rect Frame of the root layer + \param layername Name of the root layer. Not really used. + \param gfxdriver Pointer to the related graphics driver */ -RootLayer::RootLayer(BRect rect, const char *layername) +RootLayer::RootLayer(BRect rect, const char *layername, DisplayDriver *gfxdriver) : Layer(rect,layername,B_FOLLOW_NONE,0, NULL) { - _driver=GetGfxDriver(); + _driver=gfxdriver; _invalid=new BRegion(Bounds()); _is_dirty=true; } -/*! - \brief Frees all allocated heap memory (which happens to be none) ;) -*/ +//! Frees all allocated heap memory (which happens to be none) ;) RootLayer::~RootLayer() { } diff --git a/src/servers/app/server/RootLayer.h b/src/servers/app/server/RootLayer.h index 8f445f0db8..f60f694c82 100644 --- a/src/servers/app/server/RootLayer.h +++ b/src/servers/app/server/RootLayer.h @@ -34,7 +34,7 @@ class RootLayer : public Layer { public: - RootLayer(BRect rect, const char *layername); + RootLayer(BRect rect, const char *layername, DisplayDriver *gfxdriver); ~RootLayer(); void RequestDraw(); void RequestDraw(const BRect &r); diff --git a/src/servers/app/server/ViewDriver.cpp b/src/servers/app/server/ViewDriver.cpp index b28f394052..906e1304d9 100644 --- a/src/servers/app/server/ViewDriver.cpp +++ b/src/servers/app/server/ViewDriver.cpp @@ -25,8 +25,6 @@ // //------------------------------------------------------------------------------ -// TODO: Update this to have GetMode, GetWidth, etc return the proper values - #include #include #include @@ -65,7 +63,7 @@ VDView::VDView(BRect bounds) : BView(bounds,"viewdriver_view",B_FOLLOW_ALL, B_WILL_DRAW) { SetViewColor(B_TRANSPARENT_32_BIT); - viewbmp=new BBitmap(bounds,B_RGB32,true); + viewbmp=new BBitmap(bounds,B_CMAP8,true); // This link for sending mouse messages to the OBAppServer. // This is only to take the place of the Input Server. I suppose I could write @@ -74,7 +72,7 @@ VDView::VDView(BRect bounds) serverlink=new PortLink(find_port(SERVER_INPUT_PORT)); // Create a cursor which isn't just a box - cursor=new BBitmap(BRect(0,0,20,20),B_RGBA32,true); + cursor=new BBitmap(BRect(0,0,20,20),B_CMAP8,true); BView *v=new BView(cursor->Bounds(),"v", B_FOLLOW_NONE, B_WILL_DRAW); hide_cursor=0; @@ -333,6 +331,10 @@ ViewDriver::ViewDriver(void) framebuffer=screenwin->view->viewbmp; serverlink=screenwin->view->serverlink; hide_cursor=0; + _SetWidth(640); + _SetHeight(480); + _SetDepth(8); + _SetMode(B_8_BIT_640x480); } ViewDriver::~ViewDriver(void) @@ -374,7 +376,7 @@ void ViewDriver::SetMode(int32 space) { screenwin->Lock(); int16 w=640,h=480; - color_space s; + color_space s=B_CMAP8; switch(space) { @@ -403,24 +405,33 @@ void ViewDriver::SetMode(int32 space) case B_32_BIT_800x600: case B_32_BIT_1024x768: s=B_RGBA32; + _SetDepth(32); break; case B_16_BIT_640x480: case B_16_BIT_800x600: case B_16_BIT_1024x768: s=B_RGBA15; + _SetDepth(15); break; case B_8_BIT_640x480: case B_8_BIT_800x600: case B_8_BIT_1024x768: s=B_CMAP8; + _SetDepth(8); break; default: + _SetDepth(8); break; } delete framebuffer; - + + // don't forget to update the internal vars! + _SetWidth(w); + _SetHeight(h); + _SetMode(space); + screenwin->view->viewbmp=new BBitmap(BRect(0,0,w-1,h-1),s,true); framebuffer=screenwin->view->viewbmp; drawview=new BView(framebuffer->Bounds(),"drawview",B_FOLLOW_ALL, B_WILL_DRAW); @@ -431,6 +442,8 @@ void ViewDriver::SetMode(int32 space) drawview->FillRect(drawview->Bounds()); drawview->Sync(); framebuffer->Unlock(); + + _SetBytesPerRow(framebuffer->BytesPerRow()); screenwin->view->Invalidate(); screenwin->Unlock(); }