В сообщении от 1123947056 секунд после начала Эпохи Strong написал(а):
> Как из программы переключить раскладку клавиатуры: в shell, если
> можно, в perl.
Только используя какую нибудь внешнюю утилиту. Например такую:
/******************* 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). И помните, НИКАКИХ ГАРАНТИЙ! :)