MSXエミュのfMSX2をビルドして自分の環境に摺り合わせてる時に、キー入力の諸々で引っかかって、日本語キーボードでのキー表記と実際の入力される文字との差異が若干あったのを修正している時に、¥記号とバックスラッシュ記号がキー入力で判別されないためどちらか利用頻度の少ないキーを間接入力か何がしかの手でやるようにして諦めろ的な記述が見られたのだが、確かに「xev」とかで見ると「¥」も「バックスラッシュ」も同じ「0x5c」を返してくる。でもGNOMEなりMATEなりのデスクトップ環境ではきちんと「¥」キーは「¥」を表示するし、「\」も同様に「\」が出る。と言うことは、何らかの識別の手段があるはずと思い試しにやってみた。
まず、簡単なキー入力表示プログラムを組んでみる。と言っても「http://www43.atpages.jp/opicon69/xlib/key02.html」 のサンプルプログラムを参照してチョコチョコっと改変してるだけですがね。
以下参照分ーーーーーーーーーーーーーーーーーーーーーーーー
参照ここまでーーーーーーーーーーーーーーーーーーー
これを
gcc -Wall -g -O0 `pkg-config --cflags --libs gtk+-2.0` -lX11 -lm -o "xwinkeytest" "xwinkeytest.c"
とかして、ビルドして実行すると、四角い白い窓が表示されるので、¥キーと\キーを実際に押してみると、押されたキーのキーシンボル名が表示されればOK。終了はESCキーで元の端末に戻れます。元の端末には押されたキーのキーコードが出てるので、うまく出ない場合は、これを元に修正する。
まず、簡単なキー入力表示プログラムを組んでみる。と言っても「http://www43.atpages.jp/opicon69/xlib/key02.html」 のサンプルプログラムを参照してチョコチョコっと改変してるだけですがね。
以下参照分ーーーーーーーーーーーーーーーーーーーーーーーー
#include <x11 lib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <X11/XKBlib.h> //XKeycodeToKeysymの代わりにXkbKeycodeToKeysymを使うため
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
Display *display;
Window window;
XEvent event;
GC gc;
char str[256] = {0};
KeySym keysym;
int quit_flag = 0;
/* Xサーバに接続 */
display = XOpenDisplay(NULL);
/* ウィンドウを生成 */
window = XCreateSimpleWindow(display, DefaultRootWindow(display),
50, 50, 400, 200, 1,
BlackPixel(display, 0),
WhitePixel(display, 0));
XSelectInput(display, window,
KeyPressMask | KeyReleaseMask | ExposureMask);
/* ウィンドウを表示 */
XMapWindow(display, window);
/* GCを生成 */
gc = XCreateGC(display, window, 0, 0);
/* リクエストを送信 */
XFlush(display);
/* イベントループ */
while(!quit_flag){
XNextEvent(display, &event);
switch(event.type){
case Expose:
XDrawString(display, window, gc, 30, 30, str, strlen(str));
break;
case KeyPress:
//keysym = XKeycodeToKeysym(display, event.xkey.keycode, 0);
keysym = XkbKeycodeToKeysym(display, event.xkey.keycode, 0, 0);
switch(keysym){
case XK_Escape: quit_flag = 1; break;
case XK_Delete: strcpy(str, "Delete"); break;
case XK_BackSpace: strcpy(str, "BackSpace"); break;
case XK_Return: strcpy(str, "Return"); break;
case XK_Up: strcpy(str, "Up"); break;
case XK_Down: strcpy(str, "Down"); break;
case XK_Left: strcpy(str, "Left"); break;
case XK_Right: strcpy(str, "Right"); break;
case XK_backslash: // キーシンボルとしてはバックスラッシュとしてしか出ない
printf("%04X\n",event.xkey.keycode); // 私の環境では¥は0x84 \は0x61でしたが、キーボードの種類によっては変わるかも?
if (event.xkey.keycode==0x84) { // 0x84は機種依存の可能性あり
strcpy(str, "YEN SIGN"); break;
} else {
strcpy(str, "Backslash"); break;
}
//case XK_backslash: strcpy(str, "Backslash"); break;
}
XClearArea(display, window, 0, 0, 0, 0, True);
break;
}
}
XCloseDisplay(display);
return 0;
}
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <X11/XKBlib.h> //XKeycodeToKeysymの代わりにXkbKeycodeToKeysymを使うため
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
Display *display;
Window window;
XEvent event;
GC gc;
char str[256] = {0};
KeySym keysym;
int quit_flag = 0;
/* Xサーバに接続 */
display = XOpenDisplay(NULL);
/* ウィンドウを生成 */
window = XCreateSimpleWindow(display, DefaultRootWindow(display),
50, 50, 400, 200, 1,
BlackPixel(display, 0),
WhitePixel(display, 0));
XSelectInput(display, window,
KeyPressMask | KeyReleaseMask | ExposureMask);
/* ウィンドウを表示 */
XMapWindow(display, window);
/* GCを生成 */
gc = XCreateGC(display, window, 0, 0);
/* リクエストを送信 */
XFlush(display);
/* イベントループ */
while(!quit_flag){
XNextEvent(display, &event);
switch(event.type){
case Expose:
XDrawString(display, window, gc, 30, 30, str, strlen(str));
break;
case KeyPress:
//keysym = XKeycodeToKeysym(display, event.xkey.keycode, 0);
keysym = XkbKeycodeToKeysym(display, event.xkey.keycode, 0, 0);
switch(keysym){
case XK_Escape: quit_flag = 1; break;
case XK_Delete: strcpy(str, "Delete"); break;
case XK_BackSpace: strcpy(str, "BackSpace"); break;
case XK_Return: strcpy(str, "Return"); break;
case XK_Up: strcpy(str, "Up"); break;
case XK_Down: strcpy(str, "Down"); break;
case XK_Left: strcpy(str, "Left"); break;
case XK_Right: strcpy(str, "Right"); break;
case XK_backslash: // キーシンボルとしてはバックスラッシュとしてしか出ない
printf("%04X\n",event.xkey.keycode); // 私の環境では¥は0x84 \は0x61でしたが、キーボードの種類によっては変わるかも?
if (event.xkey.keycode==0x84) { // 0x84は機種依存の可能性あり
strcpy(str, "YEN SIGN"); break;
} else {
strcpy(str, "Backslash"); break;
}
//case XK_backslash: strcpy(str, "Backslash"); break;
}
XClearArea(display, window, 0, 0, 0, 0, True);
break;
}
}
XCloseDisplay(display);
return 0;
}
参照ここまでーーーーーーーーーーーーーーーーーーー
これを
gcc -Wall -g -O0 `pkg-config --cflags --libs gtk+-2.0` -lX11 -lm -o "xwinkeytest" "xwinkeytest.c"
とかして、ビルドして実行すると、四角い白い窓が表示されるので、¥キーと\キーを実際に押してみると、押されたキーのキーシンボル名が表示されればOK。終了はESCキーで元の端末に戻れます。元の端末には押されたキーのキーコードが出てるので、うまく出ない場合は、これを元に修正する。