These surface types don't exist anymore inside weston desktop shell implementation. They are just exposed as wl_shell surface types, but internally the implementation is done with surface states.
The previous behavior (setting a surface type unsets another one) still happens when using wl_shell. This change is mainly done as a refactory to allow xdg-shell to use the same code. --- src/shell.c | 224 +++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 123 insertions(+), 101 deletions(-) diff --git a/src/shell.c b/src/shell.c index f102e9a..cf89a84 100644 --- a/src/shell.c +++ b/src/shell.c @@ -237,8 +237,6 @@ enum shell_surface_type { SHELL_SURFACE_NONE, SHELL_SURFACE_TOPLEVEL, SHELL_SURFACE_TRANSIENT, - SHELL_SURFACE_FULLSCREEN, - SHELL_SURFACE_MAXIMIZED, SHELL_SURFACE_POPUP, SHELL_SURFACE_XWAYLAND }; @@ -298,6 +296,12 @@ struct shell_surface { struct wl_list link; const struct weston_shell_client *client; + + struct { + bool maximized; + bool fullscreen; + } cur, next; /* surface states */ + bool state_changed; }; struct shell_grab { @@ -1450,7 +1454,7 @@ surface_touch_move(struct shell_surface *shsurf, struct weston_seat *seat) if (!shsurf) return -1; - if (shsurf->type == SHELL_SURFACE_FULLSCREEN) + if (shsurf->cur.fullscreen) return 0; if (shsurf->grabbed) return 0; @@ -1541,7 +1545,7 @@ surface_move(struct shell_surface *shsurf, struct weston_seat *seat) if (shsurf->grabbed) return 0; - if (shsurf->type == SHELL_SURFACE_FULLSCREEN) + if (shsurf->cur.fullscreen) return 0; move = malloc(sizeof *move); @@ -1715,8 +1719,7 @@ surface_resize(struct shell_surface *shsurf, { struct weston_resize_grab *resize; - if (shsurf->type == SHELL_SURFACE_FULLSCREEN || - shsurf->type == SHELL_SURFACE_MAXIMIZED) + if (shsurf->cur.fullscreen || shsurf->cur.maximized) return 0; if (edges == 0 || edges > 15 || @@ -1746,7 +1749,7 @@ shell_surface_resize(struct wl_client *client, struct wl_resource *resource, struct shell_surface *shsurf = wl_resource_get_user_data(resource); struct weston_surface *surface; - if (shsurf->type == SHELL_SURFACE_FULLSCREEN) + if (shsurf->cur.fullscreen) return; surface = weston_surface_get_main_surface(seat->pointer->focus->surface); @@ -2061,26 +2064,31 @@ shell_unset_maximized(struct shell_surface *shsurf) static int reset_shell_surface_type(struct shell_surface *surface) { - switch (surface->type) { - case SHELL_SURFACE_FULLSCREEN: + if (surface->cur.fullscreen) shell_unset_fullscreen(surface); - break; - case SHELL_SURFACE_MAXIMIZED: + if (surface->cur.maximized) shell_unset_maximized(surface); - break; - case SHELL_SURFACE_NONE: - case SHELL_SURFACE_TOPLEVEL: - case SHELL_SURFACE_TRANSIENT: - case SHELL_SURFACE_POPUP: - case SHELL_SURFACE_XWAYLAND: - break; - } surface->type = SHELL_SURFACE_NONE; return 0; } static void +set_full_output(struct shell_surface *shsurf) +{ + shsurf->saved_x = shsurf->view->geometry.x; + shsurf->saved_y = shsurf->view->geometry.y; + shsurf->saved_position_valid = true; + + if (!wl_list_empty(&shsurf->rotation.transform.link)) { + wl_list_remove(&shsurf->rotation.transform.link); + wl_list_init(&shsurf->rotation.transform.link); + weston_view_geometry_dirty(shsurf->view); + shsurf->saved_rotation_valid = true; + } +} + +static void set_surface_type(struct shell_surface *shsurf) { struct weston_surface *pes = shsurf->parent; @@ -2089,10 +2097,14 @@ set_surface_type(struct shell_surface *shsurf) reset_shell_surface_type(shsurf); shsurf->type = shsurf->next_type; + shsurf->cur = shsurf->next; shsurf->next_type = SHELL_SURFACE_NONE; + shsurf->state_changed = false; switch (shsurf->type) { case SHELL_SURFACE_TOPLEVEL: + if (shsurf->cur.maximized || shsurf->cur.fullscreen) + set_full_output(shsurf); break; case SHELL_SURFACE_TRANSIENT: if (pev) @@ -2101,20 +2113,6 @@ set_surface_type(struct shell_surface *shsurf) pev->geometry.y + shsurf->transient.y); break; - case SHELL_SURFACE_MAXIMIZED: - case SHELL_SURFACE_FULLSCREEN: - shsurf->saved_x = shsurf->view->geometry.x; - shsurf->saved_y = shsurf->view->geometry.y; - shsurf->saved_position_valid = true; - - if (!wl_list_empty(&shsurf->rotation.transform.link)) { - wl_list_remove(&shsurf->rotation.transform.link); - wl_list_init(&shsurf->rotation.transform.link); - weston_view_geometry_dirty(shsurf->view); - shsurf->saved_rotation_valid = true; - } - break; - case SHELL_SURFACE_XWAYLAND: weston_view_set_position(shsurf->view, shsurf->transient.x, shsurf->transient.y); @@ -2126,9 +2124,20 @@ set_surface_type(struct shell_surface *shsurf) } static void +surface_clear_next_states(struct shell_surface *shsurf) +{ + shsurf->next.maximized = false; + shsurf->next.fullscreen = false; + + if ((shsurf->next.maximized != shsurf->cur.maximized) || + (shsurf->next.fullscreen != shsurf->cur.fullscreen)) + shsurf->state_changed = true; +} + +static void set_toplevel(struct shell_surface *shsurf) { - shsurf->next_type = SHELL_SURFACE_TOPLEVEL; + shsurf->next_type = SHELL_SURFACE_TOPLEVEL; } static void @@ -2137,6 +2146,7 @@ shell_surface_set_toplevel(struct wl_client *client, { struct shell_surface *surface = wl_resource_get_user_data(resource); + surface_clear_next_states(surface); set_toplevel(surface); } @@ -2150,6 +2160,7 @@ set_transient(struct shell_surface *shsurf, shsurf->transient.y = y; shsurf->transient.flags = flags; shsurf->next_type = SHELL_SURFACE_TRANSIENT; + surface_clear_next_states(shsurf); } static void @@ -2162,6 +2173,7 @@ shell_surface_set_transient(struct wl_client *client, struct weston_surface *parent = wl_resource_get_user_data(parent_resource); + surface_clear_next_states(shsurf); set_transient(shsurf, parent, x, y, flags); } @@ -2192,9 +2204,9 @@ get_output_panel_height(struct desktop_shell *shell, } static void -shell_surface_set_maximized(struct wl_client *client, - struct wl_resource *resource, - struct wl_resource *output_resource ) +set_maximized(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *output_resource) { struct shell_surface *shsurf = wl_resource_get_user_data(resource); struct weston_surface *es = shsurf->surface; @@ -2218,7 +2230,19 @@ shell_surface_set_maximized(struct wl_client *client, shsurf->output->width, shsurf->output->height - panel_height); - shsurf->next_type = SHELL_SURFACE_MAXIMIZED; + shsurf->next_type = shsurf->type; +} + +static void +shell_surface_set_maximized(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *output_resource) +{ + struct shell_surface *shsurf = wl_resource_get_user_data(resource); + surface_clear_next_states(shsurf); + set_maximized(client, resource, output_resource); + shsurf->next.maximized = true; + shsurf->state_changed = true; } static void @@ -2410,7 +2434,7 @@ set_fullscreen(struct shell_surface *shsurf, shsurf->fullscreen_output = shsurf->output; shsurf->fullscreen.type = method; shsurf->fullscreen.framerate = framerate; - shsurf->next_type = SHELL_SURFACE_FULLSCREEN; + shsurf->next_type = shsurf->type; shsurf->client->send_configure(shsurf->surface, 0, shsurf->output->width, @@ -2432,13 +2456,17 @@ shell_surface_set_fullscreen(struct wl_client *client, else output = NULL; + surface_clear_next_states(shsurf); set_fullscreen(shsurf, method, framerate, output); + shsurf->next.fullscreen = true; + shsurf->state_changed = true; } static void set_xwayland(struct shell_surface *shsurf, int x, int y, uint32_t flags) { /* XXX: using the same fields for transient type */ + surface_clear_next_states(shsurf); shsurf->transient.x = x; shsurf->transient.y = y; shsurf->transient.flags = flags; @@ -2684,6 +2712,7 @@ shell_surface_set_popup(struct wl_client *client, { struct shell_surface *shsurf = wl_resource_get_user_data(resource); + surface_clear_next_states(shsurf); shsurf->type = SHELL_SURFACE_POPUP; shsurf->parent = wl_resource_get_user_data(parent_resource); shsurf->popup.shseat = get_shell_seat(wl_resource_get_user_data(seat_resource)); @@ -3190,8 +3219,7 @@ move_binding(struct weston_seat *seat, uint32_t time, uint32_t button, void *dat return; shsurf = get_shell_surface(surface); - if (shsurf == NULL || shsurf->type == SHELL_SURFACE_FULLSCREEN || - shsurf->type == SHELL_SURFACE_MAXIMIZED) + if (shsurf == NULL || shsurf->cur.fullscreen || shsurf->cur.maximized) return; surface_move(shsurf, (struct weston_seat *) seat); @@ -3209,8 +3237,7 @@ touch_move_binding(struct weston_seat *seat, uint32_t time, void *data) return; shsurf = get_shell_surface(surface); - if (shsurf == NULL || shsurf->type == SHELL_SURFACE_FULLSCREEN || - shsurf->type == SHELL_SURFACE_MAXIMIZED) + if (shsurf == NULL || shsurf->cur.fullscreen || shsurf->cur.maximized) return; surface_touch_move(shsurf, (struct weston_seat *) seat); @@ -3230,8 +3257,7 @@ resize_binding(struct weston_seat *seat, uint32_t time, uint32_t button, void *d return; shsurf = get_shell_surface(surface); - if (!shsurf || shsurf->type == SHELL_SURFACE_FULLSCREEN || - shsurf->type == SHELL_SURFACE_MAXIMIZED) + if (!shsurf || shsurf->cur.fullscreen || shsurf->cur.maximized) return; weston_view_from_global(shsurf->view, @@ -3747,8 +3773,7 @@ rotate_binding(struct weston_seat *seat, uint32_t time, uint32_t button, return; surface = get_shell_surface(base_surface); - if (!surface || surface->type == SHELL_SURFACE_FULLSCREEN || - surface->type == SHELL_SURFACE_MAXIMIZED) + if (!surface || surface->cur.fullscreen || surface->cur.maximized) return; surface_rotate(surface, seat); @@ -3776,6 +3801,7 @@ activate(struct desktop_shell *shell, struct weston_surface *es, struct focus_state *state; struct workspace *ws; struct weston_surface *old_es; + struct shell_surface *shsurf; main_surface = weston_surface_get_main_surface(es); @@ -3790,21 +3816,20 @@ activate(struct desktop_shell *shell, struct weston_surface *es, wl_list_remove(&state->surface_destroy_listener.link); wl_signal_add(&es->destroy_signal, &state->surface_destroy_listener); - switch (get_shell_surface_type(main_surface)) { - case SHELL_SURFACE_FULLSCREEN: + shsurf = get_shell_surface(main_surface); + if (shsurf->cur.fullscreen) { /* should on top of panels */ shell_stack_fullscreen(get_shell_surface(main_surface)); shell_configure_fullscreen(get_shell_surface(main_surface)); return; - default: - restore_all_output_modes(shell->compositor); - ws = get_current_workspace(shell); - main_view = get_default_view(main_surface); - if (main_view) - weston_view_restack(main_view, &ws->layer.view_list); - break; } + restore_all_output_modes(shell->compositor); + ws = get_current_workspace(shell); + main_view = get_default_view(main_surface); + if (main_view) + weston_view_restack(main_view, &ws->layer.view_list); + if (shell->focus_animation_type != ANIMATION_NONE) animate_focus_change(shell, ws, get_default_view(old_es), get_default_view(es)); } @@ -4241,20 +4266,23 @@ map(struct desktop_shell *shell, struct shell_surface *shsurf, /* initial positioning, see also configure() */ switch (shsurf->type) { case SHELL_SURFACE_TOPLEVEL: - weston_view_set_initial_position(shsurf->view, shell); - break; - case SHELL_SURFACE_FULLSCREEN: - center_on_output(shsurf->view, shsurf->fullscreen_output); - shell_map_fullscreen(shsurf); - break; - case SHELL_SURFACE_MAXIMIZED: - /* use surface configure to set the geometry */ - panel_height = get_output_panel_height(shell, shsurf->output); - surface_subsurfaces_boundingbox(shsurf->surface, - &surf_x, &surf_y, NULL, NULL); - weston_view_set_position(shsurf->view, - shsurf->output->x - surf_x, - shsurf->output->y + panel_height - surf_y); + if (shsurf->cur.fullscreen) { + center_on_output(shsurf->view, shsurf->fullscreen_output); + shell_map_fullscreen(shsurf); + } else if (shsurf->cur.maximized) { + /* use surface configure to set the geometry */ + panel_height = get_output_panel_height(shell, + shsurf->output); + surface_subsurfaces_boundingbox(shsurf->surface, + &surf_x, &surf_y, NULL, + NULL); + weston_view_set_position(shsurf->view, + shsurf->output->x - surf_x, + shsurf->output->y + + panel_height - surf_y); + } else { + weston_view_set_initial_position(shsurf->view, shell); + } break; case SHELL_SURFACE_POPUP: shell_map_popup(shsurf); @@ -4280,11 +4308,12 @@ map(struct desktop_shell *shell, struct shell_surface *shsurf, &shsurf->view->layer_link); } break; - case SHELL_SURFACE_FULLSCREEN: case SHELL_SURFACE_NONE: break; case SHELL_SURFACE_XWAYLAND: default: + if (shsurf->cur.fullscreen) + break; ws = get_current_workspace(shell); wl_list_remove(&shsurf->view->layer_link); wl_list_insert(&ws->layer.view_list, &shsurf->view->layer_link); @@ -4293,7 +4322,7 @@ map(struct desktop_shell *shell, struct shell_surface *shsurf, if (shsurf->type != SHELL_SURFACE_NONE) { weston_view_update_transform(shsurf->view); - if (shsurf->type == SHELL_SURFACE_MAXIMIZED) { + if (shsurf->cur.maximized) { shsurf->surface->output = shsurf->output; shsurf->view->output = shsurf->output; } @@ -4307,8 +4336,6 @@ map(struct desktop_shell *shell, struct shell_surface *shsurf, WL_SHELL_SURFACE_TRANSIENT_INACTIVE) break; case SHELL_SURFACE_TOPLEVEL: - case SHELL_SURFACE_FULLSCREEN: - case SHELL_SURFACE_MAXIMIZED: if (!shell->locked) { wl_list_for_each(seat, &compositor->seat_list, link) activate(shell, shsurf->surface, seat); @@ -4318,7 +4345,8 @@ map(struct desktop_shell *shell, struct shell_surface *shsurf, break; } - if (shsurf->type == SHELL_SURFACE_TOPLEVEL) + if ((shsurf->type == SHELL_SURFACE_TOPLEVEL) && + !(shsurf->cur.fullscreen || shsurf->cur.maximized)) { switch (shell->win_animation_type) { case ANIMATION_FADE: @@ -4337,14 +4365,11 @@ static void configure(struct desktop_shell *shell, struct weston_surface *surface, float x, float y, int32_t width, int32_t height) { - enum shell_surface_type surface_type = SHELL_SURFACE_NONE; struct shell_surface *shsurf; struct weston_view *view; int32_t surf_x, surf_y; shsurf = get_shell_surface(surface); - if (shsurf) - surface_type = shsurf->type; /* TODO: * This should probably be changed to be more shell_surface @@ -4353,31 +4378,29 @@ configure(struct desktop_shell *shell, struct weston_surface *surface, wl_list_for_each(view, &surface->views, surface_link) weston_view_configure(view, x, y, width, height); - switch (surface_type) { - case SHELL_SURFACE_FULLSCREEN: - shell_stack_fullscreen(shsurf); - shell_configure_fullscreen(shsurf); - break; - case SHELL_SURFACE_MAXIMIZED: - /* setting x, y and using configure to change that geometry */ - surface_subsurfaces_boundingbox(shsurf->surface, &surf_x, &surf_y, - NULL, NULL); - shsurf->view->geometry.x = shsurf->output->x - surf_x; - shsurf->view->geometry.y = shsurf->output->y + - get_output_panel_height(shell,shsurf->output) - surf_y; - break; - case SHELL_SURFACE_TOPLEVEL: - break; - default: - break; + if (shsurf) { + if (shsurf->cur.fullscreen) { + shell_stack_fullscreen(shsurf); + shell_configure_fullscreen(shsurf); + } else if (shsurf->cur.maximized) { + /* setting x, y and using configure to change that geometry */ + surface_subsurfaces_boundingbox(shsurf->surface, + &surf_x, &surf_y, + NULL, NULL); + shsurf->view->geometry.x = shsurf->output->x - surf_x; + shsurf->view->geometry.y = shsurf->output->y + + get_output_panel_height(shell,shsurf->output) - + surf_y; + } } + /* XXX: would a fullscreen surface need the same handling? */ if (surface->output) { wl_list_for_each(view, &surface->views, surface_link) weston_view_update_transform(view); - if (surface_type == SHELL_SURFACE_MAXIMIZED) + if (shsurf->cur.maximized) surface->output = shsurf->output; } } @@ -4398,8 +4421,9 @@ shell_surface_configure(struct weston_surface *es, int32_t sx, int32_t sy, int32 if (width == 0) return; - if (shsurf->next_type != SHELL_SURFACE_NONE && - shsurf->type != shsurf->next_type) { + if ((shsurf->next_type != SHELL_SURFACE_NONE && + shsurf->type != shsurf->next_type) || + shsurf->state_changed) { set_surface_type(shsurf); type_changed = 1; } @@ -4836,8 +4860,6 @@ switcher_next(struct switcher *switcher) wl_list_for_each(view, &ws->layer.view_list, layer_link) { switch (get_shell_surface_type(view->surface)) { case SHELL_SURFACE_TOPLEVEL: - case SHELL_SURFACE_FULLSCREEN: - case SHELL_SURFACE_MAXIMIZED: if (first == NULL) first = view->surface; if (prev == switcher->current) @@ -4872,7 +4894,7 @@ switcher_next(struct switcher *switcher) view->alpha = 1.0; shsurf = get_shell_surface(switcher->current); - if (shsurf && shsurf->type ==SHELL_SURFACE_FULLSCREEN) + if (shsurf && shsurf->cur.fullscreen) shsurf->fullscreen.black_view->alpha = 1.0; } -- 1.8.3.1 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel