summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter@cs.unisa.edu.au>2007-02-15 13:51:20 +1030
committerPeter Hutterer <whot@hyena.localdomain>2007-02-15 13:51:20 +1030
commitf6c3b9fa97ccf85e96f15435d564a1c261e40532 (patch)
tree2400e0f2994f8ff0a582fef85f2b3b80c50e37cb
parent25104ed2e6050f86691104b34eeaf3147eb83c4a (diff)
xfree86: mouse and keyboard hotplugging support. New mouse devices will get
new cursors, keyboard devices use VCP's focus until paired.
-rw-r--r--dix/events.c94
-rw-r--r--hw/xfree86/common/xf86Xinput.c17
-rw-r--r--include/dix.h8
3 files changed, 72 insertions, 47 deletions
diff --git a/dix/events.c b/dix/events.c
index a931e410e..57a356db3 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2043,7 +2043,7 @@ XYToWindow(int x, int y)
return spriteTrace[spriteTraceGood-1];
}
-static Bool
+Bool
CheckMotion(xEvent *xE, DeviceIntPtr pDev)
{
WindowPtr prevSpriteWin;
@@ -2190,61 +2190,65 @@ void ReinitializeRootWindow(WindowPtr win, int xoff, int yoff)
void
DefineInitialRootWindow(register WindowPtr win)
{
- register ScreenPtr pScreen = win->drawable.pScreen;
- SpritePtr pSprite;
DeviceIntPtr pDev = inputInfo.devices;
+#ifdef XEVIE
+ xeviewin = win;
+#endif
+ ROOT = win;
+
while (pDev)
{
if (DevHasCursor(pDev))
- {
- pSprite = pDev->pSprite;
+ InitializeSprite(pDev, win);
+ pDev = pDev->next;
+ }
+}
- pSprite->hotPhys.pScreen = pScreen;
- pSprite->hotPhys.x = pScreen->width / 2;
- pSprite->hotPhys.y = pScreen->height / 2;
- pSprite->hot = pSprite->hotPhys;
- pSprite->hotLimits.x2 = pScreen->width;
- pSprite->hotLimits.y2 = pScreen->height;
-#ifdef XEVIE
- xeviewin =
-#endif
- pSprite->win = win;
- pSprite->current = wCursor (win);
- pSprite->current->refcnt++;
- spriteTraceGood = 1;
- ROOT = win;
- (*pScreen->CursorLimits) ( pDev, pScreen, pSprite->current,
- &pSprite->hotLimits, &pSprite->physLimits);
- pSprite->confined = FALSE;
-
- (*pScreen->ConstrainCursor) (pDev, pScreen,
- &pSprite->physLimits);
- (*pScreen->SetCursorPosition) (pDev, pScreen, pSprite->hot.x,
- pSprite->hot.y,
- FALSE);
- (*pScreen->DisplayCursor) (pDev, pScreen, pSprite->current);
+void
+InitializeSprite(DeviceIntPtr pDev, WindowPtr pWin)
+{
+ SpritePtr pSprite;
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ pSprite = pDev->pSprite;
+ pSprite->hotPhys.pScreen = pScreen;
+ pSprite->hotPhys.x = pScreen->width / 2;
+ pSprite->hotPhys.y = pScreen->height / 2;
+ pSprite->hot = pSprite->hotPhys;
+ pSprite->hotLimits.x2 = pScreen->width;
+ pSprite->hotLimits.y2 = pScreen->height;
+ pSprite->win = pWin;
+ pSprite->current = wCursor (pWin);
+ pSprite->current->refcnt++;
+
+ (*pScreen->CursorLimits) ( pDev, pScreen, pSprite->current,
+ &pSprite->hotLimits, &pSprite->physLimits);
+ pSprite->confined = FALSE;
+
+ (*pScreen->ConstrainCursor) (pDev, pScreen,
+ &pSprite->physLimits);
+ (*pScreen->SetCursorPosition) (pDev, pScreen, pSprite->hot.x,
+ pSprite->hot.y,
+ FALSE);
+ (*pScreen->DisplayCursor) (pDev, pScreen, pSprite->current);
#ifdef PANORAMIX
- if(!noPanoramiXExtension) {
- pSprite->hotLimits.x1 = -panoramiXdataPtr[0].x;
- pSprite->hotLimits.y1 = -panoramiXdataPtr[0].y;
- pSprite->hotLimits.x2 = PanoramiXPixWidth - panoramiXdataPtr[0].x;
- pSprite->hotLimits.y2 = PanoramiXPixHeight - panoramiXdataPtr[0].y;
- pSprite->physLimits = pSprite->hotLimits;
- pSprite->confineWin = NullWindow;
+ if(!noPanoramiXExtension) {
+ pSprite->hotLimits.x1 = -panoramiXdataPtr[0].x;
+ pSprite->hotLimits.y1 = -panoramiXdataPtr[0].y;
+ pSprite->hotLimits.x2 = PanoramiXPixWidth - panoramiXdataPtr[0].x;
+ pSprite->hotLimits.y2 = PanoramiXPixHeight - panoramiXdataPtr[0].y;
+ pSprite->physLimits = pSprite->hotLimits;
+ pSprite->confineWin = NullWindow;
#ifdef SHAPE
- pSprite->hotShape = NullRegion;
+ pSprite->hotShape = NullRegion;
#endif
- pSprite->screen = pScreen;
- /* gotta UNINIT these someplace */
- REGION_NULL(pScreen, &pSprite->Reg1);
- REGION_NULL(pScreen, &pSprite->Reg2);
- }
-#endif
- }
- pDev = pDev->next;
+ pSprite->screen = pScreen;
+ /* gotta UNINIT these someplace */
+ REGION_NULL(pScreen, &pSprite->Reg1);
+ REGION_NULL(pScreen, &pSprite->Reg2);
}
+#endif
}
/*
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 6218b3572..c2ea10825 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -129,7 +129,6 @@ xf86ProcessCommonOptions(LocalDevicePtr local,
xf86SetBoolOption(list, "CorePointer", 0) ||
xf86SetBoolOption(list, "CoreKeyboard", 0)) {
local->flags |= XI86_ALWAYS_CORE;
- local->flags |= XI86_SHARED_POINTER;
xf86Msg(X_CONFIG, "%s: always reports core events\n", local->name);
}
@@ -378,6 +377,16 @@ NewInputDeviceRequest (InputOption *options)
}
}
+ if (!drv) {
+ xf86Msg(X_ERROR, "No input driver specified (ignoring)\n");
+ return BadMatch;
+ }
+
+ if (!idev->identifier) {
+ xf86Msg(X_ERROR, "No device identifier specified (ignoring)\n");
+ return BadMatch;
+ }
+
if (!drv->PreInit) {
xf86Msg(X_ERROR,
"Input driver `%s' has no PreInit function (ignoring)\n",
@@ -407,10 +416,14 @@ NewInputDeviceRequest (InputOption *options)
xf86ActivateDevice(pInfo);
dev = pInfo->dev;
- dev->inited = ((*dev->deviceProc)(dev, DEVICE_INIT) == Success);
+ ActivateDevice(dev);
if (dev->inited && dev->startup)
EnableDevice(dev);
+ /* send enter/leave event, update sprite window */
+ InitializeSprite(dev, GetCurrentRootWindow());
+ CheckMotion(NULL, dev);
+
return Success;
}
diff --git a/include/dix.h b/include/dix.h
index 8e34211c0..1c6b16379 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -494,6 +494,10 @@ extern int DeliverDeviceEvents(
extern void DefineInitialRootWindow(
WindowPtr /* win */);
+extern void InitializeSprite(
+ DeviceIntPtr /* pDev */,
+ WindowPtr /* pWin */);
+
extern void WindowHasNewCursor(
WindowPtr /* pWin */);
@@ -578,6 +582,10 @@ extern int DeliverEvents(
int /*count*/,
WindowPtr /*otherParent*/);
+extern Bool
+CheckMotion(
+ xEvent* /* xE */,
+ DeviceIntPtr /* pDev */);
extern void WriteEventsToClient(
ClientPtr /*pClient*/,