]> Pileus Git - grits/commitdiff
Add mouse, keyboard, and motion events to GritsObject
authorAndy Spencer <andy753421@gmail.com>
Sat, 15 Oct 2011 06:20:43 +0000 (06:20 +0000)
committerAndy Spencer <andy753421@gmail.com>
Sat, 15 Oct 2011 06:20:43 +0000 (06:20 +0000)
These work by chaining the event from GritsOpenGL up to each individual
object, which then emits the callback if it is currently selected
(moused over).

src/grits-opengl.c
src/objects/grits-object.c
src/objects/grits-object.h

index 423c849dba2fa53f568c0672db4c6213add4a86a..5e2590bf164ea2d52bef8bb0837b0556ecb5500d 100644 (file)
@@ -299,6 +299,12 @@ static gboolean on_key_press(GritsOpenGL *opengl, GdkEventKey *event, gpointer _
        return FALSE;
 }
 
+static gboolean on_chained_event(GritsOpenGL *opengl, GdkEvent *event, gpointer _)
+{
+       _foreach_object(opengl, (GFunc)grits_object_event, event);
+       return FALSE;
+}
+
 static gboolean _update_errors_cb(gpointer _opengl)
 {
        GritsOpenGL *opengl = _opengl;
@@ -349,6 +355,12 @@ static void on_realize(GritsOpenGL *opengl, gpointer _)
        g_signal_connect(opengl, "rotation-changed", G_CALLBACK(on_view_changed), NULL);
 
        g_signal_connect(opengl, "motion-notify-event", G_CALLBACK(on_motion_notify), NULL);
+       g_signal_connect_after(opengl, "key-press-event",      G_CALLBACK(on_chained_event), NULL);
+       g_signal_connect_after(opengl, "key-release-event",    G_CALLBACK(on_chained_event), NULL);
+       g_signal_connect_after(opengl, "button-press-event",   G_CALLBACK(on_chained_event), NULL);
+       g_signal_connect_after(opengl, "button-release-event", G_CALLBACK(on_chained_event), NULL);
+       g_signal_connect_after(opengl, "motion-notify-event",  G_CALLBACK(on_chained_event), NULL);
+
 #ifndef ROAM_DEBUG
        opengl->sm_source[0] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE+30, 33,  (GSourceFunc)on_idle, opengl, NULL);
        opengl->sm_source[1] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE+10, 500, (GSourceFunc)on_idle, opengl, NULL);
index 6abc4eb26f3ba70b3ff25a945f2af5918cd38d44..5eb15d96c19b31eadebf9fb0e3c037aed00c870a 100644 (file)
 enum {
        SIG_ENTER,
        SIG_LEAVE,
+       SIG_BUTTON_PRESS,
+       SIG_BUTTON_RELEASE,
+       SIG_KEY_PRESS,
+       SIG_KEY_RELEASE,
+       SIG_MOTION,
        NUM_SIGNALS,
 };
 static guint signals[NUM_SIGNALS];
@@ -185,6 +190,25 @@ void grits_object_pick_end(GritsObject *object)
        }
 }
 
+void grits_object_event(GritsObject *object, GdkEvent *event)
+{
+       const int map[GDK_EVENT_LAST] = {
+               [GDK_BUTTON_PRESS  ] SIG_BUTTON_PRESS,
+               [GDK_2BUTTON_PRESS ] SIG_BUTTON_PRESS,
+               [GDK_3BUTTON_PRESS ] SIG_BUTTON_PRESS,
+               [GDK_BUTTON_RELEASE] SIG_BUTTON_RELEASE,
+               [GDK_KEY_PRESS     ] SIG_KEY_PRESS,
+               [GDK_KEY_RELEASE   ] SIG_KEY_RELEASE,
+               [GDK_MOTION_NOTIFY ] SIG_MOTION,
+       };
+       if (!object->state.selected)
+               return;
+       guint sig = signals[map[event->type]];
+       if (!g_signal_has_handler_pending(object, sig, 0, FALSE))
+               return;
+       g_signal_emit(object, sig, 0, event);
+}
+
 /* GObject stuff */
 G_DEFINE_ABSTRACT_TYPE(GritsObject, grits_object, G_TYPE_OBJECT);
 static void grits_object_init(GritsObject *object)
@@ -232,4 +256,101 @@ static void grits_object_class_init(GritsObjectClass *klass)
                        g_cclosure_marshal_VOID__VOID,
                        G_TYPE_NONE,
                        0);
+
+       /**
+        * GritsViewer::button-press:
+        * @object: the object.
+        * @event:  the GdkEventButton which triggered this signal
+        *
+        * The ::button-press signal is emitted when a button (typically from a
+        * mouse) is pressed.
+        */
+       signals[SIG_BUTTON_PRESS] = g_signal_new(
+                       "button-press",
+                       G_TYPE_FROM_CLASS(gobject_class),
+                       G_SIGNAL_RUN_LAST,
+                       0,
+                       NULL,
+                       NULL,
+                       g_cclosure_marshal_VOID__POINTER,
+                       G_TYPE_NONE,
+                       1,
+                       G_TYPE_POINTER);
+
+       /**
+        * GritsViewer::button-release:
+        * @object: the object.
+        * @event:  the GdkEventButton which triggered this signal
+        *
+        * The ::button-release signal is emitted when a button (typically from
+        * a mouse) is released.
+        */
+       signals[SIG_BUTTON_RELEASE] = g_signal_new(
+                       "button-release",
+                       G_TYPE_FROM_CLASS(gobject_class),
+                       G_SIGNAL_RUN_LAST,
+                       0,
+                       NULL,
+                       NULL,
+                       g_cclosure_marshal_VOID__POINTER,
+                       G_TYPE_NONE,
+                       1,
+                       G_TYPE_POINTER);
+
+       /**
+        * GritsViewer::key-press:
+        * @object: the object.
+        * @event:  the GdkEventKey which triggered this signal
+        *
+        * The ::key-press signal is emitted when a key is pressed.
+        */
+       signals[SIG_KEY_PRESS] = g_signal_new(
+                       "key-press",
+                       G_TYPE_FROM_CLASS(gobject_class),
+                       G_SIGNAL_RUN_LAST,
+                       0,
+                       NULL,
+                       NULL,
+                       g_cclosure_marshal_VOID__POINTER,
+                       G_TYPE_NONE,
+                       1,
+                       G_TYPE_POINTER);
+
+       /**
+        * GritsViewer::key-release:
+        * @object: the object.
+        * @event:  the GdkEventKey which triggered this signal
+        *
+        * The ::key-release signal is emitted when a key is released.
+        */
+       signals[SIG_KEY_RELEASE] = g_signal_new(
+                       "key-release",
+                       G_TYPE_FROM_CLASS(gobject_class),
+                       G_SIGNAL_RUN_LAST,
+                       0,
+                       NULL,
+                       NULL,
+                       g_cclosure_marshal_VOID__POINTER,
+                       G_TYPE_NONE,
+                       1,
+                       G_TYPE_POINTER);
+
+       /**
+        * GritsViewer::motion:
+        * @object: the object.
+        * @event:  the GdkEventMotion which triggered this signal
+        *
+        * The ::motion signal is emitted the pointer moves over the object
+        */
+       signals[SIG_MOTION] = g_signal_new(
+                       "motion",
+                       G_TYPE_FROM_CLASS(gobject_class),
+                       G_SIGNAL_RUN_LAST,
+                       0,
+                       NULL,
+                       NULL,
+                       g_cclosure_marshal_VOID__POINTER,
+                       G_TYPE_NONE,
+                       1,
+                       G_TYPE_POINTER);
 }
index d7cd2b0491277c9dac19d99947ec052536e821d6..4390a41fe994cbfb3a0245e4ecc88b4c0c6ae4f2 100644 (file)
@@ -78,6 +78,7 @@ void grits_object_hide(GritsObject *object, gboolean hidden);
 void grits_object_pick_begin(GritsObject *object, GritsOpenGL *opengl);
 void grits_object_pick_pointer(GritsObject *object, double x, double y);
 void grits_object_pick_end(GritsObject *object);
+void grits_object_event(GritsObject *object, GdkEvent *event);
 
 /**
  * grits_object_queue_draw: