[pygobject] override gdk.Event to return attribute from the proper event object



commit 99c7322898c00a576c7319ea0a7c808446253133
Author: Toms Baugis <toms baugis gmail com>
Date:   Fri Jul 30 15:44:21 2010 +0200

    override gdk.Event to return attribute from the proper event object
    
    https://bugzilla.gnome.org/show_bug.cgi?id=620593

 gi/overrides/Gdk.py     |   48 +++++++++++++++++++++++++++++++++++++++++++++++
 gi/pygi-invoke.c        |    4 ---
 tests/test_overrides.py |   10 +++++++++
 3 files changed, 58 insertions(+), 4 deletions(-)
---
diff --git a/gi/overrides/Gdk.py b/gi/overrides/Gdk.py
index 3a03132..23a9d8e 100644
--- a/gi/overrides/Gdk.py
+++ b/gi/overrides/Gdk.py
@@ -69,6 +69,54 @@ class Drawable(Gdk.Drawable):
 Drawable = override(Drawable)
 __all__.append('Drawable')
 
+class Event(Gdk.Event):
+    _UNION_MEMBERS = {
+        Gdk.EventType.DELETE: 'any',
+        Gdk.EventType.DESTROY: 'any',
+        Gdk.EventType.EXPOSE: 'expose',
+        Gdk.EventType.MOTION_NOTIFY: 'motion',
+        Gdk.EventType.BUTTON_PRESS: 'button',
+        #Gdk.EventType.2BUTTON_PRESS: 'button',
+        #Gdk.EventType.3BUTTON_PRESS: 'button',
+        Gdk.EventType.BUTTON_RELEASE: 'button',
+        Gdk.EventType.KEY_PRESS: 'key',
+        Gdk.EventType.KEY_RELEASE: 'key',
+        Gdk.EventType.ENTER_NOTIFY: 'crossing',
+        Gdk.EventType.LEAVE_NOTIFY: 'crossing',
+        Gdk.EventType.FOCUS_CHANGE: 'focus_change',
+        Gdk.EventType.CONFIGURE: 'configure',
+        Gdk.EventType.MAP: 'any',
+        Gdk.EventType.UNMAP: 'any',
+        Gdk.EventType.PROPERTY_NOTIFY: 'property',
+        Gdk.EventType.SELECTION_CLEAR: 'selection',
+        Gdk.EventType.SELECTION_REQUEST: 'selection',
+        Gdk.EventType.SELECTION_NOTIFY: 'selection',
+        Gdk.EventType.PROXIMITY_IN: 'proximity',
+        Gdk.EventType.PROXIMITY_OUT: 'proximity',
+        Gdk.EventType.DRAG_ENTER: 'dnd',
+        Gdk.EventType.DRAG_LEAVE: 'dnd',
+        Gdk.EventType.DRAG_MOTION: 'dnd',
+        Gdk.EventType.DRAG_STATUS: 'dnd',
+        Gdk.EventType.DROP_START: 'dnd',
+        Gdk.EventType.DROP_FINISHED: 'dnd',
+        Gdk.EventType.CLIENT_EVENT: 'client',
+        Gdk.EventType.VISIBILITY_NOTIFY: 'visibility',
+        Gdk.EventType.NO_EXPOSE: 'no_expose'
+    }
+
+    def __new__(cls, *args, **kwargs):
+        return Gdk.Event.__new__(cls)
+
+    def __getattr__(self, name):
+        real_event = getattr(self, '_UNION_MEMBERS').get(self.type)
+        if real_event:
+            return getattr(getattr(self, real_event), name)
+        else:
+            return getattr(self, name)
+
+Event = override(Event)
+__all__.append('Event')
+
 
 import sys
 
diff --git a/gi/pygi-invoke.c b/gi/pygi-invoke.c
index 2bd1978..4608adb 100644
--- a/gi/pygi-invoke.c
+++ b/gi/pygi-invoke.c
@@ -656,10 +656,6 @@ _process_invocation_state (struct invocation_state *state,
 
         switch (info_type) {
             case GI_INFO_TYPE_UNION:
-                /* TODO */
-                PyErr_SetString (PyExc_NotImplementedError, "creating unions is not supported yet");
-                g_base_info_unref (info);
-                return FALSE;
             case GI_INFO_TYPE_STRUCT:
             {
                 GType type;
diff --git a/tests/test_overrides.py b/tests/test_overrides.py
index 87eca5d..ad2684f 100644
--- a/tests/test_overrides.py
+++ b/tests/test_overrides.py
@@ -22,6 +22,16 @@ class TestGdk(unittest.TestCase):
         self.assertEquals(color.green, 200)
         self.assertEquals(color.blue, 300)
 
+    def test_event(self):
+        event = Gdk.Event.new(Gdk.EventType.CONFIGURE)
+        self.assertEquals(event.type, Gdk.EventType.CONFIGURE)
+        self.assertEquals(event.send_event, 0)
+
+        event = Gdk.Event.new(Gdk.EventType.DRAG_MOTION)
+        event.x_root, event.y_root = 0, 5
+        self.assertEquals(event.x_root, 0)
+        self.assertEquals(event.y_root, 5)
+
 class TestGtk(unittest.TestCase):
     def test_uimanager(self):
         self.assertEquals(Gtk.UIManager, overrides.Gtk.UIManager)



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