Устраняем проблему numlockx и индикатором Num Lock в Debian Squeeze в графической системе X

Сегодня мне понадобилась утилита, управляющая статусом клавиши Num Lock из скриптов. Традиционно для этих целей используется программа numlockx. Доставив её из репозиториев, я с удивлением обнаружил, что в моем дистрибутиве (Я использую Debian 6 на двух машинах, i386 и x64, и рабочую среду LXDE) она игнорирует индикатор-лампочку Num Lock. Т.е. режим Num Lock включен, а индикации об этом никакой. Первый раз в жизни я засел за исходники, и скомпилировал свою первую программу для Linux.

Первым  делом я выкачал исходники оригинальной numlockx

[code]apt-get source numlockx[/code]

Открыв их, я не увидел знакомых бук, если не считать операторов C++. Код кишил незнакомыми мне API и функциями, среди которых, впрочем, благодаря логичным названиям функций, просматривалась рабочая лошадка.

Меня заинтересовали функции numlock_set_on(), numlock_set_off() и numlock_toggle(). Суть их сводилась к вызову функции XkbLockModifiers, в которую передавался код статуса Num_Lock.

 

Покопавшись, я обнаружил, что для поиска модификатора клавиши Num Lock в программе используется авторская функция, в которой я до конца не разобрался. Однако, я нагуглил, что для решения этой задачи может использоваться функция XkbKeysymToModifiers. Заменив оригинальный текст на вызов этой функции, я получил работоспособную версию numlockx.
[code]/*unsigned int xkb_mask_modifier( XkbDescPtr xkb, const char *name )
{
int i;
if( !xkb || !xkb->names )
return 0;
for( i = 0;
i < XkbNumVirtualMods;
i++ )
{
char* modStr = XGetAtomName( xkb->dpy, xkb->names->vmods[i] );
if( modStr != NULL && strcmp(name, modStr) == 0 )
{
unsigned int mask;
XkbVirtualModsToReal( xkb, 1 << i, &mask );
return mask;
}
}
return 0;
}
unsigned int xkb_numlock_mask()
{
XkbDescPtr xkb;
if(( xkb = XkbGetKeyboard( dpy, XkbAllComponentsMask, XkbUseCoreKbd )) != NULL )
{
unsigned int mask = xkb_mask_modifier( xkb, "NumLock" );
XkbFreeKeyboard( xkb, 0, True );
return mask;
}
return 0;
}
*/
unsigned int xkb_numlock_mask()
{
return XkbKeysymToModifiers (dpy, XK_Num_Lock);
}[/code]
Вы можете выкачать исходники и изменить файл main.c, затем пересобрать пакет командами

[code]./configure

make

checkinstall[/code]

 

Также я выкладываю готовый deb-пакет для numlockx.

numlockx-1.1.1-1_adm64.deb

numlockx-1.1.1-1_i386.deb

Надеюсь, кому-то он сэкономит время и пригодится.

 

8 ответов к “Устраняем проблему numlockx и индикатором Num Lock в Debian Squeeze в графической системе X”

  1. Спасибо, Сергей, за исправление пакета. Применил пакет всё работает. Теперь клавиатура стала функциональнее.

    1. Пожалуйста.
      Клавиатура, по-моему, функциональней как таковая как раз не стала, но лампочка теперь горит

  2. Огромное спасибо! Проконопатился с этой проблемой несколько часов, а в исходники залезть не допетрил 🙂

    1. Да я тоже долго зрел, чтобы в них залезть

  3. Спасибо за сию чудесную вещицу! 🙂 Я уж чуть себе голову не сломал по поводу этой кнопки и лампы.

    1. Пожалуйста 🙂 Я — тоже. Кстати, лампочка у меня иногда таки гаснет. Возможно, виноват мой KVM.

  4. Открыв их, я не увидел знакомых бук, если не считать операторов C++.

    C++ тут и не пахло. 🙂

    1. Я — ламерьё и говнокодер. Простите меня, пожалуйста. Можно я ещё немного посижу в Debian? 🙂

Обсуждение закрыто.

css.php