summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Wu <zhiwen.wu@linux.intel.com>2012-04-01 20:13:08 +0800
committerKristian Høgsberg <krh@bitplanet.net>2012-04-02 22:15:40 -0400
commit2185843ced634a1fa398d252f322cc398038b2f9 (patch)
tree5df051d4ba713a067a3cd3179486b2ba35a4653e
parent875ab9e73505cfe922c28bc72f716995f1191ad8 (diff)
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.
-rw-r--r--src/compositor.h1
-rw-r--r--src/shell.c43
2 files changed, 38 insertions, 6 deletions
diff --git a/src/compositor.h b/src/compositor.h
index 9f8f57d..d1cd7c8 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -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
diff --git a/src/shell.c b/src/shell.c
index 46fa370..a4cf0b4 100644
--- a/src/shell.c
+++ b/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);