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.
dev
Giulio Camuffo 11 years ago committed by Jason Ekstrand
parent cfff312204
commit 412e6a59eb
  1. 4
      desktop-shell/exposay.c
  2. 5
      desktop-shell/input-panel.c
  3. 129
      desktop-shell/shell.c
  4. 33
      src/compositor.c
  5. 14
      src/compositor.h
  6. 6
      src/data-device.c
  7. 2
      src/input.c
  8. 4
      tests/weston-test.c

@ -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,7 +75,7 @@ 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);
@ -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,10 +865,10 @@ 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) {
@ -876,14 +877,14 @@ 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,
@ -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,15 +2221,18 @@ 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);
weston_layer_entry_remove(&child->view->layer_link);
weston_layer_entry_insert(prev,
&child->view->layer_link); &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(&current_ws->layer.view_list, &view->layer_link); weston_layer_entry_insert(&current_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,8 +2708,8 @@ 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,7 +4007,7 @@ 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,7 +4776,7 @@ 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);
@ -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,7 +1555,7 @@ 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,8 +93,8 @@ 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,

Loading…
Cancel
Save