mirror of
https://gitlab.freedesktop.org/wayland/weston
synced 2024-07-22 03:04:13 +00:00
shell: Add fullscreen path into activate()
Use shell_stack_fullscreen() to raise fullscreen surface in activate(), and before activate() a regular surface, move all the fullscreen surfaces from fullscreen_layer to toplevel_layer. Also add a void *private into struct wesont_surface since we already have a configure() vfunc. That helps to get the associated fullscreen surface of black surface.
This commit is contained in:
parent
875ab9e735
commit
2185843ced
|
@ -336,6 +336,7 @@ struct weston_surface {
|
|||
* are the sx and sy paramerters supplied to surface::attach .
|
||||
*/
|
||||
void (*configure)(struct weston_surface *es, int32_t sx, int32_t sy);
|
||||
void *private;
|
||||
};
|
||||
|
||||
void
|
||||
|
|
43
src/shell.c
43
src/shell.c
|
@ -519,8 +519,12 @@ shell_surface_set_maximized(struct wl_client *client,
|
|||
shsurf->type = SHELL_SURFACE_MAXIMIZED;
|
||||
}
|
||||
|
||||
static void
|
||||
black_surface_configure(struct weston_surface *es, int32_t sx, int32_t sy);
|
||||
|
||||
static struct weston_surface *
|
||||
create_black_surface(struct weston_compositor *ec,
|
||||
struct weston_surface *fs_surface,
|
||||
GLfloat x, GLfloat y, int w, int h)
|
||||
{
|
||||
struct weston_surface *surface = NULL;
|
||||
|
@ -531,6 +535,8 @@ create_black_surface(struct weston_compositor *ec,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
surface->configure = black_surface_configure;
|
||||
surface->private = fs_surface;
|
||||
weston_surface_configure(surface, x, y, w, h);
|
||||
weston_surface_set_color(surface, 0.0, 0.0, 0.0, 1);
|
||||
return surface;
|
||||
|
@ -551,6 +557,7 @@ shell_configure_fullscreen(struct shell_surface *shsurf)
|
|||
if (!shsurf->fullscreen.black_surface)
|
||||
shsurf->fullscreen.black_surface =
|
||||
create_black_surface(surface->compositor,
|
||||
surface,
|
||||
output->x, output->y,
|
||||
output->current->width,
|
||||
output->current->height);
|
||||
|
@ -1410,6 +1417,7 @@ activate(struct weston_shell *base, struct weston_surface *es,
|
|||
{
|
||||
struct wl_shell *shell = container_of(base, struct wl_shell, shell);
|
||||
struct weston_compositor *compositor = shell->compositor;
|
||||
struct weston_surface *surf, *prev;
|
||||
|
||||
weston_surface_activate(es, device, time);
|
||||
|
||||
|
@ -1430,14 +1438,42 @@ activate(struct weston_shell *base, struct weston_surface *es,
|
|||
break;
|
||||
case SHELL_SURFACE_FULLSCREEN:
|
||||
/* should on top of panels */
|
||||
shell_stack_fullscreen(get_shell_surface(es));
|
||||
break;
|
||||
default:
|
||||
/* move the fullscreen surfaces down into the toplevel layer */
|
||||
if (!wl_list_empty(&shell->fullscreen_layer.surface_list)) {
|
||||
wl_list_for_each_reverse_safe(surf,
|
||||
prev,
|
||||
&shell->fullscreen_layer.surface_list,
|
||||
layer_link)
|
||||
weston_surface_restack(surf,
|
||||
&shell->toplevel_layer.surface_list);
|
||||
}
|
||||
|
||||
weston_surface_restack(es,
|
||||
&shell->toplevel_layer.surface_list);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* no-op func for checking black surface */
|
||||
static void
|
||||
black_surface_configure(struct weston_surface *es, int32_t sx, int32_t sy)
|
||||
{
|
||||
}
|
||||
|
||||
static bool
|
||||
is_black_surface (struct weston_surface *es, struct weston_surface **fs_surface)
|
||||
{
|
||||
if (es->configure == black_surface_configure) {
|
||||
if (fs_surface)
|
||||
*fs_surface = (struct weston_surface *)es->private;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static void
|
||||
click_to_activate_binding(struct wl_input_device *device,
|
||||
uint32_t time, uint32_t key,
|
||||
|
@ -1452,13 +1488,8 @@ click_to_activate_binding(struct wl_input_device *device,
|
|||
if (!focus)
|
||||
return;
|
||||
|
||||
upper = container_of(focus->link.prev, struct weston_surface, link);
|
||||
if (focus->link.prev != &compositor->surface_list &&
|
||||
get_shell_surface_type(upper) == SHELL_SURFACE_FULLSCREEN) {
|
||||
printf("%s: focus is black surface, raise its fullscreen surface\n", __func__);
|
||||
shell_stack_fullscreen(get_shell_surface(upper));
|
||||
if (is_black_surface(focus, &upper))
|
||||
focus = upper;
|
||||
}
|
||||
|
||||
if (state && device->pointer_grab == &device->default_pointer_grab)
|
||||
activate(compositor->shell, focus, wd, time);
|
||||
|
|
Loading…
Reference in a new issue