Beispiel #1
0
static DFBResult
primaryFlipRegion( CoreLayer             *layer,
                   void                  *driver_data,
                   void                  *layer_data,
                   void                  *region_data,
                   CoreSurface           *surface,
                   DFBSurfaceFlipFlags    flags,
                   CoreSurfaceBufferLock *lock )
{
     DFBX11    *x11    = driver_data;
     DFBRegion  region = DFB_REGION_INIT_FROM_DIMENSION( &surface->config.size );

     dfb_surface_flip( surface, false );

     return dfb_x11_update_screen( x11, &region, lock );
}
Beispiel #2
0
static DFBResult
primaryUpdateRegion( CoreLayer             *layer,
                     void                  *driver_data,
                     void                  *layer_data,
                     void                  *region_data,
                     CoreSurface           *surface,
                     const DFBRegion       *update,
                     CoreSurfaceBufferLock *lock )
{
     DFBX11    *x11    = driver_data;
     DFBRegion  region = DFB_REGION_INIT_FROM_DIMENSION( &surface->config.size );

     if (update && !dfb_region_region_intersect( &region, update ))
          return DFB_OK;

     return dfb_x11_update_screen( x11, &region, lock );
}
Beispiel #3
0
static DFBResult
primaryFlipRegion( CoreLayer             *layer,
                   void                  *driver_data,
                   void                  *layer_data,
                   void                  *region_data,
                   CoreSurface           *surface,
                   DFBSurfaceFlipFlags    flags,
                   CoreSurfaceBufferLock *lock )
{
     DFBX11       *x11 = driver_data;
     X11LayerData *lds = layer_data;

     DFBRegion  region = DFB_REGION_INIT_FROM_DIMENSION( &surface->config.size );

     D_DEBUG_AT( X11_Layer, "%s()\n", __FUNCTION__ );

     if (x11->shared->x_error)
          return DFB_FAILURE;

     dfb_surface_flip( surface, false );

     return dfb_x11_update_screen( x11, lds, &region, lock );
}
Beispiel #4
0
static DFBResult
primaryUpdateRegion( CoreLayer             *layer,
                     void                  *driver_data,
                     void                  *layer_data,
                     void                  *region_data,
                     CoreSurface           *surface,
                     const DFBRegion       *update,
                     CoreSurfaceBufferLock *lock )
{
     DFBX11       *x11 = driver_data;
     X11LayerData *lds = layer_data;

     DFBRegion  region = DFB_REGION_INIT_FROM_DIMENSION( &surface->config.size );

     D_DEBUG_AT( X11_Layer, "%s()\n", __FUNCTION__ );

     if (x11->shared->x_error)
          return DFB_FAILURE;

     if (update && !dfb_region_region_intersect( &region, update ))
          return DFB_OK;

     return dfb_x11_update_screen( x11, lds, &region, lock );
}
Beispiel #5
0
static void
handle_expose_Async( void *ctx,
                     void *ctx2 )
{
     DFBX11                  *x11    = ctx;
     DFBX11Shared            *shared = x11->shared;
     const XExposeEvent      *expose = ctx2;
     CoreLayer               *layer;
     CoreLayerContext        *context;
     int                      i;
     X11LayerData            *lds;

     D_DEBUG_AT( X11_Input, "%s( %d,%d-%dx%d )\n", __FUNCTION__, expose->x, expose->y, expose->width, expose->height );

     //D_INFO_LINE_MSG("handle_expose %d,%d-%dx%d", expose->x, expose->y, expose->width, expose->height);

     /* find the correct layer */
     for (i=0; i<shared->outputs; i++) {
          if (shared->output[i].xw && (shared->output[i].xw->window == expose->window))
               break;
     }

     /* layer not found? */
     if (i == shared->outputs)
          return;

     lds = shared->output[i].layers[0];

     layer = dfb_layer_at( lds->layer_id );
     D_ASSERT( layer != NULL );

     /* Get the currently active context. */
     if (dfb_layer_get_active_context( layer, &context ) == DFB_OK) {
          CoreLayerRegion *region;

          /* Get the first region. */
          if (dfb_layer_context_get_primary_region( context, false, &region ) == DFB_OK) {
               /* Lock the region. */
               dfb_layer_region_lock( region );

               /* Get the surface of the region. */
               if (region->surface && D_FLAGS_ARE_SET( region->state, CLRSF_REALIZED )) {
                    if (dfb_config->task_manager) {
                         DFBRegion update = { expose->x, expose->y,
                                              expose->x + expose->width  - 1,
                                              expose->y + expose->height - 1 };

                         /* Tell the driver about the update if the region is realized. */
                         D_DEBUG_AT( X11_Input, "  -> Issuing display task...\n" );

                         dfb_surface_lock( region->surface );

                         DisplayTask_Generate( region, &update, &update, DSFLIP_NONE, -1, NULL );

                         dfb_surface_unlock( region->surface );
                    }
                    else {
                         //if (lds->lock_left.buffer) {
                              DFBRegion update = { expose->x, expose->y,
                                                   expose->x + expose->width  - 1,
                                                   expose->y + expose->height - 1 };

                         //     dfb_x11_update_screen( x11, lds, &update, &update, &lds->lock_left, &lds->lock_right );
                         //}
                         dfb_x11_update_screen( x11, lds, &update, &update, NULL, NULL );
                    }
               }

               /* Unlock the region. */
               dfb_layer_region_unlock( region );

               /* Release the region. */
               dfb_layer_region_unref( region );
          }

          /* Release the context. */
          dfb_layer_context_unref( context );
     }
}