2014-07-21 23:25 GMT+03:00 Jason Ekstrand <[email protected]>: > Guilio, > I think I figured out what bothered me about this patch. You use a > weston_layer_entry to store the list in weston_layer instead of just > wl_list. I think the code would actually be clearer if you just used > wl_list in that case. That way we avoid all of the layer.view_list.link > stuff which looks weird and inconsistent with the rest of our uses of the > word "link". Other than that, I'm ok with it. > --Jason
Actually that was a deliberate decision. The point is that weston_layer_entry_insert() needs two weston_layer_entry, both for the list and the entry, so to avoid special casing the insertion of a view at the head of the layer's list rather than in the middle of it I put a weston_layer_entry at the head of the list too. > > > On Fri, Jul 18, 2014 at 5:44 PM, Jason Ekstrand <[email protected]> > wrote: >> >> I'm not sure what I think about this patch. I really don't like >> recreating wl_list and calling it wl_layer_entry just to keep track of the >> layer pointer. However, I can't really think of a better solution off-hand. >> I'll think on it more and get back to you on Monday. >> --Jason Ekstrand >> >> >> On Wed, Jul 9, 2014 at 12:12 PM, Giulio Camuffo <[email protected]> >> wrote: >>> >>> 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. >>> --- >>> desktop-shell/exposay.c | 4 +- >>> desktop-shell/input-panel.c | 7 ++- >>> desktop-shell/shell.c | 145 >>> +++++++++++++++++++++++--------------------- >>> src/compositor.c | 33 +++++++--- >>> src/compositor.h | 14 ++++- >>> src/data-device.c | 6 +- >>> src/input.c | 4 +- >>> tests/weston-test.c | 6 +- >>> 8 files changed, 127 insertions(+), 92 deletions(-) >>> >>> diff --git a/desktop-shell/exposay.c b/desktop-shell/exposay.c >>> index 104b9d9..4b65cbd 100644 >>> --- a/desktop-shell/exposay.c >>> +++ b/desktop-shell/exposay.c >>> @@ -219,7 +219,7 @@ exposay_layout(struct desktop_shell *shell, struct >>> shell_output *shell_output) >>> int last_row_removed = 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)) >>> continue; >>> 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; >>> >>> 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; >>> >>> pad = eoutput->surface_size + eoutput->padding_inner; >>> diff --git a/desktop-shell/input-panel.c b/desktop-shell/input-panel.c >>> index 7623f6c..47bd73c 100644 >>> --- a/desktop-shell/input-panel.c >>> +++ b/desktop-shell/input-panel.c >>> @@ -75,8 +75,8 @@ show_input_panel_surface(struct input_panel_surface >>> *ipsurf) >>> weston_view_set_position(ipsurf->view, x, y); >>> } >>> >>> - wl_list_insert(&shell->input_panel_layer.view_list, >>> - &ipsurf->view->layer_link); >>> + weston_layer_entry_insert(&shell->input_panel_layer.view_list, >>> + &ipsurf->view->layer_link); >>> weston_view_geometry_dirty(ipsurf->view); >>> weston_view_update_transform(ipsurf->view); >>> 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_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); >>> } >>> >>> diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c >>> index f22cef8..6f6e25c 100644 >>> --- a/desktop-shell/shell.c >>> +++ b/desktop-shell/shell.c >>> @@ -279,12 +279,12 @@ shell_surface_is_top_fullscreen(struct >>> shell_surface *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; >>> >>> - 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, >>> - layer_link); >>> + layer_link.link); >>> return (shsurf == get_shell_surface(top_fs_ev->surface)); >>> } >>> >>> @@ -361,7 +361,7 @@ get_output_panel_height(struct desktop_shell *shell, >>> if (!output) >>> 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) { >>> panel_height = view->surface->height; >>> 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); >>> >>> 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) >>> continue; >>> if (is_focus_view(view)) >>> @@ -854,8 +855,8 @@ animate_focus_change(struct desktop_shell *shell, >>> struct workspace *ws, >>> >>> focus_surface_created = true; >>> } else { >>> - wl_list_remove(&ws->fsurf_front->view->layer_link); >>> - wl_list_remove(&ws->fsurf_back->view->layer_link); >>> + >>> weston_layer_entry_remove(&ws->fsurf_front->view->layer_link); >>> + >>> weston_layer_entry_remove(&ws->fsurf_back->view->layer_link); >>> } >>> >>> if (ws->focus_animation) { >>> @@ -864,11 +865,11 @@ animate_focus_change(struct desktop_shell *shell, >>> struct workspace *ws, >>> } >>> >>> if (to) >>> - wl_list_insert(&to->layer_link, >>> - &ws->fsurf_front->view->layer_link); >>> + weston_layer_entry_insert(&to->layer_link, >>> + >>> &ws->fsurf_front->view->layer_link); >>> else if (from) >>> - wl_list_insert(&ws->layer.view_list, >>> - &ws->fsurf_front->view->layer_link); >>> + weston_layer_entry_insert(&ws->layer.view_list, >>> + >>> &ws->fsurf_front->view->layer_link); >>> >>> if (focus_surface_created) { >>> 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, >>> focus_animation_done, ws); >>> } else if (from) { >>> - wl_list_insert(&from->layer_link, >>> - &ws->fsurf_back->view->layer_link); >>> + weston_layer_entry_insert(&from->layer_link, >>> + >>> &ws->fsurf_back->view->layer_link); >>> ws->focus_animation = weston_stable_fade_run( >>> ws->fsurf_front->view, 0.0, >>> ws->fsurf_back->view, 0.4, >>> focus_animation_done, ws); >>> } else if (to) { >>> - wl_list_insert(&ws->layer.view_list, >>> - &ws->fsurf_back->view->layer_link); >>> + weston_layer_entry_insert(&ws->layer.view_list, >>> + >>> &ws->fsurf_back->view->layer_link); >>> ws->focus_animation = weston_stable_fade_run( >>> ws->fsurf_front->view, 0.0, >>> ws->fsurf_back->view, 0.4, >>> @@ -944,7 +945,7 @@ workspace_create(void) >>> static int >>> 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 * >>> @@ -1009,7 +1010,7 @@ workspace_translate_out(struct workspace *ws, >>> double fraction) >>> unsigned int height; >>> 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); >>> d = height * fraction; >>> >>> @@ -1024,7 +1025,7 @@ workspace_translate_in(struct workspace *ws, double >>> fraction) >>> unsigned int height; >>> 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); >>> >>> if (fraction > 0) >>> @@ -1069,7 +1070,7 @@ workspace_deactivate_transforms(struct workspace >>> *ws) >>> struct weston_view *view; >>> 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)) { >>> struct focus_surface *fsurf = >>> get_focus_surface(view->surface); >>> 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 >>> * is hidden. In that case, we need to damage below those views >>> so >>> * 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); >>> >>> wl_list_remove(&shell->workspaces.animation.link); >>> @@ -1218,7 +1219,7 @@ change_workspace(struct desktop_shell *shell, >>> unsigned int index) >>> return; >>> >>> /* 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; >>> >>> from = get_current_workspace(shell); >>> @@ -1262,7 +1263,7 @@ change_workspace(struct desktop_shell *shell, >>> unsigned int index) >>> static bool >>> 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; >>> >>> if (wl_list_empty(list)) >>> @@ -1273,7 +1274,7 @@ workspace_has_only(struct workspace *ws, struct >>> weston_surface *surface) >>> if (e->next != list) >>> 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 >>> @@ -1302,8 +1303,8 @@ move_surface_to_workspace(struct desktop_shell >>> *shell, >>> from = get_current_workspace(shell); >>> to = get_workspace(shell, workspace); >>> >>> - wl_list_remove(&view->layer_link); >>> - wl_list_insert(&to->layer.view_list, &view->layer_link); >>> + weston_layer_entry_remove(&view->layer_link); >>> + weston_layer_entry_insert(&to->layer.view_list, >>> &view->layer_link); >>> >>> 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); >>> to = get_workspace(shell, index); >>> >>> - wl_list_remove(&view->layer_link); >>> - wl_list_insert(&to->layer.view_list, &view->layer_link); >>> + weston_layer_entry_remove(&view->layer_link); >>> + weston_layer_entry_insert(&to->layer.view_list, >>> &view->layer_link); >>> >>> shsurf = get_shell_surface(surface); >>> if (shsurf != NULL) >>> @@ -2177,7 +2178,7 @@ restore_all_output_modes(struct weston_compositor >>> *compositor) >>> /* 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 link). */ >>> -static struct wl_list * >>> +static struct weston_layer_entry * >>> shell_surface_calculate_layer_link (struct shell_surface *shsurf) >>> { >>> struct workspace *ws; >>> @@ -2203,7 +2204,8 @@ shell_surface_calculate_layer_link (struct >>> shell_surface *shsurf) >>> /* TODO: Handle a parent with multiple views */ >>> parent = get_default_view(shsurf->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 >>> @@ -2220,16 +2222,19 @@ static void >>> shell_surface_update_child_surface_layers (struct shell_surface *shsurf) >>> { >>> struct shell_surface *child; >>> + struct weston_layer_entry *prev; >>> >>> /* Move the child layers to the same workspace as shsurf. They >>> will be >>> * stacked above shsurf. */ >>> 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_geometry_dirty(child->view); >>> - wl_list_remove(&child->view->layer_link); >>> - wl_list_insert(shsurf->view->layer_link.prev, >>> - &child->view->layer_link); >>> + prev = >>> container_of(shsurf->view->layer_link.link.prev, >>> + struct weston_layer_entry, >>> 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_surface_damage(child->surface); >>> >>> @@ -2250,7 +2255,7 @@ shell_surface_update_child_surface_layers (struct >>> shell_surface *shsurf) >>> static void >>> 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); >>> >>> @@ -2260,8 +2265,8 @@ shell_surface_update_layer(struct shell_surface >>> *shsurf) >>> return; >>> >>> weston_view_geometry_dirty(shsurf->view); >>> - wl_list_remove(&shsurf->view->layer_link); >>> - wl_list_insert(new_layer_link, &shsurf->view->layer_link); >>> + weston_layer_entry_remove(&shsurf->view->layer_link); >>> + weston_layer_entry_insert(new_layer_link, >>> &shsurf->view->layer_link); >>> weston_view_geometry_dirty(shsurf->view); >>> weston_surface_damage(shsurf->surface); >>> >>> @@ -2523,10 +2528,10 @@ set_minimized(struct weston_surface *surface, >>> uint32_t is_true) >>> shsurf = get_shell_surface(surface); >>> 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 */ >>> 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); >>> wl_list_for_each(seat, >>> &shsurf->shell->compositor->seat_list, link) { >>> @@ -2538,7 +2543,7 @@ set_minimized(struct weston_surface *surface, >>> uint32_t is_true) >>> } >>> } >>> 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) { >>> if (!seat->keyboard) >>> @@ -2704,9 +2709,9 @@ shell_ensure_fullscreen_black_view(struct >>> shell_surface *shsurf) >>> output->height); >>> >>> weston_view_geometry_dirty(shsurf->fullscreen.black_view); >>> - wl_list_remove(&shsurf->fullscreen.black_view->layer_link); >>> - wl_list_insert(&shsurf->view->layer_link, >>> - &shsurf->fullscreen.black_view->layer_link); >>> + >>> weston_layer_entry_remove(&shsurf->fullscreen.black_view->layer_link); >>> + weston_layer_entry_insert(&shsurf->view->layer_link, >>> + >>> &shsurf->fullscreen.black_view->layer_link); >>> weston_view_geometry_dirty(shsurf->fullscreen.black_view); >>> weston_surface_damage(shsurf->surface); >>> >>> @@ -2728,8 +2733,8 @@ shell_configure_fullscreen(struct shell_surface >>> *shsurf) >>> restore_output_mode(output); >>> >>> /* Reverse the effect of lower_fullscreen_layer() */ >>> - wl_list_remove(&shsurf->view->layer_link); >>> - wl_list_insert(&shsurf->shell->fullscreen_layer.view_list, >>> &shsurf->view->layer_link); >>> + weston_layer_entry_remove(&shsurf->view->layer_link); >>> + >>> weston_layer_entry_insert(&shsurf->shell->fullscreen_layer.view_list, >>> &shsurf->view->layer_link); >>> >>> shell_ensure_fullscreen_black_view(shsurf); >>> >>> @@ -3888,7 +3893,7 @@ configure_static_view(struct weston_view *ev, >>> struct weston_layer *layer) >>> { >>> 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) { >>> weston_view_unmap(v); >>> v->surface->configure = NULL; >>> @@ -3897,8 +3902,8 @@ configure_static_view(struct weston_view *ev, >>> struct weston_layer *layer) >>> >>> weston_view_set_position(ev, ev->output->x, ev->output->y); >>> >>> - if (wl_list_empty(&ev->layer_link)) { >>> - wl_list_insert(&layer->view_list, &ev->layer_link); >>> + if (wl_list_empty(&ev->layer_link.link)) { >>> + weston_layer_entry_insert(&layer->view_list, >>> &ev->layer_link); >>> >>> weston_compositor_schedule_repaint(ev->surface->compositor); >>> } >>> } >>> @@ -4003,8 +4008,8 @@ lock_surface_configure(struct weston_surface >>> *surface, int32_t sx, int32_t sy) >>> center_on_output(view, get_default_output(shell->compositor)); >>> >>> if (!weston_surface_is_mapped(surface)) { >>> - wl_list_insert(&shell->lock_layer.view_list, >>> - &view->layer_link); >>> + weston_layer_entry_insert(&shell->lock_layer.view_list, >>> + &view->layer_link); >>> weston_view_update_transform(view); >>> shell_fade(shell, FADE_IN); >>> } >>> @@ -4534,8 +4539,8 @@ lower_fullscreen_layer(struct desktop_shell *shell) >>> >>> ws = get_current_workspace(shell); >>> wl_list_for_each_reverse_safe(view, prev, >>> - &shell->fullscreen_layer.view_list, >>> - layer_link) { >>> + >>> &shell->fullscreen_layer.view_list.link, >>> + layer_link.link) { >>> struct shell_surface *shsurf = >>> get_shell_surface(view->surface); >>> >>> if (!shsurf) >>> @@ -4545,15 +4550,15 @@ lower_fullscreen_layer(struct desktop_shell >>> *shell) >>> * in the fullscreen layer. */ >>> if (shsurf->state.fullscreen) { >>> /* Hide the black view */ >>> - >>> wl_list_remove(&shsurf->fullscreen.black_view->layer_link); >>> - >>> wl_list_init(&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.link); >>> >>> weston_view_damage_below(shsurf->fullscreen.black_view); >>> >>> } >>> >>> /* Lower the view to the workspace layer */ >>> - wl_list_remove(&view->layer_link); >>> - wl_list_insert(&ws->layer.view_list, &view->layer_link); >>> + weston_layer_entry_remove(&view->layer_link); >>> + weston_layer_entry_insert(&ws->layer.view_list, >>> &view->layer_link); >>> weston_view_damage_below(view); >>> weston_surface_damage(view->surface); >>> >>> @@ -4772,8 +4777,8 @@ shell_fade_create_surface(struct desktop_shell >>> *shell) >>> weston_surface_set_size(surface, 8192, 8192); >>> weston_view_set_position(view, 0, 0); >>> weston_surface_set_color(surface, 0.0, 0.0, 0.0, 1.0); >>> - wl_list_insert(&compositor->fade_layer.view_list, >>> - &view->layer_link); >>> + weston_layer_entry_insert(&compositor->fade_layer.view_list, >>> + &view->layer_link); >>> pixman_region32_init(&surface->input); >>> >>> return view; >>> @@ -5343,6 +5348,7 @@ screensaver_configure(struct weston_surface >>> *surface, int32_t sx, int32_t sy) >>> { >>> struct desktop_shell *shell = surface->configure_private; >>> struct weston_view *view; >>> + struct weston_layer_entry *prev; >>> >>> if (surface->width == 0) >>> return; >>> @@ -5354,9 +5360,10 @@ screensaver_configure(struct weston_surface >>> *surface, int32_t sx, int32_t sy) >>> view = container_of(surface->views.next, struct weston_view, >>> surface_link); >>> center_on_output(view, surface->output); >>> >>> - if (wl_list_empty(&view->layer_link)) { >>> - wl_list_insert(shell->lock_layer.view_list.prev, >>> - &view->layer_link); >>> + if (wl_list_empty(&view->layer_link.link)) { >>> + prev = >>> container_of(shell->lock_layer.view_list.link.prev, >>> + struct weston_layer_entry, link); >>> + weston_layer_entry_insert(prev, &view->layer_link); >>> weston_view_update_transform(view); >>> wl_event_source_timer_update(shell->screensaver.timer, >>> >>> shell->screensaver.duration); >>> @@ -5439,14 +5446,14 @@ switcher_next(struct switcher *switcher) >>> /* temporary re-display minimized surfaces */ >>> struct weston_view *tmp; >>> struct weston_view **minimized; >>> - wl_list_for_each_safe(view, tmp, >>> &switcher->shell->minimized_layer.view_list, layer_link) { >>> - wl_list_remove(&view->layer_link); >>> - wl_list_insert(&ws->layer.view_list, &view->layer_link); >>> + wl_list_for_each_safe(view, tmp, >>> &switcher->shell->minimized_layer.view_list.link, layer_link.link) { >>> + weston_layer_entry_remove(&view->layer_link); >>> + weston_layer_entry_insert(&ws->layer.view_list, >>> &view->layer_link); >>> minimized = wl_array_add(&switcher->minimized_array, >>> sizeof *minimized); >>> *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); >>> if (shsurf && >>> shsurf->type == SHELL_SURFACE_TOPLEVEL && >>> @@ -5502,7 +5509,7 @@ switcher_destroy(struct switcher *switcher) >>> struct weston_keyboard *keyboard = switcher->grab.keyboard; >>> 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)) >>> continue; >>> >>> @@ -5523,8 +5530,8 @@ switcher_destroy(struct switcher *switcher) >>> wl_array_for_each(minimized, &switcher->minimized_array) { >>> /* with the exception of the current selected */ >>> if ((*minimized)->surface != switcher->current) { >>> - wl_list_remove(&(*minimized)->layer_link); >>> - >>> wl_list_insert(&switcher->shell->minimized_layer.view_list, >>> &(*minimized)->layer_link); >>> + >>> weston_layer_entry_remove(&(*minimized)->layer_link); >>> + >>> weston_layer_entry_insert(&switcher->shell->minimized_layer.view_list, >>> &(*minimized)->layer_link); >>> weston_view_damage_below(*minimized); >>> } >>> } >>> @@ -5928,7 +5935,7 @@ shell_output_destroy_move_layer(struct >>> desktop_shell *shell, >>> struct weston_output *output = data; >>> 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) >>> continue; >>> >>> @@ -5987,7 +5994,7 @@ handle_output_move_layer(struct desktop_shell >>> *shell, >>> struct weston_view *view; >>> 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) >>> continue; >>> >>> diff --git a/src/compositor.c b/src/compositor.c >>> index 17fce8d..1d8d00e 100644 >>> --- a/src/compositor.c >>> +++ b/src/compositor.c >>> @@ -345,9 +345,10 @@ weston_view_create(struct weston_surface *surface) >>> >>> wl_signal_init(&view->destroy_signal); >>> wl_list_init(&view->link); >>> - wl_list_init(&view->layer_link); >>> + wl_list_init(&view->layer_link.link); >>> >>> view->plane = NULL; >>> + view->layer_link.layer = NULL; >>> >>> pixman_region32_init(&view->clip); >>> >>> @@ -1366,8 +1367,7 @@ weston_view_unmap(struct weston_view *view) >>> weston_view_damage_below(view); >>> view->output = NULL; >>> view->plane = NULL; >>> - wl_list_remove(&view->layer_link); >>> - wl_list_init(&view->layer_link); >>> + weston_layer_entry_remove(&view->layer_link); >>> wl_list_remove(&view->link); >>> wl_list_init(&view->link); >>> view->output_mask = 0; >>> @@ -1422,7 +1422,7 @@ weston_view_destroy(struct weston_view *view) >>> } >>> >>> 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->transform.boundingbox); >>> @@ -1783,18 +1783,18 @@ weston_compositor_build_view_list(struct >>> weston_compositor *compositor) >>> struct weston_layer *layer; >>> >>> 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); >>> >>> wl_list_init(&compositor->view_list); >>> 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); >>> } >>> } >>> >>> 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); >>> } >>> >>> @@ -1913,9 +1913,26 @@ idle_repaint(void *data) >>> } >>> >>> 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 >>> 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) >>> wl_list_insert(below, &layer->link); >>> } >>> diff --git a/src/compositor.h b/src/compositor.h >>> index bef5e1d..78a59cb 100644 >>> --- a/src/compositor.h >>> +++ b/src/compositor.h >>> @@ -526,8 +526,13 @@ enum { >>> * to off */ >>> }; >>> >>> +struct weston_layer_entry { >>> + struct wl_list link; >>> + struct weston_layer *layer; >>> +}; >>> + >>> struct weston_layer { >>> - struct wl_list view_list; >>> + struct weston_layer_entry view_list; >>> struct wl_list link; >>> }; >>> >>> @@ -731,7 +736,7 @@ struct weston_view { >>> struct wl_signal destroy_signal; >>> >>> struct wl_list link; >>> - struct wl_list layer_link; >>> + struct weston_layer_entry layer_link; >>> struct weston_plane *plane; >>> >>> pixman_region32_t clip; >>> @@ -997,6 +1002,11 @@ void >>> 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 >>> weston_layer_init(struct weston_layer *layer, struct wl_list *below); >>> >>> void >>> diff --git a/src/data-device.c b/src/data-device.c >>> index a069b3c..75fc60c 100644 >>> --- a/src/data-device.c >>> +++ b/src/data-device.c >>> @@ -180,7 +180,7 @@ drag_surface_configure(struct weston_drag *drag, >>> struct weston_surface *es, >>> int32_t sx, int32_t sy) >>> { >>> - struct wl_list *list; >>> + struct weston_layer_entry *list; >>> float fx, fy; >>> >>> assert((pointer != NULL && touch == NULL) || >>> @@ -193,8 +193,8 @@ drag_surface_configure(struct weston_drag *drag, >>> else >>> list = &es->compositor->cursor_layer.view_list; >>> >>> - wl_list_remove(&drag->icon->layer_link); >>> - wl_list_insert(list, &drag->icon->layer_link); >>> + weston_layer_entry_remove(&drag->icon->layer_link); >>> + weston_layer_entry_insert(list, &drag->icon->layer_link); >>> weston_view_update_transform(drag->icon); >>> pixman_region32_clear(&es->pending.input); >>> } >>> diff --git a/src/input.c b/src/input.c >>> index 2c799f4..4aa8ca7 100644 >>> --- a/src/input.c >>> +++ b/src/input.c >>> @@ -1555,8 +1555,8 @@ pointer_cursor_surface_configure(struct >>> weston_surface *es, >>> empty_region(&es->input); >>> >>> if (!weston_surface_is_mapped(es)) { >>> - wl_list_insert(&es->compositor->cursor_layer.view_list, >>> - &pointer->sprite->layer_link); >>> + >>> weston_layer_entry_insert(&es->compositor->cursor_layer.view_list, >>> + &pointer->sprite->layer_link); >>> weston_view_update_transform(pointer->sprite); >>> } >>> } >>> diff --git a/tests/weston-test.c b/tests/weston-test.c >>> index 35ccaa4..ca2f219 100644 >>> --- a/tests/weston-test.c >>> +++ b/tests/weston-test.c >>> @@ -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 *test = test_surface->test; >>> >>> - if (wl_list_empty(&test_surface->view->layer_link)) >>> - wl_list_insert(&test->layer.view_list, >>> - &test_surface->view->layer_link); >>> + if (wl_list_empty(&test_surface->view->layer_link.link)) >>> + weston_layer_entry_insert(&test->layer.view_list, >>> + >>> &test_surface->view->layer_link); >>> >>> weston_view_set_position(test_surface->view, >>> test_surface->x, test_surface->y); >>> -- >>> 2.0.0 >>> >>> _______________________________________________ >>> wayland-devel mailing list >>> [email protected] >>> http://lists.freedesktop.org/mailman/listinfo/wayland-devel >> >> > _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
