Сегодня мне понадобилась утилита, управляющая статусом клавиши 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.
Надеюсь, кому-то он сэкономит время и пригодится.
💡Узнавайте о новых статьях быстрее. Подпишитесь на наши каналы в Telegram и Twitter.
Спасибо, Сергей, за исправление пакета. Применил пакет всё работает. Теперь клавиатура стала функциональнее.
Пожалуйста.
Клавиатура, по-моему, функциональней как таковая как раз не стала, но лампочка теперь горит
Огромное спасибо! Проконопатился с этой проблемой несколько часов, а в исходники залезть не допетрил 🙂
Да я тоже долго зрел, чтобы в них залезть
Спасибо за сию чудесную вещицу! 🙂 Я уж чуть себе голову не сломал по поводу этой кнопки и лампы.
Пожалуйста 🙂 Я — тоже. Кстати, лампочка у меня иногда таки гаснет. Возможно, виноват мой KVM.
C++ тут и не пахло. 🙂
Я — ламерьё и говнокодер. Простите меня, пожалуйста. Можно я ещё немного посижу в Debian? 🙂