[PATCH weston 12/13] Update the tablet shell to handle views.
Jason Ekstrand
jason at jlekstrand.net
Sun Oct 13 05:38:22 CEST 2013
Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
---
src/tablet-shell.c | 76 +++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 52 insertions(+), 24 deletions(-)
diff --git a/src/tablet-shell.c b/src/tablet-shell.c
index b055ab2..5e92678 100644
--- a/src/tablet-shell.c
+++ b/src/tablet-shell.c
@@ -28,6 +28,7 @@
#include <stdio.h>
#include <string.h>
#include <linux/input.h>
+#include <assert.h>
#include "compositor.h"
#include "tablet-shell-server-protocol.h"
@@ -124,27 +125,43 @@ tablet_shell_set_state(struct tablet_shell *shell, int state)
shell->state = state;
}
+static struct weston_view *
+get_surface_view(struct weston_surface *surface, int create)
+{
+ if (!surface)
+ return NULL;
+
+ if (wl_list_empty(&surface->views)) {
+ if (create)
+ return weston_view_create(surface);
+ else
+ return NULL;
+ }
+
+ return container_of(surface->views.next, struct weston_view, surface_link);
+}
+
static void
tablet_shell_surface_configure(struct weston_surface *surface,
int32_t sx, int32_t sy, int32_t width, int32_t height)
{
struct tablet_shell *shell = get_shell(surface->compositor);
+ struct weston_view *view = get_surface_view(surface, 0);
+ assert(view);
if (weston_surface_is_mapped(surface) || width == 0)
return;
- weston_surface_configure(surface, 0, 0, width, height);
-
if (surface == shell->lockscreen_surface) {
- wl_list_insert(&shell->lockscreen_layer.surface_list,
- &surface->layer_link);
+ wl_list_insert(&shell->lockscreen_layer.view_list,
+ &view->layer_link);
} else if (surface == shell->switcher_surface) {
/* */
} else if (surface == shell->home_surface) {
if (shell->state == STATE_STARTING) {
/* homescreen always visible, at the bottom */
- wl_list_insert(&shell->homescreen_layer.surface_list,
- &surface->layer_link);
+ wl_list_insert(&shell->homescreen_layer.view_list,
+ &view->layer_link);
tablet_shell_set_state(shell, STATE_LOCKED);
shell->previous_state = STATE_HOME;
@@ -155,12 +172,15 @@ tablet_shell_surface_configure(struct weston_surface *surface,
shell->current_client->client == wl_resource_get_client(surface->resource)) {
tablet_shell_set_state(shell, STATE_TASK);
shell->current_client->surface = surface;
- weston_zoom_run(surface, 0.3, 1.0, NULL, NULL);
- wl_list_insert(&shell->application_layer.surface_list,
- &surface->layer_link);
+ weston_zoom_run(view, 0.3, 1.0, NULL, NULL);
+ wl_list_insert(&shell->application_layer.view_list,
+ &view->layer_link);
}
- weston_surface_update_transform(surface);
+ if (view) {
+ weston_view_configure(view, 0, 0, width, height);
+ weston_view_update_transform(view);
+ }
}
static void
@@ -181,10 +201,12 @@ tablet_shell_set_lockscreen(struct wl_client *client,
{
struct tablet_shell *shell = wl_resource_get_user_data(resource);
struct weston_surface *es = wl_resource_get_user_data(surface_resource);
+ struct weston_view *view;
- weston_surface_set_position(es, 0, 0);
+ view = weston_view_create(es);
+ weston_view_set_position(view, 0, 0);
shell->lockscreen_surface = es;
- shell->lockscreen_surface->configure = tablet_shell_surface_configure;
+ es->configure = tablet_shell_surface_configure;
shell->lockscreen_listener.notify = handle_lockscreen_surface_destroy;
wl_signal_add(&es->destroy_signal, &shell->lockscreen_listener);
}
@@ -208,14 +230,16 @@ tablet_shell_set_switcher(struct wl_client *client,
{
struct tablet_shell *shell = wl_resource_get_user_data(resource);
struct weston_surface *es = wl_resource_get_user_data(surface_resource);
+ struct weston_view *view;
/* FIXME: Switcher should be centered and the compositor
* should do the tinting of the background. With the cache
* layer idea, we should be able to hit the framerate on the
* fade/zoom in. */
- shell->switcher_surface = es;
- weston_surface_set_position(shell->switcher_surface, 0, 0);
+ view = weston_view_create(es);
+ weston_view_set_position(view, 0, 0);
+ shell->switcher_surface = es;
shell->switcher_listener.notify = handle_switcher_surface_destroy;
wl_signal_add(&es->destroy_signal, &shell->switcher_listener);
}
@@ -226,15 +250,18 @@ tablet_shell_set_homescreen(struct wl_client *client,
struct wl_resource *surface_resource)
{
struct tablet_shell *shell = wl_resource_get_user_data(resource);
+ struct weston_surface *es = wl_resource_get_user_data(surface_resource);
+ struct weston_view *view;
- shell->home_surface = wl_resource_get_user_data(surface_resource);
- shell->home_surface->configure = tablet_shell_surface_configure;
+ view = weston_view_create(es);
+ weston_view_set_position(view, 0, 0);
- weston_surface_set_position(shell->home_surface, 0, 0);
+ shell->home_surface = es;
+ es->configure = tablet_shell_surface_configure;
}
static void
-minimize_zoom_done(struct weston_surface_animation *zoom, void *data)
+minimize_zoom_done(struct weston_view_animation *zoom, void *data)
{
struct tablet_shell *shell = data;
struct weston_compositor *compositor = shell->compositor;
@@ -246,11 +273,12 @@ minimize_zoom_done(struct weston_surface_animation *zoom, void *data)
static void
tablet_shell_switch_to(struct tablet_shell *shell,
- struct weston_surface *surface)
+ struct weston_surface *surface)
{
struct weston_compositor *compositor = shell->compositor;
struct weston_seat *seat;
struct weston_surface *current;
+ struct weston_view *view = get_surface_view(surface, 1);
if (shell->state == STATE_SWITCHER) {
wl_list_remove(&shell->switcher_listener.link);
@@ -262,15 +290,15 @@ tablet_shell_switch_to(struct tablet_shell *shell,
if (shell->current_client && shell->current_client->surface) {
current = shell->current_client->surface;
- weston_zoom_run(current, 1.0, 0.3,
- minimize_zoom_done, shell);
+ weston_zoom_run(get_surface_view(current, 0), 1.0, 0.3,
+ minimize_zoom_done, shell);
}
} else {
- fprintf(stderr, "switch to %p\n", surface);
+ fprintf(stderr, "switch to %p\n", view);
wl_list_for_each(seat, &compositor->seat_list, link)
- weston_surface_activate(surface, seat);
+ weston_surface_activate(view->surface, seat);
tablet_shell_set_state(shell, STATE_TASK);
- weston_zoom_run(surface, 0.3, 1.0, NULL, NULL);
+ weston_zoom_run(view, 0.3, 1.0, NULL, NULL);
}
}
--
1.8.3.1
More information about the wayland-devel
mailing list