From 3425b16d521b8846b95df2b7d32a548d93341f3b Mon Sep 17 00:00:00 2001 From: marha Date: Sun, 14 Nov 2010 21:29:32 +0000 Subject: xserver pixman libX11 libXext 14/11/2010 --- xorg-server/hw/xfree86/common/Makefile.am | 188 +++++----- xorg-server/hw/xfree86/common/xf86.h | 1 + xorg-server/hw/xfree86/common/xf86Config.c | 147 +++----- xorg-server/hw/xfree86/common/xf86Events.c | 20 + xorg-server/hw/xfree86/common/xf86Globals.c | 5 +- xorg-server/hw/xfree86/common/xf86Helper.c | 107 ++---- xorg-server/hw/xfree86/common/xf86InPriv.h | 89 +++-- xorg-server/hw/xfree86/common/xf86Init.c | 2 +- xorg-server/hw/xfree86/common/xf86Module.h | 2 +- xorg-server/hw/xfree86/common/xf86Opt.h | 1 + xorg-server/hw/xfree86/common/xf86Option.c | 61 ++- xorg-server/hw/xfree86/common/xf86Privstr.h | 4 +- xorg-server/hw/xfree86/common/xf86Xinput.c | 553 +++++++++++++++------------- xorg-server/hw/xfree86/common/xf86Xinput.h | 122 +++--- xorg-server/hw/xfree86/common/xf86str.h | 12 +- 15 files changed, 620 insertions(+), 694 deletions(-) (limited to 'xorg-server/hw/xfree86/common') diff --git a/xorg-server/hw/xfree86/common/Makefile.am b/xorg-server/hw/xfree86/common/Makefile.am index 821a2b500..c4067aa62 100644 --- a/xorg-server/hw/xfree86/common/Makefile.am +++ b/xorg-server/hw/xfree86/common/Makefile.am @@ -1,95 +1,93 @@ -noinst_LTLIBRARIES = libcommon.la - -if XORG_BUS_SPARC -SBUS_SOURCES = xf86sbusBus.c -endif - -if XV -XVSOURCES = xf86xv.c xf86xvmc.c -XVSDKINCS = xf86xv.h xf86xvmc.h xf86xvpriv.h -endif - -if XF86VIDMODE -XF86VMODE_SDK = vidmodeproc.h -endif - -if DGA -DGASOURCES = xf86DGA.c -endif - -XISOURCES = xf86Xinput.c xisb.c -XISDKINCS = xf86Xinput.h xisb.h -RANDRSOURCES = xf86RandR.c - -BUSSOURCES = xf86pciBus.c xf86fbBus.c xf86noBus.c $(SBUS_SOURCES) - -MODEDEFSOURCES = $(srcdir)/vesamodes $(srcdir)/extramodes - -xf86DefModeSet.c: $(srcdir)/modeline2c.awk $(MODEDEFSOURCES) - cat $(MODEDEFSOURCES) | LC_ALL=C $(AWK) -f $(srcdir)/modeline2c.awk > $@ - echo >> $@ - -BUILT_SOURCES = xf86DefModeSet.c - -AM_LDFLAGS = -r -libcommon_la_SOURCES = xf86Configure.c xf86ShowOpts.c xf86Bus.c xf86Config.c \ - xf86Cursor.c $(DGASOURCES) xf86DPMS.c \ - xf86Events.c xf86Globals.c xf86AutoConfig.c \ - xf86Option.c xf86Init.c xf86VGAarbiter.c \ - xf86VidMode.c xf86fbman.c xf86cmap.c \ - xf86Helper.c xf86PM.c xf86Xinput.c xisb.c \ - xf86Mode.c xorgHelper.c \ - $(XVSOURCES) $(BUSSOURCES) $(RANDRSOURCES) -nodist_libcommon_la_SOURCES = xf86DefModeSet.c xf86Build.h -libcommon_la_LIBADD = $(top_builddir)/config/libconfig.la - -INCLUDES = $(XORG_INCS) -I$(srcdir)/../ddc -I$(srcdir)/../i2c \ - -I$(srcdir)/../loader -I$(srcdir)/../parser \ - -I$(srcdir)/../vbe -I$(srcdir)/../int10 \ - -I$(srcdir)/../vgahw -I$(srcdir)/../dixmods/extmod \ - -I$(srcdir)/../modes -I$(srcdir)/../ramdac - -sdk_HEADERS = compiler.h fourcc.h xf86.h xf86Module.h xf86Opt.h \ - xf86PciInfo.h xf86Priv.h xf86Privstr.h \ - xf86cmap.h xf86fbman.h xf86str.h xf86Xinput.h xisb.h \ - $(XVSDKINCS) $(XF86VMODE_SDK) xorgVersion.h \ - xf86sbusBus.h xf86VGAarbiter.h - -DISTCLEANFILES = xf86Build.h -CLEANFILES = $(BUILT_SOURCES) - -EXTRA_DIST = \ - compiler.h \ - fourcc.h \ - scoasm.h \ - vidmodeproc.h \ - xf86.h \ - xf86Bus.h \ - xf86Config.h \ - xf86InPriv.h \ - xf86Module.h \ - xf86Opt.h \ - xf86PciInfo.h \ - xf86Priv.h \ - xf86Privstr.h \ - xf86Xinput.h \ - xf86cmap.h \ - xf86fbman.h \ - xf86pciBus.h \ - xf86str.h \ - xf86xv.h \ - xf86xvmc.h \ - xf86xvpriv.h \ - xisb.h \ - xorgVersion.h \ - $(MODEDEFSOURCES) \ - modeline2c.awk \ - xf86VGAarbiter.h \ - xf86VGAarbiterPriv.h \ - $(DISTKBDSOURCES) - -if LNXACPI -XORG_CFLAGS += -DHAVE_ACPI -endif - -AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS) +noinst_LTLIBRARIES = libcommon.la + +if XORG_BUS_SPARC +SBUS_SOURCES = xf86sbusBus.c +endif + +if XV +XVSOURCES = xf86xv.c xf86xvmc.c +XVSDKINCS = xf86xv.h xf86xvmc.h xf86xvpriv.h +endif + +if XF86VIDMODE +XF86VMODE_SDK = vidmodeproc.h +endif + +if DGA +DGASOURCES = xf86DGA.c +endif + +RANDRSOURCES = xf86RandR.c + +BUSSOURCES = xf86pciBus.c xf86fbBus.c xf86noBus.c $(SBUS_SOURCES) + +MODEDEFSOURCES = $(srcdir)/vesamodes $(srcdir)/extramodes + +xf86DefModeSet.c: $(srcdir)/modeline2c.awk $(MODEDEFSOURCES) + cat $(MODEDEFSOURCES) | LC_ALL=C $(AWK) -f $(srcdir)/modeline2c.awk > $@ + echo >> $@ + +BUILT_SOURCES = xf86DefModeSet.c + +AM_LDFLAGS = -r +libcommon_la_SOURCES = xf86Configure.c xf86ShowOpts.c xf86Bus.c xf86Config.c \ + xf86Cursor.c $(DGASOURCES) xf86DPMS.c \ + xf86Events.c xf86Globals.c xf86AutoConfig.c \ + xf86Option.c xf86Init.c xf86VGAarbiter.c \ + xf86VidMode.c xf86fbman.c xf86cmap.c \ + xf86Helper.c xf86PM.c xf86Xinput.c xisb.c \ + xf86Mode.c xorgHelper.c \ + $(XVSOURCES) $(BUSSOURCES) $(RANDRSOURCES) +nodist_libcommon_la_SOURCES = xf86DefModeSet.c xf86Build.h +libcommon_la_LIBADD = $(top_builddir)/config/libconfig.la + +INCLUDES = $(XORG_INCS) -I$(srcdir)/../ddc -I$(srcdir)/../i2c \ + -I$(srcdir)/../loader -I$(srcdir)/../parser \ + -I$(srcdir)/../vbe -I$(srcdir)/../int10 \ + -I$(srcdir)/../vgahw -I$(srcdir)/../dixmods/extmod \ + -I$(srcdir)/../modes -I$(srcdir)/../ramdac + +sdk_HEADERS = compiler.h fourcc.h xf86.h xf86Module.h xf86Opt.h \ + xf86PciInfo.h xf86Priv.h xf86Privstr.h \ + xf86cmap.h xf86fbman.h xf86str.h xf86Xinput.h xisb.h \ + $(XVSDKINCS) $(XF86VMODE_SDK) xorgVersion.h \ + xf86sbusBus.h xf86VGAarbiter.h + +DISTCLEANFILES = xf86Build.h +CLEANFILES = $(BUILT_SOURCES) + +EXTRA_DIST = \ + compiler.h \ + fourcc.h \ + scoasm.h \ + vidmodeproc.h \ + xf86.h \ + xf86Bus.h \ + xf86Config.h \ + xf86InPriv.h \ + xf86Module.h \ + xf86Opt.h \ + xf86PciInfo.h \ + xf86Priv.h \ + xf86Privstr.h \ + xf86Xinput.h \ + xf86cmap.h \ + xf86fbman.h \ + xf86pciBus.h \ + xf86str.h \ + xf86xv.h \ + xf86xvmc.h \ + xf86xvpriv.h \ + xisb.h \ + xorgVersion.h \ + $(MODEDEFSOURCES) \ + modeline2c.awk \ + xf86VGAarbiter.h \ + xf86VGAarbiterPriv.h \ + $(DISTKBDSOURCES) + +if LNXACPI +XORG_CFLAGS += -DHAVE_ACPI +endif + +AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS) diff --git a/xorg-server/hw/xfree86/common/xf86.h b/xorg-server/hw/xfree86/common/xf86.h index b21bcdf47..68653395b 100644 --- a/xorg-server/hw/xfree86/common/xf86.h +++ b/xorg-server/hw/xfree86/common/xf86.h @@ -203,6 +203,7 @@ extern _X_EXPORT pointer xf86AddGeneralHandler(int fd, InputHandlerProc proc, po extern _X_EXPORT int xf86RemoveGeneralHandler(pointer handler); extern _X_EXPORT void xf86DisableGeneralHandler(pointer handler); extern _X_EXPORT void xf86EnableGeneralHandler(pointer handler); +extern _X_EXPORT InputHandlerProc xf86SetConsoleHandler(InputHandlerProc handler, pointer data); extern _X_EXPORT void xf86InterceptSignals(int *signo); extern _X_EXPORT void xf86InterceptSigIll(void (*sigillhandler)(void)); extern _X_EXPORT Bool xf86EnableVTSwitch(Bool new); diff --git a/xorg-server/hw/xfree86/common/xf86Config.c b/xorg-server/hw/xfree86/common/xf86Config.c index faeda92ee..7d930f0fe 100644 --- a/xorg-server/hw/xfree86/common/xf86Config.c +++ b/xorg-server/hw/xfree86/common/xf86Config.c @@ -63,7 +63,6 @@ #include "xf86pciBus.h" #include "xf86Xinput.h" -extern DeviceAssocRec mouse_assoc; #include "xkbsrv.h" @@ -136,7 +135,7 @@ static Bool configScreen(confScreenPtr screenp, XF86ConfScreenPtr conf_screen, static Bool configMonitor(MonPtr monitorp, XF86ConfMonitorPtr conf_monitor); static Bool configDevice(GDevPtr devicep, XF86ConfDevicePtr conf_device, Bool active); -static Bool configInput(IDevPtr inputp, XF86ConfInputPtr conf_input, +static Bool configInput(InputInfoPtr pInfo, XF86ConfInputPtr conf_input, MessageType from); static Bool configDisplay(DispPtr displayp, XF86ConfDisplayPtr conf_display); static Bool addDefaultModes(MonPtr monitorp); @@ -445,8 +444,8 @@ xf86InputDriverlistFromConfig(void) { int count = 0; char **modulearray; - IDevPtr* idp; - + InputInfoPtr *idp; + /* * make sure the config file has been parsed and that we have a * ModulePath set; if no ModulePath was given, use the default @@ -504,7 +503,6 @@ fixup_video_driver_list(char **drivers) static const char *fallback[4] = { "vesa", "fbdev", "wsfb", NULL }; char **end, **drv; char *x; - char **ati, **atimisc; int i; /* walk to the end of the list */ @@ -743,8 +741,6 @@ static OptionInfoRec FlagOptions[] = { {0}, FALSE }, { FLAG_AIGLX, "AIGLX", OPTV_BOOLEAN, {0}, FALSE }, - { FLAG_ALLOW_EMPTY_INPUT, "AllowEmptyInput", OPTV_BOOLEAN, - {0}, FALSE }, { FLAG_IGNORE_ABI, "IgnoreABI", OPTV_BOOLEAN, {0}, FALSE }, { FLAG_USE_DEFAULT_FONT_PATH, "UseDefaultFontPath", OPTV_BOOLEAN, @@ -955,13 +951,13 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) } #endif - /* AllowEmptyInput is automatically true if we're hotplugging */ - xf86Info.allowEmptyInput = (xf86Info.autoAddDevices && xf86Info.autoEnableDevices); - xf86GetOptValBool(FlagOptions, FLAG_ALLOW_EMPTY_INPUT, &xf86Info.allowEmptyInput); + /* if we're not hotplugging, force some input devices to exist */ + xf86Info.forceInputDevices = !(xf86Info.autoAddDevices && xf86Info.autoEnableDevices); - /* AEI on? Then we're not using kbd, so use the evdev rules set. */ + /* when forcing input devices, we use kbd. otherwise evdev, so use the + * evdev rules set. */ #if defined(linux) - if (xf86Info.allowEmptyInput) + if (!xf86Info.forceInputDevices) set.rules = "evdev"; #endif XkbSetRulesDflts(&set); @@ -1093,12 +1089,12 @@ Bool xf86DRI2Enabled(void) static Bool checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) { - IDevPtr corePointer = NULL, coreKeyboard = NULL; + InputInfoPtr corePointer = NULL, coreKeyboard = NULL; Bool foundPointer = FALSE, foundKeyboard = FALSE; const char *pointerMsg = NULL, *keyboardMsg = NULL; - IDevPtr *devs, /* iterator */ + InputInfoPtr *devs, /* iterator */ indp; - IDevRec Pointer, Keyboard; + InputInfoRec Pointer, Keyboard; XF86ConfInputPtr confInput; XF86ConfInputRec defPtr, defKbd; int count = 0; @@ -1113,49 +1109,27 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) * remove the core attribute from the later ones. */ for (devs = servlayoutp->inputs; devs && *devs; devs++) { - pointer opt1 = NULL, opt2 = NULL; indp = *devs; - if (indp->commonOptions && - xf86CheckBoolOption(indp->commonOptions, "CorePointer", FALSE)) { - opt1 = indp->commonOptions; - } - if (indp->extraOptions && - xf86CheckBoolOption(indp->extraOptions, "CorePointer", FALSE)) { - opt2 = indp->extraOptions; - } - if (opt1 || opt2) { + if (indp->options && + xf86CheckBoolOption(indp->options, "CorePointer", FALSE)) { if (!corePointer) { corePointer = indp; } else { - if (opt1) - xf86ReplaceBoolOption(opt1, "CorePointer", FALSE); - if (opt2) - xf86ReplaceBoolOption(opt2, "CorePointer", FALSE); + xf86ReplaceBoolOption(indp->options, "CorePointer", FALSE); xf86Msg(X_WARNING, "Duplicate core pointer devices. " "Removing core pointer attribute from \"%s\"\n", - indp->identifier); + indp->name); } } - opt1 = opt2 = NULL; - if (indp->commonOptions && - xf86CheckBoolOption(indp->commonOptions, "CoreKeyboard", FALSE)) { - opt1 = indp->commonOptions; - } - if (indp->extraOptions && - xf86CheckBoolOption(indp->extraOptions, "CoreKeyboard", FALSE)) { - opt2 = indp->extraOptions; - } - if (opt1 || opt2) { + if (indp->options && + xf86CheckBoolOption(indp->options, "CoreKeyboard", FALSE)) { if (!coreKeyboard) { coreKeyboard = indp; } else { - if (opt1) - xf86ReplaceBoolOption(opt1, "CoreKeyboard", FALSE); - if (opt2) - xf86ReplaceBoolOption(opt2, "CoreKeyboard", FALSE); + xf86ReplaceBoolOption(indp->options, "CoreKeyboard", FALSE); xf86Msg(X_WARNING, "Duplicate core keyboard devices. " "Removing core keyboard attribute from \"%s\"\n", - indp->identifier); + indp->name); } } count++; @@ -1182,7 +1156,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) if (*devs == corePointer) { free(*devs); - *devs = (IDevPtr)0x1; /* ensure we dont skip next loop*/ + *devs = (InputInfoPtr)0x1; /* ensure we dont skip next loop*/ break; } for (; devs && *devs; devs++) @@ -1200,7 +1174,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) } /* 3. First core pointer device. */ - if (!foundPointer && (!xf86Info.allowEmptyInput || implicitLayout)) { + if (!foundPointer && (xf86Info.forceInputDevices || implicitLayout)) { XF86ConfInputPtr p; for (p = xf86configptr->conf_input_lst; p; p = p->list.next) { @@ -1216,7 +1190,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) } /* 4. First pointer with an allowed mouse driver. */ - if (!foundPointer && !xf86Info.allowEmptyInput) { + if (!foundPointer && xf86Info.forceInputDevices) { const char **driver = mousedrivers; confInput = xf86findInput(CONF_IMPLICIT_POINTER, xf86configptr->conf_input_lst); @@ -1233,7 +1207,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) } /* 5. Built-in default. */ - if (!foundPointer && !xf86Info.allowEmptyInput) { + if (!foundPointer && xf86Info.forceInputDevices) { memset(&defPtr, 0, sizeof(defPtr)); defPtr.inp_identifier = strdup(""); defPtr.inp_driver = strdup("mouse"); @@ -1249,17 +1223,17 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) if (foundPointer) { count++; devs = xnfrealloc(servlayoutp->inputs, - (count + 1) * sizeof(IDevPtr)); - devs[count - 1] = xnfalloc(sizeof(IDevRec)); + (count + 1) * sizeof(InputInfoPtr)); + devs[count - 1] = xnfalloc(sizeof(InputInfoRec)); *devs[count - 1] = Pointer; - devs[count - 1]->extraOptions = + devs[count - 1]->options = xf86addNewOption(NULL, xnfstrdup("CorePointer"), NULL); devs[count] = NULL; servlayoutp->inputs = devs; } } - if (!foundPointer && !xf86Info.allowEmptyInput) { + if (!foundPointer && xf86Info.forceInputDevices) { /* This shouldn't happen. */ xf86Msg(X_ERROR, "Cannot locate a core pointer device.\n"); return FALSE; @@ -1283,7 +1257,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) driver++; } } - if (!found && !xf86Info.allowEmptyInput) { + if (!found && xf86Info.forceInputDevices) { xf86Msg(X_INFO, "No default mouse found, adding one\n"); memset(&defPtr, 0, sizeof(defPtr)); defPtr.inp_identifier = strdup(""); @@ -1293,10 +1267,10 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) if (foundPointer) { count++; devs = xnfrealloc(servlayoutp->inputs, - (count + 1) * sizeof(IDevPtr)); - devs[count - 1] = xnfalloc(sizeof(IDevRec)); + (count + 1) * sizeof(InputInfoPtr)); + devs[count - 1] = xnfalloc(sizeof(InputInfoRec)); *devs[count - 1] = Pointer; - devs[count - 1]->extraOptions = + devs[count - 1]->options = xf86addNewOption(NULL, xnfstrdup("AlwaysCore"), NULL); devs[count] = NULL; servlayoutp->inputs = devs; @@ -1324,7 +1298,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) if (*devs == coreKeyboard) { free(*devs); - *devs = (IDevPtr)0x1; /* ensure we dont skip next loop */ + *devs = (InputInfoPtr)0x1; /* ensure we dont skip next loop */ break; } for (; devs && *devs; devs++) @@ -1342,7 +1316,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) } /* 3. First core keyboard device. */ - if (!foundKeyboard && (!xf86Info.allowEmptyInput || implicitLayout)) { + if (!foundKeyboard && (xf86Info.forceInputDevices || implicitLayout)) { XF86ConfInputPtr p; for (p = xf86configptr->conf_input_lst; p; p = p->list.next) { @@ -1358,7 +1332,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) } /* 4. First keyboard with 'keyboard' or 'kbd' as the driver. */ - if (!foundKeyboard && !xf86Info.allowEmptyInput) { + if (!foundKeyboard && xf86Info.forceInputDevices) { confInput = xf86findInput(CONF_IMPLICIT_KEYBOARD, xf86configptr->conf_input_lst); if (!confInput) { @@ -1373,7 +1347,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) } /* 5. Built-in default. */ - if (!foundKeyboard && !xf86Info.allowEmptyInput) { + if (!foundKeyboard && xf86Info.forceInputDevices) { memset(&defKbd, 0, sizeof(defKbd)); defKbd.inp_identifier = strdup(""); defKbd.inp_driver = strdup("kbd"); @@ -1389,17 +1363,17 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) if (foundKeyboard) { count++; devs = xnfrealloc(servlayoutp->inputs, - (count + 1) * sizeof(IDevPtr)); - devs[count - 1] = xnfalloc(sizeof(IDevRec)); + (count + 1) * sizeof(InputInfoPtr)); + devs[count - 1] = xnfalloc(sizeof(InputInfoRec)); *devs[count - 1] = Keyboard; - devs[count - 1]->extraOptions = + devs[count - 1]->options = xf86addNewOption(NULL, xnfstrdup("CoreKeyboard"), NULL); devs[count] = NULL; servlayoutp->inputs = devs; } } - if (!foundKeyboard && !xf86Info.allowEmptyInput) { + if (!foundKeyboard && xf86Info.forceInputDevices) { /* This shouldn't happen. */ xf86Msg(X_ERROR, "Cannot locate a core keyboard device.\n"); return FALSE; @@ -1425,7 +1399,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) "\tUsing the %s.\n", keyboardMsg); } - if (xf86Info.allowEmptyInput && !(foundPointer && foundKeyboard)) { + if (!xf86Info.forceInputDevices && !(foundPointer && foundKeyboard)) { #if defined(CONFIG_HAL) || defined(CONFIG_UDEV) const char *config_backend; #if defined(CONFIG_HAL) @@ -1438,8 +1412,10 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) "reconfigure %s or disable AutoAddDevices.\n", config_backend, config_backend); #else - xf86Msg(X_INFO, "Hotplugging is disabled and no input devices were configured.\n" - "\tTry disabling AllowEmptyInput.\n"); + xf86Msg(X_WARNING, "Hotplugging requested but the server was " + "compiled without a config backend. " + "No input devices were configured, the server " + "will start without any input devices.\n"); #endif } @@ -1464,7 +1440,7 @@ static Bool configInputDevices(XF86ConfLayoutPtr layout, serverLayoutPtr servlayoutp) { XF86ConfInputrefPtr irp; - IDevPtr *indp; + InputInfoPtr *indp; int count = 0; /* @@ -1477,19 +1453,19 @@ configInputDevices(XF86ConfLayoutPtr layout, serverLayoutPtr servlayoutp) } DebugF("Found %d input devices in the layout section %s\n", count, layout->lay_identifier); - indp = xnfcalloc((count + 1), sizeof(IDevPtr)); + indp = xnfcalloc((count + 1), sizeof(InputInfoPtr)); indp[count] = NULL; irp = layout->lay_input_lst; count = 0; while (irp) { - indp[count] = xnfalloc(sizeof(IDevRec)); + indp[count] = xnfalloc(sizeof(InputInfoRec)); if (!configInput(indp[count], irp->iref_inputdev, X_CONFIG)) { while(count--) free(indp[count]); free(indp); return FALSE; } - indp[count]->extraOptions = irp->iref_option_lst; + indp[count]->options = irp->iref_option_lst; count++; irp = (XF86ConfInputrefPtr)irp->list.next; } @@ -1712,7 +1688,7 @@ configImpliedLayout(serverLayoutPtr servlayoutp, XF86ConfScreenPtr conf_screen, MessageType from; XF86ConfScreenPtr s; screenLayoutPtr slp; - IDevPtr *indp; + InputInfoPtr *indp; XF86ConfLayoutRec layout; if (!servlayoutp) @@ -1758,7 +1734,7 @@ configImpliedLayout(serverLayoutPtr servlayoutp, XF86ConfScreenPtr conf_screen, from = X_DEFAULT; } else { /* Set up an empty input device list, then look for some core devices. */ - indp = xnfalloc(sizeof(IDevPtr)); + indp = xnfalloc(sizeof(InputInfoPtr)); *indp = NULL; servlayoutp->inputs = indp; } @@ -2211,7 +2187,6 @@ configDevice(GDevPtr devicep, XF86ConfDevicePtr conf_device, Bool active) static void configDRI(XF86ConfDRIPtr drip) { - int i; struct group *grp; xf86ConfigDRI.group = -1; @@ -2283,13 +2258,12 @@ configExtensions(XF86ConfExtensionsPtr conf_ext) } static Bool -configInput(IDevPtr inputp, XF86ConfInputPtr conf_input, MessageType from) +configInput(InputInfoPtr inputp, XF86ConfInputPtr conf_input, MessageType from) { xf86Msg(from, "|-->Input Device \"%s\"\n", conf_input->inp_identifier); - inputp->identifier = conf_input->inp_identifier; + inputp->name = conf_input->inp_identifier; inputp->driver = conf_input->inp_driver; - inputp->commonOptions = conf_input->inp_option_lst; - inputp->extraOptions = NULL; + inputp->options = conf_input->inp_option_lst; inputp->attrs = NULL; return TRUE; @@ -2338,12 +2312,13 @@ static void checkInput(serverLayoutPtr layout, Bool implicit_layout) { checkCoreInputDevices(layout, implicit_layout); - /* AllowEmptyInput and the "kbd" and "mouse" drivers are mutually - * exclusive. Trawl the list for mouse/kbd devices and disable them. + /* Unless we're forcing input devices, disable mouse/kbd devices in the + * config. Otherwise the same physical device is added multiple times, + * leading to duplicate events. */ - if (xf86Info.allowEmptyInput && layout->inputs) + if (!xf86Info.forceInputDevices && layout->inputs) { - IDevPtr *dev = layout->inputs; + InputInfoPtr *dev = layout->inputs; BOOL warned = FALSE; while(*dev) @@ -2352,15 +2327,15 @@ checkInput(serverLayoutPtr layout, Bool implicit_layout) { strcmp((*dev)->driver, "mouse") == 0 || strcmp((*dev)->driver, "vmmouse") == 0) { - IDevPtr *current; + InputInfoPtr *current; if (!warned) { - xf86Msg(X_WARNING, "AllowEmptyInput is on, devices using " + xf86Msg(X_WARNING, "Hotplugging is on, devices using " "drivers 'kbd', 'mouse' or 'vmmouse' will be disabled.\n"); warned = TRUE; } - xf86Msg(X_WARNING, "Disabling %s\n", (*dev)->identifier); + xf86Msg(X_WARNING, "Disabling %s\n", (*dev)->name); current = dev; free(*dev); diff --git a/xorg-server/hw/xfree86/common/xf86Events.c b/xorg-server/hw/xfree86/common/xf86Events.c index 87555f31f..004807483 100644 --- a/xorg-server/hw/xfree86/common/xf86Events.c +++ b/xorg-server/hw/xfree86/common/xf86Events.c @@ -600,6 +600,26 @@ xf86AddGeneralHandler(int fd, InputHandlerProc proc, pointer data) return ih; } +/** + * Set the handler for the console's fd. Replaces (and returns) the previous + * handler or NULL, whichever appropriate. + * proc may be NULL if the server should not handle events on the console. + */ +InputHandlerProc +xf86SetConsoleHandler(InputHandlerProc proc, pointer data) +{ + static InputHandlerProc handler = NULL; + InputHandlerProc old_handler = handler; + + if (old_handler) + xf86RemoveGeneralHandler(old_handler); + + xf86AddGeneralHandler(xf86Info.consoleFd, proc, data); + handler = proc; + + return old_handler; +} + static void removeInputHandler(IHPtr ih) { diff --git a/xorg-server/hw/xfree86/common/xf86Globals.c b/xorg-server/hw/xfree86/common/xf86Globals.c index c8534132a..0b0931408 100644 --- a/xorg-server/hw/xfree86/common/xf86Globals.c +++ b/xorg-server/hw/xfree86/common/xf86Globals.c @@ -125,15 +125,14 @@ xf86InfoRec xf86Info = { #endif .pmFlag = TRUE, .log = LogNone, - .kbdCustomKeycodes = FALSE, .disableRandR = FALSE, .randRFrom = X_DEFAULT, #if defined(CONFIG_HAL) || defined(CONFIG_UDEV) - .allowEmptyInput = TRUE, + .forceInputDevices = FALSE, .autoAddDevices = TRUE, .autoEnableDevices = TRUE #else - .allowEmptyInput = FALSE, + .forceInputDevices = TRUE, .autoAddDevices = FALSE, .autoEnableDevices = FALSE #endif diff --git a/xorg-server/hw/xfree86/common/xf86Helper.c b/xorg-server/hw/xfree86/common/xf86Helper.c index e4d07ec12..abb198690 100644 --- a/xorg-server/hw/xfree86/common/xf86Helper.c +++ b/xorg-server/hw/xfree86/common/xf86Helper.c @@ -273,72 +273,6 @@ xf86AllocateScrnInfoPrivateIndex(void) return idx; } -/* Allocate a new InputInfoRec and append it to the tail of xf86InputDevs. */ -InputInfoPtr -xf86AllocateInput(InputDriverPtr drv, int flags) -{ - InputInfoPtr new, *prev = NULL; - - if (!(new = calloc(sizeof(InputInfoRec), 1))) - return NULL; - - new->drv = drv; - new->module = DuplicateModule(drv->module, NULL); - - for (prev = &xf86InputDevs; *prev; prev = &(*prev)->next) - ; - - *prev = new; - new->next = NULL; - - return new; -} - - -/* - * Remove an entry from xf86InputDevs. Ideally it should free all allocated - * data. To do this properly may require a driver hook. - */ - -void -xf86DeleteInput(InputInfoPtr pInp, int flags) -{ - InputInfoPtr p; - - /* First check if the inputdev is valid. */ - if (pInp == NULL) - return; - -#if 0 - /* If a free function is defined, call it here. */ - if (pInp->free) - pInp->free(pInp, 0); -#endif - - if (pInp->module) - UnloadModule(pInp->module); - - /* This should *really* be handled in drv->UnInit(dev) call instead, but - * if the driver forgets about it make sure we free it or at least crash - * with flying colors */ - free(pInp->private); - - FreeInputAttributes(pInp->attrs); - - /* Remove the entry from the list. */ - if (pInp == xf86InputDevs) - xf86InputDevs = pInp->next; - else { - p = xf86InputDevs; - while (p && p->next != pInp) - p = p->next; - if (p) - p->next = pInp->next; - /* Else the entry wasn't in the xf86InputDevs list (ignore this). */ - } - free(pInp); -} - Bool xf86AddPixFormat(ScrnInfoPtr pScrn, int depth, int bpp, int pad) { @@ -1247,6 +1181,43 @@ xf86DrvMsg(int scrnIndex, MessageType type, const char *format, ...) va_end(ap); } +/* Print input driver messages in the standard format of + : : */ +void +xf86VIDrvMsgVerb(InputInfoPtr dev, MessageType type, int verb, const char *format, + va_list args) +{ + char *msg; + + msg = Xprintf("%s: %s: %s", dev->drv->driverName, dev->name, format); + LogVMessageVerb(type, verb, "%s", msg); + free(msg); +} + +/* Print input driver message, with verbose level specified directly */ +void +xf86IDrvMsgVerb(InputInfoPtr dev, MessageType type, int verb, const char *format, + ...) +{ + va_list ap; + + va_start(ap, format); + xf86VIDrvMsgVerb(dev, type, verb, format, ap); + va_end(ap); +} + +/* Print input driver messages, with verbose level of 1 (default) */ +void +xf86IDrvMsg(InputInfoPtr dev, MessageType type, const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + xf86VIDrvMsgVerb(dev, type, 1, format, ap); + va_end(ap); +} + + /* Print non-driver messages with verbose level specified directly */ void xf86MsgVerb(MessageType type, int verb, const char *format, ...) @@ -2070,7 +2041,7 @@ xf86IsUnblank(int mode) } void -xf86MotionHistoryAllocate(LocalDevicePtr local) +xf86MotionHistoryAllocate(InputInfoPtr pInfo) { - AllocateMotionHistory(local->dev); + AllocateMotionHistory(pInfo->dev); } diff --git a/xorg-server/hw/xfree86/common/xf86InPriv.h b/xorg-server/hw/xfree86/common/xf86InPriv.h index 3838d6940..15fef4320 100644 --- a/xorg-server/hw/xfree86/common/xf86InPriv.h +++ b/xorg-server/hw/xfree86/common/xf86InPriv.h @@ -1,46 +1,43 @@ - -/* - * Copyright (c) 1999 by The XFree86 Project, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * Except as contained in this notice, the name of the copyright holder(s) - * and author(s) shall not be used in advertising or otherwise to promote - * the sale, use or other dealings in this Software without prior written - * authorization from the copyright holder(s) and author(s). - */ - -#ifdef HAVE_XORG_CONFIG_H -#include -#endif - -#ifndef _xf86InPriv_h -#define _xf86InPriv_h - -/* xf86Globals.c */ -extern InputDriverPtr *xf86InputDriverList; -extern int xf86NumInputDrivers; - -/* xf86Xinput.c */ -int xf86ActivateDevice(InputInfoPtr pInfo); - -/* xf86Helper.c */ -InputDriverPtr xf86LookupInputDriver(const char *name); - -#endif /* _xf86InPriv_h */ + +/* + * Copyright (c) 1999 by The XFree86 Project, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name of the copyright holder(s) + * and author(s) shall not be used in advertising or otherwise to promote + * the sale, use or other dealings in this Software without prior written + * authorization from the copyright holder(s) and author(s). + */ + +#ifdef HAVE_XORG_CONFIG_H +#include +#endif + +#ifndef _xf86InPriv_h +#define _xf86InPriv_h + +/* xf86Globals.c */ +extern InputDriverPtr *xf86InputDriverList; +extern int xf86NumInputDrivers; + +/* xf86Helper.c */ +InputDriverPtr xf86LookupInputDriver(const char *name); + +#endif /* _xf86InPriv_h */ diff --git a/xorg-server/hw/xfree86/common/xf86Init.c b/xorg-server/hw/xfree86/common/xf86Init.c index ab5b5a34d..aee1e8e33 100644 --- a/xorg-server/hw/xfree86/common/xf86Init.c +++ b/xorg-server/hw/xfree86/common/xf86Init.c @@ -814,7 +814,7 @@ InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv) void InitInput(int argc, char **argv) { - IDevPtr* pDev; + InputInfoPtr* pDev; DeviceIntPtr dev; xf86Info.vtRequestsPending = FALSE; diff --git a/xorg-server/hw/xfree86/common/xf86Module.h b/xorg-server/hw/xfree86/common/xf86Module.h index 266a4dafe..9335e116f 100644 --- a/xorg-server/hw/xfree86/common/xf86Module.h +++ b/xorg-server/hw/xfree86/common/xf86Module.h @@ -83,7 +83,7 @@ typedef enum { */ #define ABI_ANSIC_VERSION SET_ABI_VERSION(0, 4) #define ABI_VIDEODRV_VERSION SET_ABI_VERSION(9, 0) -#define ABI_XINPUT_VERSION SET_ABI_VERSION(11, 0) +#define ABI_XINPUT_VERSION SET_ABI_VERSION(12, 0) #define ABI_EXTENSION_VERSION SET_ABI_VERSION(4, 0) #define ABI_FONT_VERSION SET_ABI_VERSION(0, 6) diff --git a/xorg-server/hw/xfree86/common/xf86Opt.h b/xorg-server/hw/xfree86/common/xf86Opt.h index 3af4b4069..5ce320891 100644 --- a/xorg-server/hw/xfree86/common/xf86Opt.h +++ b/xorg-server/hw/xfree86/common/xf86Opt.h @@ -84,6 +84,7 @@ extern _X_EXPORT pointer xf86NewOption(char *name, char *value ); extern _X_EXPORT pointer xf86NextOption(pointer list ); extern _X_EXPORT pointer xf86OptionListCreate(const char **options, int count, int used); extern _X_EXPORT pointer xf86OptionListMerge(pointer head, pointer tail); +extern _X_EXPORT pointer xf86OptionListDuplicate(pointer list); extern _X_EXPORT void xf86OptionListFree(pointer opt); extern _X_EXPORT char *xf86OptionName(pointer opt); extern _X_EXPORT char *xf86OptionValue(pointer opt); diff --git a/xorg-server/hw/xfree86/common/xf86Option.c b/xorg-server/hw/xfree86/common/xf86Option.c index 8dce3ad0f..97deb1436 100644 --- a/xorg-server/hw/xfree86/common/xf86Option.c +++ b/xorg-server/hw/xfree86/common/xf86Option.c @@ -118,58 +118,43 @@ xf86CollectOptions(ScrnInfoPtr pScrn, pointer extraOpts) } /* - * xf86CollectInputOptions collects the options for an InputDevice. - * This function requires that the following has been initialised: - * - * pInfo->conf_idev - * - * The extraOpts parameter may optionally contain a list of additional options - * to include. - * - * The order of precedence for options is: - * - * extraOpts, pInfo->conf_idev->extraOptions, - * pInfo->conf_idev->commonOptions, defaultOpts + * xf86CollectInputOptions collects extra options for an InputDevice (other + * than those added by the config backend). + * The options are merged into the existing ones and thus take precedence + * over the others. */ void -xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts, - pointer extraOpts) +xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts) { - XF86OptionPtr tmp; - XF86OptionPtr extras = (XF86OptionPtr)extraOpts; - - pInfo->options = NULL; if (defaultOpts) { - pInfo->options = xf86OptionListCreate(defaultOpts, -1, 0); - } - if (pInfo->conf_idev && pInfo->conf_idev->commonOptions) { - tmp = xf86optionListDup(pInfo->conf_idev->commonOptions); - if (pInfo->options) - pInfo->options = xf86optionListMerge(pInfo->options, tmp); - else - pInfo->options = tmp; - } - if (pInfo->conf_idev && pInfo->conf_idev->extraOptions) { - tmp = xf86optionListDup(pInfo->conf_idev->extraOptions); - if (pInfo->options) - pInfo->options = xf86optionListMerge(pInfo->options, tmp); - else - pInfo->options = tmp; - } - if (extras) { - tmp = xf86optionListDup(extras); + XF86OptionPtr tmp =xf86optionListCreate(defaultOpts, -1, 0); if (pInfo->options) pInfo->options = xf86optionListMerge(pInfo->options, tmp); else pInfo->options = tmp; } +} - if (pInfo->conf_idev && pInfo->conf_idev->attrs) { - pInfo->attrs = pInfo->conf_idev->attrs; +/** + * Duplicate the option list passed in. The returned pointer will be a newly + * allocated option list and must be freed by the caller. + */ +pointer +xf86OptionListDuplicate(pointer options) +{ + pointer o = NULL; + + while (options) + { + o = xf86AddNewOption(o, xf86OptionName(options), xf86OptionValue(options)); + options = xf86nextOption(options); } + + return o; } + /* Created for new XInput stuff -- essentially extensions to the parser */ static int diff --git a/xorg-server/hw/xfree86/common/xf86Privstr.h b/xorg-server/hw/xfree86/common/xf86Privstr.h index 6138b6bec..66a73d32b 100644 --- a/xorg-server/hw/xfree86/common/xf86Privstr.h +++ b/xorg-server/hw/xfree86/common/xf86Privstr.h @@ -96,7 +96,6 @@ typedef struct { #endif Bool pmFlag; Log log; - Bool kbdCustomKeycodes; Bool disableRandR; MessageType randRFrom; Bool aiglx; @@ -108,8 +107,7 @@ typedef struct { MessageType useDefaultFontPathFrom; Bool ignoreABI; - Bool allowEmptyInput; /* Allow the server to start with no input - * devices. */ + Bool forceInputDevices; /* force xorg.conf or built-in input devices */ Bool autoAddDevices; /* Whether to succeed NIDR, or ignore. */ Bool autoEnableDevices; /* Whether to enable, or let the client * control. */ diff --git a/xorg-server/hw/xfree86/common/xf86Xinput.c b/xorg-server/hw/xfree86/common/xf86Xinput.c index 3542abd4a..e90268a06 100644 --- a/xorg-server/hw/xfree86/common/xf86Xinput.c +++ b/xorg-server/hw/xfree86/common/xf86Xinput.c @@ -59,23 +59,15 @@ #include "xf86Priv.h" #include "xf86Config.h" #include "xf86Xinput.h" -#include "XIstubs.h" #include "xf86Optrec.h" -#include "xf86Parser.h" #include "mipointer.h" -#include "xf86InPriv.h" -#include "compiler.h" #include "extinit.h" #include "loaderProcs.h" -#ifdef DPMSExtension -#include -#include "dpmsproc.h" -#endif - #include "exevents.h" /* AddInputDevice */ #include "exglobals.h" #include "eventstr.h" +#include "inpututils.h" #include /* InputClassMatches */ #ifdef HAVE_FNMATCH_H @@ -85,15 +77,9 @@ #include #endif -#include "extnsionst.h" - -#include "windowstr.h" /* screenIsSaved */ - #include #include /* for int64_t */ -#include - #include "mi.h" #include /* dix pointer acceleration */ @@ -105,10 +91,19 @@ #include "xkbsrv.h" -#include "os.h" +/* Valuator verification macro */ +#define XI_VERIFY_VALUATORS(num_valuators) \ + if (num_valuators > MAX_VALUATORS) { \ + xf86Msg(X_ERROR, "%s: num_valuator %d is greater than" \ + " MAX_VALUATORS\n", __FUNCTION__, num_valuators); \ + return; \ + } EventListPtr xf86Events = NULL; +static int +xf86InputDevicePostInit(DeviceIntPtr dev); + /** * Eval config and modify DeviceVelocityRec accordingly */ @@ -203,11 +198,11 @@ static void ApplyAccelerationSettings(DeviceIntPtr dev){ int scheme, i; DeviceVelocityPtr pVel; - LocalDevicePtr local = (LocalDevicePtr)dev->public.devicePrivate; + InputInfoPtr pInfo = (InputInfoPtr)dev->public.devicePrivate; char* schemeStr; if (dev->valuator && dev->ptrfeed) { - schemeStr = xf86SetStrOption(local->options, "AccelerationScheme", ""); + schemeStr = xf86SetStrOption(pInfo->options, "AccelerationScheme", ""); scheme = dev->valuator->accelScheme.number; @@ -228,15 +223,15 @@ ApplyAccelerationSettings(DeviceIntPtr dev){ if (InitPointerAccelerationScheme(dev, scheme)) { xf86Msg(X_CONFIG, "%s: (accel) selected scheme %s/%i\n", - local->name, schemeStr, scheme); + pInfo->name, schemeStr, scheme); } else { xf86Msg(X_CONFIG, "%s: (accel) could not init scheme %s\n", - local->name, schemeStr); + pInfo->name, schemeStr); scheme = dev->valuator->accelScheme.number; } } else { xf86Msg(X_CONFIG, "%s: (accel) keeping acceleration scheme %i\n", - local->name, scheme); + pInfo->name, scheme); } free(schemeStr); @@ -245,45 +240,34 @@ ApplyAccelerationSettings(DeviceIntPtr dev){ switch (scheme) { case PtrAccelPredictable: pVel = GetDevicePredictableAccelData(dev); - ProcessVelocityConfiguration (dev, local->name, local->options, + ProcessVelocityConfiguration (dev, pInfo->name, pInfo->options, pVel); break; } - i = xf86SetIntOption(local->options, "AccelerationNumerator", + i = xf86SetIntOption(pInfo->options, "AccelerationNumerator", dev->ptrfeed->ctrl.num); if (i >= 0) dev->ptrfeed->ctrl.num = i; - i = xf86SetIntOption(local->options, "AccelerationDenominator", + i = xf86SetIntOption(pInfo->options, "AccelerationDenominator", dev->ptrfeed->ctrl.den); if (i > 0) dev->ptrfeed->ctrl.den = i; - i = xf86SetIntOption(local->options, "AccelerationThreshold", + i = xf86SetIntOption(pInfo->options, "AccelerationThreshold", dev->ptrfeed->ctrl.threshold); if (i >= 0) dev->ptrfeed->ctrl.threshold = i; xf86Msg(X_CONFIG, "%s: (accel) acceleration factor: %.3f\n", - local->name, ((float)dev->ptrfeed->ctrl.num)/ + pInfo->name, ((float)dev->ptrfeed->ctrl.num)/ ((float)dev->ptrfeed->ctrl.den)); xf86Msg(X_CONFIG, "%s: (accel) acceleration threshold: %i\n", - local->name, dev->ptrfeed->ctrl.threshold); + pInfo->name, dev->ptrfeed->ctrl.threshold); } } -static Bool -xf86SendDragEvents(DeviceIntPtr device) -{ - LocalDevicePtr local = (LocalDevicePtr) device->public.devicePrivate; - - if (device->button && device->button->buttonsDown > 0) - return local->flags & XI86_SEND_DRAG_EVENTS; - else - return TRUE; -} - /*********************************************************************** * * xf86ProcessCommonOptions -- @@ -293,27 +277,18 @@ xf86SendDragEvents(DeviceIntPtr device) *********************************************************************** */ void -xf86ProcessCommonOptions(LocalDevicePtr local, +xf86ProcessCommonOptions(InputInfoPtr pInfo, pointer list) { if (!xf86SetBoolOption(list, "AlwaysCore", 1) || !xf86SetBoolOption(list, "SendCoreEvents", 1) || !xf86SetBoolOption(list, "CorePointer", 1) || !xf86SetBoolOption(list, "CoreKeyboard", 1)) { - xf86Msg(X_CONFIG, "%s: doesn't report core events\n", local->name); - } else { - local->flags |= XI86_ALWAYS_CORE; - xf86Msg(X_CONFIG, "%s: always reports core events\n", local->name); - } - - if (xf86SetBoolOption(list, "SendDragEvents", 1)) { - local->flags |= XI86_SEND_DRAG_EVENTS; + xf86Msg(X_CONFIG, "%s: doesn't report core events\n", pInfo->name); } else { - xf86Msg(X_CONFIG, "%s: doesn't report drag events\n", local->name); + pInfo->flags |= XI86_ALWAYS_CORE; + xf86Msg(X_CONFIG, "%s: always reports core events\n", pInfo->name); } - - /* Backwards compatibility. */ - local->history_size = GetMotionHistorySize(); } /*********************************************************************** @@ -325,86 +300,38 @@ xf86ProcessCommonOptions(LocalDevicePtr local, * Returns TRUE on success, or FALSE otherwise. *********************************************************************** */ -int -xf86ActivateDevice(LocalDevicePtr local) +static DeviceIntPtr +xf86ActivateDevice(InputInfoPtr pInfo) { DeviceIntPtr dev; + Atom atom; - if (local->flags & XI86_CONFIGURED) { - dev = AddInputDevice(serverClient, local->device_control, TRUE); + dev = AddInputDevice(serverClient, pInfo->device_control, TRUE); - if (dev == NULL) - { - 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); - AssignTypeAndName(dev, local->atom, local->name); - dev->public.devicePrivate = (pointer) local; - local->dev = dev; - - dev->coreEvents = local->flags & XI86_ALWAYS_CORE; - dev->type = SLAVE; - dev->spriteInfo->spriteOwner = FALSE; - - dev->deviceGrab.ActivateGrab = ActivateKeyboardGrab; - dev->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab; - - RegisterOtherDevice(dev); - XkbSetExtension(dev, ProcessKeyboardEvent); - - if (serverGeneration == 1) - xf86Msg(X_INFO, "XINPUT: Adding extended input device \"%s\" (type: %s)\n", - local->name, local->type_name); + if (dev == NULL) + { + xf86Msg(X_ERROR, "Too many input devices. Ignoring %s\n", + pInfo->name); + pInfo->dev = NULL; + return NULL; } - return TRUE; -} + atom = MakeAtom(pInfo->type_name, strlen(pInfo->type_name), TRUE); + AssignTypeAndName(dev, atom, pInfo->name); + dev->public.devicePrivate = pInfo; + pInfo->dev = dev; + dev->coreEvents = pInfo->flags & XI86_ALWAYS_CORE; + dev->type = SLAVE; + dev->spriteInfo->spriteOwner = FALSE; -/*********************************************************************** - * - * Caller: ProcXOpenDevice - * - * This is the implementation-dependent routine to open an input device. - * Some implementations open all input devices when the server is first - * initialized, and never close them. Other implementations open only - * the X pointer and keyboard devices during server initialization, - * and only open other input devices when some client makes an - * XOpenDevice request. This entry point is for the latter type of - * implementation. - * - * If the physical device is not already open, do it here. In this case, - * you need to keep track of the fact that one or more clients has the - * device open, and physically close it when the last client that has - * it open does an XCloseDevice. - * - * The default implementation is to do nothing (assume all input devices - * are opened during X server initialization and kept open). - * - *********************************************************************** - */ + dev->config_info = xf86SetStrOption(pInfo->options, "config_info", NULL); -void -OpenInputDevice(DeviceIntPtr dev, - ClientPtr client, - int *status) -{ - if (!dev->inited) - ActivateDevice(dev, TRUE); + if (serverGeneration == 1) + xf86Msg(X_INFO, "XINPUT: Adding extended input device \"%s\" (type: %s)\n", + pInfo->name, pInfo->type_name); - *status = Success; -} - -void -CloseInputDevice(DeviceIntPtr dev, - ClientPtr client) -{ + return dev; } /**************************************************************************** @@ -423,10 +350,10 @@ CloseInputDevice(DeviceIntPtr dev, int SetDeviceMode (ClientPtr client, DeviceIntPtr dev, int mode) { - LocalDevicePtr local = (LocalDevicePtr)dev->public.devicePrivate; + InputInfoPtr pInfo = (InputInfoPtr)dev->public.devicePrivate; - if (local->switch_mode) { - return (*local->switch_mode)(client, dev, mode); + if (pInfo->switch_mode) { + return (*pInfo->switch_mode)(client, dev, mode); } else return BadMatch; @@ -450,10 +377,10 @@ int SetDeviceValuators (ClientPtr client, DeviceIntPtr dev, int *valuators, int first_valuator, int num_valuators) { - LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate; + InputInfoPtr pInfo = (InputInfoPtr) dev->public.devicePrivate; - if (local->set_device_valuators) - return (*local->set_device_valuators)(local, valuators, first_valuator, + if (pInfo->set_device_valuators) + return (*pInfo->set_device_valuators)(pInfo, valuators, first_valuator, num_valuators); return BadMatch; @@ -472,9 +399,9 @@ SetDeviceValuators (ClientPtr client, DeviceIntPtr dev, int *valuators, int ChangeDeviceControl (ClientPtr client, DeviceIntPtr dev, xDeviceCtl *control) { - LocalDevicePtr local = (LocalDevicePtr)dev->public.devicePrivate; + InputInfoPtr pInfo = (InputInfoPtr)dev->public.devicePrivate; - if (!local->control_proc) { + if (!pInfo->control_proc) { switch (control->control) { case DEVICE_CORE: return BadMatch; @@ -488,15 +415,10 @@ ChangeDeviceControl (ClientPtr client, DeviceIntPtr dev, xDeviceCtl *control) } } else { - return (*local->control_proc)(local, control); + return (*pInfo->control_proc)(pInfo, control); } } -void -AddOtherInputDevices(void) -{ -} - /* * Get the operating system name from uname and store it statically to avoid * repeating the system call each time MatchOS is checked. @@ -592,7 +514,7 @@ MatchAttrToken(const char *attr, struct list *patterns, * statements must match. */ static Bool -InputClassMatches(const XF86ConfInputClassPtr iclass, const IDevPtr idev, +InputClassMatches(const XF86ConfInputClassPtr iclass, const InputInfoPtr idev, const InputAttributes *attrs) { /* MatchProduct substring */ @@ -672,7 +594,7 @@ InputClassMatches(const XF86ConfInputClassPtr iclass, const IDevPtr idev, * well as any previous InputClass sections. */ static int -MergeInputClasses(const IDevPtr idev, const InputAttributes *attrs) +MergeInputClasses(const InputInfoPtr idev, const InputAttributes *attrs) { XF86ConfInputClassPtr cl; XF86OptionPtr classopts; @@ -697,9 +619,8 @@ MergeInputClasses(const IDevPtr idev, const InputAttributes *attrs) /* Apply options to device with InputClass settings preferred. */ xf86Msg(X_CONFIG, "%s: Applying InputClass \"%s\"\n", - idev->identifier, cl->identifier); - idev->commonOptions = xf86optionListMerge(idev->commonOptions, - classopts); + idev->name, cl->identifier); + idev->options = xf86optionListMerge(idev->options, classopts); } return Success; @@ -710,7 +631,7 @@ MergeInputClasses(const IDevPtr idev, const InputAttributes *attrs) * value of the last matching class and holler when returning TRUE. */ static Bool -IgnoreInputClass(const IDevPtr idev, const InputAttributes *attrs) +IgnoreInputClass(const InputInfoPtr idev, const InputAttributes *attrs) { XF86ConfInputClassPtr cl; Bool ignore = FALSE; @@ -727,10 +648,95 @@ IgnoreInputClass(const IDevPtr idev, const InputAttributes *attrs) if (ignore) xf86Msg(X_CONFIG, "%s: Ignoring device from InputClass \"%s\"\n", - idev->identifier, ignore_class); + idev->name, ignore_class); return ignore; } +static InputInfoPtr +xf86AllocateInput(void) +{ + InputInfoPtr pInfo; + + pInfo = calloc(sizeof(*pInfo), 1); + if (!pInfo) + return NULL; + + pInfo->fd = -1; + pInfo->type_name = "UNKNOWN"; + + return pInfo; +} + +/* Append InputInfoRec to the tail of xf86InputDevs. */ +static void +xf86AddInput(InputDriverPtr drv, InputInfoPtr pInfo) +{ + InputInfoPtr *prev = NULL; + + pInfo->drv = drv; + pInfo->module = DuplicateModule(drv->module, NULL); + + for (prev = &xf86InputDevs; *prev; prev = &(*prev)->next) + ; + + *prev = pInfo; + pInfo->next = NULL; + + xf86CollectInputOptions(pInfo, (const char**)drv->default_options); + xf86ProcessCommonOptions(pInfo, pInfo->options); +} + +/* + * Remove an entry from xf86InputDevs and free all the device's information. + */ +void +xf86DeleteInput(InputInfoPtr pInp, int flags) +{ + /* First check if the inputdev is valid. */ + if (pInp == NULL) + return; + + if (pInp->module) + UnloadModule(pInp->module); + + /* This should *really* be handled in drv->UnInit(dev) call instead, but + * if the driver forgets about it make sure we free it or at least crash + * with flying colors */ + free(pInp->private); + + FreeInputAttributes(pInp->attrs); + + /* Remove the entry from the list. */ + if (pInp == xf86InputDevs) + xf86InputDevs = pInp->next; + else { + InputInfoPtr p = xf86InputDevs; + while (p && p->next != pInp) + p = p->next; + if (p) + p->next = pInp->next; + /* Else the entry wasn't in the xf86InputDevs list (ignore this). */ + } + + free(pInp->driver); + free(pInp->name); + xf86optionListFree(pInp->options); + free(pInp); +} + +/* + * Apply backend-specific initialization. Invoked after ActiveteDevice(), + * i.e. after the driver successfully completed DEVICE_INIT and the device + * is advertised. + * @param dev the device + * @return Success or an error code + */ +static int +xf86InputDevicePostInit(DeviceIntPtr dev) { + ApplyAccelerationSettings(dev); + return Success; +} + /** * Create a new input device, activate and enable it. * @@ -749,21 +755,20 @@ IgnoreInputClass(const IDevPtr idev, const InputAttributes *attrs) * @return Success or an error code */ _X_INTERNAL int -xf86NewInputDevice(IDevPtr idev, DeviceIntPtr *pdev, BOOL enable) +xf86NewInputDevice(InputInfoPtr pInfo, DeviceIntPtr *pdev, BOOL enable) { InputDriverPtr drv = NULL; - InputInfoPtr pInfo = NULL; DeviceIntPtr dev = NULL; int rval; /* Memory leak for every attached device if we don't * test if the module is already loaded first */ - drv = xf86LookupInputDriver(idev->driver); + drv = xf86LookupInputDriver(pInfo->driver); if (!drv) - if (xf86LoadOneModule(idev->driver, NULL)) - drv = xf86LookupInputDriver(idev->driver); + if (xf86LoadOneModule(pInfo->driver, NULL)) + drv = xf86LookupInputDriver(pInfo->driver); if (!drv) { - xf86Msg(X_ERROR, "No input driver matching `%s'\n", idev->driver); + xf86Msg(X_ERROR, "No input driver matching `%s'\n", pInfo->driver); rval = BadName; goto unwind; } @@ -776,42 +781,44 @@ xf86NewInputDevice(IDevPtr idev, DeviceIntPtr *pdev, BOOL enable) goto unwind; } - pInfo = drv->PreInit(drv, idev, 0); + xf86AddInput(drv, pInfo); - if (!pInfo) { - xf86Msg(X_ERROR, "PreInit returned NULL for \"%s\"\n", idev->identifier); - rval = BadMatch; - goto unwind; - } - else if (!(pInfo->flags & XI86_CONFIGURED)) { - xf86Msg(X_ERROR, "PreInit failed for input device \"%s\"\n", - idev->identifier); - rval = BadMatch; + rval = drv->PreInit(drv, pInfo, 0); + + if (rval != Success) { + xf86Msg(X_ERROR, "PreInit returned %d for \"%s\"\n", rval, pInfo->name); goto unwind; } - if (!xf86ActivateDevice(pInfo)) + if (!(dev = xf86ActivateDevice(pInfo))) { rval = BadAlloc; goto unwind; } - dev = pInfo->dev; rval = ActivateDevice(dev, TRUE); if (rval != Success) { - xf86Msg(X_ERROR, "Couldn't init device \"%s\"\n", idev->identifier); + xf86Msg(X_ERROR, "Couldn't init device \"%s\"\n", pInfo->name); RemoveDevice(dev, TRUE); goto unwind; } + rval = xf86InputDevicePostInit(dev); + if (rval != Success) + { + xf86Msg(X_ERROR, "Couldn't post-init device \"%s\"\n", pInfo->name); + RemoveDevice(dev, TRUE); + goto unwind; + } + /* Enable it if it's properly initialised and we're currently in the VT */ if (enable && dev->inited && dev->startup && xf86Screens[0]->vtSema) { EnableDevice(dev, TRUE); if (!dev->enabled) { - xf86Msg(X_ERROR, "Couldn't init device \"%s\"\n", idev->identifier); + xf86Msg(X_ERROR, "Couldn't init device \"%s\"\n", pInfo->name); rval = BadMatch; goto unwind; } @@ -824,7 +831,7 @@ xf86NewInputDevice(IDevPtr idev, DeviceIntPtr *pdev, BOOL enable) unwind: if(pInfo) { - if(drv->UnInit) + if(drv && drv->UnInit) drv->UnInit(drv, pInfo, 0); else xf86DeleteInput(pInfo, 0); @@ -836,23 +843,23 @@ int NewInputDeviceRequest (InputOption *options, InputAttributes *attrs, DeviceIntPtr *pdev) { - IDevRec *idev = NULL; + InputInfoPtr pInfo = NULL; InputOption *option = NULL; int rval = Success; int is_auto = 0; - idev = calloc(sizeof(*idev), 1); - if (!idev) + pInfo = xf86AllocateInput(); + if (!pInfo) return BadAlloc; for (option = options; option; option = option->next) { if (strcasecmp(option->key, "driver") == 0) { - if (idev->driver) { + if (pInfo->driver) { rval = BadRequest; goto unwind; } - idev->driver = xstrdup(option->value); - if (!idev->driver) { + pInfo->driver = xstrdup(option->value); + if (!pInfo->driver) { rval = BadAlloc; goto unwind; } @@ -860,12 +867,12 @@ NewInputDeviceRequest (InputOption *options, InputAttributes *attrs, if (strcasecmp(option->key, "name") == 0 || strcasecmp(option->key, "identifier") == 0) { - if (idev->identifier) { + if (pInfo->name) { rval = BadRequest; goto unwind; } - idev->identifier = xstrdup(option->value); - if (!idev->identifier) { + pInfo->name = xstrdup(option->value); + if (!pInfo->name) { rval = BadAlloc; goto unwind; } @@ -885,7 +892,7 @@ NewInputDeviceRequest (InputOption *options, InputAttributes *attrs, for (option = options; option; option = option->next) { /* Steal option key/value strings from the provided list. * We need those strings, the InputOption list doesn't. */ - idev->commonOptions = xf86addNewOption(idev->commonOptions, + pInfo->options = xf86addNewOption(pInfo->options, option->key, option->value); option->key = NULL; option->value = NULL; @@ -893,58 +900,51 @@ NewInputDeviceRequest (InputOption *options, InputAttributes *attrs, /* Apply InputClass settings */ if (attrs) { - if (IgnoreInputClass(idev, attrs)) { + if (IgnoreInputClass(pInfo, attrs)) { rval = BadIDChoice; goto unwind; } - rval = MergeInputClasses(idev, attrs); + rval = MergeInputClasses(pInfo, attrs); if (rval != Success) goto unwind; - idev->attrs = DuplicateInputAttributes(attrs); + pInfo->attrs = DuplicateInputAttributes(attrs); } - if (!idev->driver || !idev->identifier) { + if (!pInfo->driver || !pInfo->name) { xf86Msg(X_INFO, "No input driver/identifier specified (ignoring)\n"); rval = BadRequest; goto unwind; } - if (!idev->identifier) { + if (!pInfo->name) { xf86Msg(X_ERROR, "No device identifier specified (ignoring)\n"); - return BadMatch; + rval = BadMatch; + goto unwind; } - rval = xf86NewInputDevice(idev, pdev, + rval = xf86NewInputDevice(pInfo, pdev, (!is_auto || (is_auto && xf86Info.autoEnableDevices))); - if (rval == Success) - return Success; + + return rval; unwind: if (is_auto && !xf86Info.autoAddDevices) xf86Msg(X_INFO, "AutoAddDevices is off - not adding device.\n"); - free(idev->driver); - free(idev->identifier); - xf86optionListFree(idev->commonOptions); - free(idev); + xf86DeleteInput(pInfo, 0); return rval; } void DeleteInputDeviceRequest(DeviceIntPtr pDev) { - LocalDevicePtr pInfo = (LocalDevicePtr) pDev->public.devicePrivate; + InputInfoPtr pInfo = (InputInfoPtr) pDev->public.devicePrivate; InputDriverPtr drv = NULL; - IDevRec *idev = NULL; - IDevPtr *it; Bool isMaster = IsMaster(pDev); if (pInfo) /* need to get these before RemoveDevice */ - { drv = pInfo->drv; - idev = pInfo->conf_idev; - } OsBlockSignals(); RemoveDevice(pDev, TRUE); @@ -955,19 +955,6 @@ DeleteInputDeviceRequest(DeviceIntPtr pDev) drv->UnInit(drv, pInfo, 0); else xf86DeleteInput(pInfo, 0); - - /* devices added through HAL aren't in the config layout */ - it = xf86ConfigLayout.inputs; - while(*it && *it != idev) - it++; - - if (!(*it)) /* end of list, not in the layout */ - { - free(idev->driver); - free(idev->identifier); - xf86optionListFree(idev->commonOptions); - free(idev); - } } OsReleaseSignals(); } @@ -985,16 +972,17 @@ xf86PostMotionEvent(DeviceIntPtr device, { va_list var; int i = 0; - static int valuators[MAX_VALUATORS]; + ValuatorMask mask; XI_VERIFY_VALUATORS(num_valuators); + valuator_mask_zero(&mask); va_start(var, num_valuators); for (i = 0; i < num_valuators; i++) - valuators[i] = va_arg(var, int); + valuator_mask_set(&mask, first_valuator + i, va_arg(var, int)); va_end(var); - xf86PostMotionEventP(device, is_absolute, first_valuator, num_valuators, valuators); + xf86PostMotionEventM(device, is_absolute, &mask); } void @@ -1002,10 +990,22 @@ xf86PostMotionEventP(DeviceIntPtr device, int is_absolute, int first_valuator, int num_valuators, - int *valuators) + const int *valuators) +{ + ValuatorMask mask; + + XI_VERIFY_VALUATORS(num_valuators); + + valuator_mask_set_range(&mask, first_valuator, num_valuators, valuators); + xf86PostMotionEventM(device, is_absolute, &mask); +} + +void +xf86PostMotionEventM(DeviceIntPtr device, + int is_absolute, + const ValuatorMask *mask) { int i = 0, nevents = 0; - Bool drag = xf86SendDragEvents(device); DeviceEvent *event; int flags = 0; @@ -1014,8 +1014,6 @@ xf86PostMotionEventP(DeviceIntPtr device, int dx = 0, dy = 0; #endif - XI_VERIFY_VALUATORS(num_valuators); - if (is_absolute) flags = POINTER_ABSOLUTE; else @@ -1023,19 +1021,20 @@ xf86PostMotionEventP(DeviceIntPtr device, #if XFreeXDGA /* The evdev driver may not always send all axes across. */ - if (num_valuators >= 1 && first_valuator <= 1) { + if (valuator_mask_isset(mask, 0) || + valuator_mask_isset(mask, 1)) if (miPointerGetScreen(device)) { index = miPointerGetScreen(device)->myNum; - if (first_valuator == 0) + if (valuator_mask_isset(mask, 0)) { - dx = valuators[0]; + dx = valuator_mask_get(mask, 0); if (is_absolute) dx -= device->last.valuators[0]; } - if (first_valuator == 1 || num_valuators >= 2) + if (valuator_mask_isset(mask, 1)) { - dy = valuators[1 - first_valuator]; + dy = valuator_mask_get(mask, 1); if (is_absolute) dy -= device->last.valuators[1]; } @@ -1043,21 +1042,13 @@ xf86PostMotionEventP(DeviceIntPtr device, if (DGAStealMotionEvent(device, index, dx, dy)) return; } - } #endif - nevents = GetPointerEvents(xf86Events, device, MotionNotify, 0, - flags, first_valuator, num_valuators, - valuators); + nevents = GetPointerEvents(xf86Events, device, MotionNotify, 0, flags, mask); for (i = 0; i < nevents; i++) { event = (DeviceEvent*)((xf86Events + i)->event); - /* Don't post core motion events for devices not registered to send - * drag events. */ - if (event->header == ET_Internal && - (event->type != ET_Motion || drag)) { - mieqEnqueue(device, (InternalEvent*)((xf86Events + i)->event)); - } + mieqEnqueue(device, (InternalEvent*)((xf86Events + i)->event)); } } @@ -1070,18 +1061,17 @@ xf86PostProximityEvent(DeviceIntPtr device, { va_list var; int i; - int valuators[MAX_VALUATORS]; + ValuatorMask mask; XI_VERIFY_VALUATORS(num_valuators); + valuator_mask_zero(&mask); va_start(var, num_valuators); for (i = 0; i < num_valuators; i++) - valuators[i] = va_arg(var, int); + valuator_mask_set(&mask, first_valuator + i, va_arg(var, int)); va_end(var); - xf86PostProximityEventP(device, is_in, first_valuator, num_valuators, - valuators); - + xf86PostProximityEventM(device, is_in, &mask); } void @@ -1089,15 +1079,25 @@ xf86PostProximityEventP(DeviceIntPtr device, int is_in, int first_valuator, int num_valuators, - int *valuators) + const int *valuators) { - int i, nevents; + ValuatorMask mask; XI_VERIFY_VALUATORS(num_valuators); + valuator_mask_set_range(&mask, first_valuator, num_valuators, valuators); + xf86PostProximityEventM(device, is_in, &mask); +} + +void +xf86PostProximityEventM(DeviceIntPtr device, + int is_in, + const ValuatorMask *mask) +{ + int i, nevents; + nevents = GetProximityEvents(xf86Events, device, - is_in ? ProximityIn : ProximityOut, - first_valuator, num_valuators, valuators); + is_in ? ProximityIn : ProximityOut, mask); for (i = 0; i < nevents; i++) mieqEnqueue(device, (InternalEvent*)((xf86Events + i)->event)); @@ -1113,19 +1113,19 @@ xf86PostButtonEvent(DeviceIntPtr device, ...) { va_list var; - int valuators[MAX_VALUATORS]; + ValuatorMask mask; int i = 0; XI_VERIFY_VALUATORS(num_valuators); + valuator_mask_zero(&mask); + va_start(var, num_valuators); for (i = 0; i < num_valuators; i++) - valuators[i] = va_arg(var, int); + valuator_mask_set(&mask, first_valuator + i, va_arg(var, int)); va_end(var); - xf86PostButtonEventP(device, is_absolute, button, is_down, first_valuator, - num_valuators, valuators); - + xf86PostButtonEventM(device, is_absolute, button, is_down, &mask); } void @@ -1135,7 +1135,22 @@ xf86PostButtonEventP(DeviceIntPtr device, int is_down, int first_valuator, int num_valuators, - int *valuators) + const int *valuators) +{ + ValuatorMask mask; + + XI_VERIFY_VALUATORS(num_valuators); + + valuator_mask_set_range(&mask, first_valuator, num_valuators, valuators); + xf86PostButtonEventM(device, is_absolute, button, is_down, &mask); +} + +void +xf86PostButtonEventM(DeviceIntPtr device, + int is_absolute, + int button, + int is_down, + const ValuatorMask *mask) { int i = 0, nevents = 0; int flags = 0; @@ -1144,8 +1159,6 @@ xf86PostButtonEventP(DeviceIntPtr device, int index; #endif - XI_VERIFY_VALUATORS(num_valuators); - if (is_absolute) flags = POINTER_ABSOLUTE; else @@ -1161,7 +1174,7 @@ xf86PostButtonEventP(DeviceIntPtr device, nevents = GetPointerEvents(xf86Events, device, is_down ? ButtonPress : ButtonRelease, button, - flags, first_valuator, num_valuators, valuators); + flags, mask); for (i = 0; i < nevents; i++) mieqEnqueue(device, (InternalEvent*)((xf86Events + i)->event)); @@ -1179,18 +1192,18 @@ xf86PostKeyEvent(DeviceIntPtr device, { va_list var; int i = 0; - static int valuators[MAX_VALUATORS]; + ValuatorMask mask; XI_VERIFY_VALUATORS(num_valuators); + valuator_mask_zero(&mask); + va_start(var, num_valuators); for (i = 0; i < num_valuators; i++) - valuators[i] = va_arg(var, int); + valuator_mask_set(&mask, first_valuator + i, va_arg(var, int)); va_end(var); - xf86PostKeyEventP(device, key_code, is_down, is_absolute, first_valuator, - num_valuators, valuators); - + xf86PostKeyEventM(device, key_code, is_down, is_absolute, &mask); } void @@ -1200,17 +1213,29 @@ xf86PostKeyEventP(DeviceIntPtr device, int is_absolute, int first_valuator, int num_valuators, - int *valuators) + const int *valuators) { - int i = 0, nevents = 0; + ValuatorMask mask; XI_VERIFY_VALUATORS(num_valuators); + valuator_mask_set_range(&mask, first_valuator, num_valuators, valuators); + xf86PostKeyEventM(device, key_code, is_down, is_absolute, &mask); +} + +void +xf86PostKeyEventM(DeviceIntPtr device, + unsigned int key_code, + int is_down, + int is_absolute, + const ValuatorMask *mask) +{ + int i = 0, nevents = 0; + if (is_absolute) { nevents = GetKeyboardValuatorEvents(xf86Events, device, is_down ? KeyPress : KeyRelease, - key_code, first_valuator, - num_valuators, valuators); + key_code, mask); } else { nevents = GetKeyboardEvents(xf86Events, device, @@ -1227,10 +1252,13 @@ xf86PostKeyboardEvent(DeviceIntPtr device, unsigned int key_code, int is_down) { - xf86PostKeyEventP(device, key_code, is_down, 0, 0, 0, NULL); + ValuatorMask mask; + + valuator_mask_zero(&mask); + xf86PostKeyEventM(device, key_code, is_down, 0, &mask); } -LocalDevicePtr +InputInfoPtr xf86FirstLocalDevice(void) { return xf86InputDevs; @@ -1286,27 +1314,27 @@ xf86ScaleAxis(int Cx, * specific like a touch screen. */ void -xf86XInputSetScreen(LocalDevicePtr local, +xf86XInputSetScreen(InputInfoPtr pInfo, int screen_number, int x, int y) { - if (miPointerGetScreen(local->dev) != + if (miPointerGetScreen(pInfo->dev) != screenInfo.screens[screen_number]) { - miPointerSetScreen(local->dev, screen_number, x, y); + miPointerSetScreen(pInfo->dev, screen_number, x, y); } } void xf86InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, Atom label, int minval, int maxval, - int resolution, int min_res, int max_res) + int resolution, int min_res, int max_res, int mode) { if (!dev || !dev->valuator) return; InitValuatorAxisStruct(dev, axnum, label, minval, maxval, resolution, min_res, - max_res); + max_res, mode); } /* @@ -1324,9 +1352,6 @@ xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum) dev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2; dev->last.valuators[1] = dev->valuator->axisVal[1]; } - - if(axnum == 0) /* to prevent double invocation */ - ApplyAccelerationSettings(dev); } diff --git a/xorg-server/hw/xfree86/common/xf86Xinput.h b/xorg-server/hw/xfree86/common/xf86Xinput.h index 727f26107..15ab82421 100644 --- a/xorg-server/hw/xfree86/common/xf86Xinput.h +++ b/xorg-server/hw/xfree86/common/xf86Xinput.h @@ -59,161 +59,123 @@ #include "XIstubs.h" /* Input device flags */ -#define XI86_OPEN_ON_INIT 0x01 /* open the device at startup time */ -#define XI86_CONFIGURED 0x02 /* the device has been configured */ #define XI86_ALWAYS_CORE 0x04 /* device always controls the pointer */ /* the device sends Xinput and core pointer events */ #define XI86_SEND_CORE_EVENTS XI86_ALWAYS_CORE -/* if the device is the core pointer or is sending core events, and - * SEND_DRAG_EVENTS is false, and a buttons is done, then no motion events - * (mouse drag action) are sent. This is mainly to allow a touch screen to be - * used with netscape and other browsers which do strange things if the mouse - * moves between button down and button up. With a touch screen, this motion - * is common due to the user's finger moving slightly. - */ -#define XI86_SEND_DRAG_EVENTS 0x08 -#define XI86_CORE_POINTER 0x10 /* device is the core pointer */ -#define XI86_CORE_KEYBOARD 0x20 /* device is the core keyboard */ -#define XI86_POINTER_CAPABLE 0x40 /* capable of being a core pointer */ -#define XI86_KEYBOARD_CAPABLE 0x80 /* capable of being a core keyboard */ - -#define XI_PRIVATE(dev) \ - (((LocalDevicePtr)((dev)->public.devicePrivate))->private) - -/* Valuator verification macro */ -#define XI_VERIFY_VALUATORS(num_valuators) \ - if (num_valuators > MAX_VALUATORS) { \ - xf86Msg(X_ERROR, "%s: num_valuator %d is greater than" \ - " MAX_VALUATORS\n", __FUNCTION__, num_valuators); \ - return; \ - } - -/* Stupid API backwards-compatibility. */ -#define TS_Raw 60 -#define TS_Scaled 61 /* This holds the input driver entry and module information. */ typedef struct _InputDriverRec { int driverVersion; char * driverName; void (*Identify)(int flags); - struct _LocalDeviceRec *(*PreInit)(struct _InputDriverRec *drv, - IDevPtr dev, int flags); + int (*PreInit)(struct _InputDriverRec *drv, + struct _InputInfoRec* pInfo, int flags); void (*UnInit)(struct _InputDriverRec *drv, - struct _LocalDeviceRec *pInfo, + struct _InputInfoRec *pInfo, int flags); pointer module; + char ** default_options; } InputDriverRec, *InputDriverPtr; /* This is to input devices what the ScrnInfoRec is to screens. */ -typedef struct _LocalDeviceRec { - struct _LocalDeviceRec *next; +typedef struct _InputInfoRec { + struct _InputInfoRec *next; char * name; + char * driver; + int flags; Bool (*device_control)(DeviceIntPtr device, int what); - void (*read_input)(struct _LocalDeviceRec *local); - int (*control_proc)(struct _LocalDeviceRec *local, + void (*read_input)(struct _InputInfoRec *local); + int (*control_proc)(struct _InputInfoRec *local, xDeviceCtl *control); - void (*close_proc)(struct _LocalDeviceRec *local); int (*switch_mode)(ClientPtr client, DeviceIntPtr dev, int mode); - Bool (*conversion_proc)(struct _LocalDeviceRec *local, - int first, int num, int v0, - int v1, int v2, int v3, int v4, - int v5, int *x, int *y); - Bool (*reverse_conversion_proc)( - struct _LocalDeviceRec *local, - int x, int y, int *valuators); int (*set_device_valuators) - (struct _LocalDeviceRec *local, + (struct _InputInfoRec *local, int *valuators, int first_valuator, int num_valuators); int fd; - Atom atom; DeviceIntPtr dev; pointer private; - int private_flags; - unsigned int first; - unsigned int last; - int old_x; - int old_y; char * type_name; - IntegerFeedbackPtr always_core_feedback; - IDevPtr conf_idev; InputDriverPtr drv; pointer module; pointer options; - unsigned int history_size; InputAttributes *attrs; -} LocalDeviceRec, *LocalDevicePtr, InputInfoRec, *InputInfoPtr; - -typedef struct _DeviceAssocRec -{ - char * config_section_name; - LocalDevicePtr (*device_allocate)(void); -} DeviceAssocRec, *DeviceAssocPtr; +} *InputInfoPtr; /* xf86Globals.c */ -extern _X_EXPORT InputInfoPtr xf86InputDevs; +extern InputInfoPtr xf86InputDevs; /* xf86Xinput.c */ extern _X_EXPORT void xf86PostMotionEvent(DeviceIntPtr device, int is_absolute, int first_valuator, int num_valuators, ...); extern _X_EXPORT void xf86PostMotionEventP(DeviceIntPtr device, int is_absolute, - int first_valuator, int num_valuators, int *valuators); + int first_valuator, int num_valuators, const int *valuators); +extern _X_EXPORT void xf86PostMotionEventM(DeviceIntPtr device, int is_absolute, + const ValuatorMask *mask); extern _X_EXPORT void xf86PostProximityEvent(DeviceIntPtr device, int is_in, int first_valuator, int num_valuators, ...); extern _X_EXPORT void xf86PostProximityEventP(DeviceIntPtr device, int is_in, int first_valuator, - int num_valuators, int *valuators); + int num_valuators, const int *valuators); +extern _X_EXPORT void xf86PostProximityEventM(DeviceIntPtr device, int is_in, + const ValuatorMask *mask); extern _X_EXPORT void xf86PostButtonEvent(DeviceIntPtr device, int is_absolute, int button, int is_down, int first_valuator, int num_valuators, ...); extern _X_EXPORT void xf86PostButtonEventP(DeviceIntPtr device, int is_absolute, int button, int is_down, int first_valuator, int num_valuators, - int *valuators); + const int *valuators); +extern _X_EXPORT void xf86PostButtonEventM(DeviceIntPtr device, int is_absolute, int button, + int is_down, const ValuatorMask *mask); extern _X_EXPORT void xf86PostKeyEvent(DeviceIntPtr device, unsigned int key_code, int is_down, int is_absolute, int first_valuator, int num_valuators, ...); +extern _X_EXPORT void xf86PostKeyEventM(DeviceIntPtr device, unsigned int key_code, int is_down, + int is_absolute, const ValuatorMask *mask); extern _X_EXPORT void xf86PostKeyEventP(DeviceIntPtr device, unsigned int key_code, int is_down, int is_absolute, int first_valuator, int num_valuators, - int *valuators); + const int *valuators); extern _X_EXPORT void xf86PostKeyboardEvent(DeviceIntPtr device, unsigned int key_code, int is_down); -extern _X_EXPORT int xf86ActivateDevice(LocalDevicePtr local); -extern _X_EXPORT LocalDevicePtr xf86FirstLocalDevice(void); +extern _X_EXPORT InputInfoPtr xf86FirstLocalDevice(void); extern _X_EXPORT int xf86ScaleAxis(int Cx, int to_max, int to_min, int from_max, int from_min); -extern _X_EXPORT void xf86XInputSetScreen(LocalDevicePtr local, int screen_number, int x, int y); +extern _X_EXPORT void xf86XInputSetScreen(InputInfoPtr pInfo, int screen_number, int x, int y); extern _X_EXPORT void xf86ProcessCommonOptions(InputInfoPtr pInfo, pointer options); extern _X_EXPORT void xf86InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, Atom label, int minval, int maxval, int resolution, int min_res, - int max_res); + int max_res, int mode); extern _X_EXPORT void xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum); extern _X_EXPORT void xf86AddEnabledDevice(InputInfoPtr pInfo); extern _X_EXPORT void xf86RemoveEnabledDevice(InputInfoPtr pInfo); extern _X_EXPORT void xf86DisableDevice(DeviceIntPtr dev, Bool panic); extern _X_EXPORT void xf86EnableDevice(DeviceIntPtr dev); /* not exported */ -int xf86NewInputDevice(IDevPtr idev, DeviceIntPtr *pdev, BOOL is_auto); +int xf86NewInputDevice(InputInfoPtr pInfo, DeviceIntPtr *pdev, BOOL is_auto); /* xf86Helper.c */ extern _X_EXPORT void xf86AddInputDriver(InputDriverPtr driver, pointer module, int flags); extern _X_EXPORT void xf86DeleteInputDriver(int drvIndex); -extern _X_EXPORT InputInfoPtr xf86AllocateInput(InputDriverPtr drv, int flags); extern _X_EXPORT InputDriverPtr xf86LookupInputDriver(const char *name); extern _X_EXPORT InputInfoPtr xf86LookupInput(const char *name); extern _X_EXPORT void xf86DeleteInput(InputInfoPtr pInp, int flags); -extern _X_EXPORT void xf86MotionHistoryAllocate(LocalDevicePtr local); +extern _X_EXPORT void xf86MotionHistoryAllocate(InputInfoPtr pInfo); +extern _X_EXPORT void xf86IDrvMsgVerb(InputInfoPtr dev, + MessageType type, int verb, + const char *format, ...) _X_ATTRIBUTE_PRINTF(4,5); +extern _X_EXPORT void xf86IDrvMsg(InputInfoPtr dev, + MessageType type, + const char *format, ...) _X_ATTRIBUTE_PRINTF(3,4); +extern _X_EXPORT void xf86VIDrvMsgVerb(InputInfoPtr dev, + MessageType type, + int verb, + const char *format, + va_list args); /* xf86Option.c */ -extern _X_EXPORT void xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts, - pointer extraOpts); - - -/* Legacy hatred */ -#define SendCoreEvents 59 -#define DontSendCoreEvents 60 +extern _X_EXPORT void xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts); #endif /* _xf86Xinput_h */ diff --git a/xorg-server/hw/xfree86/common/xf86str.h b/xorg-server/hw/xfree86/common/xf86str.h index 9d52661a7..0b7685012 100644 --- a/xorg-server/hw/xfree86/common/xf86str.h +++ b/xorg-server/hw/xfree86/common/xf86str.h @@ -401,14 +401,6 @@ typedef struct { int screen; /* For multi-CRTC cards */ } GDevRec, *GDevPtr; -typedef struct { - char * identifier; - char * driver; - pointer commonOptions; - pointer extraOptions; - InputAttributes *attrs; -} IDevRec, *IDevPtr; - typedef struct { int frameX0; int frameY0; @@ -478,11 +470,13 @@ typedef struct _screenlayoutrec { confScreenPtr refscreen; } screenLayoutRec, *screenLayoutPtr; +typedef struct _InputInfoRec InputInfoRec; + typedef struct _serverlayoutrec { char * id; screenLayoutPtr screens; GDevPtr inactives; - IDevPtr* inputs; /* NULL terminated */ + InputInfoRec** inputs; /* NULL terminated */ pointer options; } serverLayoutRec, *serverLayoutPtr; -- cgit v1.2.3