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>
This commit is contained in:
committed by
Kristian Høgsberg
parent
d595f65fe2
commit
e9e0515cec
+1
-1
@@ -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) {
|
||||||
|
|||||||
+1
-1
@@ -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);
|
||||||
|
|||||||
+6
-2
@@ -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:
|
||||||
;
|
;
|
||||||
|
|||||||
+1
-1
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user