Skip to content

Commit

Permalink
honour the keyboard model and rules specified in query struct
Browse files Browse the repository at this point in the history
also move some logging to 'verbose' mode
  • Loading branch information
totaam committed Feb 5, 2025
1 parent 4b6b0e9 commit ca39bfe
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 18 deletions.
9 changes: 5 additions & 4 deletions xpra/server/mixins/input.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ def get_ibus_layouts(self) -> dict[str, Any]:
ibuslog(f"no ibus module: {e}")
else:
self.ibus_layouts = dict((k, v) for k, v in query_ibus().items() if k.startswith("engine"))
ibuslog("loaded ibus layouts from %s: %s", threading.current_thread(), self.ibus_layouts)
ibuslog("loaded ibus layouts from %s: %s", threading.current_thread(), Ellipsizer(self.ibus_layouts))
return self.ibus_layouts

def init(self, opts) -> None:
Expand Down Expand Up @@ -178,22 +178,23 @@ def _process_layout_changed(self, proto, packet: PacketType) -> None:
backend = packet[4]
name = packet[5]
if backend == "ibus" and name:
from xpra.keyboard.ibus import set_engine
from xpra.keyboard.ibus import set_engine, get_engine_layout_spec
if set_engine(name):
ibuslog(f"ibus set engine to {name!r}")
layout, variant, options = get_engine_layout_spec()
ibuslog(f"ibus layout: {layout} {variant=}, {options=}")
return
if ss.set_layout(layout, variant, options):
self.set_keymap(ss, force=True)

def _process_keymap_changed(self, proto, packet: PacketType) -> None:
keylog(f"keymap-changed: {packet}")
if self.readonly:
return
props = typedict(packet[1])
ss = self.get_server_source(proto)
if ss is None:
return
keylog("received new keymap from client")
keylog("received new keymap from client: %s", Ellipsizer(packet))
other_ui_clients = [s.uuid for s in self._server_sources.values() if s != ss and s.ui_client]
if other_ui_clients:
keylog.warn("Warning: ignoring keymap change as there are %i other clients", len(other_ui_clients))
Expand Down
3 changes: 2 additions & 1 deletion xpra/x11/bindings/keyboard.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -628,7 +628,8 @@ cdef class X11KeyboardBindingsInstance(X11CoreBindingsInstance):
for i in range(0, num_codes):
keycode = first_keycode+i
keysyms_strs = keycodes.get(keycode)
log("setting keycode %i: %s", keycode, keysyms_strs)
if keysyms_strs:
log("setting keycode %i: %s", keycode, keysyms_strs)
if keysyms_strs is None:
if len(new_keysyms)>0:
# no keysyms for this keycode yet, assign one of the "new_keysyms"
Expand Down
25 changes: 12 additions & 13 deletions xpra/x11/xkbhelper.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@

XKB = envbool("XPRA_XKB", True)

DEFAULT_RULES = os.environ.get("XKB_DEFAULT_RULES", "")
DEFAULT_MODEL = os.environ.get("XKB_DEFAULT_MODEL", "")
DEFAULT_LAYOUT = os.environ.get("XKB_DEFAULT_LAYOUT", "")
DEFAULT_RULES = os.environ.get("XKB_DEFAULT_RULES", "evdev")
DEFAULT_MODEL = os.environ.get("XKB_DEFAULT_MODEL", "pc105")
DEFAULT_LAYOUT = os.environ.get("XKB_DEFAULT_LAYOUT", "us")
DEFAULT_VARIANT = os.environ.get("XKB_DEFAULT_VARIANT", "")
DEFAULT_OPTIONS = os.environ.get("XKB_DEFAULT_OPTIONS", "")

Expand Down Expand Up @@ -83,6 +83,9 @@ def do_set_keymap(layout: str, variant: str, options, query_struct) -> None:
# First we try to use data from setxkbmap -query,
# preferably as structured data:
query_struct = typedict(query_struct)
rules = DEFAULT_RULES
model = DEFAULT_MODEL
layout = layout or DEFAULT_LAYOUT
if query_struct:
log("do_set_keymap using xkbmap_query struct=%s", query_struct)
# The query_struct data will look something like this:
Expand Down Expand Up @@ -113,9 +116,8 @@ def do_set_keymap(layout: str, variant: str, options, query_struct) -> None:
if safe_setxkbmap(rules, model, "", "", ""):
return
# fallback for non X11 clients:
layout = layout or "us"
log.info("setting keyboard layout to '%s'", std(layout))
safe_setxkbmap("evdev", "pc105", layout, variant, options)
log.info("setting keyboard layout to %r", std(layout))
safe_setxkbmap(rules, model, layout, variant, options)


def safe_setxkbmap(rules: str, model: str, layout: str, variant: str, options: str):
Expand Down Expand Up @@ -172,24 +174,21 @@ def set_keycode_translation(xkbmap_x11_keycodes, xkbmap_keycodes) -> dict:
keycodes = indexed_mappings(xkbmap_x11_keycodes)
else:
keycodes = gtk_keycodes_to_mappings(xkbmap_keycodes)
x11_keycodes = get_keycode_mappings()
log("set_keycode_translation(%s, %s)", Ellipsizer(xkbmap_x11_keycodes), Ellipsizer(xkbmap_keycodes))
log(" keycodes=%s", Ellipsizer(keycodes))
log(" x11_keycodes=%s", Ellipsizer(x11_keycodes))
verboselog("set_keycode_translation(%s, %s)", xkbmap_x11_keycodes, xkbmap_keycodes)
verboselog(" keycodes=%s", keycodes)
verboselog(" x11_keycodes=%s", x11_keycodes)
"""
Example data:
```
keycodes = {
9: set([('', 1), ('Escape', 4), ('', 3), ('Escape', 0), ('Escape', 2)]),
10: set([('onesuperior', 4), ('onesuperior', 8), ('exclam', 1), ('1', 6),
('exclam', 3), ('1', 2), ('exclamdown', 9), ('exclamdown', 5), ('1', 0), ('exclam', 7)]),
```
"""
x11_keycodes = get_keycode_mappings()
log(" x11_keycodes=%s", x11_keycodes)
"""
Example:
```
x11_keycodes = {
8: ['Mode_switch', '', 'Mode_switch', '', 'Mode_switch'],
9: ['Escape', '', 'Escape', '', 'Escape'],
Expand Down

0 comments on commit ca39bfe

Please sign in to comment.