diff --git a/Xi/exevents.c b/Xi/exevents.c index d57265ede..8615fd456 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -870,8 +870,10 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event) continue; if (!sd->button) continue; - if (button_is_down(sd, key, BUTTON_PROCESSED)) - return DONT_PROCESS; + for (i = 1; i <= sd->button->numButtons; i++) + if (sd->button->map[i] == key && + button_is_down(sd, i, BUTTON_PROCESSED)) + return DONT_PROCESS; } } set_button_up(device, key, BUTTON_PROCESSED); diff --git a/dix/eventconvert.c b/dix/eventconvert.c index dd17898b7..7b894f016 100644 --- a/dix/eventconvert.c +++ b/dix/eventconvert.c @@ -326,14 +326,6 @@ countValuators(DeviceEvent *ev, int *first) { if (BitIsOn(ev->valuators.mask, i)) { - /* Assume mode of first_valuator matches XI1 device mode. Stop when the - * event mode changes since XI1 can't handle mixed mode devices. - */ - if (first_valuator > -1 && - BitIsOn(ev->valuators.mode, i) != - BitIsOn(ev->valuators.mode, first_valuator)) - break; - if (first_valuator == -1) first_valuator = i; last_valuator = i; diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c index 5800700db..ae9592e24 100644 --- a/hw/xfree86/common/xf86Config.c +++ b/hw/xfree86/common/xf86Config.c @@ -1458,14 +1458,15 @@ configInputDevices(XF86ConfLayoutPtr layout, serverLayoutPtr servlayoutp) irp = layout->lay_input_lst; count = 0; while (irp) { - indp[count] = xnfalloc(sizeof(InputInfoRec)); + indp[count] = xf86AllocateInput(); if (!configInput(indp[count], irp->iref_inputdev, X_CONFIG)) { while(count--) free(indp[count]); free(indp); return FALSE; } - indp[count]->options = irp->iref_option_lst; + indp[count]->options = xf86OptionListMerge(indp[count]->options, + irp->iref_option_lst); count++; irp = (XF86ConfInputrefPtr)irp->list.next; } diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index 81bb7070d..c2cf4382c 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -280,7 +280,8 @@ void xf86ProcessCommonOptions(InputInfoPtr pInfo, pointer list) { - if (!xf86SetBoolOption(list, "AlwaysCore", 1) || + if (xf86SetBoolOption(list, "Floating", 0) || + !xf86SetBoolOption(list, "AlwaysCore", 1) || !xf86SetBoolOption(list, "SendCoreEvents", 1) || !xf86SetBoolOption(list, "CorePointer", 1) || !xf86SetBoolOption(list, "CoreKeyboard", 1)) { @@ -652,7 +653,7 @@ IgnoreInputClass(const InputInfoPtr idev, const InputAttributes *attrs) return ignore; } -static InputInfoPtr +InputInfoPtr xf86AllocateInput(void) { InputInfoPtr pInfo; diff --git a/hw/xfree86/common/xf86Xinput.h b/hw/xfree86/common/xf86Xinput.h index 3a1711697..1b0b16f04 100644 --- a/hw/xfree86/common/xf86Xinput.h +++ b/hw/xfree86/common/xf86Xinput.h @@ -155,6 +155,7 @@ extern _X_EXPORT void xf86DisableDevice(DeviceIntPtr dev, Bool panic); extern _X_EXPORT void xf86EnableDevice(DeviceIntPtr dev); /* not exported */ int xf86NewInputDevice(InputInfoPtr pInfo, DeviceIntPtr *pdev, BOOL is_auto); +InputInfoPtr xf86AllocateInput(void); /* xf86Helper.c */ extern _X_EXPORT void xf86AddInputDriver(InputDriverPtr driver, pointer module, int flags); diff --git a/hw/xfree86/doc/devel/Registry b/hw/xfree86/doc/devel/Registry index e09228b04..48e24a2f4 100644 --- a/hw/xfree86/doc/devel/Registry +++ b/hw/xfree86/doc/devel/Registry @@ -243,6 +243,7 @@ DemandLoad O I ?? Device S I Device file name DeviceName S I Input device name FlowControl S I Serial flow control ("xon", "none") +Floating B I Device initialised as floating HistorySize I I ?? MaxX I I Maximum X coordinate MaxY I I Maximum Y coordinate diff --git a/hw/xfree86/doc/man/xorg.conf.man.pre b/hw/xfree86/doc/man/xorg.conf.man.pre index ba876c094..e3fd0eadf 100644 --- a/hw/xfree86/doc/man/xorg.conf.man.pre +++ b/hw/xfree86/doc/man/xorg.conf.man.pre @@ -904,30 +904,42 @@ the server. This affects implied layouts as well as explicit layouts specified in the configuration and/or on the command line. .TP 7 .BI "Option \*qCorePointer\*q" -Deprecated, use -.B SendCoreEvents -instead. +Deprecated, see +.B Floating .TP 7 .BI "Option \*qCoreKeyboard\*q" -Deprecated, use -.B SendCoreEvents -instead. +Deprecated, see +.B Floating .TP 7 .BI "Option \*qAlwaysCore\*q \*q" boolean \*q -.B -Deprecated, use -.B SendCoreEvents -instead. +Deprecated, see +.B Floating .TP 7 .BI "Option \*qSendCoreEvents\*q \*q" boolean \*q -Both of these options are equivalent, and when enabled cause the -input device to report core events through the master device. They are -enabled by default. Any device configured to send core events will be -attached to the virtual core pointer or keyboard and control the cursor by -default. Devices with -.B SendCoreEvents -disabled will be \*qfloating\*q and only accessible by clients employing the -X Input extension. This option controls the startup behavior only, a device +Deprecated, see +.B Floating + +.TP 7 +.BI "Option \*qFloating\*q \*q" boolean \*q +When enabled, the input device is set up floating and does not +report events through any master device or control a cursor. The device is +only available to clients using the X Input Extension API. This option is +disabled by default. +The options +.B CorePointer, +.B CoreKeyboard, +.B AlwaysCore, +and +.B SendCoreEvents, +are the inverse of option +.B Floating +(i.e. +.B SendCoreEvents \*qon\*q +is equivalent to +.B Floating \*qoff\*q +). + +This option controls the startup behavior only, a device may be reattached or set floating at runtime. .PP For pointing devices, the following options control how the pointer diff --git a/mi/mieq.c b/mi/mieq.c index d1441e285..01da52a6c 100644 --- a/mi/mieq.c +++ b/mi/mieq.c @@ -320,6 +320,7 @@ CopyGetMasterEvent(DeviceIntPtr sdev, { DeviceIntPtr mdev; int len = original->any.length; + int type = original->any.type; CHECKEVENT(original); @@ -327,7 +328,12 @@ CopyGetMasterEvent(DeviceIntPtr sdev, if (!sdev || !sdev->u.master) return NULL; - switch(original->any.type) +#if XFreeXDGA + if (type == ET_DGAEvent) + type = original->dga_event.subtype; +#endif + + switch(type) { case ET_KeyPress: case ET_KeyRelease: