guile-gtk-general
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 1/4] Creation of GdkEvent using new function vector->gdk-event.


From: Jan Nieuwenhuizen
Subject: [PATCH 1/4] Creation of GdkEvent using new function vector->gdk-event.
Date: Sat, 19 Jul 2014 15:40:59 +0200

        * gtk/gnome/gw/gdk-support.h:
        * gtk/gnome/gw/gdk-support.c ("vector->gdk-event"): New function.

        * gtk/gnome/overrides/gdk.defs (vector->gdk-event): Declare new
        function, remove opaque boxed define for GdkEvent.

        * gtk/gnome/gw/gdk-spec.scm (initialize): Add custom boxed wrapping
        for GdkEvent.

        * gtk/gnome/gtk/gdk-event.scm (gdk-event:type)
        (define-gdk-event-accessor): Remove explicit -> vector conversion.
---
 gtk/gnome/gtk/gdk-event.scm  |  19 +++---
 gtk/gnome/gw/gdk-spec.scm    |   7 +++
 gtk/gnome/gw/gdk-support.c   | 147 ++++++++++++++++++++++++++++++++++++++++---
 gtk/gnome/gw/gdk-support.h   |   1 +
 gtk/gnome/overrides/gdk.defs |  14 +++--
 5 files changed, 164 insertions(+), 24 deletions(-)

diff --git a/gtk/gnome/gtk/gdk-event.scm b/gtk/gnome/gtk/gdk-event.scm
index 4d51861..44a668d 100644
--- a/gtk/gnome/gtk/gdk-event.scm
+++ b/gtk/gnome/gtk/gdk-event.scm
@@ -1,4 +1,5 @@
 ;; guile-gnome
+;; Copyright (C) 2013,2014 Jan Nieuwenhuizen <address@hidden>
 ;; Copyright (C) 2003,2004,2007 Andy Wingo <wingo at pobox dot com>
 
 ;; This program is free software; you can redistribute it and/or    
@@ -30,22 +31,18 @@
   #:use-module (oop goops))
 
 (define-public (gdk-event:type event)
-  (let ((vector (gdk-event->vector event)))
-    (if vector
-        (genum->symbol
-         (make <gdk-event-type>
-           #:value (vector-ref vector 0)))
-        #f))) ;; #f can happen if gdk-support.c needs some work...
+  (if event
+      (genum->symbol (vector-ref event 0))
+      #f)) ;; #f can happen if gdk-support.c needs some work...
 
 (define-macro (define-gdk-event-accessor types kind name index code)
   (define (symbol-append . args)
     (string->symbol (apply string-append (map symbol->string args))))
   `(define-public (,(symbol-append 'gdk-event- kind (string->symbol ":") name) 
event)
-     (let ((vector (gdk-event->vector event)))
-       (case (gdk-event:type event)
-         (,types (let ((val (vector-ref vector ,index)))
-                   ,code))
-         (else (gruntime-error "Event not of the proper type: ~A" event))))))
+     (case (gdk-event:type event)
+       (,types (let ((val (vector-ref event ,index)))
+                ,code))
+       (else (gruntime-error "Event not of the proper type: ~A" event)))))
 
 (define-gdk-event-accessor (key-press key-release) key modifiers 4
   (gflags->symbol-list
diff --git a/gtk/gnome/gw/gdk-spec.scm b/gtk/gnome/gw/gdk-spec.scm
index 93aeb8d..c52fb0b 100644
--- a/gtk/gnome/gw/gdk-spec.scm
+++ b/gtk/gnome/gw/gdk-spec.scm
@@ -134,6 +134,13 @@
    ;; unwrap
    (list c-var " = scm_scm_to_gdk_color (" scm-var ");\n"))
 
+  (wrap-custom-boxed!
+   "GdkEvent" "GDK_TYPE_EVENT"
+   ;; wrap
+   (list scm-var " = " c-var " ? gdk_event_to_vector (" c-var ") : 
SCM_BOOL_F;\n")
+   ;; unwrap
+   (list c-var " = vector_to_gdk_event (" scm-var ");\n"))
+
   (wrap-opaque-pointer! ws "GdkPixbufFormat*")
   (wrap-opaque-pointer! ws "GdkAtom")
   (add-type-rule! ws "GdkAtom*" '(<gdk-atom> out))
diff --git a/gtk/gnome/gw/gdk-support.c b/gtk/gnome/gw/gdk-support.c
index 91c3e6c..a383829 100644
--- a/gtk/gnome/gw/gdk-support.c
+++ b/gtk/gnome/gw/gdk-support.c
@@ -1,4 +1,5 @@
 /* guile-gnome
+ * Copyright (C) 2013,2014 Jan Nieuwenhuizen <address@hidden>
  * Copyright (C) 2003,2004,2010 Andy Wingo <wingo at pobox dot com>
  *
  * gdk-support.c: Support routines for the GDK wrapper
@@ -30,6 +31,9 @@
 SCM
 gdk_event_to_vector (GdkEvent *event)
 {
+  SCM type = scm_c_make_gvalue (GDK_TYPE_EVENT_TYPE);
+  g_value_set_enum (scm_c_gvalue_peek_value (type), event->type);
+
     switch (event->type) {
     case GDK_KEY_PRESS:
     case GDK_KEY_RELEASE:
@@ -40,7 +44,7 @@ gdk_event_to_vector (GdkEvent *event)
             /* 8 fields (we ignore key.string and key.length) */
             ret = scm_c_make_vector (8, SCM_BOOL_F);
             
-            VSET (ret, 0, scm_from_int (event->type));
+            VSET (ret, 0, type);
             VSET (ret, 1, scm_c_gtype_instance_to_scm (ekey.window));
             VSET (ret, 2, ekey.send_event ? SCM_BOOL_T : SCM_BOOL_F);
             VSET (ret, 3, scm_from_ulong (ekey.time));
@@ -61,7 +65,7 @@ gdk_event_to_vector (GdkEvent *event)
             /* 11 fields (we ignore axes) */
             ret = scm_c_make_vector (11, SCM_BOOL_F);
             
-            VSET (ret, 0, scm_from_int (event->type));
+            VSET (ret, 0, type);
             VSET (ret, 1, scm_c_gtype_instance_to_scm (ebutton.window));
             VSET (ret, 2, ebutton.send_event ? SCM_BOOL_T : SCM_BOOL_F);
             VSET (ret, 3, scm_from_ulong (ebutton.time));
@@ -83,7 +87,7 @@ gdk_event_to_vector (GdkEvent *event)
             /* 13 fields */
             ret = scm_c_make_vector (13, SCM_BOOL_F);
 
-            VSET (ret, 0, scm_from_int (event->type));
+            VSET (ret, 0, type);
             VSET (ret, 1, scm_c_gtype_instance_to_scm (ecrossing.window));
             VSET (ret, 2, ecrossing.send_event ? SCM_BOOL_T : SCM_BOOL_F);
            /* subwindow may be NULL. --jcn */
@@ -113,7 +117,7 @@ gdk_event_to_vector (GdkEvent *event)
             /* 8 fields */
             ret = scm_c_make_vector (8, SCM_BOOL_F);
             
-            VSET (ret, 0, scm_from_int (event->type));
+            VSET (ret, 0, type);
             VSET (ret, 1, scm_c_gtype_instance_to_scm (eselection.window));
             VSET (ret, 2, eselection.send_event ? SCM_BOOL_T : SCM_BOOL_F);
             VSET (ret, 3, scm_take_locale_string (gdk_atom_name 
(eselection.selection)));
@@ -132,7 +136,7 @@ gdk_event_to_vector (GdkEvent *event)
             /* 11 fields (we ignore axes) */
             ret = scm_c_make_vector (11, SCM_BOOL_F);
             
-            VSET (ret, 0, scm_from_int (event->type));
+            VSET (ret, 0, type);
             VSET (ret, 1, scm_c_gtype_instance_to_scm (emotion.window));
             VSET (ret, 2, emotion.send_event ? SCM_BOOL_T : SCM_BOOL_F);
             VSET (ret, 3, scm_from_ulong (emotion.time));
@@ -154,7 +158,7 @@ gdk_event_to_vector (GdkEvent *event)
             /* 5 fields */
             ret = scm_c_make_vector (5, SCM_BOOL_F);
 
-            VSET (ret, 0, scm_from_int (event->type));
+            VSET (ret, 0, type);
             VSET (ret, 1, scm_c_gtype_instance_to_scm (ewinstate.window));
             VSET (ret, 2, ewinstate.send_event ? SCM_BOOL_T : SCM_BOOL_F);
             VSET (ret, 3, scm_from_int (ewinstate.changed_mask));
@@ -170,7 +174,7 @@ gdk_event_to_vector (GdkEvent *event)
             /* 6 fields */
             ret = scm_c_make_vector (6, SCM_BOOL_F);
 
-            VSET (ret, 0, scm_from_int (event->type));
+            VSET (ret, 0, type);
             VSET (ret, 1, scm_c_gtype_instance_to_scm (expose.window));
             VSET (ret, 2, SCM_BOOL (expose.send_event));
             VSET (ret, 3, scm_gdk_rectangle_to_scm (&expose.area));
@@ -185,6 +189,135 @@ gdk_event_to_vector (GdkEvent *event)
     }
 }
 
+GdkEvent*
+vector_to_gdk_event (SCM vec)
+#define FUNC_NAME "vector->gdk-event"
+{
+  SCM t;
+  GdkEvent *event = NULL;
+  GdkEventType type = GDK_EVENT_LAST;
+
+  SCM_ASSERT (scm_vector_p (vec) == SCM_BOOL_T, vec, 1, FUNC_NAME);
+  SCM_ASSERT (scm_c_vector_length (vec) > 0, vec, 1, FUNC_NAME);
+  t = scm_c_vector_ref (vec, 0);
+
+  if (scm_c_gvalue_holds (t, GDK_TYPE_EVENT_TYPE))
+    {
+      GValue *gvalue = scm_c_gvalue_peek_value (t);
+      type = g_value_get_enum (gvalue);
+    }
+  else if (scm_is_signed_integer (t, 0, GDK_EVENT_LAST))
+    type = (GdkEventType) scm_to_int (t);
+
+  if (type != GDK_EVENT_LAST)
+    {
+      event = gdk_event_new (type);
+      event->any.send_event = scm_c_vector_ref (vec, 2) == SCM_BOOL_T;
+
+      SCM w = scm_c_vector_ref (vec, 1);
+      event->any.window = NULL;
+      if (scm_c_gtype_instance_is_a_p (w, GDK_TYPE_WINDOW))
+       event->any.window
+         = scm_c_scm_to_gtype_instance_typed (w, GDK_TYPE_WINDOW);
+
+      switch (type)
+       {
+       case GDK_MOTION_NOTIFY:
+         event->motion.time = scm_to_uint32 (scm_c_vector_ref (vec, 3));
+         event->motion.axes = NULL;
+         event->motion.state = scm_to_uint (scm_c_vector_ref (vec, 4));
+         break;
+         
+       case GDK_BUTTON_PRESS:
+       case GDK_2BUTTON_PRESS:
+       case GDK_3BUTTON_PRESS:
+       case GDK_BUTTON_RELEASE:
+         event->button.time = scm_to_uint32 (scm_c_vector_ref (vec, 3));
+         event->button.axes = NULL;
+         event->button.x = scm_to_double (scm_c_vector_ref (vec, 4));
+         event->button.y = scm_to_double (scm_c_vector_ref (vec, 5));
+         event->button.state = scm_to_uint (scm_c_vector_ref (vec, 6));
+         event->button.button = scm_to_uint (scm_c_vector_ref (vec, 7));
+         event->button.device = NULL;
+         event->button.x_root = scm_to_double (scm_c_vector_ref (vec, 9));
+         event->button.y_root = scm_to_double (scm_c_vector_ref (vec, 10));
+         break;
+         
+       case GDK_SCROLL:
+         event->scroll.time = scm_to_uint32 (scm_c_vector_ref (vec, 3));
+         event->scroll.state = scm_to_uint (scm_c_vector_ref (vec, 4));
+         break;
+         
+       case GDK_EXPOSE:
+         {
+           SCM area = scm_c_vector_ref (vec, 3);
+           if (scm_is_vector (area))
+             event->expose.area = *scm_scm_to_gdk_rectangle (area);
+           event->expose.region = 0;
+           event->expose.count = scm_to_int (scm_c_vector_ref (vec, 5));
+           break;
+         }
+
+       case GDK_KEY_PRESS:
+       case GDK_KEY_RELEASE:
+         event->key.time = scm_to_uint32 (scm_c_vector_ref (vec, 3));
+         event->key.state = scm_to_uint (scm_c_vector_ref (vec, 4));
+         event->key.keyval = scm_to_int (scm_c_vector_ref (vec, 5));
+         event->key.hardware_keycode = scm_to_int (scm_c_vector_ref (vec, 6));
+         event->key.group = scm_to_ushort (scm_c_vector_ref (vec, 7));
+         break;
+         
+       case GDK_ENTER_NOTIFY:
+       case GDK_LEAVE_NOTIFY:
+         event->crossing.time = scm_to_uint32 (scm_c_vector_ref (vec, 3));
+         event->crossing.state = scm_to_uint (scm_c_vector_ref (vec, 4));
+         break;
+         
+       case GDK_PROPERTY_NOTIFY:
+         event->property.time = scm_to_uint32 (scm_c_vector_ref (vec, 3));
+         event->property.state = scm_to_uint (scm_c_vector_ref (vec, 4));
+         break;
+         
+       case GDK_SELECTION_CLEAR:
+       case GDK_SELECTION_REQUEST:
+       case GDK_SELECTION_NOTIFY:
+         event->selection.time = scm_to_uint32 (scm_c_vector_ref (vec, 3));
+         break;
+         
+       case GDK_PROXIMITY_IN:
+       case GDK_PROXIMITY_OUT:
+         event->proximity.time = scm_to_uint32 (scm_c_vector_ref (vec, 3));
+         break;
+         
+       case GDK_DRAG_ENTER:
+       case GDK_DRAG_LEAVE:
+       case GDK_DRAG_MOTION:
+       case GDK_DRAG_STATUS:
+       case GDK_DROP_START:
+       case GDK_DROP_FINISHED:
+         event->dnd.time = scm_to_uint32 (scm_c_vector_ref (vec, 3));
+         break;
+         
+       case GDK_FOCUS_CHANGE:
+       case GDK_CONFIGURE:
+       case GDK_MAP:
+       case GDK_UNMAP:
+       case GDK_CLIENT_EVENT:
+       case GDK_VISIBILITY_NOTIFY:
+       case GDK_NO_EXPOSE:
+       case GDK_DELETE:
+       case GDK_DESTROY:
+       default:
+         g_print ("Creation of events of type %d are not implemented.\n"
+                  "How about doing it yourself?\n", type);
+         return NULL;
+       }
+    }
+
+  return event;
+}
+#undef FUNC_NAME
+
 SCM
 scm_gdk_rectangle_to_scm (GdkRectangle *rect)
 {
diff --git a/gtk/gnome/gw/gdk-support.h b/gtk/gnome/gw/gdk-support.h
index f12236a..aaf151f 100644
--- a/gtk/gnome/gw/gdk-support.h
+++ b/gtk/gnome/gw/gdk-support.h
@@ -25,6 +25,7 @@
 #include <gdk/gdk.h>
 
 SCM gdk_event_to_vector (GdkEvent *event);
+GdkEvent* vector_to_gdk_event (SCM vec);
 
 SCM scm_gdk_rectangle_to_scm (GdkRectangle *rect);
 GdkRectangle* scm_scm_to_gdk_rectangle (SCM scm);
diff --git a/gtk/gnome/overrides/gdk.defs b/gtk/gnome/overrides/gdk.defs
index a995fc2..1098500 100644
--- a/gtk/gnome/overrides/gdk.defs
+++ b/gtk/gnome/overrides/gdk.defs
@@ -1,5 +1,6 @@
 ;; -*- scheme -*-
 ;; guile-gnome
+;; Copyright (C) 2013,2014 Jan Nieuwenhuizen <address@hidden>
 ;; Copyright (C) 2005 Andreas Rottmann <rotty at debian dot org>
 ;; Copyright (C) 2003,2004 Andy Wingo <wingo at pobox dot com>
 ;;
@@ -28,12 +29,6 @@
 
 ;; stealing most of these from python-gtk2
 
-(define-boxed Event
-  (in-module "Gdk")
-  (c-name "GdkEvent")
-  (gtype-id "GDK_TYPE_EVENT")
-)
-
 (define-boxed Cursor
   (in-module "Gdk")
   (c-name "GdkCursor")
@@ -86,6 +81,13 @@
   (leave-guile-mode #f)
   (parameters '("GdkEvent*" "event")))
 
+(define-function vector->gdk-event
+  (c-name "vector_to_gdk_event")
+  (overrides "vector->gdk-event")
+  (return-type "GdkEvent*")
+  (leave-guile-mode #f)
+  (parameters '("SCM" "event-vector")))
+
 (define-method set_icon
   (of-object "GdkWindow")
   (c-name "gdk_window_set_icon")
-- 
Jan Nieuwenhuizen <address@hidden> | GNU LilyPond http://lilypond.org
Freelance IT http://JoyofSource.com | AvatarĀ®  http://AvatarAcademy.nl  




reply via email to

[Prev in Thread] Current Thread [Next in Thread]