X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fshell.c;h=abd3cf1b0b86f3418e2ada7a401a840dcd71f5bc;hb=a0e11353f78cdfea9f64244b69542511654a8c53;hp=2e27742cd4c2658b7f09d1675fe6c482c7ee9698;hpb=16d8d1af63ea1bbdaa9223cbf3e01cb6698f1eb0;p=src%2Fagl-compositor.git diff --git a/src/shell.c b/src/shell.c index 2e27742..abd3cf1 100644 --- a/src/shell.c +++ b/src/shell.c @@ -778,7 +778,7 @@ ivi_shell_finalize(struct ivi_compositor *ivi) wl_list_for_each(output, &ivi->outputs, link) { if (output->fullscreen_view.fs && output->fullscreen_view.fs->view) { - weston_surface_destroy(output->fullscreen_view.fs->view->surface); + weston_surface_unref(output->fullscreen_view.fs->view->surface); output->fullscreen_view.fs->view = NULL; } } @@ -1022,41 +1022,72 @@ destroy_black_curtain_view(struct wl_listener *listener, void *data) } +int +curtain_get_label(struct weston_surface *surface, char *buf, size_t len) +{ + return snprintf(buf, len, "%s", "black curtain"); +} + +static void +curtain_surface_committed(struct weston_surface *es, struct weston_coord_surface new_origin) +{ + +} + + static void create_black_curtain_view(struct ivi_output *output) { struct weston_surface *surface = NULL; struct weston_view *view; struct ivi_compositor *ivi = output->ivi; - struct weston_compositor *wc= ivi->compositor; + struct weston_compositor *ec = ivi->compositor; struct weston_output *woutput = output->output; + struct weston_buffer_reference *buffer_ref; if (!woutput) return; - surface = weston_surface_create(wc); + surface = weston_surface_create(ec); if (!surface) return; + view = weston_view_create(surface); - if (!view) { - weston_surface_destroy(surface); - return; - } + if (!view) + goto err_surface; - weston_surface_set_color(surface, 0.0, 0.0, 0.0, 1); + buffer_ref = weston_buffer_create_solid_rgba(ec, 0.0, 0.0, 0.0, 1.0); + if (buffer_ref == NULL) + goto err_view; + + surface->committed = curtain_surface_committed; + surface->committed_private = NULL; weston_surface_set_size(surface, woutput->width, woutput->height); + + weston_surface_attach_solid(surface, buffer_ref, + woutput->width, woutput->height); + + weston_surface_set_label_func(surface, curtain_get_label); weston_view_set_position(view, woutput->x, woutput->y); output->fullscreen_view.fs = zalloc(sizeof(struct ivi_surface)); - if (!output->fullscreen_view.fs) { - weston_surface_destroy(surface); - return; - } + if (!output->fullscreen_view.fs) + goto err_view; + output->fullscreen_view.fs->view = view; + output->fullscreen_view.buffer_ref = buffer_ref; - output->fullscreen_view.fs_destroy.notify = destroy_black_curtain_view; + output->fullscreen_view.fs_destroy.notify = + destroy_black_curtain_view; wl_signal_add(&woutput->destroy_signal, &output->fullscreen_view.fs_destroy); + + return; + +err_view: + weston_view_destroy(view); +err_surface: + weston_surface_unref(surface); } bool @@ -1103,8 +1134,8 @@ insert_black_curtain(struct ivi_output *output) if ((!output && !output->fullscreen_view.fs && - !output->fullscreen_view.fs->view) || !output->output || - !output->fullscreen_view.fs) { + !output->fullscreen_view.fs->view) || + !output->output || !output->fullscreen_view.fs) { weston_log("Output %s doesn't have a surface installed!\n", output->name); return; } @@ -1829,6 +1860,7 @@ _ivi_set_shell_surface_split(struct ivi_surface *surface, struct ivi_output *iou bool to_activate) { struct ivi_compositor *ivi = surface->ivi; + struct weston_view *ev = surface->view; struct weston_geometry geom = {}; struct ivi_output *output = NULL; @@ -1884,8 +1916,8 @@ _ivi_set_shell_surface_split(struct ivi_surface *surface, struct ivi_output *iou weston_log("Resetting sticky window\n"); } - surface->role = IVI_SURFACE_ROLE_DESKTOP; - weston_log("Resetting tile role to desktop\n"); + surface->role = surface->prev_role; + weston_log("Resetting tile role to previous role\n"); break; default: /* nothing */ @@ -1903,7 +1935,6 @@ _ivi_set_shell_surface_split(struct ivi_surface *surface, struct ivi_output *iou if (to_activate) { - struct weston_view *ev = surface->view; struct ivi_shell_seat *ivi_seat = NULL; struct weston_seat *wseat = get_ivi_shell_weston_first_seat(ivi); @@ -1936,7 +1967,6 @@ _ivi_set_shell_surface_split(struct ivi_surface *surface, struct ivi_output *iou ivi_shell_activate_surface(surface, ivi_seat, WESTON_ACTIVATE_FLAG_NONE); } - weston_view_set_position(surface->view, x, y); weston_desktop_surface_set_size(surface->dsurface, new_width, new_height); weston_desktop_surface_set_orientation(surface->dsurface, orientation); @@ -1948,6 +1978,7 @@ _ivi_set_shell_surface_split(struct ivi_surface *surface, struct ivi_output *iou surface->sticky = sticky; if (orientation != AGL_SHELL_TILE_ORIENTATION_NONE) { + surface->prev_role = surface->role; surface->role = IVI_SURFACE_ROLE_TILE; weston_log("Found split orientation different that none, " "setting surface role to orientation tile\n"); @@ -2010,23 +2041,33 @@ void shell_set_app_split(struct wl_client *client, struct wl_resource *res, } if (output->previous_active && output->background != output->previous_active) { - struct weston_view *ev = output->previous_active->view; int width_prev_app = 0; + struct weston_view *ev = output->previous_active->view; const char *prev_app_id = weston_desktop_surface_get_app_id(output->previous_active->dsurface); - if (!weston_view_is_mapped(ev)) - weston_view_update_transform(ev); - else - weston_layer_entry_remove(&ev->layer_link); + if (orientation != AGL_SHELL_TILE_ORIENTATION_NONE) { + if (!weston_view_is_mapped(ev)) + weston_view_update_transform(ev); + else + weston_layer_entry_remove(&ev->layer_link); - ev->is_mapped = true; - ev->surface->is_mapped = true; - output->previous_active->mapped = true; + ev->is_mapped = true; + ev->surface->is_mapped = true; + output->previous_active->mapped = true; - weston_view_set_output(ev, woutput); + weston_view_set_output(ev, woutput); + weston_layer_entry_insert(&ivi->normal.view_list, + &ev->layer_link); + } else { + ev->is_mapped = false; + ev->surface->is_mapped = false; - weston_layer_entry_insert(&ivi->normal.view_list, &ev->layer_link); + weston_layer_entry_remove(&ev->layer_link); + + weston_view_geometry_dirty(ev); + weston_surface_damage(ev->surface); + } /* a 0 width means we have no explicit width set-up */ if (width > 0) {