Compare commits
	
		
			4 Commits
		
	
	
		
			wip/xwayla
			...
			wip/dnd-su
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					7947bcb0b0 | ||
| 
						 | 
					308cccc72c | ||
| 
						 | 
					074946ac0b | ||
| 
						 | 
					9688a0d7bc | 
@@ -30,7 +30,7 @@
 | 
			
		||||
typedef struct {
 | 
			
		||||
  CoglTexture2D *texture;
 | 
			
		||||
  struct gbm_bo *bo;
 | 
			
		||||
  int hot_x, hot_y;
 | 
			
		||||
  int offset_x, offset_y;
 | 
			
		||||
} MetaCursorImage;
 | 
			
		||||
 | 
			
		||||
struct _MetaCursorReference {
 | 
			
		||||
@@ -41,11 +41,11 @@ struct _MetaCursorReference {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CoglTexture *meta_cursor_reference_get_cogl_texture (MetaCursorReference *cursor,
 | 
			
		||||
                                                     int                 *hot_x,
 | 
			
		||||
                                                     int                 *hot_y);
 | 
			
		||||
                                                     int                 *offset_x,
 | 
			
		||||
                                                     int                 *offset_y);
 | 
			
		||||
 | 
			
		||||
struct gbm_bo *meta_cursor_reference_get_gbm_bo (MetaCursorReference *cursor,
 | 
			
		||||
                                                 int                 *hot_x,
 | 
			
		||||
                                                 int                 *hot_y);
 | 
			
		||||
                                                 int                 *offset_x,
 | 
			
		||||
                                                 int                 *offset_y);
 | 
			
		||||
 | 
			
		||||
#endif /* META_CURSOR_PRIVATE_H */
 | 
			
		||||
 
 | 
			
		||||
@@ -35,13 +35,21 @@
 | 
			
		||||
 | 
			
		||||
#include "meta-stage.h"
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
  CoglTexture *texture;
 | 
			
		||||
  MetaRectangle current_rect;
 | 
			
		||||
  gboolean handled_by_backend;
 | 
			
		||||
} MetaCursorLayer;
 | 
			
		||||
 | 
			
		||||
struct _MetaCursorRendererPrivate
 | 
			
		||||
{
 | 
			
		||||
  int current_x, current_y;
 | 
			
		||||
  MetaRectangle current_rect;
 | 
			
		||||
 | 
			
		||||
  MetaCursorLayer core_layer;
 | 
			
		||||
  MetaCursorLayer dnd_layer;
 | 
			
		||||
 | 
			
		||||
  MetaCursorReference *displayed_cursor;
 | 
			
		||||
  gboolean handled_by_backend;
 | 
			
		||||
};
 | 
			
		||||
typedef struct _MetaCursorRendererPrivate MetaCursorRendererPrivate;
 | 
			
		||||
 | 
			
		||||
@@ -53,18 +61,14 @@ queue_redraw (MetaCursorRenderer *renderer)
 | 
			
		||||
  MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
 | 
			
		||||
  MetaBackend *backend = meta_get_backend ();
 | 
			
		||||
  ClutterActor *stage = meta_backend_get_stage (backend);
 | 
			
		||||
  CoglTexture *texture;
 | 
			
		||||
 | 
			
		||||
  /* During early initialization, we can have no stage */
 | 
			
		||||
  if (!stage)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  if (priv->displayed_cursor && !priv->handled_by_backend)
 | 
			
		||||
    texture = meta_cursor_reference_get_cogl_texture (priv->displayed_cursor, NULL, NULL);
 | 
			
		||||
  else
 | 
			
		||||
    texture = NULL;
 | 
			
		||||
 | 
			
		||||
  meta_stage_set_cursor (META_STAGE (stage), texture, &priv->current_rect);
 | 
			
		||||
  if (priv->core_layer.texture && !priv->core_layer.handled_by_backend)
 | 
			
		||||
    meta_stage_set_cursor (META_STAGE (stage), layer->texture, &priv->current_rect);
 | 
			
		||||
  meta_stage_set_dnd_surface (META_STAGE (stage), 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
@@ -84,33 +88,68 @@ meta_cursor_renderer_init (MetaCursorRenderer *renderer)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
update_layer (MetaCursorRenderer *renderer,
 | 
			
		||||
              MetaCursorLayer    *layer,
 | 
			
		||||
              CoglTexture        *texture,
 | 
			
		||||
              int                 offset_x,
 | 
			
		||||
              int                 offset_y)
 | 
			
		||||
{
 | 
			
		||||
  MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
 | 
			
		||||
 | 
			
		||||
  layer->texture = texture;
 | 
			
		||||
 | 
			
		||||
  if (layer->texture)
 | 
			
		||||
    {
 | 
			
		||||
      layer->current_rect.x = priv->current_x + offset_x;
 | 
			
		||||
      layer->current_rect.y = priv->current_y + offset_y;
 | 
			
		||||
      layer->current_rect.width = cogl_texture_get_width (layer->texture);
 | 
			
		||||
      layer->current_rect.height = cogl_texture_get_height (layer->texture);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      layer->current_rect.x = 0;
 | 
			
		||||
      layer->current_rect.y = 0;
 | 
			
		||||
      layer->current_rect.width = 0;
 | 
			
		||||
      layer->current_rect.height = 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
update_cursor (MetaCursorRenderer *renderer)
 | 
			
		||||
{
 | 
			
		||||
  MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
 | 
			
		||||
  gboolean handled_by_backend;
 | 
			
		||||
  gboolean should_redraw = FALSE;
 | 
			
		||||
  CoglTexture *texture;
 | 
			
		||||
  int hot_x, hot_y;
 | 
			
		||||
 | 
			
		||||
  if (priv->displayed_cursor)
 | 
			
		||||
    {
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
      CoglTexture *texture;
 | 
			
		||||
      int hot_x, hot_y;
 | 
			
		||||
      int offset_x, offset_y;
 | 
			
		||||
 | 
			
		||||
      texture = meta_cursor_reference_get_cogl_texture (priv->displayed_cursor, &hot_x, &hot_y);
 | 
			
		||||
      texture = meta_cursor_reference_get_cogl_texture (priv->displayed_cursor, &offset_x, &offset_y);
 | 
			
		||||
 | 
			
		||||
      priv->current_rect.x = priv->current_x - hot_x;
 | 
			
		||||
      priv->current_rect.y = priv->current_y - hot_y;
 | 
			
		||||
      priv->current_rect.x = priv->current_x + offset_x;
 | 
			
		||||
      priv->current_rect.y = priv->current_y + offset_y;
 | 
			
		||||
      priv->current_rect.width = cogl_texture_get_width (COGL_TEXTURE (texture));
 | 
			
		||||
      priv->current_rect.height = cogl_texture_get_height (COGL_TEXTURE (texture));
 | 
			
		||||
=======
 | 
			
		||||
      texture = meta_cursor_reference_get_cogl_texture (priv->displayed_cursor, &hot_x, &hot_y);
 | 
			
		||||
>>>>>>> 75e7834... dnd 2
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      priv->current_rect.x = 0;
 | 
			
		||||
      priv->current_rect.y = 0;
 | 
			
		||||
      priv->current_rect.width = 0;
 | 
			
		||||
      priv->current_rect.height = 0;
 | 
			
		||||
      texture = NULL;
 | 
			
		||||
      hot_x = 0;
 | 
			
		||||
      hot_y = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  update_layer (renderer, &priv->core_layer, texture, hot_x, hot_y);
 | 
			
		||||
  update_layer (renderer, &priv->
 | 
			
		||||
 | 
			
		||||
  handled_by_backend = META_CURSOR_RENDERER_GET_CLASS (renderer)->update_cursor (renderer);
 | 
			
		||||
  if (handled_by_backend != priv->handled_by_backend)
 | 
			
		||||
    {
 | 
			
		||||
@@ -144,6 +183,17 @@ meta_cursor_renderer_set_cursor (MetaCursorRenderer  *renderer,
 | 
			
		||||
  update_cursor (renderer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_cursor_renderer_set_dnd_surface (MetaCursorRenderer *renderer,
 | 
			
		||||
                                      CoglTexture        *texture,
 | 
			
		||||
                                      int                 offset_x,
 | 
			
		||||
                                      int                 offset_y)
 | 
			
		||||
{
 | 
			
		||||
  MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
 | 
			
		||||
 | 
			
		||||
  update_layer (renderer, &priv->dnd_layer, 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
 | 
			
		||||
                                   int x, int y)
 | 
			
		||||
@@ -171,5 +221,5 @@ meta_cursor_renderer_get_rect (MetaCursorRenderer *renderer)
 | 
			
		||||
{
 | 
			
		||||
  MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
 | 
			
		||||
 | 
			
		||||
  return &priv->current_rect;
 | 
			
		||||
  return &priv->core_layer.current_rect;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -310,6 +310,7 @@ meta_cursor_tracker_get_hot (MetaCursorTracker *tracker,
 | 
			
		||||
                             int               *y)
 | 
			
		||||
{
 | 
			
		||||
  MetaCursorReference *cursor;
 | 
			
		||||
  int offset_x, offset_y;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (META_IS_CURSOR_TRACKER (tracker));
 | 
			
		||||
 | 
			
		||||
@@ -324,14 +325,19 @@ meta_cursor_tracker_get_hot (MetaCursorTracker *tracker,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (cursor)
 | 
			
		||||
    meta_cursor_reference_get_cogl_texture (cursor, x, y);
 | 
			
		||||
    {
 | 
			
		||||
      meta_cursor_reference_get_cogl_texture (cursor, &offset_x, &offset_y);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      if (x)
 | 
			
		||||
        *x = 0;
 | 
			
		||||
      if (y)
 | 
			
		||||
        *y = 0;
 | 
			
		||||
      offset_x = 0;
 | 
			
		||||
      offset_y = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (x)
 | 
			
		||||
    *x = -offset_x;
 | 
			
		||||
  if (y)
 | 
			
		||||
    *y = -offset_y;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
 
 | 
			
		||||
@@ -352,25 +352,25 @@ meta_cursor_reference_from_buffer (struct wl_resource *buffer,
 | 
			
		||||
 | 
			
		||||
CoglTexture *
 | 
			
		||||
meta_cursor_reference_get_cogl_texture (MetaCursorReference *cursor,
 | 
			
		||||
                                        int                 *hot_x,
 | 
			
		||||
                                        int                 *hot_y)
 | 
			
		||||
                                        int                 *offset_x,
 | 
			
		||||
                                        int                 *offset_y)
 | 
			
		||||
{
 | 
			
		||||
  if (hot_x)
 | 
			
		||||
    *hot_x = cursor->image.hot_x;
 | 
			
		||||
  if (hot_y)
 | 
			
		||||
    *hot_y = cursor->image.hot_y;
 | 
			
		||||
  if (offset_x)
 | 
			
		||||
    *offset_x = cursor->image.offset_x;
 | 
			
		||||
  if (offset_y)
 | 
			
		||||
    *offset_y = cursor->image.offset_y;
 | 
			
		||||
  return COGL_TEXTURE (cursor->image.texture);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct gbm_bo *
 | 
			
		||||
meta_cursor_reference_get_gbm_bo (MetaCursorReference *cursor,
 | 
			
		||||
                                  int                 *hot_x,
 | 
			
		||||
                                  int                 *hot_y)
 | 
			
		||||
                                  int                 *offset_x,
 | 
			
		||||
                                  int                 *offset_y)
 | 
			
		||||
{
 | 
			
		||||
  if (hot_x)
 | 
			
		||||
    *hot_x = cursor->image.hot_x;
 | 
			
		||||
  if (hot_y)
 | 
			
		||||
    *hot_y = cursor->image.hot_y;
 | 
			
		||||
  if (offset_x)
 | 
			
		||||
    *offset_x = cursor->image.offset_x;
 | 
			
		||||
  if (offset_y)
 | 
			
		||||
    *offset_y = cursor->image.offset_y;
 | 
			
		||||
  return cursor->image.bo;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -34,8 +34,7 @@ MetaCursorReference * meta_cursor_reference_from_theme  (MetaCursor          cur
 | 
			
		||||
#ifdef HAVE_WAYLAND
 | 
			
		||||
#include <wayland-server.h>
 | 
			
		||||
MetaCursorReference * meta_cursor_reference_from_buffer (struct wl_resource *buffer,
 | 
			
		||||
                                                         int                 hot_x,
 | 
			
		||||
                                                         int                 hot_y);
 | 
			
		||||
                                                         int offset_x, int offset_y);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
MetaCursor meta_cursor_reference_get_meta_cursor (MetaCursorReference *cursor);
 | 
			
		||||
 
 | 
			
		||||
@@ -40,6 +40,7 @@ typedef struct {
 | 
			
		||||
} MetaOverlay;
 | 
			
		||||
 | 
			
		||||
struct _MetaStagePrivate {
 | 
			
		||||
  MetaOverlay dnd_overlay;
 | 
			
		||||
  MetaOverlay cursor_overlay;
 | 
			
		||||
};
 | 
			
		||||
typedef struct _MetaStagePrivate MetaStagePrivate;
 | 
			
		||||
@@ -112,6 +113,7 @@ meta_stage_finalize (GObject *object)
 | 
			
		||||
  MetaStage *stage = META_STAGE (object);
 | 
			
		||||
  MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
 | 
			
		||||
 | 
			
		||||
  meta_overlay_free (&priv->dnd_overlay);
 | 
			
		||||
  meta_overlay_free (&priv->cursor_overlay);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -123,6 +125,7 @@ meta_stage_paint (ClutterActor *actor)
 | 
			
		||||
 | 
			
		||||
  CLUTTER_ACTOR_CLASS (meta_stage_parent_class)->paint (actor);
 | 
			
		||||
 | 
			
		||||
  meta_overlay_paint (&priv->dnd_overlay);
 | 
			
		||||
  meta_overlay_paint (&priv->cursor_overlay);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -142,6 +145,7 @@ meta_stage_init (MetaStage *stage)
 | 
			
		||||
{
 | 
			
		||||
  MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
 | 
			
		||||
 | 
			
		||||
  meta_overlay_init (&priv->dnd_overlay);
 | 
			
		||||
  meta_overlay_init (&priv->cursor_overlay);
 | 
			
		||||
 | 
			
		||||
  clutter_stage_set_user_resizable (CLUTTER_STAGE (stage), FALSE);
 | 
			
		||||
@@ -183,6 +187,19 @@ queue_redraw_for_overlay (MetaStage   *stage,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_stage_set_dnd_surface (MetaStage     *stage,
 | 
			
		||||
                            CoglTexture   *texture,
 | 
			
		||||
                            MetaRectangle *rect)
 | 
			
		||||
{
 | 
			
		||||
  MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
 | 
			
		||||
 | 
			
		||||
  g_assert (meta_is_wayland_compositor ());
 | 
			
		||||
 | 
			
		||||
  meta_overlay_set (&priv->dnd_overlay, texture, rect);
 | 
			
		||||
  queue_redraw_for_overlay (stage, &priv->dnd_overlay);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_stage_set_cursor (MetaStage     *stage,
 | 
			
		||||
                       CoglTexture   *texture,
 | 
			
		||||
 
 | 
			
		||||
@@ -51,9 +51,14 @@ GType             meta_stage_get_type                (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
ClutterActor     *meta_stage_new                     (void);
 | 
			
		||||
 | 
			
		||||
void meta_stage_set_dnd_surface (MetaStage     *stage,
 | 
			
		||||
                                 CoglTexture   *texture,
 | 
			
		||||
                                 MetaRectangle *rect);
 | 
			
		||||
 | 
			
		||||
void meta_stage_set_cursor (MetaStage     *stage,
 | 
			
		||||
                            CoglTexture   *texture,
 | 
			
		||||
                            MetaRectangle *rect);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* META_STAGE_H */
 | 
			
		||||
 
 | 
			
		||||
@@ -72,16 +72,16 @@ set_crtc_cursor (MetaCursorRendererNative *native,
 | 
			
		||||
      struct gbm_bo *bo;
 | 
			
		||||
      union gbm_bo_handle handle;
 | 
			
		||||
      int width, height;
 | 
			
		||||
      int hot_x, hot_y;
 | 
			
		||||
      int offset_x, offset_y;
 | 
			
		||||
 | 
			
		||||
      bo = meta_cursor_reference_get_gbm_bo (cursor, &hot_x, &hot_y);
 | 
			
		||||
      bo = meta_cursor_reference_get_gbm_bo (cursor, &offset_x, &offset_y);
 | 
			
		||||
 | 
			
		||||
      handle = gbm_bo_get_handle (bo);
 | 
			
		||||
      width = gbm_bo_get_width (bo);
 | 
			
		||||
      height = gbm_bo_get_height (bo);
 | 
			
		||||
 | 
			
		||||
      drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, handle.u32,
 | 
			
		||||
                         width, height, hot_x, hot_y);
 | 
			
		||||
                         width, height, -offset_x, -offset_y);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -426,6 +426,9 @@ commit_pending_state (MetaWaylandSurface      *surface,
 | 
			
		||||
  if (!cairo_region_is_empty (pending->damage))
 | 
			
		||||
    surface_process_damage (surface, pending->damage);
 | 
			
		||||
 | 
			
		||||
  surface->offset_x += pending->dx;
 | 
			
		||||
  surface->offset_y += pending->dy;
 | 
			
		||||
 | 
			
		||||
  if (pending->opaque_region)
 | 
			
		||||
    {
 | 
			
		||||
      pending->opaque_region = scale_region (pending->opaque_region, surface->scale);
 | 
			
		||||
 
 | 
			
		||||
@@ -115,6 +115,8 @@ struct _MetaWaylandSurface
 | 
			
		||||
    GSList *pending_placement_ops;
 | 
			
		||||
  } sub;
 | 
			
		||||
 | 
			
		||||
  int32_t offset_x, offset_y;
 | 
			
		||||
 | 
			
		||||
  gboolean has_set_geometry;
 | 
			
		||||
 | 
			
		||||
  /* All the pending state that wl_surface.commit will apply. */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user