new KDrive input world order

Convert KDrive to GPE/GKE interface.
Add first-class drivers and enumerate every device separately through
Xi, instead of lamely attempting to aggregate them.
Add XKB support to the Linux keyboard driver.
Add 'thumb button' support to the tslib driver.
Rejig InitInput, so each DDX has to add a list of drivers it supports.
Support NewInputDeviceRequest, et al.
This commit is contained in:
Daniel Stone 2006-07-19 16:51:04 -04:00 committed by Daniel Stone
parent a274e7296b
commit 02d0910511
38 changed files with 3184 additions and 1692 deletions

View File

@ -439,6 +439,9 @@ dnl kdrive and its subsystems
AC_ARG_ENABLE(kdrive, AS_HELP_STRING([--enable-kdrive], [Build kdrive servers (default: no)]), [KDRIVE=$enableval], [KDRIVE=no]) AC_ARG_ENABLE(kdrive, AS_HELP_STRING([--enable-kdrive], [Build kdrive servers (default: no)]), [KDRIVE=$enableval], [KDRIVE=no])
AC_ARG_ENABLE(xephyr, AS_HELP_STRING([--enable-xephyr], [Build the kdrive Xephyr server (default: auto)]), [XEPHYR=$enableval], [XEPHYR=auto]) AC_ARG_ENABLE(xephyr, AS_HELP_STRING([--enable-xephyr], [Build the kdrive Xephyr server (default: auto)]), [XEPHYR=$enableval], [XEPHYR=auto])
AC_ARG_ENABLE(xsdl, AS_HELP_STRING([--enable-xsdl], [Build the kdrive Xsdl server (default: auto)]), [XSDL=$enableval], [XSDL=auto]) AC_ARG_ENABLE(xsdl, AS_HELP_STRING([--enable-xsdl], [Build the kdrive Xsdl server (default: auto)]), [XSDL=$enableval], [XSDL=auto])
AC_ARG_ENABLE(xfake, AS_HELP_STRING([--enable-xfake], [Build the kdrive 'fake' server (default: auto)]), [XFAKE=$enableval], [XFAKE=auto])
AC_ARG_ENABLE(xfbdev, AS_HELP_STRING([--enable-xfbdev], [Build the kdrive framebuffer device server (default: auto)]), [XFBDEV=$enableval], [XFBDEV=auto])
AC_ARG_ENABLE(kdrive-vesa, AS_HELP_STRING([--enable-kdrive-vesa], [Build the kdrive VESA-based servers (default: auto)]), [KDRIVEVESA=$enableval], [KDRIVEVESA=auto])
dnl xprint dnl xprint
AC_ARG_ENABLE(freetype, AS_HELP_STRING([ --enable-freetype], [Build Xprint FreeType backend (default: yes)]), [XP_USE_FREETYPE=$enableval],[XP_USE_FREETYPE=no]) AC_ARG_ENABLE(freetype, AS_HELP_STRING([ --enable-freetype], [Build Xprint FreeType backend (default: yes)]), [XP_USE_FREETYPE=$enableval],[XP_USE_FREETYPE=no])
AC_ARG_WITH(freetype-config, AS_HELP_STRING([ --with-freetype-config=PROG], [Use FreeType configuration program PROG (default: auto)]), freetype_config=$withval, freetype_config=auto) AC_ARG_WITH(freetype-config, AS_HELP_STRING([ --with-freetype-config=PROG], [Use FreeType configuration program PROG (default: auto)]), freetype_config=$withval, freetype_config=auto)
@ -510,7 +513,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.la'
XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la' XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
dnl Core modules for most extensions, et al. dnl Core modules for most extensions, et al.
REQUIRED_MODULES="randrproto renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto xproto xtrans xf86miscproto xf86vidmodeproto xf86bigfontproto [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto inputproto xf86dgaproto" REQUIRED_MODULES="randrproto renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto xproto xtrans [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto [inputproto >= 1.4]"
REQUIRED_LIBS="xfont xau fontenc" REQUIRED_LIBS="xfont xau fontenc"
if test "x$DBUS" = xauto; then if test "x$DBUS" = xauto; then
@ -824,11 +827,35 @@ AC_DEFINE(DDXOSINIT, 1, [Use OsVendorInit])
AC_DEFINE(SERVER_LOCK, 1, [Use a lock to prevent multiple servers on a display]) AC_DEFINE(SERVER_LOCK, 1, [Use a lock to prevent multiple servers on a display])
AC_DEFINE(SMART_SCHEDULE, 1, [Include time-based scheduler]) AC_DEFINE(SMART_SCHEDULE, 1, [Include time-based scheduler])
AC_DEFINE(NO_LIBCWRAPPER, 1, [Define to 1 if modules should avoid the libcwrapper]) AC_DEFINE(NO_LIBCWRAPPER, 1, [Define to 1 if modules should avoid the libcwrapper])
AM_CONDITIONAL(DEBUG, test "x$DEBUGGING" = xyes)
if ! test "x$DEBUGGING" = xyes; then if test "x$DEBUGGING" = xyes; then
AC_DEFINE(DEBUG, 1, [Enable debugging code])
else
AC_DEFINE(NDEBUG, 1, [Disable some debugging code]) AC_DEFINE(NDEBUG, 1, [Disable some debugging code])
fi fi
AM_CONDITIONAL(DEBUG, [test "x$DEBUGGING" = xyes])
# The Xorg binary needs to export symbols so that they can be used from modules
# Some platforms require extra flags to do this. gcc should set these flags
# when -rdynamic is passed to it, other compilers/linkers may need to be added
# here.
if test "x$GCC" = "xyes"; then
GCC_WARNINGS1="-Wall -Wpointer-arith -Wstrict-prototypes"
GCC_WARNINGS2="-Wmissing-prototypes -Wmissing-declarations"
GCC_WARNINGS3="-Wnested-externs -fno-strict-aliasing"
GCC_WARNINGS="$GCC_WARNINGS1 $GCC_WARNINGS2 $GCC_WARNINGS3"
if test "x$WERROR" = "xyes"; then
GCC_WARNINGS="${GCC_WARNINGS} -Werror"
fi
XSERVER_CFLAGS="$GCC_WARNINGS $XSERVER_CFLAGS"
LD_EXPORT_SYMBOLS_FLAG="-rdynamic"
fi
case $host_os in
openbsd*)
LD_EXPORT_SYMBOLS_FLAG="-Wl,--export-dynamic"
;;
esac
AC_SUBST([LD_EXPORT_SYMBOLS_FLAG])
AC_DEFINE(USE_RGB_TXT, 1, [Use rgb.txt directly]) AC_DEFINE(USE_RGB_TXT, 1, [Use rgb.txt directly])
AC_DEFINE(MITMISC, 1, [Support MIT Misc extension]) AC_DEFINE(MITMISC, 1, [Support MIT Misc extension])
@ -1038,6 +1065,14 @@ if test "x$XORG" = xyes -o "x$XGL" = xyes; then
XORG_CFLAGS="$XORGSERVER_CFLAGS -DHAVE_XORG_CONFIG_H" XORG_CFLAGS="$XORGSERVER_CFLAGS -DHAVE_XORG_CONFIG_H"
XORG_LIBS="$COMPOSITE_LIB $MI_LIB $FIXES_LIB $XEXTXORG_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XPSTUBS_LIB $OS_LIB" XORG_LIBS="$COMPOSITE_LIB $MI_LIB $FIXES_LIB $XEXTXORG_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XPSTUBS_LIB $OS_LIB"
AC_DEFINE(XF86VIDMODE, 1, [Support XFree86 Video Mode extension])
AC_DEFINE(XF86MISC, 1, [Support XFree86 miscellaneous extensions])
XORG_MODULES="xf86miscproto xf86vidmodeproto xf86dgaproto"
PKG_CHECK_MODULES(XORG_MODULES, [$XORG_MODULES])
XORG_CFLAGS="$XORG_CFLAGS $XORG_MODULES_CFLAGS"
XORG_LIBS="$XORG_LIBS $XORG_MODULES_LIBS"
dnl Check to see if dlopen is in default libraries (like Solaris, which dnl Check to see if dlopen is in default libraries (like Solaris, which
dnl has it in libc), or if libdl is needed to get it. dnl has it in libc), or if libdl is needed to get it.
AC_CHECK_FUNC([dlopen], [], AC_CHECK_FUNC([dlopen], [],
@ -1229,28 +1264,7 @@ int main () {
fi fi
AC_SUBST(PERL) AC_SUBST(PERL)
# The Xorg binary needs to export symbols so that they can be used from modules
# Some platforms require extra flags to do this. gcc should set these flags
# when -rdynamic is passed to it, other compilers/linkers may need to be added
# here.
if test "x$GCC" = "xyes"; then
GCC_WARNINGS1="-Wall -Wpointer-arith -Wstrict-prototypes"
GCC_WARNINGS2="-Wmissing-prototypes -Wmissing-declarations"
GCC_WARNINGS3="-Wnested-externs -fno-strict-aliasing"
GCC_WARNINGS="$GCC_WARNINGS1 $GCC_WARNINGS2 $GCC_WARNINGS3"
if test "x$WERROR" = "xyes"; then
GCC_WARNINGS="${GCC_WARNINGS} -Werror"
fi
XSERVER_CFLAGS="$GCC_WARNINGS $XSERVER_CFLAGS"
LD_EXPORT_SYMBOLS_FLAG="-rdynamic"
fi
case $host_os in
openbsd*)
LD_EXPORT_SYMBOLS_FLAG="-Wl,--export-dynamic"
;;
esac
AC_SUBST([XORG_CFLAGS]) AC_SUBST([XORG_CFLAGS])
AC_SUBST([LD_EXPORT_SYMBOLS_FLAG])
dnl these only go in xorg-config.h dnl these only go in xorg-config.h
XF86CONFIGFILE="xorg.conf" XF86CONFIGFILE="xorg.conf"
@ -1438,16 +1452,58 @@ if test "$KDRIVE" = yes; then
AC_DEFINE(KDRIVEDDXACTIONS,,[Build kdrive ddx]) AC_DEFINE(KDRIVEDDXACTIONS,,[Build kdrive ddx])
AC_CHECK_HEADERS([sys/vm86.h sys/io.h]) AC_CHECK_HEADERS([sys/vm86.h sys/io.h])
if test "$ac_cv_header_sys_vm86_h" = yes; then if test "$ac_cv_header_sys_vm86_h" = yes && test "x$KDRIVEVESA" = xauto; then
KDRIVEVESA=yes
fi
if test "x$KDRIVEVESA" = xyes; then
KDRIVEFBDEVLIB=yes
AC_DEFINE(KDRIVEVESA, 1, [Build VESA-based kdrive servers]) AC_DEFINE(KDRIVEVESA, 1, [Build VESA-based kdrive servers])
fi fi
AC_CHECK_HEADERS([linux/fb.h]) AC_CHECK_HEADERS([linux/fb.h])
if test "$ac_cv_header_linux_fb_h" = yes; then if test "$ac_cv_header_linux_fb_h" = yes && test "x$XFBDEV" = xauto; then
XFBDEV=yes
fi
if test "x$XFBDEV" = xyes; then
KDRIVEFBDEVLIB=yes
AC_DEFINE(KDRIVEFBDEV, 1, [Build fbdev-based kdrive server]) AC_DEFINE(KDRIVEFBDEV, 1, [Build fbdev-based kdrive server])
fi fi
# tslib... # tslib...
AC_CHECK_LIB(ts, ts_open, [HAVE_TSLIB="yes"])
if test "x$TSLIB" = xauto && test "x$HAVE_TSLIB" = xyes; then
TSLIB=yes
fi
if test "x$TSLIB" = xyes; then
if ! test "x$HAVE_TSLIB" = xyes; then
AC_MSG_ERROR([tslib must be installed to build the tslib input driver.])
fi
TSLIB_LIBS="-lts"
AC_DEFINE(TSLIB, 1, [Have tslib support])
fi
if test x"$ac_cv_header_SDL_SDL_h" = xyes && "x$XSDL" = xauto; then
XSDL=yes
fi
if test x"$XSDL" = xyes; then
# PKG_CHECK_MODULES(XSDL_EXTRA, Xfont xau $XDMCP_MODULES)
AC_DEFINE(XSDLSERVER,1,[Build Xsdl server])
XSDL_LIBS="`sdl-config --libs` $XSERVER_LIBS"
XSDL_INCS="`sdl-config --cflags` $XSERVER_CFLAGS"
fi
PKG_CHECK_MODULES(XEPHYR, x11 xext xfont xau xdmcp, [xephyr="yes"], [xephyr="no"])
if test "x$XEPHYR" = xauto; then
XEPHYR=xephyr
fi
# Xephyr needs nanosleep() which is in librt on Solaris
AC_CHECK_FUNC([nanosleep], [],
AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt"))
XEPHYR_LIBS="$XEPHYR_LIBS $XSERVER_LIBS"
# damage shadow extension glx (NOTYET) fb mi # damage shadow extension glx (NOTYET) fb mi
KDRIVE_INC='-I$(top_srcdir)/hw/kdrive/src' KDRIVE_INC='-I$(top_srcdir)/hw/kdrive/src'
@ -1460,48 +1516,38 @@ if test "$KDRIVE" = yes; then
# dix os fb mi extension glx (NOTYET) damage shadow xpstubs # dix os fb mi extension glx (NOTYET) damage shadow xpstubs
#KDRIVE_PURE_LIBS="$DIX_LIB $OS_LIB $FB_LIB $XEXT_LIB $MIEXT_DAMAGE_LIB \ #KDRIVE_PURE_LIBS="$DIX_LIB $OS_LIB $FB_LIB $XEXT_LIB $MIEXT_DAMAGE_LIB \
# $MIEXT_SHADOW_LIB $XPSTUBS_LIB" # $MIEXT_SHADOW_LIB $XPSTUBS_LIB"
KDRIVE_PURE_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $OS_LIB" KDRIVE_PURE_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $TSLIB_LIBS $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $OS_LIB"
KDRIVE_LIB='$(top_builddir)/hw/kdrive/src/libkdrive.a' KDRIVE_LIB='$(top_builddir)/hw/kdrive/src/libkdrive.a'
KDRIVE_OS_LIB='$(top_builddir)/hw/kdrive/linux/liblinux.a' KDRIVE_OS_LIB='$(top_builddir)/hw/kdrive/linux/liblinux.a'
KDRIVE_STUB_LIB='$(top_builddir)/hw/kdrive/src/libkdrivestubs.a' KDRIVE_STUB_LIB='$(top_builddir)/hw/kdrive/src/libkdrivestubs.a'
KDRIVE_LIBS="$DIX_LIB $CONFIG_LIB $KDRIVE_LIB $KDRIVE_OS_LIB $KDRIVE_PURE_LIBS $KDRIVE_STUB_LIB" KDRIVE_LIBS="$XSERVERLIBS_LIBS $DIX_LIB $CONFIG_LIB $KDRIVE_LIB $KDRIVE_OS_LIB $KDRIVE_PURE_LIBS $KDRIVE_STUB_LIB"
# check if we can build Xephyr # check if we can build Xephyr
PKG_CHECK_MODULES(XEPHYR, x11 xext xfont xau xdmcp, [xephyr="yes"], [xephyr="no"]) PKG_CHECK_MODULES(XEPHYR, x11 xext xfont xau xdmcp, [xephyr="yes"], [xephyr="no"])
XEPHYR_LIBS="$XEPHYR_LIBS $XSERVER_LIBS"
# check for SDL SDK # Xephyr needs nanosleep() which is in librt on Solaris
AC_CHECK_HEADERS([SDL/SDL.h]) AC_CHECK_FUNC([nanosleep], [],
fi
AC_SUBST(KDRIVE_INCS)
AC_SUBST(KDRIVE_PURE_INCS)
AC_SUBST(KDRIVE_CFLAGS)
AC_SUBST(KDRIVE_PURE_LIBS)
AC_SUBST(KDRIVE_LIBS)
AM_CONDITIONAL(TSLIB, false)
AM_CONDITIONAL(H3600_TS, false)
AM_CONDITIONAL(KDRIVEVESA, [test x"$ac_cv_header_sys_vm86_h" = xyes])
AM_CONDITIONAL(KDRIVEFBDEV, [test x"$ac_cv_header_linux_fb_h" = xyes])
#AM_CONDITIONAL(KDRIVEVESA, false)
#AM_CONDITIONAL(KDRIVEFBDEV, false)
# Xephyr needs nanosleep() which is in librt on Solaris
AC_CHECK_FUNC([nanosleep], [],
AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt")) AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt"))
AM_CONDITIONAL(XEPHYR, [test x"$xephyr" = xyes]) AC_SUBST([XEPHYR_LIBS])
XEPHYR_LIBS="$XEPHYR_LIBS $XSERVER_LIBS" AC_SUBST([XEPHYR_INCS])
AC_SUBST([XEPHYR_LIBS]) AC_SUBST([XSDL_LIBS])
AC_SUBST([XEPHYR_INCS]) AC_SUBST([XSDL_INCS])
AM_CONDITIONAL(XSDLSERVER, [test x"$ac_cv_header_SDL_SDL_h" = xyes])
if test x"$ac_cv_header_SDL_SDL_h" = xyes -o x"$XSDL" = xyes; then
# PKG_CHECK_MODULES(XSDL_EXTRA, Xfont xau $XDMCP_MODULES)
AC_DEFINE(XSDLSERVER,,[Build Xsdl server])
XSDL_LIBS="`sdl-config --libs` $XSERVER_LIBS"
XSDL_INCS="`sdl-config --cflags` $XSERVER_CFLAGS"
fi fi
AC_SUBST([XSDL_LIBS]) AC_SUBST([KDRIVE_INCS])
AC_SUBST([XSDL_INCS]) AC_SUBST([KDRIVE_PURE_INCS])
AC_SUBST([KDRIVE_CFLAGS])
AC_SUBST([KDRIVE_PURE_LIBS])
AC_SUBST([KDRIVE_LIBS])
AM_CONDITIONAL(TSLIB, [test "x$TSLIB" = xyes])
AM_CONDITIONAL(H3600_TS, false)
AM_CONDITIONAL(KDRIVEVESA, [test "x$KDRIVEVESA" = xyes])
AM_CONDITIONAL(KDRIVEFBDEV, [test "x$XFBDEV" = xyes])
AM_CONDITIONAL(XSDLSERVER, [test x"$XSDL" = xyes])
AM_CONDITIONAL(XEPHYR, [test "x$KDRIVE" = xyes && test "x$xephyr" = xyes])
AM_CONDITIONAL(BUILD_KDRIVEFBDEVLIB, [test "x$KDRIVE" = xyes && test "x$KDRIVEFBDEVLIB" = xyes])
AM_CONDITIONAL(XFAKESERVER, [test "x$KDRIVE" = xyes && test "x$XFAKE" = xyes])
dnl these only go in xkb-config.h (which is shared by the Xorg and Xnest servers) dnl these only go in xkb-config.h (which is shared by the Xorg and Xnest servers)
@ -1510,7 +1556,6 @@ AC_DEFINE_DIR(XKB_BASE_DIRECTORY, XKBPATH, [Path to XKB data])
AC_DEFINE_DIR(XKB_BIN_DIRECTORY, bindir, [Path to XKB bin dir]) AC_DEFINE_DIR(XKB_BIN_DIRECTORY, bindir, [Path to XKB bin dir])
# Make sure XKM_OUTPUT_DIR is an absolute path # Make sure XKM_OUTPUT_DIR is an absolute path
XKBOUTPUT_FIRSTCHAR=`echo $XKBOUTPUT | cut -b 1` XKBOUTPUT_FIRSTCHAR=`echo $XKBOUTPUT | cut -b 1`
if [[ x$XKBOUTPUT_FIRSTCHAR != x/ ]] ; then if [[ x$XKBOUTPUT_FIRSTCHAR != x/ ]] ; then
@ -1549,15 +1594,21 @@ esac
AC_DEFINE_DIR(PROJECTROOT, prefix, [Overall prefix]) AC_DEFINE_DIR(PROJECTROOT, prefix, [Overall prefix])
dnl xorgconfig CLI configuration utility dnl xorgconfig CLI configuration utility
PKG_CHECK_MODULES([XORGCONFIG_DEP], [xkbfile x11]) if test "x$XORG" = xyes; then
AC_SUBST(XORGCONFIG_DEP_CFLAGS) PKG_CHECK_MODULES([XORGCONFIG_DEP], [xkbfile x11])
AC_SUBST(XORGCONFIG_DEP_LIBS) AC_SUBST(XORGCONFIG_DEP_CFLAGS)
AC_SUBST(XORGCONFIG_DEP_LIBS)
fi
dnl xorgcfg GUI configuration utility dnl xorgcfg GUI configuration utility
AC_ARG_ENABLE(xorgcfg, AS_HELP_STRING([--enable-xorgcfg], AC_ARG_ENABLE(xorgcfg, AS_HELP_STRING([--enable-xorgcfg],
[Build xorgcfg GUI configuration utility (default: yes)]), [Build xorgcfg GUI configuration utility (default: auto)]),
[XORGCFG=$enableval],[XORGCFG=yes]) [XORGCFG=$enableval],[XORGCFG=auto])
if test x$XORGCFG = xyes ; then if test "x$XORGCFG" = xauto && test "x$XORG" = xyes; then
XORGCFG=yes
fi
if test "x$XORGCFG" = xyes; then
PKG_CHECK_MODULES([XORGCFG_DEP], PKG_CHECK_MODULES([XORGCFG_DEP],
[xkbui >= 1.0.2 xkbfile xxf86misc xxf86vm xaw7 xmu xt xpm xext x11]) [xkbui >= 1.0.2 xkbfile xxf86misc xxf86vm xaw7 xmu xt xpm xext x11])
AC_CHECK_LIB([curses],[waddstr], AC_CHECK_LIB([curses],[waddstr],

View File

@ -3,10 +3,14 @@ VESA_SUBDIRS = vesa ati chips epson i810 mach64 mga neomagic nvidia pm2 r128 \
smi via smi via
endif endif
if KDRIVEFBDEV if BUILD_KDRIVEFBDEVLIB
FBDEV_SUBDIRS = fbdev FBDEV_SUBDIRS = fbdev
endif endif
if XFAKESERVER
XFAKE_SUBDIRS = fake
endif
if XSDLSERVER if XSDLSERVER
XSDL_SUBDIRS = sdl XSDL_SUBDIRS = sdl
endif endif
@ -22,7 +26,7 @@ SUBDIRS = \
$(FBDEV_SUBDIRS) \ $(FBDEV_SUBDIRS) \
$(VESA_SUBDIRS) \ $(VESA_SUBDIRS) \
$(XEPHYR_SUBDIRS) \ $(XEPHYR_SUBDIRS) \
fake $(XFAKE_SUBDIRS)
DIST_SUBDIRS = vesa ati chips epson i810 mach64 mga neomagic nvidia pm2 r128 \ DIST_SUBDIRS = vesa ati chips epson i810 mach64 mga neomagic nvidia pm2 r128 \
smi via fbdev sdl ephyr src linux fake sis300 smi via fbdev sdl ephyr src linux fake sis300

View File

@ -53,7 +53,15 @@ InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
void void
InitInput(int argc, char **argv) InitInput(int argc, char **argv)
{ {
KdInitInput(&LinuxMouseFuncs, &LinuxKeyboardFuncs); KdKeyboardInfo *ki = NULL;
KdAddPointerDriver(&LinuxMouseDriver);
ki = KdNewKeyboard();
if (ki) {
ki->driver = &LinuxKeyboardDriver;
KdAddKeyboard(ki);
}
KdInitInput();
} }
void void

View File

@ -33,7 +33,6 @@ Xephyr_LDADD = \
libxephyr-hostx.a \ libxephyr-hostx.a \
../../../exa/libexa.la \ ../../../exa/libexa.la \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@KDRIVE_LIBS@ \
$(TSLIB_LIBS) \ $(TSLIB_LIBS) \
@XEPHYR_LIBS@ @XEPHYR_LIBS@

View File

@ -36,10 +36,16 @@
#include "inputstr.h" #include "inputstr.h"
extern int KdTsPhyScreen; extern int KdTsPhyScreen;
extern DeviceIntPtr pKdKeyboard; KdKeyboardInfo *ephyrKbd;
KdPointerInfo *ephyrMouse;
EphyrKeySyms ephyrKeySyms;
static int mouseState = 0; static int mouseState = 0;
typedef struct _EphyrInputPrivate {
Bool enabled;
} EphyrKbdPrivate, EphyrPointerPrivate;
Bool EphyrWantGrayScale = 0; Bool EphyrWantGrayScale = 0;
Bool Bool
@ -206,15 +212,14 @@ ephyrMapFramebuffer (KdScreenInfo *screen)
{ {
EphyrScrPriv *scrpriv = screen->driver; EphyrScrPriv *scrpriv = screen->driver;
EphyrPriv *priv = screen->card->driver; EphyrPriv *priv = screen->card->driver;
KdMouseMatrix m; KdPointerMatrix m;
int buffer_height; int buffer_height;
EPHYR_DBG(" screen->width: %d, screen->height: %d", EPHYR_DBG(" screen->width: %d, screen->height: %d",
screen->width, screen->height); screen->width, screen->height);
KdComputeMouseMatrix (&m, scrpriv->randr, screen->width, screen->height); KdComputePointerMatrix (&m, scrpriv->randr, screen->width, screen->height);
KdSetPointerMatrix (&m);
KdSetMouseMatrix (&m);
priv->bytes_per_line = ((screen->width * screen->fb[0].bitsPerPixel + 31) >> 5) << 2; priv->bytes_per_line = ((screen->width * screen->fb[0].bitsPerPixel + 31) >> 5) << 2;
@ -719,8 +724,9 @@ ephyrUpdateModifierState(unsigned int state)
kptr = &keyc->down[key >> 3]; kptr = &keyc->down[key >> 3];
bit = 1 << (key & 7); bit = 1 << (key & 7);
if (*kptr & bit) if (*kptr & bit && ephyrKbd &&
KdEnqueueKeyboardEvent(key, TRUE); /* release */ ((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled)
KdEnqueueKeyboardEvent(ephyrKbd, key, TRUE); /* release */
if (--count == 0) if (--count == 0)
break; break;
@ -732,7 +738,9 @@ ephyrUpdateModifierState(unsigned int state)
for (key = 0; key < MAP_LENGTH; key++) for (key = 0; key < MAP_LENGTH; key++)
if (keyc->modifierMap[key] & mask) if (keyc->modifierMap[key] & mask)
{ {
KdEnqueueKeyboardEvent(key, FALSE); /* press */ if (keyc->modifierMap[key] & mask && ephyrKbd &&
((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled)
KdEnqueueKeyboardEvent(ephyrKbd, key, FALSE); /* press */
break; break;
} }
} }
@ -748,31 +756,47 @@ ephyrPoll(void)
switch (ev.type) switch (ev.type)
{ {
case EPHYR_EV_MOUSE_MOTION: case EPHYR_EV_MOUSE_MOTION:
KdEnqueueMouseEvent(kdMouseInfo, mouseState, if (!ephyrMouse ||
!((EphyrPointerPrivate *)ephyrMouse->driverPrivate)->enabled)
continue;
KdEnqueuePointerEvent(ephyrMouse, mouseState,
ev.data.mouse_motion.x, ev.data.mouse_motion.x,
ev.data.mouse_motion.y); ev.data.mouse_motion.y,
0);
break; break;
case EPHYR_EV_MOUSE_PRESS: case EPHYR_EV_MOUSE_PRESS:
if (!ephyrMouse ||
!((EphyrPointerPrivate *)ephyrMouse->driverPrivate)->enabled)
continue;
ephyrUpdateModifierState(ev.key_state); ephyrUpdateModifierState(ev.key_state);
mouseState |= ev.data.mouse_down.button_num; mouseState |= ev.data.mouse_down.button_num;
KdEnqueueMouseEvent(kdMouseInfo, mouseState|KD_MOUSE_DELTA, 0, 0); KdEnqueuePointerEvent(ephyrMouse, mouseState|KD_MOUSE_DELTA, 0, 0, 0);
break; break;
case EPHYR_EV_MOUSE_RELEASE: case EPHYR_EV_MOUSE_RELEASE:
if (!ephyrMouse ||
!((EphyrPointerPrivate *)ephyrMouse->driverPrivate)->enabled)
continue;
ephyrUpdateModifierState(ev.key_state); ephyrUpdateModifierState(ev.key_state);
mouseState &= ~ev.data.mouse_up.button_num; mouseState &= ~ev.data.mouse_up.button_num;
KdEnqueueMouseEvent(kdMouseInfo, mouseState|KD_MOUSE_DELTA, 0, 0); KdEnqueuePointerEvent(ephyrMouse, mouseState|KD_MOUSE_DELTA, 0, 0, 0);
break; break;
case EPHYR_EV_KEY_PRESS: case EPHYR_EV_KEY_PRESS:
if (!ephyrKbd ||
!((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled)
continue;
ephyrUpdateModifierState(ev.key_state); ephyrUpdateModifierState(ev.key_state);
KdEnqueueKeyboardEvent (ev.data.key_down.scancode, FALSE); KdEnqueueKeyboardEvent (ephyrKbd, ev.data.key_down.scancode, FALSE);
break; break;
case EPHYR_EV_KEY_RELEASE: case EPHYR_EV_KEY_RELEASE:
if (!ephyrKbd ||
!((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled)
continue;
ephyrUpdateModifierState(ev.key_state); ephyrUpdateModifierState(ev.key_state);
KdEnqueueKeyboardEvent (ev.data.key_up.scancode, TRUE); KdEnqueueKeyboardEvent (ephyrKbd, ev.data.key_up.scancode, TRUE);
break; break;
default: default:
@ -833,59 +857,115 @@ ephyrPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
/* Mouse calls */ /* Mouse calls */
static Bool static Status
MouseInit (void) MouseInit (KdPointerInfo *pi)
{ {
return TRUE; pi->driverPrivate = (EphyrPointerPrivate *)
xcalloc(sizeof(EphyrPointerPrivate), 1);
((EphyrPointerPrivate *)pi->driverPrivate)->enabled = FALSE;
ephyrMouse = pi;
/* FIXME DO NOT COMMIT */
KdAddPointerDriver(&EphyrMouseDriver);
ErrorF("SUCCESS!\n");
return Success;
}
static Status
MouseEnable (KdPointerInfo *pi)
{
((EphyrPointerPrivate *)pi->driverPrivate)->enabled = TRUE;
ErrorF("SUCCESS ENABLE!\n");
return Success;
} }
static void static void
MouseFini (void) MouseDisable (KdPointerInfo *pi)
{ {
; ((EphyrPointerPrivate *)pi->driverPrivate)->enabled = FALSE;
return;
} }
KdMouseFuncs EphyrMouseFuncs = { static void
MouseFini (KdPointerInfo *pi)
{
ephyrMouse = NULL;
return;
}
KdPointerDriver EphyrMouseDriver = {
"ephyr",
MouseInit, MouseInit,
MouseEnable,
MouseDisable,
MouseFini, MouseFini,
NULL,
}; };
/* Keyboard */ /* Keyboard */
static void static Status
EphyrKeyboardLoad (void) EphyrKeyboardInit (KdKeyboardInfo *ki)
{ {
EPHYR_DBG("mark"); ki->driverPrivate = (EphyrKbdPrivate *)
xcalloc(sizeof(EphyrKbdPrivate), 1);
/* FIXME blah blah overrunning memory blah blah */
ki->minScanCode = ki->keySyms.minKeyCode = 0;
ki->maxScanCode = ki->keySyms.maxKeyCode = 255;
ephyrKbd = ki;
return Success;
}
static Status
EphyrKeyboardEnable (KdKeyboardInfo *ki)
{
hostx_load_keymap(); hostx_load_keymap();
} if (!ephyrKeySyms.map) {
ErrorF("Couldn't load keymap from host\n");
return BadAlloc;
}
ki->keySyms.minKeyCode = ephyrKeySyms.minKeyCode;
ki->keySyms.maxKeyCode = ephyrKeySyms.maxKeyCode;
ki->minScanCode = ki->keySyms.minKeyCode;
ki->maxScanCode = ki->keySyms.maxKeyCode;
ki->keySyms.mapWidth = ephyrKeySyms.mapWidth;
ki->keySyms.map = ephyrKeySyms.map;
((EphyrKbdPrivate *)ki->driverPrivate)->enabled = TRUE;
static int return Success;
EphyrKeyboardInit (void)
{
return 0;
} }
static void static void
EphyrKeyboardFini (void) EphyrKeyboardDisable (KdKeyboardInfo *ki)
{
((EphyrKbdPrivate *)ki->driverPrivate)->enabled = FALSE;
}
static void
EphyrKeyboardFini (KdKeyboardInfo *ki)
{
/* not xfree: we call malloc from hostx.c. */
free(ki->keySyms.map);
ephyrKbd = NULL;
return;
}
static void
EphyrKeyboardLeds (KdKeyboardInfo *ki, int leds)
{ {
} }
static void static void
EphyrKeyboardLeds (int leds) EphyrKeyboardBell (KdKeyboardInfo *ki, int volume, int frequency, int duration)
{ {
} }
static void KdKeyboardDriver EphyrKeyboardDriver = {
EphyrKeyboardBell (int volume, int frequency, int duration) "ephyr",
{
}
KdKeyboardFuncs EphyrKeyboardFuncs = {
EphyrKeyboardLoad,
EphyrKeyboardInit, EphyrKeyboardInit,
EphyrKeyboardEnable,
EphyrKeyboardLeds, EphyrKeyboardLeds,
EphyrKeyboardBell, EphyrKeyboardBell,
EphyrKeyboardDisable,
EphyrKeyboardFini, EphyrKeyboardFini,
0, NULL,
}; };

View File

@ -31,7 +31,6 @@
#include "os.h" /* for OsSignal() */ #include "os.h" /* for OsSignal() */
#include "kdrive.h" #include "kdrive.h"
#include "kkeymap.h"
#include "hostx.h" #include "hostx.h"
#include "exa.h" #include "exa.h"
@ -69,6 +68,8 @@ typedef struct _ephyrScrPriv {
} EphyrScrPriv; } EphyrScrPriv;
extern KdCardFuncs ephyrFuncs; extern KdCardFuncs ephyrFuncs;
extern KdKeyboardInfo *ephyrKbd;
extern KdPointerInfo *ephyrMouse;
Bool Bool
ephyrInitialize (KdCardInfo *card, EphyrPriv *priv); ephyrInitialize (KdCardInfo *card, EphyrPriv *priv);
@ -167,9 +168,9 @@ ephyrShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf);
void void
ephyrUpdateModifierState(unsigned int state); ephyrUpdateModifierState(unsigned int state);
extern KdMouseFuncs EphyrMouseFuncs; extern KdPointerDriver EphyrMouseDriver;
extern KdKeyboardFuncs EphyrKeyboardFuncs; extern KdKeyboardDriver EphyrKeyboardDriver;
extern KdOsFuncs EphyrOsFuncs; extern KdOsFuncs EphyrOsFuncs;

View File

@ -51,7 +51,24 @@ InitOutput (ScreenInfo *pScreenInfo, int argc, char **argv)
void void
InitInput (int argc, char **argv) InitInput (int argc, char **argv)
{ {
KdInitInput (&EphyrMouseFuncs, &EphyrKeyboardFuncs); KdKeyboardInfo *ki;
KdPointerInfo *pi;
ki = KdNewKeyboard();
if (!ki)
FatalError("Couldn't create Xephyr keyboard\n");
ki->driver = &EphyrKeyboardDriver;
ki->name = KdSaveString("Xephyr virtual keyboard");
KdAddKeyboard(ki);
pi = KdNewPointer();
if (!pi)
FatalError("Couldn't create Xephyr pointer\n");
pi->driver = &EphyrMouseDriver;
pi->name = KdSaveString("Xephyr virtual mouse");
KdAddPointer(pi);
KdInitInput();
} }
void void

View File

@ -77,14 +77,8 @@ static EphyrHostXVars HostX = { "?", 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
static int HostXWantDamageDebug = 0; static int HostXWantDamageDebug = 0;
extern KeySym EphyrKeymap[]; extern EphyrKeySyms ephyrKeySyms;
extern KeySym kdKeymap[];
extern int kdMinScanCode;
extern int kdMaxScanCode;
extern int kdMinKeyCode;
extern int kdMaxKeyCode;
extern int kdKeymapWidth;
extern int monitorResolution; extern int monitorResolution;
static void static void
@ -403,9 +397,9 @@ hostx_get_bpp(void)
} }
void void
hostx_get_visual_masks (unsigned long *rmsk, hostx_get_visual_masks (CARD32 *rmsk,
unsigned long *gmsk, CARD32 *gmsk,
unsigned long *bmsk) CARD32 *bmsk)
{ {
if (host_depth_matches_server()) if (host_depth_matches_server())
{ {
@ -681,6 +675,13 @@ hostx_load_keymap(void)
max_keycode - min_keycode + 1, max_keycode - min_keycode + 1,
&host_width); &host_width);
ephyrKeySyms.map = (KeySym *)calloc(sizeof(KeySym),
(max_keycode - min_keycode + 1) *
width);
if (!ephyrKeySyms.map)
return;
/* Try and copy the hosts keymap into our keymap to avoid loads /* Try and copy the hosts keymap into our keymap to avoid loads
* of messing around. * of messing around.
* *
@ -695,13 +696,9 @@ hostx_load_keymap(void)
EPHYR_DBG("keymap width, host:%d kdrive:%d", host_width, width); EPHYR_DBG("keymap width, host:%d kdrive:%d", host_width, width);
/* all kdrive vars - see kkeymap.c */ ephyrKeySyms.minKeyCode = min_keycode;
ephyrKeySyms.maxKeyCode = max_keycode;
kdMinScanCode = min_keycode; ephyrKeySyms.mapWidth = (width > 4) ? 4 : width;
kdMaxScanCode = max_keycode;
kdMinKeyCode = min_keycode;
kdMaxKeyCode = max_keycode;
kdKeymapWidth = width;
XFree(keymap); XFree(keymap);
} }

View File

@ -26,6 +26,9 @@
#ifndef _XLIBS_STUFF_H_ #ifndef _XLIBS_STUFF_H_
#define _XLIBS_STUFF_H_ #define _XLIBS_STUFF_H_
#include <X11/X.h>
#include <X11/Xmd.h>
#define EPHYR_WANT_DEBUG 0 #define EPHYR_WANT_DEBUG 0
#if (EPHYR_WANT_DEBUG) #if (EPHYR_WANT_DEBUG)
@ -48,6 +51,14 @@ typedef enum EphyrHostXEventType
} }
EphyrHostXEventType; EphyrHostXEventType;
/* I can't believe it's not a KeySymsRec. */
typedef struct {
int minKeyCode;
int maxKeyCode;
int mapWidth;
KeySym *map;
} EphyrKeySyms;
struct EphyrHostXEvent struct EphyrHostXEvent
{ {
EphyrHostXEventType type; EphyrHostXEventType type;
@ -126,9 +137,9 @@ int
hostx_get_bpp(void); hostx_get_bpp(void);
void void
hostx_get_visual_masks (unsigned long *rmsk, hostx_get_visual_masks (CARD32 *rmsk,
unsigned long *gmsk, CARD32 *gmsk,
unsigned long *bmsk); CARD32 *bmsk);
void void
hostx_set_cmap_entry(unsigned char idx, hostx_set_cmap_entry(unsigned char idx,
unsigned char r, unsigned char r,

View File

@ -158,7 +158,7 @@ Bool
fakeMapFramebuffer (KdScreenInfo *screen) fakeMapFramebuffer (KdScreenInfo *screen)
{ {
FakeScrPriv *scrpriv = screen->driver; FakeScrPriv *scrpriv = screen->driver;
KdMouseMatrix m; KdPointerMatrix m;
FakePriv *priv = screen->card->driver; FakePriv *priv = screen->card->driver;
if (scrpriv->randr != RR_Rotate_0) if (scrpriv->randr != RR_Rotate_0)
@ -166,9 +166,9 @@ fakeMapFramebuffer (KdScreenInfo *screen)
else else
scrpriv->shadow = FALSE; scrpriv->shadow = FALSE;
KdComputeMouseMatrix (&m, scrpriv->randr, screen->width, screen->height); KdComputePointerMatrix (&m, scrpriv->randr, screen->width, screen->height);
KdSetMouseMatrix (&m); KdSetPointerMatrix (&m);
priv->bytes_per_line = ((screen->width * screen->fb[0].bitsPerPixel + 31) >> 5) << 2; priv->bytes_per_line = ((screen->width * screen->fb[0].bitsPerPixel + 31) >> 5) << 2;
if (priv->base) if (priv->base)

View File

@ -130,9 +130,9 @@ fakeRandRInit (ScreenPtr pScreen);
#endif #endif
extern KdMouseFuncs FakeMouseFuncs; extern KdPointerDriver FakePointerDriver;
extern KdKeyboardFuncs FakeKeyboardFuncs; extern KdKeyboardDriver FakeKeyboardDriver;
extern KdOsFuncs FakeOsFuncs; extern KdOsFuncs FakeOsFuncs;

View File

@ -44,7 +44,22 @@ InitOutput (ScreenInfo *pScreenInfo, int argc, char **argv)
void void
InitInput (int argc, char **argv) InitInput (int argc, char **argv)
{ {
KdInitInput (&FakeMouseFuncs, &FakeKeyboardFuncs); KdPointerInfo *pi;
KdKeyboardInfo *ki;
pi = KdNewPointer ();
if (!pi)
return;
pi->driver = &FakePointerDriver;
KdAddPointer(pi);
ki = KdNewKeyboard ();
if (!ki)
return;
ki->driver = &FakeKeyboardDriver;
KdAddKeyboard(ki);
KdInitInput ();
} }
void void

View File

@ -27,7 +27,6 @@
#include <kdrive-config.h> #include <kdrive-config.h>
#endif #endif
#include "fake.h" #include "fake.h"
#include "kkeymap.h"
#include <X11/keysym.h> #include <X11/keysym.h>
#define FAKE_WIDTH 2 #define FAKE_WIDTH 2
@ -155,41 +154,58 @@ KeySym FakeKeymap[] = {
/* 116 123 */ NoSymbol, NoSymbol, /* tiny button */ /* 116 123 */ NoSymbol, NoSymbol, /* tiny button */
}; };
static void static Status
FakeKeyboardLoad (void) FakeKeyboardInit (KdKeyboardInfo *ki)
{ {
kdMinScanCode = 1; ki->keySyms.minKeyCode = 1;
kdKeymapWidth = FAKE_WIDTH; ki->keySyms.maxKeyCode = (sizeof (FakeKeymap) / sizeof (FakeKeymap[0])) / FAKE_WIDTH;
kdMaxScanCode = (sizeof (FakeKeymap) / sizeof (FakeKeymap[0])) / FAKE_WIDTH; ki->keySyms.mapWidth = FAKE_WIDTH;
memcpy (kdKeymap, FakeKeymap, sizeof (FakeKeymap)); if (ki->keySyms.map)
xfree(ki->keySyms.map);
ki->keySyms.map = (KeySym *)xalloc(sizeof(FakeKeymap));
if (!ki->keySyms.map)
return BadAlloc;
memcpy (ki->keySyms.map, FakeKeymap, sizeof (FakeKeymap));
return Success;
} }
static int static Status
FakeKeyboardInit (void) FakeKeyboardEnable (KdKeyboardInfo *ki)
{ {
return 0; return Success;
} }
static void static void
FakeKeyboardFini (void) FakeKeyboardDisable (KdKeyboardInfo *ki)
{
return;
}
static void
FakeKeyboardFini (KdKeyboardInfo *ki)
{
xfree(ki->keySyms.map);
ki->keySyms.map = NULL;
}
static void
FakeKeyboardLeds (KdKeyboardInfo *ki, int leds)
{ {
} }
static void static void
FakeKeyboardLeds (int leds) FakeKeyboardBell (KdKeyboardInfo *ki, int volume, int frequency, int duration)
{ {
} }
static void KdKeyboardDriver FakeKeyboardDriver = {
FakeKeyboardBell (int volume, int frequency, int duration) "fake",
{
}
KdKeyboardFuncs FakeKeyboardFuncs = {
FakeKeyboardLoad,
FakeKeyboardInit, FakeKeyboardInit,
FakeKeyboardEnable,
FakeKeyboardLeds, FakeKeyboardLeds,
FakeKeyboardBell, FakeKeyboardBell,
FakeKeyboardDisable,
FakeKeyboardFini, FakeKeyboardFini,
0, NULL,
}; };

View File

@ -35,19 +35,35 @@
#include "scrnintstr.h" #include "scrnintstr.h"
#include "kdrive.h" #include "kdrive.h"
static Bool static Status
MouseInit (void) MouseInit (KdPointerInfo *pi)
{ {
return TRUE; return Success;
}
static Status
MouseEnable (KdPointerInfo *pi)
{
return Success;
} }
static void static void
MouseFini (void) MouseDisable (KdPointerInfo *pi)
{ {
return;
}
static void
MouseFini (KdPointerInfo *pi)
{
return;
} }
KdMouseFuncs FakeMouseFuncs = { KdPointerDriver FakePointerDriver = {
"fake",
MouseInit, MouseInit,
MouseEnable,
MouseDisable,
MouseFini, MouseFini,
}; };

View File

@ -4,8 +4,6 @@ INCLUDES = \
noinst_LIBRARIES = libfbdev.a noinst_LIBRARIES = libfbdev.a
bin_PROGRAMS = Xfbdev
if TSLIB if TSLIB
TSLIB_FLAG = -lts TSLIB_FLAG = -lts
endif endif
@ -14,6 +12,9 @@ libfbdev_a_SOURCES = \
fbdev.c \ fbdev.c \
fbdev.h fbdev.h
if KDRIVEFBDEV
bin_PROGRAMS = Xfbdev
Xfbdev_SOURCES = \ Xfbdev_SOURCES = \
fbinit.c fbinit.c
@ -26,4 +27,4 @@ Xfbdev_LDADD = \
Xfbdev_DEPENDENCIES = \ Xfbdev_DEPENDENCIES = \
libfbdev.a \ libfbdev.a \
@KDRIVE_LIBS@ @KDRIVE_LIBS@
endif

View File

@ -323,7 +323,7 @@ Bool
fbdevMapFramebuffer (KdScreenInfo *screen) fbdevMapFramebuffer (KdScreenInfo *screen)
{ {
FbdevScrPriv *scrpriv = screen->driver; FbdevScrPriv *scrpriv = screen->driver;
KdMouseMatrix m; KdPointerMatrix m;
FbdevPriv *priv = screen->card->driver; FbdevPriv *priv = screen->card->driver;
if (scrpriv->randr != RR_Rotate_0) if (scrpriv->randr != RR_Rotate_0)
@ -331,9 +331,9 @@ fbdevMapFramebuffer (KdScreenInfo *screen)
else else
scrpriv->shadow = FALSE; scrpriv->shadow = FALSE;
KdComputeMouseMatrix (&m, scrpriv->randr, screen->width, screen->height); KdComputePointerMatrix (&m, scrpriv->randr, screen->width, screen->height);
KdSetMouseMatrix (&m); KdSetPointerMatrix (&m);
screen->width = priv->var.xres; screen->width = priv->var.xres;
screen->height = priv->var.yres; screen->height = priv->var.yres;

View File

@ -45,10 +45,18 @@ InitOutput (ScreenInfo *pScreenInfo, int argc, char **argv)
void void
InitInput (int argc, char **argv) InitInput (int argc, char **argv)
{ {
KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs); KdKeyboardInfo *ki;
#ifdef TOUCHSCREEN
KdAddMouseDriver (&TsFuncs); KdAddKeyboardDriver (&LinuxKeyboardDriver);
KdAddPointerDriver (&LinuxMouseDriver);
#ifdef TSLIB
KdAddPointerDriver (&TsDriver);
#endif #endif
ki = KdParseKeyboard ("keybd");
KdAddKeyboard(ki);
KdInitInput ();
} }
void void

View File

@ -27,7 +27,6 @@
#include <kdrive-config.h> #include <kdrive-config.h>
#endif #endif
#include "itsy.h" #include "itsy.h"
#include "kkeymap.h"
#include <X11/keysym.h> #include <X11/keysym.h>
#include <linux/itsy_buttons.h> #include <linux/itsy_buttons.h>
@ -167,28 +166,44 @@ ItsyKeyboardLoad (void)
{ {
KeySym *k; KeySym *k;
itsyButtonState = 0;
kdMinScanCode = 1;
kdKeymapWidth = ITSY_WIDTH;
kdMaxScanCode = (sizeof (ItsyKeymap) / sizeof (ItsyKeymap[0])) / ITSY_WIDTH;
memcpy (kdKeymap, ItsyKeymap, sizeof (ItsyKeymap));
} }
int static Status
ItsyKeyboardInit (void) ItsyKeyboardInit (KdKeyboardInfo *ki)
{ {
int butPort; if (!ki)
return BadImplementation;
butPort = open ("/dev/buttons", 0); ki->driverPrivate = open ("/dev/buttons", 0);
fprintf (stderr, "butPort %d\n", butPort);
return butPort; itsyButtonState = 0;
ki->keySyms.minKeyCode = 1;
ki->keySyms.maxKeyCode = (sizeof (ItsyKeymap) / sizeof (ItsyKeymap[0])) / ITSY_WIDTH;
ki->minScanCode = ki->keySyms.minKeyCode;
ki->maxScanCode = ki->keySyms.maxKeyCode;
ki->keySyms.mapWidth = ITSY_WIDTH;
if (ki->keySyms.map)
xfree(ki->keySyms.map);
ki->keySyms.map = xalloc(sizeof(ItsyKeymap));
if (!ki->keySyms.map)
return BadAlloc;
memcpy (kdKeymap, ItsyKeymap, sizeof (ItsyKeymap));
return Success;
} }
void static void
ItsyKeyboardFini (int fd) ItsyKeyboardDisable (KdKeybdInfo *ki)
{ {
if (fd >= 0) if (fd >= 0)
close (fd); close ((int)ki->driverPrivate);
}
static void
ItsyKeyboardFini (KdKeybdInfo *ki)
{
return;
} }
void void
@ -227,11 +242,13 @@ ItsyKeyboardBell (int volume, int frequency, int duration)
} }
KdKeyboardFuncs itsyKeyboardFuncs = { KdKeyboardFuncs itsyKeyboardFuncs = {
ItsyKeyboardLoad, "itsy",
ItsyKeyboardInit, ItsyKeyboardInit,
ItsyKeyboardEnable,
ItsyKeyboardRead, ItsyKeyboardRead,
ItsyKeyboardLeds, ItsyKeyboardLeds,
ItsyKeyboardBell, ItsyKeyboardBell,
ItsyKeyboardDisable
ItsyKeyboardFini, ItsyKeyboardFini,
0, NULL,
}; };

View File

@ -63,7 +63,7 @@ itsyTsReadBytes (int fd, char *buf, int len, int min)
} }
void void
itsyTsRead (int tsPort) itsyTsRead (KdPointerInfo *pi, int tsPort)
{ {
ts_event event; ts_event event;
long buf[3]; long buf[3];
@ -89,7 +89,7 @@ itsyTsRead (int tsPort)
x = 0; x = 0;
y = 0; y = 0;
} }
KdEnqueueMouseEvent (flags, x, y); KdEnqueuePointerEvent (pi, flags, x, y, 0);
} }
} }
@ -204,7 +204,8 @@ itsyTsFini (int tsPort)
close (tsPort); close (tsPort);
} }
KdMouseFuncs itsyTsMouseFuncs = { KdPointerDriver itsyTsMouseDriver = {
"itsyts",
itsyTsInit, itsyTsInit,
itsyTsRead, itsyTsRead,
itsyTsFini itsyTsFini

View File

@ -55,7 +55,7 @@ BusRead (int adbPort, void *closure)
flags |= KD_BUTTON_2; flags |= KD_BUTTON_2;
if ((buf[0] & 1) == 0) if ((buf[0] & 1) == 0)
flags |= KD_BUTTON_3; flags |= KD_BUTTON_3;
KdEnqueueMouseEvent (kdMouseInfo, flags, dx, dy); KdEnqueuePointerEvent (closure, flags, dx, dy, 0);
} }
} }
@ -66,36 +66,71 @@ char *BusNames[] = {
#define NUM_BUS_NAMES (sizeof (BusNames) / sizeof (BusNames[0])) #define NUM_BUS_NAMES (sizeof (BusNames) / sizeof (BusNames[0]))
int BusInputType;
static int static int
BusInit (void) BusInit (KdPointerInfo *pi)
{ {
int i; int i, fd = 0;
int busPort;
int n = 0;
if (!BusInputType)
BusInputType = KdAllocInputType ();
if (!pi->path || (strcmp(pi->path, "auto") == 0))
{
for (i = 0; i < NUM_BUS_NAMES; i++) for (i = 0; i < NUM_BUS_NAMES; i++)
{ {
busPort = open (BusNames[i], 0); if ((fd = open (BusNames[i], 0)) > 0)
{ {
KdRegisterFd (BusInputType, busPort, BusRead, 0); close(fd);
n++; if (pi->path)
xfree(pi->path);
pi->path = KdSaveString(BusNames[i]);
return Success;
} }
} }
return n; }
else
{
if ((fd = open(pi->path, 0)) > 0)
{
close(fd);
return Success;
}
}
return !Success;
}
static int
BusEnable (KdPointerInfo *pi)
{
int fd = open(pi->path, 0);
if (fd > 0)
{
KdRegisterFd(fd, BusRead, pi);
pi->driverPrivate = (void *)fd;
return Success;
}
else
{
return !Success;
}
} }
static void static void
BusFini (void) BusDisable (KdPointerInfo *pi)
{ {
KdUnregisterFds (BusInputType, TRUE); KdUnregisterFd(pi, (int)pi->driverPrivate, TRUE);
} }
KdMouseFuncs BusMouseFuncs = { static void
BusFini (KdPointerInfo *pi)
{
return;
}
KdPointerDriver BusMouseDriver = {
"bus",
BusInit, BusInit,
BusFini BusEnable,
BusDisable,
BusFini,
NULL
}; };

View File

@ -62,12 +62,14 @@ typedef struct _kevdevMouse {
struct input_absinfo absinfo[ABS_MAX + 1]; struct input_absinfo absinfo[ABS_MAX + 1];
int max_rel; int max_rel;
int max_abs; int max_abs;
int fd;
} Kevdev; } Kevdev;
static void static void
EvdevMotion (KdMouseInfo *mi) EvdevMotion (KdPointerInfo *pi)
{ {
Kevdev *ke = mi->driver; Kevdev *ke = pi->driverPrivate;
int i; int i;
for (i = 0; i <= ke->max_rel; i++) for (i = 0; i <= ke->max_rel; i++)
@ -103,8 +105,8 @@ EvdevMotion (KdMouseInfo *mi)
static void static void
EvdevRead (int evdevPort, void *closure) EvdevRead (int evdevPort, void *closure)
{ {
KdMouseInfo *mi = closure; KdPointerInfo *pi = closure;
Kevdev *ke = mi->driver; Kevdev *ke = pi->driverPrivate;
int i; int i;
struct input_event events[NUM_EVENTS]; struct input_event events[NUM_EVENTS];
int n; int n;
@ -119,7 +121,7 @@ EvdevRead (int evdevPort, void *closure)
case EV_SYN: case EV_SYN:
break; break;
case EV_KEY: case EV_KEY:
EvdevMotion (mi); EvdevMotion (pi);
ASSIGNBIT(ke->key,events[i].code, events[i].value); ASSIGNBIT(ke->key,events[i].code, events[i].value);
if (events[i].code < 0x100) if (events[i].code < 0x100)
ErrorF ("key %d %d\n", events[i].code, events[i].value); ErrorF ("key %d %d\n", events[i].code, events[i].value);
@ -134,7 +136,7 @@ EvdevRead (int evdevPort, void *closure)
break; break;
} }
} }
EvdevMotion (mi); EvdevMotion (pi);
} }
int EvdevInputType; int EvdevInputType;
@ -148,41 +150,46 @@ char *kdefaultEvdev[] = {
#define NUM_DEFAULT_EVDEV (sizeof (kdefaultEvdev) / sizeof (kdefaultEvdev[0])) #define NUM_DEFAULT_EVDEV (sizeof (kdefaultEvdev) / sizeof (kdefaultEvdev[0]))
static Bool static Status
EvdevInit (void) EvdevInit (KdPointerInfo *pi)
{ {
int i; int i;
int fd; int fd;
KdMouseInfo *mi, *next;
int n = 0; int n = 0;
char *prot; char *prot;
if (!EvdevInputType) if (!pi->path) {
EvdevInputType = KdAllocInputType (); for (i = 0; i < NUM_DEFAULT_EVDEV; i++) {
for (mi = kdMouseInfo; mi; mi = next)
{
next = mi->next;
prot = mi->prot;
if (mi->inputType)
continue;
if (!mi->name)
{
for (i = 0; i < NUM_DEFAULT_EVDEV; i++)
{
fd = open (kdefaultEvdev[i], 2); fd = open (kdefaultEvdev[i], 2);
if (fd >= 0) if (fd >= 0) {
{ pi->path = KdSaveString (kdefaultEvdev[i]);
mi->name = KdSaveString (kdefaultEvdev[i]);
break; break;
} }
} }
} }
else else {
fd = open (mi->name, 2); fd = open (pi->path, 2);
if (fd < 0) {
ErrorF("Failed to open evdev device %s\n", pi->path);
return BadMatch;
}
}
return Success;
}
static Status
EvdevEnable (KdPointerInfo *pi)
{
int fd;
if (!pi || !pi->path)
return BadImplementation;
fd = open(pi->path, 2);
if (fd < 0)
return BadMatch;
if (fd >= 0)
{
unsigned long ev[NBITS(EV_MAX)]; unsigned long ev[NBITS(EV_MAX)];
Kevdev *ke; Kevdev *ke;
@ -190,13 +197,13 @@ EvdevInit (void)
{ {
perror ("EVIOCGBIT 0"); perror ("EVIOCGBIT 0");
close (fd); close (fd);
continue; return BadMatch;
} }
ke = xalloc (sizeof (Kevdev)); ke = xalloc (sizeof (Kevdev));
if (!ke) if (!ke)
{ {
close (fd); close (fd);
continue; return BadAlloc;
} }
memset (ke, '\0', sizeof (Kevdev)); memset (ke, '\0', sizeof (Kevdev));
if (ISBITSET (ev, EV_KEY)) if (ISBITSET (ev, EV_KEY))
@ -207,7 +214,7 @@ EvdevInit (void)
perror ("EVIOCGBIT EV_KEY"); perror ("EVIOCGBIT EV_KEY");
xfree (ke); xfree (ke);
close (fd); close (fd);
continue; return BadMatch;
} }
} }
if (ISBITSET (ev, EV_REL)) if (ISBITSET (ev, EV_REL))
@ -218,7 +225,7 @@ EvdevInit (void)
perror ("EVIOCGBIT EV_REL"); perror ("EVIOCGBIT EV_REL");
xfree (ke); xfree (ke);
close (fd); close (fd);
continue; return BadMatch;
} }
for (ke->max_rel = REL_MAX; ke->max_rel >= 0; ke->max_rel--) for (ke->max_rel = REL_MAX; ke->max_rel >= 0; ke->max_rel--)
if (ISBITSET(ke->relbits, ke->max_rel)) if (ISBITSET(ke->relbits, ke->max_rel))
@ -234,7 +241,7 @@ EvdevInit (void)
perror ("EVIOCGBIT EV_ABS"); perror ("EVIOCGBIT EV_ABS");
xfree (ke); xfree (ke);
close (fd); close (fd);
continue; return BadMatch;
} }
for (ke->max_abs = ABS_MAX; ke->max_abs >= 0; ke->max_abs--) for (ke->max_abs = ABS_MAX; ke->max_abs >= 0; ke->max_abs--)
if (ISBITSET(ke->absbits, ke->max_abs)) if (ISBITSET(ke->absbits, ke->max_abs))
@ -253,38 +260,43 @@ EvdevInit (void)
{ {
xfree (ke); xfree (ke);
close (fd); close (fd);
continue; return BadValue;
} }
} }
mi->driver = ke; if (!KdRegisterFd (fd, EvdevRead, pi)) {
mi->inputType = EvdevInputType; xfree (ke);
if (KdRegisterFd (EvdevInputType, fd, EvdevRead, (void *) mi)) close (fd);
n++; return BadAlloc;
} }
} pi->driverPrivate = ke;
return TRUE; return Success;
} }
static void static void
EvdevFini (void) EvdevDisable (KdPointerInfo *pi)
{ {
KdMouseInfo *mi; Kevdev *ke;
KdUnregisterFds (EvdevInputType, TRUE); if (!pi || !pi->driverPrivate)
for (mi = kdMouseInfo; mi; mi = mi->next) return;
{
if (mi->inputType == EvdevInputType) KdUnregisterFd (pi, ke->fd, TRUE);
{ xfree (ke);
xfree (mi->driver); pi->driverPrivate = 0;
mi->driver = 0;
mi->inputType = 0;
}
}
} }
KdMouseFuncs LinuxEvdevMouseFuncs = { static void
EvdevFini (KdPointerInfo *pi)
{
}
KdPointerDriver LinuxEvdevMouseDriver = {
"evdev",
EvdevInit, EvdevInit,
EvdevEnable,
EvdevDisable,
EvdevFini, EvdevFini,
NULL,
}; };
#if 0 #if 0

View File

@ -2,31 +2,40 @@
* $RCSId: xc/programs/Xserver/hw/kdrive/linux/keyboard.c,v 1.10 2001/11/08 10:26:24 keithp Exp $ * $RCSId: xc/programs/Xserver/hw/kdrive/linux/keyboard.c,v 1.10 2001/11/08 10:26:24 keithp Exp $
* *
* Copyright © 1999 Keith Packard * Copyright © 1999 Keith Packard
* XKB integration © 2006 Nokia Corporation, author: Tomas Frydrych <tf@o-hand.com>
* *
* Permission to use, copy, modify, distribute, and sell this software and its * LinuxKeyboardRead() XKB code based on xf86KbdLnx.c:
* documentation for any purpose is hereby granted without fee, provided that * Copyright © 1990,91 by Thomas Roell, Dinkelscherben, Germany.
* the above copyright notice appear in all copies and that both that * Copyright © 1994-2001 by The XFree86 Project, Inc.
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Keith Packard not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Keith Packard makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
* *
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * Permission is hereby granted, free of charge, to any person obtaining a
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * copy of this software and associated documentation files (the "Software"),
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR * to deal in the Software without restriction, including without limitation
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * the rights to use, copy, modify, merge, publish, distribute, sublicense,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * and/or sell copies of the Software, and to permit persons to whom the
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * Software is furnished to do so, subject to the following conditions:
* PERFORMANCE OF THIS SOFTWARE. *
* 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_CONFIG_H #ifdef HAVE_CONFIG_H
#include <kdrive-config.h> #include <kdrive-config.h>
#endif #endif
#include "kdrive.h" #include "kdrive.h"
#include "kkeymap.h"
#include <linux/keyboard.h> #include <linux/keyboard.h>
#include <linux/kd.h> #include <linux/kd.h>
#define XK_PUBLISHING #define XK_PUBLISHING
@ -103,6 +112,107 @@ static const KeySym linux_to_x[256] = {
XK_udiaeresis, XK_yacute, XK_thorn, XK_ydiaeresis XK_udiaeresis, XK_yacute, XK_thorn, XK_ydiaeresis
}; };
#ifdef XKB
/*
* Getting a keycode from scancode
*
* With XKB
* --------
*
* We have to enqueue keyboard events using standard X keycodes which correspond
* to AT scancode + 8; this means that we need to translate the Linux scancode
* provided by the kernel to an AT scancode -- this translation is not linear
* and requires that we use a LUT.
*
*
* Without XKB
* -----------
*
* We can use custom keycodes, which makes things simpler; we define our custom
* keycodes as Linux scancodes + KD_KEY_OFFSET
*/
/*
This LUT translates AT scancodes into Linux ones -- the keymap we create
for the core X keyboard protocol has to be AT-scancode based so that it
corresponds to the Xkb keymap.
*/
static unsigned char at2lnx[] =
{
0x0, /* no valid scancode */
0x01, /* KEY_Escape */ 0x02, /* KEY_1 */
0x03, /* KEY_2 */ 0x04, /* KEY_3 */
0x05, /* KEY_4 */ 0x06, /* KEY_5 */
0x07, /* KEY_6 */ 0x08, /* KEY_7 */
0x09, /* KEY_8 */ 0x0a, /* KEY_9 */
0x0b, /* KEY_0 */ 0x0c, /* KEY_Minus */
0x0d, /* KEY_Equal */ 0x0e, /* KEY_BackSpace */
0x0f, /* KEY_Tab */ 0x10, /* KEY_Q */
0x11, /* KEY_W */ 0x12, /* KEY_E */
0x13, /* KEY_R */ 0x14, /* KEY_T */
0x15, /* KEY_Y */ 0x16, /* KEY_U */
0x17, /* KEY_I */ 0x18, /* KEY_O */
0x19, /* KEY_P */ 0x1a, /* KEY_LBrace */
0x1b, /* KEY_RBrace */ 0x1c, /* KEY_Enter */
0x1d, /* KEY_LCtrl */ 0x1e, /* KEY_A */
0x1f, /* KEY_S */ 0x20, /* KEY_D */
0x21, /* KEY_F */ 0x22, /* KEY_G */
0x23, /* KEY_H */ 0x24, /* KEY_J */
0x25, /* KEY_K */ 0x26, /* KEY_L */
0x27, /* KEY_SemiColon */ 0x28, /* KEY_Quote */
0x29, /* KEY_Tilde */ 0x2a, /* KEY_ShiftL */
0x2b, /* KEY_BSlash */ 0x2c, /* KEY_Z */
0x2d, /* KEY_X */ 0x2e, /* KEY_C */
0x2f, /* KEY_V */ 0x30, /* KEY_B */
0x31, /* KEY_N */ 0x32, /* KEY_M */
0x33, /* KEY_Comma */ 0x34, /* KEY_Period */
0x35, /* KEY_Slash */ 0x36, /* KEY_ShiftR */
0x37, /* KEY_KP_Multiply */ 0x38, /* KEY_Alt */
0x39, /* KEY_Space */ 0x3a, /* KEY_CapsLock */
0x3b, /* KEY_F1 */ 0x3c, /* KEY_F2 */
0x3d, /* KEY_F3 */ 0x3e, /* KEY_F4 */
0x3f, /* KEY_F5 */ 0x40, /* KEY_F6 */
0x41, /* KEY_F7 */ 0x42, /* KEY_F8 */
0x43, /* KEY_F9 */ 0x44, /* KEY_F10 */
0x45, /* KEY_NumLock */ 0x46, /* KEY_ScrollLock */
0x47, /* KEY_KP_7 */ 0x48, /* KEY_KP_8 */
0x49, /* KEY_KP_9 */ 0x4a, /* KEY_KP_Minus */
0x4b, /* KEY_KP_4 */ 0x4c, /* KEY_KP_5 */
0x4d, /* KEY_KP_6 */ 0x4e, /* KEY_KP_Plus */
0x4f, /* KEY_KP_1 */ 0x50, /* KEY_KP_2 */
0x51, /* KEY_KP_3 */ 0x52, /* KEY_KP_0 */
0x53, /* KEY_KP_Decimal */ 0x54, /* KEY_SysReqest */
0x00, /* 0x55 */ 0x56, /* KEY_Less */
0x57, /* KEY_F11 */ 0x58, /* KEY_F12 */
0x66, /* KEY_Home */ 0x67, /* KEY_Up */
0x68, /* KEY_PgUp */ 0x69, /* KEY_Left */
0x5d, /* KEY_Begin */ 0x6a, /* KEY_Right */
0x6b, /* KEY_End */ 0x6c, /* KEY_Down */
0x6d, /* KEY_PgDown */ 0x6e, /* KEY_Insert */
0x6f, /* KEY_Delete */ 0x60, /* KEY_KP_Enter */
0x61, /* KEY_RCtrl */ 0x77, /* KEY_Pause */
0x63, /* KEY_Print */ 0x62, /* KEY_KP_Divide */
0x64, /* KEY_AltLang */ 0x65, /* KEY_Break */
0x00, /* KEY_LMeta */ 0x00, /* KEY_RMeta */
0x7A, /* KEY_Menu/FOCUS_PF11*/0x00, /* 0x6e */
0x7B, /* FOCUS_PF12 */ 0x00, /* 0x70 */
0x00, /* 0x71 */ 0x00, /* 0x72 */
0x59, /* FOCUS_PF2 */ 0x78, /* FOCUS_PF9 */
0x00, /* 0x75 */ 0x00, /* 0x76 */
0x5A, /* FOCUS_PF3 */ 0x5B, /* FOCUS_PF4 */
0x5C, /* FOCUS_PF5 */ 0x5D, /* FOCUS_PF6 */
0x5E, /* FOCUS_PF7 */ 0x5F, /* FOCUS_PF8 */
0x7C, /* JAP_86 */ 0x79, /* FOCUS_PF10 */
0x00, /* 0x7f */
};
#define NUM_AT_KEYS (sizeof(at2lnx)/sizeof(at2lnx[0]))
#define LNX_KEY_INDEX(n) n < NUM_AT_KEYS ? at2lnx[n] : 0
#else /* not XKB */
#define LNX_KEY_INDEX(n) n
#endif
static unsigned char tbl[KD_MAX_WIDTH] = static unsigned char tbl[KD_MAX_WIDTH] =
{ {
0, 0,
@ -112,24 +222,31 @@ static unsigned char tbl[KD_MAX_WIDTH] =
}; };
static void static void
readKernelMapping(void) readKernelMapping(KdKeyboardInfo *ki)
{ {
KeySym *k; KeySym *k;
int i, j; int i, j;
struct kbentry kbe; struct kbentry kbe;
int minKeyCode, maxKeyCode; int minKeyCode, maxKeyCode;
int row; int row;
int fd;
if (!ki)
return;
fd = LinuxConsoleFd;
minKeyCode = NR_KEYS; minKeyCode = NR_KEYS;
maxKeyCode = 0; maxKeyCode = 0;
row = 0; row = 0;
ki->keySyms.mapWidth = KD_MAX_WIDTH;
for (i = 0; i < NR_KEYS && row < KD_MAX_LENGTH; ++i) for (i = 0; i < NR_KEYS && row < KD_MAX_LENGTH; ++i)
{ {
kbe.kb_index = i; kbe.kb_index = LNX_KEY_INDEX(i);
k = kdKeymap + row * KD_MAX_WIDTH; k = ki->keySyms.map + row * ki->keySyms.mapWidth;
for (j = 0; j < KD_MAX_WIDTH; ++j) for (j = 0; j < ki->keySyms.mapWidth; ++j)
{ {
unsigned short kval; unsigned short kval;
@ -137,7 +254,7 @@ readKernelMapping(void)
kbe.kb_table = tbl[j]; kbe.kb_table = tbl[j];
kbe.kb_value = 0; kbe.kb_value = 0;
if (ioctl(LinuxConsoleFd, KDGKBENT, &kbe)) if (ioctl(fd, KDGKBENT, &kbe))
continue; continue;
kval = KVAL(kbe.kb_value); kval = KVAL(kbe.kb_value);
@ -370,28 +487,212 @@ readKernelMapping(void)
if (k[3] == k[0] && k[2] == k[1] && k[2] == NoSymbol) k[3] =NoSymbol; if (k[3] == k[0] && k[2] == k[1] && k[2] == NoSymbol) k[3] =NoSymbol;
row++; row++;
} }
kdMinScanCode = minKeyCode; ki->minScanCode = minKeyCode;
kdMaxScanCode = maxKeyCode; ki->maxScanCode = maxKeyCode;
} }
static void #ifdef XKB
LinuxKeyboardLoad (void)
{ /*
readKernelMapping (); * We need these to handle extended scancodes correctly (I could just use the
} * numbers below, but this makes the code more readable
*/
/* The prefix codes */
#define KEY_Prefix0 /* special 0x60 */ 96
#define KEY_Prefix1 /* special 0x61 */ 97
/* The raw scancodes */
#define KEY_Enter /* Enter 0x1c */ 28
#define KEY_LCtrl /* Ctrl(left) 0x1d */ 29
#define KEY_Slash /* / (Slash) ? 0x35 */ 53
#define KEY_KP_Multiply /* * 0x37 */ 55
#define KEY_Alt /* Alt(left) 0x38 */ 56
#define KEY_F3 /* F3 0x3d */ 61
#define KEY_F4 /* F4 0x3e */ 62
#define KEY_F5 /* F5 0x3f */ 63
#define KEY_F6 /* F6 0x40 */ 64
#define KEY_F7 /* F7 0x41 */ 65
#define KEY_ScrollLock /* ScrollLock 0x46 */ 70
#define KEY_KP_7 /* 7 Home 0x47 */ 71
#define KEY_KP_8 /* 8 Up 0x48 */ 72
#define KEY_KP_9 /* 9 PgUp 0x49 */ 73
#define KEY_KP_Minus /* - (Minus) 0x4a */ 74
#define KEY_KP_4 /* 4 Left 0x4b */ 75
#define KEY_KP_5 /* 5 0x4c */ 76
#define KEY_KP_6 /* 6 Right 0x4d */ 77
#define KEY_KP_Plus /* + (Plus) 0x4e */ 78
#define KEY_KP_1 /* 1 End 0x4f */ 79
#define KEY_KP_2 /* 2 Down 0x50 */ 80
#define KEY_KP_3 /* 3 PgDown 0x51 */ 81
#define KEY_KP_0 /* 0 Insert 0x52 */ 82
#define KEY_KP_Decimal /* . (Decimal) Delete 0x53 */ 83
#define KEY_Home /* Home 0x59 */ 89
#define KEY_Up /* Up 0x5a */ 90
#define KEY_PgUp /* PgUp 0x5b */ 91
#define KEY_Left /* Left 0x5c */ 92
#define KEY_Begin /* Begin 0x5d */ 93
#define KEY_Right /* Right 0x5e */ 94
#define KEY_End /* End 0x5f */ 95
#define KEY_Down /* Down 0x60 */ 96
#define KEY_PgDown /* PgDown 0x61 */ 97
#define KEY_Insert /* Insert 0x62 */ 98
#define KEY_Delete /* Delete 0x63 */ 99
#define KEY_KP_Enter /* Enter 0x64 */ 100
#define KEY_RCtrl /* Ctrl(right) 0x65 */ 101
#define KEY_Pause /* Pause 0x66 */ 102
#define KEY_Print /* Print 0x67 */ 103
#define KEY_KP_Divide /* Divide 0x68 */ 104
#define KEY_AltLang /* AtlLang(right) 0x69 */ 105
#define KEY_Break /* Break 0x6a */ 106
#define KEY_LMeta /* Left Meta 0x6b */ 107
#define KEY_RMeta /* Right Meta 0x6c */ 108
#define KEY_Menu /* Menu 0x6d */ 109
#define KEY_F13 /* F13 0x6e */ 110
#define KEY_F14 /* F14 0x6f */ 111
#define KEY_F15 /* F15 0x70 */ 112
#define KEY_F16 /* F16 0x71 */ 113
#define KEY_F17 /* F17 0x72 */ 114
#define KEY_KP_DEC /* KP_DEC 0x73 */ 115
#endif /* XKB */
static void static void
LinuxKeyboardRead (int fd, void *closure) LinuxKeyboardRead (int fd, void *closure)
{ {
unsigned char buf[256], *b; unsigned char buf[256], *b;
int n; int n;
unsigned char prefix = 0, scancode = 0;
while ((n = read (fd, buf, sizeof (buf))) > 0) while ((n = read (fd, buf, sizeof (buf))) > 0) {
{
b = buf; b = buf;
while (n--) while (n--) {
#ifdef XKB
if (!noXkbExtension) {
/*
* With xkb we use RAW mode for reading the console, which allows us
* process extended scancodes.
*
* See if this is a prefix extending the following keycode
*/
if (!prefix && ((b[0] & 0x7f) == KEY_Prefix0))
{ {
KdEnqueueKeyboardEvent (b[0] & 0x7f, b[0] & 0x80); prefix = KEY_Prefix0;
ErrorF("Prefix0");
/* swallow this up */
b++;
continue;
}
else if (!prefix && ((b[0] & 0x7f) == KEY_Prefix1))
{
prefix = KEY_Prefix1;
ErrorF("Prefix1");
/* swallow this up */
b++;
continue;
}
scancode = b[0] & 0x7f;
switch (prefix) {
/* from xf86Events.c */
case KEY_Prefix0:
{
ErrorF("Prefix0 scancode: 0x%02x\n", scancode);
switch (scancode) {
case KEY_KP_7:
scancode = KEY_Home; break; /* curs home */
case KEY_KP_8:
scancode = KEY_Up; break; /* curs up */
case KEY_KP_9:
scancode = KEY_PgUp; break; /* curs pgup */
case KEY_KP_4:
scancode = KEY_Left; break; /* curs left */
case KEY_KP_5:
scancode = KEY_Begin; break; /* curs begin */
case KEY_KP_6:
scancode = KEY_Right; break; /* curs right */
case KEY_KP_1:
scancode = KEY_End; break; /* curs end */
case KEY_KP_2:
scancode = KEY_Down; break; /* curs down */
case KEY_KP_3:
scancode = KEY_PgDown; break; /* curs pgdown */
case KEY_KP_0:
scancode = KEY_Insert; break; /* curs insert */
case KEY_KP_Decimal:
scancode = KEY_Delete; break; /* curs delete */
case KEY_Enter:
scancode = KEY_KP_Enter; break; /* keypad enter */
case KEY_LCtrl:
scancode = KEY_RCtrl; break; /* right ctrl */
case KEY_KP_Multiply:
scancode = KEY_Print; break; /* print */
case KEY_Slash:
scancode = KEY_KP_Divide; break; /* keyp divide */
case KEY_Alt:
scancode = KEY_AltLang; break; /* right alt */
case KEY_ScrollLock:
scancode = KEY_Break; break; /* curs break */
case 0x5b:
scancode = KEY_LMeta; break;
case 0x5c:
scancode = KEY_RMeta; break;
case 0x5d:
scancode = KEY_Menu; break;
case KEY_F3:
scancode = KEY_F13; break;
case KEY_F4:
scancode = KEY_F14; break;
case KEY_F5:
scancode = KEY_F15; break;
case KEY_F6:
scancode = KEY_F16; break;
case KEY_F7:
scancode = KEY_F17; break;
case KEY_KP_Plus:
scancode = KEY_KP_DEC; break;
/* Ignore virtual shifts (E0 2A, E0 AA, E0 36, E0 B6) */
case 0x2A:
case 0x36:
b++;
prefix = 0;
continue;
default:
ErrorF("Unreported Prefix0 scancode: 0x%02x\n",
scancode);
/*
* "Internet" keyboards are generating lots of new
* codes. Let them pass. There is little consistency
* between them, so don't bother with symbolic names at
* this level.
*/
scancode += 0x78;
}
break;
}
case KEY_Prefix1:
{
/* we do no handle these */
ErrorF("Prefix1 scancode: 0x%02x\n", scancode);
b++;
prefix = 0;
continue;
}
default: /* should not happen*/
case 0: /* do nothing */
ErrorF("Plain scancode: 0x%02x\n", scancode);
}
prefix = 0;
}
/* without xkb we use mediumraw mode -- enqueue the scancode as is */
else
#endif
scancode = b[0] & 0x7f;
KdEnqueueKeyboardEvent (closure, scancode, b[0] & 0x80);
b++; b++;
} }
} }
@ -399,19 +700,30 @@ LinuxKeyboardRead (int fd, void *closure)
static int LinuxKbdTrans; static int LinuxKbdTrans;
static struct termios LinuxTermios; static struct termios LinuxTermios;
static int LinuxKbdType;
static int static Status
LinuxKeyboardEnable (int fd, void *closure) LinuxKeyboardEnable (KdKeyboardInfo *ki)
{ {
struct termios nTty; struct termios nTty;
unsigned char buf[256]; unsigned char buf[256];
int n; int n;
int fd;
if (!ki)
return !Success;
fd = LinuxConsoleFd;
ki->driverPrivate = (void *) fd;
ioctl (fd, KDGKBMODE, &LinuxKbdTrans); ioctl (fd, KDGKBMODE, &LinuxKbdTrans);
tcgetattr (fd, &LinuxTermios); tcgetattr (fd, &LinuxTermios);
#ifdef XKB
if (!noXkbExtension)
ioctl(fd, KDSKBMODE, K_RAW);
else
#else
ioctl(fd, KDSKBMODE, K_MEDIUMRAW); ioctl(fd, KDSKBMODE, K_MEDIUMRAW);
#endif
nTty = LinuxTermios; nTty = LinuxTermios;
nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP); nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
nTty.c_oflag = 0; nTty.c_oflag = 0;
@ -422,54 +734,74 @@ LinuxKeyboardEnable (int fd, void *closure)
cfsetispeed(&nTty, 9600); cfsetispeed(&nTty, 9600);
cfsetospeed(&nTty, 9600); cfsetospeed(&nTty, 9600);
tcsetattr(fd, TCSANOW, &nTty); tcsetattr(fd, TCSANOW, &nTty);
/* Our kernel cleverly ignores O_NONBLOCK. Sigh. */
#if 0
/* /*
* Flush any pending keystrokes * Flush any pending keystrokes
*/ */
while ((n = read (fd, buf, sizeof (buf))) > 0) while ((n = read (fd, buf, sizeof (buf))) > 0)
; ;
return fd; #endif
KdRegisterFd (fd, LinuxKeyboardRead, ki);
return Success;
} }
static void static void
LinuxKeyboardDisable (int fd, void *closure) LinuxKeyboardDisable (KdKeyboardInfo *ki)
{ {
ioctl(LinuxConsoleFd, KDSKBMODE, LinuxKbdTrans); int fd;
tcsetattr(LinuxConsoleFd, TCSANOW, &LinuxTermios);
if (!ki)
return;
fd = (int) ki->driverPrivate;
KdUnregisterFd(ki, fd, FALSE);
ioctl(fd, KDSKBMODE, LinuxKbdTrans);
tcsetattr(fd, TCSANOW, &LinuxTermios);
} }
static int static Status
LinuxKeyboardInit (void) LinuxKeyboardInit (KdKeyboardInfo *ki)
{ {
if (!LinuxKbdType) if (!ki)
LinuxKbdType = KdAllocInputType (); return !Success;
KdRegisterFd (LinuxKbdType, LinuxConsoleFd, LinuxKeyboardRead, 0); if (ki->path)
LinuxKeyboardEnable (LinuxConsoleFd, 0); xfree(ki->path);
KdRegisterFdEnableDisable (LinuxConsoleFd, ki->path = KdSaveString("console");
LinuxKeyboardEnable, if (ki->name)
LinuxKeyboardDisable); xfree(ki->name);
return 1; ki->name = KdSaveString("Linux console keyboard");
readKernelMapping (ki);
return Success;
} }
static void static void
LinuxKeyboardFini (void) LinuxKeyboardFini (KdKeyboardInfo *ki)
{ {
LinuxKeyboardDisable (LinuxConsoleFd, 0);
KdUnregisterFds (LinuxKbdType, FALSE);
} }
static void static void
LinuxKeyboardLeds (int leds) LinuxKeyboardLeds (KdKeyboardInfo *ki, int leds)
{ {
ioctl (LinuxConsoleFd, KDSETLED, leds & 7); if (!ki)
return;
ioctl ((int)ki->driverPrivate, KDSETLED, leds & 7);
} }
static void static void
LinuxKeyboardBell (int volume, int pitch, int duration) LinuxKeyboardBell (KdKeyboardInfo *ki, int volume, int pitch, int duration)
{ {
if (!ki)
return;
if (volume && pitch) if (volume && pitch)
{ {
ioctl(LinuxConsoleFd, KDMKTONE, ioctl((int)ki->driverPrivate, KDMKTONE,
((1193190 / pitch) & 0xffff) | ((1193190 / pitch) & 0xffff) |
(((unsigned long)duration * (((unsigned long)duration *
volume / 50) << 16)); volume / 50) << 16));
@ -477,11 +809,13 @@ LinuxKeyboardBell (int volume, int pitch, int duration)
} }
} }
KdKeyboardFuncs LinuxKeyboardFuncs = { KdKeyboardDriver LinuxKeyboardDriver = {
LinuxKeyboardLoad, "keyboard",
LinuxKeyboardInit, LinuxKeyboardInit,
LinuxKeyboardEnable,
LinuxKeyboardLeds, LinuxKeyboardLeds,
LinuxKeyboardBell, LinuxKeyboardBell,
LinuxKeyboardDisable,
LinuxKeyboardFini, LinuxKeyboardFini,
3, NULL,
}; };

View File

@ -456,6 +456,7 @@ LinuxFini (void)
} }
} }
close(LinuxConsoleFd); /* make the vt-manager happy */ close(LinuxConsoleFd); /* make the vt-manager happy */
LinuxConsoleFd = -1;
fd = open ("/dev/tty0", O_RDWR|O_NDELAY, 0); fd = open ("/dev/tty0", O_RDWR|O_NDELAY, 0);
if (fd >= 0) if (fd >= 0)
{ {

View File

@ -206,10 +206,10 @@ MouseWriteBytes (int fd, unsigned char *c, int n, int timeout)
typedef struct _kmouseProt { typedef struct _kmouseProt {
char *name; char *name;
Bool (*Complete) (KdMouseInfo *mi, unsigned char *ev, int ne); Bool (*Complete) (KdPointerInfo *pi, unsigned char *ev, int ne);
int (*Valid) (KdMouseInfo *mi, unsigned char *ev, int ne); int (*Valid) (KdPointerInfo *pi, unsigned char *ev, int ne);
Bool (*Parse) (KdMouseInfo *mi, unsigned char *ev, int ne); Bool (*Parse) (KdPointerInfo *pi, unsigned char *ev, int ne);
Bool (*Init) (KdMouseInfo *mi); Bool (*Init) (KdPointerInfo *pi);
unsigned char headerMask, headerValid; unsigned char headerMask, headerValid;
unsigned char dataMask, dataValid; unsigned char dataMask, dataValid;
Bool tty; Bool tty;
@ -238,9 +238,9 @@ typedef struct _kmouse {
unsigned long state; /* private per protocol, init to prot->state */ unsigned long state; /* private per protocol, init to prot->state */
} Kmouse; } Kmouse;
static int mouseValid (KdMouseInfo *mi, unsigned char *ev, int ne) static int mouseValid (KdPointerInfo *pi, unsigned char *ev, int ne)
{ {
Kmouse *km = mi->driver; Kmouse *km = pi->driverPrivate;
const KmouseProt *prot = km->prot; const KmouseProt *prot = km->prot;
int i; int i;
@ -255,24 +255,24 @@ static int mouseValid (KdMouseInfo *mi, unsigned char *ev, int ne)
return 0; return 0;
} }
static Bool threeComplete (KdMouseInfo *mi, unsigned char *ev, int ne) static Bool threeComplete (KdPointerInfo *pi, unsigned char *ev, int ne)
{ {
return ne == 3; return ne == 3;
} }
static Bool fourComplete (KdMouseInfo *mi, unsigned char *ev, int ne) static Bool fourComplete (KdPointerInfo *pi, unsigned char *ev, int ne)
{ {
return ne == 4; return ne == 4;
} }
static Bool fiveComplete (KdMouseInfo *mi, unsigned char *ev, int ne) static Bool fiveComplete (KdPointerInfo *pi, unsigned char *ev, int ne)
{ {
return ne == 5; return ne == 5;
} }
static Bool MouseReasonable (KdMouseInfo *mi, unsigned long flags, int dx, int dy) static Bool MouseReasonable (KdPointerInfo *pi, unsigned long flags, int dx, int dy)
{ {
Kmouse *km = mi->driver; Kmouse *km = pi->driverPrivate;
if (km->stage == MouseWorking) if (km->stage == MouseWorking)
return TRUE; return TRUE;
@ -296,9 +296,9 @@ static Bool MouseReasonable (KdMouseInfo *mi, unsigned long flags, int dx, int d
/* /*
* Standard PS/2 mouse protocol * Standard PS/2 mouse protocol
*/ */
static Bool ps2Parse (KdMouseInfo *mi, unsigned char *ev, int ne) static Bool ps2Parse (KdPointerInfo *pi, unsigned char *ev, int ne)
{ {
Kmouse *km = mi->driver; Kmouse *km = pi->driverPrivate;
int dx, dy, dz; int dx, dy, dz;
unsigned long flags; unsigned long flags;
unsigned long flagsrelease = 0; unsigned long flagsrelease = 0;
@ -333,21 +333,21 @@ static Bool ps2Parse (KdMouseInfo *mi, unsigned char *ev, int ne)
if (ev[0] & 0x20) if (ev[0] & 0x20)
dy -= 256; dy -= 256;
dy = -dy; dy = -dy;
if (!MouseReasonable (mi, flags, dx, dy)) if (!MouseReasonable (pi, flags, dx, dy))
return FALSE; return FALSE;
if (km->stage == MouseWorking) if (km->stage == MouseWorking)
{ {
KdEnqueueMouseEvent (mi, flags, dx, dy); KdEnqueuePointerEvent (pi, flags, dx, dy, 0);
if (flagsrelease) if (flagsrelease)
{ {
flags &= ~flagsrelease; flags &= ~flagsrelease;
KdEnqueueMouseEvent (mi, flags, dx, dy); KdEnqueuePointerEvent (pi, flags, dx, dy, 0);
} }
} }
return TRUE; return TRUE;
} }
static Bool ps2Init (KdMouseInfo *mi); static Bool ps2Init (KdPointerInfo *pi);
static const KmouseProt ps2Prot = { static const KmouseProt ps2Prot = {
"ps/2", "ps/2",
@ -450,9 +450,9 @@ static unsigned char intelli_init[] = {
#define NINIT_INTELLI 3 #define NINIT_INTELLI 3
static int static int
ps2SkipInit (KdMouseInfo *mi, int ninit, Bool ret_next) ps2SkipInit (KdPointerInfo *pi, int ninit, Bool ret_next)
{ {
Kmouse *km = mi->driver; Kmouse *km = pi->driverPrivate;
int c = -1; int c = -1;
int skipping; int skipping;
Bool waiting; Bool waiting;
@ -481,9 +481,9 @@ ps2SkipInit (KdMouseInfo *mi, int ninit, Bool ret_next)
} }
static Bool static Bool
ps2Init (KdMouseInfo *mi) ps2Init (KdPointerInfo *pi)
{ {
Kmouse *km = mi->driver; Kmouse *km = pi->driverPrivate;
int skipping; int skipping;
Bool waiting; Bool waiting;
int id; int id;
@ -499,7 +499,7 @@ ps2Init (KdMouseInfo *mi)
return FALSE; return FALSE;
skipping = 0; skipping = 0;
waiting = FALSE; waiting = FALSE;
id = ps2SkipInit (mi, 0, TRUE); id = ps2SkipInit (pi, 0, TRUE);
switch (id) { switch (id) {
case 3: case 3:
init = wheel_3button_init; init = wheel_3button_init;
@ -524,13 +524,13 @@ ps2Init (KdMouseInfo *mi)
* initialization string. Make sure any partial event is * initialization string. Make sure any partial event is
* skipped * skipped
*/ */
(void) ps2SkipInit (mi, ninit, FALSE); (void) ps2SkipInit (pi, ninit, FALSE);
return TRUE; return TRUE;
} }
static Bool busParse (KdMouseInfo *mi, unsigned char *ev, int ne) static Bool busParse (KdPointerInfo *pi, unsigned char *ev, int ne)
{ {
Kmouse *km = mi->driver; Kmouse *km = pi->driverPrivate;
int dx, dy; int dx, dy;
unsigned long flags; unsigned long flags;
@ -543,10 +543,10 @@ static Bool busParse (KdMouseInfo *mi, unsigned char *ev, int ne)
flags |= KD_BUTTON_2; flags |= KD_BUTTON_2;
if ((ev[0] & 1) == 0) if ((ev[0] & 1) == 0)
flags |= KD_BUTTON_3; flags |= KD_BUTTON_3;
if (!MouseReasonable (mi, flags, dx, dy)) if (!MouseReasonable (pi, flags, dx, dy))
return FALSE; return FALSE;
if (km->stage == MouseWorking) if (km->stage == MouseWorking)
KdEnqueueMouseEvent (mi, flags, dx, dy); KdEnqueuePointerEvent (pi, flags, dx, dy, 0);
return TRUE; return TRUE;
} }
@ -561,9 +561,9 @@ static const KmouseProt busProt = {
* Standard MS serial protocol, three bytes * Standard MS serial protocol, three bytes
*/ */
static Bool msParse (KdMouseInfo *mi, unsigned char *ev, int ne) static Bool msParse (KdPointerInfo *pi, unsigned char *ev, int ne)
{ {
Kmouse *km = mi->driver; Kmouse *km = pi->driverPrivate;
int dx, dy; int dx, dy;
unsigned long flags; unsigned long flags;
@ -576,10 +576,10 @@ static Bool msParse (KdMouseInfo *mi, unsigned char *ev, int ne)
dx = (signed char)(((ev[0] & 0x03) << 6) | (ev[1] & 0x3F)); dx = (signed char)(((ev[0] & 0x03) << 6) | (ev[1] & 0x3F));
dy = (signed char)(((ev[0] & 0x0C) << 4) | (ev[2] & 0x3F)); dy = (signed char)(((ev[0] & 0x0C) << 4) | (ev[2] & 0x3F));
if (!MouseReasonable (mi, flags, dx, dy)) if (!MouseReasonable (pi, flags, dx, dy))
return FALSE; return FALSE;
if (km->stage == MouseWorking) if (km->stage == MouseWorking)
KdEnqueueMouseEvent (mi, flags, dx, dy); KdEnqueuePointerEvent (pi, flags, dx, dy, 0);
return TRUE; return TRUE;
} }
@ -600,9 +600,9 @@ static const KmouseProt msProt = {
* first byte of a synchronized protocol stream and see if it's got * first byte of a synchronized protocol stream and see if it's got
* any bits turned on that can't occur in that fourth byte * any bits turned on that can't occur in that fourth byte
*/ */
static Bool logiComplete (KdMouseInfo *mi, unsigned char *ev, int ne) static Bool logiComplete (KdPointerInfo *pi, unsigned char *ev, int ne)
{ {
Kmouse *km = mi->driver; Kmouse *km = pi->driverPrivate;
if ((ev[0] & 0x40) == 0x40) if ((ev[0] & 0x40) == 0x40)
return ne == 3; return ne == 3;
@ -611,9 +611,9 @@ static Bool logiComplete (KdMouseInfo *mi, unsigned char *ev, int ne)
return FALSE; return FALSE;
} }
static int logiValid (KdMouseInfo *mi, unsigned char *ev, int ne) static int logiValid (KdPointerInfo *pi, unsigned char *ev, int ne)
{ {
Kmouse *km = mi->driver; Kmouse *km = pi->driverPrivate;
const KmouseProt *prot = km->prot; const KmouseProt *prot = km->prot;
int i; int i;
@ -632,9 +632,9 @@ static int logiValid (KdMouseInfo *mi, unsigned char *ev, int ne)
return 0; return 0;
} }
static Bool logiParse (KdMouseInfo *mi, unsigned char *ev, int ne) static Bool logiParse (KdPointerInfo *pi, unsigned char *ev, int ne)
{ {
Kmouse *km = mi->driver; Kmouse *km = pi->driverPrivate;
int dx, dy; int dx, dy;
unsigned long flags; unsigned long flags;
@ -660,10 +660,10 @@ static Bool logiParse (KdMouseInfo *mi, unsigned char *ev, int ne)
flags |= km->state & (KD_BUTTON_1|KD_BUTTON_3); flags |= km->state & (KD_BUTTON_1|KD_BUTTON_3);
} }
if (!MouseReasonable (mi, flags, dx, dy)) if (!MouseReasonable (pi, flags, dx, dy))
return FALSE; return FALSE;
if (km->stage == MouseWorking) if (km->stage == MouseWorking)
KdEnqueueMouseEvent (mi, flags, dx, dy); KdEnqueuePointerEvent (pi, flags, dx, dy, 0);
return TRUE; return TRUE;
} }
@ -682,9 +682,9 @@ static const KmouseProt logiProt = {
/* /*
* Mouse systems protocol, 5 bytes * Mouse systems protocol, 5 bytes
*/ */
static Bool mscParse (KdMouseInfo *mi, unsigned char *ev, int ne) static Bool mscParse (KdPointerInfo *pi, unsigned char *ev, int ne)
{ {
Kmouse *km = mi->driver; Kmouse *km = pi->driverPrivate;
int dx, dy; int dx, dy;
unsigned long flags; unsigned long flags;
@ -699,10 +699,10 @@ static Bool mscParse (KdMouseInfo *mi, unsigned char *ev, int ne)
dx = (signed char)(ev[1]) + (signed char)(ev[3]); dx = (signed char)(ev[1]) + (signed char)(ev[3]);
dy = - ((signed char)(ev[2]) + (signed char)(ev[4])); dy = - ((signed char)(ev[2]) + (signed char)(ev[4]));
if (!MouseReasonable (mi, flags, dx, dy)) if (!MouseReasonable (pi, flags, dx, dy))
return FALSE; return FALSE;
if (km->stage == MouseWorking) if (km->stage == MouseWorking)
KdEnqueueMouseEvent (mi, flags, dx, dy); KdEnqueuePointerEvent (pi, flags, dx, dy, 0);
return TRUE; return TRUE;
} }
@ -810,8 +810,8 @@ MouseNextProtocol (Kmouse *km)
static void static void
MouseRead (int mousePort, void *closure) MouseRead (int mousePort, void *closure)
{ {
KdMouseInfo *mi = closure; KdPointerInfo *pi = closure;
Kmouse *km = mi->driver; Kmouse *km = pi->driverPrivate;
unsigned char event[MAX_MOUSE]; unsigned char event[MAX_MOUSE];
int ne; int ne;
int c; int c;
@ -835,7 +835,7 @@ MouseRead (int mousePort, void *closure)
break; break;
} }
event[ne++] = c; event[ne++] = c;
i = (*km->prot->Valid) (mi, event, ne); i = (*km->prot->Valid) (pi, event, ne);
if (i != 0) if (i != 0)
{ {
#ifdef DEBUG #ifdef DEBUG
@ -867,9 +867,9 @@ MouseRead (int mousePort, void *closure)
} }
else else
{ {
if ((*km->prot->Complete) (mi, event, ne)) if ((*km->prot->Complete) (pi, event, ne))
{ {
if ((*km->prot->Parse) (mi, event, ne)) if ((*km->prot->Parse) (pi, event, ne))
{ {
switch (km->stage) switch (km->stage)
{ {
@ -896,7 +896,7 @@ MouseRead (int mousePort, void *closure)
km->invalid = 0; km->invalid = 0;
km->tested = 0; km->tested = 0;
km->valid = 0; km->valid = 0;
if (km->prot->Init && !(*km->prot->Init) (mi)) if (km->prot->Init && !(*km->prot->Init) (pi))
km->stage = MouseBroken; km->stage = MouseBroken;
} }
break; break;
@ -923,9 +923,9 @@ MouseRead (int mousePort, void *closure)
int MouseInputType; int MouseInputType;
char *kdefaultMouse[] = { char *kdefaultMouse[] = {
"/dev/input/mice",
"/dev/mouse", "/dev/mouse",
"/dev/psaux", "/dev/psaux",
"/dev/input/mice",
"/dev/adbmouse", "/dev/adbmouse",
"/dev/ttyS0", "/dev/ttyS0",
"/dev/ttyS1", "/dev/ttyS1",
@ -933,81 +933,97 @@ char *kdefaultMouse[] = {
#define NUM_DEFAULT_MOUSE (sizeof (kdefaultMouse) / sizeof (kdefaultMouse[0])) #define NUM_DEFAULT_MOUSE (sizeof (kdefaultMouse) / sizeof (kdefaultMouse[0]))
static Bool static Status
MouseInit (void) MouseInit (KdPointerInfo *pi)
{ {
int i; int i;
int fd; int fd;
Kmouse *km; Kmouse *km;
KdMouseInfo *mi, *next;
int n = 0;
char *prot;
if (!MouseInputType) if (!pi)
MouseInputType = KdAllocInputType (); return BadImplementation;
for (mi = kdMouseInfo; mi; mi = next) if (!pi->path || strcmp(pi->path, "auto") == 0) {
{ for (i = 0; i < NUM_DEFAULT_MOUSE; i++) {
next = mi->next;
prot = mi->prot;
if (mi->inputType)
continue;
if (!mi->name)
{
for (i = 0; i < NUM_DEFAULT_MOUSE; i++)
{
fd = open (kdefaultMouse[i], 2); fd = open (kdefaultMouse[i], 2);
if (fd >= 0) if (fd >= 0) {
{ pi->path = KdSaveString (kdefaultMouse[i]);
mi->name = KdSaveString (kdefaultMouse[i]);
break; break;
} }
} }
} }
else else {
fd = open (mi->name, 2); fd = open (pi->path, 2);
}
if (fd < 0)
return BadMatch;
close(fd);
if (fd >= 0)
{
km = (Kmouse *) xalloc (sizeof (Kmouse)); km = (Kmouse *) xalloc (sizeof (Kmouse));
if (km) if (km) {
{
km->iob.fd = fd;
km->iob.avail = km->iob.used = 0; km->iob.avail = km->iob.used = 0;
km->prot = 0; MouseFirstProtocol(km, "exps/2");
km->i_prot = 0; km->i_prot = 0;
km->tty = isatty (fd); km->tty = isatty (fd);
mi->driver = km; km->iob.fd = -1;
mi->inputType = MouseInputType; pi->driverPrivate = km;
MouseFirstProtocol (km, mi->prot);
if (KdRegisterFd (MouseInputType, fd, MouseRead, (void *) mi))
n++;
} }
else else {
close (fd); close (fd);
return BadAlloc;
} }
return Success;
}
static Status
MouseEnable (KdPointerInfo *pi)
{
Kmouse *km;
if (!pi || !pi->driverPrivate || !pi->path)
return BadImplementation;
km = pi->driverPrivate;
km->iob.fd = open(pi->path, 2);
if (km->iob.fd < 0)
return BadMatch;
if (!KdRegisterFd (km->iob.fd, MouseRead, pi))
{
close(km->iob.fd);
return BadAlloc;
} }
return TRUE;
return Success;
} }
static void static void
MouseFini (void) MouseDisable (KdPointerInfo *pi)
{ {
KdMouseInfo *mi; Kmouse *km;
if (!pi || !pi->driverPrivate)
return;
KdUnregisterFds (MouseInputType, TRUE); km = pi->driverPrivate;
for (mi = kdMouseInfo; mi; mi = mi->next) KdUnregisterFd (pi, km->iob.fd, TRUE);
{
if (mi->inputType == MouseInputType)
{
xfree (mi->driver);
mi->driver = 0;
mi->inputType = 0;
}
}
} }
KdMouseFuncs LinuxMouseFuncs = { static void
MouseFini (KdPointerInfo *pi)
{
xfree (pi->driverPrivate);
pi->driverPrivate = NULL;
}
KdPointerDriver LinuxMouseDriver = {
"mouse",
MouseInit, MouseInit,
MouseEnable,
MouseDisable,
MouseFini, MouseFini,
NULL,
}; };

View File

@ -90,41 +90,50 @@ MsRead (int port, void *closure)
dy = (char)(((b[0] & 0x0C) << 4) | (b[2] & 0x3F)); dy = (char)(((b[0] & 0x0C) << 4) | (b[2] & 0x3F));
n -= 3; n -= 3;
b += 3; b += 3;
KdEnqueueMouseEvent (kdMouseInfo, flags, dx, dy); KdEnqueuePointerEvent (closure, flags, dx, dy, 0);
} }
} }
} }
int MsInputType; static Status
MsInit (KdPointerInfo *pi)
{
if (!pi)
return BadImplementation;
static int if (!pi->path || strcmp(pi->path, "auto"))
MsInit (void) pi->path = KdSaveString("/dev/mouse");
if (!pi->name)
pi->name = KdSaveString("Microsoft protocol mouse");
return Success;
}
static Status
MsEnable (KdPointerInfo *pi)
{ {
int port; int port;
char *device = "/dev/mouse";
struct termios t; struct termios t;
int ret; int ret;
if (!MsInputType) port = open (pi->path, O_RDWR | O_NONBLOCK);
MsInputType = KdAllocInputType ();
port = open (device, O_RDWR | O_NONBLOCK);
if(port < 0) { if(port < 0) {
ErrorF("Couldn't open %s (%d)\n", device, (int)errno); ErrorF("Couldn't open %s (%d)\n", pi->path, (int)errno);
return 0; return 0;
} else if (port == 0) { } else if (port == 0) {
ErrorF("Opening %s returned 0! Please complain to Keith.\n", ErrorF("Opening %s returned 0! Please complain to Keith.\n",
device); pi->path);
goto bail; goto bail;
} }
if(!isatty(port)) { if(!isatty(port)) {
ErrorF("%s is not a tty\n", device); ErrorF("%s is not a tty\n", pi->path);
goto bail; goto bail;
} }
ret = tcgetattr(port, &t); ret = tcgetattr(port, &t);
if(ret < 0) { if(ret < 0) {
ErrorF("Couldn't tcgetattr(%s): %d\n", device, errno); ErrorF("Couldn't tcgetattr(%s): %d\n", pi->path, errno);
goto bail; goto bail;
} }
t.c_iflag &= ~ (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | t.c_iflag &= ~ (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR |
@ -140,24 +149,36 @@ MsInit (void)
t.c_cc[VTIME] = 0; t.c_cc[VTIME] = 0;
ret = tcsetattr(port, TCSANOW, &t); ret = tcsetattr(port, TCSANOW, &t);
if(ret < 0) { if(ret < 0) {
ErrorF("Couldn't tcsetattr(%s): %d\n", device, errno); ErrorF("Couldn't tcsetattr(%s): %d\n", pi->path, errno);
goto bail; goto bail;
} }
if (KdRegisterFd (MsInputType, port, MsRead, (void *) 0)) if (KdRegisterFd (port, MsRead, pi))
return 1; return TRUE;
pi->driverPrivate = (void *)port;
return Success;
bail: bail:
close(port); close(port);
return 0; return BadMatch;
} }
static void static void
MsFini (void) MsDisable (KdPointerInfo *pi)
{ {
KdUnregisterFds (MsInputType, TRUE); KdUnregisterFd (pi, (int)pi->driverPrivate, TRUE);
} }
KdMouseFuncs MsMouseFuncs = { static void
MsFini (KdPointerInfo *pi)
{
}
KdPointerDriver MsMouseDriver = {
"ms",
MsInit, MsInit,
MsFini MsEnable,
MsDisable,
MsFini,
NULL,
}; };

View File

@ -112,42 +112,78 @@ Ps2Read (int ps2Port, void *closure)
dy = -dy; dy = -dy;
n -= 3; n -= 3;
b += 3; b += 3;
KdEnqueueMouseEvent (kdMouseInfo, flags, dx, dy); KdEnqueuePointerEvent (closure, flags, dx, dy, 0);
} }
} }
} }
int Ps2InputType; static Status
Ps2Init (KdPointerInfo *pi)
static int
Ps2Init (void)
{ {
int i; int ps2Port, i;
int ps2Port;
int n;
if (!Ps2InputType) if (!pi->path) {
Ps2InputType = KdAllocInputType (); for (i = 0; i < NUM_PS2_NAMES; i++) {
n = 0;
for (i = 0; i < NUM_PS2_NAMES; i++)
{
ps2Port = open (Ps2Names[i], 0); ps2Port = open (Ps2Names[i], 0);
if (ps2Port >= 0) if (ps2Port >= 0) {
{ pi->path = KdSaveString (Ps2Names[i]);
if (KdRegisterFd (Ps2InputType, ps2Port, Ps2Read, (void *) i)) break;
n++;
} }
} }
return n; }
else {
ps2Port = open (pi->path, 0);
}
if (ps2Port < 0)
return BadMatch;
close(ps2Port);
if (!pi->name)
pi->name = KdSaveString ("PS/2 Mouse");
return Success;
}
static Status
Ps2Enable (KdPointerInfo *pi)
{
int fd;
if (!pi)
return BadImplementation;
fd = open (pi->path, 0);
if (fd < 0)
return BadMatch;
if (!KdRegisterFd (fd, Ps2Read, pi)) {
close(fd);
return BadAlloc;
}
pi->driverPrivate = (void *)fd;
return Success;
}
static void
Ps2Disable (KdPointerInfo *pi)
{
KdUnregisterFd (pi, (int)pi->driverPrivate, TRUE);
} }
static void static void
Ps2Fini (void) Ps2Fini (KdPointerInfo *pi)
{ {
KdUnregisterFds (Ps2InputType, TRUE);
} }
KdMouseFuncs Ps2MouseFuncs = { KdPointerDriver Ps2MouseDriver = {
"ps2",
Ps2Init, Ps2Init,
Ps2Fini Ps2Enable,
Ps2Disable,
Ps2Fini,
NULL,
}; };

View File

@ -75,7 +75,7 @@ TsReadBytes (int fd, char *buf, int len, int min)
static void static void
TsRead (int tsPort, void *closure) TsRead (int tsPort, void *closure)
{ {
KdMouseInfo *mi = closure; KdPointerInfo *pi = closure;
TS_EVENT event; TS_EVENT event;
int n; int n;
long x, y; long x, y;
@ -117,7 +117,7 @@ TsRead (int tsPort, void *closure)
lastx = 0; lastx = 0;
lasty = 0; lasty = 0;
} }
KdEnqueueMouseEvent (mi, flags, x, y); KdEnqueuePointerEvent (pi, flags, x, y, 0);
} }
} }
@ -129,95 +129,83 @@ char *TsNames[] = {
#define NUM_TS_NAMES (sizeof (TsNames) / sizeof (TsNames[0])) #define NUM_TS_NAMES (sizeof (TsNames) / sizeof (TsNames[0]))
int TsInputType; static Status
TsInit (KdPointerInfo *pi)
static int
TsEnable (int fd, void *closure)
{
KdMouseInfo *mi = (KdMouseInfo *)closure;
return open (mi->name, 0);
}
static void
TsDisable (int fd, void *closure)
{
close (fd);
}
static int
TsInit (void)
{ {
int i; int i;
int fd; int fd;
KdMouseInfo *mi, *next;
int n = 0; int n = 0;
if (!TsInputType) if (!pi->path || strcmp(pi->path, "auto") == 0) {
TsInputType = KdAllocInputType (); for (i = 0; i < NUM_TS_NAMES; i++) {
for (mi = kdMouseInfo; mi; mi = next)
{
next = mi->next;
if (mi->inputType)
continue;
if (!mi->name)
{
for (i = 0; i < NUM_TS_NAMES; i++)
{
fd = open (TsNames[i], 0); fd = open (TsNames[i], 0);
if (fd >= 0) if (fd >= 0) {
{ pi->path = KdSaveString (TsNames[i]);
mi->name = KdSaveString (TsNames[i]);
break; break;
} }
} }
} }
else else {
fd = open (mi->name, 0); fd = open (pi->path, 0);
if (fd >= 0) }
{
if (fd < 0) {
ErrorF("TsInit: Couldn't open %s\n", pi->path);
return BadMatch;
}
close(fd);
pi->name = KdSaveString("H3600 Touchscreen");
return Success;
}
static Status
TsEnable (KdPointerInfo *pi)
{
int fd;
if (!pi || !pi->path)
return BadImplementation;
fd = open(pi->path, 0);
if (fd < 0) {
ErrorF("TsInit: Couldn't open %s\n", pi->path);
return BadMatch;
}
struct h3600_ts_calibration cal; struct h3600_ts_calibration cal;
/* /*
* Check to see if this is a touch screen * Check to see if this is a touch screen
*/ */
if (ioctl (fd, TS_GET_CAL, &cal) != -1) if (ioctl (fd, TS_GET_CAL, &cal) != -1) {
{ mi->driverPrivate = (void *) fd;
mi->driver = (void *) fd; if (!KdRegisterFd (fd, TsRead, (void *) mi)) {
mi->inputType = TsInputType; close(fd);
if (KdRegisterFd (TsInputType, fd, TsRead, (void *) mi)) return BadAlloc;
{
/* Set callbacks for vt switches etc */
KdRegisterFdEnableDisable (fd, TsEnable, TsDisable);
n++;
} }
} }
else else {
ErrorF("TsEnable: %s is not a touchscreen\n", pi->path);
close (fd); close (fd);
} return BadMatch;
} }
return 0; return Success;
} }
static void static void
TsFini (void) TsFini (KdPointerInfo *pi)
{ {
KdMouseInfo *mi; KdUnregisterFds (pi, (int)pi->driverPrivate, TRUE);
mi->driverPrivate = NULL;
KdUnregisterFds (TsInputType, TRUE);
for (mi = kdMouseInfo; mi; mi = mi->next)
{
if (mi->inputType == TsInputType)
{
mi->driver = 0;
mi->inputType = 0;
}
}
} }
KdMouseFuncs TsFuncs = { KdPointerDriver TsDriver = {
TsInit, TsInit,
TsFini TsEnable,
TsDisable,
TsFini,
NULL,
}; };

View File

@ -1,73 +1,39 @@
/* /*
* $RCSId: xc/programs/Xserver/hw/kdrive/linux/tslib.c,v 1.1 2002/11/01 22:27:49 keithp Exp $ * TSLIB based touchscreen driver for KDrive
* TSLIB based touchscreen driver for TinyX * Porting to new input API and event queueing by Daniel Stone.
* Derived from ts.c by Keith Packard * Derived from ts.c by Keith Packard
* Derived from ps2.c by Jim Gettys * Derived from ps2.c by Jim Gettys
* *
* Copyright © 1999 Keith Packard * Copyright © 1999 Keith Packard
* Copyright © 2000 Compaq Computer Corporation * Copyright © 2000 Compaq Computer Corporation
* Copyright © 2002 MontaVista Software Inc. * Copyright © 2002 MontaVista Software Inc.
* Copyright © 2005 OpenedHand Ltd. * Copyright © 2006 Nokia Corporation
* *
* Permission to use, copy, modify, distribute, and sell this software and its * Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that * documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that * the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting * copyright notice and this permission notice appear in supporting
* documentation, and that the name of Keith Packard or Compaq not be used in * documentation, and that the name of the authors and/or copyright holders
* advertising or publicity pertaining to distribution of the software without * not be used in advertising or publicity pertaining to distribution of the
* specific, written prior permission. Keith Packard and Compaq makes no * software without specific, written prior permission. The authors and/or
* representations about the suitability of this software for any purpose. It * copyright holders make no representations about the suitability of this
* is provided "as is" without express or implied warranty. * software for any purpose. It is provided "as is" without express or
* implied warranty.
* *
* KEITH PACKARD AND COMPAQ DISCLAIM ALL WARRANTIES WITH REGARD TO THIS * THE AUTHORS AND/OR COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* IN NO EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR * AND FITNESS, IN NO EVENT SHALL THE AUTHORS AND/OR COPYRIGHT HOLDERS BE
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* PERFORMANCE OF THIS SOFTWARE. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Michael Taht or MontaVista not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Michael Taht and Montavista make no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* MICHAEL TAHT AND MONTAVISTA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
* IN NO EVENT SHALL EITHER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Matthew Allum or OpenedHand not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Matthew Allum and OpenedHand make no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* MATTHEW ALLUM AND OPENEDHAND DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
* IN NO EVENT SHALL EITHER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/ */
#ifdef HAVE_CONFIG_H #ifdef HAVE_KDRIVE_CONFIG_H
#include <kdrive-config.h> #include <kdrive-config.h>
#endif #endif
#define NEED_EVENTS #define NEED_EVENTS
#include <X11/X.h> #include <X11/X.h>
#include <X11/Xproto.h> #include <X11/Xproto.h>
@ -77,186 +43,171 @@
#include "kdrive.h" #include "kdrive.h"
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <tslib.h> #include <tslib.h>
#include <dirent.h>
#include <linux/input.h>
static struct tsdev *tsDev = NULL; struct TslibPrivate {
int fd;
static char *TsNames[] = { int lastx, lasty;
NULL, /* set via TSLIB_TSDEVICE */ struct tsdev *tsDev;
"/dev/ts", void (*raw_event_hook)(int x, int y, int pressure, void *closure);
"/dev/touchscreen/0", void *raw_event_closure;
int phys_screen;
}; };
#define NUM_TS_NAMES (sizeof (TsNames) / sizeof (TsNames[0]))
/* For XCalibrate extension */
void (*tslib_raw_event_hook)(int x, int y, int pressure, void *closure);
void *tslib_raw_event_closure;
int TsInputType = 0;
int KdTsPhyScreen = 0; /* XXX Togo .. */
static void static void
TsRead (int tsPort, void *closure) TsRead (int fd, void *closure)
{ {
KdMouseInfo *mi = closure; KdPointerInfo *pi = closure;
struct TslibPrivate *private = pi->driverPrivate;
struct ts_sample event; struct ts_sample event;
long x, y; long x = 0, y = 0;
unsigned long flags; unsigned long flags;
if (tslib_raw_event_hook) if (private->raw_event_hook) {
{ while (ts_read_raw(private->tsDev, &event, 1) == 1)
/* XCalibrate Ext */ private->raw_event_hook (event.x, event.y, event.pressure,
if (ts_read_raw(tsDev, &event, 1) == 1) private->raw_event_closure);
{
tslib_raw_event_hook (event.x,
event.y,
event.pressure,
tslib_raw_event_closure);
}
return; return;
} }
while (ts_read(tsDev, &event, 1) == 1) while (ts_read(private->tsDev, &event, 1) == 1) {
{ #ifdef DEBUG
flags = (event.pressure) ? KD_BUTTON_1 : 0; ErrorF("[tslib] originally from (%d, %d)\n", event.x, event.y);
#endif
if (event.pressure) {
if (event.pressure > pi->dixdev->touchscreen->button_threshold)
flags = KD_BUTTON_8;
else
flags = KD_BUTTON_1;
/*
* Here we test for the touch screen driver actually being on the
* touch screen, if it is we send absolute coordinates. If not,
* then we send delta's so that we can track the entire vga screen.
*/
if (KdCurScreen == private->phys_screen) {
x = event.x; x = event.x;
y = event.y; y = event.y;
} else {
flags |= KD_MOUSE_DELTA;
if ((private->lastx == 0) || (private->lasty == 0)) {
x = event.x;
y = event.y;
} else {
x = event.x - private->lastx;
y = event.y - private->lasty;
}
}
private->lastx = x;
private->lasty = y;
} else {
flags = 0;
x = private->lastx;
y = private->lasty;
}
KdEnqueueMouseEvent (mi, flags, x, y); #ifdef DEBUG
ErrorF("event at (%lu, %lu), pressure is %d, sending flags %lu\n", x, y, event.pressure, flags);
#endif
KdEnqueuePointerEvent (pi, flags, x, y, event.pressure);
} }
} }
static int static Status
TsLibOpen(char *dev) TslibEnable (KdPointerInfo *pi)
{ {
if(!(tsDev = ts_open(dev, 0))) struct TslibPrivate *private = pi->driverPrivate;
return -1;
if (ts_config(tsDev)) private->holdThumbEvents = 1;
return -1; private->raw_event_hook = NULL;
private->raw_event_closure = NULL;
private->tsDev = ts_open(pi->path, 0);
private->fd = ts_fd(private->tsDev);
if (!private->tsDev || ts_config(private->tsDev) || private->fd < 0) {
ErrorF("[tslib/TslibEnable] failed to open %s\n", pi->path);
if (private->fd > 0);
close(private->fd);
return BadAlloc;
}
if (pi->dixdev && pi->dixdev->touchscreen &&
pi->dixdev->touchscreen->button_threshold == 0)
pi->dixdev->touchscreen->button_threshold = 115;
return ts_fd(tsDev); #ifdef DEBUG
ErrorF("[tslib/TslibEnable] successfully enabled %s\n", pi->path);
#endif
KdRegisterFd(private->fd, TsRead, pi);
return Success;
} }
static int
TslibEnable (int not_needed_fd, void *closure)
{
KdMouseInfo *mi = closure;
int fd = 0;
if ((fd = TsLibOpen(mi->name)) == -1)
ErrorF ("Unable to re-enable TSLib ( on %s )", mi->name);
return fd;
}
static void static void
TslibDisable (int fd, void *closure) TslibDisable (KdPointerInfo *pi)
{ {
if (tsDev) struct TslibPrivate *private = pi->driverPrivate;
ts_close(tsDev);
tsDev = NULL; if (private->fd) {
KdUnregisterFd(pi, private->fd);
close(private->fd);
}
if (private->tsDev)
ts_close(private->tsDev);
private->fd = 0;
private->tsDev = NULL;
} }
static int
TslibInit (void) static Status
TslibInit (KdPointerInfo *pi)
{ {
int i, j = 0; int fd = 0, i = 0;
KdMouseInfo *mi, *next; char devpath[PATH_MAX], devname[TS_NAME_SIZE];
int fd = 0; DIR *inputdir = NULL;
int req_type; struct dirent *inputent = NULL;
struct tsdev *tsDev = NULL;
struct TslibPrivate *private = NULL;
if (!TsInputType) if (!pi || !pi->dixdev)
{ return !Success;
TsInputType = KdAllocInputType ();
KdParseMouse(0); /* allocate safe slot in kdMouseInfo */
req_type = 0;
}
else req_type = TsInputType; /* is being re-inited */
for (mi = kdMouseInfo; mi; mi = next) pi->driverPrivate = (struct TslibPrivate *)
{ xcalloc(sizeof(struct TslibPrivate), 1);
next = mi->next; if (!pi->driverPrivate)
return !Success;
/* find a usuable slot */ private = pi->driverPrivate;
if (mi->inputType != req_type) /* hacktastic */
continue; private->phys_screen = 0;
pi->nAxes = 3;
pi->name = KdSaveString("Touchscreen");
pi->inputClass = KD_TOUCHSCREEN;
#ifdef DEBUG
ErrorF("[tslib/TslibInit] successfully inited for device %s\n", pi->path);
#endif
/* Check for tslib env var device setting */ return Success;
if ((TsNames[0] = getenv("TSLIB_TSDEVICE")) == NULL)
j++;
if (!mi->name)
{
for (i = j; i < NUM_TS_NAMES; i++)
{
fd = TsLibOpen(TsNames[i]);
if (fd >= 0)
{
mi->name = KdSaveString (TsNames[i]);
break;
}
}
}
else
fd = TsLibOpen(mi->name);
if (fd >= 0 && tsDev != NULL)
{
mi->driver = (void *) fd;
mi->inputType = TsInputType;
KdRegisterFd (TsInputType, fd, TsRead, (void *) mi);
/* Set callbacks for vt switches etc */
KdRegisterFdEnableDisable (fd, TslibEnable, TslibDisable);
return TRUE;
}
}
ErrorF ("Failed to open TSLib device, tried ");
for (i = j; i < NUM_TS_NAMES; i++)
ErrorF ("%s ", TsNames[i]);
ErrorF (".\n");
if (!TsNames[0])
ErrorF ("Try setting TSLIB_TSDEVICE to valid /dev entry?\n");
if (fd > 0)
close(fd);
return FALSE;
} }
static void static void
TslibFini (void) TslibFini (KdPointerInfo *pi)
{ {
KdMouseInfo *mi; if (pi->driverPrivate) {
xfree(pi->driverPrivate);
KdUnregisterFds (TsInputType, TRUE); pi->driverPrivate = NULL;
for (mi = kdMouseInfo; mi; mi = mi->next)
{
if (mi->inputType == TsInputType)
{
if(mi->driver)
{
ts_close(tsDev);
tsDev = NULL;
}
mi->driver = 0;
/* If below is set to 0, then MouseInit() will trash it,
* setting to 'mouse type' ( via server reset). Therefore
* Leave it alone and work around in TslibInit() ( see
* req_type ).
*/
/* mi->inputType = 0; */
}
} }
} }
KdMouseFuncs TsFuncs = {
KdPointerDriver TsDriver = {
"tslib",
TslibInit, TslibInit,
TslibFini TslibEnable,
TslibDisable,
TslibFini,
NULL,
}; };

View File

@ -24,7 +24,7 @@ libkdrive_a_SOURCES = \
kdrive.h \ kdrive.h \
kinfo.c \ kinfo.c \
kinput.c \ kinput.c \
kkeymap.h \ kkeymap.c \
kmap.c \ kmap.c \
kmode.c \ kmode.c \
knoop.c \ knoop.c \
@ -37,5 +37,4 @@ libkdrive_a_SOURCES = \
$(top_srcdir)/mi/miinitext.c $(top_srcdir)/mi/miinitext.c
libkdrivestubs_a_SOURCES = \ libkdrivestubs_a_SOURCES = \
$(top_srcdir)/Xi/stubs.c \
$(top_srcdir)/fb/fbcmap.c $(top_srcdir)/fb/fbcmap.c

View File

@ -43,6 +43,12 @@
#include "dpmsproc.h" #include "dpmsproc.h"
#endif #endif
#ifdef HAVE_EXECINFO_H
#include <execinfo.h>
#endif
#include <signal.h>
typedef struct _kdDepths { typedef struct _kdDepths {
CARD8 depth; CARD8 depth;
CARD8 bpp; CARD8 bpp;
@ -60,6 +66,8 @@ KdDepths kdDepths[] = {
#define NUM_KD_DEPTHS (sizeof (kdDepths) / sizeof (kdDepths[0])) #define NUM_KD_DEPTHS (sizeof (kdDepths) / sizeof (kdDepths[0]))
#define KD_DEFAULT_BUTTONS 5
int kdScreenPrivateIndex; int kdScreenPrivateIndex;
unsigned long kdGeneration; unsigned long kdGeneration;
@ -76,6 +84,8 @@ Bool kdSwitchPending;
char *kdSwitchCmd; char *kdSwitchCmd;
DDXPointRec kdOrigin; DDXPointRec kdOrigin;
static Bool kdCaughtSignal = FALSE;
/* /*
* Carry arguments from InitOutput through driver initialization * Carry arguments from InitOutput through driver initialization
* to KdScreenInit * to KdScreenInit
@ -368,6 +378,9 @@ AbortDDX(void)
(*kdOsFuncs->Fini) (); (*kdOsFuncs->Fini) ();
KdDoSwitchCmd ("stop"); KdDoSwitchCmd ("stop");
} }
if (kdCaughtSignal)
abort();
} }
void void
@ -379,7 +392,7 @@ ddxGiveUp ()
Bool kdDumbDriver; Bool kdDumbDriver;
Bool kdSoftCursor; Bool kdSoftCursor;
static char * char *
KdParseFindNext (char *cur, char *delim, char *save, char *last) KdParseFindNext (char *cur, char *delim, char *save, char *last)
{ {
while (*cur && !strchr (delim, *cur)) while (*cur && !strchr (delim, *cur))
@ -560,97 +573,6 @@ KdSaveString (char *str)
return n; return n;
} }
/*
* Parse mouse information. Syntax:
*
* <device>,<nbutton>,<protocol>{,<option>}...
*
* options: {nmo} pointer mapping (e.g. {321})
* 2button emulate middle button
* 3button dont emulate middle button
*/
void
KdParseMouse (char *arg)
{
char save[1024];
char delim;
KdMouseInfo *mi;
int i;
mi = KdMouseInfoAdd ();
if (!mi)
return;
mi->name = 0;
mi->prot = 0;
mi->emulateMiddleButton = kdEmulateMiddleButton;
mi->transformCoordinates = !kdRawPointerCoordinates;
mi->nbutton = 3;
for (i = 0; i < KD_MAX_BUTTON; i++)
mi->map[i] = i + 1;
if (!arg)
return;
if (strlen (arg) >= sizeof (save))
return;
arg = KdParseFindNext (arg, ",", save, &delim);
if (!save[0])
return;
mi->name = KdSaveString (save);
if (delim != ',')
return;
arg = KdParseFindNext (arg, ",", save, &delim);
if (!save[0])
return;
if ('1' <= save[0] && save[0] <= '0' + KD_MAX_BUTTON && save[1] == '\0')
{
mi->nbutton = save[0] - '0';
if (mi->nbutton > KD_MAX_BUTTON)
{
UseMsg ();
return;
}
}
if (!delim != ',')
return;
arg = KdParseFindNext (arg, ",", save, &delim);
if (save[0])
mi->prot = KdSaveString (save);
while (delim == ',')
{
arg = KdParseFindNext (arg, ",", save, &delim);
if (save[0] == '{')
{
char *s = save + 1;
i = 0;
while (*s && *s != '}')
{
if ('1' <= *s && *s <= '0' + mi->nbutton)
mi->map[i] = *s - '0';
else
UseMsg ();
s++;
}
}
else if (!strcmp (save, "2button"))
mi->emulateMiddleButton = TRUE;
else if (!strcmp (save, "3button"))
mi->emulateMiddleButton = FALSE;
else if (!strcmp (save, "rawcoord"))
mi->transformCoordinates = FALSE;
else if (!strcmp (save, "transform"))
mi->transformCoordinates = TRUE;
else
UseMsg ();
}
}
void void
KdParseRgba (char *rgba) KdParseRgba (char *rgba)
{ {
@ -697,6 +619,8 @@ KdProcessArgument (int argc, char **argv, int i)
{ {
KdCardInfo *card; KdCardInfo *card;
KdScreenInfo *screen; KdScreenInfo *screen;
KdPointerInfo *pi;
KdKeyboardInfo *ki;
if (!strcmp (argv[i], "-card")) if (!strcmp (argv[i], "-card"))
{ {
@ -736,6 +660,11 @@ KdProcessArgument (int argc, char **argv, int i)
kdDontZap = TRUE; kdDontZap = TRUE;
return 1; return 1;
} }
if (!strcmp (argv[i], "-nozap"))
{
kdDontZap = TRUE;
return 1;
}
if (!strcmp (argv[i], "-3button")) if (!strcmp (argv[i], "-3button"))
{ {
kdEmulateMiddleButton = FALSE; kdEmulateMiddleButton = FALSE;
@ -785,14 +714,6 @@ KdProcessArgument (int argc, char **argv, int i)
UseMsg (); UseMsg ();
return 2; return 2;
} }
if (!strcmp (argv[i], "-mouse"))
{
if ((i+1) < argc)
KdParseMouse (argv[i+1]);
else
UseMsg ();
return 2;
}
if (!strcmp (argv[i], "-rgba")) if (!strcmp (argv[i], "-rgba"))
{ {
if ((i+1) < argc) if ((i+1) < argc)
@ -814,6 +735,20 @@ KdProcessArgument (int argc, char **argv, int i)
{ {
return 1; return 1;
} }
if (!strcmp (argv[i], "-mouse") ||
!strcmp (argv[i], "-pointer")) {
if (i + 1 >= argc)
UseMsg();
KdAddConfigPointer(argv[i + 1]);
return 2;
}
if (!strcmp (argv[i], "-keybd")) {
if (i + 1 >= argc)
UseMsg();
KdAddConfigKeyboard(argv[i + 1]);
return 2;
}
#ifdef PSEUDO8 #ifdef PSEUDO8
return p8ProcessArgument (argc, argv, i); return p8ProcessArgument (argc, argv, i);
#else #else
@ -1420,6 +1355,39 @@ KdDepthToFb (ScreenPtr pScreen, int depth)
#endif #endif
#ifdef HAVE_BACKTRACE
/* shamelessly ripped from xf86Events.c */
void
KdBacktrace (int signum)
{
void *array[32]; /* more than 32 and you have bigger problems */
size_t size, i;
char **strings;
signal(signum, SIG_IGN);
size = backtrace (array, 32);
fprintf (stderr, "\nBacktrace (%d deep):\n", size);
strings = backtrace_symbols (array, size);
for (i = 0; i < size; i++)
fprintf (stderr, "%d: %s\n", i, strings[i]);
free (strings);
kdCaughtSignal = TRUE;
if (signum == SIGSEGV)
FatalError("Segmentation fault caught\n");
else if (signum > 0)
FatalError("Signal %d caught\n", signum);
}
#else
void
KdBacktrace (int signum)
{
kdCaughtSignal = TRUE;
FatalError("Segmentation fault caught\n");
}
#endif
void void
KdInitOutput (ScreenInfo *pScreenInfo, KdInitOutput (ScreenInfo *pScreenInfo,
int argc, int argc,
@ -1428,6 +1396,10 @@ KdInitOutput (ScreenInfo *pScreenInfo,
KdCardInfo *card; KdCardInfo *card;
KdScreenInfo *screen; KdScreenInfo *screen;
/* kind of a hack: we want Composite enabled, but it's disabled per
* default. */
noCompositeExtension = FALSE;
if (!kdCardInfo) if (!kdCardInfo)
{ {
InitCard (0); InitCard (0);
@ -1464,6 +1436,8 @@ KdInitOutput (ScreenInfo *pScreenInfo,
for (card = kdCardInfo; card; card = card->next) for (card = kdCardInfo; card; card = card->next)
for (screen = card->screenList; screen; screen = screen->next) for (screen = card->screenList; screen; screen = screen->next)
KdAddScreen (pScreenInfo, screen, argc, argv); KdAddScreen (pScreenInfo, screen, argc, argv);
signal(SIGSEGV, KdBacktrace);
} }
#ifdef DPMSExtension #ifdef DPMSExtension

View File

@ -47,6 +47,10 @@
#include "shadow.h" #include "shadow.h"
#include "randrstr.h" #include "randrstr.h"
#ifdef XKB
#include <X11/extensions/XKBstr.h>
#endif
extern WindowPtr *WindowTable; extern WindowPtr *WindowTable;
#define KD_DPMS_NORMAL 0 #define KD_DPMS_NORMAL 0
@ -63,6 +67,8 @@ extern WindowPtr *WindowTable;
#define KD_MAX_CARD_ADDRESS 8 #define KD_MAX_CARD_ADDRESS 8
#endif #endif
#define Status int
/* /*
* Configuration information per video card * Configuration information per video card
*/ */
@ -215,7 +221,7 @@ typedef struct {
#endif #endif
} KdPrivScreenRec, *KdPrivScreenPtr; } KdPrivScreenRec, *KdPrivScreenPtr;
typedef enum _kdMouseState { typedef enum _kdPointerState {
start, start,
button_1_pend, button_1_pend,
button_1_down, button_1_down,
@ -226,51 +232,135 @@ typedef enum _kdMouseState {
synth_2_down_3, synth_2_down_3,
synth_2_down_1, synth_2_down_1,
num_input_states num_input_states
} KdMouseState; } KdPointerState;
#define KD_MAX_BUTTON 7 #define KD_MAX_BUTTON 16
typedef struct _KdMouseInfo { #define KD_KEYBOARD 1
struct _KdMouseInfo *next; #define KD_MOUSE 2
void *driver; #define KD_TOUCHSCREEN 3
void *closure;
typedef struct _KdPointerInfo KdPointerInfo;
typedef struct _KdPointerDriver {
char *name; char *name;
char *prot; Status (*Init) (KdPointerInfo *);
char map[KD_MAX_BUTTON]; Status (*Enable) (KdPointerInfo *);
int nbutton; void (*Disable) (KdPointerInfo *);
void (*Fini) (KdPointerInfo *);
struct _KdPointerDriver *next;
} KdPointerDriver;
struct _KdPointerInfo {
DeviceIntPtr dixdev;
char *name;
char *path;
InputOption *options;
int inputClass;
CARD8 map[KD_MAX_BUTTON];
int nButtons;
int nAxes;
Bool emulateMiddleButton; Bool emulateMiddleButton;
unsigned long emulationTimeout; unsigned long emulationTimeout;
Bool timeoutPending;
KdMouseState mouseState;
Bool eventHeld;
xEvent heldEvent;
unsigned char buttonState;
int emulationDx, emulationDy; int emulationDx, emulationDy;
int inputType;
Bool transformCoordinates;
} KdMouseInfo;
extern KdMouseInfo *kdMouseInfo; Bool timeoutPending;
KdPointerState mouseState;
Bool eventHeld;
struct {
int type;
int x;
int y;
int z;
int flags;
int absrel;
} heldEvent;
unsigned char buttonState;
Bool transformCoordinates;
int pressureThreshold;
KdPointerDriver *driver;
void *driverPrivate;
struct _KdPointerInfo *next;
};
extern int KdCurScreen; extern int KdCurScreen;
KdMouseInfo *KdMouseInfoAdd (void); void KdAddPointerDriver (KdPointerDriver *driver);
void KdMouseInfoDispose (KdMouseInfo *mi); void KdRemovePointerDriver (KdPointerDriver *driver);
void KdParseMouse (char *); KdPointerInfo *KdNewPointer (void);
void KdFreePointer (KdPointerInfo *);
int KdAddPointer (KdPointerInfo *ki);
int KdAddConfigPointer (char *pointer);
void KdRemovePointer (KdPointerInfo *ki);
typedef struct _KdMouseFuncs {
Bool (*Init) (void);
void (*Fini) (void);
} KdMouseFuncs;
typedef struct _KdKeyboardFuncs { #define KD_KEY_COUNT 248
void (*Load) (void); #define KD_MIN_KEYCODE 8
int (*Init) (void); #define KD_MAX_KEYCODE 255
void (*Leds) (int); #define KD_MAX_WIDTH 4
void (*Bell) (int, int, int); #define KD_MAX_LENGTH (KD_MAX_KEYCODE - KD_MIN_KEYCODE + 1)
void (*Fini) (void);
typedef struct {
KeySym modsym;
int modbit;
} KdKeySymModsRec;
extern const KeySym kdDefaultKeymap[KD_MAX_LENGTH * KD_MAX_WIDTH];
extern const int kdDefaultKeymapWidth;
extern const CARD8 kdDefaultModMap[MAP_LENGTH];
extern const KeySymsRec kdDefaultKeySyms;
typedef struct _KdKeyboardInfo KdKeyboardInfo;
typedef struct _KdKeyboardDriver {
char *name;
Bool (*Init) (KdKeyboardInfo *);
Bool (*Enable) (KdKeyboardInfo *);
void (*Leds) (KdKeyboardInfo *, int);
void (*Bell) (KdKeyboardInfo *, int, int, int);
void (*Disable) (KdKeyboardInfo *);
void (*Fini) (KdKeyboardInfo *);
struct _KdKeyboardDriver *next;
} KdKeyboardDriver;
struct _KdKeyboardInfo {
struct _KdKeyboardInfo *next;
DeviceIntPtr dixdev;
void *closure;
char *name;
char *path;
int inputClass;
#ifdef XKB
XkbDescPtr xkb;
#endif
int LockLed; int LockLed;
} KdKeyboardFuncs;
CARD8 keyState[KD_KEY_COUNT/8];
int minScanCode;
int maxScanCode;
CARD8 modmap[MAP_LENGTH];
KeySymsRec keySyms;
int leds;
int bellPitch;
int bellDuration;
InputOption *options;
KdKeyboardDriver *driver;
void *driverPrivate;
};
void KdAddKeyboardDriver (KdKeyboardDriver *driver);
void KdRemoveKeyboardDriver (KdKeyboardDriver *driver);
KdKeyboardInfo *KdNewKeyboard (void);
void KdFreeKeyboard (KdKeyboardInfo *ki);
int KdAddConfigKeyboard (char *pointer);
int KdAddKeyboard (KdKeyboardInfo *ki);
void KdRemoveKeyboard (KdKeyboardInfo *ki);
typedef struct _KdOsFuncs { typedef struct _KdOsFuncs {
int (*Init) (void); int (*Init) (void);
@ -307,9 +397,9 @@ typedef struct _KdMonitorTiming {
extern const KdMonitorTiming kdMonitorTimings[]; extern const KdMonitorTiming kdMonitorTimings[];
extern const int kdNumMonitorTimings; extern const int kdNumMonitorTimings;
typedef struct _KdMouseMatrix { typedef struct _KdPointerMatrix {
int matrix[2][3]; int matrix[2][3];
} KdMouseMatrix; } KdPointerMatrix;
typedef struct _KaaTrapezoid { typedef struct _KaaTrapezoid {
float tl, tr, ty; float tl, tr, ty;
@ -628,8 +718,14 @@ KdParseScreen (KdScreenInfo *screen,
char * char *
KdSaveString (char *str); KdSaveString (char *str);
void KdPointerInfo *
KdParseMouse (char *arg); KdParsePointer (char *arg);
KdKeyboardInfo *
KdParseKeyboard (char *arg);
char *
KdParseFindNext (char *cur, char *delim, char *save, char *last);
void void
KdParseRgba (char *rgba); KdParseRgba (char *rgba);
@ -678,6 +774,9 @@ KdInitOutput (ScreenInfo *pScreenInfo,
void void
KdSetSubpixelOrder (ScreenPtr pScreen, Rotation randr); KdSetSubpixelOrder (ScreenPtr pScreen, Rotation randr);
void
KdBacktrace (int signum);
/* kinfo.c */ /* kinfo.c */
KdCardInfo * KdCardInfo *
KdCardInfoAdd (KdCardFuncs *funcs, KdCardInfoAdd (KdCardFuncs *funcs,
@ -699,27 +798,22 @@ KdScreenInfoDispose (KdScreenInfo *si);
/* kinput.c */ /* kinput.c */
void void
KdInitInput(KdMouseFuncs *, KdKeyboardFuncs *); KdInitInput(void);
void void
KdAddMouseDriver(KdMouseFuncs *); KdAddPointerDriver(KdPointerDriver *);
int void
KdAllocInputType (void); KdAddKeyboardDriver(KdKeyboardDriver *);
Bool Bool
KdRegisterFd (int type, int fd, void (*read) (int fd, void *closure), void *closure); KdRegisterFd (int fd, void (*read) (int fd, void *closure), void *closure);
void void
KdRegisterFdEnableDisable (int fd, KdUnregisterFds (void *closure, Bool do_close);
int (*enable) (int fd, void *closure),
void (*disable) (int fd, void *closure));
void void
KdUnregisterFds (int type, Bool do_close); KdEnqueueKeyboardEvent(KdKeyboardInfo *ki, unsigned char scan_code,
void
KdEnqueueKeyboardEvent(unsigned char scan_code,
unsigned char is_up); unsigned char is_up);
#define KD_BUTTON_1 0x01 #define KD_BUTTON_1 0x01
@ -727,25 +821,28 @@ KdEnqueueKeyboardEvent(unsigned char scan_code,
#define KD_BUTTON_3 0x04 #define KD_BUTTON_3 0x04
#define KD_BUTTON_4 0x08 #define KD_BUTTON_4 0x08
#define KD_BUTTON_5 0x10 #define KD_BUTTON_5 0x10
#define KD_BUTTON_8 0x80
#define KD_MOUSE_DELTA 0x80000000 #define KD_MOUSE_DELTA 0x80000000
void void
KdEnqueueMouseEvent(KdMouseInfo *mi, unsigned long flags, int x, int y); KdEnqueuePointerEvent(KdPointerInfo *pi, unsigned long flags, int rx, int ry,
int rz);
void void
KdEnqueueMotionEvent (KdMouseInfo *mi, int x, int y); _KdEnqueuePointerEvent(KdPointerInfo *pi, int type, int x, int y, int z,
int b, int absrel, Bool force);
void void
KdReleaseAllKeys (void); KdReleaseAllKeys (void);
void void
KdSetLed (int led, Bool on); KdSetLed (KdKeyboardInfo *ki, int led, Bool on);
void void
KdSetMouseMatrix (KdMouseMatrix *matrix); KdSetPointerMatrix (KdPointerMatrix *pointer);
void void
KdComputeMouseMatrix (KdMouseMatrix *matrix, Rotation randr, int width, int height); KdComputePointerMatrix (KdPointerMatrix *pointer, Rotation randr, int width, int height);
void void
KdBlockHandler (int screen, KdBlockHandler (int screen,
@ -768,19 +865,17 @@ KdEnableInput (void);
void void
ProcessInputEvents (void); ProcessInputEvents (void);
extern KdMouseFuncs LinuxMouseFuncs; extern KdPointerDriver LinuxMouseDriver;
extern KdMouseFuncs LinuxEvdevFuncs; extern KdPointerDriver LinuxEvdevDriver;
extern KdMouseFuncs Ps2MouseFuncs; extern KdPointerDriver Ps2MouseDriver;
extern KdMouseFuncs BusMouseFuncs; extern KdPointerDriver BusMouseDriver;
extern KdMouseFuncs MsMouseFuncs; extern KdPointerDriver MsMouseDriver;
#ifdef TOUCHSCREEN extern KdPointerDriver TsDriver;
extern KdMouseFuncs TsFuncs; extern KdKeyboardDriver LinuxKeyboardDriver;
#endif
extern KdKeyboardFuncs LinuxKeyboardFuncs;
extern KdOsFuncs LinuxFuncs; extern KdOsFuncs LinuxFuncs;
extern KdMouseFuncs VxWorksMouseFuncs; extern KdPointerDriver VxWorksMouseDriver;
extern KdKeyboardFuncs VxWorksKeyboardFuncs; extern KdKeyboardDriver VxWorksKeyboardDriver;
extern KdOsFuncs VxWorksFuncs; extern KdOsFuncs VxWorksFuncs;
/* kmap.c */ /* kmap.c */

View File

@ -101,7 +101,7 @@ KdScreenInfoDispose (KdScreenInfo *si)
KdCardInfo *ci = si->card; KdCardInfo *ci = si->card;
KdScreenInfo **prev; KdScreenInfo **prev;
for (prev = &ci->screenList; *prev; prev = &(*prev)->next) for (prev = &ci->screenList; *prev; prev = &(*prev)->next) {
if (*prev == si) if (*prev == si)
{ {
*prev = si->next; *prev = si->next;
@ -110,38 +110,63 @@ KdScreenInfoDispose (KdScreenInfo *si)
KdCardInfoDispose (ci); KdCardInfoDispose (ci);
break; break;
} }
}
} }
KdMouseInfo *kdMouseInfo; KdPointerInfo *
KdNewPointer (void)
KdMouseInfo *
KdMouseInfoAdd (void)
{ {
KdMouseInfo *mi, **prev; KdPointerInfo *pi;
mi = (KdMouseInfo *) xalloc (sizeof (KdMouseInfo)); pi = (KdPointerInfo *)xcalloc(1, sizeof(KdPointerInfo));
if (!mi) if (!pi)
return 0; return NULL;
bzero (mi, sizeof (KdMouseInfo));
for (prev = &kdMouseInfo; *prev; prev = &(*prev)->next); pi->name = KdSaveString("Generic Pointer");
*prev = mi; pi->path = NULL;
return mi; pi->inputClass = KD_MOUSE;
pi->driver = NULL;
pi->driverPrivate = NULL;
pi->next = NULL;
pi->options = NULL;
pi->nAxes = 3;
return pi;
} }
void void
KdMouseInfoDispose (KdMouseInfo *mi) KdFreePointer(KdPointerInfo *pi)
{ {
KdMouseInfo **prev; InputOption *option, *prev = NULL;
for (prev = &kdMouseInfo; *prev; prev = &(*prev)->next) if (pi->name)
if (*prev == mi) xfree(pi->name);
{ if (pi->path)
*prev = mi->next; xfree(pi->path);
if (mi->name)
xfree (mi->name); for (option = pi->options; option; option = option->next) {
if (mi->prot) if (prev)
xfree (mi->prot); xfree(prev);
xfree (mi); if (option->key)
break; xfree(option->key);
if (option->value)
xfree(option->value);
prev = option;
} }
if (prev)
xfree(prev);
xfree(pi);
}
void
KdFreeKeyboard(KdKeyboardInfo *ki)
{
if (ki->name)
xfree(ki->name);
if (ki->path)
xfree(ki->path);
ki->next = NULL;
xfree(ki);
} }

File diff suppressed because it is too large Load Diff

View File

@ -28,14 +28,13 @@
#endif #endif
#include "kdrive.h" #include "kdrive.h"
#include <X11/keysym.h> #include <X11/keysym.h>
#include "kkeymap.h"
/* /*
* Map scan codes (both regular and synthesized from extended keys) * Map scan codes (both regular and synthesized from extended keys)
* to X keysyms * to X keysyms
*/ */
KeySym kdKeymap[(MAX_SCANCODE - MIN_SCANCODE + 1) * MAX_WIDTH] = { const KeySym kdDefaultKeymap[KD_MAX_LENGTH * KD_MAX_WIDTH] = {
/* These are directly mapped from DOS scanset 0 */ /* These are directly mapped from DOS scanset 0 */
/* 1 8 */ XK_Escape, NoSymbol, /* 1 8 */ XK_Escape, NoSymbol,
/* 2 9 */ XK_1, XK_exclam, /* 2 9 */ XK_1, XK_exclam,
@ -152,53 +151,8 @@ KeySym kdKeymap[(MAX_SCANCODE - MIN_SCANCODE + 1) * MAX_WIDTH] = {
/* 110 117 */ NoSymbol, NoSymbol, /* 110 117 */ NoSymbol, NoSymbol,
/* 111 118 */ NoSymbol, NoSymbol, /* 111 118 */ NoSymbol, NoSymbol,
/* 112 119 */ NoSymbol, NoSymbol, /* 112 119 */ NoSymbol, NoSymbol,
;
/*
* Map extended keys to additional scancodes
*/
KdExtendMap kdExtendMap[] = {
0x1d, 89, /* Control_R */
0x1c, 90, /* KP_Enter */
0x35, 91, /* KP_Divide */
0x37, 92, /* Sys_Req */
0x38, 93, /* Alt_R */
0x45, 94, /* Num_Lock */
0x47, 95, /* Home */
0x48, 96, /* Up */
0x49, 97, /* Page_Up */
0x4b, 98, /* Left */
0x4d, 99, /* Right */
0x4f, 100, /* End */
0x50, 101, /* Down */
0x51, 102, /* Page_Down */
0x52, 103, /* Insert */
0x53, 104, /* Delete */
0x5b, 105, /* Super_L (Windows_L) */
0x5c, 106, /* Super_R (Windows_R) */
0x5d, 107, /* Menu */
0x46, 69, /* Break (with control pressed) */
}; };
#define NUM_EXTEND (sizeof (kdExtendMap)/ sizeof (kdExtendMap[0]))
int kdNumExtend = NUM_EXTEND;
/*
* Map keys on Japanese keyboard far from zero back to reasonable values
*/
KdExtendMap kdJapanMap[] = {
0x70, 108, /* next to Alt key */
0x73, 109, /* dash/vbar */
0x79, 110, /* right of space bar */
0x7b, 111, /* left of space bar */
0x7d, 112, /* Yen */
};
#define NUM_JAPAN (sizeof (kdJapanMap)/sizeof (kdJapanMap[0]))
int kdNumJapan = NUM_JAPAN;
/* /*
* List of locking key codes * List of locking key codes
*/ */
@ -226,13 +180,13 @@ CARD8 kdOptionalLockMap[] = {
int kdNumOptionalLock = NUM_OPTIONAL_LOCK; int kdNumOptionalLock = NUM_OPTIONAL_LOCK;
CARD8 kdModMap[MAP_LENGTH]; const CARD8 kdDefaultModMap[MAP_LENGTH];
unsigned long kdKeymapFlags = 0; unsigned long kdDefaultKeymapFlags = 0;
KeySymsRec kdKeySyms = { const KeySymsRec kdDefaultKeySyms = {
kdKeymap, kdDefaultKeymap,
MIN_KEYCODE, KD_MIN_KEYCODE,
MAX_KEYCODE, KD_MAX_KEYCODE,
2 KD_MAX_WIDTH
}; };

View File

@ -27,7 +27,6 @@
#include <kdrive-config.h> #include <kdrive-config.h>
#endif #endif
#include "kdrive.h" #include "kdrive.h"
#include "kkeymap.h"
#ifdef WINDOWS #ifdef WINDOWS
#define KM_BUF 1024 #define KM_BUF 1024

View File

@ -871,7 +871,7 @@ vesaComputeFramebufferMapping (KdScreenInfo *screen)
VesaScreenPrivPtr pscr = screen->driver; VesaScreenPrivPtr pscr = screen->driver;
int depth, bpp, fbbpp; int depth, bpp, fbbpp;
Pixel allbits; Pixel allbits;
KdMouseMatrix m; KdPointerMatrix m;
if (vesa_linear_fb) if (vesa_linear_fb)
{ {
@ -970,10 +970,10 @@ vesaComputeFramebufferMapping (KdScreenInfo *screen)
pscr->mapping = VESA_WINDOWED; pscr->mapping = VESA_WINDOWED;
pscr->shadow = TRUE; pscr->shadow = TRUE;
} }
KdComputeMouseMatrix (&m, pscr->randr, KdComputePointerMatrix (&m, pscr->randr,
pscr->mode.XResolution, pscr->mode.YResolution); pscr->mode.XResolution, pscr->mode.YResolution);
KdSetMouseMatrix (&m); KdSetPointerMatrix (&m);
screen->width = pscr->mode.XResolution; screen->width = pscr->mode.XResolution;
screen->height = pscr->mode.YResolution; screen->height = pscr->mode.YResolution;

View File

@ -71,7 +71,16 @@ InitOutput (ScreenInfo *pScreenInfo, int argc, char **argv)
void void
InitInput (int argc, char **argv) InitInput (int argc, char **argv)
{ {
KdInitInput(&LinuxMouseFuncs, &LinuxKeyboardFuncs); KdKeyboardInfo *ki = NULL;
KdAddPointerDriver(&LinuxMouseDriver);
KdAddKeyboardDriver(&LinuxKeyboardDriver);
ki = KdNewKeyboard();
if (ki) {
ki->driver = &LinuxKeyboardDriver;
KdAddKeyboard(ki);
}
KdInitInput();
} }
void void

View File

@ -171,7 +171,7 @@ static int kbdFd = -1;
#include <event.h> #include <event.h>
#include <kbd_ioctl.h> #include <kbd_ioctl.h>
extern KeybdCtrl defaultKeyboardControl; extern KeyboardCtrl defaultKeyboardControl;
static void static void
VxWorksSetAutorepeat (unsigned char *repeats, Bool on) VxWorksSetAutorepeat (unsigned char *repeats, Bool on)
@ -235,7 +235,7 @@ void
VxWorksKeyboardLeds (int leds) VxWorksKeyboardLeds (int leds)
{ {
DeviceIntPtr pKeyboard = (DeviceIntPtr) LookupKeyboardDevice (); DeviceIntPtr pKeyboard = (DeviceIntPtr) LookupKeyboardDevice ();
KeybdCtrl *ctrl = &pKeyboard->kbdfeed->ctrl; KeyboardCtrl *ctrl = &pKeyboard->kbdfeed->ctrl;
led_ioctl_info led_info; led_ioctl_info led_info;
int i; int i;