Skip to content
Snippets Groups Projects
Commit 5ab55829 authored by Derek Foreman's avatar Derek Foreman Committed by Marius Vlad
Browse files

kiosk-shell: Store kiosk_shell_output in kiosk_shell_surface


We end up doing some extra list walks and mildly awkward contortions to
find the kiosk_shell_output from the weston_output.

Store the kiosk_shell_output instead - it's always trivial to find the
weston_output from that, and it just seems a bit cleaner conceptually for
kiosk shell abstractions to point to other kiosk shell abstractions when
available.

Signed-off-by: default avatarDerek Foreman <derek.foreman@collabora.com>
parent a97ccc4a
No related branches found
No related tags found
1 merge request!1696shells: refactor some internal output handling
......@@ -137,7 +137,7 @@ xwayland_get_xwayland_name(struct kiosk_shell_surface *shsurf, enum window_atom_
static void
kiosk_shell_surface_set_output(struct kiosk_shell_surface *shsurf,
struct weston_output *output);
struct kiosk_shell_output *shoutput);
static void
kiosk_shell_surface_set_parent(struct kiosk_shell_surface *shsurf,
struct kiosk_shell_surface *parent);
......@@ -183,7 +183,7 @@ kiosk_shell_surface_get_parent_root(struct kiosk_shell_surface *shsurf)
static bool
kiosk_shell_output_has_app_id(char *config_app_ids, const char *app_id);
static struct weston_output *
static struct kiosk_shell_output *
kiosk_shell_surface_find_best_output_for_xwayland(struct kiosk_shell_surface *shsurf)
{
struct kiosk_shell_output *shoutput;
......@@ -208,7 +208,7 @@ kiosk_shell_surface_find_best_output_for_xwayland(struct kiosk_shell_surface *sh
if (found_wm_name && found_wm_class) {
shsurf->appid_output_assigned = true;
return shoutput->output;
return shoutput;
}
}
}
......@@ -219,7 +219,7 @@ kiosk_shell_surface_find_best_output_for_xwayland(struct kiosk_shell_surface *sh
if (kiosk_shell_output_has_app_id(shoutput->x11_wm_name_app_ids,
wm_name)) {
shsurf->appid_output_assigned = true;
return shoutput->output;
return shoutput;
}
}
}
......@@ -229,7 +229,7 @@ kiosk_shell_surface_find_best_output_for_xwayland(struct kiosk_shell_surface *sh
if (kiosk_shell_output_has_app_id(shoutput->x11_wm_class_app_ids,
wm_class)) {
shsurf->appid_output_assigned = true;
return shoutput->output;
return shoutput;
}
}
}
......@@ -237,7 +237,7 @@ kiosk_shell_surface_find_best_output_for_xwayland(struct kiosk_shell_surface *sh
return NULL;
}
static struct weston_output *
static struct kiosk_shell_output *
kiosk_shell_surface_find_best_output(struct kiosk_shell_surface *shsurf)
{
struct weston_output *output;
......@@ -255,14 +255,14 @@ kiosk_shell_surface_find_best_output(struct kiosk_shell_surface *shsurf)
wl_list_for_each(shoutput, &shsurf->shell->output_list, link) {
if (kiosk_shell_output_has_app_id(shoutput->app_ids, app_id)) {
shsurf->appid_output_assigned = true;
return shoutput->output;
return shoutput;
}
}
}
output = kiosk_shell_surface_find_best_output_for_xwayland(shsurf);
if (output)
return output;
shoutput = kiosk_shell_surface_find_best_output_for_xwayland(shsurf);
if (shoutput)
return shoutput;
/* Group all related windows in the same output. */
root = kiosk_shell_surface_get_parent_root(shsurf);
......@@ -271,20 +271,21 @@ kiosk_shell_surface_find_best_output(struct kiosk_shell_surface *shsurf)
output = weston_shell_utils_get_focused_output(shsurf->shell->compositor);
if (output)
return output;
return kiosk_shell_find_shell_output(shsurf->shell,
output);
output = weston_shell_utils_get_default_output(shsurf->shell->compositor);
if (output)
return output;
return kiosk_shell_find_shell_output(shsurf->shell,
output);
return NULL;
}
static void
kiosk_shell_surface_set_output(struct kiosk_shell_surface *shsurf,
struct weston_output *output)
struct kiosk_shell_output *shoutput)
{
shsurf->output = output;
shsurf->output = shoutput;
if (shsurf->output_destroy_listener.notify) {
wl_list_remove(&shsurf->output_destroy_listener.link);
......@@ -296,39 +297,39 @@ kiosk_shell_surface_set_output(struct kiosk_shell_surface *shsurf,
shsurf->output_destroy_listener.notify =
kiosk_shell_surface_notify_output_destroy;
wl_signal_add(&shsurf->output->destroy_signal,
wl_signal_add(&shsurf->output->output->destroy_signal,
&shsurf->output_destroy_listener);
}
static void
kiosk_shell_surface_set_fullscreen(struct kiosk_shell_surface *shsurf,
struct weston_output *output)
struct kiosk_shell_output *shoutput)
{
if (!output)
output = kiosk_shell_surface_find_best_output(shsurf);
if (!shoutput)
shoutput = kiosk_shell_surface_find_best_output(shsurf);
kiosk_shell_surface_set_output(shsurf, output);
kiosk_shell_surface_set_output(shsurf, shoutput);
weston_desktop_surface_set_fullscreen(shsurf->desktop_surface, true);
if (shsurf->output)
weston_desktop_surface_set_size(shsurf->desktop_surface,
shsurf->output->width,
shsurf->output->height);
shsurf->output->output->width,
shsurf->output->output->height);
}
static void
kiosk_shell_surface_set_maximized(struct kiosk_shell_surface *shsurf)
{
struct weston_output *output =
struct kiosk_shell_output *shoutput =
kiosk_shell_surface_find_best_output(shsurf);
kiosk_shell_surface_set_output(shsurf, output);
kiosk_shell_surface_set_output(shsurf, shoutput);
weston_desktop_surface_set_maximized(shsurf->desktop_surface, true);
if (shsurf->output)
weston_desktop_surface_set_size(shsurf->desktop_surface,
shsurf->output->width,
shsurf->output->height);
shsurf->output->output->width,
shsurf->output->output->height);
}
static void
......@@ -382,9 +383,7 @@ static void
kiosk_shell_surface_set_parent(struct kiosk_shell_surface *shsurf,
struct kiosk_shell_surface *parent)
{
struct kiosk_shell_output *shoutput =
kiosk_shell_find_shell_output(shsurf->shell,
shsurf->output);
struct kiosk_shell_output *shoutput = shsurf->output;
struct kiosk_shell_surface *shroot = parent ?
kiosk_shell_surface_get_parent_root(parent) :
kiosk_shell_surface_get_parent_root(shsurf);
......@@ -436,20 +435,22 @@ static void
kiosk_shell_surface_reconfigure_for_output(struct kiosk_shell_surface *shsurf)
{
struct weston_desktop_surface *desktop_surface;
struct weston_output *w_output;
if (!shsurf->output)
return;
w_output = shsurf->output->output;
desktop_surface = shsurf->desktop_surface;
if (weston_desktop_surface_get_maximized(desktop_surface) ||
weston_desktop_surface_get_fullscreen(desktop_surface)) {
weston_desktop_surface_set_size(desktop_surface,
shsurf->output->width,
shsurf->output->height);
w_output->width,
w_output->height);
}
weston_shell_utils_center_on_output(shsurf->view, shsurf->output);
weston_shell_utils_center_on_output(shsurf->view, w_output);
weston_view_update_transform(shsurf->view);
}
......@@ -530,8 +531,7 @@ kiosk_shell_surface_activate(struct kiosk_shell_surface *shsurf,
struct weston_desktop_surface *dsurface = shsurf->desktop_surface;
struct weston_surface *surface =
weston_desktop_surface_get_surface(dsurface);
struct kiosk_shell_output *shoutput =
kiosk_shell_find_shell_output(shsurf->shell, shsurf->output);
struct kiosk_shell_output *shoutput = shsurf->output;
/* keyboard focus */
weston_view_activate_input(shsurf->view, kiosk_seat->seat, activate_flags);
......@@ -870,6 +870,9 @@ find_focus_successor(struct kiosk_shell_surface *shsurf,
struct weston_layer *layer;
struct weston_view *view;
if (!shsurf->output)
return NULL;
wl_list_for_each(layer, layers, link) {
struct kiosk_shell *shell = shsurf->shell;
......@@ -885,7 +888,7 @@ find_focus_successor(struct kiosk_shell_surface *shsurf,
continue;
/* pick views only on the same output */
if (view->output != shsurf->output)
if (view->output != shsurf->output->output)
continue;
view_shsurf = get_kiosk_shell_surface(view->surface);
......@@ -947,7 +950,7 @@ desktop_surface_removed(struct weston_desktop_surface *desktop_surface,
successor = find_focus_successor(shsurf,
kiosk_seat->focused_surface);
shoutput = kiosk_shell_find_shell_output(shsurf->shell, shsurf->output);
shoutput = shsurf->output;
if (shoutput && successor) {
enum weston_layer_position succesor_view_layer_pos;
......@@ -991,17 +994,17 @@ desktop_surface_committed(struct weston_desktop_surface *desktop_surface,
return;
if (!shsurf->appid_output_assigned && app_id) {
struct weston_output *output = NULL;
struct kiosk_shell_output *shoutput = NULL;
/* reset previous output being set in _added() as the output is
* being cached */
shsurf->output = NULL;
output = kiosk_shell_surface_find_best_output(shsurf);
shoutput = kiosk_shell_surface_find_best_output(shsurf);
kiosk_shell_surface_set_output(shsurf, output);
kiosk_shell_surface_set_output(shsurf, shoutput);
weston_desktop_surface_set_size(shsurf->desktop_surface,
shsurf->output->width,
shsurf->output->height);
shoutput->output->width,
shoutput->output->height);
/* even if we couldn't find an appid set for a particular
* output still flag the shsurf as to a avoid changing the
* output every time */
......@@ -1021,7 +1024,7 @@ desktop_surface_committed(struct weston_desktop_surface *desktop_surface,
if (!weston_surface_is_mapped(surface) || (is_resized && is_fullscreen)) {
if (is_fullscreen || !shsurf->xwayland.is_set) {
weston_shell_utils_center_on_output(shsurf->view,
shsurf->output);
shsurf->output->output);
} else {
struct weston_coord_surface offset;
struct weston_geometry geometry =
......@@ -1040,9 +1043,7 @@ desktop_surface_committed(struct weston_desktop_surface *desktop_surface,
if (!weston_surface_is_mapped(surface)) {
struct weston_seat *seat =
get_kiosk_shell_first_seat(shsurf->shell);
struct kiosk_shell_output *shoutput =
kiosk_shell_find_shell_output(shsurf->shell,
shsurf->output);
struct kiosk_shell_output *shoutput = shsurf->output;
struct kiosk_shell_seat *kiosk_seat;
weston_surface_map(surface);
......@@ -1134,7 +1135,8 @@ desktop_surface_fullscreen_requested(struct weston_desktop_surface *desktop_surf
{
struct kiosk_shell_surface *shsurf =
weston_desktop_surface_get_user_data(desktop_surface);
struct kiosk_shell_output *shoutput =
kiosk_shell_find_shell_output(shsurf->shell, output);
/* We should normally be able to ignore fullscreen requests for
* top-level surfaces, since we set them as fullscreen at creation
* time. However, xwayland surfaces set their internal WM state
......@@ -1148,7 +1150,7 @@ desktop_surface_fullscreen_requested(struct weston_desktop_surface *desktop_surf
*/
if (!shsurf->parent || fullscreen)
kiosk_shell_surface_set_fullscreen(shsurf, output);
kiosk_shell_surface_set_fullscreen(shsurf, shoutput);
else
kiosk_shell_surface_set_normal(shsurf);
}
......
......@@ -57,7 +57,7 @@ struct kiosk_shell_surface {
struct kiosk_shell *shell;
struct weston_output *output;
struct kiosk_shell_output *output;
struct wl_listener output_destroy_listener;
struct wl_signal destroy_signal;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment