キーボード入力の旅/Xサーバとキーボード入力
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
#contents
*はじめに [#b2d6d90b]
ここではキーボード入力に対してウインドウシステムがどうい...
-xorg-server-1.4.2
-xf86-input-keyboard-1.3.1
なお、プラットフォームはLinuxとします。
*読解戦略 [#e7b7de02]
X.Orgは巨大なプログラムです。mainの始めから読んでいくとく...
*PostKbdEvent(xf86-input-keyboard/src/kbd.c) [#tf957829]
キーボードの処理なので当然、xf86-input-keyboardでやってる...
Makefile.am Makefile.in
at_scancode.c
bsd_KbdMap.c bsd_kbd.c bsd_kbd.h
hurd_kbd.c
kbd.c
lnx_KbdMap.c lnx_kbd.c lnx_kbd.h
sco_KbdMap.c sco_kbd.c sco_kbd.h
sun_kbd.c sun_kbd.h sun_kbdMap.c
xf86Keymap.h
xf86OSKbd.h
bsdとかlnxとか付いてるのはOS specificな処理、kbd.cは汎用...
というわけでPostKbdEventで検索するとKbdPreInit関数で設定...
KbdPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
{
InputInfoPtr pInfo;
KbdDevPtr pKbd;
...
pInfo->private = pKbd;
pKbd->PostEvent = PostKbdEvent;
次にPostEventで検索するとInitKBD関数で呼んでますがInitっ...
stdReadInput(InputInfoPtr pInfo)
{
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
unsigned char rBuf[64];
int nBytes, i;
if ((nBytes = read( pInfo->fd, (char *)rBuf, sizeof(...
for (i = 0; i < nBytes; i++)
pKbd->PostEvent(pInfo, rBuf[i] & 0x7f,
rBuf[i] & 0x80 ? FALSE : TRUE);
}
}
続いてstdReadInputを検索するとOpenKeyboard関数で設定され...
OpenKeyboard(InputInfoPtr pInfo)
{
...
pInfo->read_input = stdReadInput;
InputInfoPtrはキーボード特有っぽくないので捜索の手をxorg-...
main (dix/main.c)
→Dispatch (dix/dispatch.c)
→WaitForSomething (os/WaitFor.c)
→WakeupHandler (dix/dixutils.c)
→xf86Wakeup
何かI/O入力
→xf86SIGIO (hw/xfree86/os-support/shared/sigio.c)
→xf86SigioReadInput
というわけで定期的なポーリング or シグナルによりキーボー...
*KbdPreInit(xf86-input-keyboard/src/kbd.c) [#bb752328]
今までで何をトリガーPostKbdEvent関数が呼び出されるかは見...
**KbdPreInitまで [#y9aee5d3]
というわけでKbdPreInitで検索すると以下が引っかかります。
_X_EXPORT InputDriverRec KBD = {
1,
"kbd",
NULL,
KbdPreInit,
NULL,
NULL,
0
};
次にKBDで検索すると、xf86KbdPlug関数が引っかかります。
xf86KbdPlug(pointer module,
pointer options,
int *errmaj,
int *errmin)
{
...
xf86AddInputDriver(&KBD, module, 0);
...
}
そしてすぐ下にxf86KbdPlug関数を含んだkbdModuleDataがあり...
_X_EXPORT XF86ModuleData kbdModuleData = {
&xf86KbdVersionRec,
xf86KbdPlug,
xf86KbdUnplug
};
ではモジュールをロードしてるところをというところなのです...
ModuleDescPtr ret = NULL;
...
strcpy(p, name);
strcat(p, "ModuleData");
initdata = LoaderSymbol(p);
if (initdata) {
ModuleSetupProc setup;
...
setup = initdata->setup;
...
if (setup)
ret->SetupProc = setup;
...
if (ret->SetupProc) {
ret->TearDownData = ret->SetupProc(ret, options, err...
さて、doLoadModuleに至るまでの道ですが以下のようになって...
main (dix/main.c)
→InitOutput (hw/xfree86/common/xf86Init.c)
→xf86LoadModules (hw/xfree86/common/xf86Init.c)
→LoadModule (hw/xfree86/loader/loadmod.c)
→doLoadModule
InitOutput関数はOutputとなってますがxorg.confの読み込みと...
というわけでInputDriverが登録されたわけで、登録したInputD...
InitInput(argc, argv)
{
...
if ((pDrv = xf86LookupInputDriver((*pDev)->d...
...
}
...
pInfo = pDrv->PreInit(pDrv, *pDev, 0);
**xf86OpenConsole [#r7d18028]
次にKbdPreInit関数に進んでデバイスファイル(と思われる)...
s = xf86SetStrOption(pInfo->options, "Device", NULL);
if (s == NULL) {
pInfo->fd = xf86Info.consoleFd;
pKbd->isConsole = TRUE;
次にconsoleFdでgrepするとhw/xfree86/os-support/linux/lnx_...
$ ps a
PID TTY STAT TIME COMMAND
2812 tty7 S<s+ 0:59 /usr/bin/X11/X
ちなみにxf86OpenConsole関数は先ほどのInitOutput関数から呼...
*xf86PostKeyboardEventの先 [#l45561c3]
xf86PostKeyboardEvent関数を呼び出している元を見たので次に...
まず、xf86PostKeyboardEvent(hw/xfree86/common/xf86Xinput....
キューはいつ処理されるのかとmieq.c内を見るとmieqProcessIn...
いろんなとこ
→UpdateCurrentTime (dix/dispatch.c)
→ProcessInputEvents (hw/xfree86/common/xf86Events.c)
→mieqProcessInputEvents (mi/mieq.c)
さて、mieqProcessInputEvents関数にて以下のように呼び出し...
dev->public.processInputProc(e->event, dev, e->nevents);
KbdPreInit関数ではpInfo->devにはNULLを入れてます。このま...
InitInput (hw/xfree86/common/xf86Init.c)
→xf86ActivateDevice (hw/xfree86/common/xf86Xinput.c)
→AddInputDevice (dix/devices.c)
と呼ばれてdevは割り当てられるのですが、processInputProcは...
その後、以下のように呼び出しが行われ、Xクライアントに送る...
ProcessOtherEvent (Xi/exevents.c)
→DeliverDeviceEvents (dix/events.c)
→DeliverEventsToWindow (dix/events.c)
→TryClientEvents (dix/events.c)
→WriteEventsToClient (dix/events.c)
→WriteToClient (os/io.c)
Xクライアントへの送信はいろんなところで呼ばれているFlushA...
/usr/include/X11/Xtrans.h
#ifdef XSERV_t
#define TRANS(func) _XSERVTrans##func
#endif
int TRANS(Writev)(
XtransConnInfo, /* ciptr */
struct iovec *, /* buf */
int /* size */
);
Xtrans.hはあらかじめXSERV_tとかをdefineしてincludeすると_...
_XSERVTransWritev関数の定義はos/xstrans.cにて以下のように...
#include <X11/Xtrans/transport.c>
*余談:xorg-serverのネームスペース [#oaf102d9]
xorg-serverのソースを見ているとdixとかddxとかという単語を...
:dix|Device Independent X
:ddx|Device Dependent X
miは何の略かわかりません。知ってたら教えてください。
*おわりに [#yfbe4c85]
今回はキーボード入力をXサーバがどのように処理しているか見...
-キーボード入力は/dev/tty?から読み取っている
Xクライアントの接続とかクライアントのリクエストとかウイン...
終了行:
#contents
*はじめに [#b2d6d90b]
ここではキーボード入力に対してウインドウシステムがどうい...
-xorg-server-1.4.2
-xf86-input-keyboard-1.3.1
なお、プラットフォームはLinuxとします。
*読解戦略 [#e7b7de02]
X.Orgは巨大なプログラムです。mainの始めから読んでいくとく...
*PostKbdEvent(xf86-input-keyboard/src/kbd.c) [#tf957829]
キーボードの処理なので当然、xf86-input-keyboardでやってる...
Makefile.am Makefile.in
at_scancode.c
bsd_KbdMap.c bsd_kbd.c bsd_kbd.h
hurd_kbd.c
kbd.c
lnx_KbdMap.c lnx_kbd.c lnx_kbd.h
sco_KbdMap.c sco_kbd.c sco_kbd.h
sun_kbd.c sun_kbd.h sun_kbdMap.c
xf86Keymap.h
xf86OSKbd.h
bsdとかlnxとか付いてるのはOS specificな処理、kbd.cは汎用...
というわけでPostKbdEventで検索するとKbdPreInit関数で設定...
KbdPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
{
InputInfoPtr pInfo;
KbdDevPtr pKbd;
...
pInfo->private = pKbd;
pKbd->PostEvent = PostKbdEvent;
次にPostEventで検索するとInitKBD関数で呼んでますがInitっ...
stdReadInput(InputInfoPtr pInfo)
{
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
unsigned char rBuf[64];
int nBytes, i;
if ((nBytes = read( pInfo->fd, (char *)rBuf, sizeof(...
for (i = 0; i < nBytes; i++)
pKbd->PostEvent(pInfo, rBuf[i] & 0x7f,
rBuf[i] & 0x80 ? FALSE : TRUE);
}
}
続いてstdReadInputを検索するとOpenKeyboard関数で設定され...
OpenKeyboard(InputInfoPtr pInfo)
{
...
pInfo->read_input = stdReadInput;
InputInfoPtrはキーボード特有っぽくないので捜索の手をxorg-...
main (dix/main.c)
→Dispatch (dix/dispatch.c)
→WaitForSomething (os/WaitFor.c)
→WakeupHandler (dix/dixutils.c)
→xf86Wakeup
何かI/O入力
→xf86SIGIO (hw/xfree86/os-support/shared/sigio.c)
→xf86SigioReadInput
というわけで定期的なポーリング or シグナルによりキーボー...
*KbdPreInit(xf86-input-keyboard/src/kbd.c) [#bb752328]
今までで何をトリガーPostKbdEvent関数が呼び出されるかは見...
**KbdPreInitまで [#y9aee5d3]
というわけでKbdPreInitで検索すると以下が引っかかります。
_X_EXPORT InputDriverRec KBD = {
1,
"kbd",
NULL,
KbdPreInit,
NULL,
NULL,
0
};
次にKBDで検索すると、xf86KbdPlug関数が引っかかります。
xf86KbdPlug(pointer module,
pointer options,
int *errmaj,
int *errmin)
{
...
xf86AddInputDriver(&KBD, module, 0);
...
}
そしてすぐ下にxf86KbdPlug関数を含んだkbdModuleDataがあり...
_X_EXPORT XF86ModuleData kbdModuleData = {
&xf86KbdVersionRec,
xf86KbdPlug,
xf86KbdUnplug
};
ではモジュールをロードしてるところをというところなのです...
ModuleDescPtr ret = NULL;
...
strcpy(p, name);
strcat(p, "ModuleData");
initdata = LoaderSymbol(p);
if (initdata) {
ModuleSetupProc setup;
...
setup = initdata->setup;
...
if (setup)
ret->SetupProc = setup;
...
if (ret->SetupProc) {
ret->TearDownData = ret->SetupProc(ret, options, err...
さて、doLoadModuleに至るまでの道ですが以下のようになって...
main (dix/main.c)
→InitOutput (hw/xfree86/common/xf86Init.c)
→xf86LoadModules (hw/xfree86/common/xf86Init.c)
→LoadModule (hw/xfree86/loader/loadmod.c)
→doLoadModule
InitOutput関数はOutputとなってますがxorg.confの読み込みと...
というわけでInputDriverが登録されたわけで、登録したInputD...
InitInput(argc, argv)
{
...
if ((pDrv = xf86LookupInputDriver((*pDev)->d...
...
}
...
pInfo = pDrv->PreInit(pDrv, *pDev, 0);
**xf86OpenConsole [#r7d18028]
次にKbdPreInit関数に進んでデバイスファイル(と思われる)...
s = xf86SetStrOption(pInfo->options, "Device", NULL);
if (s == NULL) {
pInfo->fd = xf86Info.consoleFd;
pKbd->isConsole = TRUE;
次にconsoleFdでgrepするとhw/xfree86/os-support/linux/lnx_...
$ ps a
PID TTY STAT TIME COMMAND
2812 tty7 S<s+ 0:59 /usr/bin/X11/X
ちなみにxf86OpenConsole関数は先ほどのInitOutput関数から呼...
*xf86PostKeyboardEventの先 [#l45561c3]
xf86PostKeyboardEvent関数を呼び出している元を見たので次に...
まず、xf86PostKeyboardEvent(hw/xfree86/common/xf86Xinput....
キューはいつ処理されるのかとmieq.c内を見るとmieqProcessIn...
いろんなとこ
→UpdateCurrentTime (dix/dispatch.c)
→ProcessInputEvents (hw/xfree86/common/xf86Events.c)
→mieqProcessInputEvents (mi/mieq.c)
さて、mieqProcessInputEvents関数にて以下のように呼び出し...
dev->public.processInputProc(e->event, dev, e->nevents);
KbdPreInit関数ではpInfo->devにはNULLを入れてます。このま...
InitInput (hw/xfree86/common/xf86Init.c)
→xf86ActivateDevice (hw/xfree86/common/xf86Xinput.c)
→AddInputDevice (dix/devices.c)
と呼ばれてdevは割り当てられるのですが、processInputProcは...
その後、以下のように呼び出しが行われ、Xクライアントに送る...
ProcessOtherEvent (Xi/exevents.c)
→DeliverDeviceEvents (dix/events.c)
→DeliverEventsToWindow (dix/events.c)
→TryClientEvents (dix/events.c)
→WriteEventsToClient (dix/events.c)
→WriteToClient (os/io.c)
Xクライアントへの送信はいろんなところで呼ばれているFlushA...
/usr/include/X11/Xtrans.h
#ifdef XSERV_t
#define TRANS(func) _XSERVTrans##func
#endif
int TRANS(Writev)(
XtransConnInfo, /* ciptr */
struct iovec *, /* buf */
int /* size */
);
Xtrans.hはあらかじめXSERV_tとかをdefineしてincludeすると_...
_XSERVTransWritev関数の定義はos/xstrans.cにて以下のように...
#include <X11/Xtrans/transport.c>
*余談:xorg-serverのネームスペース [#oaf102d9]
xorg-serverのソースを見ているとdixとかddxとかという単語を...
:dix|Device Independent X
:ddx|Device Dependent X
miは何の略かわかりません。知ってたら教えてください。
*おわりに [#yfbe4c85]
今回はキーボード入力をXサーバがどのように処理しているか見...
-キーボード入力は/dev/tty?から読み取っている
Xクライアントの接続とかクライアントのリクエストとかウイン...
ページ名: