Search code examples
pythongtk3

How to return the correct use of a letter with a modifier


The key combination a+mod1 should return the letter with the tail ą in my native Polish language, while gtk returns aogonek.

How to fix this problem for this and other keys?

(...)

   def on_key_release(self, widget, event, data=None):
        keyval = event.keyval
        keyname = Gdk.keyval_name(keyval)
        ctrl = (event.state & Gdk.ModifierType.CONTROL_MASK)
        shift = (event.state & Gdk.ModifierType.SHIFT_MASK)
        mod1 = (event.state & Gdk.ModifierType.MOD1_MASK)
        super = (event.state & Gdk.ModifierType.SUPER_MASK)
        hyper = (event.state & Gdk.ModifierType.HYPER_MASK)
        meta = (event.state & Gdk.ModifierType.META_MASK)
        lock = (event.state & Gdk.ModifierType.LOCK_MASK)

        if keyname in self.buffer:
            self.buffer.remove(keyname)
            if self.buffer:
                self.textbuffer.insert_at_cursor('you released '+'+'.join(self.buffer)+'\n')

    def on_key_down(self, widget, event, data=None):
        keyval = event.keyval
        keyname = Gdk.keyval_name(keyval)
        ctrl = (event.state & Gdk.ModifierType.CONTROL_MASK)
        shift = (event.state & Gdk.ModifierType.SHIFT_MASK)
        mod1 = (event.state & Gdk.ModifierType.MOD1_MASK)
        super = (event.state & Gdk.ModifierType.SUPER_MASK)
        hyper = (event.state & Gdk.ModifierType.HYPER_MASK)
        meta = (event.state & Gdk.ModifierType.META_MASK)
        lock = (event.state & Gdk.ModifierType.LOCK_MASK)

        if keyname in 'AĄz aogonek żółćgęśaą' and keyname and (shift or mod1 or ctrl or super or hyper or meta or lock) not in self.buffer:
            self.buffer.append(keyname)
            if self.buffer:
                self.textbuffer.insert_at_cursor('you pressed '+'+'.join(self.buffer)+'\n')

(...)


Solution

  • I think the issue is related to print the keyvalue. As you are capturing the keypress on button click and printing it on textview you are passing the keyvalue

       def on_key_down(self, widget, event, data=None):
            keyval = event.keyval
            keyname = Gdk.keyval_name(keyval)
            self.textbuffer.insert_at_cursor(keyname+'\n')
    

    in this function when you try to print special characters like @ it will be printed "at" as thats its keyname. to print the text that would result from this keypress you have to change it to

    self.textbuffer.insert_at_cursor(event.string+'\n')
    

    https://developer.gnome.org/gdk3/stable/gdk3-Event-Structures.html#GdkEventKey

    or as an alternative you could propagate the keyevent to the textview

    https://developer.gnome.org/gtk3/stable/GtkWindow.html#gtk-window-propagate-key-event https://developer.gnome.org/gtk3/stable/chap-input-handling.html