[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