layout: Detect when an application should be migrated to other outputs 52/27952/3
authorMarius Vlad <marius.vlad@collabora.com>
Thu, 25 Aug 2022 14:42:34 +0000 (17:42 +0300)
committerMarius Vlad <marius.vlad@collabora.com>
Wed, 14 Sep 2022 16:38:00 +0000 (19:38 +0300)
This patch adds a way to determine when to move out/migrate the window to another
output, different than one set previously, or where it was initially added.

This patch only adds support for resizing with a later patch touch the
final activation part.

Uses new output variable to track it the outputs. We send new dimensions
of the output if they do not match the previous/older recorded one.

Bug-AGL: SPEC-4516
Reported-by: Vasyl Vavrychuk <vasyl.vavrychuk@opensynergy.com>
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Change-Id: Ic5b6b9c1676543fa5ff1524f58e014ad8abb632b

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

index dff11b9..7302348 100644 (file)
@@ -261,6 +261,7 @@ struct ivi_surface {
        struct ivi_compositor *ivi;
        struct weston_desktop_surface *dsurface;
        struct weston_view *view;
+       struct ivi_output *hidden_layer_output;
 
        struct wl_list link;
        int focus_count;
index 86b4b7f..03ac814 100644 (file)
@@ -303,11 +303,43 @@ ivi_layout_add_to_hidden_layer(struct ivi_surface *surf,
                                app_id, ivi_layout_get_surface_role_name(surf),
                                ivi_output->area.width, ivi_output->area.height);
 
+               surf->hidden_layer_output = ivi_output;
                weston_view_set_output(ev, ivi_output->output);
                weston_layer_entry_insert(&ivi->hidden.view_list, &ev->layer_link);
-               weston_log("Placed app_id %s, type %s in hidden layer\n",
-                               app_id, ivi_layout_get_surface_role_name(surf));
+               weston_log("Placed app_id %s, type %s in hidden layer on output %s\n",
+                               app_id, ivi_layout_get_surface_role_name(surf),
+                               ivi_output->output->name);
+
+               weston_compositor_schedule_repaint(ivi->compositor);
+               return;
+       }
+
+       /* we might have another output to activate */
+       if (surf->hidden_layer_output &&
+           surf->hidden_layer_output != ivi_output) {
+               weston_layer_entry_remove(&ev->layer_link);
+
+               if (ivi_output->area.width != surf->hidden_layer_output->area.width &&
+                   ivi_output->area.height != surf->hidden_layer_output->area.height) {
+                       weston_desktop_surface_set_maximized(dsurf, true);
+                       weston_desktop_surface_set_size(dsurf,
+                                                       ivi_output->area.width,
+                                                       ivi_output->area.height);
+               }
+
+               weston_log("Setting app_id %s, role %s, set to maximized (%dx%d)\n",
+                               app_id, ivi_layout_get_surface_role_name(surf),
+                               ivi_output->area.width, ivi_output->area.height);
+
+               surf->hidden_layer_output = ivi_output;
+               weston_view_set_output(ev, ivi_output->output);
+               weston_layer_entry_insert(&ivi->hidden.view_list, &ev->layer_link);
+               weston_log("Placed app_id %s, type %s in hidden layer on output %s\n",
+                               app_id, ivi_layout_get_surface_role_name(surf),
+                               ivi_output->output->name);
        }
+
+       weston_compositor_schedule_repaint(ivi->compositor);
 }
 
 void