Quantcast
Channel: Linux — Winreview.ru
Viewing all articles
Browse latest Browse all 34

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

$
0
0

Сегодня мне понадобилась утилита, управляющая статусом клавиши 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

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

 


Viewing all articles
Browse latest Browse all 34

Trending Articles