X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Flayout.c;h=48c478e9b0e904a94eeb7e13eddb6c310fbb44a7;hb=7ec377fb843d18ac29cd756b5833d94185706602;hp=e649d4c0665296ccf64cad5e1e605cbc832034eb;hpb=6d2720303d8441525ba2e37c9d87daef568f8cdc;p=src%2Fagl-compositor.git diff --git a/src/layout.c b/src/layout.c index e649d4c..48c478e 100644 --- a/src/layout.c +++ b/src/layout.c @@ -1,5 +1,5 @@ /* - * Copyright © 2019 Collabora, Ltd. + * Copyright © 2019, 2024 Collabora, Ltd. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the @@ -54,6 +54,81 @@ static const char *ivi_roles_as_string[] = { bool ivi_surf_in_hidden_layer(struct ivi_compositor *ivi, struct ivi_surface *surface); +void +ivi_layout_save(struct ivi_compositor *ivi, struct ivi_output *output) +{ + struct ivi_output *new_output; + ivi->need_ivi_output_relayout = true; + + new_output = zalloc(sizeof(*new_output)); + + new_output->ivi = ivi; + new_output->background = output->background; + + new_output->top = output->top; + new_output->bottom = output->bottom; + new_output->left = output->left; + new_output->right = output->right; + + new_output->active = output->active; + new_output->previous_active = output->previous_active; + new_output->name = strdup(output->name); + if (output->app_ids) + new_output->app_ids = strdup(output->app_ids); + + new_output->area = output->area; + new_output->area_saved = output->area_saved; + new_output->area_activation = output->area_activation; + + weston_log("saving output layout for output %s\n", new_output->name); + + wl_list_insert(&ivi->saved_outputs, &new_output->link); +} + +void +ivi_layout_restore(struct ivi_compositor *ivi, struct ivi_output *n_output) +{ + struct ivi_output *output = NULL; + struct ivi_output *iter_output; + + if (!ivi->need_ivi_output_relayout) + return; + + ivi->need_ivi_output_relayout = false; + + wl_list_for_each(iter_output, &ivi->saved_outputs, link) { + if (strcmp(n_output->name, iter_output->name) == 0) { + output = iter_output; + break; + } + } + + if (!output) + return; + + weston_log("restoring output layout for output %s\n", output->name); + n_output->background = output->background; + + n_output->top = output->top; + n_output->bottom = output->bottom; + n_output->left = output->left; + n_output->right = output->right; + + n_output->active = output->active; + n_output->previous_active = output->previous_active; + if (output->app_ids) + n_output->app_ids = strdup(output->app_ids); + + n_output->area = output->area; + n_output->area_saved = output->area_saved; + n_output->area_activation = output->area_activation; + + free(output->app_ids); + free(output->name); + wl_list_remove(&output->link); + free(output); +} + const char * ivi_layout_get_surface_role_name(struct ivi_surface *surf) { @@ -69,6 +144,8 @@ ivi_background_init(struct ivi_compositor *ivi, struct ivi_output *output) struct weston_output *woutput = output->output; struct ivi_surface *bg = output->background; struct weston_view *view; + struct weston_surface *wsurface = + weston_desktop_surface_get_surface(bg->dsurface); if (!bg) { weston_log("WARNING: Output does not have a background\n"); @@ -78,17 +155,15 @@ ivi_background_init(struct ivi_compositor *ivi, struct ivi_output *output) assert(bg->role == IVI_SURFACE_ROLE_BACKGROUND); view = bg->view; + weston_surface_map(wsurface); weston_view_set_output(view, woutput); weston_view_set_position(view, woutput->pos); + weston_view_move_to_layer(view, &ivi->background.view_list); weston_log("(background) position view %p, x %f, y %f, on output %s\n", view, woutput->pos.c.x, woutput->pos.c.y, output->name); - view->is_mapped = true; - view->surface->is_mapped = true; - - weston_layer_entry_insert(&ivi->background.view_list, &view->layer_link); } static void @@ -100,6 +175,7 @@ ivi_panel_init(struct ivi_compositor *ivi, struct ivi_output *output, struct weston_view *view; struct weston_geometry geom; struct weston_coord_global pos = woutput->pos; + struct weston_surface *wsurface; if (!panel) return; @@ -108,6 +184,7 @@ ivi_panel_init(struct ivi_compositor *ivi, struct ivi_output *output, dsurface = panel->dsurface; view = panel->view; geom = weston_desktop_surface_get_geometry(dsurface); + wsurface = weston_desktop_surface_get_surface(panel->dsurface); weston_log("(panel) geom.width %d, geom.height %d, geom.x %d, geom.y %d\n", geom.width, geom.height, geom.x, geom.y); @@ -137,16 +214,14 @@ ivi_panel_init(struct ivi_compositor *ivi, struct ivi_output *output, weston_view_set_output(view, woutput); weston_view_set_position(view, pos); + weston_surface_map(wsurface); + weston_view_move_to_layer(view, &ivi->panel.view_list); + weston_log("(panel) edge %d position view %p, x %f, y %f\n", panel->panel.edge, view, pos.c.x, pos.c.y); - view->is_mapped = true; - view->surface->is_mapped = true; - weston_log("panel type %d inited on output %s\n", panel->panel.edge, output->name); - - weston_layer_entry_insert(&ivi->panel.view_list, &view->layer_link); } /*