Just ignore devices after MAXDEVICES has been reached, but warn the user that the devices are ignored.
Signed-off-by: Peter Hutterer <[EMAIL PROTECTED]> --- hw/xfree86/common/xf86InPriv.h | 2 +- hw/xfree86/common/xf86Init.c | 4 +++- hw/xfree86/common/xf86Xinput.c | 29 ++++++++++++++++++++++++----- hw/xfree86/common/xf86Xinput.h | 2 +- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/hw/xfree86/common/xf86InPriv.h b/hw/xfree86/common/xf86InPriv.h index 62e4820..3838d69 100644 --- a/hw/xfree86/common/xf86InPriv.h +++ b/hw/xfree86/common/xf86InPriv.h @@ -38,7 +38,7 @@ extern InputDriverPtr *xf86InputDriverList; extern int xf86NumInputDrivers; /* xf86Xinput.c */ -void xf86ActivateDevice(InputInfoPtr pInfo); +int xf86ActivateDevice(InputInfoPtr pInfo); /* xf86Helper.c */ InputDriverPtr xf86LookupInputDriver(const char *name); diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c index a2cccd5..d0408a9 100644 --- a/hw/xfree86/common/xf86Init.c +++ b/hw/xfree86/common/xf86Init.c @@ -1321,7 +1321,9 @@ InitInput(argc, argv) strcpy((*pDev)->driver, "kbd"); } - xf86NewInputDevice(*pDev, &dev, TRUE); + /* If one fails, the others will too */ + if (xf86NewInputDevice(*pDev, &dev, TRUE) == BadAlloc) + break; } mieqInit(); diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index 376af77..89a27c7 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -287,12 +287,13 @@ xf86ProcessCommonOptions(LocalDevicePtr local, /*********************************************************************** * * xf86ActivateDevice -- - * + * * Initialize an input device. * + * Returns TRUE on success, or FALSE otherwise. *********************************************************************** */ -_X_EXPORT void +_X_EXPORT int xf86ActivateDevice(LocalDevicePtr local) { DeviceIntPtr dev; @@ -301,8 +302,13 @@ xf86ActivateDevice(LocalDevicePtr local) dev = AddInputDevice(serverClient, local->device_control, TRUE); if (dev == NULL) - FatalError("Too many input devices"); - + { + xf86Msg(X_ERROR, "Too many input devices. Ignoring %s\n", + local->name); + local->dev = NULL; + return FALSE; + } + local->atom = MakeAtom(local->type_name, strlen(local->type_name), TRUE); @@ -334,6 +340,8 @@ xf86ActivateDevice(LocalDevicePtr local) xf86Msg(X_INFO, "XINPUT: Adding extended input device \"%s\" (type: %s)\n", local->name, local->type_name); } + + return TRUE; } @@ -470,6 +478,13 @@ AddOtherInputDevices() /** * Create a new input device, activate and enable it. * + * Possible return codes: + * BadName .. a bad driver name was supplied. + * BadImplementation ... The driver does not have a PreInit function. This + * is a driver bug. + * BadMatch .. device initialization failed. + * BadAlloc .. too many input devices + * * @param idev The device, already set up with identifier, driver, and the * options. * @param pdev Pointer to the new device, if Success was reported. @@ -519,7 +534,11 @@ xf86NewInputDevice(IDevPtr idev, DeviceIntPtr *pdev, BOOL enable) goto unwind; } - xf86ActivateDevice(pInfo); + if (!xf86ActivateDevice(pInfo)) + { + rval = BadAlloc; + goto unwind; + } dev = pInfo->dev; ActivateDevice(dev); diff --git a/hw/xfree86/common/xf86Xinput.h b/hw/xfree86/common/xf86Xinput.h index aa1f162..3db658b 100644 --- a/hw/xfree86/common/xf86Xinput.h +++ b/hw/xfree86/common/xf86Xinput.h @@ -166,7 +166,7 @@ void xf86PostKeyEvent(DeviceIntPtr device, unsigned int key_code, int is_down, ...); void xf86PostKeyboardEvent(DeviceIntPtr device, unsigned int key_code, int is_down); -void xf86ActivateDevice(LocalDevicePtr local); +int xf86ActivateDevice(LocalDevicePtr local); LocalDevicePtr xf86FirstLocalDevice(void); int xf86ScaleAxis(int Cx, int Sxhigh, int Sxlow, int Rxhigh, int Rxlow); void xf86XInputSetScreen(LocalDevicePtr local, int screen_number, int x, int y); -- 1.6.0.3 Cheers, Peter _______________________________________________ xorg mailing list xorg@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/xorg