Commit d507f606 authored by Peter Hutterer's avatar Peter Hutterer

xfree86: don't FatalError on "too many input devices".

Just ignore devices after MAXDEVICES has been reached, but warn the user that
the devices are ignored.
Signed-off-by: default avatarPeter Hutterer <peter.hutterer@redhat.com>
parent 9bf76146
......@@ -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);
......
......@@ -1322,7 +1322,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();
......
......@@ -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);
......
......@@ -169,7 +169,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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment