スキップしてメイン コンテンツに移動

libX11のキー入力検出時の「¥」と「バックスラッシュ」の判別について

MSXエミュのfMSX2をビルドして自分の環境に摺り合わせてる時に、キー入力の諸々で引っかかって、日本語キーボードでのキー表記と実際の入力される文字との差異が若干あったのを修正している時に、¥記号とバックスラッシュ記号がキー入力で判別されないためどちらか利用頻度の少ないキーを間接入力か何がしかの手でやるようにして諦めろ的な記述が見られたのだが、確かに「xev」とかで見ると「¥」も「バックスラッシュ」も同じ「0x5c」を返してくる。でもGNOMEなりMATEなりのデスクトップ環境ではきちんと「¥」キーは「¥」を表示するし、「\」も同様に「\」が出る。と言うことは、何らかの識別の手段があるはずと思い試しにやってみた。
まず、簡単なキー入力表示プログラムを組んでみる。と言っても「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;
}

参照ここまでーーーーーーーーーーーーーーーーーーー
これを
gcc -Wall -g -O0 `pkg-config --cflags --libs gtk+-2.0`  -lX11 -lm -o "xwinkeytest" "xwinkeytest.c"
とかして、ビルドして実行すると、四角い白い窓が表示されるので、¥キーと\キーを実際に押してみると、押されたキーのキーシンボル名が表示されればOK。終了はESCキーで元の端末に戻れます。元の端末には押されたキーのキーコードが出てるので、うまく出ない場合は、これを元に修正する。

このブログの人気の投稿

IS01文鎮化からの復旧

androidロゴのあと、黒画面で、左下にカーソル状態からの復旧 状態について ※リカバリーキットはインストールしていない(泣 ※adbでPC側からシェルに入れる ※adbでPCからファイルをIS01にプッシュできる ※root権限を奪取できない(泣 ※ベースバンド7 以上、最悪の状況からの脱出に成功 必要な物 psneuter busybox insmod+ msm_nand_ex.ko flash_image recovery_kit.img まず、上記のファイルを用意し adb で、PCからIS01の/data/bootkit 辺りに転送して、一旦電源を落とす。 次に、 IS01の電源を入れる、この時点で正常起動せず、 画面真っ黒、左下でカーソルらしきモノ有りの状態で PC側からadb shellでIS01に入る 一般ユーザープロンプトが出るのが確認できれば、 先ほどのファイルを転送したフォルダに移動  lsとかして、ファイル一覧をだし必要なファイルが揃っているか確認する。 揃っているのが確認できたなら、 ./psneuter とか打ち込んで実行、一旦adb接続が解除されてPC側に戻ってきてれば多分成功、 再度adb shellで接続を試みる。 うまく接続できて、プロンプトがroot権限を表す#になっていれば第一段階クリア root状態で、つぎに書き込み専用 パーティションの呼び出しのために カーネルモジュールを組み込む、 ./insmod+ -f ./msm_nand_ex.ko recovery_wrパーティションが見えるようになったか確認 cat /proc/mtd mtd8,9,10が見えてれば成功 あとは、 ./flash_image recovery_wr ./recovery_kit.img とかして、 リカパリーパーティションにリカバリーキットを書き込み reboot recovery して、リカバリーキットから、破損したsystem,dataをバックアップから復元する。

firefoxの印刷プレビューについて

fedora20/i686 のfirefox29.0.1で印刷プレビューを見ようとすると、ページ自体の表示とプレビューが違うのは、Adblock入れたり、Noscriptでスクリプト抑制したり、UA偽装したりで行儀のよい使い方ではないから文句は言えないのでけれども、問題はプレビュー画面上部のメニュー、「印刷」とか「ページ送り」とかはきちんと見える。印刷終わって閉じるときにギョッとする。「閉じる」が無いです。ウィンドウ右上の「X」でしか閉じれません。「X」クリックはfirefox自体落してそうに錯覚するから精神的によろしくない。小心者の私としてはできれば「閉じる」で閉じたい。 参考までに と、こんな状態 水平1050ドットx縦1680の画面に全画面表示の問題部分のみ抜粋、これ下側に左右送りのスライドバーなんて出ません。この状態で「閉じる」ボタンを出すにはALT+ドラッグでウィンドウを強制移動してウィンドウの横幅を1400ドット前後まで拡張すると出てきてくれる。印刷の度にこれでは、何に対してかは判らないが、激しく負けた気がしてモヤモヤする。 上のキャプチャは元々1680x1050のモニタを90度回転させたサイドモニターでの表示で、メインは1400x1050の画面である。右端にパネルが常駐しているので48ドットほど横幅が小さい状態でのキャプチャが のようになる。これでも「閉じる」が出ない。「縦」「横」ボタンの右隣の「PDFを作成」が曲者で、アドオンの"Print Edit 12.6"の追加したボタンで、これが更に状態を悪化させている。このキャプチャ画面が通常使用のプロファイルのもので、すっかり忘れてたけど久しぶりにfirefoxをプロファイルマネージャーから起動しました。 そこで、何もない空っぽのプロファイルでの表示が こんな感じ、ようやく出てきました「閉じる」ボタン。ですが 水平1050ドットの画面に持っていくと隠れてしまいます。 今時800x600の画面を考慮してほしいなんて言わないけど、タブバーのように、溢れた分のための左右へスライドさせる仕掛けは入れてほしい。