Пример #1
0
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;
    }
}
Пример #2
0
static bool initCursor( AppCtx *appCtx )
{
   bool result= false;
   unsigned char *data= 0;
   int width, height;
   int allocSize;
   unsigned int edgeColor= 0xFFE6DF11;
   unsigned int fillColor= 0x70000000;
   
   // Create a default cursor image
   width= 64;
   height= 64;
   allocSize= width*4*height;
   
   data= (unsigned char *)calloc( 1, allocSize );
   if ( !data )
   {
      printf("Unable to allocate memory for default pointer cursor - cursor disabled\n");
      goto exit;
   }

   drawLine( data, width, height, 0, 0, 0, 43, edgeColor, 3 );   
   drawLine( data, width, height, 0, 0, 43, 0, edgeColor, 3 );      
   drawLine( data, width, height, 1, 43, 16, 28, edgeColor, 3 );
   drawLine( data, width, height, 43, 0, 28, 15, edgeColor, 3 );
   drawLine( data, width, height, 28, 16, 55, 43, edgeColor, 3 );
   drawLine( data, width, height, 17, 28, 44, 55, edgeColor, 3 );
   drawLine( data, width, height, 45, 54, 55, 44, edgeColor, 3 );
   
   fillShape( data, width, height, fillColor, 3 );
   
   drawLine( data, width, height, 0, 44, 2, 44, edgeColor, 1);
   drawLine( data, width, height, 0, 45, 1, 45, edgeColor, 1);

   if ( !WstCompositorSetDefaultCursor( appCtx->wctx, data, width, height, 0, 0 ) )
   {
      const char *detail= WstCompositorGetLastErrorDetail( appCtx->wctx );
      printf("Unable to set default cursor: error: (%s)\n", detail );
      goto exit;
   }
   
   appCtx->cursorReady= true;
   
   result= true;
   
exit:

   if ( data )
   {
      free( data );
   }
   
   return result;
}
Пример #3
0
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;   
}