xpra icon
Bug tracker and wiki

This bug tracker and wiki are being discontinued
please use https://github.com/Xpra-org/xpra instead.


Ticket #1380: xkb-layout-group.patch

File xkb-layout-group.patch, 5.2 KB (added by Antoine Martin, 4 years ago)

improved patch: use xsync instead of Flush, less intrusive in ServerBase? class

  • xpra/server/server_base.py

     
    25672567        modifiers = props.get("modifiers", [])
    25682568        ss.make_keymask_match(modifiers)
    25692569
     2570    def set_layout_group(self, grp):
     2571        #only actually implemented in X11ServerBase
     2572        pass
     2573
    25702574    def _process_key_action(self, proto, packet):
    25712575        if self.readonly:
    25722576            return
    2573         wid, keyname, pressed, modifiers, keyval, _, client_keycode = packet[1:8]
    2574         #group = packet[8] #unused!
     2577        wid, keyname, pressed, modifiers, keyval, _, client_keycode, group = packet[1:9]
    25752578        ss = self._server_sources.get(proto)
    25762579        if ss is None:
    25772580            return
    25782581        self.ui_driver = ss.uuid
     2582        self.set_layout_group(group)
    25792583        keycode = self.get_keycode(ss, client_keycode, keyname, modifiers)
    25802584        log("process_key_action(%s) server keycode=%s", packet, keycode)
    25812585        #currently unused: (group, is_modifier) = packet[8:10]
  • xpra/x11/bindings/keyboard_bindings.pyx

     
    5151    ctypedef CARD32 XID
    5252
    5353    ctypedef int Bool
     54    ctypedef int Status
    5455    ctypedef CARD32 Atom
    5556    ctypedef XID Window
    5657    ctypedef XID KeySym
     
    99100    unsigned long XkbUseCoreKbd
    100101    unsigned long XkbDfltXIId
    101102    unsigned long XkbBellNotifyMask
     103    unsigned long XkbMapNotifyMask
     104    unsigned long XkbStateNotifyMask
    102105    unsigned int XkbGBN_AllComponentsMask
    103106    unsigned int XkbGBN_GeometryMask
    104107
     
    114117    ctypedef struct XkbDescRec:
    115118        pass
    116119    ctypedef XkbDescRec* XkbDescPtr
     120    ctypedef struct _XkbStateRec:
     121        unsigned char   group
     122    ctypedef _XkbStateRec XkbStateRec
     123    ctypedef _XkbStateRec *XkbStatePtr
    117124
    118125
    119126cdef extern from "X11/extensions/XKBrules.h":
     
    155162
    156163    XkbDescPtr XkbGetKeyboardByName(Display *display, unsigned int deviceSpec, XkbComponentNamesPtr names,
    157164                                    unsigned int want, unsigned int need, Bool load)
     165    Status XkbGetState(Display *dpy, unsigned int deviceSpec, XkbStatePtr statePtr)
     166    Bool   XkbLockGroup(Display *dpy, unsigned int deviceSpec, unsigned int group)
    158167
    159168
    160169cdef extern from "X11/extensions/XTest.h":
     
    347356            log("X11 keymap property updated: %s", self.getXkbProperties())
    348357        return True
    349358
     359    def set_layout_group(self, grp):
     360        log("Setting XKB layout group `%s`", grp)
     361        if not XkbLockGroup(self.display, XkbUseCoreKbd, grp):
     362            log.warn("Warning: cannot lock on layout group '%s'", grp)
     363        return self.get_layout_group()
    350364
     365    def get_layout_group(self):
     366        cdef XkbStateRec xkb_state = XkbStateRec()
     367        XkbGetState(self.display, XkbUseCoreKbd, &xkb_state)
     368        return xkb_state.group
     369
    351370    def hasXkb(self):
    352371        if self.Xkb_checked:
    353372            return self.Xkb_version_major>0 or self.Xkb_version_minor>0
  • xpra/x11/x11_server_base.py

     
    192192
    193193    def init_keyboard(self):
    194194        GTKServerBase.init_keyboard(self)
     195        self.current_keyboard_group = None
    195196        #clear all modifiers
    196197        clean_keyboard_state()
    197198
     199    def set_layout_group(self, grp):
     200        if self.current_keyboard_group!=grp and X11Keyboard.hasXkb():
     201            with xsync:
     202                self.current_keyboard_group = X11Keyboard.set_layout_group(grp)
    198203
    199204    def init_packet_handlers(self):
    200205        GTKServerBase.init_packet_handlers(self)
     
    251256        if self.opengl_props:
    252257            info["opengl"] = self.opengl_props
    253258        #this is added here because the server keyboard config doesn't know about "keys_pressed"..
    254         info.setdefault("keyboard", {}).update({
    255                                                 "state"           : {
    256                                                                      "keys_pressed"   : list(self.keys_pressed.keys())
    257                                                                      },
    258                                                 "fast-switching"  : True,
    259                                                 })
     259        with xsync:
     260            info.setdefault("keyboard", {}).update({
     261                                                    "state"             : {
     262                                                                           "keys_pressed"   : list(self.keys_pressed.keys())
     263                                                                           },
     264                                                    "fast-switching"    : True,
     265                                                    "layout-group"      : X11Keyboard.get_layout_group(),
     266                                                    })
    260267        sinfo = info.setdefault("server", {})
    261268        sinfo.update({"type"                : "Python/gtk/x11",
    262269                      "fakeXinerama"        : self.fake_xinerama and bool(self.libfakeXinerama_so),