wayland: drop wayland backend

This commit is contained in:
Ray Strode 2016-01-12 12:13:52 -05:00 committed by Rui Matos
parent 04c84b049f
commit 89daa8d4fa
16 changed files with 0 additions and 2258 deletions

View File

@ -533,33 +533,6 @@ egl_source_h = \
egl_source_h_priv = egl/clutter-backend-eglnative.h egl/clutter-stage-eglnative.h
egl_source_c = egl/clutter-backend-eglnative.c egl/clutter-stage-eglnative.c
# Wayland backend rules
if SUPPORT_WAYLAND
backend_source_h_priv += \
wayland/clutter-backend-wayland.h \
wayland/clutter-backend-wayland-priv.h \
wayland/clutter-stage-wayland.h \
wayland/clutter-event-wayland.h \
wayland/clutter-input-device-wayland.h \
wayland/clutter-device-manager-wayland.h
backend_source_c += \
wayland/clutter-backend-wayland.c \
wayland/clutter-stage-wayland.c \
wayland/clutter-event-wayland.c \
wayland/clutter-input-device-wayland.c \
wayland/clutter-device-manager-wayland.c
clutterwayland_includedir = $(clutter_includedir)/wayland
clutterwayland_include_HEADERS = wayland/clutter-wayland.h
clutter-wayland-$(CLUTTER_API_VERSION).pc: clutter-$(CLUTTER_API_VERSION).pc
$(QUIET_GEN)cp -f $< $(@F)
pc_files += clutter-wayland-$(CLUTTER_API_VERSION).pc
endif # SUPPORT_WAYLAND
if SUPPORT_WAYLAND_COMPOSITOR
wayland_compositor_source_h = \
wayland/clutter-wayland-compositor.h \

View File

@ -77,9 +77,6 @@
#ifdef CLUTTER_WINDOWING_EGL
#include "egl/clutter-backend-eglnative.h"
#endif
#ifdef CLUTTER_INPUT_WAYLAND
#include "wayland/clutter-device-manager-wayland.h"
#endif
#ifdef CLUTTER_HAS_WAYLAND_COMPOSITOR_SUPPORT
#include <cogl/cogl-wayland-server.h>
@ -620,14 +617,6 @@ clutter_backend_real_init_events (ClutterBackend *backend)
_clutter_events_tslib_init (backend);
}
else
#endif
#ifdef CLUTTER_INPUT_WAYLAND
if (clutter_check_windowing_backend (CLUTTER_WINDOWING_WAYLAND) &&
(input_backend == NULL || input_backend == I_(CLUTTER_INPUT_WAYLAND)))
{
_clutter_events_wayland_init (backend);
}
else
#endif
if (input_backend != NULL)
{

View File

@ -76,9 +76,6 @@
#ifdef CLUTTER_WINDOWING_EGL
#include "egl/clutter-backend-eglnative.h"
#endif
#ifdef CLUTTER_WINDOWING_WAYLAND
#include "wayland/clutter-backend-wayland.h"
#endif
#include <cogl/cogl.h>
#include <cogl-pango/cogl-pango.h>
@ -3628,12 +3625,6 @@ clutter_check_windowing_backend (const char *backend_type)
backend_type = g_intern_string (backend_type);
#ifdef CLUTTER_WINDOWING_WAYLAND
if (backend_type == I_(CLUTTER_WINDOWING_WAYLAND) &&
CLUTTER_IS_BACKEND_WAYLAND (context->backend))
return TRUE;
else
#endif
#ifdef CLUTTER_WINDOWING_EGL
if (backend_type == I_(CLUTTER_WINDOWING_EGL) &&
CLUTTER_IS_BACKEND_EGL_NATIVE (context->backend))

View File

@ -1,69 +0,0 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2010, 2011 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
* Authors:
* Matthew Allum
* Robert Bragg
* Kristian Høgsberg
*/
#ifndef __CLUTTER_BACKEND_WAYLAND_PRIV_H__
#define __CLUTTER_BACKEND_WAYLAND_PRIV_H__
#include <glib-object.h>
#include <clutter/clutter-event.h>
#include <clutter/clutter-backend.h>
#include <clutter/clutter-device-manager.h>
#include "clutter-backend-private.h"
#include "clutter-backend-wayland.h"
G_BEGIN_DECLS
struct _ClutterBackendWayland
{
ClutterBackend parent_instance;
ClutterDeviceManager *device_manager;
struct wl_display *wayland_display;
struct wl_registry *wayland_registry;
struct wl_compositor *wayland_compositor;
struct wl_shell *wayland_shell;
struct wl_shm *wayland_shm;
struct wl_surface *cursor_surface;
struct wl_buffer *cursor_buffer;
struct wl_output *wayland_output;
struct wl_cursor_theme *cursor_theme;
gint cursor_x, cursor_y;
gint output_width, output_height;
GSource *wayland_source;
/* event timer */
GTimer *event_timer;
};
void _clutter_backend_wayland_ensure_cursor (ClutterBackendWayland *backend_wayland);
G_END_DECLS
#endif /* __CLUTTER_BACKEND_WAYLAND_PRIV_H__ */

View File

@ -1,383 +0,0 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2010, 2011 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
* Authors:
* Matthew Allum
* Robert Bragg
* Kristian Høgsberg
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <errno.h>
#include "clutter-debug.h"
#include "clutter-private.h"
#include "clutter-main.h"
#include "clutter-stage-private.h"
#include "wayland/clutter-backend-wayland.h"
#include "wayland/clutter-backend-wayland-priv.h"
#include "wayland/clutter-device-manager-wayland.h"
#include "wayland/clutter-event-wayland.h"
#include "wayland/clutter-stage-wayland.h"
#include "wayland/clutter-wayland.h"
#include "cogl/clutter-stage-cogl.h"
#include <wayland-client.h>
#include <wayland-cursor.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <cogl/cogl.h>
#include <cogl/cogl-wayland-client.h>
G_DEFINE_TYPE (ClutterBackendWayland, clutter_backend_wayland, CLUTTER_TYPE_BACKEND);
static struct wl_display *_foreign_display = NULL;
static gboolean _no_event_dispatch = FALSE;
static void
clutter_backend_wayland_dispose (GObject *gobject)
{
ClutterBackendWayland *backend_wayland = CLUTTER_BACKEND_WAYLAND (gobject);
if (backend_wayland->device_manager)
{
g_object_unref (backend_wayland->device_manager);
backend_wayland->device_manager = NULL;
}
if (backend_wayland->cursor_buffer)
{
wl_buffer_destroy (backend_wayland->cursor_buffer);
backend_wayland->cursor_buffer = NULL;
}
if (backend_wayland->cursor_theme)
{
wl_cursor_theme_destroy (backend_wayland->cursor_theme);
backend_wayland->cursor_theme = NULL;
}
G_OBJECT_CLASS (clutter_backend_wayland_parent_class)->dispose (gobject);
}
static void
output_handle_mode (void *data,
struct wl_output *wl_output,
uint32_t flags,
int width,
int height,
int refresh)
{
ClutterBackendWayland *backend_wayland = data;
if (flags & WL_OUTPUT_MODE_CURRENT)
{
backend_wayland->output_width = width;
backend_wayland->output_height = height;
}
}
static void
output_handle_geometry (void *data,
struct wl_output *wl_output,
int x,
int y,
int physical_width,
int physical_height,
int subpixel,
const char *make,
const char *model,
int32_t transform)
{
}
static const struct wl_output_listener wayland_output_listener = {
output_handle_geometry,
output_handle_mode,
};
static void
registry_handle_global (void *data,
struct wl_registry *registry,
uint32_t id,
const char *interface,
uint32_t version)
{
ClutterBackendWayland *backend_wayland = data;
if (strcmp (interface, "wl_compositor") == 0)
backend_wayland->wayland_compositor =
wl_registry_bind (registry, id, &wl_compositor_interface, 1);
else if (strcmp (interface, "wl_seat") == 0)
{
ClutterDeviceManager *device_manager = backend_wayland->device_manager;
_clutter_device_manager_wayland_add_input_group (device_manager, id);
}
else if (strcmp (interface, "wl_shell") == 0)
{
backend_wayland->wayland_shell =
wl_registry_bind (registry, id, &wl_shell_interface, 1);
}
else if (strcmp (interface, "wl_shm") == 0)
{
backend_wayland->wayland_shm =
wl_registry_bind (registry, id, &wl_shm_interface, 1);
}
else if (strcmp (interface, "wl_output") == 0)
{
/* FIXME: Support multiple outputs */
backend_wayland->wayland_output =
wl_registry_bind (registry, id, &wl_output_interface, 1);
wl_output_add_listener (backend_wayland->wayland_output,
&wayland_output_listener,
backend_wayland);
}
}
static const struct wl_registry_listener wayland_registry_listener = {
registry_handle_global,
};
static gboolean
clutter_backend_wayland_post_parse (ClutterBackend *backend,
GError **error)
{
ClutterBackendWayland *backend_wayland = CLUTTER_BACKEND_WAYLAND (backend);
/* TODO: expose environment variable/commandline option for this... */
backend_wayland->wayland_display = _foreign_display;
if (backend_wayland->wayland_display == NULL)
backend_wayland->wayland_display = wl_display_connect (NULL);
if (!backend_wayland->wayland_display)
{
g_set_error (error, CLUTTER_INIT_ERROR,
CLUTTER_INIT_ERROR_BACKEND,
"Failed to open Wayland display socket");
return FALSE;
}
backend_wayland->wayland_registry =
wl_display_get_registry (backend_wayland->wayland_display);
backend_wayland->wayland_source =
_clutter_event_source_wayland_new (backend_wayland->wayland_display);
g_source_attach (backend_wayland->wayland_source, NULL);
g_object_set (clutter_settings_get_default (), "font-dpi", 96 * 1024, NULL);
/* XXX: We require the device manager to exist as soon as we connect to the
* compositor and setup an event handler because we will immediately be
* notified of the available input devices which need to be associated with
* the device-manager.
*
* FIXME: At some point we could perhaps just collapse the
* _clutter_backend_post_parse(), and _clutter_backend_init_events()
* functions into one called something like _clutter_backend_init() which
* would allow the real backend to manage the precise order of
* initialization.
*/
backend_wayland->device_manager =
_clutter_device_manager_wayland_new (backend);
/* Set up listener so we'll catch all events. */
wl_registry_add_listener (backend_wayland->wayland_registry,
&wayland_registry_listener,
backend_wayland);
/* Wait until we have been notified about the compositor and shell objects */
while (!(backend_wayland->wayland_compositor &&
backend_wayland->wayland_shell))
wl_display_roundtrip (backend_wayland->wayland_display);
return TRUE;
}
static CoglRenderer *
clutter_backend_wayland_get_renderer (ClutterBackend *backend,
GError **error)
{
ClutterBackendWayland *backend_wayland = CLUTTER_BACKEND_WAYLAND (backend);
CoglRenderer *renderer;
CLUTTER_NOTE (BACKEND, "Creating a new wayland renderer");
renderer = cogl_renderer_new ();
cogl_wayland_renderer_set_event_dispatch_enabled (renderer, !_no_event_dispatch);
cogl_renderer_set_winsys_id (renderer, COGL_WINSYS_ID_EGL_WAYLAND);
cogl_wayland_renderer_set_foreign_display (renderer,
backend_wayland->wayland_display);
return renderer;
}
static CoglDisplay *
clutter_backend_wayland_get_display (ClutterBackend *backend,
CoglRenderer *renderer,
CoglSwapChain *swap_chain,
GError **error)
{
CoglOnscreenTemplate *onscreen_template = NULL;
CoglDisplay *display;
onscreen_template = cogl_onscreen_template_new (swap_chain);
/* XXX: I have some doubts that this is a good design.
* Conceptually should we be able to check an onscreen_template
* without more details about the CoglDisplay configuration?
*/
if (!cogl_renderer_check_onscreen_template (renderer,
onscreen_template,
error))
goto error;
display = cogl_display_new (renderer, onscreen_template);
return display;
error:
if (onscreen_template)
cogl_object_unref (onscreen_template);
return NULL;
}
static void
clutter_backend_wayland_class_init (ClutterBackendWaylandClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
ClutterBackendClass *backend_class = CLUTTER_BACKEND_CLASS (klass);
gobject_class->dispose = clutter_backend_wayland_dispose;
backend_class->stage_window_type = CLUTTER_TYPE_STAGE_WAYLAND;
backend_class->post_parse = clutter_backend_wayland_post_parse;
backend_class->get_renderer = clutter_backend_wayland_get_renderer;
backend_class->get_display = clutter_backend_wayland_get_display;
}
void
_clutter_backend_wayland_ensure_cursor (ClutterBackendWayland *backend_wayland)
{
struct wl_cursor *cursor;
backend_wayland->cursor_theme =
wl_cursor_theme_load (NULL, /* default */
32,
backend_wayland->wayland_shm);
cursor = wl_cursor_theme_get_cursor (backend_wayland->cursor_theme,
"left_ptr");
backend_wayland->cursor_buffer =
wl_cursor_image_get_buffer (cursor->images[0]);
if (backend_wayland->cursor_buffer)
{
backend_wayland->cursor_x = cursor->images[0]->hotspot_x;
backend_wayland->cursor_y = cursor->images[0]->hotspot_y;
}
backend_wayland->cursor_surface =
wl_compositor_create_surface (backend_wayland->wayland_compositor);
}
static void
clutter_backend_wayland_init (ClutterBackendWayland *backend_wayland)
{
}
ClutterBackend *
clutter_backend_wayland_new (void)
{
return g_object_new (CLUTTER_TYPE_BACKEND_WAYLAND, NULL);
}
/**
* clutter_wayland_set_display
* @display: pointer to a wayland display
*
* Sets the display connection Clutter should use; must be called
* before clutter_init(), clutter_init_with_args() or other functions
* pertaining Clutter's initialization process.
*
* If you are parsing the command line arguments by retrieving Clutter's
* #GOptionGroup with clutter_get_option_group() and calling
* g_option_context_parse() yourself, you should also call
* clutter_wayland_set_display() before g_option_context_parse().
*
* Since: 1.16
*/
void
clutter_wayland_set_display (struct wl_display *display)
{
if (_clutter_context_is_initialized ())
{
g_warning ("%s() can only be used before calling clutter_init()",
G_STRFUNC);
return;
}
_foreign_display = display;
}
/**
* clutter_wayland_disable_event_retrieval:
*
* Disables the dispatch of the events in the main loop.
*
* This is useful for integrating Clutter with another library that will do the
* event dispatch; in general only a single source should be acting on changes
* on the Wayland file descriptor.
*
* This function can only be called before calling clutter_init().
*
* This function should not be normally used by applications.
*
* Since: 1.16
*/
void
clutter_wayland_disable_event_retrieval (void)
{
if (_clutter_context_is_initialized ())
{
g_warning ("%s() can only be used before calling clutter_init()",
G_STRFUNC);
return;
}
_no_event_dispatch = TRUE;
}

View File

@ -1,60 +0,0 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2010, 2011 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
* Authors:
* Matthew Allum
* Robert Bragg
* Kristian Høgsberg
*/
#ifndef __CLUTTER_BACKEND_WAYLAND_H__
#define __CLUTTER_BACKEND_WAYLAND_H__
#include <glib-object.h>
#include <clutter/clutter-event.h>
#include <clutter/clutter-backend.h>
#include <clutter/clutter-device-manager.h>
#include "clutter-backend-private.h"
G_BEGIN_DECLS
#define CLUTTER_TYPE_BACKEND_WAYLAND (clutter_backend_wayland_get_type ())
#define CLUTTER_BACKEND_WAYLAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_BACKEND_WAYLAND, ClutterBackendWayland))
#define CLUTTER_IS_BACKEND_WAYLAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_BACKEND_WAYLAND))
#define CLUTTER_BACKEND_WAYLAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_BACKEND_WAYLAND, ClutterBackendWaylandClass))
#define CLUTTER_IS_BACKEND_WAYLAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_BACKEND_WAYLAND))
#define CLUTTER_BACKEND_WAYLAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_BACKEND_WAYLAND, ClutterBackendWaylandClass))
typedef struct _ClutterBackendWayland ClutterBackendWayland;
typedef struct _ClutterBackendWaylandClass ClutterBackendWaylandClass;
struct _ClutterBackendWaylandClass
{
ClutterBackendClass parent_class;
};
GType clutter_backend_wayland_get_type (void) G_GNUC_CONST;
ClutterBackend *clutter_backend_wayland_new (void);
G_END_DECLS
#endif /* __CLUTTER_BACKEND_WAYLAND_H__ */

View File

@ -1,215 +0,0 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2011 Intel Corp.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors:
* Emmanuele Bassi <ebassi@linux.intel.com>
* Robert Bragg <robert@linux.intel.com>
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "clutter-input-device-wayland.h"
#include "clutter-device-manager-wayland.h"
#include "clutter-backend.h"
#include "wayland/clutter-backend-wayland.h"
#include "wayland/clutter-backend-wayland-priv.h"
#include "clutter-debug.h"
#include "clutter-device-manager-private.h"
#include "clutter-private.h"
#include <wayland-client.h>
#include <wayland-client-protocol.h>
enum
{
PROP_0
};
G_DEFINE_TYPE (ClutterDeviceManagerWayland,
_clutter_device_manager_wayland,
CLUTTER_TYPE_DEVICE_MANAGER);
static void
clutter_device_manager_wayland_add_device (ClutterDeviceManager *manager,
ClutterInputDevice *device)
{
ClutterDeviceManagerWayland *manager_wayland =
CLUTTER_DEVICE_MANAGER_WAYLAND (manager);
ClutterInputDeviceType device_type;
gboolean is_pointer, is_keyboard;
device_type = clutter_input_device_get_device_type (device);
is_pointer = (device_type == CLUTTER_POINTER_DEVICE) ? TRUE : FALSE;
is_keyboard = (device_type == CLUTTER_KEYBOARD_DEVICE) ? TRUE : FALSE;
manager_wayland->devices = g_slist_prepend (manager_wayland->devices, device);
if (is_pointer && manager_wayland->core_pointer == NULL)
manager_wayland->core_pointer = device;
if (is_keyboard && manager_wayland->core_keyboard == NULL)
manager_wayland->core_keyboard = device;
}
static void
clutter_device_manager_wayland_remove_device (ClutterDeviceManager *manager,
ClutterInputDevice *device)
{
ClutterDeviceManagerWayland *manager_wayland = CLUTTER_DEVICE_MANAGER_WAYLAND (manager);
manager_wayland->devices = g_slist_remove (manager_wayland->devices, device);
}
static const GSList *
clutter_device_manager_wayland_get_devices (ClutterDeviceManager *manager)
{
return CLUTTER_DEVICE_MANAGER_WAYLAND (manager)->devices;
}
static ClutterInputDevice *
clutter_device_manager_wayland_get_core_device (ClutterDeviceManager *manager,
ClutterInputDeviceType type)
{
ClutterDeviceManagerWayland *manager_wayland;
manager_wayland = CLUTTER_DEVICE_MANAGER_WAYLAND (manager);
switch (type)
{
case CLUTTER_POINTER_DEVICE:
return manager_wayland->core_pointer;
case CLUTTER_KEYBOARD_DEVICE:
return manager_wayland->core_keyboard;
case CLUTTER_EXTENSION_DEVICE:
default:
return NULL;
}
return NULL;
}
static ClutterInputDevice *
clutter_device_manager_wayland_get_device (ClutterDeviceManager *manager,
gint id)
{
ClutterDeviceManagerWayland *manager_wayland =
CLUTTER_DEVICE_MANAGER_WAYLAND (manager);
GSList *l;
for (l = manager_wayland->devices; l != NULL; l = l->next)
{
ClutterInputDevice *device = l->data;
if (clutter_input_device_get_device_id (device) == id)
return device;
}
return NULL;
}
static void
_clutter_device_manager_wayland_class_init (ClutterDeviceManagerWaylandClass *klass)
{
ClutterDeviceManagerClass *manager_class;
manager_class = CLUTTER_DEVICE_MANAGER_CLASS (klass);
manager_class->add_device = clutter_device_manager_wayland_add_device;
manager_class->remove_device = clutter_device_manager_wayland_remove_device;
manager_class->get_devices = clutter_device_manager_wayland_get_devices;
manager_class->get_core_device = clutter_device_manager_wayland_get_core_device;
manager_class->get_device = clutter_device_manager_wayland_get_device;
}
static void
_clutter_device_manager_wayland_init (ClutterDeviceManagerWayland *self)
{
}
void
_clutter_device_manager_wayland_add_input_group (ClutterDeviceManager *manager,
uint32_t id)
{
ClutterBackend *backend = _clutter_device_manager_get_backend (manager);
ClutterBackendWayland *backend_wayland = CLUTTER_BACKEND_WAYLAND (backend);
ClutterInputDeviceWayland *device;
device = g_object_new (CLUTTER_TYPE_INPUT_DEVICE_WAYLAND,
"id", id,
"device-type", CLUTTER_POINTER_DEVICE,
"name", "wayland device",
"enabled", TRUE,
NULL);
device->input_device =
wl_registry_bind (backend_wayland->wayland_registry, id,
&wl_seat_interface, 1);
wl_seat_add_listener (device->input_device,
&_clutter_seat_wayland_listener,
device);
wl_seat_set_user_data (device->input_device, device);
_clutter_device_manager_add_device (manager, CLUTTER_INPUT_DEVICE (device));
}
ClutterDeviceManager *
_clutter_device_manager_wayland_new (ClutterBackend *backend)
{
return g_object_new (CLUTTER_TYPE_DEVICE_MANAGER_WAYLAND,
"backend", backend,
NULL);
}
void
_clutter_events_wayland_init (ClutterBackend *backend)
{
ClutterBackendWayland *backend_wayland = CLUTTER_BACKEND_WAYLAND (backend);
/* XXX: We actually create the wayland device manager in the backend
* post_parse vfunc because that's the point where we connect to a compositor
* and that's also the point where we will be notified of input devices so we
* need the device-manager to exist early on.
*
* To be consistent with other clutter backends though we only associate the
* device manager with the backend when _clutter_events_wayland_init() is
* called in _clutter_backend_init_events(). This should still allow the
* runtime selection of an alternative input backend if desired and in that
* case the wayland device manager will be benign.
*
* FIXME: At some point we could perhaps collapse the
* _clutter_backend_post_parse(), and _clutter_backend_init_events()
* functions into one called something like _clutter_backend_init() which
* would allow the real backend to manage the precise order of
* initialization.
*/
backend->device_manager = g_object_ref (backend_wayland->device_manager);
}
void
_clutter_events_wayland_uninit (ClutterBackend *backend)
{
g_object_unref (backend->device_manager);
backend->device_manager = NULL;
}

View File

@ -1,75 +0,0 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2011 Intel Corp.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors:
* Robert Bragg <robert@linux.intel.com>
*/
#ifndef __CLUTTER_DEVICE_MANAGER_WAYLAND_H__
#define __CLUTTER_DEVICE_MANAGER_WAYLAND_H__
#include <clutter/clutter-device-manager.h>
#include <wayland/clutter-backend-wayland.h>
G_BEGIN_DECLS
#define CLUTTER_TYPE_DEVICE_MANAGER_WAYLAND (_clutter_device_manager_wayland_get_type ())
#define CLUTTER_DEVICE_MANAGER_WAYLAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_DEVICE_MANAGER_WAYLAND, ClutterDeviceManagerWayland))
#define CLUTTER_IS_DEVICE_MANAGER_WAYLAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_DEVICE_MANAGER_WAYLAND))
#define CLUTTER_DEVICE_MANAGER_WAYLAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_DEVICE_MANAGER_WAYLAND, ClutterDeviceManagerWaylandClass))
#define CLUTTER_IS_DEVICE_MANAGER_WAYLAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_DEVICE_MANAGER_WAYLAND))
#define CLUTTER_DEVICE_MANAGER_WAYLAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_DEVICE_MANAGER_WAYLAND, ClutterDeviceManagerWaylandClass))
typedef struct _ClutterDeviceManagerWayland ClutterDeviceManagerWayland;
typedef struct _ClutterDeviceManagerWaylandClass ClutterDeviceManagerWaylandClass;
struct _ClutterDeviceManagerWayland
{
ClutterDeviceManager parent_instance;
GSList *devices;
ClutterInputDevice *core_pointer;
ClutterInputDevice *core_keyboard;
};
struct _ClutterDeviceManagerWaylandClass
{
ClutterDeviceManagerClass parent_class;
};
GType _clutter_device_manager_wayland_get_type (void) G_GNUC_CONST;
ClutterDeviceManager *
_clutter_device_manager_wayland_new (ClutterBackend *backend);
void
_clutter_device_manager_wayland_add_input_group (ClutterDeviceManager *manager,
uint32_t id);
void
_clutter_events_wayland_init (ClutterBackend *backend);
void
_clutter_events_wayland_uninit (ClutterBackend *backend);
G_END_DECLS
#endif /* __CLUTTER_DEVICE_MANAGER_WAYLAND_H__ */

View File

@ -1,125 +0,0 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2010 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
* Authors:
* Matthew Allum
* Robert Bragg
* Kristian Høgsberg
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdint.h>
#include <stdlib.h>
#include <wayland-client.h>
#include "clutter-event.h"
#include "clutter-main.h"
#include "clutter-private.h"
#include "clutter-stage-private.h"
#include "clutter-event-wayland.h"
typedef struct _ClutterEventSourceWayland
{
GSource source;
struct wl_display *display;
} ClutterEventSourceWayland;
static gboolean
clutter_event_source_wayland_prepare (GSource *base, gint *timeout)
{
ClutterEventSourceWayland *source = (ClutterEventSourceWayland *) base;
gboolean retval;
_clutter_threads_acquire_lock ();
*timeout = -1;
/* We have to add/remove the GPollFD if we want to update our
* poll event mask dynamically. Instead, let's just flush all
* writes on idle */
wl_display_flush (source->display);
retval = clutter_events_pending ();
_clutter_threads_release_lock ();
return retval;
}
static gboolean
clutter_event_source_wayland_check (GSource *base)
{
gboolean retval;
_clutter_threads_acquire_lock ();
retval = clutter_events_pending ();
_clutter_threads_release_lock ();
return retval;
}
static gboolean
clutter_event_source_wayland_dispatch (GSource *base,
GSourceFunc callback,
gpointer data)
{
ClutterEvent *event;
_clutter_threads_acquire_lock ();
event = clutter_event_get ();
if (event)
{
/* forward the event into clutter for emission etc. */
_clutter_stage_queue_event (event->any.stage, event, FALSE);
}
_clutter_threads_release_lock ();
return TRUE;
}
static GSourceFuncs clutter_event_source_wayland_funcs = {
clutter_event_source_wayland_prepare,
clutter_event_source_wayland_check,
clutter_event_source_wayland_dispatch,
NULL
};
GSource *
_clutter_event_source_wayland_new (struct wl_display *display)
{
ClutterEventSourceWayland *source;
source = (ClutterEventSourceWayland *)
g_source_new (&clutter_event_source_wayland_funcs,
sizeof (ClutterEventSourceWayland));
source->display = display;
return &source->source;
}

View File

@ -1,37 +0,0 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2011 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see
* <http://www.gnu.org/licenses/>.
* Authors:
* Robert Bragg <robert@linux.intel.com>
*/
#ifndef __CLUTTER_EVENT_WAYLAND_H__
#define __CLUTTER_EVENT_WAYLAND_H__
#include <glib-object.h>
#include <clutter/clutter-event.h>
#include <wayland-client.h>
GSource *
_clutter_event_source_wayland_new (struct wl_display *display);
#endif /* __CLUTTER_EVENT_WAYLAND_H__ */

View File

@ -1,628 +0,0 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2010 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
* Authors:
* Matthew Allum
* Robert Bragg
* Kristian Høgsberg
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <wayland-util.h>
#include <wayland-client.h>
#include "clutter-debug.h"
#include "clutter-device-manager-private.h"
#include "clutter-event-private.h"
#include "clutter-private.h"
#include "clutter-keysyms.h"
#include "evdev/clutter-xkb-utils.h"
#include "clutter-input-device-wayland.h"
#include "clutter-backend-wayland.h"
#include "clutter-backend-wayland-priv.h"
#include "clutter-stage-private.h"
#include "clutter-stage-wayland.h"
#include "clutter-wayland.h"
#include "cogl/clutter-stage-cogl.h"
typedef struct _ClutterInputDeviceClass ClutterInputDeviceWaylandClass;
#define clutter_input_device_wayland_get_type \
_clutter_input_device_wayland_get_type
G_DEFINE_TYPE (ClutterInputDeviceWayland,
clutter_input_device_wayland,
CLUTTER_TYPE_INPUT_DEVICE);
/* This gives us a fake time source for higher level abstractions to have an
* understanding of when an event happens. All that matters are that this is a
* monotonic increasing millisecond accurate time for events to be compared with.
*/
static guint32
_clutter_wayland_get_time (void)
{
return g_get_monotonic_time () / 1000;
}
static void
clutter_wayland_handle_motion (void *data,
struct wl_pointer *pointer,
uint32_t _time,
wl_fixed_t x, wl_fixed_t y)
{
ClutterInputDeviceWayland *device = data;
ClutterStageCogl *stage_cogl;
ClutterEvent *event;
if (!device->pointer_focus)
return;
stage_cogl = device->pointer_focus;
event = clutter_event_new (CLUTTER_MOTION);
event->motion.stage = stage_cogl->wrapper;
event->motion.device = CLUTTER_INPUT_DEVICE (device);
event->motion.time = _clutter_wayland_get_time ();
event->motion.modifier_state = 0;
event->motion.x = wl_fixed_to_double (x);
event->motion.y = wl_fixed_to_double (y);
device->x = event->motion.x;
device->y = event->motion.y;
_clutter_event_push (event, FALSE);
}
static void
clutter_wayland_handle_button (void *data,
struct wl_pointer *pointer,
uint32_t serial, uint32_t _time,
uint32_t button, uint32_t state)
{
ClutterInputDeviceWayland *device = data;
ClutterStageCogl *stage_cogl;
ClutterEvent *event;
ClutterEventType type;
ClutterModifierType modifier_mask = 0;
if (!device->pointer_focus)
return;
stage_cogl = device->pointer_focus;
if (state)
type = CLUTTER_BUTTON_PRESS;
else
type = CLUTTER_BUTTON_RELEASE;
event = clutter_event_new (type);
event->button.stage = stage_cogl->wrapper;
event->button.device = CLUTTER_INPUT_DEVICE (device);
event->button.time = _clutter_wayland_get_time ();
event->button.x = device->x;
event->button.y = device->y;
_clutter_xkb_translate_state (event, device->xkb, 0);
/* evdev button codes */
switch (button) {
case 272:
event->button.button = 1;
modifier_mask = CLUTTER_BUTTON1_MASK;
break;
case 273:
event->button.button = 3;
modifier_mask = CLUTTER_BUTTON2_MASK;
break;
case 274:
event->button.button = 2;
modifier_mask = CLUTTER_BUTTON3_MASK;
break;
}
if (modifier_mask)
{
if (state)
device->button_modifier_state |= modifier_mask;
else
device->button_modifier_state &= ~modifier_mask;
}
event->button.modifier_state = device->button_modifier_state;
_clutter_event_push (event, FALSE);
}
static void
clutter_wayland_handle_axis (void *data,
struct wl_pointer *pointer,
uint32_t time,
uint32_t axis,
wl_fixed_t value)
{
ClutterInputDeviceWayland *device = data;
ClutterStageCogl *stage_cogl;
ClutterEvent *event;
gdouble delta_x, delta_y;
gdouble delta_factor;
if (!device->pointer_focus)
return;
stage_cogl = device->pointer_focus;
event = clutter_event_new (CLUTTER_SCROLL);
event->scroll.time = _clutter_wayland_get_time ();
event->scroll.stage = stage_cogl->wrapper;
event->scroll.direction = CLUTTER_SCROLL_SMOOTH;
event->scroll.x = device->x;
event->scroll.y = device->y;
/* Wayland pointer axis events are in pointer motion coordinate space.
* To convert to Xi2 discrete step coordinate space, multiply the factor
* 1/10. */
delta_factor = 1.0 / 10.0;
if (axis == WL_POINTER_AXIS_HORIZONTAL_SCROLL)
{
delta_x = wl_fixed_to_double (value) * delta_factor;
delta_y = 0;
}
else
{
delta_x = 0;
delta_y = wl_fixed_to_double (value) * delta_factor;
}
clutter_event_set_scroll_delta (event, delta_x, delta_y);
_clutter_xkb_translate_state (event, device->xkb, 0);
_clutter_event_push (event, FALSE);
}
static void
clutter_wayland_handle_keymap (void *data,
struct wl_keyboard *keyboard,
uint32_t format,
int32_t fd,
uint32_t size)
{
ClutterInputDeviceWayland *device = data;
struct xkb_context *ctx;
struct xkb_keymap *keymap;
char *map_str;
if (device->xkb)
{
xkb_state_unref (device->xkb);
device->xkb = NULL;
}
ctx = xkb_context_new (0);
if (!ctx)
{
close (fd);
return;
}
if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1)
{
close (fd);
return;
}
map_str = mmap (NULL, size, PROT_READ, MAP_SHARED, fd, 0);
if (map_str == MAP_FAILED)
{
close (fd);
return;
}
keymap = xkb_map_new_from_string (ctx,
map_str,
XKB_KEYMAP_FORMAT_TEXT_V1,
0);
xkb_context_unref (ctx);
munmap (map_str, size);
close (fd);
if (!keymap)
{
g_warning ("failed to compile keymap\n");
return;
}
device->xkb = xkb_state_new (keymap);
xkb_map_unref (keymap);
if (!device->xkb)
{
g_warning ("failed to create XKB state object\n");
return;
}
}
/* XXX: Need a wl_keyboard event to harmonise these across clients. */
#define KEY_REPEAT_DELAY 660
#define KEY_REPEAT_INTERVAL 40
static gboolean
clutter_wayland_repeat_key (void *data)
{
ClutterInputDeviceWayland *device = data;
ClutterStageCogl *stage_cogl = device->keyboard_focus;
ClutterEvent *event;
event = _clutter_key_event_new_from_evdev ((ClutterInputDevice *) device,
(ClutterInputDevice*) device,
stage_cogl->wrapper,
device->xkb, 0,
device->repeat_time,
device->repeat_key,
1);
device->repeat_time += KEY_REPEAT_INTERVAL;
_clutter_event_push (event, FALSE);
if (!device->is_initial_repeat)
return TRUE;
g_source_remove (device->repeat_source);
device->repeat_source = g_timeout_add (KEY_REPEAT_INTERVAL,
clutter_wayland_repeat_key,
device);
device->is_initial_repeat = FALSE;
return FALSE;
}
static void
clutter_wayland_handle_key (void *data,
struct wl_keyboard *keyboard,
uint32_t serial, uint32_t _time,
uint32_t key, uint32_t state)
{
ClutterInputDeviceWayland *device = data;
ClutterStageCogl *stage_cogl = device->keyboard_focus;
ClutterEvent *event;
if (!device->keyboard_focus)
return;
if (!device->xkb)
return;
event = _clutter_key_event_new_from_evdev ((ClutterInputDevice *) device,
(ClutterInputDevice *) device,
stage_cogl->wrapper,
device->xkb, 0,
_clutter_wayland_get_time (),
key, state);
_clutter_event_push (event, FALSE);
if (!xkb_key_repeats (xkb_state_get_map (device->xkb), key))
return;
if (state)
{
if (device->repeat_key != XKB_KEYCODE_INVALID)
g_source_remove (device->repeat_source);
device->repeat_key = key;
device->repeat_time = _time + KEY_REPEAT_DELAY;
device->repeat_source = g_timeout_add (KEY_REPEAT_DELAY,
clutter_wayland_repeat_key,
device);
device->is_initial_repeat = TRUE;
}
else if (device->repeat_key == key)
{
g_source_remove (device->repeat_source);
device->repeat_key = XKB_KEYCODE_INVALID;
}
}
static void
clutter_wayland_handle_modifiers (void *data,
struct wl_keyboard *keyboard,
uint32_t serial,
uint32_t mods_depressed,
uint32_t mods_latched,
uint32_t mods_locked,
uint32_t group)
{
ClutterInputDeviceWayland *device = data;
if (!device->xkb)
return;
xkb_state_update_mask (device->xkb,
mods_depressed,
mods_latched,
mods_locked,
0,
0,
group);
}
static void
clutter_wayland_handle_pointer_enter (void *data,
struct wl_pointer *pointer,
uint32_t serial,
struct wl_surface *surface,
wl_fixed_t x, wl_fixed_t y)
{
ClutterInputDeviceWayland *device = data;
ClutterStageWayland *stage_wayland;
ClutterStageCogl *stage_cogl;
ClutterEvent *event;
ClutterBackend *backend;
ClutterBackendWayland *backend_wayland;
stage_wayland = wl_surface_get_user_data (surface);
if (!CLUTTER_IS_STAGE_COGL (stage_wayland))
return;
stage_cogl = CLUTTER_STAGE_COGL (stage_wayland);
device->pointer_focus = stage_cogl;
_clutter_input_device_set_stage (CLUTTER_INPUT_DEVICE (device),
stage_cogl->wrapper);
event = clutter_event_new (CLUTTER_ENTER);
event->crossing.stage = stage_cogl->wrapper;
event->crossing.time = _clutter_wayland_get_time ();
event->crossing.x = wl_fixed_to_double (x);
event->crossing.y = wl_fixed_to_double (y);
event->crossing.source = CLUTTER_ACTOR (stage_cogl->wrapper);
event->crossing.device = CLUTTER_INPUT_DEVICE (device);
device->x = event->crossing.x;
device->y = event->crossing.y;
_clutter_event_push (event, FALSE);
if (stage_wayland->cursor_visible)
{
/* Set the cursor to the cursor loaded at backend initialisation */
backend = clutter_get_default_backend ();
backend_wayland = CLUTTER_BACKEND_WAYLAND (backend);
_clutter_backend_wayland_ensure_cursor (backend_wayland);
wl_pointer_set_cursor (pointer,
serial,
backend_wayland->cursor_surface,
backend_wayland->cursor_x,
backend_wayland->cursor_y);
wl_surface_attach (backend_wayland->cursor_surface,
backend_wayland->cursor_buffer,
0,
0);
wl_surface_damage (backend_wayland->cursor_surface,
0,
0,
32, /* XXX: FFS */
32);
wl_surface_commit (backend_wayland->cursor_surface);
}
else
{
wl_pointer_set_cursor (pointer, serial, NULL, 0, 0);
}
}
static void
clutter_wayland_handle_pointer_leave (void *data,
struct wl_pointer *pointer,
uint32_t serial,
struct wl_surface *surface)
{
ClutterInputDeviceWayland *device = data;
ClutterStageCogl *stage_cogl;
ClutterEvent *event;
if (surface == NULL)
return;
if (!CLUTTER_IS_STAGE_COGL (wl_surface_get_user_data (surface)))
return;
stage_cogl = wl_surface_get_user_data (surface);
g_assert (device->pointer_focus == stage_cogl);
event = clutter_event_new (CLUTTER_LEAVE);
event->crossing.stage = stage_cogl->wrapper;
event->crossing.time = _clutter_wayland_get_time ();
event->crossing.x = device->x;
event->crossing.y = device->y;
event->crossing.source = CLUTTER_ACTOR (stage_cogl->wrapper);
event->crossing.device = CLUTTER_INPUT_DEVICE (device);
_clutter_event_push (event, FALSE);
device->pointer_focus = NULL;
_clutter_input_device_set_stage (CLUTTER_INPUT_DEVICE (device), NULL);
}
static void
clutter_wayland_handle_keyboard_enter (void *data,
struct wl_keyboard *keyboard,
uint32_t serial,
struct wl_surface *surface,
struct wl_array *keys)
{
ClutterInputDeviceWayland *device = data;
ClutterStageCogl *stage_cogl;
if (!CLUTTER_IS_STAGE_COGL (wl_surface_get_user_data (surface)))
return;
stage_cogl = wl_surface_get_user_data (surface);
g_assert (device->keyboard_focus == NULL);
device->keyboard_focus = stage_cogl;
_clutter_stage_update_state (stage_cogl->wrapper,
0,
CLUTTER_STAGE_STATE_ACTIVATED);
}
static void
clutter_wayland_handle_keyboard_leave (void *data,
struct wl_keyboard *keyboard,
uint32_t serial,
struct wl_surface *surface)
{
ClutterInputDeviceWayland *device = data;
ClutterStageCogl *stage_cogl;
if (!surface)
return;
if (!CLUTTER_IS_STAGE_COGL (wl_surface_get_user_data (surface)))
return;
stage_cogl = wl_surface_get_user_data (surface);
g_assert (device->keyboard_focus == stage_cogl);
_clutter_stage_update_state (stage_cogl->wrapper,
CLUTTER_STAGE_STATE_ACTIVATED,
0);
if (device->repeat_key != XKB_KEYCODE_INVALID)
{
g_source_remove (device->repeat_source);
device->repeat_key = XKB_KEYCODE_INVALID;
}
device->keyboard_focus = NULL;
}
static const struct wl_keyboard_listener _clutter_keyboard_wayland_listener = {
clutter_wayland_handle_keymap,
clutter_wayland_handle_keyboard_enter,
clutter_wayland_handle_keyboard_leave,
clutter_wayland_handle_key,
clutter_wayland_handle_modifiers,
};
static const struct wl_pointer_listener _clutter_pointer_wayland_listener = {
clutter_wayland_handle_pointer_enter,
clutter_wayland_handle_pointer_leave,
clutter_wayland_handle_motion,
clutter_wayland_handle_button,
clutter_wayland_handle_axis,
};
static void
clutter_wayland_handle_seat (void *data,
struct wl_seat *seat,
uint32_t capabilities)
{
ClutterInputDeviceWayland *device = data;
/* XXX: Needs to handle removals too. */
if ((capabilities & WL_SEAT_CAPABILITY_POINTER) && !device->has_pointer)
{
struct wl_pointer *pointer;
pointer = wl_seat_get_pointer (seat);
if (pointer)
{
wl_pointer_add_listener (pointer,
&_clutter_pointer_wayland_listener,
device);
wl_pointer_set_user_data (pointer, device);
device->has_pointer = 1;
}
}
if ((capabilities & WL_SEAT_CAPABILITY_KEYBOARD) && !device->has_keyboard)
{
struct wl_keyboard *keyboard;
keyboard = wl_seat_get_keyboard (seat);
if (keyboard)
{
wl_keyboard_add_listener (keyboard,
&_clutter_keyboard_wayland_listener,
device);
wl_keyboard_set_user_data (keyboard, device);
device->has_keyboard = 1;
}
}
}
const struct wl_seat_listener _clutter_seat_wayland_listener = {
clutter_wayland_handle_seat,
};
static gboolean
clutter_input_device_wayland_keycode_to_evdev (ClutterInputDevice *device,
guint hardware_keycode,
guint *evdev_keycode)
{
/* The hardware keycodes from the wayland backend are already evdev
keycodes */
*evdev_keycode = hardware_keycode;
return TRUE;
}
static void
clutter_input_device_wayland_class_init (ClutterInputDeviceWaylandClass *klass)
{
klass->keycode_to_evdev = clutter_input_device_wayland_keycode_to_evdev;
}
static void
clutter_input_device_wayland_init (ClutterInputDeviceWayland *self)
{
self->repeat_key = XKB_KEYCODE_INVALID;
}
/**
* clutter_wayland_input_device_get_wl_seat: (skip)
* @device: a #ClutterInputDevice
*
* Access the underlying data structure representing the Wayland device that is
* backing this #ClutterInputDevice.
*
* Note: this function can only be called when running on the Wayland platform.
* Calling this function at any other time will return %NULL.
*
* Returns: (transfer none): the Wayland input device associated with the
* @device
*
* Since: 1.10
*/
struct wl_seat *
clutter_wayland_input_device_get_wl_seat (ClutterInputDevice *device)
{
ClutterInputDeviceWayland *wayland_device;
if (!CLUTTER_INPUT_DEVICE_WAYLAND (device))
return NULL;
wayland_device = CLUTTER_INPUT_DEVICE_WAYLAND (device);
return wayland_device->input_device;
}

View File

@ -1,63 +0,0 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2011 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see
* <http://www.gnu.org/licenses/>.
* Authors:
* Robert Bragg <robert@linux.intel.com>
*/
#ifndef __CLUTTER_INPUT_DEVICE_WAYLAND_H__
#define __CLUTTER_INPUT_DEVICE_WAYLAND_H__
#include <xkbcommon/xkbcommon.h>
#include <glib-object.h>
#include <clutter/clutter-event.h>
#include "clutter-device-manager-private.h"
#include "cogl/clutter-stage-cogl.h"
#define CLUTTER_TYPE_INPUT_DEVICE_WAYLAND (_clutter_input_device_wayland_get_type ())
#define CLUTTER_INPUT_DEVICE_WAYLAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_INPUT_DEVICE_WAYLAND, ClutterInputDeviceWayland))
#define CLUTTER_IS_INPUT_DEVICE_WAYLAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_INPUT_DEVICE_WAYLAND))
typedef struct _ClutterInputDeviceWayland ClutterInputDeviceWayland;
struct _ClutterInputDeviceWayland
{
ClutterInputDevice device;
struct wl_seat *input_device;
ClutterStageCogl *pointer_focus;
ClutterStageCogl *keyboard_focus;
gdouble x, y;
struct xkb_state *xkb;
gint has_pointer;
gint has_keyboard;
xkb_keycode_t repeat_key;
guint repeat_time;
guint repeat_source;
gboolean is_initial_repeat;
ClutterModifierType button_modifier_state;
};
GType _clutter_input_device_wayland_get_type (void) G_GNUC_CONST;
extern const struct wl_seat_listener _clutter_seat_wayland_listener;
#endif /* __CLUTTER_INPUT_DEVICE_WAYLAND_H__ */

View File

@ -1,365 +0,0 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2010 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
* Authors:
* Matthew Allum
* Robert Bragg
* Kristian Høgsberg
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <glib.h>
#include "clutter-wayland.h"
#include "clutter-stage-wayland.h"
#include "clutter-backend-wayland.h"
#include "clutter-backend-wayland-priv.h"
#include "clutter-stage-window.h"
#include "clutter-stage-private.h"
#include "clutter-event-private.h"
#include "clutter-wayland.h"
#include <cogl/cogl.h>
#include <cogl/cogl-wayland-client.h>
static ClutterStageWindowIface *clutter_stage_window_parent_iface = NULL;
static void clutter_stage_window_iface_init (ClutterStageWindowIface *iface);
#define clutter_stage_wayland_get_type _clutter_stage_wayland_get_type
G_DEFINE_TYPE_WITH_CODE (ClutterStageWayland,
clutter_stage_wayland,
CLUTTER_TYPE_STAGE_COGL,
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_STAGE_WINDOW,
clutter_stage_window_iface_init));
static void
handle_ping (void *data,
struct wl_shell_surface *shell_surface,
uint32_t serial)
{
wl_shell_surface_pong(shell_surface, serial);
}
static void
handle_configure (void *data,
struct wl_shell_surface *shell_surface,
uint32_t edges,
int32_t width,
int32_t height)
{
ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL(data);
CoglFramebuffer *fb = COGL_FRAMEBUFFER (stage_cogl->onscreen);
if (cogl_framebuffer_get_width (fb) != width ||
cogl_framebuffer_get_height (fb) != height)
clutter_actor_queue_relayout (CLUTTER_ACTOR (stage_cogl->wrapper));
clutter_actor_set_size (CLUTTER_ACTOR (stage_cogl->wrapper),
width, height);
/* the resize process is complete, so we can ask the stage
* to set up the GL viewport with the new size
*/
clutter_stage_ensure_viewport (stage_cogl->wrapper);
}
static void
handle_popup_done (void *data,
struct wl_shell_surface *shell_surface)
{
/* XXX: Fill me in. */
}
static const struct wl_shell_surface_listener shell_surface_listener = {
handle_ping,
handle_configure,
handle_popup_done,
};
static void
clutter_stage_wayland_set_fullscreen (ClutterStageWindow *stage_window,
gboolean fullscreen);
static gboolean
clutter_stage_wayland_realize (ClutterStageWindow *stage_window)
{
ClutterStageWayland *stage_wayland = CLUTTER_STAGE_WAYLAND (stage_window);
ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window);
struct wl_surface *wl_surface;
struct wl_shell_surface *wl_shell_surface;
clutter_stage_window_parent_iface->realize (stage_window);
wl_surface = cogl_wayland_onscreen_get_surface (stage_cogl->onscreen);
wl_surface_set_user_data (wl_surface, stage_wayland);
stage_wayland->wayland_surface = wl_surface;
if (!stage_wayland->foreign_wl_surface)
{
wl_shell_surface =
cogl_wayland_onscreen_get_shell_surface (stage_cogl->onscreen);
wl_shell_surface_add_listener (wl_shell_surface,
&shell_surface_listener,
stage_wayland);
stage_wayland->wayland_shell_surface = wl_shell_surface;
}
if (stage_wayland->fullscreen)
clutter_stage_wayland_set_fullscreen (stage_window, TRUE);
return TRUE;
}
static void
clutter_stage_wayland_show (ClutterStageWindow *stage_window,
gboolean do_raise)
{
ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window);
ClutterStageWayland *stage_wayland = CLUTTER_STAGE_WAYLAND (stage_window);
clutter_stage_window_parent_iface->show (stage_window, do_raise);
if (stage_wayland->wayland_shell_surface)
wl_shell_surface_set_toplevel (stage_wayland->wayland_shell_surface);
stage_wayland->shown = TRUE;
/* We need to queue a redraw after the stage is shown because all of
* the other queue redraws up to this point will have been ignored
* because the actor was not visible. The other backends do not need
* to do this because they will get expose events at some point, but
* that does not happen for Wayland. */
clutter_actor_queue_redraw (CLUTTER_ACTOR (stage_cogl->wrapper));
}
static void
clutter_stage_wayland_set_cursor_visible (ClutterStageWindow *stage_window,
gboolean cursor_visible)
{
ClutterStageWayland *stage_wayland = CLUTTER_STAGE_WAYLAND (stage_window);
stage_wayland->cursor_visible = cursor_visible;
}
static void
clutter_stage_wayland_set_fullscreen (ClutterStageWindow *stage_window,
gboolean fullscreen)
{
ClutterStageWayland *stage_wayland = CLUTTER_STAGE_WAYLAND (stage_window);
ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window);
ClutterBackend *backend = CLUTTER_BACKEND (stage_cogl->backend);
ClutterBackendWayland *backend_wayland = CLUTTER_BACKEND_WAYLAND (backend);
ClutterActor *stage = _clutter_stage_window_get_wrapper (stage_window);
stage_wayland->fullscreen = fullscreen;
if (!stage_wayland->wayland_shell_surface)
return;
if (fullscreen)
{
_clutter_stage_update_state (stage_cogl->wrapper,
0,
CLUTTER_STAGE_STATE_FULLSCREEN);
/* FIXME: In future versions of the Wayland protocol we'll get a
* configure with the dimensions we can use - but for now we have to
* use the dimensions from the output's mode
*/
clutter_actor_set_size (stage,
backend_wayland->output_width,
backend_wayland->output_height);
/* FIXME: And we must force a redraw so that new sized buffer gets
* attached
*/
_clutter_stage_window_redraw (stage_window);
wl_shell_surface_set_fullscreen (stage_wayland->wayland_shell_surface,
WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,
0,
NULL);
}
else
{
_clutter_stage_update_state (stage_cogl->wrapper,
CLUTTER_STAGE_STATE_FULLSCREEN,
0);
wl_shell_surface_set_toplevel (stage_wayland->wayland_shell_surface);
}
}
static void
clutter_stage_wayland_resize (ClutterStageWindow *stage_window,
gint width,
gint height)
{
ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window);
ClutterStageWayland *stage_wayland = CLUTTER_STAGE_WAYLAND (stage_window);
/* Resize preserving top left */
if (stage_cogl->onscreen)
{
cogl_wayland_onscreen_resize (stage_cogl->onscreen, width, height, 0, 0);
/* Only trigger a redraw if the stage window has been shown */
if (stage_wayland->shown)
_clutter_stage_window_redraw (stage_window);
}
}
static gboolean
clutter_stage_wayland_can_clip_redraws (ClutterStageWindow *stage_window)
{
return TRUE;
}
static void
clutter_stage_wayland_init (ClutterStageWayland *stage_wayland)
{
stage_wayland->cursor_visible = TRUE;
}
static void
clutter_stage_window_iface_init (ClutterStageWindowIface *iface)
{
clutter_stage_window_parent_iface = g_type_interface_peek_parent (iface);
iface->realize = clutter_stage_wayland_realize;
iface->show = clutter_stage_wayland_show;
iface->set_fullscreen = clutter_stage_wayland_set_fullscreen;
iface->set_cursor_visible = clutter_stage_wayland_set_cursor_visible;
iface->resize = clutter_stage_wayland_resize;
iface->can_clip_redraws = clutter_stage_wayland_can_clip_redraws;
}
static void
clutter_stage_wayland_class_init (ClutterStageWaylandClass *klass)
{
}
/**
* clutter_wayland_stage_get_wl_shell_surface: (skip)
* @stage: a #ClutterStage
*
* Access the underlying data structure representing the shell surface that is
* backing the #ClutterStage
*
* Note: this function can only be called when running on the Wayland
* platform. Calling this function at any other time will return %NULL.
*
* Returns: (transfer none): the Wayland shell surface associated with
* @stage
*
* Since: 1.10
*/
struct wl_shell_surface *
clutter_wayland_stage_get_wl_shell_surface (ClutterStage *stage)
{
ClutterStageWindow *stage_window = _clutter_stage_get_window (stage);
ClutterStageWayland *stage_wayland;
if (!CLUTTER_IS_STAGE_WAYLAND (stage_window))
return NULL;
stage_wayland = CLUTTER_STAGE_WAYLAND (stage_window);
return stage_wayland->wayland_shell_surface;
}
/**
* clutter_wayland_stage_get_wl_surface: (skip)
* @stage: a #ClutterStage
*
* Access the underlying data structure representing the surface that is
* backing the #ClutterStage
*
* Note: this function can only be called when running on the Wayland
* platform. Calling this function at any other time will return %NULL.
*
* Returns: (transfer none): the Wayland surface associated with @stage
*
* Since: 1.10
*/
struct wl_surface *
clutter_wayland_stage_get_wl_surface (ClutterStage *stage)
{
ClutterStageWindow *stage_window = _clutter_stage_get_window (stage);
ClutterStageWayland *stage_wayland;
if (!CLUTTER_IS_STAGE_WAYLAND (stage_window))
return NULL;
stage_wayland = CLUTTER_STAGE_WAYLAND (stage_window);
return stage_wayland->wayland_surface;
}
/**
* clutter_wayland_stage_set_wl_surface:
* @stage: a #ClutterStage
* @surface: A Wayland surface to associate with the @stage.
*
* Allows you to explicitly provide an existing Wayland surface to associate
* with @stage, preventing Cogl from allocating a surface and shell surface for
* the stage automatically.
*
* This function must be called before @stage is shown.
*
* Note: this function can only be called when running on the Wayland
* platform. Calling this function at any other time has no effect.
*
* Since: 1.16
*/
void
clutter_wayland_stage_set_wl_surface (ClutterStage *stage,
struct wl_surface *surface)
{
ClutterStageWindow *stage_window = _clutter_stage_get_window (stage);
ClutterStageWayland *stage_wayland;
ClutterStageCogl *stage_cogl;
if (!CLUTTER_IS_STAGE_WAYLAND (stage_window))
return;
stage_cogl = CLUTTER_STAGE_COGL (stage_window);
if (stage_cogl->onscreen == NULL)
{
ClutterBackend *backend = clutter_get_default_backend ();
/* Use the same default dimensions as clutter_stage_cogl_realize() */
stage_cogl->onscreen = cogl_onscreen_new (backend->cogl_context,
800, 600);
cogl_wayland_onscreen_set_foreign_surface (stage_cogl->onscreen,
surface);
stage_wayland = CLUTTER_STAGE_WAYLAND (stage_window);
stage_wayland->foreign_wl_surface = TRUE;
}
else
g_warning (G_STRLOC ": cannot set foreign surface for stage");
}

View File

@ -1,68 +0,0 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2010,2011 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
* Authors:
* Matthew Allum
* Robert Bragg
* Kristian Høgsberg
*/
#ifndef __CLUTTER_STAGE_WAYLAND_H__
#define __CLUTTER_STAGE_WAYLAND_H__
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <glib-object.h>
#include <clutter/clutter-stage.h>
#include "cogl/clutter-stage-cogl.h"
#define CLUTTER_TYPE_STAGE_WAYLAND (_clutter_stage_wayland_get_type ())
#define CLUTTER_STAGE_WAYLAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_STAGE_WAYLAND, ClutterStageWayland))
#define CLUTTER_IS_STAGE_WAYLAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_STAGE_WAYLAND))
#define CLUTTER_STAGE_WAYLAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_STAGE_WAYLAND, ClutterStageWaylandClass))
#define CLUTTER_IS_STAGE_WAYLAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_STAGE_WAYLAND))
#define CLUTTER_STAGE_WAYLAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_STAGE_WAYLAND, ClutterStageWaylandClass))
typedef struct _ClutterStageWayland ClutterStageWayland;
typedef struct _ClutterStageWaylandClass ClutterStageWaylandClass;
struct _ClutterStageWayland
{
ClutterStageCogl parent_instance;
struct wl_surface *wayland_surface;
struct wl_shell_surface *wayland_shell_surface;
gboolean fullscreen;
gboolean foreign_wl_surface;
gboolean shown;
gboolean cursor_visible;
};
struct _ClutterStageWaylandClass
{
ClutterStageCoglClass parent_class;
};
GType _clutter_stage_wayland_get_type (void) G_GNUC_CONST;
#endif /* __CLUTTER_STAGE_WAYLAND_H__ */

View File

@ -1,62 +0,0 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2012 Intel Corporation
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*
*/
/**
* SECTION:clutter-wayland
* @short_description: Wayland specific API
*
* The Wayland backend for Clutter provides some specific API, allowing
* integration with the Wayland client API for acessing the underlying data
* structures
*
* The Clutter Wayland API is available since Clutter 1.10
*/
#ifndef __CLUTTER_WAYLAND_H__
#define __CLUTTER_WAYLAND_H__
#include <glib.h>
#include <wayland-client.h>
#include <clutter/clutter.h>
G_BEGIN_DECLS
CLUTTER_AVAILABLE_IN_1_10
struct wl_seat *clutter_wayland_input_device_get_wl_seat (ClutterInputDevice *device);
CLUTTER_AVAILABLE_IN_1_10
struct wl_shell_surface *clutter_wayland_stage_get_wl_shell_surface (ClutterStage *stage);
CLUTTER_AVAILABLE_IN_1_10
struct wl_surface *clutter_wayland_stage_get_wl_surface (ClutterStage *stage);
CLUTTER_AVAILABLE_IN_1_16
void clutter_wayland_stage_set_wl_surface (ClutterStage *stage, struct wl_surface *surface);
CLUTTER_AVAILABLE_IN_1_16
void clutter_wayland_set_display (struct wl_display *display);
CLUTTER_AVAILABLE_IN_1_16
void clutter_wayland_disable_event_retrieval (void);
G_END_DECLS
#endif /* __CLUTTER_WAYLAND_H__ */

View File

@ -214,10 +214,6 @@ AC_ARG_ENABLE([x11-backend],
[AS_HELP_STRING([--enable-x11-backend=@<:@yes/no@:>@], [Enable the X11 backend (default=check)])],
[enable_x11=$enableval],
[enable_x11=check])
AC_ARG_ENABLE([wayland-backend],
[AS_HELP_STRING([--enable-wayland-backend=@<:@yes/no@:>@], [Enable the Wayland client backend (default=check)])],
[enable_wayland=$enableval],
[enable_wayland=check])
AC_ARG_ENABLE([egl-backend],
[AS_HELP_STRING([--enable-egl-backend=@<:@yes/no@:>@], [Enable the EGL framebuffer backend (default=no)])],
[enable_egl=$enableval],
@ -264,57 +260,6 @@ AS_IF([test "x$enable_x11" = "xyes"],
[])
])
AS_IF([test "x$enable_wayland" != xno],
[
# We need to manually check for Wayland support in Cogl because
# the windowing systems are not exposed in the pkg-config file
saved_CFLAGS="${CFLAGS}"
CFLAGS="`$PKG_CONFIG --cflags cogl-1.0`"
AC_MSG_CHECKING([for Wayland Cogl backend])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <cogl/cogl.h>
]],
[[
#ifndef COGL_HAS_EGL_PLATFORM_WAYLAND_SUPPORT
#error Cogl compiled without Wayland support
#endif
]])], [
AC_MSG_RESULT(yes)
have_cogl_wayland=yes
], [
AC_MSG_RESULT(no)
have_cogl_wayland=no
])
CFLAGS="${saved_CFLAGS}"
AS_IF([test "x$have_cogl_wayland" = xyes],
[
PKG_CHECK_EXISTS([wayland-client wayland-cursor xkbcommon gdk-pixbuf-2.0],
[
BACKEND_PC_FILES="$BACKEND_PC_FILES wayland-cursor wayland-client xkbcommon"
BACKEND_PC_FILES_PRIVATE="$BACKEND_PC_FILES_PRIVATE gdk-pixbuf-2.0"
CLUTTER_BACKENDS="$CLUTTER_BACKENDS wayland"
CLUTTER_INPUT_BACKENDS="$CLUTTER_INPUT_BACKENDS wayland"
SUPPORT_WAYLAND=1
SUPPORT_COGL=1
],
[
AS_IF([test "x$enable_wayland" = xyes],
[AC_MSG_ERROR(["*** Missing dependencies for Wayland support ***"])],
[enable_wayland=no])
])
],
[
AS_IF([test "x$enable_wayland" = xyes],
[AC_MSG_ERROR("*** Cogl is missing Wayland support ***")],
[enable_wayland=no])
])
])
dnl Note this is orthogonal to the client side support and you can
dnl use the Wayland compositor features with any of the clutter
dnl backends with corresponding Cogl support.
@ -427,18 +372,12 @@ AS_IF([test "x$SUPPORT_GLX" = "x1"],
AS_IF([test "x$SUPPORT_EGL" = "x1"],
[CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
#define CLUTTER_WINDOWING_EGL \"eglnative\""])
AS_IF([test "x$SUPPORT_WAYLAND" = "x1"],
[CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
#define CLUTTER_WINDOWING_WAYLAND \"wayland\""])
AS_IF([test "x$SUPPORT_EVDEV" = "x1"],
[CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
#define CLUTTER_INPUT_EVDEV \"evdev\""])
AS_IF([test "x$SUPPORT_TSLIB" = "x1"],
[CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
#define CLUTTER_INPUT_TSLIB \"tslib\""])
AS_IF([test "x$SUPPORT_WAYLAND" = "x1"],
[CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
#define CLUTTER_INPUT_WAYLAND \"wayland\""])
# the 'null' input backend is special
CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES