亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 2143 | 回復(fù): 0
打印 上一主題 下一主題

xkb ,kernel keycode,xserver keycode, [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-09-03 18:34 |只看該作者 |倒序?yàn)g覽

                偷空幾分鐘寫(xiě)一篇,
關(guān)于鍵盤(pán)這里是比較復(fù)雜的,不同的鍵盤(pán)布局等等,
kernel里面的scancode,make code,breakcode可以參考這里的文檔
http://www.win.tue.nl/~aeb/linux/kbd/scancodes-10.html
關(guān)于kernel keycode到 xserver keycode的轉(zhuǎn)換,
基本上是加8
之前看到一個(gè)網(wǎng)頁(yè)的,忘記地址了,反正是一個(gè)數(shù)組的。
好像記得是這個(gè)郵件
http://lists.freedesktop.org/archives/xorg/2006-June/015589.html
記住范圍是8~255
關(guān)于xkb,這個(gè)是xserver這邊處理非常復(fù)雜的一塊。
xorg, libx11, xkbcomp等等,都要關(guān)注。
xkb的設(shè)置函數(shù)基本都在libx11里面。
關(guān)于鍵值是怎么映射的,
給一個(gè)簡(jiǎn)單的例子,下周又要出征US了,抓緊時(shí)間。
比如我們發(fā)現(xiàn)audio play的鍵值不對(duì),藍(lán)牙控制無(wú)法使用。
最簡(jiǎn)單的說(shuō)明如下
1:kernel里面的驅(qū)動(dòng),比如說(shuō)鍵盤(pán),可能是不標(biāo)準(zhǔn)的鍵盤(pán),報(bào)鍵值164上面,
也就是說(shuō)我們從evbug里面看到是164,到xserver這邊就被轉(zhuǎn)換到了172基本是加8的關(guān)系,
這個(gè)可以從/usr/share/X11/xkb/keycodes/evdev
我們默認(rèn)使用的是這個(gè)keycode,這些都是rules里面定的。
     = 172;    // #define KEY_PLAYPAUSE           164
定義如下,就是
然后到/usr/share/X11/xkb/symbols/inet里面定義的是這樣的
    key    {      [ XF86AudioPlay, XF86AudioPause ] };
就是這個(gè)事件沒(méi)錯(cuò)了。
然后這個(gè)是下面的定義,libx11里面有一個(gè)文件要關(guān)注
root@vax:/mnt/sdb1/qct2/stuff/workspace/work/armv7a-ThunderST-linux-gnueabi/libx11-1_1.2.1-r3/libX11-1.2.1/src#
這里目錄下面是有一個(gè)文件
XKeysymDB
運(yùn)行時(shí)是裝在這里的
/usr/share/X11/XKeysymDB
看看,定義如下
XF86AudioPlay        :1008FF14
XF86AudioStop        :1008FF15
XF86AudioPrev        :1008FF16
XF86AudioNext        :1008FF17
這個(gè)都是系統(tǒng)內(nèi)部的實(shí)現(xiàn),上層應(yīng)用程序是不需要關(guān)注這些的。
我們用的是頭文件
/usr/include/X11/XF86keysym.h
#define XF86XK_AudioPlay    0x1008FF14   /* Start playing of audio >   */
#define XF86XK_AudioStop    0x1008FF15   /* Stop playing audio         */
#define XF86XK_AudioPrev    0x1008FF16   /* Previous track             */
#define XF86XK_AudioNext    0x1008FF17   /* Next track                 */
我們程序用的都是這些key,典型應(yīng)用如下(rhythmbox)
if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPlay) == key->keycode) {
        rb_shell_player_playpause (player, FALSE, NULL);
        return GDK_FILTER_REMOVE;
    } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPause) == key->keycode) {
        rb_shell_player_pause (player, NULL);
        return GDK_FILTER_REMOVE;
    } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioStop) == key->keycode) {
        rb_shell_player_stop (player);
        return GDK_FILTER_REMOVE;
    } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPrev) == key->keycode) {
        rb_shell_player_do_previous (player, NULL);
        return GDK_FILTER_REMOVE;
    } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioNext) == key->keycode) {
        rb_shell_player_do_next (player, NULL);
還有一個(gè)問(wèn)題就是PLAYPAUSE 164和PLAYCD,PAUSECD
有什么區(qū)別,恩,是個(gè)問(wèn)題,不過(guò)我們一版用164,不用PLAYCD(200->208),PAUSECD(201->209)
實(shí)際上定義是一樣
     = 208;    // #define KEY_PLAYCD              200
     = 209;    // #define KEY_PAUSECD             201
     = 174;    // #define KEY_STOPCD              166
     = 175;    // #define KEY_RECORD              167
     = 171;    // #define KEY_NEXTSONG            163
     = 172;    // #define KEY_PLAYPAUSE           164
     = 173;    // #define KEY_PREVIOUSSONG        165
inet里面sym如下
    key    {      [ XF86AudioPlay, XF86AudioPause ] };
    key    {      [ XF86AudioPrev         ]       };
    key    {      [ XF86AudioStop, XF86Eject ]    };
    key    {      [ XF86AudioRecord       ]       };
    key    {      [ XF86AudioRewind       ]       };
    key    {      [ XF86Phone             ]       };
//  key    {      [ ]       }; // KEY_ISO
    key    {      [ XF86Tools             ]       };
    key    {      [ XF86HomePage          ]       };
    key    {      [ XF86Refresh           ]       };
    key    {      [ XF86Close             ]       };
//  key    {      [ ]       }; // KEY_MOVE
//  key    {      [ ]       }; // KEY_EDIT
    key    {      [ XF86ScrollUp          ]       };
    key    {      [ XF86ScrollDown        ]       };
    key    {      [ parenleft             ]       };
    key    {      [ parenright            ]       };
    key    {      [ XF86New               ]       };
    key    {      [ Redo                  ]       };
    key    {      [ XF86AudioPlay         ]       };
    key    {      [ XF86AudioPause        ]       };
區(qū)別就在于play和pause是否有單獨(dú)的按鍵,還是說(shuō)共用一個(gè)按鍵,
另外就是兩個(gè)按鍵的話,反查keycode會(huì)有問(wèn)題。
我記得kdrive是不支持xkb的好像,直接使用的是linux/input.h
下面是一些記錄(數(shù)萬(wàn)字,太長(zhǎng),cut一下,沒(méi)有整理)
1:kernel報(bào)evcode上面比如163
2:rules里面對(duì)應(yīng)/usr/share/X11/xkb/
evdev
     = 171;    // #define KEY_NEXTSONG            163
這里是171
inet里面定義
    key    {      [ XF86AudioNext         ]       };
而keysym是在libx11里面寫(xiě)死的。
root@vax:/mnt/sdb1/qct2/stuff/workspace/work/armv7a-ThunderST-linux-gnueabi/libx11-1_1.2.1-r3/libX11-1.2.1# grep Play * -R
Binary file src/StrKeysym.o matches
src/XKeysymDB:XF86AudioPlay        :1008FF14
src/XKeysymDB:XF86AudioRandomPlay    :1008FF99
Binary file src/.libs/libX11.so.6.2.0 matches
Binary file src/.libs/libX11.a matches
Binary file src/.libs/libX11.so.6 matches
Binary file src/.libs/StrKeysym.o matches
Binary file src/.libs/libX11.so.6.2.0T matches
Binary file src/.libs/libX11.so matches
root@vax:/mnt/sdb1/qct2/stuff/workspace/work/armv7a-ThunderST-linux-gnueabi/libx11-1_1.2.1-r3/libX11-1.2.1#
XF86AudioPlay        :1008FF14
XF86AudioStop        :1008FF15
XF86AudioPrev        :1008FF16
XF86AudioNext        :1008FF17
定義了這些鍵,
而普通的應(yīng)用程序是從上往下使用的,我們使用的代碼會(huì)類似如下
    } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPrev) == key->keycode) {
而這個(gè)宏是給應(yīng)用程序用的。
/usr/include/X11/XF86keysym.h
#define XF86XK_AudioStop    0x1008FF15   /* Stop playing audio         */
#define XF86XK_AudioPrev    0x1008FF16   /* Previous track             */
#define XF86XK_AudioNext    0x1008FF17   /* Next track                 */
這里就對(duì)應(yīng)上了。
/mnt/sdb1/qct2/stuff/workspace/work/armv7a-ThunderST-linux-gnueabi/xproto-1_7.0.15-r0/xproto-7.0.15
是proto里面定義的,編譯X和x的程序都需要的。
libx11編譯的時(shí)候指定這個(gè)。
configure:XKEYSYMDB="${X11_DATADIR}/XKeysymDB"
DB和頭文件必須保持一致。
db文件里面也說(shuō)明了。
rc/StrKeysym.c:#ifndef XKEYSYMDB
src/StrKeysym.c:#define KEYSYMDB XKEYSYMDB
src/StrKeysym.c:    dbname = getenv("XKEYSYMDB");
src/config.h.in:#undef XKEYSYMDB
XrmDatabase
_XInitKeysymDB(void)
{
    if (!initialized)
    {
    const char *dbname;
    XrmInitialize();
    /* use and name of this env var is not part of the standard */
    /* implementation-dependent feature */
    dbname = getenv("XKEYSYMDB");
    if (!dbname)
        dbname = KEYSYMDB;
    keysymdb = XrmGetFileDatabase(dbname);
    if (keysymdb)
        Qkeysym[0] = XrmStringToQuark("Keysym");
    initialized = True;
    }
    return keysymdb;
}
XStringToKeysym里面調(diào)用這個(gè)。
               
               
               
               
               

本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u1/40978/showart_2045015.html
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP