[PATCH weston 1/2] compositor: keep track of the weston_layer a weston_view is in

Jason Ekstrand jason at jlekstrand.net
Wed Jul 23 12:26:57 PDT 2014


On Wed, Jul 23, 2014 at 11:35 AM, Giulio Camuffo <giuliocamuffo at gmail.com>
wrote:

> 2014-07-21 23:25 GMT+03:00 Jason Ekstrand <jason at jlekstrand.net>:
> > 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.
>

Ok, I guess that's fine.  I'll get these two merged once I test a little.
--Jason


>
> >
> >
> > On Fri, Jul 18, 2014 at 5:44 PM, Jason Ekstrand <jason at jlekstrand.net>
> > 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 <
> giuliocamuffo at gmail.com>
> >> 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(&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) {
> >>>                         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
> >>> wayland-devel at lists.freedesktop.org
> >>> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> >>
> >>
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20140723/df459ff3/attachment-0001.html>


More information about the wayland-devel mailing list