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>
This commit is contained in:
committed by
Pekka Paalanen
parent
086b987be4
commit
052917aa2a
@@ -3710,6 +3710,32 @@ xdg_surface_unset_maximized(struct wl_client *client,
|
|||||||
send_configure_for_surface(shsurf);
|
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
|
static void
|
||||||
xdg_surface_set_fullscreen(struct wl_client *client,
|
xdg_surface_set_fullscreen(struct wl_client *client,
|
||||||
struct wl_resource *resource,
|
struct wl_resource *resource,
|
||||||
@@ -3726,6 +3752,13 @@ xdg_surface_set_fullscreen(struct wl_client *client,
|
|||||||
else
|
else
|
||||||
output = NULL;
|
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);
|
shell_surface_set_output(shsurf, output);
|
||||||
shsurf->fullscreen_output = shsurf->output;
|
shsurf->fullscreen_output = shsurf->output;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user