hi,
I eventually got over my previous AddInputHandler puzzling and kept on
reading code until I finished the included rough outline of "useful"
code paths in the XServer.
I am planning to turn this into a real documentation but real life
matters make it unreasonable for me to finish this before the end of
august. As such, I thought some people might find it useful as-is.
Mathieu
--
Mathieu Lacage <[EMAIL PROTECTED]>
main:
-----
xc/programs/Xserver/dix/main.c:main
hw/xfree86/common/xf86Init.c:InitOutput
hw/xfree86/common/xf86Init.c:InitInput
Xserver/dix/dispatch.c:Dispatch
hw/xfree86/common/xf86Events.c:ProcessInputEvents
Xserver/os/WaitFor.c:WaitForSomething
ReadRequestFromClient
result = (* client->requestVector[MAJOROP])(client) which ends in one of the
functions stored in dix/tables.c
dix/dispatch.c:ProcPolyPoint
include/dix.h:VALIDATE_DRAWABLE_AND_GC
ValidateGC
pGC->funcs->ValidateGC
XAAValidateGC
(*pGC->ops->PolyPoint)(pDraw, pGC, stuff->coordMode, npoint,(xPoint *)
&stuff[1]);
InitOutput:
-----------
hw/xfree86/common/xf86config.c:xf86HandleConfig
hw/xfree86/common/xf86Config.c:configLayout
hw/xfree86/common/xf86Config.c:configInput
hw/xfree86/common/xf86Config.c:configInputKbd
set xf86Info.kbdEvents to one of xf86KbdEvents, xf86XqueEvents or
xf86WSKbdEvents.
driver->PreInit
driver/neomagic/neo_driver.c:NEOPreInit
driver/neomagic/neo_2070.c:Neo2070AccelInit
xaa/xaaInit.c:XAAInit
xaa/xaaInitAccel.c:XAAInitAccel (finish intialization of gc->ops)
Xserver/dix/dixutils.c:RegisterBlockAndWakeupHandlers (NoopDDA, xf86Wakeup)
InitInput:
----------
foreach input driver specified in config file
driver->PreInit which ends in
hw/xfree86/input/mouse.c:MousePreInit
hw/xfree86/common/xf86helper.c:xf86AllocateInput
pInfo->read_input = MouseReadInput
pMse->PostEvent = MousePostEvent
foreach input driver registered with xf86AllocateInput
xf86Xinput.c:xf86ActivateDevice
dix/device.c:AddInputDevice
_AddInputDevice
dev->deviceProc = deviceProc;
xf86XinputFinalizeInit
one of RegisterPointerDevice or RegisterKeyboardDevice
device->public.processInputProc = ProcessKeyboardEvent;
device->public.realInputProc = ProcessKeyboardEvent;
device->ActivateGrab = ActivateKeyboardGrab;
device->DeactivateGrab = DeactivateKeyboardGrab;
if (no XInput support)
:mieqInit (register core keyboard and pointer)
else
hw/xfree86/common/xf86XInput.c:xf86eqInit (register core keyboard and pointer)
xf86EventQueue.pKbd = pKbd;
xf86EventQueue.pPtr = pPtr;
ProcessInputEvents:
-------------------
if (no XInput support)
Xserver/mi/mieq.c:mieqProcessInputEvents
else
Xserver/hw/xfree86/common/xf86Xinput.c:xf86eqProcessInputEvents
if (key pressed)
(*xf86EventQueue.pKbd->processInputProc)
Xserver/dix/events.c:ProcessKeyboardEvent
DeliverGrabbedEvent or DeliverDeviceEvent
else if (mouse event)
(*(inputInfo.pointer->public.processInputProc))
Xserver/dix/events.c:ProcessPointerEvent
DeliverGrabbedEvent or DeliverDeviceEvent
DeliverEventsToWindow
TryClientEvents
WriteEventsToClient
Xserver/os/io.c:WriteToClient
ReplyCallback --> used by other pieces of code interested
in the reply going out
if (not enough data)
bufferize
else
FlushClient
xc/lib/xtrans/Xtrans.h:_XSERVTransWritev
xc/lib/xtrans/Xtrans.c:ciptr->transptr->Writev which
ends in
xc/lib/xtrans/Xtranslcl.c:TRANS(LocalWritev)
(local case)
xc/lib/xtrans/Xtranssock.c:TRANS(SocketWritev)
(networked case)
WaitForSomething:
-----------------
while (1) {
Xserver/dix/dixutils.c:ProcessWorkQueue
Xserver/dix/dixutils.c:BlockHandler (invoke each function in the BlockHandler
list with the waittime as param)
hw/xfree86/common/xf86Events.c:xf86Wakeup
if (events) {
xf86Info.kbdEvents which ends in
hw/xfree86/common/xf86Events.c:xf86PostKbdEvent (convert hardware
keycode into X keycode)
ENQUEUE
EqEnqueue
__EqEnqueue
xc/programs/Xserver/hw/xfree86/common/xf86Xinput.c:xf86eqEnqueue
(insert event in
xf86EventQueue.events)
foreach fd which is an input dev, pInfo->read_input which ends in
hw/xfree86/input/mouse.c::MouseReadInput (read data from device, parse
it)
MousePostEvent
MouseDoPostEvent
hw/xfree86/common/xf86Xinput.c:xf86PostButtonEvent or
xf86PostMotionEvent
hw/xfree86/common/xf86Events.c:ENQUEUE
foreach input handler which generated an event,
ih->ihproc
}
Xserver/os/io.c:FlushAllOutput (flush all clients which have no input pending)
Xserver/os/io.c:FlushClient
xc/include/Xpoll.h:Select (maps to select on linux)
Xserver/dix/dixutils.c:WakeupHandler (invoke each function in the BlockHandler
list with the number
of fds which changed of state during Select and
read changed mask)
if (error_during_select) {
CheckConnections
break;
} else {
dix/dixutils.c:QueueWorkProc (EstablishNewConnections)
}
}
EstablishNewConnections:
------------------------
os/connection.c:EstablishNewConnections
os/connection.c:AllocNewConnection
dix/dispatch.c:NextAvailableClient
InitClient
client->requestVector = InitialVector (see dix/tables.c)