qnikst / kbdd

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

Проблема с dbus #22

Closed vladimir-g closed 11 years ago

vladimir-g commented 11 years ago

Проблема такая - посылка команды через dbus срабатывает только после переключения в другое окно, от чего, соответственно, раскладка для текущего выбранного окна не переключается.

Например, такая команда висит и не выдаёт ответа:

dbus-send --print-reply --dest=ru.gentoo.KbddService /ru/gentoo/KbddService ru.gentoo.kbdd.set_layout uint32:0

WM - awesome из гита, но такая же проблема была и с версией 3.4. В dbus-monitor при вышеуказанной команде не выводится никакого ответа от kbdd.

При этом сам kbdd вполне нормально выдаёт сигналы по dbus-у о смене раскладки при переключении окна.

Я попробовал немного посмотреть в код, поставил несколько printf-ов и помучал его разными способами, и мне показалось, что проблема в том, что main loop блокируется функцией XNextEvent так, что даже сообщения дбаса не приходят. Поэтому и при переключении на другое окно main loop всё же читает то, что ему написали. Но я плохо разбираюсь в Си, glib, дбасе и иксах, и поэтому могу ошибаться.

Я попробовал заменить x11_fd_check из kbdd.c вот такой штукой:

static gboolean
x11_fd_check (GSource *source)
{
  Display * dpy;
  dpy = kbdd_get_display();
  if (XPending(dpy))
    return TRUE;
  else
    return FALSE;
}

и все проблемы моментально исчезли - указанная в начале команда начала отрабатывать мгновенно, и раскладка для текущего окна менялась как надо. Но я не уверен, что это лучшее решение, и не знаю, не приведёт ли это к каким-нибудь побочным эффектам.

qnikst commented 11 years ago

Исправлено в b86c8e4 . Спасибо за багрепорт и исправление, существенных побочных эффектов при нём не будет.

Данное исправление будет добавлено в следующий тег, если нужно, выложить промежуточную версию только с этим исправлением - обращайтесь.