shell: check for missing wl_shell_surface

get_shell_surface() returns NULL, if the client has not created or has
destroyed the wl_shell_surface object.

All but one use of get_shell_surface() just retrieve the surface type,
so just fall back to SHELL_SURFACE_NORMAL there.

Resize hot-key binding really needs the wl_shell_surface object, as that
is the only way to send configure events. For surfaces without a
wl_shell_surface, simply do not resize them.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
dev
Pekka Paalanen 13 years ago committed by Kristian Høgsberg
parent ec2b32f49b
commit 92a0dc455a
  1. 43
      compositor/shell.c

@ -589,19 +589,28 @@ static const struct desktop_shell_interface desktop_shell_implementation = {
desktop_shell_unlock
};
static enum shell_surface_type
get_shell_surface_type(struct wlsc_surface *surface)
{
struct shell_surface *shsurf;
shsurf = get_shell_surface(surface);
if (!shsurf)
return SHELL_SURFACE_NORMAL;
return shsurf->type;
}
static void
move_binding(struct wl_input_device *device, uint32_t time,
uint32_t key, uint32_t button, uint32_t state, void *data)
{
struct wlsc_surface *surface =
(struct wlsc_surface *) device->pointer_focus;
struct shell_surface *shsurf;
if (surface == NULL)
return;
shsurf = get_shell_surface(surface);
switch (shsurf->type) {
switch (get_shell_surface_type(surface)) {
case SHELL_SURFACE_PANEL:
case SHELL_SURFACE_BACKGROUND:
case SHELL_SURFACE_FULLSCREEN:
@ -625,8 +634,11 @@ resize_binding(struct wl_input_device *device, uint32_t time,
if (surface == NULL)
return;
shsurf = get_shell_surface(surface);
if (!shsurf)
return;
switch (shsurf->type) {
case SHELL_SURFACE_PANEL:
case SHELL_SURFACE_BACKGROUND:
@ -663,16 +675,13 @@ activate(struct wlsc_shell *base, struct wlsc_surface *es,
{
struct wl_shell *shell = container_of(base, struct wl_shell, shell);
struct wlsc_compositor *compositor = shell->compositor;
struct shell_surface *priv;
priv = get_shell_surface(es);
wlsc_surface_activate(es, device, time);
if (compositor->wxs)
wlsc_xserver_surface_activate(es);
switch (priv->type) {
switch (get_shell_surface_type(es)) {
case SHELL_SURFACE_BACKGROUND:
/* put background back to bottom */
wl_list_remove(&es->link);
@ -701,7 +710,6 @@ lock(struct wlsc_shell *base)
struct wl_list *surface_list = &shell->compositor->surface_list;
struct wlsc_surface *cur;
struct wlsc_surface *tmp;
struct shell_surface *priv;
struct wlsc_input_device *device;
uint32_t time;
@ -725,8 +733,7 @@ lock(struct wlsc_shell *base)
if (cur->surface.resource.client == NULL)
continue;
priv = get_shell_surface(cur);
if (priv->type == SHELL_SURFACE_BACKGROUND)
if (get_shell_surface_type(cur) == SHELL_SURFACE_BACKGROUND)
continue;
cur->output = NULL;
@ -780,9 +787,9 @@ map(struct wlsc_shell *base,
struct wl_shell *shell = container_of(base, struct wl_shell, shell);
struct wlsc_compositor *compositor = shell->compositor;
struct wl_list *list;
struct shell_surface *priv;
enum shell_surface_type surface_type;
priv = get_shell_surface(surface);
surface_type = get_shell_surface_type(surface);
if (shell->locked)
list = &shell->hidden_surface_list;
@ -790,7 +797,7 @@ map(struct wlsc_shell *base,
list = &compositor->surface_list;
/* surface stacking order, see also activate() */
switch (priv->type) {
switch (surface_type) {
case SHELL_SURFACE_BACKGROUND:
/* background always visible, at the bottom */
wl_list_insert(compositor->surface_list.prev, &surface->link);
@ -818,14 +825,14 @@ map(struct wlsc_shell *base,
}
}
if (priv->type == SHELL_SURFACE_TOPLEVEL) {
if (surface_type == SHELL_SURFACE_TOPLEVEL) {
surface->x = 10 + random() % 400;
surface->y = 10 + random() % 400;
}
surface->width = width;
surface->height = height;
if (!shell->locked || priv->type == SHELL_SURFACE_LOCK)
if (!shell->locked || surface_type == SHELL_SURFACE_LOCK)
wlsc_surface_configure(surface,
surface->x, surface->y, width, height);
}
@ -835,10 +842,8 @@ configure(struct wlsc_shell *shell, struct wlsc_surface *surface,
int32_t x, int32_t y, int32_t width, int32_t height)
{
struct wlsc_mode *current;
struct shell_surface *priv;
priv = get_shell_surface(surface);
switch (priv->type) {
switch (get_shell_surface_type(surface)) {
case SHELL_SURFACE_FULLSCREEN:
current = surface->fullscreen_output->current;
x = (current->width - surface->width) / 2;

Loading…
Cancel
Save