diff options
author | Marek Chalupa <mchqwerty@gmail.com> | 2014-09-02 11:35:12 +0200 |
---|---|---|
committer | Pekka Paalanen <pekka.paalanen@collabora.co.uk> | 2014-09-05 12:10:12 +0300 |
commit | 052917aa2aa4f4e1a82d5316911a162c37af7bdc (patch) | |
tree | e55459f5770ac5f96e1f84ca8ebfebbc58adf990 | |
parent | 086b987be4b530a3ff45ec20b265844b6b4aca0e (diff) | |
download | weston-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.c | 33 |
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; |