1
0
Fork 0

backends: Build MetaBackend subclasses for each backend

This commit is contained in:
Jasper St. Pierre 2014-04-21 19:13:04 -04:00
parent 00ea9bf14b
commit 31d744195d
9 changed files with 260 additions and 42 deletions

View file

@ -70,12 +70,16 @@ libmutter_la_SOURCES = \
backends/meta-monitor-manager-dummy.h \ backends/meta-monitor-manager-dummy.h \
backends/edid-parse.c \ backends/edid-parse.c \
backends/edid.h \ 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.c \
backends/native/meta-idle-monitor-native.h \ backends/native/meta-idle-monitor-native.h \
backends/native/meta-monitor-manager-kms.c \ backends/native/meta-monitor-manager-kms.c \
backends/native/meta-monitor-manager-kms.h \ backends/native/meta-monitor-manager-kms.h \
backends/native/meta-weston-launch.c \ backends/native/meta-weston-launch.c \
backends/native/meta-weston-launch.h \ 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.c \
backends/x11/meta-idle-monitor-xsync.h \ backends/x11/meta-idle-monitor-xsync.h \
backends/x11/meta-monitor-manager-xrandr.c \ backends/x11/meta-monitor-manager-xrandr.c \

View file

@ -48,6 +48,9 @@ struct _MetaBackend
struct _MetaBackendClass struct _MetaBackendClass
{ {
GObjectClass parent_class; GObjectClass parent_class;
MetaIdleMonitor * (* create_idle_monitor) (MetaBackend *backend,
int device_id);
}; };
#endif /* META_BACKEND_PRIVATE_H */ #endif /* META_BACKEND_PRIVATE_H */

View file

@ -32,12 +32,12 @@
#include <clutter/clutter.h> #include <clutter/clutter.h>
#include <clutter/x11/clutter-x11.h> #include <clutter/x11/clutter-x11.h>
#include "backends/x11/meta-backend-x11.h"
#include "backends/native/meta-backend-native.h"
#include "backends/native/meta-weston-launch.h" #include "backends/native/meta-weston-launch.h"
#include <meta/util.h> #include <meta/util.h>
#include "backends/x11/meta-idle-monitor-xsync.h"
#include "backends/native/meta-idle-monitor-native.h"
static MetaBackend *_backend; static MetaBackend *_backend;
MetaBackend * MetaBackend *
@ -46,7 +46,7 @@ meta_get_backend (void)
return _backend; return _backend;
} }
G_DEFINE_TYPE (MetaBackend, meta_backend, G_TYPE_OBJECT); G_DEFINE_ABSTRACT_TYPE (MetaBackend, meta_backend, G_TYPE_OBJECT);
static void static void
meta_backend_finalize (GObject *object) meta_backend_finalize (GObject *object)
@ -77,17 +77,6 @@ meta_backend_init (MetaBackend *backend)
_backend = 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 */ /* FIXME -- destroy device monitors at some point */
G_GNUC_UNUSED static void G_GNUC_UNUSED static void
destroy_device_monitor (MetaBackend *backend, destroy_device_monitor (MetaBackend *backend,
@ -98,6 +87,13 @@ destroy_device_monitor (MetaBackend *backend,
backend->device_id_max--; 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 * MetaIdleMonitor *
meta_backend_get_idle_monitor (MetaBackend *backend, meta_backend_get_idle_monitor (MetaBackend *backend,
int device_id) int device_id)
@ -106,37 +102,27 @@ meta_backend_get_idle_monitor (MetaBackend *backend,
if (!backend->device_monitors[device_id]) if (!backend->device_monitors[device_id])
{ {
backend->device_monitors[device_id] = g_object_new (get_idle_monitor_type (), backend->device_monitors[device_id] = meta_backend_create_idle_monitor (backend, device_id);
"device-id", device_id,
NULL);
backend->device_id_max = MAX (backend->device_id_max, device_id); backend->device_id_max = MAX (backend->device_id_max, device_id);
} }
return backend->device_monitors[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 static GType
get_backend_type (void) 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 static void

View file

@ -27,7 +27,6 @@
#include <glib-object.h> #include <glib-object.h>
#include <X11/Xlib.h>
#include <meta/meta-idle-monitor.h> #include <meta/meta-idle-monitor.h>
typedef struct _MetaBackend MetaBackend; typedef struct _MetaBackend MetaBackend;
@ -40,9 +39,6 @@ MetaBackend * meta_get_backend (void);
MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend *backend, MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend *backend,
int device_id); int device_id);
void meta_backend_x11_handle_alarm_notify (MetaBackend *backend,
XEvent *event);
void meta_clutter_init (void); void meta_clutter_init (void);
gboolean meta_activate_vt (int vt, GError **error); gboolean meta_activate_vt (int vt, GError **error);

View file

@ -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 <jstpierre@mecheye.net>
*/
#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)
{
}

View file

@ -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 <jstpierre@mecheye.net>
*/
#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 */

View file

@ -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 <jstpierre@mecheye.net>
*/
#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);
}

View file

@ -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 <jstpierre@mecheye.net>
*/
#ifndef META_BACKEND_X11_H
#define META_BACKEND_X11_H
#include "backends/meta-backend-private.h"
#include <X11/Xlib.h>
#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 */

View file

@ -35,7 +35,7 @@
#include "bell.h" #include "bell.h"
#include "workspace-private.h" #include "workspace-private.h"
#include "backends/meta-backend.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 "backends/native/meta-idle-monitor-native.h"
#include "x11/window-x11.h" #include "x11/window-x11.h"