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