Move switcher behaviour into switcher.c
authorKristian Høgsberg <krh@bitplanet.net>
Tue, 12 Apr 2011 21:42:30 +0000 (17:42 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Wed, 13 Apr 2011 02:09:42 +0000 (22:09 -0400)
compositor/Makefile.am
compositor/compositor.c
compositor/compositor.h
compositor/switcher.c [new file with mode: 0644]

index e90830a..efee1fe 100644 (file)
@@ -27,6 +27,7 @@ compositor_SOURCES =                          \
        compositor.c                            \
        compositor.h                            \
        shell.c                                 \
+       switcher.c                              \
        screenshooter.c                         \
        screenshooter-protocol.c                \
        screenshooter-server-protocol.h         \
index 4536c85..c361be6 100644 (file)
 #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);
 
index 6828b28..e1f4b6f 100644 (file)
@@ -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 (file)
index 0000000..b389e13
--- /dev/null
@@ -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 <stdlib.h>
+#include <stdio.h>
+#include <linux/input.h>
+
+#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);
+}