From 30021d799397173b828629c1d5b0227edf2b7ae1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Tue, 12 Apr 2011 17:42:30 -0400 Subject: [PATCH] Move switcher behaviour into switcher.c --- compositor/Makefile.am | 1 + compositor/compositor.c | 95 +------------------------------------ compositor/compositor.h | 13 ++++++ compositor/switcher.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 137 insertions(+), 93 deletions(-) create mode 100644 compositor/switcher.c diff --git a/compositor/Makefile.am b/compositor/Makefile.am index e90830a..efee1fe 100644 --- a/compositor/Makefile.am +++ b/compositor/Makefile.am @@ -27,6 +27,7 @@ compositor_SOURCES = \ compositor.c \ compositor.h \ shell.c \ + switcher.c \ screenshooter.c \ screenshooter-protocol.c \ screenshooter-server-protocol.h \ diff --git a/compositor/compositor.c b/compositor/compositor.c index 4536c85..c361be6 100644 --- a/compositor/compositor.c +++ b/compositor/compositor.c @@ -36,12 +36,6 @@ #include "wayland-server.h" #include "compositor.h" -struct wlsc_switcher { - struct wlsc_compositor *compositor; - struct wlsc_surface *current; - struct wl_listener listener; -}; - /* The plan here is to generate a random anonymous socket name and * advertise that through a service on the session dbus. */ @@ -994,7 +988,7 @@ notify_motion(struct wl_input_device *device, uint32_t time, int x, int y) wlsc_surface_damage(wd->sprite); } -static void +void wlsc_surface_activate(struct wlsc_surface *surface, struct wlsc_input_device *device, uint32_t time) { @@ -1053,86 +1047,6 @@ notify_button(struct wl_input_device *device, } static void -wlsc_switcher_next(struct wlsc_switcher *switcher) -{ - struct wl_list *l; - - wlsc_surface_damage(switcher->current); - l = switcher->current->link.next; - if (l == &switcher->compositor->surface_list) - l = switcher->compositor->surface_list.next; - switcher->current = container_of(l, struct wlsc_surface, link); - wl_list_remove(&switcher->listener.link); - wl_list_insert(switcher->current->surface.destroy_listener_list.prev, - &switcher->listener.link); - wlsc_surface_damage(switcher->current); -} - -static void -switcher_handle_surface_destroy(struct wl_listener *listener, - struct wl_surface *surface, uint32_t time) -{ - struct wlsc_switcher *switcher = - container_of(listener, struct wlsc_switcher, listener); - - wlsc_switcher_next(switcher); -} - -static struct wlsc_switcher * -wlsc_switcher_create(struct wlsc_compositor *compositor) -{ - struct wlsc_switcher *switcher; - - switcher = malloc(sizeof *switcher); - switcher->compositor = compositor; - switcher->current = container_of(compositor->surface_list.next, - struct wlsc_surface, link); - switcher->listener.func = switcher_handle_surface_destroy; - wl_list_init(&switcher->listener.link); - - return switcher; -} - -static void -wlsc_switcher_destroy(struct wlsc_switcher *switcher) -{ - wl_list_remove(&switcher->listener.link); - free(switcher); -} - -static void -switcher_next_binding(struct wl_input_device *device, uint32_t time, - uint32_t key, uint32_t button, - uint32_t state, void *data) -{ - struct wlsc_compositor *compositor = data; - - if (!state) - return; - if (wl_list_empty(&compositor->surface_list)) - return; - if (compositor->switcher == NULL) - compositor->switcher = wlsc_switcher_create(compositor); - - wlsc_switcher_next(compositor->switcher); -} - -static void -switcher_terminate_binding(struct wl_input_device *device, - uint32_t time, uint32_t key, uint32_t button, - uint32_t state, void *data) -{ - struct wlsc_compositor *compositor = data; - struct wlsc_input_device *wd = (struct wlsc_input_device *) device; - - if (compositor->switcher && !state) { - wlsc_surface_activate(compositor->switcher->current, wd, time); - wlsc_switcher_destroy(compositor->switcher); - compositor->switcher = NULL; - } -} - -static void terminate_binding(struct wl_input_device *device, uint32_t time, uint32_t key, uint32_t button, uint32_t state, void *data) { @@ -1526,16 +1440,11 @@ wlsc_compositor_init(struct wlsc_compositor *ec, struct wl_display *display) wl_list_init(&ec->binding_list); wlsc_shell_init(ec); + wlsc_switcher_init(ec); wlsc_compositor_add_binding(ec, KEY_BACKSPACE, 0, MODIFIER_CTRL | MODIFIER_ALT, terminate_binding, ec); - wlsc_compositor_add_binding(ec, KEY_TAB, MODIFIER_SUPER, 0, - switcher_next_binding, ec); - wlsc_compositor_add_binding(ec, KEY_LEFTMETA, MODIFIER_SUPER, 0, - switcher_terminate_binding, ec); - wlsc_compositor_add_binding(ec, KEY_RIGHTMETA, MODIFIER_SUPER, 0, - switcher_terminate_binding, ec); create_pointer_images(ec); diff --git a/compositor/compositor.h b/compositor/compositor.h index 6828b28..e1f4b6f 100644 --- a/compositor/compositor.h +++ b/compositor/compositor.h @@ -162,6 +162,10 @@ void wlsc_surface_update_matrix(struct wlsc_surface *es); void +wlsc_surface_activate(struct wlsc_surface *surface, + struct wlsc_input_device *device, uint32_t time); + +void notify_motion(struct wl_input_device *device, uint32_t time, int x, int y); void @@ -250,6 +254,15 @@ wlsc_shm_init(struct wlsc_compositor *ec); int wlsc_shell_init(struct wlsc_compositor *ec); +struct wlsc_switcher { + struct wlsc_compositor *compositor; + struct wlsc_surface *current; + struct wl_listener listener; +}; + +void +wlsc_switcher_init(struct wlsc_compositor *compositor); + struct wlsc_compositor * x11_compositor_create(struct wl_display *display, int width, int height); diff --git a/compositor/switcher.c b/compositor/switcher.c new file mode 100644 index 0000000..b389e13 --- /dev/null +++ b/compositor/switcher.c @@ -0,0 +1,121 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include +#include +#include + +#include "compositor.h" + +static void +wlsc_switcher_next(struct wlsc_switcher *switcher) +{ + struct wl_list *l; + + wlsc_surface_damage(switcher->current); + l = switcher->current->link.next; + if (l == &switcher->compositor->surface_list) + l = switcher->compositor->surface_list.next; + switcher->current = container_of(l, struct wlsc_surface, link); + wl_list_remove(&switcher->listener.link); + wl_list_insert(switcher->current->surface.destroy_listener_list.prev, + &switcher->listener.link); + wlsc_surface_damage(switcher->current); +} + +static void +switcher_handle_surface_destroy(struct wl_listener *listener, + struct wl_surface *surface, uint32_t time) +{ + struct wlsc_switcher *switcher = + container_of(listener, struct wlsc_switcher, listener); + + wlsc_switcher_next(switcher); +} + +static struct wlsc_switcher * +wlsc_switcher_create(struct wlsc_compositor *compositor) +{ + struct wlsc_switcher *switcher; + + switcher = malloc(sizeof *switcher); + switcher->compositor = compositor; + switcher->current = container_of(compositor->surface_list.next, + struct wlsc_surface, link); + switcher->listener.func = switcher_handle_surface_destroy; + wl_list_init(&switcher->listener.link); + + return switcher; +} + +static void +wlsc_switcher_destroy(struct wlsc_switcher *switcher) +{ + wl_list_remove(&switcher->listener.link); + free(switcher); +} + +static void +switcher_next_binding(struct wl_input_device *device, uint32_t time, + uint32_t key, uint32_t button, + uint32_t state, void *data) +{ + struct wlsc_compositor *compositor = data; + + if (!state) + return; + if (wl_list_empty(&compositor->surface_list)) + return; + if (compositor->switcher == NULL) + compositor->switcher = wlsc_switcher_create(compositor); + + wlsc_switcher_next(compositor->switcher); +} + +static void +switcher_terminate_binding(struct wl_input_device *device, + uint32_t time, uint32_t key, uint32_t button, + uint32_t state, void *data) +{ + struct wlsc_compositor *compositor = data; + struct wlsc_input_device *wd = (struct wlsc_input_device *) device; + + if (compositor->switcher && !state) { + wlsc_surface_activate(compositor->switcher->current, wd, time); + wlsc_switcher_destroy(compositor->switcher); + compositor->switcher = NULL; + } +} + +void +wlsc_switcher_init(struct wlsc_compositor *compositor) +{ + wlsc_compositor_add_binding(compositor, + KEY_TAB, 0, MODIFIER_SUPER, + switcher_next_binding, compositor); + wlsc_compositor_add_binding(compositor, + KEY_LEFTMETA, 0, MODIFIER_SUPER, + switcher_terminate_binding, compositor); + wlsc_compositor_add_binding(compositor, + KEY_RIGHTMETA, 0, MODIFIER_SUPER, + switcher_terminate_binding, compositor); +} -- 2.7.4