summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Chalupa <mchqwerty@gmail.com>2014-09-02 11:35:12 +0200
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>2014-09-05 12:10:12 +0300
commit052917aa2aa4f4e1a82d5316911a162c37af7bdc (patch)
treee55459f5770ac5f96e1f84ca8ebfebbc58adf990
parent086b987be4b530a3ff45ec20b265844b6b4aca0e (diff)
downloadweston-052917aa2aa4f4e1a82d5316911a162c37af7bdc.tar.gz
xdg-shell: handle clients launched in fullscreen
When client is lauched in fullscreen, it is placed on the first output, because it is not mapped and shell_surface_set_output() therefore sets default output. Since we have no better way how to position newly created windows, (http://lists.freedesktop.org/archives/wayland-devel/2014-May/thread.html#14568) set the output to the one that has currently focus. Priority has the touch focus, then pointer and then keyboard focus. This fixes bug https://bugs.freedesktop.org/show_bug.cgi?id=69780 Signed-off-by: Marek Chalupa <mchqwerty@gmail.com> Tested-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
-rw-r--r--desktop-shell/shell.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index ad6750d3..61033093 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -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;