This implementation gives two ioctls APIs (DRICursorSetDev, DRICursorHotspot) to interface with the DRM modesetting cursors. For now this patch disables the pointer acceleration scheme.
Signed-off-by: Tiago Vignatti <vigna...@c3sl.ufpr.br> --- Makefile.am | 1 + configure.ac | 4 ++- dix/getevents.c | 2 + dricursor/Makefile.am | 9 +++++++ dricursor/dricursor.c | 51 ++++++++++++++++++++++++++++++++++++++++ hw/xfree86/common/xf86Xinput.c | 8 ++++++ hw/xfree86/ramdac/xf86Cursor.c | 3 ++ include/Makefile.am | 1 + include/dricursor.h | 3 ++ 9 files changed, 81 insertions(+), 1 deletions(-) create mode 100644 dricursor/Makefile.am create mode 100644 dricursor/dricursor.c create mode 100644 include/dricursor.h diff --git a/Makefile.am b/Makefile.am index aa9c8b6..c641710 100644 --- a/Makefile.am +++ b/Makefile.am @@ -19,6 +19,7 @@ endif SUBDIRS = \ doc \ + dricursor \ include \ dix \ fb \ diff --git a/configure.ac b/configure.ac index 93e3a60..a83da6c 100644 --- a/configure.ac +++ b/configure.ac @@ -842,6 +842,7 @@ AC_SUBST([GLX_DEFINES]) AM_CONDITIONAL(DRI, test "x$DRI" = xyes) if test "x$DRI" = xyes; then + DRICURSOR_LIB='$(top_builddir)/dricursor/libdricursor.la' AC_DEFINE(XF86DRI, 1, [Build DRI extension]) PKG_CHECK_MODULES([DRIPROTO], [xf86driproto]) PKG_CHECK_MODULES([LIBDRM], [libdrm >= 2.3.0]) @@ -1228,7 +1229,7 @@ if test "x$XORG" = xyes; then XORG_OSINCS='-I$(top_srcdir)/hw/xfree86/os-support -I$(top_srcdir)/hw/xfree86/os-support/bus -I$(top_srcdir)/os' XORG_INCS="$XORG_DDXINCS $XORG_OSINCS" XORG_CFLAGS="$XORGSERVER_CFLAGS -DHAVE_XORG_CONFIG_H" - XORG_LIBS="$COMPOSITE_LIB $FIXES_LIB $XEXTXORG_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $SELINUX_LIB" + XORG_LIBS="$COMPOSITE_LIB $FIXES_LIB $XEXTXORG_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $SELINUX_LIB $DRICURSOR_LIB" PKG_CHECK_MODULES([PCIACCESS], [pciaccess >= 0.8.0]) SAVE_LIBS=$LIBS @@ -1803,6 +1804,7 @@ damageext/Makefile dbe/Makefile dix/Makefile doc/Makefile +dricursor/Makefile fb/Makefile record/Makefile config/Makefile diff --git a/dix/getevents.c b/dix/getevents.c index 4770a69..8d24075 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -880,12 +880,14 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons, } } else { +#if 0 if (flags & POINTER_ACCELERATE && pDev->valuator->accelScheme.AccelSchemeProc){ pDev->valuator->accelScheme.AccelSchemeProc( pDev, first_valuator, num_valuators, valuators, ms); } +#endif if(v0) x += *v0; if(v1) y += *v1; diff --git a/dricursor/Makefile.am b/dricursor/Makefile.am new file mode 100644 index 0000000..017a861 --- /dev/null +++ b/dricursor/Makefile.am @@ -0,0 +1,9 @@ +noinst_LTLIBRARIES = libdricursor.la + +AM_CFLAGS = @DIX_CFLAGS@ @LIBDRM_CFLAGS@ + +INCLUDES = $(XORG_INCS) \ + -I$(top_srcdir)/include + +libdricursor_la_SOURCES = dricursor.c +libdricursor_la_LIBADD = @LIBDRM_LIBS@ diff --git a/dricursor/dricursor.c b/dricursor/dricursor.c new file mode 100644 index 0000000..933baac --- /dev/null +++ b/dricursor/dricursor.c @@ -0,0 +1,51 @@ +#ifdef HAVE_DIX_CONFIG_H +#include <dix-config.h> +#endif + +#include <stdio.h> +#include <xf86drm.h> +#include "dricursor.h" + + +int drmFD = -1; + +/** + * Save the DRM fd. Called by the DRM user, i.e. the video driver. + * + * @param The drm file-descriptor + */ +void +DRICursorSaveFD(int fd) { + fprintf(stderr, "%s: %d\n", __FUNCTION__, fd); + drmFD = fd; +} + +/** + * drmCursorSetDev ioctl interface. + * + * Notify DRM about which devices are responsible for cursor updates. + * + * @param The device path (e.g. /dev/input/event0) + * @return On success zero is returned. + */ +int +DRICursorSetDev(char *path) +{ + fprintf(stderr, "%s: %d: %s\n", __FUNCTION__, drmFD, path); + return drmCursorSetDev(drmFD, path); +} + +/** + * drmCursorHotspot ioctl interface. + * + * When the application updates the sprite, DRM must be notified by the + * changes. + * + * @param The hotspot of the cursor. + * @return On success zero is returned. + */ +int +DRICursorHotspot(int hotx, int hoty) +{ + return drmCursorHotspot(drmFD, hotx, hoty); +} diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index 8eaa118..c4f3f30 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -89,6 +89,7 @@ #endif #include "os.h" +#include "dricursor.h" EventListPtr xf86Events = NULL; @@ -471,6 +472,7 @@ NewInputDeviceRequest (InputOption *options, DeviceIntPtr *pdev) DeviceIntPtr dev = NULL; int rval = Success; int is_auto = 0; + char *path; idev = xcalloc(sizeof(*idev), 1); if (!idev) @@ -514,6 +516,9 @@ NewInputDeviceRequest (InputOption *options, DeviceIntPtr *pdev) } } + if (strcasecmp(option->key, "path") == 0) + path = xstrdup(option->value); + /* Right now, the only automatic config we know of is HAL. */ if (strcmp(option->key, "_source") == 0 && strcmp(option->value, "server/hal") == 0) { @@ -582,6 +587,9 @@ NewInputDeviceRequest (InputOption *options, DeviceIntPtr *pdev) (!is_auto || xf86Info.autoEnableDevices)) EnableDevice(dev); + if (IsPointerDevice(dev)) + DRICursorSetDev(path); + /* send enter/leave event, update sprite window */ CheckMotion(NULL, dev); diff --git a/hw/xfree86/ramdac/xf86Cursor.c b/hw/xfree86/ramdac/xf86Cursor.c index 592eaad..93bee64 100644 --- a/hw/xfree86/ramdac/xf86Cursor.c +++ b/hw/xfree86/ramdac/xf86Cursor.c @@ -7,6 +7,7 @@ #include "xf86CursorPriv.h" #include "colormapst.h" #include "cursorstr.h" +#include "dricursor.h" /* FIXME: This was added with the ABI change of the miPointerSpriteFuncs for * MPX. @@ -323,6 +324,8 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs, ScreenPriv->HotX = pCurs->bits->xhot; ScreenPriv->HotY = pCurs->bits->yhot; + DRICursorHotspot(ScreenPriv->HotX, ScreenPriv->HotY); + if (!infoPtr->pScrn->vtSema) ScreenPriv->SavedCursor = pCurs; diff --git a/include/Makefile.am b/include/Makefile.am index f639048..75123b0 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -17,6 +17,7 @@ sdk_HEADERS = \ dixfontstr.h \ dixgrabs.h \ dixstruct.h \ + dricursor.h \ exevents.h \ extension.h \ extinit.h \ diff --git a/include/dricursor.h b/include/dricursor.h new file mode 100644 index 0000000..48ba40e --- /dev/null +++ b/include/dricursor.h @@ -0,0 +1,3 @@ +void DRICursorSaveFD(int); +int DRICursorSetDev(char *); +int DRICursorHotspot(int hotx, int hoty); -- 1.5.6.3 -- Tiago Vignatti C3SL - Centro de Computação Científica e Software Livre www.c3sl.ufpr.br _______________________________________________ xorg mailing list xorg@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/xorg