summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Chalupa <mchqwerty@gmail.com>2014-09-08 12:34:20 +0200
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>2014-09-10 16:26:00 +0300
commitbfbb64bb75e8c61b1d8580ab688e494663feb4d0 (patch)
tree3c4991f35c9b5905bd103dd45eb6026e055f6c2b
parent16fe4dcea9be67dd9c396be916b0d4cbb1769e76 (diff)
downloadweston-bfbb64bb75e8c61b1d8580ab688e494663feb4d0.tar.gz
xdg-shell: update shsurf->output when maximizing
shsurf->output is the output that user expects the shell surface is on. When maximizing, we don't have any explicit setting of the output like in the case of fullscreening, so set the output to the one that the surface is currently on. In the case that the surface is not mapped yet, (if it ever happens) use the same heuristics as for fullscreening. This fixes the size sent with configure event, when maximizing a window. The size is now picked up by the correct output, but the maximized window position is still wrong. [Pekka Paalanen] Bug: https://bugs.freedesktop.org/show_bug.cgi?id=82967 Signed-off-by: Marek Chalupa <mchqwerty@gmail.com> Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
-rw-r--r--desktop-shell/shell.c60
1 files changed, 34 insertions, 26 deletions
diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index 234849a2..2b7b2476 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -3541,6 +3541,32 @@ get_primary_view(void *shell, struct shell_surface *shsurf)
return shsurf->view;
}
+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
shell_get_shell_surface(struct wl_client *client,
struct wl_resource *resource,
@@ -3696,9 +3722,17 @@ xdg_surface_set_maximized(struct wl_client *client,
struct wl_resource *resource)
{
struct shell_surface *shsurf = wl_resource_get_user_data(resource);
+ struct weston_output *output;
shsurf->state_requested = true;
shsurf->requested_state.maximized = true;
+
+ if (!weston_surface_is_mapped(shsurf->surface))
+ output = get_focused_output(shsurf->surface->compositor);
+ else
+ output = shsurf->surface->output;
+
+ shell_surface_set_output(shsurf, output);
send_configure_for_surface(shsurf);
}
@@ -3713,32 +3747,6 @@ 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,