diff --git a/src/Makefile.am b/src/Makefile.am index 816eef6a6..9d9c5c033 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -70,12 +70,16 @@ libmutter_la_SOURCES = \ backends/meta-monitor-manager-dummy.h \ backends/edid-parse.c \ backends/edid.h \ + backends/native/meta-backend-native.c \ + backends/native/meta-backend-native.h \ backends/native/meta-idle-monitor-native.c \ backends/native/meta-idle-monitor-native.h \ backends/native/meta-monitor-manager-kms.c \ backends/native/meta-monitor-manager-kms.h \ backends/native/meta-weston-launch.c \ backends/native/meta-weston-launch.h \ + backends/x11/meta-backend-x11.c \ + backends/x11/meta-backend-x11.h \ backends/x11/meta-idle-monitor-xsync.c \ backends/x11/meta-idle-monitor-xsync.h \ backends/x11/meta-monitor-manager-xrandr.c \ diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h index 1f54b8611..b936dc55e 100644 --- a/src/backends/meta-backend-private.h +++ b/src/backends/meta-backend-private.h @@ -48,6 +48,9 @@ struct _MetaBackend struct _MetaBackendClass { GObjectClass parent_class; + + MetaIdleMonitor * (* create_idle_monitor) (MetaBackend *backend, + int device_id); }; #endif /* META_BACKEND_PRIVATE_H */ diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c index 967d98306..5f2f03a17 100644 --- a/src/backends/meta-backend.c +++ b/src/backends/meta-backend.c @@ -32,12 +32,12 @@ #include #include +#include "backends/x11/meta-backend-x11.h" +#include "backends/native/meta-backend-native.h" + #include "backends/native/meta-weston-launch.h" #include -#include "backends/x11/meta-idle-monitor-xsync.h" -#include "backends/native/meta-idle-monitor-native.h" - static MetaBackend *_backend; MetaBackend * @@ -46,7 +46,7 @@ meta_get_backend (void) return _backend; } -G_DEFINE_TYPE (MetaBackend, meta_backend, G_TYPE_OBJECT); +G_DEFINE_ABSTRACT_TYPE (MetaBackend, meta_backend, G_TYPE_OBJECT); static void meta_backend_finalize (GObject *object) @@ -77,17 +77,6 @@ meta_backend_init (MetaBackend *backend) _backend = backend; } -static GType -get_idle_monitor_type (void) -{ -#if defined(CLUTTER_WINDOWING_X11) - if (clutter_check_windowing_backend (CLUTTER_WINDOWING_X11)) - return META_TYPE_IDLE_MONITOR_XSYNC; -#endif - - return META_TYPE_IDLE_MONITOR_NATIVE; -} - /* FIXME -- destroy device monitors at some point */ G_GNUC_UNUSED static void destroy_device_monitor (MetaBackend *backend, @@ -98,6 +87,13 @@ destroy_device_monitor (MetaBackend *backend, backend->device_id_max--; } +static MetaIdleMonitor * +meta_backend_create_idle_monitor (MetaBackend *backend, + int device_id) +{ + return META_BACKEND_GET_CLASS (backend)->create_idle_monitor (backend, device_id); +} + MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend *backend, int device_id) @@ -106,37 +102,27 @@ meta_backend_get_idle_monitor (MetaBackend *backend, if (!backend->device_monitors[device_id]) { - backend->device_monitors[device_id] = g_object_new (get_idle_monitor_type (), - "device-id", device_id, - NULL); + backend->device_monitors[device_id] = meta_backend_create_idle_monitor (backend, device_id); backend->device_id_max = MAX (backend->device_id_max, device_id); } return backend->device_monitors[device_id]; } -void -meta_backend_x11_handle_alarm_notify (MetaBackend *backend, - XEvent *xevent) -{ - int i; - - for (i = 0; i <= backend->device_id_max; i++) - { - if (backend->device_monitors[i]) - { - if (!META_IS_IDLE_MONITOR_XSYNC (backend->device_monitors[i])) - return; - - meta_idle_monitor_xsync_handle_xevent (backend->device_monitors[i], (XSyncAlarmNotifyEvent*)xevent); - } - } -} - static GType get_backend_type (void) { - return META_TYPE_BACKEND; +#if defined(CLUTTER_WINDOWING_X11) + if (clutter_check_windowing_backend (CLUTTER_WINDOWING_X11)) + return META_TYPE_BACKEND_X11; +#endif + +#if defined(CLUTTER_WINDOWING_EGL) + if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL)) + return META_TYPE_BACKEND_NATIVE; +#endif + + g_assert_not_reached (); } static void diff --git a/src/backends/meta-backend.h b/src/backends/meta-backend.h index 0e718a3d9..021e235b0 100644 --- a/src/backends/meta-backend.h +++ b/src/backends/meta-backend.h @@ -27,7 +27,6 @@ #include -#include #include typedef struct _MetaBackend MetaBackend; @@ -40,9 +39,6 @@ MetaBackend * meta_get_backend (void); MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend *backend, int device_id); -void meta_backend_x11_handle_alarm_notify (MetaBackend *backend, - XEvent *event); - void meta_clutter_init (void); gboolean meta_activate_vt (int vt, GError **error); diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c new file mode 100644 index 000000000..5e6ec7cfa --- /dev/null +++ b/src/backends/native/meta-backend-native.c @@ -0,0 +1,53 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2014 Red Hat + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * Written by: + * Jasper St. Pierre + */ + +#include "config.h" + +#include "meta-backend-native.h" + +#include "meta-idle-monitor-native.h" + +G_DEFINE_TYPE (MetaBackendNative, meta_backend_native, META_TYPE_BACKEND); + +static MetaIdleMonitor * +meta_backend_native_create_idle_monitor (MetaBackend *backend, + int device_id) +{ + return g_object_new (META_TYPE_IDLE_MONITOR_NATIVE, + "device-id", device_id, + NULL); +} + +static void +meta_backend_native_class_init (MetaBackendNativeClass *klass) +{ + MetaBackendClass *backend_class = META_BACKEND_CLASS (klass); + + backend_class->create_idle_monitor = meta_backend_native_create_idle_monitor; +} + +static void +meta_backend_native_init (MetaBackendNative *native) +{ +} diff --git a/src/backends/native/meta-backend-native.h b/src/backends/native/meta-backend-native.h new file mode 100644 index 000000000..4ee6efc31 --- /dev/null +++ b/src/backends/native/meta-backend-native.h @@ -0,0 +1,52 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2014 Red Hat + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * Written by: + * Jasper St. Pierre + */ + +#ifndef META_BACKEND_NATIVE_H +#define META_BACKEND_NATIVE_H + +#include "backends/meta-backend-private.h" + +#define META_TYPE_BACKEND_NATIVE (meta_backend_native_get_type ()) +#define META_BACKEND_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_BACKEND_NATIVE, MetaBackendNative)) +#define META_BACKEND_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_BACKEND_NATIVE, MetaBackendNativeClass)) +#define META_IS_BACKEND_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_BACKEND_NATIVE)) +#define META_IS_BACKEND_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_BACKEND_NATIVE)) +#define META_BACKEND_NATIVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_BACKEND_NATIVE, MetaBackendNativeClass)) + +typedef struct _MetaBackendNative MetaBackendNative; +typedef struct _MetaBackendNativeClass MetaBackendNativeClass; + +struct _MetaBackendNative +{ + MetaBackend parent; +}; + +struct _MetaBackendNativeClass +{ + MetaBackendClass parent_class; +}; + +GType meta_backend_native_get_type (void) G_GNUC_CONST; + +#endif /* META_BACKEND_NATIVE_H */ diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c new file mode 100644 index 000000000..35e8416a2 --- /dev/null +++ b/src/backends/x11/meta-backend-x11.c @@ -0,0 +1,67 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2014 Red Hat + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * Written by: + * Jasper St. Pierre + */ + +#include "config.h" + +#include "meta-backend-x11.h" + +#include "meta-idle-monitor-xsync.h" + +G_DEFINE_TYPE (MetaBackendX11, meta_backend_x11, META_TYPE_BACKEND); + +static MetaIdleMonitor * +meta_backend_x11_create_idle_monitor (MetaBackend *backend, + int device_id) +{ + return g_object_new (META_TYPE_IDLE_MONITOR_XSYNC, + "device-id", device_id, + NULL); +} + +static void +meta_backend_x11_class_init (MetaBackendX11Class *klass) +{ + MetaBackendClass *backend_class = META_BACKEND_CLASS (klass); + + backend_class->create_idle_monitor = meta_backend_x11_create_idle_monitor; +} + +static void +meta_backend_x11_init (MetaBackendX11 *x11) +{ +} + +void +meta_backend_x11_handle_alarm_notify (MetaBackend *backend, + XEvent *xevent) +{ + int i; + + if (!META_IS_BACKEND_X11 (backend)) + return; + + for (i = 0; i <= backend->device_id_max; i++) + if (backend->device_monitors[i]) + meta_idle_monitor_xsync_handle_xevent (backend->device_monitors[i], (XSyncAlarmNotifyEvent*)xevent); +} diff --git a/src/backends/x11/meta-backend-x11.h b/src/backends/x11/meta-backend-x11.h new file mode 100644 index 000000000..f670bde41 --- /dev/null +++ b/src/backends/x11/meta-backend-x11.h @@ -0,0 +1,57 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2014 Red Hat + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * Written by: + * Jasper St. Pierre + */ + +#ifndef META_BACKEND_X11_H +#define META_BACKEND_X11_H + +#include "backends/meta-backend-private.h" + +#include + +#define META_TYPE_BACKEND_X11 (meta_backend_x11_get_type ()) +#define META_BACKEND_X11(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_BACKEND_X11, MetaBackendX11)) +#define META_BACKEND_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_BACKEND_X11, MetaBackendX11Class)) +#define META_IS_BACKEND_X11(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_BACKEND_X11)) +#define META_IS_BACKEND_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_BACKEND_X11)) +#define META_BACKEND_X11_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_BACKEND_X11, MetaBackendX11Class)) + +typedef struct _MetaBackendX11 MetaBackendX11; +typedef struct _MetaBackendX11Class MetaBackendX11Class; + +struct _MetaBackendX11 +{ + MetaBackend parent; +}; + +struct _MetaBackendX11Class +{ + MetaBackendClass parent_class; +}; + +GType meta_backend_x11_get_type (void) G_GNUC_CONST; + +void meta_backend_x11_handle_alarm_notify (MetaBackend *backend, + XEvent *event); + +#endif /* META_BACKEND_X11_H */ diff --git a/src/core/events.c b/src/core/events.c index 34c84a039..5a70c6dfa 100644 --- a/src/core/events.c +++ b/src/core/events.c @@ -35,7 +35,7 @@ #include "bell.h" #include "workspace-private.h" #include "backends/meta-backend.h" -#include "backends/x11/meta-idle-monitor-xsync.h" +#include "backends/x11/meta-backend-x11.h" #include "backends/native/meta-idle-monitor-native.h" #include "x11/window-x11.h"