diff --git a/ChangeLog b/ChangeLog index 6c9f4b6c7..132af4c3c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2007-05-31 Matthew Allum + + + * 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 * clutter/clutter-behaviour-ellipse.c: diff --git a/clutter/glx/clutter-backend-glx.c b/clutter/glx/clutter-backend-glx.c index be2bdef57..9304a46b5 100644 --- a/clutter/glx/clutter-backend-glx.c +++ b/clutter/glx/clutter-backend-glx.c @@ -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; + } + } +} diff --git a/clutter/glx/clutter-backend-glx.h b/clutter/glx/clutter-backend-glx.h index 707dc8791..c7c262ada 100644 --- a/clutter/glx/clutter-backend-glx.h +++ b/clutter/glx/clutter-backend-glx.h @@ -30,17 +30,19 @@ #include #include +#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; diff --git a/clutter/glx/clutter-event-glx.c b/clutter/glx/clutter-event-glx.c index 088c9f2d2..49db3ec3a 100644 --- a/clutter/glx/clutter-event-glx.c +++ b/clutter/glx/clutter-event-glx.c @@ -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; diff --git a/clutter/glx/clutter-glx.h b/clutter/glx/clutter-glx.h index a6e983d91..4380c85f8 100644 --- a/clutter/glx/clutter-glx.h +++ b/clutter/glx/clutter-glx.h @@ -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); diff --git a/clutter/glx/clutter-stage-glx.c b/clutter/glx/clutter-stage-glx.c index ee7cbce81..35382f1a9 100644 --- a/clutter/glx/clutter-stage-glx.c +++ b/clutter/glx/clutter-stage-glx.c @@ -48,12 +48,12 @@ #include -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; diff --git a/clutter/glx/clutter-stage-glx.h b/clutter/glx/clutter-stage-glx.h index 490e96929..9ff59490b 100644 --- a/clutter/glx/clutter-stage-glx.h +++ b/clutter/glx/clutter-stage-glx.h @@ -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; };