xdg-shell: handle clients launched in fullscreen
[profile/ivi/weston-ivi-shell.git] / desktop-shell / shell.c
index ad6750d..6103309 100644 (file)
@@ -3710,6 +3710,32 @@ xdg_surface_unset_maximized(struct wl_client *client,
        send_configure_for_surface(shsurf);
 }
 
+static struct weston_output *
+get_focused_output(struct weston_compositor *compositor)
+{
+       struct weston_seat *seat;
+       struct weston_output *output = NULL;
+
+       wl_list_for_each(seat, &compositor->seat_list, link) {
+               /* Priority has touch focus, then pointer and
+                * then keyboard focus. We should probably have
+                * three for loops and check frist for touch,
+                * then for pointer, etc. but unless somebody has some
+                * objections, I think this is sufficient. */
+               if (seat->touch && seat->touch->focus)
+                       output = seat->touch->focus->output;
+               else if (seat->pointer && seat->pointer->focus)
+                       output = seat->pointer->focus->output;
+               else if (seat->keyboard && seat->keyboard->focus)
+                       output = seat->keyboard->focus->output;
+
+               if (output)
+                       break;
+       }
+
+       return output;
+}
+
 static void
 xdg_surface_set_fullscreen(struct wl_client *client,
                           struct wl_resource *resource,
@@ -3726,6 +3752,13 @@ xdg_surface_set_fullscreen(struct wl_client *client,
        else
                output = NULL;
 
+       /* handle clients launching in fullscreen */
+       if (output == NULL && !weston_surface_is_mapped(shsurf->surface)) {
+               /* Set the output to the one that has focus currently. */
+               assert(shsurf->surface);
+               output = get_focused_output(shsurf->surface->compositor);
+       }
+
        shell_surface_set_output(shsurf, output);
        shsurf->fullscreen_output = shsurf->output;