shell: update position of surfaces with type none on map()

Needed for implementing drag'n'drop icons. When a drag starts, the
compositor will position the top-left corner of the client supplied
icon surface at the cursor hotspot. On the first attach to that
surface, the client may want to reposition it but shell->map did not
take sx and sy parameters.

This changes shell->map interface to take sx and sy parameters and
change dekstop shell implementation to update the position of a
surface of type none according to those parameters. Since a surface
of type none won't actually be mapped, the effect of this change is
only visible for surfaces that are made visible by the compositor.

Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Ander Conselvan de Oliveira 13 years ago committed by Kristian Høgsberg
parent d595f65fe2
commit e9e0515cec
  1. 2
      src/compositor.c
  2. 2
      src/compositor.h
  3. 8
      src/shell.c
  4. 2
      src/tablet-shell.c

@ -1176,7 +1176,7 @@ surface_attach(struct wl_client *client,
&es->buffer_destroy_listener.link); &es->buffer_destroy_listener.link);
if (es->visual == WESTON_NONE_VISUAL) { if (es->visual == WESTON_NONE_VISUAL) {
shell->map(shell, es, buffer->width, buffer->height); shell->map(shell, es, buffer->width, buffer->height, sx, sy);
} else if (sx != 0 || sy != 0 || } else if (sx != 0 || sy != 0 ||
es->geometry.width != buffer->width || es->geometry.width != buffer->width ||
es->geometry.height != buffer->height) { es->geometry.height != buffer->height) {

@ -130,7 +130,7 @@ struct weston_shell {
void (*lock)(struct weston_shell *shell); void (*lock)(struct weston_shell *shell);
void (*unlock)(struct weston_shell *shell); void (*unlock)(struct weston_shell *shell);
void (*map)(struct weston_shell *shell, struct weston_surface *surface, void (*map)(struct weston_shell *shell, struct weston_surface *surface,
int32_t width, int32_t height); int32_t width, int32_t height, int32_t sx, int32_t sy);
void (*configure)(struct weston_shell *shell, void (*configure)(struct weston_shell *shell,
struct weston_surface *surface, struct weston_surface *surface,
GLfloat x, GLfloat y, int32_t width, int32_t height); GLfloat x, GLfloat y, int32_t width, int32_t height);

@ -1339,8 +1339,8 @@ center_on_output(struct weston_surface *surface, struct weston_output *output)
} }
static void static void
map(struct weston_shell *base, map(struct weston_shell *base, struct weston_surface *surface,
struct weston_surface *surface, int32_t width, int32_t height) int32_t width, int32_t height, int32_t sx, int32_t sy)
{ {
struct wl_shell *shell = container_of(base, struct wl_shell, shell); struct wl_shell *shell = container_of(base, struct wl_shell, shell);
struct weston_compositor *compositor = shell->compositor; struct weston_compositor *compositor = shell->compositor;
@ -1387,6 +1387,10 @@ map(struct weston_shell *base,
break; break;
case SHELL_SURFACE_POPUP: case SHELL_SURFACE_POPUP:
shell_map_popup(shsurf, shsurf->popup.time); shell_map_popup(shsurf, shsurf->popup.time);
case SHELL_SURFACE_NONE:
weston_surface_set_position(surface,
surface->geometry.x + sx,
surface->geometry.y + sy);
break; break;
default: default:
; ;

@ -105,7 +105,7 @@ tablet_shell_set_state(struct tablet_shell *shell, int state)
static void static void
tablet_shell_map(struct weston_shell *base, struct weston_surface *surface, tablet_shell_map(struct weston_shell *base, struct weston_surface *surface,
int32_t width, int32_t height) int32_t width, int32_t height, int32_t sx, int32_t sy)
{ {
struct tablet_shell *shell = struct tablet_shell *shell =
container_of(base, struct tablet_shell, shell); container_of(base, struct tablet_shell, shell);

Loading…
Cancel
Save