layout: Determine xwayland surface in a generic fashion 61/29061/1
authorMarius Vlad <marius.vlad@collabora.com>
Fri, 21 Jul 2023 12:37:49 +0000 (15:37 +0300)
committerMarius Vlad <marius.vlad@collabora.com>
Mon, 24 Jul 2023 12:31:57 +0000 (15:31 +0300)
This provides a far better way of determining if the surface is
xwayland or not. We can then make sure all X11 clients can be displayed.

Bug-AGL: SPEC-4847
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Change-Id: I2140c452c0d37a84323eaf75787eb32a7771a56e

src/desktop.c
src/ivi-compositor.h
src/layout.c

index 9f472c0..0186e9f 100644 (file)
@@ -582,6 +582,22 @@ transform_handler(struct wl_listener *listener, void *data)
        api->send_position(surface, x, y);
 }
 
+bool
+is_shell_surface_xwayland(struct ivi_surface *surf)
+{
+       const struct weston_xwayland_surface_api *api;
+       struct ivi_compositor *ivi = surf->ivi;
+       struct weston_surface *surface;
+
+       api = ivi->xwayland_surface_api;
+
+       if (!api)
+               return false;
+
+       surface = weston_desktop_surface_get_surface(surf->dsurface);
+       return api->is_xwayland_surface(surface);
+}
+
 int
 ivi_desktop_init(struct ivi_compositor *ivi)
 {
index c5d9fc3..6b6204e 100644 (file)
@@ -518,4 +518,7 @@ ivi_surface_count_one(struct ivi_output *ivi_output,
 int
 parse_activation_area(const char *geometry, struct ivi_output *output);
 
+bool
+is_shell_surface_xwayland(struct ivi_surface *surf);
+
 #endif
index 89c2097..5576094 100644 (file)
@@ -581,9 +581,12 @@ ivi_layout_desktop_committed(struct ivi_surface *surf)
                        return;
                }
 
-               if (!surf->ivi->activate_by_default && !surf->xwayland.is_set) {
-                       weston_log("Refusing to activate surface role %d, app_id %s\n",
-                                       surf->role, app_id);
+               if (!surf->ivi->activate_by_default &&
+                   (!surf->xwayland.is_set && !is_shell_surface_xwayland(surf))) {
+                       weston_log("Refusing to activate surface role %d, app_id %s, type %s\n",
+                                       surf->role, app_id,
+                                       is_shell_surface_xwayland(surf) ?
+                                       "xwayland" : "regular");
 
                        if (!weston_desktop_surface_get_maximized(dsurf) ||
                            geom.width != r_output->area.width ||
@@ -611,7 +614,7 @@ ivi_layout_desktop_committed(struct ivi_surface *surf)
                                 */
                                weston_log("Surface no app_id, role %s activating by default\n",
                                        ivi_layout_get_surface_role_name(surf));
-                               if (surf->xwayland.is_set) {
+                               if (surf->xwayland.is_set || is_shell_surface_xwayland(surf)) {
                                        ivi_layout_activate_by_surf(r_output, surf);
                                        ivi_layout_activate_complete(r_output, surf);
                                } else {