Отправляет email-рассылки с помощью сервиса Sendsay

language auto shift

Как из программы переключить раскладку клавиатуры: в shell, если можно,
в perl.

Ответить   Strong Sat, 13 Aug 2005 18:30:56 +0700 (#417034)

 

Ответы:

В сообщении от 1123947056 секунд после начала Эпохи Strong написал(а):

Только используя какую нибудь внешнюю утилиту. Например такую:

/******************* xkbgroup.c ***************************/
/* xkbgroup - switching between XKB groups */
/* (C) 2005 Konstantin Korikov */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/Xlib.h>
#include <X11/XKBlib.h>

int main (int argc, char **argv) {
Display *dpy;
XkbDescPtr xkb;
XkbStateRec state;
int xkbEventType, xkbError, reason_rtrn, mjr, mnr, new_grp;

if (argc < 2) {
printf("Usage: xkbgroup <number>\n"
" xkbgroup next\n"
" xkbgroup prev\n");
return 1;
}

dpy = XkbOpenDisplay( "", &xkbEventType, &xkbError,
NULL, NULL, &reason_rtrn);
if (!dpy) {
printf("Can't connect to X-server: %s\n", getenv("DISPLAY"));
switch (reason_rtrn) {
case XkbOD_BadLibraryVersion :
case XkbOD_BadServerVersion :
printf("xkbgroup was compiled with XKB version %d.%02d\n",
XkbMajorVersion,XkbMinorVersion);
printf("But %s uses incompatibl eversion %d.%02d\n",
reason_rtrn == XkbOD_BadLibraryVersion ?
"Xlib" : "Xserver", mjr,mnr);
break;
case XkbOD_ConnectionRefused :
printf("Connection refused\n");
break;
case XkbOD_NonXkbServer:
printf("XKB extension not present\n");
break;
default:
printf("Unknown error %d from XkbOpenDisplay\n",
reason_rtrn);
}
exit(1);
}

xkb = XkbGetKeyboard(dpy, XkbControlsMask, XkbUseCoreKbd);
XkbGetControls(dpy, XkbAllControlsMask, xkb);
XkbGetState(dpy, XkbUseCoreKbd, &state);

if (*(argv[1]) >= '0' && *(argv[1]) <= '9')
new_grp = atoi(argv[1]);
else if (!strcmp(argv[1], "next"))
new_grp = state.locked_group + 1;
else if (!strcmp(argv[1], "prev"))
new_grp = state.locked_group - 1;

if (new_grp < 0)
new_grp = xkb->ctrls->num_groups - 1;
else if (new_grp >= xkb->ctrls->num_groups)
new_grp = 0;

XkbLockGroup(dpy, XkbUseCoreKbd, new_grp);

XCloseDisplay(dpy);

return 0;
}
/**********************************************************/

Компилировать так:

$ gcc -L/usr/X11R6/lib -lX11 -I/usr/X11R6/include \
-o xkbgroup xkbgroup.c

Устанавливать так:

# cp xkbgroup /usr/local/bin

Использовать так:

$ xkbgroup 0
$ xkbgroup 1
$ xkbgroup 2
$ xkbgroup next
$ xkbgroup prev

Из Perl:

system('xkbgroup 0');
system('xkbgroup 1');
system('xkbgroup 2');
system('xkbgroup next');
system('xkbgroup prev');

Это мой первый Xlib-хак. Он основан на xxkb (Ivan Pascal) и xkbset
(Stephen Montgomery-Smith). И помните, НИКАКИХ ГАРАНТИЙ! :)

Ответить   Konstantin Korikov Mon, 15 Aug 2005 21:04:53 +0300 (#418206)