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

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

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

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

apt-get source numlockx

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

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

 

Покопавшись, я обнаружил, что для поиска модификатора клавиши Num Lock в программе используется авторская функция, в которой я до конца не разобрался. Однако, я нагуглил, что для решения этой задачи может использоваться функция XkbKeysymToModifiers. Заменив оригинальный текст на вызов этой функции, я получил работоспособную версию numlockx.

/*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);
}

Вы можете выкачать исходники и изменить файл main.c, затем пересобрать пакет командами

./configure

make

checkinstall

 

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

numlockx-1.1.1-1_adm64.deb

numlockx-1.1.1-1_i386.deb

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

 

Winreview.ru можно найти в Вконтакте, Facebook и Twitter. Присоединяйтесь!

Комментарии

  1. Kirill

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

  2. Сергей Ткаченко

    @Kirill
    Пожалуйста.

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

  3. Евгений

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

  4. Сергей Ткаченко

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

  5. Дед Пахом

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

  6. Сергей Ткаченко

    @Дед Пахом
    Пожалуйста ) Я - тоже. Кстати, лампочка у меня иногда таки гаснет. Возможно, виноват мой KVM.

  7. GP

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

  8. Сергей Ткаченко

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

Написать комментарий