qnikst / kbdd

keyboard library for per-window keyboard layout
GNU General Public License v2.0
146 stars 16 forks source link

Ошибка получения названия раскладки при смене набора раскладок после старта kbdd #27

Open PIlin opened 10 years ago

PIlin commented 10 years ago

Если поменять набор раскладок с помощью setxkbmap -layout после старта kbdd, вызовы к ru.gentoo.kbdd.getLayoutName с номером новой раскладки возвращают ошибку.

Пример:

$ setxkbmap -query
rules:      evdev
model:      pc104
layout:     us,ru
options:    grp:caps_toggle
$ qdbus-qt4 ru.gentoo.KbddService /ru/gentoo/KbddService  ru.gentoo.kbdd.getLayoutName 2
Error: org.freedesktop.DBus.GLib.ErrorError
Method invoked for getLayoutName returned FALSE but did not set error
$ setxkbmap -layout us,ru,ua
$ setxkbmap -query
rules:      evdev
model:      pc104
layout:     us,ru,ua
options:    grp:caps_toggle
$ qdbus-qt4 ru.gentoo.KbddService /ru/gentoo/KbddService  ru.gentoo.kbdd.getLayoutName 2
Error: org.freedesktop.DBus.GLib.ErrorError
Method invoked for getLayoutName returned FALSE but did not set error

Рестартуем kbdd

$ qdbus-qt4 ru.gentoo.KbddService /ru/gentoo/KbddService  ru.gentoo.kbdd.getLayoutName 2
Ukrainian
qnikst commented 10 years ago

Здравствуйте, во-первых, спасибо за багзепорт, данная проблема возникает из-за того, что у в таблице раскладок нету творого элемента. Есть 2 способа это решить: 1). выставлять соответсвующую ошибку в результате запроса, и возврщать ошибку. 2). возвращать "n/a" в качестве ответа ветка layout-name-na коммит (b526d91)

если такое решение подходит, то я волью изменения в мастер.

PIlin commented 10 years ago

У kbdd нет названия языка - это исключительная ситуация. Так что, на мой взгляд, вернуть ошибку - логически правильнее. Особенно, если dbus это позволяет. А дальше уже приложение-фронтэнд, которое использует информацию о названии языка, пусть само разбирается, как эту ошибку обработать и вывести.

А вообще, у меня есть следующие идеи, как можно улучшить программу:

  1. Сделать еще один dbus-вызов, который переинициализирует список раскладок и их имен. В таком случае, не придется перезапускать kbdd каждый раз при смене набора раскладок. Фронтэнд может в случае, если получена ошибка, попробовать попросить kbdd пересоздать список имен и, затем, спросить имя текущей раскладки еще раз.
  2. Если возможно, получать от xkb событие смены набора раскладок и обрабатывать его в kbdd - автоматически переинициализировать список названий раскладок. Если это возможно сделать, тогда можно будет решить, например, такой случай: 1) kbdd стартовал при наборе раскладок "us,ru" и запомнил их имена; 2) набор сменился на "de,ua" - количество то же самое, но раскладки все другие; 3) kbdd по прежнему считает, что раскладки были "us,ru" и не выдает никаких ошибок, потому как количество раскладок не изменилось.