void ViewBackend::initialize() { compositor = WstCompositorCreate(); if (!compositor) return; input_handler = new WesterosViewbackendInput(backend); output_handler = new WesterosViewbackendOutput(backend); const char* nestedTargetDisplay = std::getenv("WAYLAND_DISPLAY"); if (nestedTargetDisplay) { fprintf(stderr, "ViewBackendWesteros: running as the nested compositor\n"); WstCompositorSetIsNested(compositor, true); WstCompositorSetIsRepeater(compositor, true); WstCompositorSetNestedDisplayName(compositor, nestedTargetDisplay); //Register for all the necessary callback before starting the compositor input_handler->initializeNestedInputHandler(compositor); output_handler->initializeNestedOutputHandler(compositor); const char * nestedDisplayName = WstCompositorGetDisplayName(compositor); setenv("WAYLAND_DISPLAY", nestedDisplayName, 1); } if (!WstCompositorStart(compositor)) { fprintf(stderr, "ViewBackendWesteros: failed to start the compositor: %s\n", WstCompositorGetLastErrorDetail(compositor)); WstCompositorDestroy(compositor); compositor = nullptr; delete input_handler; delete output_handler; input_handler = nullptr; output_handler = nullptr; } }
int main( int argc, char** argv) { int nRC= 0; struct sigaction sigint; const char *rendererModule= 0; const char *displayName= 0; const char *nestedDisplayName= 0; bool error= false; int len, value, width=-1, height=-1; AppCtx *appCtx= 0; WstCompositor *wctx; appCtx= initApp(); if ( !appCtx ) { printf("unable to initialize app infrastructure\n"); nRC= -1; goto exit; } wctx= WstCompositorCreate(); if ( !wctx ) { printf("unable to create compositor instance\n"); nRC= -1; goto exit; } if ( !WstCompositorSetTerminatedCallback( wctx, compositorTerminated, appCtx ) ) { error= true; goto exit; } if ( !WstCompositorSetInvalidateCallback( wctx, compositorInvalidate, appCtx ) ) { error= true; goto exit; } if ( !WstCompositorSetDispatchCallback( wctx, compositorDispatch, appCtx ) ) { error= true; goto exit; } for( int i= 1; i < argc; ++i ) { len= strlen(argv[i]); if ( (len == 10) && !strncmp( (const char*)argv[i], "--renderer", len) ) { if ( i < argc-1 ) { ++i; rendererModule= argv[i]; if ( !WstCompositorSetRendererModule( wctx, rendererModule) ) { error= true; break; } } } else if ( (len == 11) && !strncmp( (const char*)argv[i], "--framerate", len) ) { if ( i < argc-1 ) { int frameRate; ++i; frameRate= atoi(argv[i]); if ( frameRate > 0 ) { if ( !WstCompositorSetFrameRate( wctx, frameRate ) ) { error= true; break; } } } } else if ( (len == 9) && !strncmp( (const char*)argv[i], "--display", len) ) { if ( i < argc-1) { ++i; displayName= argv[i]; if ( !WstCompositorSetDisplayName( wctx, displayName) ) { error= true; break; } } } else if ( (len == 10) && !strncmp( (const char*)argv[i], "--embedded", len) ) { if ( !WstCompositorSetIsEmbedded( wctx, true) ) { error= true; break; } appCtx->isEmbedded= true; } else if ( (len == 10) && !strncmp( (const char*)argv[i], "--repeater", len) ) { if ( !WstCompositorSetIsRepeater( wctx, true) ) { error= true; break; } } else if ( (len == 8) && !strncmp( (const char*)argv[i], "--nested", len) ) { if ( !WstCompositorSetIsNested( wctx, true) ) { error= true; break; } } else if ( (len == 15) && !strncmp( (const char*)argv[i], "--nestedDisplay", len) ) { if ( i < argc-1) { ++i; nestedDisplayName= argv[i]; if ( !WstCompositorSetNestedDisplayName( wctx, nestedDisplayName) ) { error= true; break; } } } else if ( (len == 13) && !strncmp( (const char*)argv[i], "--nestedInput", len) ) { if ( !WstCompositorSetKeyboardNestedListener( wctx, &keyboardListener, NULL) ) { error= true; break; } if ( !WstCompositorSetPointerNestedListener( wctx, &pointerListener, NULL) ) { error= true; break; } } else if ( (len == 7) && !strncmp( argv[i], "--width", len) ) { if ( i+1 < argc ) { ++i; value= atoi(argv[i]); if ( value > 0 ) { width= value; } } } else if ( (len == 8) && !strncmp( argv[i], "--height", len) ) { if ( i+1 < argc ) { ++i; value= atoi(argv[i]); if ( value > 0 ) { height= value; } } } #if defined (WESTEROS_PLATFORM_EMBEDDED) else if ( (len == 14) && !strncmp( argv[i], "--enableCursor", len) ) { appCtx->showCursor= true; } #endif else if ( (len == 2) && !strncmp( (const char*)argv[i], "-?", len) ) { showUsage(); goto exit; } } if ( !error ) { #if defined (WESTEROS_PLATFORM_EMBEDDED) if ( !appCtx->showCursor ) { if ( !WstCompositorSetAllowCursorModification( wctx, true ) ) { error= true; goto exit; } } #endif if ( (width > 0) && (height > 0) ) { if ( !WstCompositorSetNestedSize( wctx, width, height) ) { error= true; goto exit; } } if ( !rendererModule ) { printf("missing renderer module: use --renderer <module>\n"); nRC= -1; goto exit; } if ( !error ) { if ( !startApp( appCtx, wctx ) ) { printf("error starting application infrastructure, continuing but expect trouble\n" ); } g_running= true; if ( !(error= !WstCompositorStart( wctx )) ) { sigint.sa_handler = signalHandler; sigemptyset(&sigint.sa_mask); sigint.sa_flags = SA_RESETHAND; sigaction(SIGINT, &sigint, NULL); while( g_running ) { usleep( 10000 ); } WstCompositorStop( wctx ); } } } exit: if ( appCtx ) { termApp( appCtx ); } if ( wctx ) { if ( error ) { const char *detail= WstCompositorGetLastErrorDetail( wctx ); printf("Compositor error: (%s)\n", detail ); } WstCompositorDestroy( wctx ); } return nRC; }