OSX: add multistage support

Bug #911 - OSX: add multistage support

	* clutter/osx/clutter-backend-osx.{c,h}
	(clutter_backend_osx_init_stage, clutter_backend_osx_get_stage,
	clutter_backend_osx_redraw, clutter_backend_osx_create_stage,
	clutter_backend_osx_ensure_context, clutter_backend_osx_class_init,
	clutter_backend_osx_dispose, ClutterGLView:drawRect:):
	* clutter/osx/clutter-stage-osx.{c,h} (clutter_stage_osx_realize,
	ClutterGLWindow:setFrameSize:):
	Adapt to new multistage backend API. Don't keep a pointer to
	default stage. Derive from ClutterActor instead of ClutterStage.
	Implement ClutterStageWindow interface. Paint, resize and
	otherwise manipulate the wrapper rather than self when necessary.

	(clutter_backend_post_parse): Create our singleton GL context
	here. We could probably create the context when the default
	stage is created, but I think this is more clean.

	* clutter/osx/clutter-event-osx.c (clutter_event_osx_translate)
	* clutter/osx/clutter-stage-osx.c (clutter_stage_osx_state_update,
	ClutterGLWindow:windowShouldClose:):
	* clutter/osx/clutter-stage-osx.h: Export ClutterGLWindow interface
	for clutter-event-osx.c to easily get the stage for NSWindow.
	Fill in ClutterEventAny::stage on our events.

	Consistently use 'stage_osx' and 'wrapper' as variable names
	when referring to ClutterStageOSX and ClutterStage objects
	respectively.
This commit is contained in:
Tommi Komulainen
2008-06-05 21:27:58 +00:00
parent cba23c0b26
commit b8e8a80a40
6 changed files with 196 additions and 132 deletions

View File

@ -1,7 +1,7 @@
/* Clutter - An OpenGL based 'interactive canvas' library.
* OSX backend - event loops integration
*
* Copyright (C) 2007 Tommi Komulainen <tommi.komulainen@iki.fi>
* Copyright (C) 2007-2008 Tommi Komulainen <tommi.komulainen@iki.fi>
* Copyright (C) 2007 OpenedHand Ltd.
*
* This library is free software; you can redistribute it and/or
@ -22,6 +22,7 @@
#include "config.h"
#include "clutter-osx.h"
#include "clutter-stage-osx.h"
#import <AppKit/AppKit.h>
#include <glib/gmain.h>
@ -37,6 +38,7 @@ static GPollFunc old_poll_func = NULL;
/*************************************************************************/
@interface NSEvent (Clutter)
- (ClutterStage*)clutterStage;
- (gint)clutterTime;
- (gint)clutterButton;
- (void)clutterX:(gint*)ptrX y:(gint*)ptrY;
@ -45,6 +47,16 @@ static GPollFunc old_poll_func = NULL;
@end
@implementation NSEvent (Clutter)
- (ClutterStage*)clutterStage
{
ClutterGLWindow *w = (ClutterGLWindow*)[self window];
if (![w isKindOfClass:[ClutterGLWindow class]])
return NULL;
ClutterStageOSX *stage_osx = w->stage_osx;
return stage_osx->wrapper;
}
- (gint)clutterTime
{
return [self timestamp] * 1000;
@ -160,6 +172,7 @@ static GPollFunc old_poll_func = NULL;
static gboolean
clutter_event_osx_translate (NSEvent *nsevent, ClutterEvent *event)
{
event->any.stage = [nsevent clutterStage];
event->any.time = [nsevent clutterTime];
switch ([nsevent type])