[meld] Check for modifier keysyms only on first level (closes bgo#683534)



commit 72b9ff55d53fa05e3558ba4f16bb7b5f0c5f2e8a
Author: Stephan Hilb <stephan ecshi net>
Date:   Wed Sep 26 18:08:34 2012 +0200

    Check for modifier keysyms only on first level (closes bgo#683534)
    
    There is a problem when checking for keypress/release events on
    modifier keys as they do not necessarily have the modifier keysym
    on that level as expected (see bugs #683534 and #584342).
    By checking for the keysym on the first level (and thereby assuming
    a modifier key has its appropriate keysym set on the first level)
    we can gracefully circumvent this problem.
    
    This might not be the ideal solution, but considering there is no
    good way to retrieve the current modifier state in PyGTK it is at
    least better than previously.
    The ugly workaround for #584342 is thereby obsolete.
    
    We use translate_keyboard_state method instead of lookup_key, as
    the latter one returns wrong values in some cases with multiple
    layouts.

 meld/filediff.py |   11 ++++++-----
 1 files changed, 6 insertions(+), 5 deletions(-)
---
diff --git a/meld/filediff.py b/meld/filediff.py
index 38e6bad..ae1295c 100644
--- a/meld/filediff.py
+++ b/meld/filediff.py
@@ -712,19 +712,20 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
             self.refresh_comparison()
 
     def on_key_press_event(self, object, event):
-        x = self.keylookup.get(event.keyval, 0)
+        keymap = gtk.gdk.keymap_get_default()
+        x = self.keylookup.get(keymap.translate_keyboard_state(
+                               event.hardware_keycode, 0, event.group)[0], 0)
         if self.keymask | x != self.keymask:
             self.keymask |= x
         elif event.keyval == gtk.keysyms.Escape:
             self.findbar.hide()
 
     def on_key_release_event(self, object, event):
-        x = self.keylookup.get(event.keyval, 0)
+        keymap = gtk.gdk.keymap_get_default()
+        x = self.keylookup.get(keymap.translate_keyboard_state(
+                               event.hardware_keycode, 0, event.group)[0], 0)
         if self.keymask & ~x != self.keymask:
             self.keymask &= ~x
-        # Ugly workaround for bgo#584342
-        elif event.keyval == gtk.keysyms.ISO_Prev_Group:
-            self.keymask = 0
 
     def on_delete_event(self, appquit=0):
         response = gtk.RESPONSE_OK



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