mirror of
https://gitlab.freedesktop.org/wayland/weston
synced 2024-07-08 20:05:52 +00:00
compositor: keep track of the weston_layer a weston_view is in
This introduces a new struct, weston_layer_entry, which is now used in place of wl_list to keep the link for the layer list in weston_view and the head of the list in weston_layer. weston_layer_entry also has a weston_layer*, which points to the layer the view is in or, in the case the entry it's the head of the list, to the layer itself.
This commit is contained in:
parent
cfff312204
commit
412e6a59eb
|
@ -219,7 +219,7 @@ exposay_layout(struct desktop_shell *shell, struct shell_output *shell_output)
|
||||||
int last_row_removed = 0;
|
int last_row_removed = 0;
|
||||||
|
|
||||||
eoutput->num_surfaces = 0;
|
eoutput->num_surfaces = 0;
|
||||||
wl_list_for_each(view, &workspace->layer.view_list, layer_link) {
|
wl_list_for_each(view, &workspace->layer.view_list.link, layer_link.link) {
|
||||||
if (!get_shell_surface(view->surface))
|
if (!get_shell_surface(view->surface))
|
||||||
continue;
|
continue;
|
||||||
if (view->output != output)
|
if (view->output != output)
|
||||||
|
@ -272,7 +272,7 @@ exposay_layout(struct desktop_shell *shell, struct shell_output *shell_output)
|
||||||
eoutput->surface_size = output->height / 2;
|
eoutput->surface_size = output->height / 2;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
wl_list_for_each(view, &workspace->layer.view_list, layer_link) {
|
wl_list_for_each(view, &workspace->layer.view_list.link, layer_link.link) {
|
||||||
int pad;
|
int pad;
|
||||||
|
|
||||||
pad = eoutput->surface_size + eoutput->padding_inner;
|
pad = eoutput->surface_size + eoutput->padding_inner;
|
||||||
|
|
|
@ -75,8 +75,8 @@ show_input_panel_surface(struct input_panel_surface *ipsurf)
|
||||||
weston_view_set_position(ipsurf->view, x, y);
|
weston_view_set_position(ipsurf->view, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
wl_list_insert(&shell->input_panel_layer.view_list,
|
weston_layer_entry_insert(&shell->input_panel_layer.view_list,
|
||||||
&ipsurf->view->layer_link);
|
&ipsurf->view->layer_link);
|
||||||
weston_view_geometry_dirty(ipsurf->view);
|
weston_view_geometry_dirty(ipsurf->view);
|
||||||
weston_view_update_transform(ipsurf->view);
|
weston_view_update_transform(ipsurf->view);
|
||||||
weston_surface_damage(ipsurf->surface);
|
weston_surface_damage(ipsurf->surface);
|
||||||
|
@ -135,7 +135,8 @@ hide_input_panels(struct wl_listener *listener, void *data)
|
||||||
wl_list_remove(&shell->input_panel_layer.link);
|
wl_list_remove(&shell->input_panel_layer.link);
|
||||||
|
|
||||||
wl_list_for_each_safe(view, next,
|
wl_list_for_each_safe(view, next,
|
||||||
&shell->input_panel_layer.view_list, layer_link)
|
&shell->input_panel_layer.view_list.link,
|
||||||
|
layer_link.link)
|
||||||
weston_view_unmap(view);
|
weston_view_unmap(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -279,12 +279,12 @@ shell_surface_is_top_fullscreen(struct shell_surface *shsurf)
|
||||||
|
|
||||||
shell = shell_surface_get_shell(shsurf);
|
shell = shell_surface_get_shell(shsurf);
|
||||||
|
|
||||||
if (wl_list_empty(&shell->fullscreen_layer.view_list))
|
if (wl_list_empty(&shell->fullscreen_layer.view_list.link))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
top_fs_ev = container_of(shell->fullscreen_layer.view_list.next,
|
top_fs_ev = container_of(shell->fullscreen_layer.view_list.link.next,
|
||||||
struct weston_view,
|
struct weston_view,
|
||||||
layer_link);
|
layer_link.link);
|
||||||
return (shsurf == get_shell_surface(top_fs_ev->surface));
|
return (shsurf == get_shell_surface(top_fs_ev->surface));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -361,7 +361,7 @@ get_output_panel_height(struct desktop_shell *shell,
|
||||||
if (!output)
|
if (!output)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
wl_list_for_each(view, &shell->panel_layer.view_list, layer_link) {
|
wl_list_for_each(view, &shell->panel_layer.view_list.link, layer_link.link) {
|
||||||
if (view->surface->output == output) {
|
if (view->surface->output == output) {
|
||||||
panel_height = view->surface->height;
|
panel_height = view->surface->height;
|
||||||
break;
|
break;
|
||||||
|
@ -675,7 +675,8 @@ focus_state_surface_destroy(struct wl_listener *listener, void *data)
|
||||||
main_surface = weston_surface_get_main_surface(state->keyboard_focus);
|
main_surface = weston_surface_get_main_surface(state->keyboard_focus);
|
||||||
|
|
||||||
next = NULL;
|
next = NULL;
|
||||||
wl_list_for_each(view, &state->ws->layer.view_list, layer_link) {
|
wl_list_for_each(view,
|
||||||
|
&state->ws->layer.view_list.link, layer_link.link) {
|
||||||
if (view->surface == main_surface)
|
if (view->surface == main_surface)
|
||||||
continue;
|
continue;
|
||||||
if (is_focus_view(view))
|
if (is_focus_view(view))
|
||||||
|
@ -854,8 +855,8 @@ animate_focus_change(struct desktop_shell *shell, struct workspace *ws,
|
||||||
|
|
||||||
focus_surface_created = true;
|
focus_surface_created = true;
|
||||||
} else {
|
} else {
|
||||||
wl_list_remove(&ws->fsurf_front->view->layer_link);
|
weston_layer_entry_remove(&ws->fsurf_front->view->layer_link);
|
||||||
wl_list_remove(&ws->fsurf_back->view->layer_link);
|
weston_layer_entry_remove(&ws->fsurf_back->view->layer_link);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ws->focus_animation) {
|
if (ws->focus_animation) {
|
||||||
|
@ -864,11 +865,11 @@ animate_focus_change(struct desktop_shell *shell, struct workspace *ws,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (to)
|
if (to)
|
||||||
wl_list_insert(&to->layer_link,
|
weston_layer_entry_insert(&to->layer_link,
|
||||||
&ws->fsurf_front->view->layer_link);
|
&ws->fsurf_front->view->layer_link);
|
||||||
else if (from)
|
else if (from)
|
||||||
wl_list_insert(&ws->layer.view_list,
|
weston_layer_entry_insert(&ws->layer.view_list,
|
||||||
&ws->fsurf_front->view->layer_link);
|
&ws->fsurf_front->view->layer_link);
|
||||||
|
|
||||||
if (focus_surface_created) {
|
if (focus_surface_created) {
|
||||||
ws->focus_animation = weston_fade_run(
|
ws->focus_animation = weston_fade_run(
|
||||||
|
@ -876,15 +877,15 @@ animate_focus_change(struct desktop_shell *shell, struct workspace *ws,
|
||||||
ws->fsurf_front->view->alpha, 0.4, 300,
|
ws->fsurf_front->view->alpha, 0.4, 300,
|
||||||
focus_animation_done, ws);
|
focus_animation_done, ws);
|
||||||
} else if (from) {
|
} else if (from) {
|
||||||
wl_list_insert(&from->layer_link,
|
weston_layer_entry_insert(&from->layer_link,
|
||||||
&ws->fsurf_back->view->layer_link);
|
&ws->fsurf_back->view->layer_link);
|
||||||
ws->focus_animation = weston_stable_fade_run(
|
ws->focus_animation = weston_stable_fade_run(
|
||||||
ws->fsurf_front->view, 0.0,
|
ws->fsurf_front->view, 0.0,
|
||||||
ws->fsurf_back->view, 0.4,
|
ws->fsurf_back->view, 0.4,
|
||||||
focus_animation_done, ws);
|
focus_animation_done, ws);
|
||||||
} else if (to) {
|
} else if (to) {
|
||||||
wl_list_insert(&ws->layer.view_list,
|
weston_layer_entry_insert(&ws->layer.view_list,
|
||||||
&ws->fsurf_back->view->layer_link);
|
&ws->fsurf_back->view->layer_link);
|
||||||
ws->focus_animation = weston_stable_fade_run(
|
ws->focus_animation = weston_stable_fade_run(
|
||||||
ws->fsurf_front->view, 0.0,
|
ws->fsurf_front->view, 0.0,
|
||||||
ws->fsurf_back->view, 0.4,
|
ws->fsurf_back->view, 0.4,
|
||||||
|
@ -944,7 +945,7 @@ workspace_create(void)
|
||||||
static int
|
static int
|
||||||
workspace_is_empty(struct workspace *ws)
|
workspace_is_empty(struct workspace *ws)
|
||||||
{
|
{
|
||||||
return wl_list_empty(&ws->layer.view_list);
|
return wl_list_empty(&ws->layer.view_list.link);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct workspace *
|
static struct workspace *
|
||||||
|
@ -1009,7 +1010,7 @@ workspace_translate_out(struct workspace *ws, double fraction)
|
||||||
unsigned int height;
|
unsigned int height;
|
||||||
double d;
|
double d;
|
||||||
|
|
||||||
wl_list_for_each(view, &ws->layer.view_list, layer_link) {
|
wl_list_for_each(view, &ws->layer.view_list.link, layer_link.link) {
|
||||||
height = get_output_height(view->surface->output);
|
height = get_output_height(view->surface->output);
|
||||||
d = height * fraction;
|
d = height * fraction;
|
||||||
|
|
||||||
|
@ -1024,7 +1025,7 @@ workspace_translate_in(struct workspace *ws, double fraction)
|
||||||
unsigned int height;
|
unsigned int height;
|
||||||
double d;
|
double d;
|
||||||
|
|
||||||
wl_list_for_each(view, &ws->layer.view_list, layer_link) {
|
wl_list_for_each(view, &ws->layer.view_list.link, layer_link.link) {
|
||||||
height = get_output_height(view->surface->output);
|
height = get_output_height(view->surface->output);
|
||||||
|
|
||||||
if (fraction > 0)
|
if (fraction > 0)
|
||||||
|
@ -1069,7 +1070,7 @@ workspace_deactivate_transforms(struct workspace *ws)
|
||||||
struct weston_view *view;
|
struct weston_view *view;
|
||||||
struct weston_transform *transform;
|
struct weston_transform *transform;
|
||||||
|
|
||||||
wl_list_for_each(view, &ws->layer.view_list, layer_link) {
|
wl_list_for_each(view, &ws->layer.view_list.link, layer_link.link) {
|
||||||
if (is_focus_view(view)) {
|
if (is_focus_view(view)) {
|
||||||
struct focus_surface *fsurf = get_focus_surface(view->surface);
|
struct focus_surface *fsurf = get_focus_surface(view->surface);
|
||||||
transform = &fsurf->workspace_transform;
|
transform = &fsurf->workspace_transform;
|
||||||
|
@ -1099,7 +1100,7 @@ finish_workspace_change_animation(struct desktop_shell *shell,
|
||||||
* visible after the workspace animation ends but before its layer
|
* visible after the workspace animation ends but before its layer
|
||||||
* is hidden. In that case, we need to damage below those views so
|
* is hidden. In that case, we need to damage below those views so
|
||||||
* that the screen is properly repainted. */
|
* that the screen is properly repainted. */
|
||||||
wl_list_for_each(view, &from->layer.view_list, layer_link)
|
wl_list_for_each(view, &from->layer.view_list.link, layer_link.link)
|
||||||
weston_view_damage_below(view);
|
weston_view_damage_below(view);
|
||||||
|
|
||||||
wl_list_remove(&shell->workspaces.animation.link);
|
wl_list_remove(&shell->workspaces.animation.link);
|
||||||
|
@ -1218,7 +1219,7 @@ change_workspace(struct desktop_shell *shell, unsigned int index)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Don't change workspace when there is any fullscreen surfaces. */
|
/* Don't change workspace when there is any fullscreen surfaces. */
|
||||||
if (!wl_list_empty(&shell->fullscreen_layer.view_list))
|
if (!wl_list_empty(&shell->fullscreen_layer.view_list.link))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
from = get_current_workspace(shell);
|
from = get_current_workspace(shell);
|
||||||
|
@ -1262,7 +1263,7 @@ change_workspace(struct desktop_shell *shell, unsigned int index)
|
||||||
static bool
|
static bool
|
||||||
workspace_has_only(struct workspace *ws, struct weston_surface *surface)
|
workspace_has_only(struct workspace *ws, struct weston_surface *surface)
|
||||||
{
|
{
|
||||||
struct wl_list *list = &ws->layer.view_list;
|
struct wl_list *list = &ws->layer.view_list.link;
|
||||||
struct wl_list *e;
|
struct wl_list *e;
|
||||||
|
|
||||||
if (wl_list_empty(list))
|
if (wl_list_empty(list))
|
||||||
|
@ -1273,7 +1274,7 @@ workspace_has_only(struct workspace *ws, struct weston_surface *surface)
|
||||||
if (e->next != list)
|
if (e->next != list)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return container_of(e, struct weston_view, layer_link)->surface == surface;
|
return container_of(e, struct weston_view, layer_link.link)->surface == surface;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1302,8 +1303,8 @@ move_surface_to_workspace(struct desktop_shell *shell,
|
||||||
from = get_current_workspace(shell);
|
from = get_current_workspace(shell);
|
||||||
to = get_workspace(shell, workspace);
|
to = get_workspace(shell, workspace);
|
||||||
|
|
||||||
wl_list_remove(&view->layer_link);
|
weston_layer_entry_remove(&view->layer_link);
|
||||||
wl_list_insert(&to->layer.view_list, &view->layer_link);
|
weston_layer_entry_insert(&to->layer.view_list, &view->layer_link);
|
||||||
|
|
||||||
shell_surface_update_child_surface_layers(shsurf);
|
shell_surface_update_child_surface_layers(shsurf);
|
||||||
|
|
||||||
|
@ -1342,8 +1343,8 @@ take_surface_to_workspace_by_seat(struct desktop_shell *shell,
|
||||||
from = get_current_workspace(shell);
|
from = get_current_workspace(shell);
|
||||||
to = get_workspace(shell, index);
|
to = get_workspace(shell, index);
|
||||||
|
|
||||||
wl_list_remove(&view->layer_link);
|
weston_layer_entry_remove(&view->layer_link);
|
||||||
wl_list_insert(&to->layer.view_list, &view->layer_link);
|
weston_layer_entry_insert(&to->layer.view_list, &view->layer_link);
|
||||||
|
|
||||||
shsurf = get_shell_surface(surface);
|
shsurf = get_shell_surface(surface);
|
||||||
if (shsurf != NULL)
|
if (shsurf != NULL)
|
||||||
|
@ -2176,7 +2177,7 @@ restore_all_output_modes(struct weston_compositor *compositor)
|
||||||
/* The surface will be inserted into the list immediately after the link
|
/* The surface will be inserted into the list immediately after the link
|
||||||
* returned by this function (i.e. will be stacked immediately above the
|
* returned by this function (i.e. will be stacked immediately above the
|
||||||
* returned link). */
|
* returned link). */
|
||||||
static struct wl_list *
|
static struct weston_layer_entry *
|
||||||
shell_surface_calculate_layer_link (struct shell_surface *shsurf)
|
shell_surface_calculate_layer_link (struct shell_surface *shsurf)
|
||||||
{
|
{
|
||||||
struct workspace *ws;
|
struct workspace *ws;
|
||||||
|
@ -2202,7 +2203,8 @@ shell_surface_calculate_layer_link (struct shell_surface *shsurf)
|
||||||
/* TODO: Handle a parent with multiple views */
|
/* TODO: Handle a parent with multiple views */
|
||||||
parent = get_default_view(shsurf->parent);
|
parent = get_default_view(shsurf->parent);
|
||||||
if (parent)
|
if (parent)
|
||||||
return parent->layer_link.prev;
|
return container_of(parent->layer_link.link.prev,
|
||||||
|
struct weston_layer_entry, link);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move the surface to a normal workspace layer so that surfaces
|
/* Move the surface to a normal workspace layer so that surfaces
|
||||||
|
@ -2219,16 +2221,19 @@ static void
|
||||||
shell_surface_update_child_surface_layers (struct shell_surface *shsurf)
|
shell_surface_update_child_surface_layers (struct shell_surface *shsurf)
|
||||||
{
|
{
|
||||||
struct shell_surface *child;
|
struct shell_surface *child;
|
||||||
|
struct weston_layer_entry *prev;
|
||||||
|
|
||||||
/* Move the child layers to the same workspace as shsurf. They will be
|
/* Move the child layers to the same workspace as shsurf. They will be
|
||||||
* stacked above shsurf. */
|
* stacked above shsurf. */
|
||||||
wl_list_for_each_reverse(child, &shsurf->children_list, children_link) {
|
wl_list_for_each_reverse(child, &shsurf->children_list, children_link) {
|
||||||
if (shsurf->view->layer_link.prev != &child->view->layer_link) {
|
if (shsurf->view->layer_link.link.prev != &child->view->layer_link.link) {
|
||||||
weston_view_damage_below(child->view);
|
weston_view_damage_below(child->view);
|
||||||
weston_view_geometry_dirty(child->view);
|
weston_view_geometry_dirty(child->view);
|
||||||
wl_list_remove(&child->view->layer_link);
|
prev = container_of(shsurf->view->layer_link.link.prev,
|
||||||
wl_list_insert(shsurf->view->layer_link.prev,
|
struct weston_layer_entry, link);
|
||||||
&child->view->layer_link);
|
weston_layer_entry_remove(&child->view->layer_link);
|
||||||
|
weston_layer_entry_insert(prev,
|
||||||
|
&child->view->layer_link);
|
||||||
weston_view_geometry_dirty(child->view);
|
weston_view_geometry_dirty(child->view);
|
||||||
weston_surface_damage(child->surface);
|
weston_surface_damage(child->surface);
|
||||||
|
|
||||||
|
@ -2249,7 +2254,7 @@ shell_surface_update_child_surface_layers (struct shell_surface *shsurf)
|
||||||
static void
|
static void
|
||||||
shell_surface_update_layer(struct shell_surface *shsurf)
|
shell_surface_update_layer(struct shell_surface *shsurf)
|
||||||
{
|
{
|
||||||
struct wl_list *new_layer_link;
|
struct weston_layer_entry *new_layer_link;
|
||||||
|
|
||||||
new_layer_link = shell_surface_calculate_layer_link(shsurf);
|
new_layer_link = shell_surface_calculate_layer_link(shsurf);
|
||||||
|
|
||||||
|
@ -2259,8 +2264,8 @@ shell_surface_update_layer(struct shell_surface *shsurf)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
weston_view_geometry_dirty(shsurf->view);
|
weston_view_geometry_dirty(shsurf->view);
|
||||||
wl_list_remove(&shsurf->view->layer_link);
|
weston_layer_entry_remove(&shsurf->view->layer_link);
|
||||||
wl_list_insert(new_layer_link, &shsurf->view->layer_link);
|
weston_layer_entry_insert(new_layer_link, &shsurf->view->layer_link);
|
||||||
weston_view_geometry_dirty(shsurf->view);
|
weston_view_geometry_dirty(shsurf->view);
|
||||||
weston_surface_damage(shsurf->surface);
|
weston_surface_damage(shsurf->surface);
|
||||||
|
|
||||||
|
@ -2522,10 +2527,10 @@ set_minimized(struct weston_surface *surface, uint32_t is_true)
|
||||||
shsurf = get_shell_surface(surface);
|
shsurf = get_shell_surface(surface);
|
||||||
current_ws = get_current_workspace(shsurf->shell);
|
current_ws = get_current_workspace(shsurf->shell);
|
||||||
|
|
||||||
wl_list_remove(&view->layer_link);
|
weston_layer_entry_remove(&view->layer_link);
|
||||||
/* hide or show, depending on the state */
|
/* hide or show, depending on the state */
|
||||||
if (is_true) {
|
if (is_true) {
|
||||||
wl_list_insert(&shsurf->shell->minimized_layer.view_list, &view->layer_link);
|
weston_layer_entry_insert(&shsurf->shell->minimized_layer.view_list, &view->layer_link);
|
||||||
|
|
||||||
drop_focus_state(shsurf->shell, current_ws, view->surface);
|
drop_focus_state(shsurf->shell, current_ws, view->surface);
|
||||||
wl_list_for_each(seat, &shsurf->shell->compositor->seat_list, link) {
|
wl_list_for_each(seat, &shsurf->shell->compositor->seat_list, link) {
|
||||||
|
@ -2537,7 +2542,7 @@ set_minimized(struct weston_surface *surface, uint32_t is_true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
wl_list_insert(¤t_ws->layer.view_list, &view->layer_link);
|
weston_layer_entry_insert(¤t_ws->layer.view_list, &view->layer_link);
|
||||||
|
|
||||||
wl_list_for_each(seat, &shsurf->shell->compositor->seat_list, link) {
|
wl_list_for_each(seat, &shsurf->shell->compositor->seat_list, link) {
|
||||||
if (!seat->keyboard)
|
if (!seat->keyboard)
|
||||||
|
@ -2703,9 +2708,9 @@ shell_ensure_fullscreen_black_view(struct shell_surface *shsurf)
|
||||||
output->height);
|
output->height);
|
||||||
|
|
||||||
weston_view_geometry_dirty(shsurf->fullscreen.black_view);
|
weston_view_geometry_dirty(shsurf->fullscreen.black_view);
|
||||||
wl_list_remove(&shsurf->fullscreen.black_view->layer_link);
|
weston_layer_entry_remove(&shsurf->fullscreen.black_view->layer_link);
|
||||||
wl_list_insert(&shsurf->view->layer_link,
|
weston_layer_entry_insert(&shsurf->view->layer_link,
|
||||||
&shsurf->fullscreen.black_view->layer_link);
|
&shsurf->fullscreen.black_view->layer_link);
|
||||||
weston_view_geometry_dirty(shsurf->fullscreen.black_view);
|
weston_view_geometry_dirty(shsurf->fullscreen.black_view);
|
||||||
weston_surface_damage(shsurf->surface);
|
weston_surface_damage(shsurf->surface);
|
||||||
|
|
||||||
|
@ -2727,8 +2732,8 @@ shell_configure_fullscreen(struct shell_surface *shsurf)
|
||||||
restore_output_mode(output);
|
restore_output_mode(output);
|
||||||
|
|
||||||
/* Reverse the effect of lower_fullscreen_layer() */
|
/* Reverse the effect of lower_fullscreen_layer() */
|
||||||
wl_list_remove(&shsurf->view->layer_link);
|
weston_layer_entry_remove(&shsurf->view->layer_link);
|
||||||
wl_list_insert(&shsurf->shell->fullscreen_layer.view_list, &shsurf->view->layer_link);
|
weston_layer_entry_insert(&shsurf->shell->fullscreen_layer.view_list, &shsurf->view->layer_link);
|
||||||
|
|
||||||
shell_ensure_fullscreen_black_view(shsurf);
|
shell_ensure_fullscreen_black_view(shsurf);
|
||||||
|
|
||||||
|
@ -3887,7 +3892,7 @@ configure_static_view(struct weston_view *ev, struct weston_layer *layer)
|
||||||
{
|
{
|
||||||
struct weston_view *v, *next;
|
struct weston_view *v, *next;
|
||||||
|
|
||||||
wl_list_for_each_safe(v, next, &layer->view_list, layer_link) {
|
wl_list_for_each_safe(v, next, &layer->view_list.link, layer_link.link) {
|
||||||
if (v->output == ev->output && v != ev) {
|
if (v->output == ev->output && v != ev) {
|
||||||
weston_view_unmap(v);
|
weston_view_unmap(v);
|
||||||
v->surface->configure = NULL;
|
v->surface->configure = NULL;
|
||||||
|
@ -3896,8 +3901,8 @@ configure_static_view(struct weston_view *ev, struct weston_layer *layer)
|
||||||
|
|
||||||
weston_view_set_position(ev, ev->output->x, ev->output->y);
|
weston_view_set_position(ev, ev->output->x, ev->output->y);
|
||||||
|
|
||||||
if (wl_list_empty(&ev->layer_link)) {
|
if (wl_list_empty(&ev->layer_link.link)) {
|
||||||
wl_list_insert(&layer->view_list, &ev->layer_link);
|
weston_layer_entry_insert(&layer->view_list, &ev->layer_link);
|
||||||
weston_compositor_schedule_repaint(ev->surface->compositor);
|
weston_compositor_schedule_repaint(ev->surface->compositor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4002,8 +4007,8 @@ lock_surface_configure(struct weston_surface *surface, int32_t sx, int32_t sy)
|
||||||
center_on_output(view, get_default_output(shell->compositor));
|
center_on_output(view, get_default_output(shell->compositor));
|
||||||
|
|
||||||
if (!weston_surface_is_mapped(surface)) {
|
if (!weston_surface_is_mapped(surface)) {
|
||||||
wl_list_insert(&shell->lock_layer.view_list,
|
weston_layer_entry_insert(&shell->lock_layer.view_list,
|
||||||
&view->layer_link);
|
&view->layer_link);
|
||||||
weston_view_update_transform(view);
|
weston_view_update_transform(view);
|
||||||
shell_fade(shell, FADE_IN);
|
shell_fade(shell, FADE_IN);
|
||||||
}
|
}
|
||||||
|
@ -4533,8 +4538,8 @@ lower_fullscreen_layer(struct desktop_shell *shell)
|
||||||
|
|
||||||
ws = get_current_workspace(shell);
|
ws = get_current_workspace(shell);
|
||||||
wl_list_for_each_reverse_safe(view, prev,
|
wl_list_for_each_reverse_safe(view, prev,
|
||||||
&shell->fullscreen_layer.view_list,
|
&shell->fullscreen_layer.view_list.link,
|
||||||
layer_link) {
|
layer_link.link) {
|
||||||
struct shell_surface *shsurf = get_shell_surface(view->surface);
|
struct shell_surface *shsurf = get_shell_surface(view->surface);
|
||||||
|
|
||||||
if (!shsurf)
|
if (!shsurf)
|
||||||
|
@ -4544,15 +4549,15 @@ lower_fullscreen_layer(struct desktop_shell *shell)
|
||||||
* in the fullscreen layer. */
|
* in the fullscreen layer. */
|
||||||
if (shsurf->state.fullscreen) {
|
if (shsurf->state.fullscreen) {
|
||||||
/* Hide the black view */
|
/* Hide the black view */
|
||||||
wl_list_remove(&shsurf->fullscreen.black_view->layer_link);
|
weston_layer_entry_remove(&shsurf->fullscreen.black_view->layer_link);
|
||||||
wl_list_init(&shsurf->fullscreen.black_view->layer_link);
|
wl_list_init(&shsurf->fullscreen.black_view->layer_link.link);
|
||||||
weston_view_damage_below(shsurf->fullscreen.black_view);
|
weston_view_damage_below(shsurf->fullscreen.black_view);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Lower the view to the workspace layer */
|
/* Lower the view to the workspace layer */
|
||||||
wl_list_remove(&view->layer_link);
|
weston_layer_entry_remove(&view->layer_link);
|
||||||
wl_list_insert(&ws->layer.view_list, &view->layer_link);
|
weston_layer_entry_insert(&ws->layer.view_list, &view->layer_link);
|
||||||
weston_view_damage_below(view);
|
weston_view_damage_below(view);
|
||||||
weston_surface_damage(view->surface);
|
weston_surface_damage(view->surface);
|
||||||
|
|
||||||
|
@ -4771,8 +4776,8 @@ shell_fade_create_surface(struct desktop_shell *shell)
|
||||||
weston_surface_set_size(surface, 8192, 8192);
|
weston_surface_set_size(surface, 8192, 8192);
|
||||||
weston_view_set_position(view, 0, 0);
|
weston_view_set_position(view, 0, 0);
|
||||||
weston_surface_set_color(surface, 0.0, 0.0, 0.0, 1.0);
|
weston_surface_set_color(surface, 0.0, 0.0, 0.0, 1.0);
|
||||||
wl_list_insert(&compositor->fade_layer.view_list,
|
weston_layer_entry_insert(&compositor->fade_layer.view_list,
|
||||||
&view->layer_link);
|
&view->layer_link);
|
||||||
pixman_region32_init(&surface->input);
|
pixman_region32_init(&surface->input);
|
||||||
|
|
||||||
return view;
|
return view;
|
||||||
|
@ -5349,6 +5354,7 @@ screensaver_configure(struct weston_surface *surface, int32_t sx, int32_t sy)
|
||||||
{
|
{
|
||||||
struct desktop_shell *shell = surface->configure_private;
|
struct desktop_shell *shell = surface->configure_private;
|
||||||
struct weston_view *view;
|
struct weston_view *view;
|
||||||
|
struct weston_layer_entry *prev;
|
||||||
|
|
||||||
if (surface->width == 0)
|
if (surface->width == 0)
|
||||||
return;
|
return;
|
||||||
|
@ -5360,9 +5366,10 @@ screensaver_configure(struct weston_surface *surface, int32_t sx, int32_t sy)
|
||||||
view = container_of(surface->views.next, struct weston_view, surface_link);
|
view = container_of(surface->views.next, struct weston_view, surface_link);
|
||||||
center_on_output(view, surface->output);
|
center_on_output(view, surface->output);
|
||||||
|
|
||||||
if (wl_list_empty(&view->layer_link)) {
|
if (wl_list_empty(&view->layer_link.link)) {
|
||||||
wl_list_insert(shell->lock_layer.view_list.prev,
|
prev = container_of(shell->lock_layer.view_list.link.prev,
|
||||||
&view->layer_link);
|
struct weston_layer_entry, link);
|
||||||
|
weston_layer_entry_insert(prev, &view->layer_link);
|
||||||
weston_view_update_transform(view);
|
weston_view_update_transform(view);
|
||||||
wl_event_source_timer_update(shell->screensaver.timer,
|
wl_event_source_timer_update(shell->screensaver.timer,
|
||||||
shell->screensaver.duration);
|
shell->screensaver.duration);
|
||||||
|
@ -5445,14 +5452,14 @@ switcher_next(struct switcher *switcher)
|
||||||
/* temporary re-display minimized surfaces */
|
/* temporary re-display minimized surfaces */
|
||||||
struct weston_view *tmp;
|
struct weston_view *tmp;
|
||||||
struct weston_view **minimized;
|
struct weston_view **minimized;
|
||||||
wl_list_for_each_safe(view, tmp, &switcher->shell->minimized_layer.view_list, layer_link) {
|
wl_list_for_each_safe(view, tmp, &switcher->shell->minimized_layer.view_list.link, layer_link.link) {
|
||||||
wl_list_remove(&view->layer_link);
|
weston_layer_entry_remove(&view->layer_link);
|
||||||
wl_list_insert(&ws->layer.view_list, &view->layer_link);
|
weston_layer_entry_insert(&ws->layer.view_list, &view->layer_link);
|
||||||
minimized = wl_array_add(&switcher->minimized_array, sizeof *minimized);
|
minimized = wl_array_add(&switcher->minimized_array, sizeof *minimized);
|
||||||
*minimized = view;
|
*minimized = view;
|
||||||
}
|
}
|
||||||
|
|
||||||
wl_list_for_each(view, &ws->layer.view_list, layer_link) {
|
wl_list_for_each(view, &ws->layer.view_list.link, layer_link.link) {
|
||||||
shsurf = get_shell_surface(view->surface);
|
shsurf = get_shell_surface(view->surface);
|
||||||
if (shsurf &&
|
if (shsurf &&
|
||||||
shsurf->type == SHELL_SURFACE_TOPLEVEL &&
|
shsurf->type == SHELL_SURFACE_TOPLEVEL &&
|
||||||
|
@ -5508,7 +5515,7 @@ switcher_destroy(struct switcher *switcher)
|
||||||
struct weston_keyboard *keyboard = switcher->grab.keyboard;
|
struct weston_keyboard *keyboard = switcher->grab.keyboard;
|
||||||
struct workspace *ws = get_current_workspace(switcher->shell);
|
struct workspace *ws = get_current_workspace(switcher->shell);
|
||||||
|
|
||||||
wl_list_for_each(view, &ws->layer.view_list, layer_link) {
|
wl_list_for_each(view, &ws->layer.view_list.link, layer_link.link) {
|
||||||
if (is_focus_view(view))
|
if (is_focus_view(view))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -5529,8 +5536,8 @@ switcher_destroy(struct switcher *switcher)
|
||||||
wl_array_for_each(minimized, &switcher->minimized_array) {
|
wl_array_for_each(minimized, &switcher->minimized_array) {
|
||||||
/* with the exception of the current selected */
|
/* with the exception of the current selected */
|
||||||
if ((*minimized)->surface != switcher->current) {
|
if ((*minimized)->surface != switcher->current) {
|
||||||
wl_list_remove(&(*minimized)->layer_link);
|
weston_layer_entry_remove(&(*minimized)->layer_link);
|
||||||
wl_list_insert(&switcher->shell->minimized_layer.view_list, &(*minimized)->layer_link);
|
weston_layer_entry_insert(&switcher->shell->minimized_layer.view_list, &(*minimized)->layer_link);
|
||||||
weston_view_damage_below(*minimized);
|
weston_view_damage_below(*minimized);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5934,7 +5941,7 @@ shell_output_destroy_move_layer(struct desktop_shell *shell,
|
||||||
struct weston_output *output = data;
|
struct weston_output *output = data;
|
||||||
struct weston_view *view;
|
struct weston_view *view;
|
||||||
|
|
||||||
wl_list_for_each(view, &layer->view_list, layer_link) {
|
wl_list_for_each(view, &layer->view_list.link, layer_link.link) {
|
||||||
if (view->output != output)
|
if (view->output != output)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -5993,7 +6000,7 @@ handle_output_move_layer(struct desktop_shell *shell,
|
||||||
struct weston_view *view;
|
struct weston_view *view;
|
||||||
float x, y;
|
float x, y;
|
||||||
|
|
||||||
wl_list_for_each(view, &layer->view_list, layer_link) {
|
wl_list_for_each(view, &layer->view_list.link, layer_link.link) {
|
||||||
if (view->output != output)
|
if (view->output != output)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
|
@ -345,9 +345,10 @@ weston_view_create(struct weston_surface *surface)
|
||||||
|
|
||||||
wl_signal_init(&view->destroy_signal);
|
wl_signal_init(&view->destroy_signal);
|
||||||
wl_list_init(&view->link);
|
wl_list_init(&view->link);
|
||||||
wl_list_init(&view->layer_link);
|
wl_list_init(&view->layer_link.link);
|
||||||
|
|
||||||
view->plane = NULL;
|
view->plane = NULL;
|
||||||
|
view->layer_link.layer = NULL;
|
||||||
|
|
||||||
pixman_region32_init(&view->clip);
|
pixman_region32_init(&view->clip);
|
||||||
|
|
||||||
|
@ -1366,8 +1367,7 @@ weston_view_unmap(struct weston_view *view)
|
||||||
weston_view_damage_below(view);
|
weston_view_damage_below(view);
|
||||||
view->output = NULL;
|
view->output = NULL;
|
||||||
view->plane = NULL;
|
view->plane = NULL;
|
||||||
wl_list_remove(&view->layer_link);
|
weston_layer_entry_remove(&view->layer_link);
|
||||||
wl_list_init(&view->layer_link);
|
|
||||||
wl_list_remove(&view->link);
|
wl_list_remove(&view->link);
|
||||||
wl_list_init(&view->link);
|
wl_list_init(&view->link);
|
||||||
view->output_mask = 0;
|
view->output_mask = 0;
|
||||||
|
@ -1422,7 +1422,7 @@ weston_view_destroy(struct weston_view *view)
|
||||||
}
|
}
|
||||||
|
|
||||||
wl_list_remove(&view->link);
|
wl_list_remove(&view->link);
|
||||||
wl_list_remove(&view->layer_link);
|
weston_layer_entry_remove(&view->layer_link);
|
||||||
|
|
||||||
pixman_region32_fini(&view->clip);
|
pixman_region32_fini(&view->clip);
|
||||||
pixman_region32_fini(&view->transform.boundingbox);
|
pixman_region32_fini(&view->transform.boundingbox);
|
||||||
|
@ -1783,18 +1783,18 @@ weston_compositor_build_view_list(struct weston_compositor *compositor)
|
||||||
struct weston_layer *layer;
|
struct weston_layer *layer;
|
||||||
|
|
||||||
wl_list_for_each(layer, &compositor->layer_list, link)
|
wl_list_for_each(layer, &compositor->layer_list, link)
|
||||||
wl_list_for_each(view, &layer->view_list, layer_link)
|
wl_list_for_each(view, &layer->view_list.link, layer_link.link)
|
||||||
surface_stash_subsurface_views(view->surface);
|
surface_stash_subsurface_views(view->surface);
|
||||||
|
|
||||||
wl_list_init(&compositor->view_list);
|
wl_list_init(&compositor->view_list);
|
||||||
wl_list_for_each(layer, &compositor->layer_list, link) {
|
wl_list_for_each(layer, &compositor->layer_list, link) {
|
||||||
wl_list_for_each(view, &layer->view_list, layer_link) {
|
wl_list_for_each(view, &layer->view_list.link, layer_link.link) {
|
||||||
view_list_add(compositor, view);
|
view_list_add(compositor, view);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wl_list_for_each(layer, &compositor->layer_list, link)
|
wl_list_for_each(layer, &compositor->layer_list, link)
|
||||||
wl_list_for_each(view, &layer->view_list, layer_link)
|
wl_list_for_each(view, &layer->view_list.link, layer_link.link)
|
||||||
surface_free_unused_subsurface_views(view->surface);
|
surface_free_unused_subsurface_views(view->surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1912,10 +1912,27 @@ idle_repaint(void *data)
|
||||||
output->start_repaint_loop(output);
|
output->start_repaint_loop(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WL_EXPORT void
|
||||||
|
weston_layer_entry_insert(struct weston_layer_entry *list,
|
||||||
|
struct weston_layer_entry *entry)
|
||||||
|
{
|
||||||
|
wl_list_insert(&list->link, &entry->link);
|
||||||
|
entry->layer = list->layer;
|
||||||
|
}
|
||||||
|
|
||||||
|
WL_EXPORT void
|
||||||
|
weston_layer_entry_remove(struct weston_layer_entry *entry)
|
||||||
|
{
|
||||||
|
wl_list_remove(&entry->link);
|
||||||
|
wl_list_init(&entry->link);
|
||||||
|
entry->layer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
WL_EXPORT void
|
WL_EXPORT void
|
||||||
weston_layer_init(struct weston_layer *layer, struct wl_list *below)
|
weston_layer_init(struct weston_layer *layer, struct wl_list *below)
|
||||||
{
|
{
|
||||||
wl_list_init(&layer->view_list);
|
wl_list_init(&layer->view_list.link);
|
||||||
|
layer->view_list.layer = layer;
|
||||||
if (below != NULL)
|
if (below != NULL)
|
||||||
wl_list_insert(below, &layer->link);
|
wl_list_insert(below, &layer->link);
|
||||||
}
|
}
|
||||||
|
|
|
@ -526,8 +526,13 @@ enum {
|
||||||
* to off */
|
* to off */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct weston_layer_entry {
|
||||||
|
struct wl_list link;
|
||||||
|
struct weston_layer *layer;
|
||||||
|
};
|
||||||
|
|
||||||
struct weston_layer {
|
struct weston_layer {
|
||||||
struct wl_list view_list;
|
struct weston_layer_entry view_list;
|
||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -731,7 +736,7 @@ struct weston_view {
|
||||||
struct wl_signal destroy_signal;
|
struct wl_signal destroy_signal;
|
||||||
|
|
||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
struct wl_list layer_link;
|
struct weston_layer_entry layer_link;
|
||||||
struct weston_plane *plane;
|
struct weston_plane *plane;
|
||||||
|
|
||||||
pixman_region32_t clip;
|
pixman_region32_t clip;
|
||||||
|
@ -996,6 +1001,11 @@ notify_touch(struct weston_seat *seat, uint32_t time, int touch_id,
|
||||||
void
|
void
|
||||||
notify_touch_frame(struct weston_seat *seat);
|
notify_touch_frame(struct weston_seat *seat);
|
||||||
|
|
||||||
|
void
|
||||||
|
weston_layer_entry_insert(struct weston_layer_entry *list,
|
||||||
|
struct weston_layer_entry *entry);
|
||||||
|
void
|
||||||
|
weston_layer_entry_remove(struct weston_layer_entry *entry);
|
||||||
void
|
void
|
||||||
weston_layer_init(struct weston_layer *layer, struct wl_list *below);
|
weston_layer_init(struct weston_layer *layer, struct wl_list *below);
|
||||||
|
|
||||||
|
|
|
@ -180,7 +180,7 @@ drag_surface_configure(struct weston_drag *drag,
|
||||||
struct weston_surface *es,
|
struct weston_surface *es,
|
||||||
int32_t sx, int32_t sy)
|
int32_t sx, int32_t sy)
|
||||||
{
|
{
|
||||||
struct wl_list *list;
|
struct weston_layer_entry *list;
|
||||||
float fx, fy;
|
float fx, fy;
|
||||||
|
|
||||||
assert((pointer != NULL && touch == NULL) ||
|
assert((pointer != NULL && touch == NULL) ||
|
||||||
|
@ -193,8 +193,8 @@ drag_surface_configure(struct weston_drag *drag,
|
||||||
else
|
else
|
||||||
list = &es->compositor->cursor_layer.view_list;
|
list = &es->compositor->cursor_layer.view_list;
|
||||||
|
|
||||||
wl_list_remove(&drag->icon->layer_link);
|
weston_layer_entry_remove(&drag->icon->layer_link);
|
||||||
wl_list_insert(list, &drag->icon->layer_link);
|
weston_layer_entry_insert(list, &drag->icon->layer_link);
|
||||||
weston_view_update_transform(drag->icon);
|
weston_view_update_transform(drag->icon);
|
||||||
pixman_region32_clear(&es->pending.input);
|
pixman_region32_clear(&es->pending.input);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1555,8 +1555,8 @@ pointer_cursor_surface_configure(struct weston_surface *es,
|
||||||
empty_region(&es->input);
|
empty_region(&es->input);
|
||||||
|
|
||||||
if (!weston_surface_is_mapped(es)) {
|
if (!weston_surface_is_mapped(es)) {
|
||||||
wl_list_insert(&es->compositor->cursor_layer.view_list,
|
weston_layer_entry_insert(&es->compositor->cursor_layer.view_list,
|
||||||
&pointer->sprite->layer_link);
|
&pointer->sprite->layer_link);
|
||||||
weston_view_update_transform(pointer->sprite);
|
weston_view_update_transform(pointer->sprite);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,9 +93,9 @@ test_surface_configure(struct weston_surface *surface, int32_t sx, int32_t sy)
|
||||||
struct weston_test_surface *test_surface = surface->configure_private;
|
struct weston_test_surface *test_surface = surface->configure_private;
|
||||||
struct weston_test *test = test_surface->test;
|
struct weston_test *test = test_surface->test;
|
||||||
|
|
||||||
if (wl_list_empty(&test_surface->view->layer_link))
|
if (wl_list_empty(&test_surface->view->layer_link.link))
|
||||||
wl_list_insert(&test->layer.view_list,
|
weston_layer_entry_insert(&test->layer.view_list,
|
||||||
&test_surface->view->layer_link);
|
&test_surface->view->layer_link);
|
||||||
|
|
||||||
weston_view_set_position(test_surface->view,
|
weston_view_set_position(test_surface->view,
|
||||||
test_surface->x, test_surface->y);
|
test_surface->x, test_surface->y);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user