Worth to note this type of shell surface is not exposed for clients but just used internally. XWayland compositor counter-part is not implemented yet; next commit will bring it on.
weston_shell_interface was also documented on this commit. Signed-off-by: Tiago Vignatti <[email protected]> --- src/compositor.h | 35 +++++++++++++++++++++++++++++++---- src/shell.c | 30 +++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/compositor.h b/src/compositor.h index 15d6939..5f5e47e 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -73,6 +73,25 @@ struct weston_shell_client { uint32_t edges, int32_t width, int32_t height); }; +enum weston_xwayland { + XWAYLAND_ACTIVE = (1 << 0), + XWAYLAND_INACTIVE = (1 << 1) +}; + +/* + * weston_shell_interface is the interface for the WM compositor module + * (window-manager.c) access the shell implementation. Its methods need to be + * implemented and hooked for XWayland usage only. + * + * Once a handler is received (create_shell_surface), window types are set by + * the WM, so windows are mapped on the screen (wm_xwin.set_window, 'flags' + * argument). The WM compositor module has in particular two types for + * mapping: set_toplevel and set_transient_xwayland. Worth to mention that the + * latter is an XWayland specific type and shells are not exposing it to + * regular clients via Wayland protocol; it differs from the regular + * set_transient protocol type because set_transient_xwayland maps a surface + * in a absolute coordinate on the screen, a peculiar feature of X. + */ struct weston_shell_interface { void *shell; /* either desktop or tablet */ @@ -82,13 +101,21 @@ struct weston_shell_interface { void (*set_toplevel)(struct shell_surface *shsurf); - void (*set_transient)(struct shell_surface *shsurf, - struct weston_surface *parent, - int x, int y, uint32_t flags); + /* + * 'x' and 'y' arguments accept global absolute coordinates, while + * 'flags' is used for receiving keyboard focus or not. + * + * As a side note, ICCCM 'transient' has a slightly different meaning + * than this here. On that one it requires a parent top-level window, + * which is not the case here. So set_transient_xwayland is + * 'transient' in the sense of "lasting only for a short time; + * impermanent", used for tooltips, dropdown, dialogs, among others. + */ + void (*set_transient_xwayland)(struct shell_surface *shsurf, + int x, int y, enum weston_xwayland flags); int (*move)(struct shell_surface *shsurf, struct weston_seat *ws); int (*resize)(struct shell_surface *shsurf, struct weston_seat *ws, uint32_t edges); - }; struct weston_border { diff --git a/src/shell.c b/src/shell.c index aa1c7c1..7a0e24c 100644 --- a/src/shell.c +++ b/src/shell.c @@ -141,6 +141,7 @@ enum shell_surface_type { SHELL_SURFACE_NONE, SHELL_SURFACE_TOPLEVEL, SHELL_SURFACE_TRANSIENT, + SHELL_SURFACE_TRANSIENT_XWAYLAND, SHELL_SURFACE_FULLSCREEN, SHELL_SURFACE_MAXIMIZED, SHELL_SURFACE_POPUP @@ -192,6 +193,11 @@ struct shell_surface { struct weston_surface *black_surface; } fullscreen; + struct { + int32_t x, y; + enum weston_xwayland flags; + } xwayland; + struct ping_timer *ping_timer; struct weston_transform workspace_transform; @@ -1469,6 +1475,7 @@ reset_shell_surface_type(struct shell_surface *surface) case SHELL_SURFACE_NONE: case SHELL_SURFACE_TOPLEVEL: case SHELL_SURFACE_TRANSIENT: + case SHELL_SURFACE_TRANSIENT_XWAYLAND: case SHELL_SURFACE_POPUP: break; } @@ -1496,7 +1503,10 @@ set_surface_type(struct shell_surface *shsurf) pes->geometry.x + shsurf->transient.x, pes->geometry.y + shsurf->transient.y); break; - + case SHELL_SURFACE_TRANSIENT_XWAYLAND: + weston_surface_set_position(surface, shsurf->xwayland.x, + shsurf->xwayland.y); + break; case SHELL_SURFACE_MAXIMIZED: shsurf->saved_x = surface->geometry.x; shsurf->saved_y = surface->geometry.y; @@ -1515,7 +1525,6 @@ set_surface_type(struct shell_surface *shsurf) shsurf->saved_rotation_valid = true; } break; - default: break; } @@ -1560,6 +1569,16 @@ shell_surface_set_transient(struct wl_client *client, set_transient(shsurf, parent, x, y, flags); } +static void +set_transient_xwayland(struct shell_surface *shsurf, int x, int y, + enum weston_xwayland flags) +{ + shsurf->xwayland.x = x; + shsurf->xwayland.y = y; + shsurf->xwayland.flags = flags; + shsurf->next_type = SHELL_SURFACE_TRANSIENT_XWAYLAND; +} + static struct desktop_shell * shell_surface_get_shell(struct shell_surface *shsurf) { @@ -2928,6 +2947,7 @@ map(struct desktop_shell *shell, struct weston_surface *surface, surface->geometry.x + sx, surface->geometry.y + sy); break; + case SHELL_SURFACE_TRANSIENT_XWAYLAND: default: ; } @@ -2942,6 +2962,7 @@ map(struct desktop_shell *shell, struct weston_surface *surface, case SHELL_SURFACE_FULLSCREEN: case SHELL_SURFACE_NONE: break; + case SHELL_SURFACE_TRANSIENT_XWAYLAND: default: ws = get_current_workspace(shell); wl_list_insert(&ws->layer.surface_list, &surface->layer_link); @@ -2959,6 +2980,9 @@ map(struct desktop_shell *shell, struct weston_surface *surface, if (shsurf->transient.flags == WL_SHELL_SURFACE_TRANSIENT_INACTIVE) break; + case SHELL_SURFACE_TRANSIENT_XWAYLAND: + if (shsurf->xwayland.flags == XWAYLAND_INACTIVE) + break; case SHELL_SURFACE_TOPLEVEL: case SHELL_SURFACE_FULLSCREEN: case SHELL_SURFACE_MAXIMIZED: @@ -3841,7 +3865,7 @@ module_init(struct weston_compositor *ec) ec->shell_interface.shell = shell; ec->shell_interface.create_shell_surface = create_shell_surface; ec->shell_interface.set_toplevel = set_toplevel; - ec->shell_interface.set_transient = set_transient; + ec->shell_interface.set_transient_xwayland = set_transient_xwayland; ec->shell_interface.move = surface_move; ec->shell_interface.resize = surface_resize; -- 1.7.9.5 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
