diff --git a/src/servers/app/AppServer.cpp b/src/servers/app/AppServer.cpp index 19a6817c7e..a45773b547 100644 --- a/src/servers/app/AppServer.cpp +++ b/src/servers/app/AppServer.cpp @@ -33,6 +33,7 @@ #include "RootLayer.h" #include "ScreenManager.h" #include "ServerApp.h" +#include "ServerConfig.h" #include "ServerCursor.h" #include "ServerProtocol.h" #include "ServerWindow.h" @@ -77,9 +78,6 @@ ColorSet gGUIColorSet; */ AppServer::AppServer() : MessageLooper("app_server"), -#if TEST_MODE - BApplication(SERVER_SIGNATURE), -#endif fCursorSem(-1), fCursorArea(-1) { diff --git a/src/servers/app/AppServer.h b/src/servers/app/AppServer.h index de500c600e..c8a5be4c61 100644 --- a/src/servers/app/AppServer.h +++ b/src/servers/app/AppServer.h @@ -14,7 +14,6 @@ #include #include #include - #include "ServerConfig.h" #include "MessageLooper.h" @@ -35,12 +34,7 @@ namespace BPrivate { and initializes most of the server's globals. */ -class AppServer : - public MessageLooper -#if TEST_MODE - , public BApplication -#endif -{ +class AppServer : public MessageLooper { public: AppServer(); virtual ~AppServer(); diff --git a/src/servers/app/Jamfile b/src/servers/app/Jamfile index 1551aedd22..381ac90cf8 100644 --- a/src/servers/app/Jamfile +++ b/src/servers/app/Jamfile @@ -13,6 +13,12 @@ UseFreeTypeHeaders ; SEARCH_SOURCE += [ FDirName $(SUBDIR) drawing ] ; +HWINTERFACE_SOURCES = + BBitmapBuffer.cpp + HWInterface.cpp + MultiLocker.cpp +; + if ( $(TARGET_PLATFORM) = haiku ) { # This overrides the definitions in private/servers/app/ServerConfig.h defines = [ FDefines TEST_MODE=0 ] ; @@ -20,27 +26,23 @@ if ( $(TARGET_PLATFORM) = haiku ) { SubDirCcFlags $(defines) ; SubDirC++Flags $(defines) ; - VIEW_DRIVER_SOURCES = - AccelerantBuffer.cpp - AccelerantHWInterface.cpp - BitmapBuffer.cpp - DisplayDriverPainter.cpp - HWInterface.cpp - MallocBuffer.cpp - UpdateQueue.cpp - ; } else { - VIEW_DRIVER_SOURCES = + SharedLibrary hwinterface : + $(HWINTERFACE_SOURCES) + ; + + LINKFLAGS on libhwinterfaceimpl.so ?= $(LINKFLAGS) ; + LINKFLAGS on libhwinterfaceimpl.so += -lbe ; + + SharedLibrary hwinterfaceimpl : fake_input_server.cpp - BitmapBuffer.cpp - AccelerantBuffer.cpp - AccelerantHWInterface.cpp - DisplayDriverPainter.cpp - HWInterface.cpp - MallocBuffer.cpp - UpdateQueue.cpp ViewHWInterface.cpp - ; + : libopenbeos.so libhwinterface.so + ; + + # make this empty, because it is already in the hwinterfaceimpl lib + # and therefore does not need to be included in app_server anymore + HWINTERFACE_SOURCES = ; } SharedLibrary appserver : @@ -72,7 +74,6 @@ Server app_server : # Misc. Sources DebugInfoManager.cpp SubWindowList.cpp - MultiLocker.cpp PicturePlayer.cpp PNGDump.cpp RAMLinkMsgReader.cpp @@ -91,10 +92,16 @@ Server app_server : ServerWindow.cpp # DisplayDriver Classes - $(VIEW_DRIVER_SOURCES) + AccelerantBuffer.cpp + AccelerantHWInterface.cpp + BitmapBuffer.cpp + DisplayDriverPainter.cpp + MallocBuffer.cpp + UpdateQueue.cpp + # this will be empty when compiling for R5 + $(HWINTERFACE_SOURCES) VirtualScreen.cpp - BBitmapBuffer.cpp BitmapHWInterface.cpp DefaultDecorator.cpp Layer.cpp @@ -124,17 +131,18 @@ if $(TARGET_PLATFORM) = haiku { } else { # link as test application under R5 - LINKFLAGS on app_server ?= $(LINKFLAGS) ; - LINKFLAGS on app_server += -lbe ; + LinkSharedOSLibs libhwinterface.so : + libappserver.so libopenbeos.so ; LinkSharedOSLibs libappserver.so : - root be libopenbeos.so - textencoding libfreetype.so ; + libopenbeos.so + libtextencoding.so libfreetype.so ; LinkSharedOSLibs app_server : - root be game translation libz.so libpng.so libappserver.so + libz.so libpng.so libappserver.so libpainter.a libopenbeos.so - libagg.a libfreetype.so textencoding ; + libhwinterface.so libhwinterfaceimpl.so + libagg.a libfreetype.so libtextencoding.so ; } SubInclude OBOS_TOP src servers app drawing Painter ; diff --git a/src/servers/app/drawing/ViewHWInterface.cpp b/src/servers/app/drawing/ViewHWInterface.cpp index f7e1e610e8..6a7aaee902 100644 --- a/src/servers/app/drawing/ViewHWInterface.cpp +++ b/src/servers/app/drawing/ViewHWInterface.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -92,6 +93,18 @@ string_for_color_space(color_space format) return name; } +// run_app_thread +static int32 +run_app_thread(void* cookie) +{ + if (BApplication* app = (BApplication*)cookie) { + app->Lock(); + app->Run(); + } + return 0; +} + + //#define INPUTSERVER_TEST_MODE 1 class CardView : public BView { @@ -384,6 +397,8 @@ ViewHWInterface::~ViewHWInterface() delete fBackBuffer; delete fFrontBuffer; + + delete be_app; } // Initialize @@ -443,6 +458,23 @@ ViewHWInterface::SetMode(const display_mode &mode) // create the window if we don't have one already if (!fWindow) { + // if the window has not been created yet, the BApplication + // has not been created either, but we need one to display + // a real BWindow in the test environment. + // be_app->Run() needs to be called in another thread + BApplication* app = new BApplication("application/x-vnd.haiku-app-server"); + app->Unlock(); + + thread_id appThread = spawn_thread(run_app_thread, "app thread", + B_NORMAL_PRIORITY, app); + if (appThread >= B_OK) + ret = resume_thread(appThread); + else + ret = appThread; + + if (ret < B_OK) + return ret; + fWindow = new CardWindow(frame.OffsetToCopy(BPoint(50.0, 50.0))); // fire up the window thread but don't show it on screen yet