stage-window: Add :backend and :wrapper properties

All StageWindow implementation already have back pointers, but we need a
unified API to actually set them from the generic code path; we can use
properties on the StageWindow interface — though this requires fixing
all backends at the same time, to avoid GObject complaining.
This commit is contained in:
Emmanuele Bassi 2011-11-04 18:50:46 +00:00
parent f3c89e82b3
commit 9c038ebefb
5 changed files with 135 additions and 17 deletions

View File

@ -15,6 +15,25 @@ G_DEFINE_INTERFACE (ClutterStageWindow, clutter_stage_window, G_TYPE_OBJECT);
static void static void
clutter_stage_window_default_init (ClutterStageWindowInterface *iface) clutter_stage_window_default_init (ClutterStageWindowInterface *iface)
{ {
GParamSpec *pspec;
pspec = g_param_spec_object ("backend",
"Backend",
"Back pointer to the Backend instance",
CLUTTER_TYPE_BACKEND,
G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
g_object_interface_install_property (iface, pspec);
pspec = g_param_spec_object ("wrapper",
"Wrapper",
"Back pointer to the Stage actor",
CLUTTER_TYPE_STAGE,
G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
g_object_interface_install_property (iface, pspec);
} }
ClutterActor * ClutterActor *

View File

@ -565,19 +565,8 @@ _clutter_stage_cogl_class_init (ClutterStageCoglClass *klass)
gobject_class->set_property = clutter_stage_cogl_set_property; gobject_class->set_property = clutter_stage_cogl_set_property;
g_object_class_install_property (gobject_class, PROP_WRAPPER, g_object_class_override_property (gobject_class, PROP_WRAPPER, "wrapper");
g_param_spec_object ("wrapper", g_object_class_override_property (gobject_class, PROP_BACKEND, "backend");
"Wrapper",
"ClutterStage wrapping this native stage",
CLUTTER_TYPE_STAGE,
CLUTTER_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (gobject_class, PROP_BACKEND,
g_param_spec_object ("backend",
"ClutterBackend",
"The Clutter backend singleton",
CLUTTER_TYPE_BACKEND,
CLUTTER_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
} }
static void static void

View File

@ -32,6 +32,14 @@
#import <AppKit/AppKit.h> #import <AppKit/AppKit.h>
enum
{
PROP_0,
PROP_BACKEND,
PROP_WRAPPER
};
static void clutter_stage_window_iface_init (ClutterStageWindowIface *iface); static void clutter_stage_window_iface_init (ClutterStageWindowIface *iface);
#define clutter_stage_osx_get_type _clutter_stage_osx_get_type #define clutter_stage_osx_get_type _clutter_stage_osx_get_type
@ -608,15 +616,17 @@ _clutter_stage_osx_new (ClutterBackend *backend,
{ {
ClutterStageOSX *self; ClutterStageOSX *self;
self = g_object_new (CLUTTER_TYPE_STAGE_OSX, NULL); self = g_object_new (CLUTTER_TYPE_STAGE_OSX,
self->backend = backend; "backend", backend,
self->wrapper = wrapper; "wrapper", wrapper,
NULL);
self->isHiding = false; self->isHiding = false;
self->haveRealized = false; self->haveRealized = false;
self->view = NULL; self->view = NULL;
self->window = NULL; self->window = NULL;
return CLUTTER_STAGE_WINDOW(self); return CLUTTER_STAGE_WINDOW (self);
} }
/*************************************************************************/ /*************************************************************************/
@ -628,6 +638,30 @@ clutter_stage_osx_init (ClutterStageOSX *self)
self->acceptFocus = TRUE; self->acceptFocus = TRUE;
} }
static void
clutter_stage_osx_set_property (GObject *gobject,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
ClutterStageOSX *self = CLUTTER_STAGE_OSX (gobject);
switch (prop_id)
{
case PROP_BACKEND:
self->backend = g_value_get_object (value);
break;
case PROP_WRAPPER:
self->wrapper = g_value_get_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break;
}
}
static void static void
clutter_stage_osx_finalize (GObject *gobject) clutter_stage_osx_finalize (GObject *gobject)
{ {
@ -645,6 +679,10 @@ clutter_stage_osx_class_init (ClutterStageOSXClass *klass)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->set_property = clutter_stage_osx_set_property;
gobject_class->finalize = clutter_stage_osx_finalize; gobject_class->finalize = clutter_stage_osx_finalize;
gobject_class->dispose = clutter_stage_osx_dispose; gobject_class->dispose = clutter_stage_osx_dispose;
g_object_class_override_property (gobject_class, PROP_BACKEND, "backend");
g_object_class_override_property (gobject_class, PROP_WRAPPER, "wrapper");
} }

View File

@ -58,6 +58,14 @@ wayland_swap_buffers (ClutterStageWayland *stage_wayland);
static void clutter_stage_window_iface_init (ClutterStageWindowIface *iface); static void clutter_stage_window_iface_init (ClutterStageWindowIface *iface);
enum
{
PROP_0,
PROP_BACKEND,
PROP_WRAPPER
};
G_DEFINE_TYPE_WITH_CODE (ClutterStageWayland, G_DEFINE_TYPE_WITH_CODE (ClutterStageWayland,
_clutter_stage_wayland, _clutter_stage_wayland,
G_TYPE_OBJECT, G_TYPE_OBJECT,
@ -427,9 +435,38 @@ clutter_stage_window_iface_init (ClutterStageWindowIface *iface)
iface->ignoring_redraw_clips = clutter_stage_wayland_ignoring_redraw_clips; iface->ignoring_redraw_clips = clutter_stage_wayland_ignoring_redraw_clips;
} }
static void
clutter_stage_wayland_set_property (GObject *gobject,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
ClutterStageWayland *self = CLUTTER_STAGE_WAYLAND (gobject);
switch (prop_id)
{
case PROP_BACKEND:
self->backend = g_value_get_object (value);
break;
case PROP_WRAPPER:
self->wrapper = g_value_get_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
}
}
static void static void
_clutter_stage_wayland_class_init (ClutterStageWaylandClass *klass) _clutter_stage_wayland_class_init (ClutterStageWaylandClass *klass)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->set_property = clutter_stage_wayland_set_property;
g_object_class_override_property (gobject_class, PROP_BACKEND, "backend");
g_object_class_override_property (gobject_class, PROP_WRAPPER, "wrapper");
} }
static void static void

View File

@ -42,6 +42,14 @@
static void clutter_stage_window_iface_init (ClutterStageWindowIface *iface); static void clutter_stage_window_iface_init (ClutterStageWindowIface *iface);
enum
{
PROP_0,
PROP_BACKEND,
PROP_WRAPPER
};
G_DEFINE_TYPE_WITH_CODE (ClutterStageWin32, G_DEFINE_TYPE_WITH_CODE (ClutterStageWin32,
clutter_stage_win32, clutter_stage_win32,
G_TYPE_OBJECT, G_TYPE_OBJECT,
@ -544,6 +552,29 @@ clutter_stage_win32_get_active_framebuffer (ClutterStageWindow *stage_window)
return COGL_FRAMEBUFFER (stage_win32->onscreen); return COGL_FRAMEBUFFER (stage_win32->onscreen);
} }
static void
clutter_stage_win32_set_property (GObject *gobject,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
ClutterStageWin32 *self = CLUTTER_STAGE_WIN32 (gobject);
switch (prop_id)
{
case PROP_BACKEND:
self->backend = g_value_get_object (value);
break;
case PROP_WRAPPER:
self->wrapper = g_value_get_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
}
}
static void static void
clutter_stage_win32_dispose (GObject *gobject) clutter_stage_win32_dispose (GObject *gobject)
{ {
@ -569,7 +600,11 @@ clutter_stage_win32_class_init (ClutterStageWin32Class *klass)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->set_property = clutter_stage_win32_set_property;
gobject_class->dispose = clutter_stage_win32_dispose; gobject_class->dispose = clutter_stage_win32_dispose;
g_object_class_override_property (gobject_class, PROP_BACKEND, "backend");
g_object_class_override_property (gobject_class, PROP_WRAPPER, "wrapper");
} }
static void static void