From 9af92b380c419d1447fcb79d952e4f643af98d3c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Mon, 24 Nov 2008 01:12:46 -0500 Subject: [PATCH] Animate overlay on/off. --- egl-compositor.c | 37 +++++++++++++++++++++++++++++++++++-- event-loop.c | 4 +++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/egl-compositor.c b/egl-compositor.c index d24ab00..72681f1 100644 --- a/egl-compositor.c +++ b/egl-compositor.c @@ -36,6 +36,7 @@ struct egl_compositor { struct egl_surface *pointer; struct egl_surface *background; struct egl_surface *overlay; + int32_t overlay_target, overlay_previous; }; struct egl_surface { @@ -469,12 +470,17 @@ draw_surface(struct egl_surface *es) } static void +schedule_repaint(struct egl_compositor *ec); + +static void repaint(void *data) { struct egl_compositor *ec = data; struct wl_surface_iterator *iterator; struct wl_surface *surface; struct egl_surface *es; + double force; + int32_t y; draw_surface(ec->background); @@ -493,6 +499,26 @@ repaint(void *data) draw_surface(ec->pointer); eglSwapBuffers(ec->display, ec->surface); + + y = ec->overlay->map.y; + force = (ec->overlay_target - ec->overlay->map.y) / 25.0 + + (ec->overlay_previous - y) / 25.0; + + ec->overlay->map.y = y + (y - ec->overlay_previous) + force; + ec->overlay_previous = y; + + if (ec->overlay->map.y >= 800) { + ec->overlay->map.y = 800; + ec->overlay_previous = 800; + } + + if (ec->overlay->map.y <= 600) { + ec->overlay->map.y = 600; + ec->overlay_previous = 600; + } + + if (ec->overlay->map.y != y) + schedule_repaint(ec); } static void @@ -637,8 +663,13 @@ notify_key(struct wl_compositor *compositor, { struct egl_compositor *ec = (struct egl_compositor *) compositor; - if (key == KEY_ESC) + if (key == KEY_ESC && state == 1) { + if (ec->overlay_target == ec->height) + ec->overlay_target -= 200; + else + ec->overlay_target += 200; schedule_repaint(ec); + } } static const struct wl_compositor_interface interface = { @@ -749,7 +780,9 @@ wl_compositor_create(struct wl_display *display) filename = "background.jpg"; ec->background = background_create(filename, 1280, 800); ec->pointer = pointer_create(100, 100, 64, 64); - ec->overlay = overlay_create(0, ec->height - 200, ec->width, 200); + ec->overlay = overlay_create(0, ec->height, ec->width, 200); + ec->overlay_target = ec->height; + ec->overlay_previous = ec->height; ec->gem_fd = open(gem_device, O_RDWR); if (ec->gem_fd < 0) { diff --git a/event-loop.c b/event-loop.c index bef1d35..5d872e2 100644 --- a/event-loop.c +++ b/event-loop.c @@ -133,6 +133,7 @@ wl_event_loop_wait(struct wl_event_loop *loop) { struct epoll_event ep[32]; struct wl_event_source *source; + wl_event_loop_idle_func_t idle_func; int i, count, timeout; uint32_t mask; @@ -157,8 +158,9 @@ wl_event_loop_wait(struct wl_event_loop *loop) } if (count == 0 && loop->idle_func != NULL) { - loop->idle_func(loop->idle_data); + idle_func = loop->idle_func; loop->idle_func = NULL; + idle_func(loop->idle_data); } return 0; -- 2.7.4