2007-05-31 Matthew Allum <mallum@openedhand.com>

* clutter/glx/clutter-backend-glx.c:
        * clutter/glx/clutter-backend-glx.h:
        * clutter/glx/clutter-event-glx.c:
        * clutter/glx/clutter-glx.h:
        * clutter/glx/clutter-stage-glx.c:
        * clutter/glx/clutter-stage-glx.h:
        Change type nameing from Glx -> GLX.
        Add basic event filtering functionality
This commit is contained in:
Matthew Allum 2007-05-31 11:13:43 +00:00
parent 7ada1c0ae0
commit a0c1a9b66d
7 changed files with 180 additions and 50 deletions

View File

@ -1,3 +1,15 @@
2007-05-31 Matthew Allum <mallum@openedhand.com>
* clutter/glx/clutter-backend-glx.c:
* clutter/glx/clutter-backend-glx.h:
* clutter/glx/clutter-event-glx.c:
* clutter/glx/clutter-glx.h:
* clutter/glx/clutter-stage-glx.c:
* clutter/glx/clutter-stage-glx.h:
Change type nameing from Glx -> GLX.
Add basic event filtering functionality
2007-05-31 Tomas Frydrych <tf@openedhand.com>
* clutter/clutter-behaviour-ellipse.c:

View File

@ -50,12 +50,12 @@
#include "cogl.h"
G_DEFINE_TYPE (ClutterBackendGlx, clutter_backend_glx, CLUTTER_TYPE_BACKEND);
G_DEFINE_TYPE (ClutterBackendGLX, clutter_backend_glx, CLUTTER_TYPE_BACKEND);
typedef CoglFuncPtr (*GLXGetProcAddressProc) (const guint8 *procName);
/* singleton object */
static ClutterBackendGlx *backend_singleton = NULL;
static ClutterBackendGLX *backend_singleton = NULL;
/* options */
static gchar *clutter_display_name = NULL;
@ -145,7 +145,7 @@ static gboolean
clutter_backend_glx_post_parse (ClutterBackend *backend,
GError **error)
{
ClutterBackendGlx *backend_glx = CLUTTER_BACKEND_GLX (backend);
ClutterBackendGLX *backend_glx = CLUTTER_BACKEND_GLX (backend);
if (clutter_display_name)
{
@ -221,11 +221,11 @@ static gboolean
clutter_backend_glx_init_stage (ClutterBackend *backend,
GError **error)
{
ClutterBackendGlx *backend_glx = CLUTTER_BACKEND_GLX (backend);
ClutterBackendGLX *backend_glx = CLUTTER_BACKEND_GLX (backend);
if (!backend_glx->stage)
{
ClutterStageGlx *stage_glx;
ClutterStageGLX *stage_glx;
ClutterActor *stage;
stage = g_object_new (CLUTTER_TYPE_STAGE_GLX, NULL);
@ -270,7 +270,7 @@ clutter_backend_glx_init_events (ClutterBackend *backend)
static ClutterActor*
clutter_backend_glx_get_stage (ClutterBackend *backend)
{
ClutterBackendGlx *backend_glx = CLUTTER_BACKEND_GLX (backend);
ClutterBackendGLX *backend_glx = CLUTTER_BACKEND_GLX (backend);
return backend_glx->stage;
}
@ -307,7 +307,7 @@ clutter_backend_glx_add_options (ClutterBackend *backend,
static void
clutter_backend_glx_finalize (GObject *gobject)
{
ClutterBackendGlx *backend_glx = CLUTTER_BACKEND_GLX (gobject);
ClutterBackendGLX *backend_glx = CLUTTER_BACKEND_GLX (gobject);
g_free (backend_glx->display_name);
@ -322,7 +322,7 @@ clutter_backend_glx_finalize (GObject *gobject)
static void
clutter_backend_glx_dispose (GObject *gobject)
{
ClutterBackendGlx *backend_glx = CLUTTER_BACKEND_GLX (gobject);
ClutterBackendGLX *backend_glx = CLUTTER_BACKEND_GLX (gobject);
_clutter_backend_glx_events_uninit (CLUTTER_BACKEND(backend_glx));
@ -409,7 +409,7 @@ get_proc_address (const gchar* name)
static ClutterFeatureFlags
clutter_backend_glx_get_features (ClutterBackend *backend)
{
ClutterBackendGlx *backend_glx = CLUTTER_BACKEND_GLX (backend);
ClutterBackendGLX *backend_glx = CLUTTER_BACKEND_GLX (backend);
const gchar *glx_extensions = NULL;
ClutterFeatureFlags flags = 0;
@ -471,8 +471,8 @@ clutter_backend_glx_get_features (ClutterBackend *backend)
static void
clutter_backend_glx_redraw (ClutterBackend *backend)
{
ClutterBackendGlx *backend_glx = CLUTTER_BACKEND_GLX (backend);
ClutterStageGlx *stage_glx;
ClutterBackendGLX *backend_glx = CLUTTER_BACKEND_GLX (backend);
ClutterStageGLX *stage_glx;
stage_glx = CLUTTER_STAGE_GLX(backend_glx->stage);
@ -496,7 +496,7 @@ clutter_backend_glx_redraw (ClutterBackend *backend)
}
static void
clutter_backend_glx_class_init (ClutterBackendGlxClass *klass)
clutter_backend_glx_class_init (ClutterBackendGLXClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
ClutterBackendClass *backend_class = CLUTTER_BACKEND_CLASS (klass);
@ -516,7 +516,7 @@ clutter_backend_glx_class_init (ClutterBackendGlxClass *klass)
}
static void
clutter_backend_glx_init (ClutterBackendGlx *backend_glx)
clutter_backend_glx_init (ClutterBackendGLX *backend_glx)
{
ClutterBackend *backend = CLUTTER_BACKEND (backend_glx);
@ -541,7 +541,7 @@ error_handler(Display *xdpy,
}
void
clutter_backend_glx_wait_for_vblank (ClutterBackendGlx *backend_glx)
clutter_backend_glx_wait_for_vblank (ClutterBackendGLX *backend_glx)
{
switch (backend_glx->vblank_type)
{
@ -665,3 +665,73 @@ clutter_glx_get_root_window (void)
return backend_singleton->xwin_root;
}
/**
* clutter_glx_add_filter:
*
* FIXME
*
* Return value: FIXME
*
* Since: 0.4
*/
void
clutter_glx_add_filter (ClutterGLXFilterFunc func, gpointer data)
{
ClutterGLXEventFilter *filter;
g_return_if_fail (func != NULL);
if (!backend_singleton)
{
g_critical ("GLX backend has not been initialised");
return;
}
filter = g_new0(ClutterGLXEventFilter, 1);
filter->func = func;
filter->data = data;
backend_singleton->event_filters
= g_slist_append (backend_singleton->event_filters, filter);
return;
}
/**
* clutter_glx_remove_filter:
*
* FIXME
*
* Return value: FIXME
*
* Since: 0.4
*/
void
clutter_glx_remove_filter (ClutterGLXFilterFunc func, gpointer data)
{
GSList *tmp_list, *this;
ClutterGLXEventFilter *filter;
g_return_if_fail (func == NULL);
tmp_list = backend_singleton->event_filters;
while (tmp_list)
{
filter = (ClutterGLXEventFilter *)tmp_list->data;
this = tmp_list;
tmp_list = tmp_list->next;
if (filter->func == func && filter->data == data)
{
backend_singleton->event_filters
= g_slist_remove_link (backend_singleton->event_filters, this);
g_slist_free_1 (this);
g_free (filter);
return;
}
}
}

View File

@ -30,17 +30,19 @@
#include <GL/glx.h>
#include <GL/gl.h>
#include "clutter-glx.h"
G_BEGIN_DECLS
#define CLUTTER_TYPE_BACKEND_GLX (clutter_backend_glx_get_type ())
#define CLUTTER_BACKEND_GLX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_BACKEND_GLX, ClutterBackendGlx))
#define CLUTTER_BACKEND_GLX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_BACKEND_GLX, ClutterBackendGLX))
#define CLUTTER_IS_BACKEND_GLX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_BACKEND_GLX))
#define CLUTTER_BACKEND_GLX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_BACKEND_GLX, ClutterBackendGlxClass))
#define CLUTTER_BACKEND_GLX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_BACKEND_GLX, ClutterBackendGLXClass))
#define CLUTTER_IS_BACKEND_GLX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_BACKEND_GLX))
#define CLUTTER_BACKEND_GLX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_BACKEND_GLX, ClutterBackendGlxClass))
#define CLUTTER_BACKEND_GLX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_BACKEND_GLX, ClutterBackendGLXClass))
typedef struct _ClutterBackendGlx ClutterBackendGlx;
typedef struct _ClutterBackendGlxClass ClutterBackendGlxClass;
typedef struct _ClutterBackendGLX ClutterBackendGLX;
typedef struct _ClutterBackendGLXClass ClutterBackendGLXClass;
typedef enum ClutterGLXVBlankType
{
@ -55,7 +57,14 @@ typedef int (*WaitVideoSyncProc) (int divisor,
int remainder,
unsigned int *count);
struct _ClutterBackendGlx
typedef struct _ClutterGLXEventFilter
{
ClutterGLXFilterFunc func;
gpointer data;
} ClutterGLXEventFilter;
struct _ClutterBackendGLX
{
ClutterBackend parent_instance;
@ -70,6 +79,7 @@ struct _ClutterBackendGlx
/* event source */
GSource *event_source;
GSList *event_filters;
/* Vblank stuff */
GetVideoSyncProc get_video_sync;
@ -78,7 +88,7 @@ struct _ClutterBackendGlx
ClutterGLXVBlankType vblank_type;
};
struct _ClutterBackendGlxClass
struct _ClutterBackendGLXClass
{
ClutterBackendClass parent_class;
};
@ -86,7 +96,7 @@ struct _ClutterBackendGlxClass
void _clutter_backend_glx_events_init (ClutterBackend *backend);
void _clutter_backend_glx_events_uninit (ClutterBackend *backend);
void clutter_backend_glx_wait_for_vblank (ClutterBackendGlx *backend_glx);
void clutter_backend_glx_wait_for_vblank (ClutterBackendGLX *backend_glx);
GType clutter_backend_glx_get_type (void) G_GNUC_CONST;

View File

@ -167,7 +167,7 @@ _clutter_backend_glx_events_init (ClutterBackend *backend)
{
GSource *source;
ClutterEventSource *event_source;
ClutterBackendGlx *backend_glx = CLUTTER_BACKEND_GLX (backend);
ClutterBackendGLX *backend_glx = CLUTTER_BACKEND_GLX (backend);
int connection_number;
connection_number = ConnectionNumber (backend_glx->xdpy);
@ -197,7 +197,7 @@ _clutter_backend_glx_events_init (ClutterBackend *backend)
void
_clutter_backend_glx_events_uninit (ClutterBackend *backend)
{
ClutterBackendGlx *backend_glx = CLUTTER_BACKEND_GLX (backend);
ClutterBackendGLX *backend_glx = CLUTTER_BACKEND_GLX (backend);
if (backend_glx->event_source)
{
@ -250,7 +250,7 @@ translate_key_event (ClutterBackend *backend,
}
static gboolean
handle_wm_protocols_event (ClutterBackendGlx *backend_glx,
handle_wm_protocols_event (ClutterBackendGLX *backend_glx,
XEvent *xevent)
{
Atom atom = (Atom) xevent->xclient.data.l[0];
@ -301,7 +301,7 @@ handle_wm_protocols_event (ClutterBackendGlx *backend_glx,
}
static gboolean
handle_xembed_event (ClutterBackendGlx *backend_glx,
handle_xembed_event (ClutterBackendGLX *backend_glx,
XEvent *xevent)
{
ClutterActor *stage;
@ -350,7 +350,7 @@ event_translate (ClutterBackend *backend,
ClutterEvent *event,
XEvent *xevent)
{
ClutterBackendGlx *backend_glx;
ClutterBackendGLX *backend_glx;
ClutterStage *stage;
gboolean res;
Window xwindow, stage_xwindow;
@ -363,6 +363,32 @@ event_translate (ClutterBackend *backend,
if (xwindow == None)
xwindow = stage_xwindow;
if (backend_glx->event_filters)
{
GSList *node;
ClutterGLXEventFilter *filter;
node = backend_glx->event_filters;
while (node)
{
filter = (ClutterGLXEventFilter *)node->data;
switch (filter->func(xevent, event, filter->data))
{
case CLUTTER_GLX_FILTER_CONTINUE:
break;
case CLUTTER_GLX_FILTER_TRANSLATE:
return TRUE;
case CLUTTER_GLX_FILTER_REMOVE:
return FALSE;
default:
break;
}
node = node->next;
}
}
res = TRUE;
switch (xevent->type)
@ -486,7 +512,7 @@ event_translate (ClutterBackend *backend,
static void
events_queue (ClutterBackend *backend)
{
ClutterBackendGlx *backend_glx = CLUTTER_BACKEND_GLX (backend);
ClutterBackendGLX *backend_glx = CLUTTER_BACKEND_GLX (backend);
ClutterEvent *event;
Display *xdisplay = backend_glx->xdpy;
XEvent xevent;

View File

@ -33,6 +33,18 @@
G_BEGIN_DECLS
typedef enum {
CLUTTER_GLX_FILTER_CONTINUE, /* Event not handled, continue processesing */
CLUTTER_GLX_FILTER_TRANSLATE, /* Native event translated into a Clutter
event and stored in the "event" structure
that was passed in */
CLUTTER_GLX_FILTER_REMOVE /* Terminate processing, removing event */
} ClutterGLXFilterReturn;
typedef ClutterGLXFilterReturn (*ClutterGLXFilterFunc) (XEvent *xev,
ClutterEvent *cev,
gpointer *data);
void clutter_glx_trap_x_errors (void);
gint clutter_glx_untrap_x_errors (void);

View File

@ -48,12 +48,12 @@
#include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
G_DEFINE_TYPE (ClutterStageGlx, clutter_stage_glx, CLUTTER_TYPE_STAGE);
G_DEFINE_TYPE (ClutterStageGLX, clutter_stage_glx, CLUTTER_TYPE_STAGE);
static void
clutter_stage_glx_show (ClutterActor *actor)
{
ClutterStageGlx *stage_glx = CLUTTER_STAGE_GLX (actor);
ClutterStageGLX *stage_glx = CLUTTER_STAGE_GLX (actor);
if (stage_glx->xwin)
XMapWindow (stage_glx->xdpy, stage_glx->xwin);
@ -62,7 +62,7 @@ clutter_stage_glx_show (ClutterActor *actor)
static void
clutter_stage_glx_hide (ClutterActor *actor)
{
ClutterStageGlx *stage_glx = CLUTTER_STAGE_GLX (actor);
ClutterStageGLX *stage_glx = CLUTTER_STAGE_GLX (actor);
if (stage_glx->xwin)
XUnmapWindow (stage_glx->xdpy, stage_glx->xwin);
@ -71,7 +71,7 @@ clutter_stage_glx_hide (ClutterActor *actor)
static void
clutter_stage_glx_unrealize (ClutterActor *actor)
{
ClutterStageGlx *stage_glx = CLUTTER_STAGE_GLX (actor);
ClutterStageGLX *stage_glx = CLUTTER_STAGE_GLX (actor);
gboolean was_offscreen;
CLUTTER_MARK();
@ -127,7 +127,7 @@ set_wm_protocols (Display *xdisplay,
static void
clutter_stage_glx_realize (ClutterActor *actor)
{
ClutterStageGlx *stage_glx = CLUTTER_STAGE_GLX (actor);
ClutterStageGLX *stage_glx = CLUTTER_STAGE_GLX (actor);
gboolean is_offscreen;
CLUTTER_NOTE (MISC, "Realizing main stage");
@ -309,7 +309,7 @@ static void
clutter_stage_glx_allocate_coords (ClutterActor *self,
ClutterActorBox *box)
{
ClutterStageGlx *stage_glx = CLUTTER_STAGE_GLX (self);
ClutterStageGLX *stage_glx = CLUTTER_STAGE_GLX (self);
box->x1 = box->y1 = 0;
box->x2 = box->x1 + CLUTTER_UNITS_FROM_INT (stage_glx->xwin_width);
@ -320,7 +320,7 @@ static void
clutter_stage_glx_request_coords (ClutterActor *self,
ClutterActorBox *box)
{
ClutterStageGlx *stage_glx = CLUTTER_STAGE_GLX (self);
ClutterStageGLX *stage_glx = CLUTTER_STAGE_GLX (self);
gint new_width, new_height;
new_width = ABS (CLUTTER_UNITS_TO_INT (box->x2 - box->x1));
@ -359,7 +359,7 @@ static void
clutter_stage_glx_set_fullscreen (ClutterStage *stage,
gboolean fullscreen)
{
ClutterStageGlx *stage_glx = CLUTTER_STAGE_GLX (stage);
ClutterStageGLX *stage_glx = CLUTTER_STAGE_GLX (stage);
Atom atom_WM_STATE, atom_WM_STATE_FULLSCREEN;
atom_WM_STATE = XInternAtom (stage_glx->xdpy, "_NET_WM_STATE", False);
@ -396,7 +396,7 @@ static void
clutter_stage_glx_set_cursor_visible (ClutterStage *stage,
gboolean show_cursor)
{
ClutterStageGlx *stage_glx = CLUTTER_STAGE_GLX (stage);
ClutterStageGLX *stage_glx = CLUTTER_STAGE_GLX (stage);
if (stage_glx->xwin == None)
return;
@ -459,7 +459,7 @@ clutter_stage_glx_draw_to_pixbuf (ClutterStage *stage,
guchar *data;
GdkPixbuf *pixb;
ClutterActor *actor;
ClutterStageGlx *stage_glx;
ClutterStageGLX *stage_glx;
gboolean is_offscreen = FALSE;
stage_glx = CLUTTER_STAGE_GLX (stage);
@ -513,7 +513,7 @@ clutter_stage_glx_draw_to_pixbuf (ClutterStage *stage,
static void
clutter_stage_glx_dispose (GObject *gobject)
{
ClutterStageGlx *stage_glx = CLUTTER_STAGE_GLX (gobject);
ClutterStageGLX *stage_glx = CLUTTER_STAGE_GLX (gobject);
if (stage_glx->xwin)
clutter_actor_unrealize (CLUTTER_ACTOR (stage_glx));
@ -522,7 +522,7 @@ clutter_stage_glx_dispose (GObject *gobject)
}
static void
clutter_stage_glx_class_init (ClutterStageGlxClass *klass)
clutter_stage_glx_class_init (ClutterStageGLXClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
@ -544,7 +544,7 @@ clutter_stage_glx_class_init (ClutterStageGlxClass *klass)
}
static void
clutter_stage_glx_init (ClutterStageGlx *stage)
clutter_stage_glx_init (ClutterStageGLX *stage)
{
stage->xdpy = NULL;
stage->xwin_root = None;
@ -611,7 +611,7 @@ gboolean
clutter_glx_set_stage_foreign (ClutterStage *stage,
Window xwindow)
{
ClutterStageGlx *stage_glx;
ClutterStageGLX *stage_glx;
ClutterActor *actor;
gint x, y;
guint width, height, border, depth;

View File

@ -34,16 +34,16 @@
G_BEGIN_DECLS
#define CLUTTER_TYPE_STAGE_GLX (clutter_stage_glx_get_type ())
#define CLUTTER_STAGE_GLX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_STAGE_GLX, ClutterStageGlx))
#define CLUTTER_STAGE_GLX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_STAGE_GLX, ClutterStageGLX))
#define CLUTTER_IS_STAGE_GLX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_STAGE_GLX))
#define CLUTTER_STAGE_GLX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_STAGE_GLX, ClutterStageGlxClass))
#define CLUTTER_STAGE_GLX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_STAGE_GLX, ClutterStageGLXClass))
#define CLUTTER_IS_STAGE_GLX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_STAGE_GLX))
#define CLUTTER_STAGE_GLX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_STAGE_GLX, ClutterStageGlxClass))
#define CLUTTER_STAGE_GLX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_STAGE_GLX, ClutterStageGLXClass))
typedef struct _ClutterStageGlx ClutterStageGlx;
typedef struct _ClutterStageGlxClass ClutterStageGlxClass;
typedef struct _ClutterStageGLX ClutterStageGLX;
typedef struct _ClutterStageGLXClass ClutterStageGLXClass;
struct _ClutterStageGlx
struct _ClutterStageGLX
{
ClutterStage parent_instance;
@ -63,11 +63,11 @@ struct _ClutterStageGlx
guint is_foreign_xwin : 1;
ClutterBackendGlx *backend;
ClutterBackendGLX *backend;
};
struct _ClutterStageGlxClass
struct _ClutterStageGLXClass
{
ClutterStageClass parent_class;
};