[devel] Xvfb keyboard

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Чт Июл 21 22:25:11 MSD 2005


On Wed, Jul 13, 2005 at 08:06:54AM +0400, Alexey Tourbin wrote:
> > > Под Xvfb не работает XKeysymToKeycode() -- возвращает 0.
> > > Это в процессе запроса на нажатие Alt (keysym=65513).

[...]

> Проблема решилась так:
> 
> --- X11-GUITest-0.20/GUITest.xs-	2004-01-16 23:41:42 +0000
> +++ X11-GUITest-0.20/GUITest.xs	2005-07-13 01:35:14 +0000
> @@ -213,6 +213,15 @@
>  	return( GetKeySym(key, sym) );
>  }
>  
> +/* Xvfb lacks XK_Alt_L; fall back to XK_Meta_L */
> +#define XKeysymToKeycode(display, sym)			\
> +({	Display *d = (display); KeySym s = (sym);	\
> + 	KeyCode kc = (XKeysymToKeycode)(d, s);		\
> + 	if (kc == 0 && s == XK_Alt_L)			\
> + 		kc = (XKeysymToKeycode)(d, XK_Meta_L);	\
> + 	kc;						\
> +})
> +
>  /* Function: PressKeyImp
>   * Description: Presses the key for the specified keysym.  Lower-level
>   * 				implementation.

По поводу клавиатуры у Xvfb меня одолевает нехорошее предчувствие:
XK_Meta_L он тоже плохо понимает.  Всё чудесатее и чудесатее.

Вот пока программка, которая выдает на stderr клавиатурные события.
----------- следующая часть -----------
// gcc -o xkev -Wall xkev.c -L/usr/X11R6/lib -lX11
#include <stdio.h>
#include <assert.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

int main(int argc, char **argv)
{
	Display *d = XOpenDisplay(NULL);
	assert(d);

	int s = XDefaultScreen(d);
	Window w = XCreateSimpleWindow(d,
			XRootWindow(d, s), 0, 0, 320, 240, 0,
			XBlackPixel(d, s), XWhitePixel(d, s));
	assert(w);

	XTextProperty title;
	XStringListToTextProperty(argv, 1, &title);
	XSetWMName(d, w, &title);
	XSetWMIconName(d, w, &title);
	XFree(title.value);

	XSelectInput(d, w, KeyPressMask | KeyReleaseMask);
	XMapWindow(d, w);

	while (1) {
		XEvent ev;
		XNextEvent(d, &ev);

		XKeyEvent *evp = &ev.xkey;
		assert(evp->type == KeyPress || evp->type == KeyRelease);

		char *what = (evp->type == KeyPress) ? "press" : "release";
		unsigned int kc = evp->keycode;
		KeySym ks = XKeycodeToKeysym(d, kc, 0);
		char *str = XKeysymToString(ks);

		fprintf(stderr, "%s	%s	(kc=%u ks=%lu)\n",
				what,	str,	kc, ks);
	}
	return 0;
}
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20050721/6fa18748/attachment-0001.bin>


Подробная информация о списке рассылки Devel