wayv-0.3/0000755000175000017500000000000010360521457010777 5ustar nicknickwayv-0.3/AUTHORS0000644000175000017500000000107707716656317012073 0ustar nicknickCurrently ========= - Mike Bennett (MB) (smoog at stressbunny dot com) Initial and main developer, general X head who is a bit of a Human Computer Interaction nut :) - Nick Rusnov (NR) (nickrusnov at debian dot org) wayV Debian package maintainer, general bug fixed, feature adder and the guy who kept the project alive! Previously ========== - Simon Hart (SH) (sphart at u genie co uk) Provided direction based matching and straight line recognizing patches - Muhammad Hussain Yusuf (MY) (yusuf at debian dot org) Initial Debian package creator and maintainer wayv-0.3/BUGS0000644000175000017500000000076107716661122011473 0ustar nicknickLast Update: 14/08/2003 - Sometimes wayV seems to just stop accepting inputs (?) - Managed input window doesn't send key press events properly - Lots of ones in the parser, both reading and writing but they shouldn't affect version 0.2 unless people are creating their own gestures and using %,"\ or ; in the wrong place in way's configuration file. NOTE: This will be fixed in version 0.3, the parser will be completely rewritten. - Modifier keys can affect the emulated key press' wayv-0.3/stamp-h.in0000644000175000017500000000001207432563455012703 0ustar nicknicktimestamp wayv-0.3/INSTALL0000644000175000017500000000537407716661165012055 0ustar nicknickINSTALL ======= Author: Mike Bennett (smoog at stressbunny dot com) Last Update: 24/04/2001 Contents -------- 1. Installation & Compiling 2. Using wayV 3. Requirements 4. Important Notes Installation ------------ 1. ./configure 2. make 3. make install IF YOU'RE ALREADY USING wayV AND HAVE EDITED wayv.conf MAKE SURE AND BACKUP A COPY OF YOUR VERSION!!!! (see the file UPGRADING for more information) 4. look at doc/trained-gestures.jpg to see what gestures wayV is setup to recognize 5. wayV's two configuration files, wayv.conf and DEFAULT.wkey, are installed in /usr/local/share but it is possible to specify a different directory 6. to start wayV run the program wayv (by default installed in /usr/local/bin) NOTE: If configure doesn't find XExtension and XTest you won't be able to send keypress' via wayV Using ----- Hold down the activation button (by default mouse button 2) and key(s) (see doc/HOWTO-wayv-config for further information) and move the mouse around. When the button and key(s) are released look at the xterm wayV is running in. You'll see a grid filled in with 0s and 1s. The 1s should indicate the path followed by the mouse. If display output is turned on when you press the activation button and key(s) a white border will appear around the screen - with the path followed by the mouse highlighted in various colours. NOTE: When you're inputting a gesture, if the display is on, its best to wait till the white border appears before doing the gesture. Requirements ------------ 1. A flavour of Unix (development occurs mainly on Linux and earlier versions were tested under Solaris and FreeBSD) 2. Running X server with a pointer, e.g. a mouse, trackball, etc 3. gcc and X libraries 4. make, gcc, autoconf, install - all the usual Optional: 1. X server that supports X extension 2. X server that supports XTest (for sending fake keypress events) Important Notes --------------- 1. There aren't many default actions associated with the gestures, if you draw a C Xcalc should start (presuming its in your path). Have a look at the file src/wayv.conf, specifically the Action sub-sections. Read doc/HOW-wayv-config to learn how to setup other actions. 2. Have a look at wayv.conf, specifically the Launch value, if its M1 then mouse button 1 is the activation key, if its M2 then its mouse button 2 and if its M3 then its mouse button 3, etc. 3. If the full screen input display is on and you press the activation button(s) WAIT till the white border FULLY appears before drawing a gesture. 4. Make sure the main configuration file wayv.conf and DEFAULT.wkey are in the default directory (usually /usr/local/share) or else specific where to find them on command line when starting wayV, e.g. wayv /etc/wayv.conf wayv-0.3/NEWS0000644000175000017500000000172107716661200011501 0ustar nicknick14/08/2003 ========== I'm (Mike) changing the development model of wayV. No longer am I going to go for rare big releases, instead I'm going to adopt a policy of code often, release often. This 0.3 release is primarily the excellent work of Nick Rusnov and his maintaince of wayV for Debian, including the various bug fixes and functionality improvements! 24/04/2001 ========== Finished version 0.2 and released it. Whew :) 19/02/2001 ========== The project is now fully active again and will continue so for the foreseeable future. Also migrated the website over to stressbunny.com 02/08/2000 ========== Release version 0.1 - the first official release. This has keyboard modifiers, etc. Now there is a good framework which can be built upon. 20/06/2000 ========== Launched the initial test version pre 0.1 - its numbered 0.0.9 and will only be around for a few days. Its just to iron out the few issues. Have a look at the ChangeLog for more up to date technical news. wayv-0.3/README0000644000175000017500000000305207716661332011667 0ustar nicknickREADME ====== Author: Mike Bennett (smoog at stressbunny dot com) Last Update: 14/08/2003 wayV is... ---------- 1. Experiment with human computer interaction, especially gesture based computing. 2. Initially some software that does hand writing/gesture recognition. Shapes represent actions and are inputed via the mouse, i.e. draw a B and the "b" key press is sent to your Xterm, draw a C and xcalc starts, draw an N and Netscape starts, etc. How to use ---------- See INSTALL for information on how to compile wayV. When wayV is running hold down the activation buttons. Draw shapes (make gestures by moving the mouse), and when you're finished making a gesture release the activation button. wayV then tries to match a gesture with an action, e.g. hold down mouse button 1, wait till a white border appears around your screen, draw a C with the mouse, release mouse button 1 and Xcalc should start if its on your computer and in your path. Various notes ------------- Read "doc/HOWTO-wayv-config" to understand how to configure wayV, and have a look at "doc/trained-gestures.jpg" to see what default gestures wayV is setup for. When you're using wayV with user feedback on (this is the default) you MUST wait till a white border appears around your screen BEFORE attempting to drawn a gesture. The appearance of the white border tells you wayV is ready for gesture capture and processing. For those who are interested wayV uses a form of template matching for its gesture recognition. Website ------- http://www.stressbunny.com/wayv wayv-0.3/TODO0000644000175000017500000000671707716661650011515 0ustar nicknickLast Update: 14/08/2003 Todo for 0.4 ============ - add screen annotate mode Todo for 0.5 ============ - move configuration file to XML format - write program to transform old conf to upcoming XML format Todo for 0.X ============ - write GUI for wayV, maybe using wxWindows or Java (?) - support personalities - lower memory footprint - use orbits - implement proper event handling model - get rid of floats - update setup.* use MAXSUBS (or it'd be better to get rid of them) - remove global - rewrite the parser to work correctly - port to Windows Ongoing and in the future ========================= - support -geometry X & Y parsing (KLUDGE - testing to see if useful) - give user feedback of match action (ONGOING) - sending keypress' (BEGUN) - write configuration front end - watch configuration file for changes and do auto-reload - update/rewrite parser to ignore fields, escape properly, etc - write up documents (ONGOING) - support radius and linear pda gesture matching - point to point line interpolation for shapes drawn very fast - allow setting of border colour - implement loadable module architecture for gesture matching and receiving input - fix bugs (always and for ever after) - continue coding up vectors (Simon?) - optionally wayv backgrounds on startup - personalities (different action groups, e.g. send small a or big A because of a gesture A) - new action to control switching between personalities - free unneeded memory in setup to reduce memory footprint for mobile devices - touch as a form of activation/activation button - input window can contain user feedback - application dependent personalities (scope) - have gestures generate actions specific to applications - set-able border picture and background - display application dependent gestures on screen when gesture input activated - implement xscribble gesture recognizer - redesign configuration file to support different forms of gesture records (Orbits with time) - support for different languages (localize) - description in action feedback - fade out feedback as eye candy - control feedback position, colours, font size and style - double click activation, delay time activation - change drawable prompt - gestures made of multiple lines, doesn't have to be one drawn action - configuration file stored as binary file with compression to reduce memory requirements - create upgrade script to support upgrading existing configurations to new types - if program already running bring it to the foreground - have other gesture input devices (webcam, etc) - gesture/action creation wizard - create input string block tokenizer - write a better event handler management system - let external programs be callable before gesture input activated and after it finished, i.e. turn on or off sounds, LEDs, etc - input mode without GUI, suitable for text mode - line melting, do subtraction on gesture, delete in on bounded boxes that have 1 pixel cross over - result in close match - optional always on top input windows - input window divided into different regions with each region associated with a different personality - activate wayV by sending a message via a pipe, or equivalent, which means pop-up is separated and can be more system specific - popup input window can cover only certain areas of the screen - direction matching optional to each gesture - implement L based gesture matching to experiment - develop evolutionary gesture matching as an experiment - composite keypress building (not sure) wayv-0.3/aclocal.m40000644000175000017500000001045407432563455012655 0ustar nicknickdnl aclocal.m4 generated automatically by aclocal 1.4 dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A dnl PARTICULAR PURPOSE. # Do all the work for Automake. This macro actually does too much -- # some checks are only needed if your package does certain things. # But this isn't really a big deal. # serial 1 dnl Usage: dnl AM_INIT_AUTOMAKE(package,version, [no-define]) AC_DEFUN(AM_INIT_AUTOMAKE, [AC_REQUIRE([AC_PROG_INSTALL]) PACKAGE=[$1] AC_SUBST(PACKAGE) VERSION=[$2] AC_SUBST(VERSION) dnl test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi ifelse([$3],, AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) AC_REQUIRE([AM_SANITY_CHECK]) AC_REQUIRE([AC_ARG_PROGRAM]) dnl FIXME This is truly gross. missing_dir=`cd $ac_aux_dir && pwd` AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) AC_REQUIRE([AC_PROG_MAKE_SET])]) # # Check to make sure that the build environment is sane. # AC_DEFUN(AM_SANITY_CHECK, [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftestfile # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` if test "[$]*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftestfile` fi if test "[$]*" != "X $srcdir/configure conftestfile" \ && test "[$]*" != "X conftestfile $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "[$]2" = conftestfile ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi rm -f conftest* AC_MSG_RESULT(yes)]) dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) dnl The program must properly implement --version. AC_DEFUN(AM_MISSING_PROG, [AC_MSG_CHECKING(for working $2) # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if ($2 --version) < /dev/null > /dev/null 2>&1; then $1=$2 AC_MSG_RESULT(found) else $1="$3/missing $2" AC_MSG_RESULT(missing) fi AC_SUBST($1)]) # Like AC_CONFIG_HEADER, but automatically create stamp file. AC_DEFUN(AM_CONFIG_HEADER, [AC_PREREQ([2.12]) AC_CONFIG_HEADER([$1]) dnl When config.status generates a header, we must update the stamp-h file. dnl This file resides in the same directory as the config header dnl that is generated. We must strip everything past the first ":", dnl and everything past the last "/". AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, <>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, <>; do case " <<$>>CONFIG_HEADERS " in *" <<$>>am_file "*<<)>> echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx ;; esac am_indx=`expr "<<$>>am_indx" + 1` done<<>>dnl>>) changequote([,]))]) wayv-0.3/configure0000755000175000017500000025366007432563455012734 0ustar nicknick#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.13 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # Defaults: ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: ac_help="$ac_help --with-x use the X Window System" # Initialize some variables set by options. # The variables have the same names as the options, with # dashes changed to underlines. build=NONE cache_file=./config.cache exec_prefix=NONE host=NONE no_create= nonopt=NONE no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= target=NONE verbose= x_includes=NONE x_libraries=NONE bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' # Initialize some other variables. subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. ac_max_here_lines=12 ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi case "$ac_option" in -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) ac_optarg= ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case "$ac_option" in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir="$ac_optarg" ;; -build | --build | --buil | --bui | --bu) ac_prev=build ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build="$ac_optarg" ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file="$ac_optarg" ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir="$ac_optarg" ;; -disable-* | --disable-*) ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` eval "enable_${ac_feature}=no" ;; -enable-* | --enable-*) ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "enable_${ac_feature}='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix="$ac_optarg" ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he) # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat << EOF Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [same as prefix] --bindir=DIR user executables in DIR [EPREFIX/bin] --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] --libexecdir=DIR program executables in DIR [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data in DIR [PREFIX/share] --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data in DIR [PREFIX/com] --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] --libdir=DIR object code libraries in DIR [EPREFIX/lib] --includedir=DIR C header files in DIR [PREFIX/include] --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] --infodir=DIR info documentation in DIR [PREFIX/info] --mandir=DIR man documentation in DIR [PREFIX/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names EOF cat << EOF Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] --target=TARGET configure for TARGET [TARGET=HOST] Features and packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR EOF if test -n "$ac_help"; then echo "--enable and --with options recognized:$ac_help" fi exit 0 ;; -host | --host | --hos | --ho) ac_prev=host ;; -host=* | --host=* | --hos=* | --ho=*) host="$ac_optarg" ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir="$ac_optarg" ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir="$ac_optarg" ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir="$ac_optarg" ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir="$ac_optarg" ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir="$ac_optarg" ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir="$ac_optarg" ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir="$ac_optarg" ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix="$ac_optarg" ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix="$ac_optarg" ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix="$ac_optarg" ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name="$ac_optarg" ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir="$ac_optarg" ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir="$ac_optarg" ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site="$ac_optarg" ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir="$ac_optarg" ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir="$ac_optarg" ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target="$ac_optarg" ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers) echo "configure generated by autoconf version 2.13" exit 0 ;; -with-* | --with-*) ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "with_${ac_package}='$ac_optarg'" ;; -without-* | --without-*) ac_package=`echo $ac_option|sed -e 's/-*without-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` eval "with_${ac_package}=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes="$ac_optarg" ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries="$ac_optarg" ;; -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ;; *) if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then echo "configure: warning: $ac_option: invalid host type" 1>&2 fi if test "x$nonopt" != xNONE; then { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } fi nonopt="$ac_option" ;; esac done if test -n "$ac_prev"; then { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } fi trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 # File descriptor usage: # 0 standard input # 1 file creation # 2 errors and warnings # 3 some systems may open it to /dev/tty # 4 used on the Kubota Titan # 6 checking for... messages and results # 5 compiler messages saved in config.log if test "$silent" = yes; then exec 6>/dev/null else exec 6>&1 fi exec 5>./config.log echo "\ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. " 1>&5 # Strip out --no-create and --no-recursion so they do not pile up. # Also quote any args containing shell metacharacters. ac_configure_args= for ac_arg do case "$ac_arg" in -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ac_configure_args="$ac_configure_args '$ac_arg'" ;; *) ac_configure_args="$ac_configure_args $ac_arg" ;; esac done # NLS nuisances. # Only set these to C if already set. These must not be set unconditionally # because not all systems understand e.g. LANG=C (notably SCO). # Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! # Non-C LC_CTYPE values break the ctype check. if test "${LANG+set}" = set; then LANG=C; export LANG; fi if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo > confdefs.h # A filename unique to this package, relative to the directory that # configure is in, which we can look for to find out if srcdir is correct. ac_unique_file=src/defines.h # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_prog=$0 ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } else { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } fi fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then echo "loading site script $ac_site_file" . "$ac_site_file" fi done if test -r "$cache_file"; then echo "loading cache $cache_file" . $cache_file else echo "creating cache $cache_file" > $cache_file fi ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross ac_exeext= ac_objext=o if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ac_n= ac_c=' ' ac_t=' ' else ac_n=-n ac_c= ac_t= fi else ac_n= ac_c='\c' ac_t= fi ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break fi done if test -z "$ac_aux_dir"; then { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } fi ac_config_guess=$ac_aux_dir/config.guess ac_config_sub=$ac_aux_dir/config.sub ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 echo "configure:558: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" for ac_dir in $PATH; do # Account for people who put trailing slashes in PATH elements. case "$ac_dir/" in /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do if test -f $ac_dir/$ac_prog; then if test $ac_prog = install && grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : else ac_cv_path_install="$ac_dir/$ac_prog -c" break 2 fi fi done ;; esac done IFS="$ac_save_IFS" fi if test "${ac_cv_path_install+set}" = set; then INSTALL="$ac_cv_path_install" else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL="$ac_install_sh" fi fi echo "$ac_t""$INSTALL" 1>&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 echo "configure:611: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftestfile` fi if test "$*" != "X $srcdir/configure conftestfile" \ && test "$*" != "X conftestfile $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { echo "configure: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" 1>&2; exit 1; } fi test "$2" = conftestfile ) then # Ok. : else { echo "configure: error: newly created file is older than distributed files! Check your system clock" 1>&2; exit 1; } fi rm -f conftest* echo "$ac_t""yes" 1>&6 if test "$program_transform_name" = s,x,x,; then program_transform_name= else # Double any \ or $. echo might interpret backslashes. cat <<\EOF_SED > conftestsed s,\\,\\\\,g; s,\$,$$,g EOF_SED program_transform_name="`echo $program_transform_name|sed -f conftestsed`" rm -f conftestsed fi test "$program_prefix" != NONE && program_transform_name="s,^,${program_prefix},; $program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" # sed with no file args requires a program. test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 echo "configure:668: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftestmake <<\EOF all: @echo 'ac_maketemp="${MAKE}"' EOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftestmake fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$ac_t""yes" 1>&6 SET_MAKE= else echo "$ac_t""no" 1>&6 SET_MAKE="MAKE=${MAKE-make}" fi PACKAGE=wayv VERSION=`cat VERSION` if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } fi cat >> confdefs.h <> confdefs.h <&6 echo "configure:714: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (aclocal --version) < /dev/null > /dev/null 2>&1; then ACLOCAL=aclocal echo "$ac_t""found" 1>&6 else ACLOCAL="$missing_dir/missing aclocal" echo "$ac_t""missing" 1>&6 fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 echo "configure:727: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (autoconf --version) < /dev/null > /dev/null 2>&1; then AUTOCONF=autoconf echo "$ac_t""found" 1>&6 else AUTOCONF="$missing_dir/missing autoconf" echo "$ac_t""missing" 1>&6 fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 echo "configure:740: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (automake --version) < /dev/null > /dev/null 2>&1; then AUTOMAKE=automake echo "$ac_t""found" 1>&6 else AUTOMAKE="$missing_dir/missing automake" echo "$ac_t""missing" 1>&6 fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 echo "configure:753: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (autoheader --version) < /dev/null > /dev/null 2>&1; then AUTOHEADER=autoheader echo "$ac_t""found" 1>&6 else AUTOHEADER="$missing_dir/missing autoheader" echo "$ac_t""missing" 1>&6 fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 echo "configure:766: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (makeinfo --version) < /dev/null > /dev/null 2>&1; then MAKEINFO=makeinfo echo "$ac_t""found" 1>&6 else MAKEINFO="$missing_dir/missing makeinfo" echo "$ac_t""missing" 1>&6 fi # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:786: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="gcc" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:816: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_prog_rejected=no ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" break fi done IFS="$ac_save_ifs" if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# -gt 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift set dummy "$ac_dir/$ac_word" "$@" shift ac_cv_prog_CC="$@" fi fi fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then case "`uname -s`" in *win32* | *WIN32*) # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:867: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="cl" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi ;; esac fi test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 echo "configure:899: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF #line 910 "configure" #include "confdefs.h" main(){return(0);} EOF if { (eval echo configure:915: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then ac_cv_prog_cc_cross=no else ac_cv_prog_cc_cross=yes fi else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_prog_cc_works=no fi rm -fr conftest* ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 echo "configure:941: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo "configure:946: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no fi fi echo "$ac_t""$ac_cv_prog_gcc" 1>&6 if test $ac_cv_prog_gcc = yes; then GCC=yes else GCC= fi ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 echo "configure:974: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ac_cv_prog_cc_g=yes else ac_cv_prog_cc_g=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 echo "configure:1017: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" for ac_dir in $PATH; do # Account for people who put trailing slashes in PATH elements. case "$ac_dir/" in /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do if test -f $ac_dir/$ac_prog; then if test $ac_prog = install && grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : else ac_cv_path_install="$ac_dir/$ac_prog -c" break 2 fi fi done ;; esac done IFS="$ac_save_IFS" fi if test "${ac_cv_path_install+set}" = set; then INSTALL="$ac_cv_path_install" else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL="$ac_install_sh" fi fi echo "$ac_t""$INSTALL" 1>&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 echo "configure:1071: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else # This must be in double quotes, not single quotes, because CPP may get # substituted into the Makefile and "${CC-cc}" will confuse make. CPP="${CC-cc} -E" # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1092: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1109: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1126: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP=/lib/cpp fi rm -f conftest* fi rm -f conftest* fi rm -f conftest* ac_cv_prog_CPP="$CPP" fi CPP="$ac_cv_prog_CPP" else ac_cv_prog_CPP="$CPP" fi echo "$ac_t""$CPP" 1>&6 # If we find X, set shell vars x_includes and x_libraries to the # paths, otherwise set no_x=yes. # Uses ac_ vars as temps to allow command line to override cache and checks. # --without-x overrides everything else, but does not touch the cache. echo $ac_n "checking for X""... $ac_c" 1>&6 echo "configure:1155: checking for X" >&5 # Check whether --with-x or --without-x was given. if test "${with_x+set}" = set; then withval="$with_x" : fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then # Both variables are already set. have_x=yes else if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=NO ac_x_libraries=NO rm -fr conftestdir if mkdir conftestdir; then cd conftestdir # Make sure to not put "make" in the Imakefile rules, since we grep it out. cat > Imakefile <<'EOF' acfindx: @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' EOF if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl; do if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && test -f $ac_im_libdir/libX11.$ac_extension; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case "$ac_im_incroot" in /usr/include) ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;; esac case "$ac_im_usrlibdir" in /usr/lib | /lib) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;; esac fi cd .. rm -fr conftestdir fi if test "$ac_x_includes" = NO; then # Guess where to find include files, by looking for this one X11 .h file. test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h # First, try using that file with no special directory specified. cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1222: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* # We can compile using X headers with no special include directory. ac_x_includes= else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* # Look for the header file in a standard set of common directories. # Check X11 before X11Rn because it is often a symlink to the current release. for ac_dir in \ /usr/X11/include \ /usr/X11R6/include \ /usr/X11R5/include \ /usr/X11R4/include \ \ /usr/include/X11 \ /usr/include/X11R6 \ /usr/include/X11R5 \ /usr/include/X11R4 \ \ /usr/local/X11/include \ /usr/local/X11R6/include \ /usr/local/X11R5/include \ /usr/local/X11R4/include \ \ /usr/local/include/X11 \ /usr/local/include/X11R6 \ /usr/local/include/X11R5 \ /usr/local/include/X11R4 \ \ /usr/X386/include \ /usr/x386/include \ /usr/XFree86/include/X11 \ \ /usr/include \ /usr/local/include \ /usr/unsupported/include \ /usr/athena/include \ /usr/local/x11r5/include \ /usr/lpp/Xamples/include \ \ /usr/openwin/include \ /usr/openwin/share/include \ ; \ do if test -r "$ac_dir/$x_direct_test_include"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest* fi # $ac_x_includes = NO if test "$ac_x_libraries" = NO; then # Check for the libraries. test -z "$x_direct_test_library" && x_direct_test_library=Xt test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS="$LIBS" LIBS="-l$x_direct_test_library $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* LIBS="$ac_save_LIBS" # We can link X programs with no special library path. ac_x_libraries= else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* LIBS="$ac_save_LIBS" # First see if replacing the include by lib works. # Check X11 before X11Rn because it is often a symlink to the current release. for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \ /usr/X11/lib \ /usr/X11R6/lib \ /usr/X11R5/lib \ /usr/X11R4/lib \ \ /usr/lib/X11 \ /usr/lib/X11R6 \ /usr/lib/X11R5 \ /usr/lib/X11R4 \ \ /usr/local/X11/lib \ /usr/local/X11R6/lib \ /usr/local/X11R5/lib \ /usr/local/X11R4/lib \ \ /usr/local/lib/X11 \ /usr/local/lib/X11R6 \ /usr/local/lib/X11R5 \ /usr/local/lib/X11R4 \ \ /usr/X386/lib \ /usr/x386/lib \ /usr/XFree86/lib/X11 \ \ /usr/lib \ /usr/local/lib \ /usr/unsupported/lib \ /usr/athena/lib \ /usr/local/x11r5/lib \ /usr/lpp/Xamples/lib \ /lib/usr/lib/X11 \ \ /usr/openwin/lib \ /usr/openwin/share/lib \ ; \ do for ac_extension in a so sl; do if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f conftest* fi # $ac_x_libraries = NO if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then # Didn't find X anywhere. Cache the known absence of X. ac_cv_have_x="have_x=no" else # Record where we found X for the cache. ac_cv_have_x="have_x=yes \ ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" fi fi fi eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then echo "$ac_t""$have_x" 1>&6 no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes \ ac_x_includes=$x_includes ac_x_libraries=$x_libraries" echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6 fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. cat >> confdefs.h <<\EOF #define X_DISPLAY_MISSING 1 EOF X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . case "`(uname -sr) 2>/dev/null`" in "SunOS 5"*) echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6 echo "configure:1404: checking whether -R must be followed by a space" >&5 ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_R_nospace=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_R_nospace=no fi rm -f conftest* if test $ac_R_nospace = yes; then echo "$ac_t""no" 1>&6 X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_R_space=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_R_space=no fi rm -f conftest* if test $ac_R_space = yes; then echo "$ac_t""yes" 1>&6 X_LIBS="$X_LIBS -R $x_libraries" else echo "$ac_t""neither works" 1>&6 fi fi LIBS="$ac_xsave_LIBS" esac fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn.Johnson@cl.cam.ac.uk says this is needed for Ultrix, if the X # libraries were built with DECnet support. And karl@cs.umb.edu says # the Alpha needs dnet_stub (dnet does not exist). echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6 echo "configure:1469: checking for dnet_ntoa in -ldnet" >&5 ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldnet $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" else echo "$ac_t""no" 1>&6 fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6 echo "configure:1510: checking for dnet_ntoa in -ldnet_stub" >&5 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldnet_stub $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" else echo "$ac_t""no" 1>&6 fi fi # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # chad@anasazi.com says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to dickey@clark.net. echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 echo "configure:1558: checking for gethostbyname" >&5 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gethostbyname(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_gethostbyname) || defined (__stub___gethostbyname) choke me #else gethostbyname(); #endif ; return 0; } EOF if { (eval echo configure:1586: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_gethostbyname=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_gethostbyname=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then echo "$ac_t""yes" 1>&6 : else echo "$ac_t""no" 1>&6 fi if test $ac_cv_func_gethostbyname = no; then echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 echo "configure:1607: checking for gethostbyname in -lnsl" >&5 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" else echo "$ac_t""no" 1>&6 fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says simon@lia.di.epfl.ch: it contains # gethostby* variants that don't use the nameserver (or something). # -lsocket must be given before -lnsl if both are needed. # We assume that if connect needs -lnsl, so does gethostbyname. echo $ac_n "checking for connect""... $ac_c" 1>&6 echo "configure:1656: checking for connect" >&5 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char connect(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_connect) || defined (__stub___connect) choke me #else connect(); #endif ; return 0; } EOF if { (eval echo configure:1684: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_connect=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_connect=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then echo "$ac_t""yes" 1>&6 : else echo "$ac_t""no" 1>&6 fi if test $ac_cv_func_connect = no; then echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6 echo "configure:1705: checking for connect in -lsocket" >&5 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" else echo "$ac_t""no" 1>&6 fi fi # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX. echo $ac_n "checking for remove""... $ac_c" 1>&6 echo "configure:1748: checking for remove" >&5 if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char remove(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_remove) || defined (__stub___remove) choke me #else remove(); #endif ; return 0; } EOF if { (eval echo configure:1776: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_remove=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_remove=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'remove`\" = yes"; then echo "$ac_t""yes" 1>&6 : else echo "$ac_t""no" 1>&6 fi if test $ac_cv_func_remove = no; then echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6 echo "configure:1797: checking for remove in -lposix" >&5 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lposix $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" else echo "$ac_t""no" 1>&6 fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. echo $ac_n "checking for shmat""... $ac_c" 1>&6 echo "configure:1840: checking for shmat" >&5 if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shmat(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_shmat) || defined (__stub___shmat) choke me #else shmat(); #endif ; return 0; } EOF if { (eval echo configure:1868: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_shmat=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_shmat=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'shmat`\" = yes"; then echo "$ac_t""yes" 1>&6 : else echo "$ac_t""no" 1>&6 fi if test $ac_cv_func_shmat = no; then echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6 echo "configure:1889: checking for shmat in -lipc" >&5 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lipc $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" else echo "$ac_t""no" 1>&6 fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS="$LDFLAGS" test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6 echo "configure:1941: checking for IceConnectionNumber in -lICE" >&5 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" else echo "$ac_t""no" 1>&6 fi LDFLAGS="$ac_save_LDFLAGS" fi echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 echo "configure:1985: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1998: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* ac_cv_header_stdc=yes else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "memchr" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "free" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF if { (eval echo configure:2065: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* ac_cv_header_stdc=no fi rm -fr conftest* fi fi fi echo "$ac_t""$ac_cv_header_stdc" 1>&6 if test $ac_cv_header_stdc = yes; then cat >> confdefs.h <<\EOF #define STDC_HEADERS 1 EOF fi echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6 echo "configure:2089: checking for sys/wait.h that is POSIX.1 compatible" >&5 if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #ifndef WEXITSTATUS #define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) #endif #ifndef WIFEXITED #define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main() { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } EOF if { (eval echo configure:2110: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_header_sys_wait_h=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_sys_wait_h=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_header_sys_wait_h" 1>&6 if test $ac_cv_header_sys_wait_h = yes; then cat >> confdefs.h <<\EOF #define HAVE_SYS_WAIT_H 1 EOF fi for ac_hdr in sys/time.h unistd.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:2134: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:2144: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 echo "configure:2172: checking whether time.h and sys/time.h may both be included" >&5 if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include int main() { struct tm *tp; ; return 0; } EOF if { (eval echo configure:2186: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_header_time=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_time=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_header_time" 1>&6 if test $ac_cv_header_time = yes; then cat >> confdefs.h <<\EOF #define TIME_WITH_SYS_TIME 1 EOF fi echo $ac_n "checking for XOpenDisplay in -lX11""... $ac_c" 1>&6 echo "configure:2208: checking for XOpenDisplay in -lX11" >&5 ac_lib_var=`echo X11'_'XOpenDisplay | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lX11 $X_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_LIBS="$X_LIBS -lX11" else echo "$ac_t""no" 1>&6 { echo "configure: error: Cannot find X11 library" 1>&2; exit 1; } fi echo $ac_n "checking for XQueryExtension in -lXext""... $ac_c" 1>&6 echo "configure:2249: checking for XQueryExtension in -lXext" >&5 ac_lib_var=`echo Xext'_'XQueryExtension | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lXext $X_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF #define HAVE_X_EXTENSION 1 EOF else echo "$ac_t""no" 1>&6 fi echo $ac_n "checking for XTestFakeKeyEvent in -lXtst""... $ac_c" 1>&6 echo "configure:2292: checking for XTestFakeKeyEvent in -lXtst" >&5 ac_lib_var=`echo Xtst'_'XTestFakeKeyEvent | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lXtst $X_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF #define HAVE_X_TEST 1 EOF X_LIBS="$X_LIBS -lXtst" else echo "$ac_t""no" 1>&6 fi echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 echo "configure:2336: checking return type of signal handlers" >&5 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #ifdef signal #undef signal #endif #ifdef __cplusplus extern "C" void (*signal (int, void (*)(int)))(int); #else void (*signal ()) (); #endif int main() { int i; ; return 0; } EOF if { (eval echo configure:2358: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_type_signal=void else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_type_signal=int fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_signal" 1>&6 cat >> confdefs.h <&6 echo "configure:2379: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:2407: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 fi done trap '' 1 2 15 cat > confcache <<\EOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs. It is not useful on other systems. # If it contains results you don't want to keep, you may remove or edit it. # # By default, configure uses ./config.cache as the cache file, # creating it if it does not exist already. You can give configure # the --cache-file=FILE option to use a different cache file; that is # what configure does when it calls configure scripts in # subdirectories, so they share the cache. # Giving --cache-file=/dev/null disables caching, for debugging configure. # config.status only pays attention to the cache file if you give it the # --recheck option to rerun configure. # EOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote substitution # turns \\\\ into \\, and sed turns \\ into \). sed -n \ -e "s/'/'\\\\''/g" \ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ;; esac >> confcache if cmp -s $cache_file confcache; then : else if test -w $cache_file; then echo "updating cache $cache_file" cat confcache > $cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Any assignment to VPATH causes Sun make to only execute # the first set of double-colon rules, so remove it if not needed. # If there is a colon in the path, we need to keep it. if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' fi trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 DEFS=-DHAVE_CONFIG_H # Without the "./", some shells look in PATH for config.status. : ${CONFIG_STATUS=./config.status} echo creating $CONFIG_STATUS rm -f $CONFIG_STATUS cat > $CONFIG_STATUS </dev/null | sed 1q`: # # $0 $ac_configure_args # # Compiler output produced by configure, useful for debugging # configure, is in ./config.log if it exists. ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" for ac_option do case "\$ac_option" in -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) echo "$CONFIG_STATUS generated by autoconf version 2.13" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; *) echo "\$ac_cs_usage"; exit 1 ;; esac done ac_given_srcdir=$srcdir ac_given_INSTALL="$INSTALL" trap 'rm -fr `echo "src/Makefile doc/Makefile Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF $ac_vpsub $extrasub s%@SHELL@%$SHELL%g s%@CFLAGS@%$CFLAGS%g s%@CPPFLAGS@%$CPPFLAGS%g s%@CXXFLAGS@%$CXXFLAGS%g s%@FFLAGS@%$FFLAGS%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%$LDFLAGS%g s%@LIBS@%$LIBS%g s%@exec_prefix@%$exec_prefix%g s%@prefix@%$prefix%g s%@program_transform_name@%$program_transform_name%g s%@bindir@%$bindir%g s%@sbindir@%$sbindir%g s%@libexecdir@%$libexecdir%g s%@datadir@%$datadir%g s%@sysconfdir@%$sysconfdir%g s%@sharedstatedir@%$sharedstatedir%g s%@localstatedir@%$localstatedir%g s%@libdir@%$libdir%g s%@includedir@%$includedir%g s%@oldincludedir@%$oldincludedir%g s%@infodir@%$infodir%g s%@mandir@%$mandir%g s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g s%@INSTALL_DATA@%$INSTALL_DATA%g s%@PACKAGE@%$PACKAGE%g s%@VERSION@%$VERSION%g s%@ACLOCAL@%$ACLOCAL%g s%@AUTOCONF@%$AUTOCONF%g s%@AUTOMAKE@%$AUTOMAKE%g s%@AUTOHEADER@%$AUTOHEADER%g s%@MAKEINFO@%$MAKEINFO%g s%@SET_MAKE@%$SET_MAKE%g s%@CC@%$CC%g s%@CPP@%$CPP%g s%@X_CFLAGS@%$X_CFLAGS%g s%@X_PRE_LIBS@%$X_PRE_LIBS%g s%@X_LIBS@%$X_LIBS%g s%@X_EXTRA_LIBS@%$X_EXTRA_LIBS%g s%@x_includes@%$x_includes%g s%@x_libraries@%$x_libraries%g CEOF EOF cat >> $CONFIG_STATUS <<\EOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. ac_file=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_cmds # Line after last line for current file. ac_more_lines=: ac_sed_cmds="" while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file else sed "${ac_end}q" conftest.subs > conftest.s$ac_file fi if test ! -s conftest.s$ac_file; then ac_more_lines=false rm -f conftest.s$ac_file else if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f conftest.s$ac_file" else ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" fi ac_file=`expr $ac_file + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_cmds` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` else ac_dir_suffix= ac_dots= fi case "$ac_given_srcdir" in .) srcdir=. if test -z "$ac_dots"; then top_srcdir=. else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; *) # Relative path. srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" top_srcdir="$ac_dots$ac_given_srcdir" ;; esac case "$ac_given_INSTALL" in [/$]*) INSTALL="$ac_given_INSTALL" ;; *) INSTALL="$ac_dots$ac_given_INSTALL" ;; esac echo creating "$ac_file" rm -f "$ac_file" configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." case "$ac_file" in *Makefile*) ac_comsub="1i\\ # $configure_input" ;; *) ac_comsub= ;; esac ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g s%@INSTALL@%$INSTALL%g " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file fi; done rm -f conftest.s* # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' ac_dC='\3' ac_dD='%g' # ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='\([ ]\)%\1#\2define\3' ac_uC=' ' ac_uD='\4%g' # ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_eB='$%\1#\2define\3' ac_eC=' ' ac_eD='%g' if test "${CONFIG_HEADERS+set}" != set; then EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF fi for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac echo creating $ac_file rm -f conftest.frag conftest.in conftest.out ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` cat $ac_file_inputs > conftest.in EOF # Transform confdefs.h into a sed script conftest.vals that substitutes # the proper values into config.h.in to produce config.h. And first: # Protect against being on the right side of a sed subst in config.status. # Protect against being in an unquoted here document in config.status. rm -f conftest.vals cat > conftest.hdr <<\EOF s/[\\&%]/\\&/g s%[\\$`]%\\&%g s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp s%ac_d%ac_u%gp s%ac_u%ac_e%gp EOF sed -n -f conftest.hdr confdefs.h > conftest.vals rm -f conftest.hdr # This sed command replaces #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >> conftest.vals <<\EOF s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% EOF # Break up conftest.vals because some shells have a limit on # the size of here documents, and old seds have small limits too. rm -f conftest.tail while : do ac_lines=`grep -c . conftest.vals` # grep -c gives empty output for an empty file on some AIX systems. if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi # Write a limited-size here document to conftest.frag. echo ' cat > conftest.frag <> $CONFIG_STATUS sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS echo 'CEOF sed -f conftest.frag conftest.in > conftest.out rm -f conftest.in mv conftest.out conftest.in ' >> $CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail rm -f conftest.vals mv conftest.tail conftest.vals done rm -f conftest.vals cat >> $CONFIG_STATUS <<\EOF rm -f conftest.frag conftest.h echo "/* $ac_file. Generated automatically by configure. */" > conftest.h cat conftest.in >> conftest.h rm -f conftest.in if cmp -s $ac_file conftest.h 2>/dev/null; then echo "$ac_file is unchanged" rm -f conftest.h else # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" fi rm -f $ac_file mv conftest.h $ac_file fi fi; done EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h exit 0 EOF chmod +x $CONFIG_STATUS rm -fr confdefs* $ac_clean_files test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 wayv-0.3/configure.in0000644000175000017500000000161407432563455013324 0ustar nicknickdnl Process this file with autoconf to produce a configure script. AC_INIT(src/defines.h) AM_INIT_AUTOMAKE(wayv, `cat VERSION`) AM_CONFIG_HEADER(config.h) dnl Checks for programs. AC_PROG_CC AC_PROG_INSTALL dnl Checks for header files. AC_PATH_XTRA AC_HEADER_STDC AC_HEADER_SYS_WAIT AC_CHECK_HEADERS(sys/time.h unistd.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_HEADER_TIME dnl Checks for libraries. AC_CHECK_LIB(X11, XOpenDisplay, X_LIBS="$X_LIBS -lX11", AC_MSG_ERROR([Cannot find X11 library]), $X_LIBS) AC_CHECK_LIB(Xext, XQueryExtension, AC_DEFINE(HAVE_X_EXTENSION), , $X_LIBS) AC_CHECK_LIB(Xtst, XTestFakeKeyEvent, AC_DEFINE(HAVE_X_TEST) X_LIBS="$X_LIBS -lXtst", , $X_LIBS) dnl Checks for library functions. AC_TYPE_SIGNAL AC_CHECK_FUNCS(gettimeofday strdup) AC_SUBST(x_includes) AC_SUBST(x_libraries) AC_SUBST(datadir) AC_OUTPUT(src/Makefile doc/Makefile Makefile) wayv-0.3/install-sh0000755000175000017500000001272007432563455013017 0ustar nicknick#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # 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 M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 wayv-0.3/missing0000755000175000017500000001420207432563455012407 0ustar nicknick#! /bin/sh # Common stub for a few missing GNU programs while installing. # Copyright (C) 1996, 1997 Free Software Foundation, Inc. # Franc,ois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing - GNU libit 0.0" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acinclude.m4' or \`configure.in'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`configure.in'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acconfig.h' or \`configure.in'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER([^):]*:\([^)]*\)).*/\1/p' configure.in` if test -z "$files"; then files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^):]*\)).*/\1/p' configure.in` test -z "$files" || files="$files.in" else files=`echo "$files" | sed -e 's/:/ /g'` fi test -z "$files" && files="config.h.in" touch $files ;; automake) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print \ | sed 's/^\(.*\).am$/touch \1.in/' \ | sh ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequirements for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 wayv-0.3/mkinstalldirs0000755000175000017500000000134207432563455013617 0ustar nicknick#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.1.1.1 2001/02/12 12:22:21 stressbunny Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" 1>&2 mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here wayv-0.3/doc/0000755000175000017500000000000010360521037011536 5ustar nicknickwayv-0.3/doc/overview.txt0000644000175000017500000001243607716663035014173 0ustar nicknickOverview: 2 Dimensional Gesture Based Extension to the Standard User Interface ============================================================================== Author: Mike Bennett (smoog dot stressbunny at com) Last Update: 14/08/2003 Contents -------- - Abstract - Objectives - Background - Basic Infrastructure - Resources Needed - Future Possibilities Abstract -------- A user is able to setup wayV to recognize gestures and associate actions with these gestures. When one of the gestures is inputed and matched an action associated with the gesture occurs, e.g. startup a program, send keypress', etc. The gestures are created via a 2 dimensional input device, in most cases the standard mouse. The gestures should be unique symbolic representations of the actions they represent, i.e. draw an N and Netscape starts, draw a circle and Opera starts, draw an > and the keypress' to switch desktops occurs, etc. Objectives ---------- 1. develop an extension to the standard user interface paradigm which unfortunately has remained nearly static since the time of Xerox Parc in the 70's 2. explore concepts in human computer interaction, especially with regards to the way users interact with menus and desktop based shortcut icons (which are too often hidden) 3. develop an easier and faster way of executing certain programs, i.e. when a user interacts with a computer they usually repeatedly run the same programs - always having to navigate through the same various menus and sub-menus Background ---------- When using a standard desktop, we'll use Windows 98 as the example, a user can have desktop icons which function as shortcuts to execute programs. These shortcut icons are often used to represent programs which are required regularly. A major failing of this concept is the simple fact that the icons tend to be hidden when programs are running on the desktop, effectively rendering the shortcuts useless. We are then left with the "Start" button - which while an adequate solution fails for a few reasons: - it has various menus and sub-menus which aren't easy to rapidly navigate or find things in - when using the mouse the user is forced to break their "flow" and go to a very specific part of the screen - when using the keyboard the user is often forced to press the arrow keys way too many times and then confirm their choice Basic Infrastructure -------------------- Consist of 1 program and 2 configuration files. The program (wayv) runs, usually in the background, watching for certain X events. Once the appropriate events are received a transparent window is overlaid (depends on your wayV configuration) on the desktop. The end user then makes a gesture with the mouse resulting in a pattern appearing on the screen. The pattern is then copied into memory, broken into a grid and the resulting grid is sent to the pattern matching system to check does it have a match. If it matches then the suitable actions are carried out. This program is written in C and links with various X libraries. The first configuration file, wayv.conf, stores: 1. the X event(s) which activate the gesture capture 2. the type of input displays and user feedback 3. the relationship between patterns and actions 4. the patterns to recognize 5. the actions and how they're to be carried out 6. miscellaneous as of yet unknowns The second configuration file, DEFAULT.wkey, stores: 1. first column is the keycodes 2. second column is an alias for the keycode 3. optional third column is an alias for the keycode when Shift is pressed Resources Needed ---------------- Hardware - Computer running Unix with a functional X server - Functional mouse (pointer) that is recognized by the X server Software - Running X server - X window manager (CDE is sufficient) - X libraries with development headers - gcc, make, etc (if compiling from code) Future Possibilities -------------------- An idea like this has a lot of potential in terms of further development. Some of the interesting possibilities are: - use a webcam instead of a mouse to do the gesture capture - experiment with ways of gesture capture in 3D space - capture gestures as more than merely paths through space, i.e. develop techniques to capture small symbolic movements - develop possible fuzzy scaling/representations of gestures - examine what types of gestures are "good", i.e. easy to remember and reproduce (actually this is one of the areas I'm REALLY interested in, i.e. people's different cognitive models and how to design user interfaces that work with them) - build on the concept of "flow" and non-intrusive command interfaces - examine implications of speed, direction and time in gesture creation - invent and explore techniques for end user feedback that reduce the need to remember various gestures and the associated actions - find out whether having commonly defined "dictionary" of gestures is better than letting/encouraging each person develop their own (obviously language and cultural factors need to be considered) - examine the possibilities for use in non-graphical human computer interaction - develop further ways of recognizing gestures (evolutionary computing could be really interesting for that) - less research but still handy would be a Mac and Windows version. I've a fair few friends who'd loved to use it but aren't Unix heads wayv-0.3/doc/HOWTO-wayv-config0000644000175000017500000001740307716663375014644 0ustar nicknickConfiguring wayV version 0.3 ============================ Author: Mike Bennett (smoog at stressbunny dot com) Last Update: 14/08/2003 IMPORTANT NOTES: - This HOWTO primarily focuses on the "wayv.conf" configuration file. - See HOWTO-wayv-keymap for the second optional file. - All the configuration files can be edited with a text editor. Contents -------- - The Main Program "wayv" - Different Gesture Matching Techniques - Configuring Gestures & Actions - Activating Gesture Capture & Processing (was Mouse Activation) - Controlling The Display - User Feedback - More Information The Main Program "wayv" ----------------------- wayV consists of 3 files. The first is called "wayv" - this is the program that does all the gesture matching, enables drawing the gestures on screen, turns X & Y coordinates into gestures, etc. Its easy to use - just type "wayv" and if the configuration file "wayv.conf" is in the default (usually /usr/local/share) directory it'll start. On the other hand if the configuration file isn't found you'll have to specific where it is on the command line, e.g. "wayv /path/to/the/configuration/file/name.file" There is a second configuration file, the keymap, usually referenced by wayv.conf but not always used. It is searched for in the same directory as wayv.conf and is normally called DEFAULT.wkey (see HOWTO-wayv-keymap). Different Gesture Matching Techniques ------------------------------------- wayV has two different techniques for matching gestures, overtime this will expand. The key to set is Think, of which there are two possible options: 1. Pda It works well and can recognize over 40 different gestures. It doesn't take into consideration the direction the gesture is drawn in. Note this will always find a matching gesture - even if its very baldy wrong. 2. Pda & Vector Like Pda above except it takes direction into consideration. It works at the moment but further work is required. The direction is recorded in the Gesture sub-key vector, which is comma delimited and set-able to N, NE, E, SE, S, SW, W and NW Configuring Gestures & Actions ------------------------------ The main, and required, configuration file is called "wayv.conf". When you read the words "configuration file" from here on presume its wayv.conf. In wayv.conf you'll primarily be interested in the Action sub-sections. Every gesture has an action associated with it - to find out what action is associated with what gesture have a look at a Gesture section - they start with the text "Gesture {" and end with the text "}", e.g. Gesture { name = "A"; description = "A"; shape = 0, 0, 0, 0, 1, 0, 0, 0 , 0, 0, 0, 1, 1, 1, 0, 0 , 0, 0, 0, 1, 0, 1, 0, 0 , 0, 0, 1, 0, 0, 1, 0, 0 , 0, 1, 0, 0, 0, 0, 1, 0 , 0, 1, 0, 0, 0, 0, 1, 0 , 1, 1, 0, 0, 0, 0, 1, 1 , 1, 0, 0, 0, 0, 0, 0, 1 ; vector = NE, SE; action = "Action A"; } Every Gesture section has a sub-key called "action =", the text between the quotes (after the equal) is the Action section associated with the gesture. The vector sub-key is a new addition in 0.2. Every action section starts with "Action {" and ends with "}", e.g. Action { name = "Action A"; process = exec "netscape", wait "1", sendkey "l s Return"; match = ""; } The action sub-key "name =" is how a gesture is matched with an action. When Gesture.action = Action.name the action sub-key "process =" is used to carry out commands. The action sub-key "process =" can compose of five different commands: 1. exec "COMMAND TO EXECUTE GOES HERE" Starts a program 2. warp Jumps the mouse back to the initial start position of a gesture 3. delay "INTEGER OF SECONDS TO WAIT" Wait so many seconds (useful when combined with sendkey) 4. kill Kill the last command executed by wayV, this is handy for canceling mismatched actions 5. sendkey "SPACE DELIMITED ALIAS(ES) FROM KEYMAP FILE" Send a keypress to the active application or window manager. Its the same as a key been pressed on the keyboard. An example of a composite keypress is: sendkey "Control_L+c c" (see HOWTO-wayv-keymap for more information) and there can be multiple commands each separated by a comma, e.g. process = warp, exec "xcalc", sendkey "o n e"; Activating Gesture Capture & Processing (was Mouse Activation) -------------------------------------------------------------- When using wayV you need to press specific key and mouse button combinations to activate gesture capture. Once a gesture is captured its checked to see if there are any associated actions. The key in the configuration file to setup what activates the gesture capture is the "Launch =" key. It can have multiple parameters each separated by a ",". The parameters are: Mx (where x is any number greater than 0) = Which mouse button must be held down when drawing a gesture SHIFT = Shift Key LOCK = Caps Lock On/Off CONTROL = Control Key MOD1, MOD2, MOD3, MOD4, MOD5 = Other keys which can be assigned with the Unix command 'xmodmap'. An example of the setup wayV requires to begin gesture capture when mouse button 1 is held down is: Launch = "M1"; Another example to begin gesture capture when the Shift key and mouse button 2 is held down is: Launch = "M2,SHIFT"; A final example for when the Shift key, the Control Key and mouse button 3 is held down is: Launch = "M3,SHIFT,CONTROL"; Note: There CAN only be one mouse button used as part of activation, i.e. you cannot hold down multiple mouse buttons but multiple keys pressed at once can be setup and used. Controlling The Display ----------------------- The display has been considerably improved and rewritten for version 0.2. The structure that has to contain the keys for the display is called Pretty. We'll go through each key in it in turn, note that some of the keys do interact with each other and change the overall result: 1. display This is the main key - controls what type of gesture input window, if any, appears. When a gesture input window appears the path followed by the pointer through it should be shown. Can be set to: - yes full screen input window that pops up on gesture activation - no no input window but the gestures are still capture on gesture activation - X, Y, WIDTH, HEIGHT always on screen input window X = Upper left hand corner the input window starts on Y = Upper left hand corner the input window starts on WIDTH = width of the input window HEIGHT = height of the input window 2. managed Turns on or off whether the window manager attempts to control the input window. This is only relevant for input windows that has the X, Y, WIDTH, HEIGHT set. - yes input window is exactly like all the other applications on your desktop - no the input window cannot be moved or managed. This is handy for PDAs (personal digital assistants) 3. color Not yet usable 4. size If an input window is used this controls the width of the lines drawn by the gesture path. 5. feedback A very handy feature which I think is quite handy. If its on a text box appears in the middle of the screen after a gesture is inputted. The text box tells the user what Action is matched with the inputed gesture. - yes Especially handy if used in combination with a gesture for the kill command (see above in "Configuration Gestures & Actions") - no no user feedback box 6. wait Length of time the user feedback, if its on, appears on the screen. More Information ---------------- Righto that should be enough to get people started. Have a look at the wayV website (http://www.stressbunny.com/wayv) for more information - and at the mailing lists for help. wayv-0.3/doc/trained-gestures.jpg0000644000175000017500000005313107432563455015550 0ustar nicknickÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÀ ôôÿÄÿÄM !1A"7Q2Vu„³Ó#a‘“•´Ò8BUq¤±²FRWÃÔ$%Cb&3'ScÿÚ?¿¢ñÜnÖÛ=;j.— Zý’ªfÄÒì€\@Î8üÅ»}}%Ί:ʸ*é¤ÎÉ =ŽÁ áÂý Òˆ²ç¨Ö~ŸŠ´õ³zo‰áú+ìlÛœîsç³æ±ÿÒ;Hvß?aÞ­êÖ™Ö×i-´&ª–³føá¬kXf;¶ms rGŒ€q¼DDS Ï^´]¦âú8Ÿ]rÙ騢k£‚žæî휷- Œ¹ÿÒ;Hvß?aÞªú/=}u=²ÝS_W'‡MKæ•ø'k qÀäð ÆIÖ^ŸÇOv¢Œ‰Y½»i¦qqo¬2Ó–ž0{O®ËÕ-¯e úU?‘ÊÉ!Þâ@ i‘­q$a£“î[DY½e®,Ú×uÞGŸû!§„K)ã;A `’Ip; ö‡­š’åG]L®µ”²d²x&’F;ƒ‡0pA¡~ÿý_ÿI¯Ÿ®o¸T}-w­¾éÊK•ÂÓ5¦ª}ûè§Îø°÷4g-iä{ë°¿8)â¦ŒÇ QÆÒ÷<¶6†‚ç8¹ÇÌ’I>d“æ¼÷{”Vk5uÒ¡’>8Q#c¸µ.8É8ð¥ŸÒ;Hvß?aÞ®ÿã·§Ÿ8ÉT}Ú~;zyó‡ü•GÝ­…’÷nÔVˆ.¶ªH¢Ÿw‡.Ç3vמ‚9  ¸úŸSÚôŽk½ÚqÛw¥5M%”RLÖÔ4€KšcÎr0{d`d9\þ©êm‹§÷˜ëjÙëh¦§§ƒ{D’¹íÙ–´\^Òìg•øôj iúMadÑI‹%xkÚZK]3ÜÓƒäA0Aó[¤Yýwì÷RýUöNYþ‰{!±}cø‰3®úJmE¢Ùq£†7ÕÚú‡HZE9iñCGb}V;žpÃŽN£¦—úíQÓËMÞäæ:²vHÙ^Æí,‘ÌÝŽÀÐN02N-Z")Wý¡ôÇéSö´ê¾ˆŠ×J7Y5N“×ÀùÙGQ3°ÊÖ´˜ßâÆÑÆAwåryhàyê.uÑvºŠŠ ƒîlfb¥e<±™]ä7=€4y“îÎ8ŸÐKu›¸ß©Û(uC²e‰ –ËÏ­—9ò“ÈÚG&´ˆˆˆˆ‹ Õq×zVš×lž–â­eCRç5¥¡iµ®9ˇ—½e+º'©.TrRWõ6ëYK&àž$c°AiŸúKô_Hék£.PÇW]WÚø]#^!pÏ-kZÐO åÀà´‚ “UôNß* Už¢K$ï~é~,.Éq8a ´äŽÎ ¸ ó\Ê{W\t·¡²ž¾‡PS³~èd™¯ïÿöI(ŽC˲0ã¸<`Emã®ÕTrAšµÑÈîÕË {0Aà>g7žÜƒÁ÷ò©ÚZšùI§) Ô•°VÝÛ¿Ò'€aËÜ[µ½šZ;˰¹÷Ûgá­=sµxÞ¦ÒKMâíݳ{ wc#8Îq°šw¡ú>ÏCFÛ• .·^ú¹ Œl§qssò̃qÏu»¶X­_ðUª†ƒÅljè´ì‹~3Œí8ÉýetRõÓM¨*EMÇOÒ:}ï{¤‡t‘Î9qyŒ´¼“æì÷>ò¹_‰.ž|Þÿ;Q÷‹Ùjé>‡²ÝiîT&GUNýñ9óË k¼Ž×¸ŒŽãŽä¶ˆ¹z–Ý=ãK]í”γÖQMO¤$49ì- Ç>â¹};Ó•šKB[luòC%U/‹½Ð8–Ò½ã€{8y-B"/ÖÕC|µÔ[nTÌ©¢¨nÉbxáÃýA‚…<¹ôCWø^O]mÙÞ‹R]âgÏŠÛXîsž1øQ|ô]-dsÍ-Ö²6‚ Ô41ùä±wø#·»…R‚iiã§§‰‘C#Ž6†µ8%ú"æjKl×-wµÓ¹š²ŠjxÝ!!¡Ïah'ñ“î+—ÓÍ7W¤t-¶Ç_,ÔÒø»ß%‡t¯xÁ ÎK©©-³^4µÞ×Næ6jÊ)©ãt„†‡=… œÆO¸®_O4Ý^‘жÛ|°KSKâï|–Ò½ã€{8y-:"(ÏVëiäê—NhüÔÁ^ÉäfªÇÏiÏnLoý_œ+2"/ÆÓm¼S¶žéo¥®¯ÞØê¡l­ÁÀŒà‘ŸÎW/â&ù©cýÝò­"""""""""""""""""""""""""""/¶›l×8®rÛé$¸BÝ‘U:™XÞxkñ=gp™÷¯b""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""üçžZy**%dPÄÂù$‘Á­c@É$žÍpþ=èÿv?Þ0ÿ2Ð"""".^ ÔV/juÊõ\Ê:Pá{q.=ƒZ.=Î<{¹š¨šKTV;=î ê†1 Úèžþ õZð °IÆqç…§EÓýJÓú£VWiëC稚Ž'Jꦵ¾®kNÇg.åàg8$0N½#U×T[4}î¾’O¦–‚y¡~ÚöÆâÓƒÁäëÒëÝÇQôæÓvºÔzEtþ7‰.ƳvÙžÑÃ@†ŽÁkÑI:Õ«µ>™©Ó´úf²Hg¸:xÝtì•Ò¸ƒkŽrò0;åt:aÕŠMmN(.’RR_÷¿m4Aá³FÐænÈÎ »‰õ »v¥¢éïëC«>Šý´ªÀ‹—¨¯ô:_OÖ^®Nx¤¥`sü6îs‰!­hòâ8ò@å|êz‰Õë̳\l”×_Á•½ôÍ‚ÔÉØÆn8`“Âõ¶üœþe¤¦ëºÒòRüvÒòØ£uS)ßÜç4;vâLn~ÝÄÆyÈõv¬ZcSÚõu޽¦q-<™kšx|OØñäá‘Çç'°Š1ð®§f޵[ËñS5ÃÆc6žXÈÞsÛƒ#?_æ+—jè-Šó¡èn”õ×]+-±ÔFÙ&`€LøÃ€8Œ»fãï' IÐGYqÒõzzåí®±J >3HscqvÖ;qÎæ–½¸À¡ƒÈªº"åê+ý—Óõ—«“ž))Xÿ »œâHkZ¼¸Î<9QÚN«õ/Q‰ë´æŠ€ÛNš7M ²nk8pl›˜Ù¸5£w– \¸þZ¦Ïtš—QišPøÙƒLÖËK+pAvòþ6žÛFr}ú¿Æþ¯ÿ¤×Ï×7Ü/e§ªZ¦ãy¡¢¨é•⎊ˆâ’¦C.ØZç^sç¸íÜ*šäjºê‹f½×ÒIáÔÒÐO4/À;^ØÜZpx<Ý|ñÓ;n¯ê(ºüƒ|·ú…ÿÏ4»÷ïÿý[Œlüý֒НWtÛªök-ëQܯ6[»Ùe”øŽvæ4~P…²9¥ÁŽù%¤ç!ªôˆˆ£½z¨¹W3LiJc‰—ºÒǹîsAs]XŽìÝ&â0ykHíÏN« Z{|ÑA]K4{wUETL’à`îg'“µ£‘Æ ©Ó¾šCÓʛ˩®o¬‚àèÌl’ÇDÖà‡?¾Û·QŽƒÍSv¸ëMHêOšépk£ v׿Iß"p%g8ÏøâΊ+Óø&¿õãZßêb¥"Ü÷Q0m;šíÞÜçÃ…áÇ#åp0H¤QËíDS|(´ÌqËÝ µñÈÖ¸ÇxuýÇiÁò ù«/Ÿþ_ð·Öÿì¯ÚËWÖŠí-a¢³Û-¶ûx§§lí|Nqƒ` sÃÞþ6ã†nãäuý:éÕçOj;¦§Ô÷xëï5Ì0þAÅÌØK\I.kNrÖ€Ðhy´´EÓßÖ‡V}ûiUH>ÞÏ(>•ì¥UôEŸ×~Ïu/ÑU_dåóNzoøÃ·_< ‡¡×Px& ìݛĹk±Ëyc}aœ ú§Œwú;Ó-®mÕu7JšçVÐÕ7Ä¥‰á‘ºnã·>±l€íp . úuyëèiîvêš ¸üJj¨Ÿ ¬É˜àC†G#‚TRè=KÒË¥NªÐõr>ÌǶjŠ÷8µƒvDŒí$MúÙÜÐìÿd½Wt&«‡YèúË bw³eTlÇäæoÉ g Î×4žëHˆŠ?¨­“ú*OöÕ+"†ê½+«´/P+µ®Š eš½Ž54¢7Jæ¹å»Áfíî~  €ÑÏçUqën³´AMš =L­ÝU Í,ÌØ;ƒä25¹äínâO¢ú!§ô¥Â–éSQ5ÒåO’ÇLƲ¿9kÛ$8ÙqäqŽTz]qŽå.±Ñn­Žï$Î}Lole­ðÈt‘ívヹ£sžd8ó·Óž®Qt“Oßè™m¿1匉 œÝîxÚAðËÁçrsŒvU4Yýwì÷RýUöNSžõHÛ4-›O×^सÇãïdítlne‘ã2°e¤k¹Ç~ãÞù×cýãó.¥ºím¼Sº¢×p¥®¯Øé)fl­À8%¤ŒàƒÎ±ƒ¤Ðúô¨ûZ…ßëo²ïÕÿˆh4'³Ý5ôU/Ù5Oõõ¡ÒEIþÚ¥`E êÿ´>˜ý*~ÖWÔã«8:ÞÊÊ«lP‹å0½Þ©ž>sìàdœ‚ì€F=Pçœé¿SnÔ·öè}oâºFöÓSTJsœŽ&y¬\69 ïÈ99Éõü}žWý+'ÙD«è¾}µê™zYÕ L5ž®uúäé#®äµ±‡Èàö€bfnå¾â}Ur³_-z†ÞË…¢¾ ÊW`o…Àí$µÃ»\iÁä/Þá_Il¢’²º® Jhñ¾iä cr@qàd?J‹t­ókn¬j=vú(Ù@èôÎ’"×Ö°·¸3øñ8áÊä‹çÿ„×ü-õ¿û*áb¶~ÓÖËWãz$TÞ.Ý»ö07v2qœg+ ˆŠ _©é4GÂFïp½1ôöúú&Eé.cðÖøQðÖ´—ñqæO>© ëñUAE<±Í¬ŽHÜ×´Œ‚à‚<Ô V×EÕî«Û´­¶çTý;HÂú©)؈ÝÅò4ö ‘µîàÐC½o Qç<ÕSÉOQ%†VIkÚF ðAJðeÿŠ~©ÿyyu]–nŽu2ß«m¾#ìUõÓÅh‰®9’7kÁ.Œ9g ìÉú ‚ºžçn¦¯¤“Ħª‰“Dü¹Ž´àò8!zp4εÓÚÄU~¸z_¢ìñ¿#${wgoËhÎvžÞåׯ¡§¹Ûªh*ãñ)ª¢|2³$ncŽ Rƒ³Êÿ¥dû(•}PÿZ'ôTŸíªVDDE4êFíºêèÛ¬W -·ÆG+ÛdŽV·w.oªKùhÜ]Ù aRÑ~sÁ U<”õ2Xead‘ÈÐæ½¤`‚䲓èK¥Cg¨ÓtŒ{Y° búvã$òØËA<÷Æ{{‚ñ~$ºyó{üíGÞ-FœÒöm%o’‚ÇGè”ÒJfsãîU4RN´h Ž ŽSiïðÅ­˜tp¹ÂYX×niŒƒòØíÄ2íÇ! ô:§î:§ïeÒžJiêëe¨l±Ì’6á¬Ãšà$ÆOø|Õ->ócµê{í÷z+)]“²fƒ´FæžípáÃg‚¦“ü4lÓÉ,uwˆ÷¹ÍŠ:ˆËX ù#tdàvä“ï%~ÑÇHy_?oÝ*^ŸÓ¶/jm¶ËBÊ:Pã!cIq.=ËœI.=†I<;ºˆ£oÒ×-WyÑôTTµO§|óEQS 3¥m3^èF÷ã€Éä’yV4DEÃÕFˬ-¡¼Q²Q±ÍŠ`Ð%€œÑ¿iË[ùŽ0A)çôqÒÞWÏÛÃ÷Kw£t=›BÚä¡´Fóâ¿|Õée<ãq pOrIÒ""†üí³Ef¿]èü Šˆ©ØÐNàèÚ\âxÆ1+qÏ‘íçRÖºfŸWi:ûDÐA,ÒDçRºlá§cò9'œwŽA â~uµ]6|3H-|°À6±…¬Ž;úÏqçßî«""Ž?¢:[Íβî*¬”õ՛Ѩ)]XÒç³Ô• †‡8àönjššy)ê:§yšXY$r2W5í#gÁq…¾Ðú6‡Bé¸íR>b^e¨ü¥ ìvhÃ@vg'$éGõõ¡ÒEIþÚ¥`DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEœ¬ÑvÚíwoÕòÍT.æž(ÚöøE¤H2FÜçòŽìGaúthˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‹Çw¹Ef³W]*#á£õ60 ‹XÒãŒ3ï É¥õ­Ó”—Ê玖«~ÆÎÐׯ,9‘ݧÍuÑfèõ­º·]\t„PU‹8¨–G1¾šDdÙÏåÜÇôésí—ÛEëÅüu¡¯ð±âz-C%Ùœã;IÆpQ]DDDDDX 'Ö-)«n·Á<ô5^¨‰·È¼rã¬!ÄdW‚sÀ88ߢšÕõŠ„õ—HÚ-W‡VúTùðÛ¹£¼3×.ÎÑêdU)æ£\j ^¶Òhéè¨Yh«ˆÍû\f{.q9Àü£Þ[ØTe„é>µ¸ë½+St¹ÁK ñV¾­¦kšÒÐÆ8çåÇÏÜ·h‹!{êŽÓ—‰í7[Ç£×A·Ä‹Ñf~Ý͵„v ÷\ïÇoO>pÿ’¨ûµúÁÖ]SQê(ÚùÖ-4Ìh$ã—9€4~r@k·ñïGüë±þñ‡ù—RÝv¶Þ)ÝQk¸R×@×ìt”³6V‡`ÒFpAÇç Øˆˆˆˆˆˆˆˆˆˆˆˆ‹?®ýžê_¢ª¾ÉË?Ñ/d6/¬" "ŒôÎ*›¯Zµõ|”’º€3Ã,2ÎF1µ´í¹ÎIÏ{2/ŸtãféW\åÓ­‘‘Xoiˆ9…äµÛüÒ œ d&<¸ò2â;ô"ùûRV×õ§¨0iëLOnš´NM][&õdÚéa$† 9q<Þkë©í–êšú¹<:jXŸ4¯Á;XÐKŽ'€WOê+N¨µ6åe®ee)qŒ½ ´‡áÍ žÇ=ˆ]DEÀÖÂ×¢,…®¾;¡2¶㛟#È'$Ã\y#·¿ôí(¯6j¥;$d52¢6ÈpkÚ3‚Fp}å{—¬},v¬§Žó`¢×æ=¬™¢FÇé1cç‚öú¸$TÎ@u¡—ûÏÅíMBËMßy‰ŽÍŽICˆ1»˜ßØIÜA4ðú‰Õ*KYéü•ÒÜ%« ’¶Ž@Á(hÎØžvç—?-0òZâU§]:¡éí®¦*¤¬¬«xuMK›°87;Öd†€|É$žq€6h¡Ýaü5¦z§µÕ+磣§Ìca! Hàæ½ÛKXÙ¶´÷Îp2÷\úû§&ÑRTPÉWöxÈé[óK1k¶½Îp s€Ê%_D\zÝ'¦îU’VWéûU]T˜ß5Er=Ø ¸‚Nô/?ÄMóRÇûºå^;L´MÒ™°Ti›s×ïš/GvpGÊi#žÙÇopQ.¤ií!Oy¤ÒNÇW~©w¯<5²Kàâ x2ê’âü7Ÿ<¶ã 4}>‡ÒtÖ˜°éÎ&«<¸I9h-ÈoªàpyÉ:„DDDDDDDDDDDDYýwì÷RýUöNYþ‰{!±}cø‰yëë©í–êšú¹<:jXŸ4¯Á;XÐKŽ'€T‡àíIâéûõòy皺ºááNé_»vƇdò\LÎÉ$çÏ›2)‡\t{õ6m}7€Ú«?‹TçÌ÷ÈÉ‘­\KŒã·qÎ{,Õ“k-Iq¬š9n=ôõe‘–§ƒŽÙ,,qÛÆ\qŽÃf§bÖshý} Ѷãqq¥ˆøÅ‰¥§|¬’[ÀcÍ'Ü~“èwè}È*â·jÇøõ„»iìØ÷Èk|²Fç?n'‚ªy)ê"d°ÊÂÉ#‘¡Í{HÁ#ÉDz6.ÚS¨:@U>9(é˜úÆ»`.ÌMkÆ À|na-$ã±Ý›’"ùîáUøïê-<îÒ¶|øó=˜i9q?%Íñ65€gpv¬Ј¸úTY´•¾:ûåg¢SI(…¯ðžü¼‚@ÃA=šRù«W:ÿÕëµËTYìsþ ¶DÊXZÆ9òÊž¯Ò 5òÊàçM+@p!ÀSkÆ·'¹ËSD_œðCUO%=DL–XY$r49¯i ƒÁy.<3KSTEQO¦¬ðÏÃã–:šæ8‚nAO>>Ï+þ•“ì¢UôDE)êPn”wxtN“¤ô»å|E²ÈÇúÔáíp»\ $×ÜâZä_K:YC£ít—+•nÔ®k̲™àÐãÇsÆr='µWYzce¡¹SIMTÆH÷Ã'`|¯{r<Ž×#±ÁálÑÎÖ‰+º;Õ¹­õÇK¦/u±ÉÌnw„á#ˆ-1—€üž'-+èY熖žJЉY10¾I$pkXÐ2I'€óP-%A7Xú—Wªîôìu‚Öÿššh´ã88%¹Þü¹Ü¸ mw@¢…u+ÂÑ=lÓÇÿO-gäêÜâ÷‘´xR¼´{¢‘˜ÛæÞG¾¹ªu >•Ó7ÝPß;Û#Äy;XÌ€q¹Å£8ã9ª×öºgHè(ëb§Ò\ZÇÎÐNÀ÷jD\{F©³_®7;}¶³ÇªµËàÖ3Â{|'åÃpòÇvÏeØRƒ³Êÿ¥dû(•}w¨]kŸ>˜ÑP¾ñt«§{]Üñ -Ïäü<—¼7qËH 8ï‡Óé_J(ôu%5ÞçN$Ô2BD…Ò M’x‡r{Ó‚sODDDDDDDDDDDDDEã»Ûb¼Ù«­u‘Ö@úyÁ¯iiÆAÁ÷覲£Ñõw}©&‚Ý#jŸ#%™À1³4l•“vÑò·ÈáÜä´ §žZy**%dPÄÂù$‘Á­c@É$žÍ|ôjÖÞ®R·Ðjߦ-l{&s'pcØòÉ9 ,2‘-¶yõrߢQM:Ù£[©ô[îÉuvfKVÇI»ˆ723ƒ€Hh yhJ˜Ï¯uoUm–}iŠFW½ŽuÒ²7:HßYž¾ÓÇüYÄ´`^t^’£ÑZb–ÍFÿÂËæœ°0Í#Ž\âè9!  œehO:Ù§Ý~és¢töç6¹kšÐCÝžàFçœr~ÆK£¬7δÝâ›RÖ× %ª‘´íš"=iZ6‡?9‘ß-îÃÌUº—ÓJ}M¡éh-ûkìñÛ#3Ý€4:"]œå¬'ûMn\ìÅ´ÂõÔmI£4åe=%U‰û‹Á¦iaseÆZFØÚÁÀ¸NWÖŠI×í+=ïHAx¤>{;œ÷ÆÜa~Ðó€ ËKXìäÐò|—c@õRé4à}uÒ:[…<_„\Ysˆk]+yÛ°¼ãË€@Ësœèm=ËYu¾’O–¦àÉ¡~ÜÇIPZpywVdEé%m<}Rê5ŸŠ™ëßN@õprmƒú8éï+çíáû¤þŽ:CûÊùûx~éyëþrJ9AwºÃTHÙ$Æ9XÞFrÐÖ“Æ´=üö^ůÿ«7ÏÕ7ߪ>–´VØ´å%¶ávšíUýõ³ç|¹{œ3—8ðÏeØDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDE莼žY«4¦¥­®’öjœêM|²Hì0ïŒîfÏ œ2\F29·""""’õ_ªSXžÝ9¥§{õ3ê#de)Ä×49­hpÞýÌî »*–¦¾RiÊH5%l·vïô‰àcò÷àmof–ŽÃ²ì""çßntõÎëàøÞ…I-O…»nýŒ.ÛœgÎ ðhMñÃHÐß½Ðý+Äü‡‰âmÛ#™ò°3¹íæ»è‹óžxii䨨•‘C ä’Gµ$’x5Ö}_ÓZnÌùh.T·K„Ì{i¢£‘³µ¯ ;].× ¬Ý´rsÀ88ÏtÊÝ®µ-ê=q¨/•T¶ùžçÓÚAxŠxÜÇ4ì1ƒ--$8»pçXÑBo¨³—Ý4V¡®†¾‰†œ$9 ™›ve§÷î@<{4—Yk¨oò鮡Á¾¾'ÇNچű¡ø;1Ý€êæ ¾±<7‘f‚xj©ã¨§•’Ã+ã’75í# ‚8 5ú"(oXõæ°ÓZÖ–Ù§kß ¶Š§ÄÊXå9—{ýf’k2|€i>õGéæµ‡]éf]#‚Hf‰âž©®`kLÁŒsËç™9÷­Z")ÇRuF¼Òò¾·OXèklR jj&i{ã~çz­‘®Ú´“´É'ã±Óî Ûµý¡õ4Ìôzè1étysüÎxg®ZÐíÁ™ã·bµèˆ°]»ßôþƒ–ï§ë™G=%Dnî¯.‰ÇfÐ× î{—óätšRº¢ç£ì•õrx•5TM3ðçº6—$ö]uϽÞíÚvÑ=ÖëQèôPmñ%ØçíÜàÑÃA'’N:]¬õ.»Õ—뜲ìÒðæ*:w@ÖòàYëràÆ’ñ¼àÈ00F*ë9­tåËSÙ¡¢µê«ì¨l®©¦Üö†¸l;^Ó‚\ì…ƒüPjÿú³|ýS}ú~(5ýY¾~©¾ý?¿þ¬ß?Tß~¸ÓFê=¥ª¯5V¾KááÀ#4Ž8kA3ÿ‰8É 88ÂÝô]—ãÓøë5e]\õÕ¨Õr½ò65­ ×8c ‡æºIÔý/¤ŸwÓÖø+f‚Pj[3ñ]¹økšx;ryÀÉ#‘0Ó=Wꆰô¯À:vÇXivøÜ:=›³·åÎ3®íî]ÿŒ=rù›cý³òã\¾fØÿlßü„øÃ×/™¶?Û7ÿ!hôUרõ×™¢Õöm½´îtrÓH×8˹¸iįãiqíä9÷ïGzÑ¢ªÞú=o§ Ž;µ­Þ=\ ÑÆÝí•ÛŽY³Á.³@[>œkšmy¥â®ÌÜbõ+©bq>òppyÚà7þc$´­z"")Tz³ø, ?£ë=#Qº­°KàÓøÞÿFäºBâÖàcÖÂéô×¥lÒu^ï• ¹j9Þòj2ç¶ ârZ\sÝ“¹ägœ2]KDDYýwì÷RýUöNYþ‰{!±}cø‰SuGiêIŒ7H.u­‹Ä†š‰þ “€ í““9ÁÈ{‡©]_§Š®÷pŽË§j$ŽÚCeiD¹ãsìÈáÛ™‘Â¥XúG¢´ý]m%£Ä­£Ã£¨žwÈKÀÆòÒvnóá ÈtDYa 4þ·¤ð®Ô»j´G[kg`¡ä·—z¤Îqœ dÚ§ ÷ÊX«j'¼é œF6‚g—;cI"9.vÜíxÏ9eÚÍ|µê{.Šø+)]¾´×ípe§gº£ú‡úÐé?¢¤ÿmRÍ[¥¨è·V*mï¥M_eM$‚8ãaxÃËݸŸ=í ‘CŽ2ШˆŠ®t5ϧ·Çk½ù*x²úû{–±‡åÑÞŒ–ÿc›€=Jê]—_ÓÈÚ1%-Â5ÓÑLFàsùlã<Ù#;4E?ëo²ïÕÿˆh4'³Ý5ôU/Ù5h'«z‡ã–¬³ôöÇq˜¶J¯éèñøŒÜÜg.ðÀ{Ü܆Œ œ´í³Xìôz~ÇEh fÊZH„LÈ»Üì ‰É'’Ošè""âj­YiѶss¼M$pøq¶8ËÝ$›\àÁŽ!§’@÷£6ë­º‘º›S )t½3Ëi(Øò€XÃÁÆG¯'‘µ¸Ç©}‚iiã§§‰‘C#Ž6†µ8%ú(¶¸èÅÆ]AUªt]Ñôw)^ùßLftN28;yŽPr ‰iÀõë€I´õåÒÉ5%;Cw»òmfHÌAì->®rZËè* ê{ºš¾’Ošª&MðFæ8ÓƒÈà…èDE1ê‡TF—-Óöúf¦ªÚÆ26xž»ä’ÞwHr6³ó‚xÀwûégM¥©¥¼êf£­$’ÊêRC²!É/v÷op8=¹.¥¢""Ïë¿gº—誯²rÏôKÙ ‹ëÄH¨ A×úíKE¦)¾xíxÝ[ÙÛ<0ãòšÓë´ãçiù@GL©º=Q,m‚¦÷$^‚õ+‹ÀõXâèw¡„»iÆIܮȈˆ‹©ÎŸ}ŽjMM=VʿȼVL"cÏp‰w9Èì¾fÓ·K–ê=]?KUz ™¬hŠ¢'9³4µ ºQ†m ‘ä¸ó8'?X¢êëC¤þŠ“ýµKSÕM5¦©¥¥¤‚k½>%¡|ŽØZìíÿìÐF«¤ãŽ?Fõ·áÛÓUô¾…w±DÊwÂã´É=@v“¸9»C^1€Hí»h§¢"(ÏTzwQn«“¨>o@ºÐchKånxÝŒîiáã>yÛôã\ÓkÍ/v`Žã©]K‰ðŸ“ƒƒÎ׸wó%¥kÑOúÛì†ûõâ#Z ì÷M}KöMYN©õ-úZš+6ŸÖj:×ø1Çl®¥$7ÑŒ’÷onÆ‘ƒß0ïÓ¥=<¨ÒuWkÜÞ‘¨.x}KœCÌ#%Å›ù.q'/9Á wÛ¸ÑÑxî·Z®¢år©e5;wË+Ï êI8 ’Hd¨-Š×Y×=qY{¼Í;4½²_š“ifö“‘ @i‘ÁÅÜ´ Òß  ‚ZxééâdPÄÀÈã¡­c@ÀÉ~ˆ‹—¨4í§TZm½P²²”¸HâZC‡b× OqGŽÄ¨UóFê^Ž_¨4|µw+˜MD2îxak ‘–‡0ç5üž8.±h}sk×vA_@ï¢<6ª‘îËéÞ|½§óÁìANˆ‹‡«´½°ÓUvzøØD¬&\ÍÆ pvÈÞAÈ'¶FFAà•ét¿VK¢5” d¹4²¿ÖŠ7¹Ü=¯8Ä/õ³Çî믡‘ÿ¨ýSµè{l°ÓKeõÇdTAùðŽÝ(-n p]‘Ž2áÅéV‚»AsŸ\jù$–ý\ÃáC;øìzÎãÔyhÚÜli-=ö¶´ˆˆˆ³úïÙî¥ú*«ìœ³ýöCbúÇñ*)Ʊ趖ÔÔú H,•íÚQG Ú Èt@µ®ÎO<;†óƒ”¨Ð½^Ó•Uv-e%Ù‘ÇU9t’[œG6èÚAÏ;³€}ø_¾œëË)î•¶wE¶²ž¡ñè˜çÅnCšðçd9¸»ÝØ“_µ]ho–º{•¶¥•4U ߬<8¨ äpA½ˆ¿9熖žJЉY10¾I$pkXÐ2I'€óQcÖëÝ΂ÃÓY$©¬¨{]él‹—\:/hð^_œ` ^‹Áö…ìmn®ºU×ÝPf´Ó~JA»8sœÝî.ä—e§ÖÀí¸Ô´ö–±éZ7RÙ-QFï–X |˜$Ï9s±¸ã$ã8.Â(þ¡þ´:Oè©?ÛT¬ çî¬Ø] õÝ«¨V¶ÉàMZ×UÛ€ h#œJÑ&î;‰'p ëh¹Ey³PÝ)Ù#!¬•¶@ƒ^Ðáœ3ƒï+؈ˆ¾vÕV»ŸF5ùÕ¶:hå°×;Ã’ˆØÐd.{©Ú-Ãkƒ@¨;°C®ºQZuE©·+-s+)KŒeí¤8wi´ö8 pAìBê)ÿ[}ß~¯üDk‰xê4G´¬´ìŽ[­]¶•´‘K Ž?Î Œ×`sœ¸pFqøtŸ¥£§f§Õ´Ožÿ=G¥@*¤s#!Ïiÿå.%Çvâ0Óê¸bDE›ÖZâÍ¡mq×]äyñ_²x@t²ž3´9$¹Æ«êu·]d£¥†ÒËF˜Ž Mé/†v¹¥Û݃)H`ãÙÂûjµPØítöÛm3)¨©Û²(˜8hÿRIÉ$ä’I'%{BuÏK¯šnøuWMÝ=;—TÐÒ<0³¹ØÞÏŒ–ŒÅƒÎ7WÒþ«Ã®È¶ÕÒI ê*wÔT:(ÃiËD 3/s³‡³9óù•-#©]:£×¶7FÁ5Þ:š±ÑNÝØîÆï î<Ç<¾Uêñl¹Ú5m%ŵ«®Üã3]œµ¯#× sIݹÜ<À –ŠyjéE /P+õ}Ö¾Kµ\Õž’)£Ãi‰qÛÝÇycvµ½ƒq3·m d5ÍÇ\ÐzÄ»5 ˉé^”ðßvc23¾_ïì;yãþ0õËæmöÍÿÈOŒ=rù›cý³ò’í_ÖËÍžº×Q¤,삲 )äts085í-$fr3ƒî+ÓKv—éå¦ÑrkY$t¬c·—ÈçíÏb@pŽV­.õ§,ºŽŸÀ¼ZékXö0Ís£vÇwa8´ƒÀ÷)-ƒ§šç§šâ—âígá /QUŠˆeœ=ñ’ÑâÙÌÉ;9¦Ü¼wjÉ­özêÚzGÖOOO$±ÓGÓ9­$0`’F8¿b¡WWRºÃPÚ{¥¹š~Á @xަÇ4‚F@pñý’ŸV3´ü’¬:cEX40ÚmÐG4qVcižPNNù1“’Çn DE¸hoOê…§Z~Ùø>‘ÔÞ‡àgÄÈ”nß»ÿol“ùø×®F¨Ó”z·NUØëäž:Z­›Ýƒ^6¼<`Gv$ÒúrIiÊK“ÉKK¿c§psÎç—œîãäºè¤ÑÇHy_?oÝ'ôqÒÞWÏÛÃ÷Iýt‡÷•óöðýÒG!ýå|ý¼?t·š/EÛ´-žke²j©¡–¡ÕuKšçn-kp6µ£`òZ5?ëo²ïÕÿˆMz'Óá¨dX__TñGQmÍtŽCpr2XÒµØÌni_E""ãêš›å&œ«ŸMÑA[wnÏG‚s†?/hvNæöiqî;)nèå]ÊèýQÔId«»KQâú žÇÆq<]¹°ÆÐÈ%¢Ôˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¼× K”uÔUÓIðÏ{‚ËOúëÒÓÇOO"†&Gm kpKôDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\}Gª,ÚJß}ò³Ñ)¤”B×øO~^A a žÍ?©{-WZ实åm©eMCwÅ+ê9Ad/b.>£Õm%o޾ùYè”ÒJ!kü'¿/ 0ÐOfŸÔ»ˆ‹Ÿ|¼QéûmÞ½û)i"2¿ìvkr@.' òHk z.¾¼ÕÃO¦êé-p6GGq’Bæ½Ís@a»Zò×îÆãŒy÷T4DXMÕK.…§ð²Ë…ؼ4[â˜5̺Cƒ°m ŒŒ»##¹¢u7Ç #C~ô?Cô¯ò'‰·lŽgÊÀÎvç·šï®¶ÔßôuûÐý3Ñ|?ÈxžíÒ5Ÿ+ÝžÞJiE×›•åò~Г"c ¦ ÜóœÞA ‰Øƒ€'¸np9×øßÕÿôšùúæû„üoêÿúM|ýs}ÂØtç\þ04õE×ðw x5N¦ð¼8cœíoüøÆ<–½LovÒ–+åmªjk­DÔrº$‚lÞÞç´œŽÞ\d`>“êšÖ›£³Wø•1ÄÙe¦–7G$`þb0ì i 9ägNˆ‹/¨ú‰¥t•Á”˧¢TÉ™¬ôy_–@9kHîÓú—’ÝÕ t¨tú’‘k7“RNÜd h'žÙÏqZø'†ªž:ŠyY,2°>9#ps^Ò2#‚ó_¢"ñÝn´6;]EÎçS5;7Ë+û4©$à9$€2JÀÙzë¢nõÕ5VÇ—±Œ5Ѐח|¦ÆK‹@Ïøâ…E_Gs£Ž²‚® ºY3²h$1Ø$8py~…èDDDDDDDDDD\}G¥ìÚ¶ßòÒ飔LÖx¯få¤Î?­C´ÝÊåн_=Q5óéë“Ãâ­Œ8´c­ÉÁF|®Ap Ýô,ÃUOE<¬–X‘¸9¯iÁy¯ÑG~ÓÂÝ m§tщŸrlŒˆ¸ns[Ääæ‚|·z±""ó××SÛ-Õ5õrxtÔ±>i_‚v± —O¨þù×ÍQÿÏmÑvù6ç;¤:bçlm>dú÷«Uª†Çk§¶Ûi™MENÝ‘DÁÃGú’NI'$’I9+؈¦=PêˆÒåº~ÀßLÔÕ[XÆFÏÑ·|’[ÎéFÖ~pOËÑt‚žËÓÝCÕ-ü!©e·ÕTæY ‚™æ'žùÄ’dä¸çomÎÛtKÙ ‹ëÄH¨ Ößd7ß«ÿÐhOgºkèª_²jÐ"|}žWý+'ÙD«è¥=}Ôϲèxí”óøu7i|'¸8ÀÑ™0áÀÉ,i»^áƒÎ>V] UÒ¶Çt§¹[*_MYNýñÊÎí?èA$‚¾­é¿—]i¹…ÀÇøZÞöÅRXÒ­#Ô“À.Ãͤà¡"/žz{¥©º³ª5±Õ~5²ø4ôþ)n†7FZ'cy¶ü÷P+º ªèß6¹è¤pOOW!{0Aà<¹¼ãƒßßÊžFËBzƒI µ¯ªÒwG¼7ĕߓnXóxñ6rw7‚pߢQËýxÖs^µYÓÐ:?Áö—à˜¥/LæÅÀp 2XpwóÎkô¿»h+£ª(<9i'{ ]+Ú1;[»v iœAxÈ#…öEu=ÎÝM_I'‰MU&‰ø#siÁäpBô"""""""""".>§Ó½]cšÑv€KO&×Çg°ù8dóùÈ ‚A‹Xo÷®‰jFéLdªÒõ/.¤¬c ‚y{'>¼|Næç>½ö áª§Ž¢žVK ¬ŽHÜ×´Œ‚à‚<Ô‡¬CU®ºmOQsC-ÉÌ’9×´ËN ðAV$EùÏ<4´òTTJÈ¡‰…òI#ƒZÆ’I<šk-E¨º»x¬Ò:JŽ7Yhêé5¾.&×îsö˜‰õšÐãáî°-ºvÁC¥ôý–Ú׊JV³Ävç8’\çï.$ñÏQc:—¯aÐlV6(ê./1QÓ½àìd½Ã9,oÇ™hÈÝ‘˜éV‚»AsŸ\jù$–ý\ÃáC;øìzÎãÔyhÚÜli-=ö·u®ýžê_¢ª¾ÉË?Ñ/d6/¬" )ÿ[}ß~¯üDkA¡=žé¯¢©~É«@ŠAðqöy_ô¬Ÿe¯¢ù›á<Î×ÚwJó -­{#/;ZçK q°$5 Ÿ=£Ü£(¯ÿ_ø§êŸ÷—иšÎy©t6 ¨§™ð϶¥ñË‹\ÇœAr<åMú)zÒº{¦ô̪ÔVÚjʺ‰j* ©­‰ŽÛ¶H ÆÃϼžÄ*ǽó®ÇûÆæRÞ½jKçCPÓÚïvÚé›s©’¸7”d†’q’:¹"üçžZy**%dPÄÂù$‘Á­c@É$žÍ|!p¯¨¹\ª«êäTÕJù¥~Ð7=Ä—I=—ÛúÙîšú*—ìš´‹ÇYv¶Ûê)iën”ÓÕ¿eN<þr cº*ëyé_P`éýöª:«={ ›ŸP¼Ç4 –‡¼¹‡€ã¸d»·Õÿh}1úTý­:¯¢(/Q5Mç¨:¦£§:RKH×µµóËnÉ~^s¶6¸3¹.nAÕ}¢­"ÌÚ+m¬EówTú³rºÞn:BÜøív¶T:ª¹7x’mql™-ÉgÉ ¸†ÿö,Z.ŸêŽ”tþÝ<4:šzŠª½†¦¢j9ÆòÐ@ h nKˆŸ[’p¿ñÛÓÏœ?äª>í?½<ùÃþJ£îצƒ«ºçq¦ ¤¾x•UR²Yè“·sÜ@hÉfIÖÝDz·¨nš£TSôÃO6%VÇÖÉ/â†dŽÖµ²Ü“À‚RÒ:^‡GéªK=l&4­fÓ<¸¤w$ä‘Û'pî,þ»ö{©~Šªû',ÿD½Ø¾±üDŠ€§ýmöC}ú¿ñ¬fœëÖ—³ikM²¢ßxtôtPÓÈèሴ¹Œ $f@q‘î §ý#t÷móöýêHÝýÛ|ý„?z¿oƒ¼CÓš—ËŒd×)_œÒÛ²6å¾ñ¹®`%ZEòo]-uÔ}M¯¯©¥’:ZæÄúYÉ2&1Ø>ðáÈïÈ=ˆ&d‹ìN’hÚí¢… ÉñšÊš‡UË9—5­Ù»³ˆ #Œ’@ÉÝ¢ÆubÝ5Ó¥·úx^ÊqPL„ãlOlŽì;XqùñÛºøÍsKéêU©­ÖJS¶JÉC œ €eïÁ#;ZqžqÊû3R[f¼ik½®ÌlÕ”SSÆé { A8ŒŸqRŽ…jÚj;N”½VÇGp¡­1SSÕ¹¸‰ÿ© ç=èÿv?Þ0ÿ2|{Ñÿ:ì¼aþdø÷£þuØÿxÃüË@ˆˆˆˆˆ‹p醹ëº}_Pگ¾9 m›I$c {†3‘†ðhÈ99Ù¢áÏ£4µMDµjÏ4ò¼¾Id¡‰Î{‰É$–ä’WçñGüÔ±þî‡ùSâ&ù©cýÝò§ÄMóRÇûºå_¤3KSTEQO¦¬ðÏÃã–:šæ8‚nAw#Dô¯OèK…E}²ZéꦋÁñ*¥k¶3 ZÑÉ ïŸ’1Žs·EϾÛ? ië«Æð}6’Zoní›Ø[»ÆsŒ…àÑ:gâ~‘¡°úg¦z/‰ùÃݺG?ääã±ßÉwÑpõ.°êêx ¾Ûc¬d/ˆ—¹Ža#iŒŒààg°RZ߃U•’:ƒRÏOKLJô‚WŽràöƒÎ²=Ü÷Z‹Bt¥ŠùEu†¦ëQ5­š8ç™›7·–“µ'¿—9œˆŠkzèV‰»ÔxðÓU[^÷¼PÌ^\sò^8 ?áŽWôqÒÞWÏÛÃ÷Kq£ôŸÑž¦—uC· +g t¼†ðßT8Î3’tèŠy«º5¥uSêë–ë¥CÌ®«¦qß´Œº2vNq´’>PÉ'1mÐ}^ÓÔηYµ¸ÛãyzV^æ°Ö€ö  zÄqï=Nžôš²Å©êõV¨®‚¶÷$²I¢#k¤|‡Õn\w8mÆÑ’y$m«""",}梁7QÞ'»]¬Þ‘]>ß_J™›¶´4p×€8p?ñ%ÓÏ›ßçj>ñ?]<ù½þv£ïñ%ÓÏ›ßçj>ñ?]<ù½þv£ïñ%ÓÏ›ßçj>ñPÿÙwayv-0.3/doc/roadmap.txt0000644000175000017500000000440207716663216013743 0ustar nicknickFeatures & Developments Roadmap =============================== Author: Mike Bennett (smoog at stressbunny dot com) Last Update: 14/08/2003 NOTE: This roadmap is obsolete till further notice, i.e. till I figure out the impact of the new development process. Contents -------- - On Going - Phase 1 - Phase 2 - Phase 3 - In the Future On Going -------- These are features and developments in wayV that don't fall into any particular version. They'll be added when I think they'd be an interesting area of further research, really handy or just plain old cool :) - new rules for gesture/pattern matching - new rules for gesture scaling and gridding - new types of actions - various ways of giving user feedback - other types of input devices - development issues (see TODO) Phase 1 ------- Completed Phase 2 ------- - "keyboard button press", "prompt" and "wait" actions will be supported (MOSTLY DONE) - meschach will be phased out and the math functions will be implemented internally (DONE) - webcams will be supported for gesture input (PARTIALLY DONE) - 1 rule will be supported for converting webcam images to gestures - the process will begin for cross platform support, initially porting the backend to Windows for the mouse - user feedback with display prompts (MOSTLY DONE) - scaling translation of orbits to grids - gestures will have context, i.e. different actions for the same shape when drawn over different applications (commonality of UI over diversity of applications) (BEGUN) Phase 3 ------- - the frontend will be ported to Windows - the backend webcam support will be ported to Windows - experimental ways of interpreting gestures, i.e. try and catch more than highest point - look at taking direction into consideration for how the gestures are made, i.e. gesture create from left to right instead of right to left will be recognized as different (STARTED) - develop techniques for catching gestures in a 3 dimensional space In the Future ------------- - ways of getting rid of the mouse and keyboard completely - ability to make gestures with various types of input devices - maybe develop dictionaries of common gestures - commonality of user interface over diversity of applications - time, speed and direction might be used - non-gui environments wayv-0.3/doc/wayv.10000644000175000017500000000241507716663277012640 0ustar nicknick.\" -*- nroff -*- .TH "wayv" "1" "August 2003" "0.3" "X Windows application" .SH "NAME" wayV \- capture drawn shapes (gestures), recognize them and carry out associated actions .SH "SYNOPSIS" .B wayv .I [configuration file] .SH "DESCRIPTION" A user is able to setup wayV to recognize gestures and associate actions with these gestures. When one of the gestures is inputed and matched an action associated with the gesture occurs, e.g. startup a program, send keypress', etc. .PP The gestures are created via a 2 dimensional input device, in most cases the standard mouse. .PP The gestures should be unique symbolic representations of the actions they represent, i.e. draw an N and Netscape starts, draw a circle and Opera starts, draw an > and the keypress' to switch desktops occurs, etc. .SH "FILES" .IP wayv.conf is the required configuration file. It is used to configure the user interface, what gestures are recognized, what actions are performed, etc. .IP DEFAULT.wkey is an optional configuration file. It contains the keymaps for keycode, see HOWTO-wayv-keymap that comes with wayV. .SH "AUTHOR" wayV was written by Mike Bennett (smoog at stressbunny dot com) with contributions from various others. .SH "URL" wayV \- http://www.stressbunny.com/wayv .SH "SEE ALSO" .BR wayv.conf(5) wayv-0.3/doc/Makefile.am0000644000175000017500000000003610251423267013576 0ustar nicknickman_MANS = wayv.1 wayv.conf.5 wayv-0.3/doc/Makefile.in0000644000175000017500000001543510251424172013614 0ustar nicknick# Makefile.in generated automatically by automake 1.4-p6 from Makefile.am # Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include DESTDIR = pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : CC = @CC@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ datadir = @datadir@ x_includes = @x_includes@ x_libraries = @x_libraries@ man_MANS = wayv.1 wayv.conf.5 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = man1dir = $(mandir)/man1 man5dir = $(mandir)/man5 MANS = $(man_MANS) NROFF = nroff DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = tar GZIP_ENV = --best all: all-redirect .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status install-man1: $(mkinstalldirs) $(DESTDIR)$(man1dir) @list='$(man1_MANS)'; \ l2='$(man_MANS)'; for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ done uninstall-man1: @list='$(man1_MANS)'; \ l2='$(man_MANS)'; for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ rm -f $(DESTDIR)$(man1dir)/$$inst; \ done install-man5: $(mkinstalldirs) $(DESTDIR)$(man5dir) @list='$(man5_MANS)'; \ l2='$(man_MANS)'; for i in $$l2; do \ case "$$i" in \ *.5*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man5dir)/$$inst"; \ $(INSTALL_DATA) $$file $(DESTDIR)$(man5dir)/$$inst; \ done uninstall-man5: @list='$(man5_MANS)'; \ l2='$(man_MANS)'; for i in $$l2; do \ case "$$i" in \ *.5*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f $(DESTDIR)$(man5dir)/$$inst"; \ rm -f $(DESTDIR)$(man5dir)/$$inst; \ done install-man: $(MANS) @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-man1 install-man5 uninstall-man: @$(NORMAL_UNINSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-man1 uninstall-man5 tags: TAGS TAGS: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = doc distdir: $(DISTFILES) here=`cd $(top_builddir) && pwd`; \ top_distdir=`cd $(top_distdir) && pwd`; \ distdir=`cd $(distdir) && pwd`; \ cd $(top_srcdir) \ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu doc/Makefile @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done info-am: info: info-am dvi-am: dvi: dvi-am check-am: all-am check: check-am installcheck-am: installcheck: installcheck-am install-exec-am: install-exec: install-exec-am install-data-am: install-man install-data: install-data-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-am uninstall-am: uninstall-man uninstall: uninstall-am all-am: Makefile $(MANS) all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: $(mkinstalldirs) $(DESTDIR)$(mandir)/man1 $(DESTDIR)$(mandir)/man5 mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: mostlyclean-am: mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-generic mostlyclean-am clean: clean-am distclean-am: distclean-generic clean-am distclean: distclean-am maintainer-clean-am: maintainer-clean-generic distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." maintainer-clean: maintainer-clean-am .PHONY: install-man1 uninstall-man1 install-man5 uninstall-man5 \ install-man uninstall-man tags distdir info-am info dvi-am dvi check \ check-am installcheck-am installcheck install-exec-am install-exec \ install-data-am install-data install-am install uninstall-am uninstall \ all-redirect all-am all installdirs mostlyclean-generic \ distclean-generic clean-generic maintainer-clean-generic clean \ mostlyclean distclean maintainer-clean # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: wayv-0.3/doc/wayv.conf.10000644000175000017500000002011510251422606013532 0ustar nicknick.\" -*- nroff -*- .TH "wayv.conf" "1" "August 2003" "0.3" "X Windows application" .SH DESCRIPTION wayv.conf \- configuration file for wayV .SH FILE LAYOUT .SS Different Gesture Matching Techniques wayV has two different techniques for matching gestures, overtime this will expand. .PP The key to set is Think, of which there are two possible options: .PP .nf 1. Pda It works well and can recognize over 40 different gestures. It doesn't take into consideration the direction the gesture is drawn in. Note this will always find a matching gesture - even if its very baldy wrong. .PP 2. Pda & Vector Like Pda above except it takes direction into consideration. It works at the moment but further work is required. The direction is recorded in the Gesture sub-key vector, which is comma delimited and set-able to N, NE, E, SE, S, SW, W and NW .SS Configuring Gestures & Actions The main, and required, configuration file is called "wayv.conf". When you read the words "configuration file" from here on presume its wayv.conf. .PP In wayv.conf you'll primarily be interested in the Action sub-sections. .PP Every gesture has an action associated with it - to find out what action is associated with what gesture have a look at a Gesture section - they start with the text "Gesture {" and end with the text "}", e.g. .PP .nf .B Gesture { name = "A"; description = "A"; shape = 0, 0, 0, 0, 1, 0, 0, 0 , 0, 0, 0, 1, 1, 1, 0, 0 , 0, 0, 0, 1, 0, 1, 0, 0 , 0, 0, 1, 0, 0, 1, 0, 0 , 0, 1, 0, 0, 0, 0, 1, 0 , 0, 1, 0, 0, 0, 0, 1, 0 , 1, 1, 0, 0, 0, 0, 1, 1 , 1, 0, 0, 0, 0, 0, 0, 1 ; vector = NE, SE; action = "Action A"; .B } .fi .PP Every Gesture section has a sub-key called "action =", the text between the quotes (after the equal) is the Action section associated with the gesture. .PP The vector sub-key is a new addition in 0.2. .PP Every action section starts with "Action {" and ends with "}", e.g. .PP .nf .B Action { name = "Action A"; process = exec "netscape"; match = ""; .B } .fi .PP The action sub-key "name =" is how a gesture is matched with an action. When Gesture.action = Action.name the action sub-key "process =" is used to carry out commands. .PP The action sub-key "process =" can compose of three different commands: .PP .nf 1. exec "COMMAND TO EXECUTE GOES HERE" Starts a program 2. warp Jumps the mouse back to the initial start position of a gesture 3. delay "INTEGER OF SECONDS TO WAIT" Wait so many seconds (useful when combined with sendkey) 4. kill Kill the last command executed by wayV, this is handy for canceling mismatched actions 5. sendkey "SPACE DELIMITED ALIAS(ES) FROM KEYMAP FILE" Send a keypress to the active application or window manager. Its the same as a key been pressed on the keyboard. An example of a composite keypress is: sendkey "Control_L+c c" (see HOWTO-wayv-keymap for more information) .fi .PP and there can be multiple commands each separated by a comma, e.g. process = warp, exec "xcalc", sendkey "o n e"; .PP .SS Activating Gesture Capture & Processing (was Mouse Activation) When using wayV you need to press specific key and mouse button combinations to activate gesture capture. Once a gesture is captured its checked to see if there are any associated actions. .PP The key in the configuration file to setup what actives the gesture capture is the "Launch =" key. It can have multiple parameters each seperated by a ",". The parameters are: .PP .nf Mx (where x is any number greater than 0) = Which mouse button must be held down when drawing a gesture SHIFT = Shift Key LOCK = Caps Lock On/Off CONTROL = Control Key MOD1, MOD2, MOD3, MOD4, MOD5 = Other keys which can be assigned with the unix command 'xmodmap'. .fi .PP An example of the setup wayV requires to begin gesture capture when mouse button 1 is held down is: .PP Launch = "M1"; .PP Another example to begin gesture capture when the Shift key and mouse button 2 is held down is: .PP Launch = "M2,SHIFT"; .PP A final example for when the Shift key, the Control Key and mouse button 3 is held down is: .PP Launch = "M3,SHIFT,CONTROL"; .PP Note: There CAN only be one mouse button used as part of activation, i.e. you cannot hold down multiple mouse buttons but multiple keys pressed at once can be setup and used. .PP .SS Controlling The Display The display has been considerably improved and rewritten for version 0.2. .PP The structure that has to contain the keys for the display is called Pretty. We'll go through each key in it in turn, note that some of the keys do interact with each other and change the overall result: .PP .nf 1. display This is the main key - controls what type of gesture input window, if any, appears. When a gesture input window appears the path followed by the pointer through it should be shown. Can be set to: - yes full screen input window that pops up on gesture activation - no no input window but the gestures are still capture on gesture activation - X, Y, WIDTH, HEIGHT always on screen input window X = Upper left hand corner the input window starts on Y = Upper left hand corner the input window starts on WIDTH = width of the input window HEIGHT = height of the input window 2. managed Turns on or off whether the window manager attempts to control the input window. This is only relevant for input windows that has the X, Y, WIDTH, HEIGHT set. - yes input window is exactly like all the other applications on your desktop - no the input window cannot be moved or managed. This is handy for PDAs (personal digital assistants) 3. color Not yet usable 4. size If an input window is used this controls the width of the lines drawn by the gesture path. 5. feedback A very handy feature which I think is quite handy. If its on a text box appears in the middle of the screen after a gesture is inputted. The text box tells the user what Action is matched with the inputed gesture. - yes Especially handy if used in combination with a gesture for the kill command (see above in "Configuration Gestures & Actions") - no no user feedback box 6. wait Length of time the user feedback, if its on, appears on the screen. .fi .PP .PP .SH FURTHER INFORMATION Right that should be enough to get people started. Have a look at the wayV website for more information and at the mailing lists for further help. .SH AUTHOR wayV was written by Mike Bennett (smoog at stressbunny dot com) with contributions from various others. .SH URL wayV - http://www.stressbunny.com/wayv .SH SEE ALSO .BR wayv(1) wayv-0.3/doc/HOWTO-wayv-keymap0000644000175000017500000001120307716662671014653 0ustar nicknickwayV version 0.2: Keymaps ========================= Author: Mike Bennett (smoog at stressbunny dot com) Last Update: 23/04/2001 Contents -------- - What are keymaps - Using keymaps - Creating keymaps - Important notes - Potential Problems What are keymaps ---------------- Keymaps enable wayV to carry out keypress emulation in a language and, some what, hardware independent manner. Ok, that isn't very clear so I'll use some examples. First have a look at the file "DEFAULT.wkey", it should be in wayV's src directory. Here are 4 lines from it: 38 a A 47 Semicolon : 48 ' @ 105 Page_Down Notice the way each line begins with a number, this is called the keycode. Following the keycode are one or two more columns, and each column is separated by a space. The second column is the keypress in a normal state, e.g. press 'a' on your keyboard and you get 'a' on your screen. The third column (which usually isn't required) is the keypress in a shifted state, e.g. hold down SHIFT and press 'a' on your keyboard and you get 'A' on your screen. Basically the second and third columns are names for keycodes. The names don't have to be single letters, but a single line should not be more than 512 characters in length. Now I'll explain what keycodes are. Here's hoping the above is clear in your head? Keycodes are what X uses to represent keypress', so if you press 'a' X sees it as the keycode 38. Therefore keymaps are used to provide a list of keycodes that are available to wayV. The second column and, optional, third column are used to create aliases for the keycodes. The aliases are used in the wayv.conf file when we want to send a keypress via the "sendkey" command. Using keymaps ------------- Keymaps are very simple to use, just edit your wayv.conf file (see HOWTO-wayv-config for further information). Go to the Include section that has the sub-key "type" set to "Keymap", you can then edit the "file" sub-key to specify which keymap to use. At the moment wayV only comes with one default keymap, called DEFAULT.wkey, but that will change over time as keymaps for other languages and types of hardware become available (yep, please contribute them!). Once a keymap is included in wayv.conf you can then use any of the aliases available in it for the sendkey command, e.g. using our examples above (NOTE: spaces are delimiters): sendkey "A @ a Semicolon"; results in the X thinking the following key's were pressed on your keyboard: SHIFT+a SHIFT+' a ; To send composite keypress', e.g. Control and Shift and a, use: sendkey "Control_L+Shift_L+a" To send a mixture of single and composite keypress' use: sendkey "a b c Control_L+c d e" Creating keymaps ---------------- In case it ain't obvious by now - please send on keymaps for other languages. Keymaps allow keypress' to be sent for any language, or at least they should :) Anyway the easiest way to create a keymap is to use the xev command, it usually comes with X, if not its easy to find on the net. While running X start xev via an xterm, or the equivalent, and up will pop a new window, usually titled "Event Tester". Now, making sure the xev window is active, press a key and look at the xterm window. You'll see lots of information appearing, most of it isn't useful to you but what you're interested in is the information starting with KeyPress, e.g. KeyPress event, serial 23, synthetic NO, window 0x1200001, root 0x30, subw 0x0, time 3885003998, (50,211), root:(259,444), state 0x0, keycode 38 (keysym 0x61, a), same_screen YES, XLookupString gives 1 characters: "a" The above KeyPress event occurred when I pressed 'a' on the keyboard. Notice the way the keycode is 38. Now just edit your wayV keymap file, create a new line, set the key code to 38 and the second column to what ever you want to refer to that keypress as, in this case 'a' is easiest. If the key has a different letter associated with it when the SHIFT key is pressed enter an alias for that in the third column, e.g. 38 a A Keep on repeating the above, with xev, till you've captured all the keypress' required. Important notes --------------- - wayV's current parser isn't robust, in fact it needs a serious clean up but till that happens avoid using the following letters in your aliases ; " ' = % , # and space. Instead use longer aliases, e.g. Semicolon, Quote, Singlequote, Equal, Percent, Comma, Hash, Space, etc. Potential Problems ------------------ - you may find that a keypress event isn't occurring even though its setup properly in both wayv.conf and DEFAULT.wkey. If this is the case it may be a simple matter of confirming the DEFAULT.wkey keycodes match the alias'. Use xev as above in "Creating keymaps". wayv-0.3/doc/Makefile0000644000175000017500000001556110360521037013206 0ustar nicknick# Generated automatically from Makefile.in by configure. # Makefile.in generated automatically by automake 1.4-p6 from Makefile.am # Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. SHELL = /bin/sh srcdir = . top_srcdir = .. prefix = / exec_prefix = ${prefix}/usr bindir = ${exec_prefix}/bin sbindir = ${exec_prefix}/sbin libexecdir = ${exec_prefix}/libexec datadir = ${prefix}/usr/share/ sysconfdir = ${prefix}/etc sharedstatedir = ${prefix}/com localstatedir = ${prefix}/var libdir = ${exec_prefix}/lib infodir = ${prefix}/usr/share/info mandir = ${prefix}/usr/share/man includedir = ${prefix}/include oldincludedir = /usr/include DESTDIR = pkgdatadir = $(datadir)/wayv pkglibdir = $(libdir)/wayv pkgincludedir = $(includedir)/wayv top_builddir = .. ACLOCAL = aclocal AUTOCONF = autoconf AUTOMAKE = automake AUTOHEADER = autoheader INSTALL = /usr/bin/install -c INSTALL_PROGRAM = ${INSTALL} $(AM_INSTALL_PROGRAM_FLAGS) INSTALL_DATA = ${INSTALL} -m 644 INSTALL_SCRIPT = ${INSTALL_PROGRAM} transform = s,x,x, NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : CC = gcc MAKEINFO = /home/nick/wayv/wayv-0.3/missing makeinfo PACKAGE = wayv VERSION = 0.3 datadir = ${prefix}/usr/share/ x_includes = x_libraries = /usr/X11R6/lib man_MANS = wayv.1 wayv.conf.5 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = man1dir = $(mandir)/man1 man5dir = $(mandir)/man5 MANS = $(man_MANS) NROFF = nroff DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = tar GZIP_ENV = --best all: all-redirect .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status install-man1: $(mkinstalldirs) $(DESTDIR)$(man1dir) @list='$(man1_MANS)'; \ l2='$(man_MANS)'; for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ done uninstall-man1: @list='$(man1_MANS)'; \ l2='$(man_MANS)'; for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ rm -f $(DESTDIR)$(man1dir)/$$inst; \ done install-man5: $(mkinstalldirs) $(DESTDIR)$(man5dir) @list='$(man5_MANS)'; \ l2='$(man_MANS)'; for i in $$l2; do \ case "$$i" in \ *.5*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man5dir)/$$inst"; \ $(INSTALL_DATA) $$file $(DESTDIR)$(man5dir)/$$inst; \ done uninstall-man5: @list='$(man5_MANS)'; \ l2='$(man_MANS)'; for i in $$l2; do \ case "$$i" in \ *.5*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f $(DESTDIR)$(man5dir)/$$inst"; \ rm -f $(DESTDIR)$(man5dir)/$$inst; \ done install-man: $(MANS) @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-man1 install-man5 uninstall-man: @$(NORMAL_UNINSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-man1 uninstall-man5 tags: TAGS TAGS: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = doc distdir: $(DISTFILES) here=`cd $(top_builddir) && pwd`; \ top_distdir=`cd $(top_distdir) && pwd`; \ distdir=`cd $(distdir) && pwd`; \ cd $(top_srcdir) \ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu doc/Makefile @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done info-am: info: info-am dvi-am: dvi: dvi-am check-am: all-am check: check-am installcheck-am: installcheck: installcheck-am install-exec-am: install-exec: install-exec-am install-data-am: install-man install-data: install-data-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-am uninstall-am: uninstall-man uninstall: uninstall-am all-am: Makefile $(MANS) all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: $(mkinstalldirs) $(DESTDIR)$(mandir)/man1 $(DESTDIR)$(mandir)/man5 mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: mostlyclean-am: mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-generic mostlyclean-am clean: clean-am distclean-am: distclean-generic clean-am distclean: distclean-am maintainer-clean-am: maintainer-clean-generic distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." maintainer-clean: maintainer-clean-am .PHONY: install-man1 uninstall-man1 install-man5 uninstall-man5 \ install-man uninstall-man tags distdir info-am info dvi-am dvi check \ check-am installcheck-am installcheck install-exec-am install-exec \ install-data-am install-data install-am install uninstall-am uninstall \ all-redirect all-am all installdirs mostlyclean-generic \ distclean-generic clean-generic maintainer-clean-generic clean \ mostlyclean distclean maintainer-clean # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: wayv-0.3/doc/wayv.conf.50000644000175000017500000002011510251422737013543 0ustar nicknick.\" -*- nroff -*- .TH "wayv.conf" "1" "August 2003" "0.3" "X Windows application" .SH DESCRIPTION wayv.conf \- configuration file for wayV .SH FILE LAYOUT .SS Different Gesture Matching Techniques wayV has two different techniques for matching gestures, overtime this will expand. .PP The key to set is Think, of which there are two possible options: .PP .nf 1. Pda It works well and can recognize over 40 different gestures. It doesn't take into consideration the direction the gesture is drawn in. Note this will always find a matching gesture - even if its very baldy wrong. .PP 2. Pda & Vector Like Pda above except it takes direction into consideration. It works at the moment but further work is required. The direction is recorded in the Gesture sub-key vector, which is comma delimited and set-able to N, NE, E, SE, S, SW, W and NW .SS Configuring Gestures & Actions The main, and required, configuration file is called "wayv.conf". When you read the words "configuration file" from here on presume its wayv.conf. .PP In wayv.conf you'll primarily be interested in the Action sub-sections. .PP Every gesture has an action associated with it - to find out what action is associated with what gesture have a look at a Gesture section - they start with the text "Gesture {" and end with the text "}", e.g. .PP .nf .B Gesture { name = "A"; description = "A"; shape = 0, 0, 0, 0, 1, 0, 0, 0 , 0, 0, 0, 1, 1, 1, 0, 0 , 0, 0, 0, 1, 0, 1, 0, 0 , 0, 0, 1, 0, 0, 1, 0, 0 , 0, 1, 0, 0, 0, 0, 1, 0 , 0, 1, 0, 0, 0, 0, 1, 0 , 1, 1, 0, 0, 0, 0, 1, 1 , 1, 0, 0, 0, 0, 0, 0, 1 ; vector = NE, SE; action = "Action A"; .B } .fi .PP Every Gesture section has a sub-key called "action =", the text between the quotes (after the equal) is the Action section associated with the gesture. .PP The vector sub-key is a new addition in 0.2. .PP Every action section starts with "Action {" and ends with "}", e.g. .PP .nf .B Action { name = "Action A"; process = exec "netscape"; match = ""; .B } .fi .PP The action sub-key "name =" is how a gesture is matched with an action. When Gesture.action = Action.name the action sub-key "process =" is used to carry out commands. .PP The action sub-key "process =" can compose of three different commands: .PP .nf 1. exec "COMMAND TO EXECUTE GOES HERE" Starts a program 2. warp Jumps the mouse back to the initial start position of a gesture 3. delay "INTEGER OF SECONDS TO WAIT" Wait so many seconds (useful when combined with sendkey) 4. kill Kill the last command executed by wayV, this is handy for canceling mismatched actions 5. sendkey "SPACE DELIMITED ALIAS(ES) FROM KEYMAP FILE" Send a keypress to the active application or window manager. Its the same as a key been pressed on the keyboard. An example of a composite keypress is: sendkey "Control_L+c c" (see HOWTO-wayv-keymap for more information) .fi .PP and there can be multiple commands each separated by a comma, e.g. process = warp, exec "xcalc", sendkey "o n e"; .PP .SS Activating Gesture Capture & Processing (was Mouse Activation) When using wayV you need to press specific key and mouse button combinations to activate gesture capture. Once a gesture is captured its checked to see if there are any associated actions. .PP The key in the configuration file to setup what actives the gesture capture is the "Launch =" key. It can have multiple parameters each seperated by a ",". The parameters are: .PP .nf Mx (where x is any number greater than 0) = Which mouse button must be held down when drawing a gesture SHIFT = Shift Key LOCK = Caps Lock On/Off CONTROL = Control Key MOD1, MOD2, MOD3, MOD4, MOD5 = Other keys which can be assigned with the unix command 'xmodmap'. .fi .PP An example of the setup wayV requires to begin gesture capture when mouse button 1 is held down is: .PP Launch = "M1"; .PP Another example to begin gesture capture when the Shift key and mouse button 2 is held down is: .PP Launch = "M2,SHIFT"; .PP A final example for when the Shift key, the Control Key and mouse button 3 is held down is: .PP Launch = "M3,SHIFT,CONTROL"; .PP Note: There CAN only be one mouse button used as part of activation, i.e. you cannot hold down multiple mouse buttons but multiple keys pressed at once can be setup and used. .PP .SS Controlling The Display The display has been considerably improved and rewritten for version 0.2. .PP The structure that has to contain the keys for the display is called Pretty. We'll go through each key in it in turn, note that some of the keys do interact with each other and change the overall result: .PP .nf 1. display This is the main key - controls what type of gesture input window, if any, appears. When a gesture input window appears the path followed by the pointer through it should be shown. Can be set to: - yes full screen input window that pops up on gesture activation - no no input window but the gestures are still capture on gesture activation - X, Y, WIDTH, HEIGHT always on screen input window X = Upper left hand corner the input window starts on Y = Upper left hand corner the input window starts on WIDTH = width of the input window HEIGHT = height of the input window 2. managed Turns on or off whether the window manager attempts to control the input window. This is only relevant for input windows that has the X, Y, WIDTH, HEIGHT set. - yes input window is exactly like all the other applications on your desktop - no the input window cannot be moved or managed. This is handy for PDAs (personal digital assistants) 3. color Not yet usable 4. size If an input window is used this controls the width of the lines drawn by the gesture path. 5. feedback A very handy feature which I think is quite handy. If its on a text box appears in the middle of the screen after a gesture is inputted. The text box tells the user what Action is matched with the inputed gesture. - yes Especially handy if used in combination with a gesture for the kill command (see above in "Configuration Gestures & Actions") - no no user feedback box 6. wait Length of time the user feedback, if its on, appears on the screen. .fi .PP .PP .SH FURTHER INFORMATION Right that should be enough to get people started. Have a look at the wayV website for more information and at the mailing lists for further help. .SH AUTHOR wayV was written by Mike Bennett (smoog at stressbunny dot com) with contributions from various others. .SH URL wayV - http://www.stressbunny.com/wayv .SH SEE ALSO .BR wayv(1) wayv-0.3/gtkfront/0000755000175000017500000000000007432563455012647 5ustar nicknickwayv-0.3/gtkfront/wayvfront.glade0000644000175000017500000007415607432563455015721 0ustar nicknick wayv wayvfront src pixmaps C True True GnomeApp Main Window 500 400 destroy gtk_main_quit Tue, 23 May 2000 12:20:54 GMT destroy_event gtk_main_quit Tue, 23 May 2000 12:20:48 GMT wayV v0.1 - Setup & Configuration GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False 500 400 False True False True GnomeDock GnomeApp:dock dock1 True 0 True True GnomeDockItem Menu Dock 2 GNOME_DOCK_TOP 0 0 0 False True False True False GTK_SHADOW_OUT GtkMenuBar Main Menu GTK_SHADOW_NONE GtkMenuItem file1 GNOMEUIINFO_MENU_FILE_TREE GtkMenu file1_menu GtkPixmapMenuItem new_file1 activate on_new_file1_activate Mon, 22 May 2000 20:40:55 GMT GNOMEUIINFO_MENU_NEW_ITEM GtkPixmapMenuItem open1 activate on_open1_activate Mon, 22 May 2000 20:40:55 GMT GNOMEUIINFO_MENU_OPEN_ITEM GtkPixmapMenuItem save1 activate on_save1_activate Mon, 22 May 2000 20:40:55 GMT GNOMEUIINFO_MENU_SAVE_ITEM GtkPixmapMenuItem save_as1 activate on_save_as1_activate Mon, 22 May 2000 20:40:55 GMT GNOMEUIINFO_MENU_SAVE_AS_ITEM GtkMenuItem separator1 False GtkPixmapMenuItem exit1 activate on_exit1_activate Tue, 23 May 2000 12:38:05 GMT GNOMEUIINFO_MENU_EXIT_ITEM GtkMenuItem help1 GNOMEUIINFO_MENU_HELP_TREE GtkMenu help1_menu GtkPixmapMenuItem about1 activate on_about1_activate Mon, 22 May 2000 20:40:55 GMT GNOMEUIINFO_MENU_ABOUT_ITEM GnomeDockItem ToolBar Dock 1 GNOME_DOCK_TOP 1 0 0 False True False False False GTK_SHADOW_OUT GtkToolbar Main toolbar 1 GTK_ORIENTATION_HORIZONTAL GTK_TOOLBAR_BOTH 16 GTK_TOOLBAR_SPACE_LINE GTK_RELIEF_NONE True GtkButton Toolbar:button Create & Manage Gestures Create & Manage Gestures clicked on_Create & Manage Gestures_clicked Tue, 23 May 2000 12:08:10 GMT GNOME_STOCK_PIXMAP_COLORSELECTOR GtkButton Toolbar:button Create & Manage Actions Create & Manage Actions GNOME_STOCK_PIXMAP_EXEC GtkButton Toolbar:button Associate Actions & Gestures Associate Actions & Gestures GNOME_STOCK_PIXMAP_INDEX GtkVSeparator vseparator1 10 38 GtkButton Toolbar:button AI Setup AI Setup GNOME_STOCK_PIXMAP_BOOK_OPEN GtkButton Toolbar:button Gesture Space Setup Gesture Space Setup GNOME_STOCK_PIXMAP_REFRESH GtkButton Toolbar:button Input Setup Input Setup GNOME_STOCK_PIXMAP_ADD GtkButton Toolbar:button Display Setup Display Setup GNOME_STOCK_PIXMAP_TABLE_FILL GtkScrolledWindow GnomeDock:contents User interaction scrollable 42 42 GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_UPDATE_CONTINUOUS GTK_UPDATE_CONTINUOUS GtkViewport viewport1 GTK_SHADOW_IN GtkNotebook Layed User Sections False False GTK_POS_TOP False 2 2 False GtkVBox units About layout False 0 GnomePixmap wayV logo wayV-logo.png 0 True False GtkLabel About wayV 180 GTK_JUSTIFY_CENTER False 0.5 0.1 0 0 0 True True GtkLabel Notebook:tab ui about GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 Placeholder GtkLabel Notebook:tab ui gestures GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 Placeholder GtkLabel Notebook:tab ui actions GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkHBox unit Associate False 0 GtkVBox vbox12 5 False 0 0 True True GtkLabel label9 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 False False GtkScrolledWindow scrolledwindow1 GTK_POLICY_NEVER GTK_POLICY_AUTOMATIC GTK_UPDATE_CONTINUOUS GTK_UPDATE_CONTINUOUS 0 True True Placeholder GtkVBox vbox11 True 0 0 False False GtkButton button3 True 0 False False GtkButton button4 True 0 False False GtkVBox vbox13 5 False 0 0 True True GtkLabel label10 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 False False GtkCombo combo1 False True False True False 0 False False GtkEntry GtkCombo:entry combo-entry1 True True True 0 GtkLabel label11 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 False False GtkEntry entry3 True True True 0 0 False False GtkLabel label12 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 False False GtkList list1 GTK_SELECTION_SINGLE 0 True True GtkLabel Notebook:tab ui associate GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkHBox units AI Setup 5 True 0 GtkVBox vbox9 False 0 5 True True GtkLabel label3 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 False False GtkDrawingArea drawingarea1 0 True True GtkLabel label5 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 False False GtkSpinButton spinbutton5 True 1 0 True GTK_UPDATE_ALWAYS False False 100 0 100 1 10 10 0 False False GtkLabel label7 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 False False GtkSpinButton spinbutton6 True 1 0 True GTK_UPDATE_ALWAYS False False 1 0 100 1 10 10 0 False False GtkButton button1 5 True 0 False False GtkVBox vbox10 False 0 5 True True GtkLabel label4 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 False False GtkDrawingArea drawingarea2 0 True True GtkLabel label6 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 False False GtkEntry entry1 True True True 0 0 False False GtkLabel label8 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 False False GtkEntry entry2 True True True 0 0 False False GtkButton button2 5 True 0 False False GtkLabel Notebook:tab ui ai GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkVBox units space setup False 0 GtkFrame layer units space grid 5 0 GTK_SHADOW_ETCHED_IN 0 False False GtkVBox vbox6 False 0 GtkHBox hbox1 5 False 10 0 True True GtkLabel label1 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 False False GtkSpinButton spinbutton2 True 1 0 True GTK_UPDATE_ALWAYS False False 1 0 100 1 10 10 0 True True GtkHBox hbox2 5 False 10 0 True True GtkLabel label2 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 False False GtkSpinButton spinbutton3 True 1 0 True GTK_UPDATE_ALWAYS False False 1 0 100 1 10 10 0 True True GtkFrame layer units space setup max 5 0 GTK_SHADOW_ETCHED_IN 0 False False GtkSpinButton spinbutton4 True 1 0 True GTK_UPDATE_ALWAYS False False 500 100 5000 1 10 10 GtkLabel Notebook:tab ui space GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkVBox units input False 0 GtkFrame layer units input 5 0 GTK_SHADOW_ETCHED_IN 0 False False GtkVBox vbox8 5 False 5 GtkRadioButton radiobutton4 True False True layers unit activation button 0 False False GtkRadioButton radiobutton5 True False True layers unit activation button 0 False False GtkRadioButton radiobutton6 True False True layers unit activation button 0 False False GtkLabel Notebook:tab ui input GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkVBox units Display Setup False 0 GtkFrame layer units Display Setup 5 0 GTK_SHADOW_ETCHED_IN 0 False False GtkVBox vbox3 5 True 0 GtkRadioButton display button on True False True layer units display state 0 False False GtkRadioButton display button off True False True layer units display state 0 False False GtkFrame layer units Draw Color 5 0 GTK_SHADOW_ETCHED_IN 0 False False GtkEntry draw color number True True True 6 GtkFrame layer units Line Width 5 0 GTK_SHADOW_ETCHED_IN 0 False False GtkSpinButton spinbutton1 True 1 0 True GTK_UPDATE_ALWAYS False False 1 1 100 1 10 10 GtkLabel Notebook:tab ui display GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 wayv-0.3/src/0000755000175000017500000000000010360521457011566 5ustar nicknickwayv-0.3/src/Makefile.am0000644000175000017500000000046707432563455013643 0ustar nicknick## Process this file with automake to produce Makefile.in bin_PROGRAMS = wayv data_DATA = wayv.conf DEFAULT.wkey wayv_SOURCES = ai.c aimath.c backend.c display.c gesture.c process.c setup.c misc.c CFLAGS = -Wall -O2 -DSETUPPATH=\"@datadir@\" wayv_LDADD = @X_LIBS@ wayv_LDFLAGS = -I@x_includes@ -L@x_libraries@ wayv-0.3/src/Makefile.in0000644000175000017500000002246710251424172013641 0ustar nicknick# Makefile.in generated automatically by automake 1.4-p6 from Makefile.am # Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include DESTDIR = pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : CC = @CC@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ datadir = @datadir@ x_includes = @x_includes@ x_libraries = @x_libraries@ bin_PROGRAMS = wayv data_DATA = wayv.conf DEFAULT.wkey wayv_SOURCES = ai.c aimath.c backend.c display.c gesture.c process.c setup.c misc.c CFLAGS = -Wall -O2 -DSETUPPATH=\"@datadir@\" wayv_LDADD = @X_LIBS@ wayv_LDFLAGS = -I@x_includes@ -L@x_libraries@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = PROGRAMS = $(bin_PROGRAMS) DEFS = @DEFS@ -I. -I$(srcdir) -I.. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ X_CFLAGS = @X_CFLAGS@ X_LIBS = @X_LIBS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ wayv_OBJECTS = ai.o aimath.o backend.o display.o gesture.o process.o \ setup.o misc.o wayv_DEPENDENCIES = COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ DATA = $(data_DATA) DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = tar GZIP_ENV = --best DEP_FILES = .deps/ai.P .deps/aimath.P .deps/backend.P .deps/display.P \ .deps/gesture.P .deps/misc.P .deps/process.P .deps/setup.P SOURCES = $(wayv_SOURCES) OBJECTS = $(wayv_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .o .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status mostlyclean-binPROGRAMS: clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) distclean-binPROGRAMS: maintainer-clean-binPROGRAMS: install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(bindir) @list='$(bin_PROGRAMS)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) list='$(bin_PROGRAMS)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ done .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: wayv: $(wayv_OBJECTS) $(wayv_DEPENDENCIES) @rm -f wayv $(LINK) $(wayv_LDFLAGS) $(wayv_OBJECTS) $(wayv_LDADD) $(LIBS) install-dataDATA: $(data_DATA) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(datadir) @list='$(data_DATA)'; for p in $$list; do \ if test -f $(srcdir)/$$p; then \ echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(datadir)/$$p"; \ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(datadir)/$$p; \ else if test -f $$p; then \ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(datadir)/$$p"; \ $(INSTALL_DATA) $$p $(DESTDIR)$(datadir)/$$p; \ fi; fi; \ done uninstall-dataDATA: @$(NORMAL_UNINSTALL) list='$(data_DATA)'; for p in $$list; do \ rm -f $(DESTDIR)$(datadir)/$$p; \ done tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ here=`pwd` && cd $(srcdir) \ && mkid -f$$here/ID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || (cd $(srcdir) && etags -o $$here/TAGS $(ETAGS_ARGS) $$tags $$unique $(LISP)) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = src distdir: $(DISTFILES) here=`cd $(top_builddir) && pwd`; \ top_distdir=`cd $(top_distdir) && pwd`; \ distdir=`cd $(distdir) && pwd`; \ cd $(top_srcdir) \ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu src/Makefile @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :) -include $(DEP_FILES) mostlyclean-depend: clean-depend: distclean-depend: -rm -rf .deps maintainer-clean-depend: %.o: %.c @echo '$(COMPILE) -c $<'; \ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-cp .deps/$(*F).pp .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm .deps/$(*F).pp %.lo: %.c @echo '$(LTCOMPILE) -c $<'; \ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ < .deps/$(*F).pp > .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm -f .deps/$(*F).pp info-am: info: info-am dvi-am: dvi: dvi-am check-am: all-am check: check-am installcheck-am: installcheck: installcheck-am install-exec-am: install-binPROGRAMS install-exec: install-exec-am install-data-am: install-dataDATA install-data: install-data-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-am uninstall-am: uninstall-binPROGRAMS uninstall-dataDATA uninstall: uninstall-am all-am: Makefile $(PROGRAMS) $(DATA) all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: $(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(datadir) mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \ mostlyclean-tags mostlyclean-depend mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-binPROGRAMS clean-compile clean-tags clean-depend \ clean-generic mostlyclean-am clean: clean-am distclean-am: distclean-binPROGRAMS distclean-compile distclean-tags \ distclean-depend distclean-generic clean-am distclean: distclean-am maintainer-clean-am: maintainer-clean-binPROGRAMS \ maintainer-clean-compile maintainer-clean-tags \ maintainer-clean-depend maintainer-clean-generic \ distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." maintainer-clean: maintainer-clean-am .PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile uninstall-dataDATA install-dataDATA tags \ mostlyclean-tags distclean-tags clean-tags maintainer-clean-tags \ distdir mostlyclean-depend distclean-depend clean-depend \ maintainer-clean-depend info-am info dvi-am dvi check check-am \ installcheck-am installcheck install-exec-am install-exec \ install-data-am install-data install-am install uninstall-am uninstall \ all-redirect all-am all installdirs mostlyclean-generic \ distclean-generic clean-generic maintainer-clean-generic clean \ mostlyclean distclean maintainer-clean # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: wayv-0.3/src/ai.c0000644000175000017500000000752607716664020012342 0ustar nicknick/* wayV - NGUI (Next Generation User Interfaces) * * Copyright (C) 2000-2003 Mike Bennett (smoog at stressbunny dot com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Purpose: * Carry out Point Density Analysis (PDA) and gesture matching */ #include #include "defines.h" #include "ai.h" #include "aimath.h" #include "gesture.h" /* * Purpose: * Find a gesture if one exists * * Parameters: * 1st - internal representation of the configuration * file and data structures * 2nd - Gesture matrix to find * 3rd - Vector to find * 4th - AI rule to use to do matching * * Returns: * WGESTURE * to gesture that matches * NULL on no match * * History: * 19/06/2000 (Mike Bennett): Added PDA_REFUSE * 02/08/2000 (Simon P Hart): Added vector check * 08/08/2000 (Mike Bennett): Added a new rule for Simon's vectoring, it could * share a lot of the same code but each rule should * be completely separate (there is going to be a * fair number of them) */ WGESTURE *findGesture(WSETUP *wayv, MATRIX *find, VECTOR *vector, char *rule) { WGESTURE *action = NULL; int n, pdaTemp, pda = 100; /* Walk through each brain testing for a result pattern */ if(strcmp(rule, AIRULE_PDA) == 0) { /* Walk through all the gestures */ for(n = 0; wayv->gestures[n] != NULL; n++) { pdaTemp = pointDensityAnalysis(find, wayv->gestures[n]->wshape); /* Type of bubble sort */ if (pdaTemp < pda) { pda = pdaTemp; action = wayv->gestures[n]; } } } else if(strcmp(rule, AIRULE_PDA_VECTOR) == 0) { /* Walk through all the gestures */ for(n = 0; wayv->gestures[n] != NULL; n++) { pdaTemp = pointDensityAnalysis(find, wayv->gestures[n]->wshape); if(vectCmp(vector,wayv->gestures[n]->wvector) == TRUE) pdaTemp /= 2; /* Type of bubble sort */ if (pdaTemp < pda) { pda = pdaTemp; action = wayv->gestures[n]; } } } if(pda > PDA_REFUSE) return NULL; return action; } /* * Purpose: * Perform a technique I've called point density anaylsis - I'll * writeup something on it later - for now I'm focused on the * implementation (must do, must do, cannot stop coding, help... ;) * * Parameters: * 1st - Matrix we want to find * 2nd - Matrix we think may be a match * * Returns: * Percentage difference between test and the original * * History: * 15/06/2000 (Mike Bennett): Created function */ int pointDensityAnalysis(MATRIX *find, MATRIX *test) { MATRIX *temp; float original, after, check; int ans; check = (float)pdaMat(test, 1); original = (float)pdaMat(find, 1); if(original > check) temp = denormMat(subMat(find, test)); else temp = denormMat(subMat(test, find)); after = (float)pdaMat(temp, 1); ans = float2Int((after / original) * 100); freeMat(temp); return(ans); } /* * Purpose: * Compares two vectors * * Parameters: * Two VECTORS * * Returns: * True if identical, False otherwise * * History: * 02/08/2000 (Simon P Hart): Created function */ int vectCmp(VECTOR *vec1, VECTOR *vec2) { VECTOR *v1 = vec1, *v2 = vec2; while(*v1 != DIR_NONE && *v2 != DIR_NONE) { if(*v1 != *v2) break; v1++; v2++; } if(*v1 == DIR_NONE && *v2 == DIR_NONE) return TRUE; return FALSE; } wayv-0.3/src/ai.h0000644000175000017500000000243207716664036012345 0ustar nicknick/* wayV - NGUI (Next Generation User Interfaces) * * Copyright (C) 2000-2003 Mike Bennett (smoog at stressbunny dot com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Purpose: * Prototypes for ai.c */ #ifndef __AI_H__ #define __AI_H__ #include "setup.h" #include "aimath.h" /* Names for the different AI rules */ #define AIRULE_PDA "Pda" /* Point Density Analysis */ #define AIRULE_PDA_VECTOR "Pda & Vector" /* Point Density Analysis with direction */ WGESTURE *findGesture(WSETUP *, MATRIX *, VECTOR *, char *); int pointDensityAnalysis(MATRIX *, MATRIX *); int vectCmp(VECTOR *, VECTOR *); #endif /* __AI_H__ */ wayv-0.3/src/aimath.c0000644000175000017500000002756307716664076013232 0ustar nicknick/* wayV - NGUI (Next Generation User Interfaces) * * Copyright (C) 2000-2003 Mike Bennett (smoog at stressbunny dot com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Purpose: * Present generic interface to maths required * for AI (at this stage neural net) */ #include #include "defines.h" #include "aimath.h" /* * Purpose: * Convert to +/-1 (calling it normalising for now) and return as * a new matrix * * Parameters: * Pointer to matrix to normalise * * Returns: * Pointer to normalised matrix * * History: * 15/04/2000 (Mike Bennett): Created function * 02/05/2000 (Mike Bennett): Updated to return a new matrix * & changed to convert less than 1 * to -1 */ MATRIX *normMat(MATRIX *matrix) { MATRIX *ans; int m, n; ans = createMat(matrix->m, matrix->n); for(m = 0; m < matrix->m; m++) for(n = 0; n < matrix->n; n++) if(matrix->me[m][n] > 0) ans->me[m][n] = 1; else ans->me[m][n] = -1; return(ans); } /* * Purpose: * Set all of a matrices rows and columns to the same value * * Parameters: * 1st - Pointer to matrix to set * 2nd - value to set all the rows and columns to * * Returns: * NONE * * History: * 09/06/2000 (Mike Bennett): Created function */ void setMat(MATRIX *matrix, int value) { int m, n; for(m = 0; m < matrix->m; m++) for(n = 0; n < matrix->n; n++) matrix->me[m][n] = value; } /* * Purpose: * Count of number of X int's found in a matrix. Part * of the point density analysis technique. * * Parameters: * 1st - Pointer to matrix to count values in * 2nd - Value (X) to find numerous times * * Returns: * Int with number of X int's found * * History: * 15/06/2000 (Mike Bennett): Created function */ int pdaMat(MATRIX *matrix, int value) { int m, n, ans; for(ans = 0, m = 0; m < matrix->m; m++) for(n = 0; n < matrix->n; n++) if(matrix->me[m][n] == value) ans++; return(ans); } /* * Purpose: * Convert a normalized matrix from +1/-1 to +1/0 * * Parameters: * Pointer to matrix to normalise * * Returns: * Pointer to normalized matrix * * NOTE: * This doesn't create a new matrix and return that (unlike normMat()) * instead it just converts an existing one and returns a pointer to that * * History: * 07/05/2000 (Mike Bennett): Created function * 15/06/2000 (Mike Bennett): Changed to return pointer to updated matrix */ MATRIX *denormMat(MATRIX *matrix) { int m, n; for(m = 0; m < matrix->m; m++) for(n = 0; n < matrix->n; n++) if(matrix->me[m][n] > 0) matrix->me[m][n] = 1; else matrix->me[m][n] = 0; return(matrix); } /* * Purpose: * Create a matrix * * Parameters: * 1st - number of units matrix across * 2nd - number of units matrix down * * Returns: * Pointer to matrix * * NOTE: * Access element of matrix by MATRIX->me[m][n] * * History: * 15/04/2000 (Mike Bennett): Created function * 07/06/2000 (Mike Bennett): Updated to allocate memory for the MATRIX * 02/08/2000 (Simon Hart): Added memory checking code */ MATRIX *createMat(int m, int n) { MATRIX *ans; int i; if((ans = (MATRIX *)malloc(sizeof(MATRIX))) == NULL) { fputs("No mem for matrix\n",stderr); exit(1); } ans->m = m; ans->n = n; if((ans->me = (int **)calloc(m, sizeof(int *))) == NULL) { fputs("No mem for matrix\n",stderr); exit(1); } /* Now allocate across */ for(i = 0; i < m; i++) { if((ans->me[i] = (int *)calloc(n, sizeof(int))) == NULL) { fputs("No mem for matrix\n",stderr); exit(1); } } setMat(ans, 0); return(ans); } /* * Purpose: * Copy from one matrix to another * * Parameters: * 1st - matrix to copy to * 2nd - matrix to copy from * * Returns: * Matrix with copy * NULL on failure * * History: * 01/05/2000 (Mike Bennett): Created function */ MATRIX *copyMat(MATRIX *copy, MATRIX *original) { int m, n; /* Make sure they're the same size */ if(copy->m != original->m || copy->n != original->n) return NULL; for(n = 0; n < original->n; n++) for(m = 0; m < original->m; m++) copy->me[m][n] = original->me[m][n]; return(copy); } /* * Purpose: * Create an exact copy of a matrix * * Parameters: * Matrix to create a copy of * * Returns: * New copy of the original matrix * NULL on failure * * History: * 01/05/2000 (Mike Bennett): Created function */ MATRIX *cloneMat(MATRIX *original) { MATRIX *ans; ans = createMat(original->m, original->n); return copyMat(ans, original); } /* * Purpose: * Add two matrix's together * * Parameters: * 1st - first matrix to add * 2nd - second matrix to add * * Returns: * New matrix with the result of the add * NULL on failure * * History: * 15/04/2000 (Mike Bennett): Created function * 09/06/2000 (Mike Bennett): Rewrote to get rid of Meschach */ MATRIX *addMat(MATRIX *first, MATRIX *second) { MATRIX *ans; int m, n; if(first->m != second->m || first->n != second->n) return NULL; ans = createMat(first->m, first->n); for(m = 0; m < first->m; m++) for(n = 0; n < first->n; n++) ans->me[m][n] = first->me[m][n] + second->me[m][n]; return(ans); } /* * Purpose: * Subtract two matrix's * * Parameters: * 1st - matrix to be subtracted from * 2nd - matrix to subtract * * Returns: * New matrix with the result of the subtract * NULL on failure * * History: * 15/06/2000 (Mike Bennett): Created function */ MATRIX *subMat(MATRIX *first, MATRIX *second) { MATRIX *ans; int m, n; if(first->m != second->m || first->n != second->n) return NULL; ans = createMat(first->m, first->n); for(m = 0; m < first->m; m++) for(n = 0; n < first->n; n++) ans->me[m][n] = first->me[m][n] - second->me[m][n]; return(ans); } /* * Purpose: * Multiply two matrix's together * * Parameters: * 1st - first matrix to multiply * 2nd - second matrix to multiply * * Returns: * New matrix with the result of the multiply * NULL on failure * * NOTE: * The first matrix multiplies the second * * History: * 15/04/2000 (Mike Bennett): Created function * 10/06/2000 (Mike Bennett): Rewrote to get rid of Meschach */ MATRIX *mulMat(MATRIX *first, MATRIX *second) { MATRIX *ans; int m, n, i; if(first->n != second->m) return NULL; ans = createMat(first->m, second->n); /* Loop the loop multiply like magic - this algo is loosely * based on Meschach's */ for(m = 0; m < ans->m; m++) for(n = 0; n < ans->n; n++) for(i = 0; i < second->m; i++) ans->me[m][n] += first->me[m][i] * second->me[i][n]; return(ans); } /* * Purpose: * Create the transpose of a matrix * * Parameters: * Matrix to get the transpose of * * Returns: * New matrix with the transpose * * History: * 15/04/2000 (Mike Bennett): Created function * 10/06/2000 (Mike Bennett): Rewrote to get rid of Meschach */ MATRIX *transMat(MATRIX *matrix) { MATRIX *ans; int m, n; ans = createMat(matrix->n, matrix->m); /* Simplicity embodied - easy to do and elegant*/ for(m = 0; m < matrix->m; m++) for(n = 0; n < matrix->n; n++) ans->me[n][m] = matrix->me[m][n]; return(ans); } /* * Purpose: * Resize of an existing matrix * * Parameters: * 1st - Matrix to resize * 2nd - New size of units across * 3rd - New size of units down * * Returns: * Resized matrix * * History: * 15/04/2000 (Mike Bennett): Created function * 10/06/2000 (Mike Bennett): Rewrote to get rid of Meschach */ MATRIX *resizeMat(MATRIX *matrix, int m, int n) { MATRIX *ans; ans = createMat(m, n); for(n = 0; n < matrix->n && n < ans->n; n++) for(m = 0; m < matrix->m && m < ans->m; m++) ans->me[m][n] = matrix->me[m][n]; freeMat(matrix); matrix = ans; return(matrix); } /* * Purpose: * Rescale an existing matrix. Note this differs from * resizeMat() because it changes the shape of an * existing matrix while keeping the sames values * * Parameters: * 1st - Matrix to rescale * 2nd - New size of units across * 3rd - New size of units down * * Returns: * Rescaled matrix * * History: * 08/05/2000 (Mike Bennett): Created function */ MATRIX *rescaleMat(MATRIX *matrix, int m, int n) { MATRIX *ans; int a, b, x, y; ans = createMat(m, n); /* Walk across then down */ for(a = 0, b = 0, x = 0; x < matrix->m; x++) { for(y = 0; y < matrix->n; y++, b++) { /* do we move to next line to transfer to */ if(b == ans->m) { b = 0; a++; } ans->me[a][b] = matrix->me[x][y]; } } return ans; } /* * Purpose: * Compare two matrices * * Parameters: * 1st - Matrix to do compare against * 2nd - Matrix to compare with * * Returns: * GOOD on match * BAD on failure * * History: * 08/05/2000 (Mike Bennett): Created function */ int cmpMat(MATRIX *first, MATRIX *second) { int m, n; if(first->m != second->m || first->n != second->n) return BAD; for(m = 0; m < first->m; m++) for(n = 0; n < first->n; n++) if(first->me[m][n] != second->me[m][n]) return BAD; return GOOD; } /* * Purpose: * Join the second matrix onto the first * * Parameters: * 1st - matrix to get entended * 2nd - matrix to join onto the first one * * Returns: * Pointer to the first matrix with the second added * * History: * 15/04/2000 (Mike Bennett): Created function * 16/06/2000 (Mike Bennett): Forgot to return matrix */ MATRIX *joinMat(MATRIX *first, MATRIX *second) { int m, n, a, b; if(first->m != second->m) return NULL; n = first->n; resizeMat(first, first->m, first->n + second->n); for(m = 0; m < first->m; m++) for(a = n, b = 0; a < first->n; a++, b++) first->me[m][a] = second->me[m][b]; return(first); } /* * Purpose: * Clear memory used by matrix * * Parameters: * Matrix to free the memory of * * Returns: * NONE * * History: * 15/04/2000 (Mike Bennett): Created function * 07/06/2000 (Mike Bennett): Free memory in the MATRIX struct */ void freeMat(MATRIX *matrix) { int i; for(i = 0; i < matrix->m; i++) free(matrix->me[i]); free(matrix->me); free(matrix); } /* * Purpose: * Print the matrix to stdout * * Parameters: * Matrix to print * * Returns: * NONE * * History: * 15/04/2000 (Mike Bennett): Created function * 10/06/2000 (Mike Bennett): Got rid of printing floats * 16/05/2000 (Mike Bennett): Made print out comma's */ void printMat(MATRIX *matrix) { int m, n; printf("\n\nMatrix:\n"); for(n = 0; n < matrix->n; n++) { for(m = 0; m < matrix->m; m++) if(n == 0 && m == 0) printf(" %d", matrix->me[m][n]); else printf(",%d", matrix->me[m][n]); printf("\n"); } } /* * Purpose: * Print a VECTOR to stdout * * Parameters: * Vector to print * * Returns: * NONE * * Note: * As Simon rightly pointed this code doesn't belong in this file, * but in honesty it doesn't have a better home at the moment so * we'll let it get cosy here :) (Mike Bennet) * * History: * 02/08/2000 (Simon Hart): Created function */ void printVec(VECTOR *v) { int i; printf("\n\nVector:\n"); for(i = 0; v[i] != DIR_NONE; i++) { switch(v[i]) { case DIR_N: printf("N "); break; case DIR_NE: printf("NE "); break; case DIR_E: printf("E "); break; case DIR_SE: printf("SE "); break; case DIR_S: printf("S "); break; case DIR_SW: printf("SW "); break; case DIR_W: printf("W "); break; case DIR_NW: printf("NW "); break; default: printf("\nWarning: Invalid vector %d\n",v[i]); } } printf("\n"); } wayv-0.3/src/aimath.h0000644000175000017500000000324207716664121013212 0ustar nicknick/* wayV - NGUI (Next Generation User Interfaces) * * Copyright (C) 2000-2003 Mike Bennett (smoog at stressbunny dot com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Purpose: * Present generic interface to maths required * for ai (at this stage neural net) */ #ifndef __AIMATH_H__ #define __AIMATH_H__ /* Loosely based on the MAT in Meschach */ typedef struct { int m; int n; int **me; } MATRIX; typedef char VECTOR; MATRIX *normMat(MATRIX *); void setMat(MATRIX *, int); int pdaMat(MATRIX *, int); MATRIX *denormMat(MATRIX *); MATRIX *createMat(int, int); MATRIX *copyMat(MATRIX *, MATRIX *); MATRIX *cloneMat(MATRIX *); MATRIX *addMat(MATRIX *, MATRIX *); MATRIX *subMat(MATRIX *, MATRIX *); MATRIX *mulMat(MATRIX *, MATRIX *); MATRIX *transMat(MATRIX *); MATRIX *resizeMat(MATRIX *, int, int); MATRIX *rescaleMat(MATRIX *, int, int); int cmpMat(MATRIX *, MATRIX *); MATRIX *joinMat(MATRIX *, MATRIX *); void freeMat(MATRIX *); void printMat(MATRIX *); void printVec(VECTOR *); #endif /* __AIMATH_H__ */ wayv-0.3/src/backend.c0000644000175000017500000001022607716664137013340 0ustar nicknick/* wayV - NGUI (Next Generation User Interfaces) * * Copyright (C) 2000-2003 Mike Bennett (smoog at stressbunny dot com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Purpose: * Backend for wayV */ #include #include #include #include "gesture.h" #include "display.h" #include "setup.h" #include "process.h" #include "ai.h" #include "misc.h" #include "../config.h" int main(int argc, char **argv) { GDISPLAY *video, *feedback; GPOINT *gPoints; XEvent event; WSETUP *wayv; WGESTURE *gaction; MATRIX *gesture; VECTOR *vector; int gPosition = 0; char *file; printf("wayV version %s\n", VERSION); /* Decide what configuration file to open */ if(argc != 2) file = strdup(SETUPFILE); else file = strdup(argv[1]); if((wayv = readSetup(file)) == NULL) exit(BAD); // writeSetup(wayv, SETUPOUT); /* Setup the display */ if(!(video = setupDrawable(wayv->pretty, wayv->pretty->window, argc, argv))) { printf("Cannot connected to X server\n"); return BAD; } /* Setup the mouse/pointer as an input device */ setupPointer(wayv, video); /* Allocate memory to store the gesture points */ gPoints = setupGPoints(wayv->universe->maxgpoints); if(wayv->pretty->display[0] == 'i') handleDrawableWindow(video, MAP); setupSignals(); /* Process the events */ while(1) { XNextEvent(video->display, &event); switch(event.type) { case MotionNotify: if(gPosition < wayv->universe->maxgpoints) { gPoints[gPosition].x = event.xmotion.x; gPoints[gPosition].y = event.xmotion.y; if(wayv->pretty->display[0] == 'y') writePixels(video, (int)gPoints[gPosition-1].x - GDEF_BORDER, (int)gPoints[gPosition-1].y - GDEF_BORDER, (int)gPoints[gPosition].x - GDEF_BORDER, (int)gPoints[gPosition].y - GDEF_BORDER); else if(wayv->pretty->display[0] == 'i') writePixels(video, (int)gPoints[gPosition-1].x, (int)gPoints[gPosition-1].y, (int)gPoints[gPosition].x, (int)gPoints[gPosition].y); gPosition++; } break; case ButtonPress: if(wayv->pretty->display[0] == 'y') handleDrawableWindow(video, MAP); gPosition = 0; gPoints[gPosition].x = event.xbutton.x; gPoints[gPosition].y = event.xbutton.y; gPosition++; break; case ButtonRelease: if(wayv->pretty->display[0] == 'y') handleDrawableWindow(video, UNMAP); gPoints[gPosition].x = GEND; gPoints[gPosition].y = GEND; gesture = gridGPoints(gPoints, wayv->universe->xgrid, wayv->universe->ygrid); vector = vectGPoints(gPoints, wayv->universe->xgrid, wayv->universe->ygrid, wayv->universe->maxvectors); printf("\n\n=======Gesture======="); printMat(gesture); printVec(vector); if(wayv->pretty->display[0] != 'n') handleDrawableWindow(video, CLEAR); if((gaction = findGesture(wayv, gesture, vector, wayv->think))) { printf("Is Action : %s\n", gaction->name); performAction(wayv, gaction, video, gPoints); /* Fork off program to handle feedback window */ if(wayv->pretty->feedback[0] == 'y' && fork() == 0) { feedback = writeText(gaction->action); waitMilli(wayv->pretty->wait); handleDrawableWindow(feedback, DESTROY); close(ConnectionNumber(video->display)); setsid(); exit(BAD); } } freeMat(gesture); free(vector); break; case ClientMessage: if(event.xclient.data.l[0] == video->wmdelete) { closeDisplay(video); exit(GOOD); } break; } } } wayv-0.3/src/defines.h0000644000175000017500000000306107716664156013373 0ustar nicknick/* wayV - NGUI (Next Generation User Interfaces) * * Copyright (C) 2000-2003 Mike Bennett (smoog at stressbunny dot com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Purpose: * Code wide defines and configuration information */ #ifndef __DEFINES_H__ #define __DEFINES_H__ #define PDA_REFUSE 100 #define SETUPFILE SETUPPATH"/wayv.conf" #define SETUPOUT "wayv.conf.temp" #define SETUPSIZE 1000000 #define MAXSUBS 350 #define LINEMAX 512 /*=================DON'T CHANGE BELOW HERE=================*/ #include #define GOOD 1 #define BAD 0 #define TRUE 0 #define FALSE !TRUE #define UNSETINT -1 /* Unset Int */ #define UNSETUINT 0 /* Unset Unsigned Int */ #define UNSETCHAR NULL /* Unset Char */ #define DIR_NONE 0 #define DIR_N 1 #define DIR_NE 3 #define DIR_E 2 #define DIR_SE 6 #define DIR_S 4 #define DIR_SW 12 #define DIR_W 8 #define DIR_NW 9 #endif /* __DEFINES_H__ */ wayv-0.3/src/display.c0000644000175000017500000003020707716664172013416 0ustar nicknick/* wayV - NGUI (Next Generation User Interfaces) * * Copyright (C) 2000-2003 Mike Bennett (smoog at stressbunny dot com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Purpose: * Provide high level functionality required for manipulating * the display and related aspects. The API should be * platform independent for porting to other platforms * later */ #include #include #include "display.h" #include "../config.h" #ifdef HAVE_X_TEST #include #endif /* HAVE_X_TEST */ /* * Purpose: * Setup the video display * * Parameters: * NONE * * Returns: * GDISPLAY structure with display, screen, width and height * complete * * History: * 21/02/2001 (Mike Bennett): Created */ GDISPLAY *createDisplay() { GDISPLAY *video; /* Create a display structure and set to defaults */ video = (GDISPLAY *)malloc(sizeof(GDISPLAY)); video->display = UNSETCHAR; video->dwidth = UNSETUINT; video->dheight = UNSETUINT; video->screen = UNSETINT; video->window = UNSETINT; video->gcontext = UNSETCHAR; video->font = UNSETCHAR; /* Open the display */ if(!(video->display = XOpenDisplay(XDisplayName(NULL)))) return NULL; video->screen = DefaultScreen(video->display); getDisplayInfo(video, GDISPLAY_WIDTH); getDisplayInfo(video, GDISPLAY_HEIGHT); return video; } /* * Purpose: * Setup the video display and windows required * * Parameters: * 1st - WPRETTY structure with display style info * * Returns: * GDISPLAY * to setup display * NULL on error * * History: * 12/03/2001 (Mike Bennett): Rewrote to setup the input window * correctly and handle managed windows * 18/03/2001 (Mike Bennett): Ammended to set window properties and * receive the close window client message * 26/03/2001 (Mike Bennett): Put a 1 pixel black border around a * non-managed always on top input window */ GDISPLAY *setupDrawable(WPRETTY *style, int *window, int argc, char **argv) { GDISPLAY *video; XSetWindowAttributes winAttrib; XSizeHints sizeHints; unsigned long mask, col_border, col_background; unsigned int width_border; if(!(video = createDisplay())) return NULL; if(!video->display || video->screen == UNSETINT) return NULL; /* Default input window look - may be overrode below */ width_border = 5; col_border = WhitePixel(video->display, video->screen); col_background = WhitePixel(video->display, video->screen); mask = CWSaveUnder; winAttrib.save_under = True; /* Let the X server take care of whats underneath this window, rather than the client applications, it'll also prevent needless Expose events. NOTE: Not all X servers support this */ /* Don't let the window manager try to set borders or title bars, etc */ if(style->managed[0] == 'n' || style->display[0] == 'y') { mask |= CWOverrideRedirect; winAttrib.override_redirect = True; } /* Setup an input window to have a 1 pixel black border */ if(style->display[0] == 'i') { width_border = 1; col_border = BlackPixel(video->display, video->screen); } /* How should the window shape and position be setup? */ if(style->display[0] == 'y') { window[WI_X] = 0; window[WI_Y] = 0; window[WI_WIDTH] = video->dwidth; window[WI_HEIGHT] = video->dheight; } video->window = XCreateSimpleWindow(video->display, RootWindow(video->display, video->screen), window[WI_X], window[WI_Y], window[WI_WIDTH], window[WI_HEIGHT], width_border, col_border, col_background); video->gcontext = XCreateGC(video->display, video->window, 0, NULL); if(style->display[0] == 'y') { mask |= CWBackPixmap; winAttrib.background_pixmap = None; /* Don't set a background, i.e. transparent window */ XSetFunction(video->display, video->gcontext, GXinvert); } XChangeWindowAttributes(video->display, video->window, mask, &winAttrib); // XSetForeground(video->display, video->gcontext, // BlackPixel(video->display, video->screen)); XSetLineAttributes(video->display, video->gcontext, style->size, LineSolid, CapButt, JoinMiter); sizeHints.x = window[WI_X]; sizeHints.y = window[WI_Y]; sizeHints.width = window[WI_WIDTH]; sizeHints.height = window[WI_HEIGHT]; sizeHints.flags = PPosition | PSize; XSetStandardProperties(video->display, video->window, PACKAGE, PACKAGE, (Pixmap)NULL, argv, argc, &sizeHints); /* Receive the close window client message */ if(style->display[0] == 'i') { video->wmdelete = XInternAtom(video->display, "WM_DELETE_WINDOW", False); XSetWMProtocols(video->display, video->window, &video->wmdelete, True); } return video; } /* * Purpose: * Setup the video display and windows required * * Parameters: * 1st - video structure * * Returns: * NONE * * History: * 10/05/2000 (Mike Bennett): Rewrote */ void closeDisplay(GDISPLAY *video) { XCloseDisplay(video->display); } /* * Purpose: * Get display specific information. NOTE the display must * be opened and screen must be set * * Parameters: * 1st - video structure to fill in with data required * 2nd - type of data to get * * Returns: * GOOD on success * BAD on failure * * History: * 13/05/2000 (Mike Bennett): Created */ int getDisplayInfo(GDISPLAY *video, int itype) { if(!video->display || video->screen == UNSETINT) return BAD; switch(itype) { case GDISPLAY_HEIGHT: video->dwidth = DisplayWidth(video->display, video->screen); video->dwidth -= (2 * GDEF_BORDER); break; case GDISPLAY_WIDTH: video->dheight = DisplayHeight(video->display, video->screen); video->dheight -= (2 * GDEF_BORDER); break; default: return BAD; break; } return GOOD; } /* * Purpose: * Handle key window actions on a display * * Parameters: * 1st - filled in video structure * 2nd - action to perform * * Returns: * GOOD on success * BAD on failure * * History: * 13/05/2000 (Mike Bennett): Created * 21/02/2001 (Mike Bennett): Renamed and rewrote * 12/03/2001 (Mike Bennett): Add CLEAR * */ int handleDrawableWindow(GDISPLAY *video, int action) { if(!video->display || !video->window) return BAD; switch(action) { case MAP: XMapRaised(video->display, video->window); XFlush(video->display); break; case UNMAP: XUnmapWindow(video->display, video->window); XFlush(video->display); break; case CLEAR: XClearWindow(video->display, video->window); break; case DESTROY: if(video->font) XFreeFont(video->display, video->font); if(video->display) XDestroyWindow(video->display, video->window); if(video->gcontext) XFreeGC(video->display, video->gcontext); if(video->display != UNSETCHAR) XCloseDisplay(video->display); free(video); break; } return GOOD; } /* * Purpose: * Setup the video display and windows required * * Parameters: * 1st - general wayv data configuration * 2nd - video display setup * * Returns: * GOOD on success * BAD on failure * * History: * 04/03/2001 (Mike Bennett): Updated for input box * 22/03/2001 (Mike Bennett): Moved into display.c and renamed * 16/04/2001 (Mike Bennett): Added else check for input windows */ int setupPointer(WSETUP *wayv, GDISPLAY *video) { Window win; // XAllowEvents(video->display, AsyncBoth, CurrentTime); if(wayv->pretty->display[0] != 'i') win = DefaultRootWindow(video->display); else win = video->window; XGrabButton(video->display, wayv->launch->pbutton, wayv->launch->kmodifier, win, False, ButtonMotionMask | ButtonPressMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, None); /* We don't want Caps Lock interfering */ XGrabButton(video->display, wayv->launch->pbutton, wayv->launch->kmodifier | KMODLOCK, win, False, ButtonMotionMask | ButtonPressMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, None); return GOOD; } /* * Purpose: * Write text on the display * * Parameters: * 1st - video structure * 2nd - text to display * * Returns: * Pointer to a GDISPLAY structure with text output window * NULL on failure * * History: * 13/02/2001 (Mike Bennett): Created * 21/02/2001 (Mike Bennett): Added create output window * 01/03/2001 (Mike Bennett): Got output window working * correctly */ GDISPLAY *writeText(char *text) { GDISPLAY *video; XSetWindowAttributes winAttrib; int twidth, theight; video = createDisplay(); if((video->font = XLoadQueryFont(video->display, "9x15")) == NULL) { printf("Error: Couldn't load font\n"); return NULL; } twidth = XTextWidth(video->font, text, strlen(text)) + 6; theight = video->font->ascent + video->font->descent + 7; video->window = XCreateSimpleWindow(video->display, RootWindow(video->display, video->screen), (video->dwidth - twidth) >> 1, (video->dheight - theight) >> 1, twidth, theight, 1, WhitePixel(video->display, video->screen), BlackPixel(video->display, video->screen)); winAttrib.override_redirect = True; winAttrib.save_under = True; XChangeWindowAttributes(video->display, video->window, CWOverrideRedirect | CWSaveUnder, &winAttrib); video->gcontext = XCreateGC(video->display, video->window, 0, NULL); XSetForeground(video->display, video->gcontext, WhitePixel(video->display, video->screen)); XSetFont(video->display, video->gcontext, video->font->fid); handleDrawableWindow(video, MAP); XDrawImageString(video->display, video->window, video->gcontext, 3, video->font->ascent + 3, text, strlen(text)); XFlush(video->display); return video; } /* * Purpose: * Write a pixel onto a window * * Parameters: * 1st - video structure to fill in with data required * 2nd - x position to draw the pixel at * 3rd - y position to draw the pixel at * * Returns: * GOOD on success * BAD on failure * * History: * 13/05/2000 (Mike Bennett): Created */ int writePixels(GDISPLAY *video, int x1, int y1, int x2, int y2) { if(!video->display || !video->window) return BAD; /* x1 -= GDEF_BORDER; y1 -= GDEF_BORDER; x2 -= GDEF_BORDER; y2 -= GDEF_BORDER; */ XDrawLine(video->display, video->window, video->gcontext, x1, y1, x2, y2); XFlush(video->display); return GOOD; } /* * Purpose: * Send a key press to a display * * Parameters: * 1st - filled in video display structure * 2nd - key press to send * 3rd - PRESS or RELEASE * * Returns: * GOOD on success * BAD on failure * * History: * 21/03/2001 (Mike Bennett): Coded to deal with special characters * 22/03/2001 (Mike Bennett): Rewrote to use index arrays for specials * 14/04/2001 (Mike Bennett): Rewrote completely to use external user * definable key maps * * Note: * This can easily be optimised in many ways, and REALLY should * be. Anyone want to volunteer? Join the Down with Nasty Code * Now Organisation :) */ int sendKey(WSETUP *wayv, GDISPLAY *video, char *key, int state) { #ifdef HAVE_X_TEST int i; if(!XQueryExtension(video->display, "XTEST", &i, &i, &i)) return BAD; /* Figure out what kind of keypress to send */ for(i = 0; wayv->keymap[i] != NULL; i++) { /* Send a normal key PRESS/RELEASE? */ if(wayv->keymap[i]->normal && strcmp(wayv->keymap[i]->normal, key) == 0) { XTestFakeKeyEvent(video->display, wayv->keymap[i]->kcode, state, 0); break; } /* Send a key PRESS/RELEASE with shift? */ if(wayv->keymap[i]->shift && strcmp(wayv->keymap[i]->shift, key) == 0) { XTestFakeKeyEvent(video->display, XKeysymToKeycode(video->display, XK_Shift_L), state, 0); XTestFakeKeyEvent(video->display, wayv->keymap[i]->kcode, state, 0); break; } } XFlush(video->display); /* XSync(video->display, True); */ #endif /* HAVE_X_TEST */ return GOOD; } wayv-0.3/src/display.h0000644000175000017500000000440607716664205013422 0ustar nicknick/* wayV - NGUI (Next Generation User Interfaces) * * Copyright (C) 2000-2003 Mike Bennett (smoog at stressbunny dot com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Purpose: * Prototypes, defines and structs for display.c */ #ifndef __DISPLAY_H__ #define __DISPLAY_H__ #include #include #include #include "defines.h" #include "setup.h" /* Actions that are performable on a window */ #define MAP 1 #define UNMAP 2 #define DESTROY 3 #define CLEAR 4 #define PBUTTONNONE None /* Defaults for setting up the standard window */ #define GDEF_XWIN 0 #define GDEF_YWIN 0 #define GDEF_BORDER 5 #define KMODNONE None #define KMODSHIFT ShiftMask #define KMODLOCK LockMask #define KMODCONTROL ControlMask #define KMOD1 Mod1Mask #define KMOD2 Mod2Mask #define KMOD3 Mod3Mask #define KMOD4 Mod4Mask #define KMOD5 Mod5Mask /* Type of key press to send */ #define PRESS True #define RELEASE False /* For use by getDisplayInfo on the type of info to get */ #define GDISPLAY_HEIGHT 1 #define GDISPLAY_WIDTH 2 typedef struct { Display *display; unsigned int dwidth, dheight; int screen; Window window; GC gcontext; XFontStruct *font; Atom wmdelete; } GDISPLAY; GDISPLAY *createDisplay(); GDISPLAY *setupDrawable(WPRETTY *, int *, int, char **); void closeDisplay(GDISPLAY *); int getDisplayInfo(GDISPLAY *, int); int setupPointer(WSETUP *, GDISPLAY *); int handleDrawableWindow(GDISPLAY *, int); GDISPLAY *writeText(char *); int writePixels(GDISPLAY *, int, int, int, int); int sendKey(WSETUP *, GDISPLAY *, char *, int); #endif /* __DISPLAY_H__ */ wayv-0.3/src/gesture.c0000644000175000017500000001447207716664227013436 0ustar nicknick/* wayV - NGUI (Next Generation User Interfaces) * * Copyright (C) 2000-2003 Mike Bennett (smoog at stressbunny dot com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Purpose: * Code that handles the gesture based aspects * including converting from one form to another */ #include #include "defines.h" #include "setup.h" #include "gesture.h" #include "aimath.h" /* * Purpose: * Allocate the memory required to store a GPOINT * * Parameters: * NONE * * Returns: * Pointer to memory allocated to hold a GPOINT * * History: * 12/04/2000 (Mike Bennett): Created function * 08/08/2000 (Simon Hart): Add memory check code */ GPOINT *allocGPoint() { GPOINT *gPoint; if ((gPoint = (GPOINT *)malloc(sizeof(GPOINT)))==NULL) { fputs("No memory for gpoint",stderr); exit(1); } gPoint->x = GEND; gPoint->y = GEND; return gPoint; } /* * Purpose: * Allocate the memory required to store the gestures * * Parameters: * NONE * * Returns: * Pointer to memory allocated to hold up to MAXGPOINTS * of GPOINTs * * History: * 07/04/2000 (Mike Bennett): Created function */ GPOINT *setupGPoints(int maxpoints) { GPOINT *gPoints; int i; gPoints = (GPOINT *)malloc(sizeof(GPOINT) * (maxpoints + 1)); for(i = 0; i < maxpoints; i++) { gPoints[i].x = GEND; gPoints[i].y = GEND; } return gPoints; } /* * Purpose: * Turn a list of 2D GPOINTs into a 2D grid (matrix) * * Parameters: * 1st - Array of 2D GPOINTs * 2nd - number of grid units in x * 3rd - number of grid units in y * * Returns: * Matrix with filled in gesture * NULL on failure * * History: * 07/05/2000 (Mike Bennett): Update to return a MATRIX * 15/06/2000 (Mike Bennett): Fixed bug in rounding of floats, means * gesture matrices are more accurate * 02/08/2000 (Simon Hart): Added code to allow straight liness */ MATRIX *gridGPoints(GPOINT *gPoints, int xGrid, int yGrid) { MATRIX *gMat; int i; float xmax = -1, xmin = 100000000, ymax = -1, ymin = 100000000; float xunit, yunit; gMat = createMat(xGrid, yGrid); /* Work out the x and y max and mins */ for(i = 0; gPoints[i].x != GEND; i++) { if(gPoints[i].x > xmax) xmax = gPoints[i].x; if(gPoints[i].x < xmin) xmin = gPoints[i].x; if(gPoints[i].y > ymax) ymax = gPoints[i].y; if(gPoints[i].y < ymin) ymin = gPoints[i].y; } xunit = (xmax - xmin)/(xGrid - 1); yunit = (ymax - ymin)/(yGrid - 1); /* Need to keep some minimum grid else anything which is not a purely straight line appears to be at 45 degrees.*/ if(xunit > 3 * yunit) yunit = xunit; if(yunit > 3 * xunit) xunit = yunit; /* Scale rule */ /* if(xunit > yunit) yunit = xunit; else xunit = yunit; */ /* Turn x and y into grid positions */ for(i = 0; gPoints[i].x != GEND; i++) { if((gPoints[i].x - xmin) != 0 && xunit != 0) xGrid = float2Int((gPoints[i].x - xmin) / xunit); else xGrid = 0; if((gPoints[i].y - ymin) != 0 && yunit != 0) yGrid = float2Int((gPoints[i].y - ymin) / yunit); else yGrid = 0; gMat->me[xGrid][yGrid] = 1; } return gMat; } /* * Purpose: * Turn a list of points into a set of vectors * * Parameters: * 1st - Array of 2d GPOINTs * 2nd - Number grid units in x * 3rd - Number grid units in y * 4th - Max number of vectors to read * * Returns: * VECTOR, whose array is filled with values of DIR_* * * History: * 03/08/2000 (Simon P Hart): Created function */ VECTOR *vectGPoints(GPOINT *gPoints, int xGrid, int yGrid, int maxvectors) { VECTOR *v; float xmax = -1, xmin = 100000000, ymax = -1, ymin = 100000000; float xunit, yunit; int pxGrid = 0, pyGrid = 0, vec = 0, i; int ndir, pndir=0; if((v=(VECTOR *)malloc(sizeof(VECTOR)*maxvectors))==NULL) { fputs("No mem for vector\n",stderr); exit(1); } /* Work out the x and y max and mins CODE: again*/ for(i = 0; gPoints[i].x != GEND; i++) { if(gPoints[i].x > xmax) xmax = gPoints[i].x; if(gPoints[i].x < xmin) xmin = gPoints[i].x; if(gPoints[i].y > ymax) ymax = gPoints[i].y; if(gPoints[i].y < ymin) ymin = gPoints[i].y; } xunit = (xmax - xmin)/(xGrid - 1); yunit = (ymax - ymin)/(yGrid - 1); if(xunit > 3 * yunit) yunit = xunit; if(yunit > 3 * xunit) xunit = yunit; for(i = 0; gPoints[i].x != GEND; i++) { if((gPoints[i].x - xmin) != 0 && xunit != 0) xGrid = float2Int((gPoints[i].x - xmin) / xunit); else xGrid = 0; if((gPoints[i].y - ymin) != 0 && yunit != 0) yGrid = float2Int((gPoints[i].y - ymin) / yunit); else yGrid = 0; if(i == 0) { pxGrid = xGrid; pyGrid = yGrid; } else { ndir = 0; if(pxGrid > xGrid) ndir += DIR_W; if(pxGrid < xGrid) ndir += DIR_E; if(pyGrid > yGrid) ndir += DIR_N; if(pyGrid < yGrid) ndir += DIR_S; if(ndir != 0) { pxGrid = xGrid; pyGrid = yGrid; if(vec > 0 && pndir != ndir) { pndir = ndir; continue; } if(vec > 0 && v[vec-1] == ndir) continue; v[vec++] = ndir; pndir = ndir; if(vec == (maxvectors-1)) { fputs ("Warning: too many vectors. Increase universe.maxvectors\n",stderr); break; } } } } v[vec] = DIR_NONE; return v; } /* * Purpose: * Turn a float into an integer after rounding it. Note that * this only works with positive floats. * * Parameters: * Float to round * * Returns: * Rounded integer of the float * * History: * 15/06/2000 (Mike Bennett): Created function */ int float2Int(register float convert) { register int ans; /* Righto, when we cast a float to an int we loose everything after * the decimal point - going to take advantage of that...oh clever ;) */ ans = (int)convert; convert -= ans; if(convert >= 0.5) ans++; return ans; } wayv-0.3/src/gesture.h0000644000175000017500000000235507716664252013436 0ustar nicknick/* wayV - NGUI (Next Generation User Interfaces) * * Copyright (C) 2000-2003 Mike Bennett (smoog at stressbunny dot com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Purpose: * Prototypes and structures for gesture related functions */ #ifndef __GESTURE_H__ #define __GESTURE_H__ #include "defines.h" #include "aimath.h" #define GEND -1 typedef struct { float x; float y; } GPOINT; GPOINT *allocGPoint(); GPOINT *setupGPoints(int); MATRIX *gridGPoints(GPOINT *, int, int); VECTOR *vectGPoints(GPOINT *, int, int, int); int float2Int(float); #endif /* __GESTURE_H__ */ wayv-0.3/src/process.c0000644000175000017500000001317607716664325013435 0ustar nicknick/* wayV - NGUI (Next Generation User Interfaces) * * Copyright (C) 2000-2003 Mike Bennett (smoog at stressbunny dot com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Purpose: * Perform actions and manage signals */ #include #include #include #include #include #include #include "defines.h" #include "aimath.h" #include "setup.h" #include "display.h" #include "gesture.h" #include "process.h" /* * Purpose: * Carry out a list of actions in a gesture struct * * Parameters: * 1st - General wayV configuration structure, wanted for action list * 2nd - Gesture structure * 3rd - Display to close in child * 4th - X & Y points travelled by the mouse, used by the WARP sub-action * * Returns: * Child process ID or 0 if none or an error * * History: * 14/04/2001 (Mike Bennett): Got keypress' properly working * 16/04/2001 (Mike Bennett): Composite keypress', etc working properly * 17/04/2001 (Mike Bennett): Removed signal handling setup */ void performAction(WSETUP *wayv, WGESTURE *gesture, GDISPLAY *video, GPOINT *gpoints) { int i, n, a, b; char **temp, *single, *comp; /* Action names have to be at least one character in length */ if(!strlen(gesture->action)) return; /* Try and find an action to perform */ for(i = 0; wayv->actions[i] != NULL && strcmp(wayv->actions[i]->name, gesture->action) != 0; i++); if(wayv->actions[i] == NULL) return; /* Carry out sub-actions */ for(n = 0; wayv->actions[i]->subs[n] != NULL; n++) { switch(wayv->actions[i]->subs[n]->perform) { case WA_EXEC: temp = createCmdLine(wayv->actions[i]->subs[n]->tparam, video, gpoints); if((child = fork()) == 0) { /* Child process to tidy up */ close(ConnectionNumber(video->display)); setsid(); execvp(temp[0], temp); exit(BAD); /* Shouldn't get to this point */ } else printf("Child ID: %d\n", child); /* Free up the parsed commandline */ for(a = 0; temp[a] != NULL; a++) free(temp[a]); free(temp); break; case WA_WARP: XWarpPointer(video->display, None, video->window, 0, 0, 0, 0, gpoints[0].x, gpoints[0].y); break; case WA_DELAY: sleep(wayv->actions[i]->subs[n]->nparam); break; case WA_KILL: if(child != 0) kill(child, SIGKILL); break; case WA_SENDKEY: /* This shouldn't be doing parsing here - but I'll leave it for now... */ for(a = 0; (single = getDelimText(wayv->actions[i]->subs[n]->tparam, &a, ' ')) != NULL;) { if(strchr(single, '+')) { for(b = 0; (comp = getDelimText(single, &b, '+')) != NULL;) { sendKey(wayv, video, comp, PRESS); free(comp); } for(b = 0; (comp = getDelimText(single, &b, '+')) != NULL;) { sendKey(wayv, video, comp, RELEASE); free(comp); } } else { sendKey(wayv, video, single, PRESS); sendKey(wayv, video, single, RELEASE); } free(single); } break; } } return; } /* * Purpose: * Setup the commandline as required by execvp, and also replace * certain values, i.e. WAYV_MOUSE_START * * Parameters: * 1st - text version of the command line * * Returns: * Command line broken into parts using space as the separator * * History: * 21/08/2000 (Mike Bennett): Created function * 01/03/2001 (Mike Bennett): Updated to support WAYV_MOUSE_END * 15/03/2001 (Mike Bennett): Memory over run bug fix */ char **createCmdLine(char *cmdline, GDISPLAY *video, GPOINT *gpoints) { int a, b, i; char *temp, **cmdunits; /* Work out the number of arguments and array length */ for(a = 1, b = 0; (temp = getDelimText(cmdline, &b, ' ')) != NULL; a++) free(temp); /* Create memory for the argument list */ cmdunits = (char **)malloc(sizeof(char *) * (a + 1)); /* Parse the command line and replace keys */ for(a = 0, b = 0; (cmdunits[a] = getDelimText(cmdline, &b, ' ')) != NULL; a++) { if(!strcmp(cmdunits[a], "WAYV_MOUSE_START")) { free(cmdunits[a]); cmdunits[a] = (char *)malloc(20); snprintf(cmdunits[a], 20, "+%d+%d", (int)gpoints[0].x, (int)gpoints[0].y); } else if(!strcmp(cmdunits[a], "WAYV_MOUSE_END")) { free(cmdunits[a]); cmdunits[a] = (char *)malloc(20); for(i = 0; gpoints[i].x != GEND; i++); i--; snprintf(cmdunits[a], 20, "+%d+%d", (int)gpoints[i].x, (int)gpoints[i].y); } } cmdunits[a + 1] = NULL; return cmdunits; } /* * Purpose: * Setup signal handlers for wayV - only manage SIGCHLD at this * stage. * * Parameters: * NONE * * Returns: * NONE * * History: * 17/04/2001 (Mike Bennett): Created function */ void setupSignals() { signal(SIGCHLD, destroyZombies); } /* * Purpose: * Signal handler when a child process dies, basically don't leave * it around as a zombie process. *hehe* funky function name - its a bit * sad that there's more lines of comments than code :) * * Parameters: * 1st - Signal id * * Returns: * NONE * * History: * 13/06/2000 (Mike Bennett): Created function */ void destroyZombies(int sigNum) { wait(NULL); } wayv-0.3/src/process.h0000644000175000017500000000230507716664346013435 0ustar nicknick/* wayV - NGUI (Next Generation User Interfaces) * * Copyright (C) 2000-2003 Mike Bennett (smoog at stressbunny dot com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Purpose: * Header for process.c */ #ifndef __PROCESS_H__ #define __PROCESS_H__ #include "setup.h" #include "display.h" #include "gesture.h" int child; void performAction(WSETUP *, WGESTURE *, GDISPLAY *, GPOINT *); void destroyZombies(int); char **createCmdLine(char *, GDISPLAY *, GPOINT *); void setupSignals(); void destroyZombies(int); #endif /* __PROCESS_H__ */ wayv-0.3/src/setup.c0000644000175000017500000006674607716664372013134 0ustar nicknick/* wayV - NGUI (Next Generation User Interfaces) * * Copyright (C) 2000-2003 Mike Bennett (smoog at stressbunny dot com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Purpose: * Code that handles the setup and configuration * * Query: (SPH) Instead of reading vectors from the ini file, they could be * created from the shapes. But it's more flexible to specify them. */ #include #include #include #include #include "defines.h" #include "setup.h" #include "gesture.h" #include "display.h" #include "../config.h" /* * Purpose: * Single function for taking care of reading the setup file, * including parsing it and setting up various data structures * * Parameters: * Char * with the filename and path * * Returns: * Pointer to filled in WSETUP struct * NULL on failure to open the setup file * * History: * 16/06/2000 (Mike Bennett): Got rid of the brain malloc * 14/09/2001 (Mike Bennett): Updated for keymap * 21/09/2001 (Mike Bennett): Set version to NULL so its able to crudely * detect whether read in a wayv config file */ WSETUP *readSetup(char *fileName) { WSETUP *wayv; /* Setup up the structs and arrays, i.e. the linked lists */ wayv = (WSETUP *)malloc(sizeof(WSETUP)); wayv->version = NULL; wayv->gestures = (WGESTURE **)malloc(sizeof(WGESTURE *) * (MAXSUBS + 1)); wayv->orbits = (WORBIT **)malloc(sizeof(WORBIT *) * (MAXSUBS + 1)); wayv->actions = (WACTION **)malloc(sizeof(WACTION *) * (MAXSUBS + 1)); wayv->keymap = (WKEYMAP **)malloc(sizeof(WKEYMAP *) * (MAXSUBS + 1)); /* Do various things with the configuration file */ if(parseSetup(wayv, fileName) == NULL) return NULL; processSetup(wayv); return wayv; } /* * Purpose: * Write out the setup to a file * * Parameters: * WSETUP * with filled in data * Char * with the filename and path * * Returns: * GOOD or BAD * * History: * 16/06/2000 (Mike Bennett): No longer writing out brains * 02/08/2000 (Simon Hart): Added support for vectors * 28/02/2001 (Mike Bennett): Updated for Pretty feedback */ int writeSetup(WSETUP *wayv, char *fileName) { FILE *setupFile; int i; /* Create and open the output file */ if((setupFile = fopen(fileName,"w")) == NULL) return BAD; /* Write out the default header */ fprintf(setupFile, SF_HEADER); fprintf(setupFile, SF_VERSION, VERSION); fprintf(setupFile, SF_THINK, wayv->think); /* Write out the launch information */ if(wayv->launch->pbutton != PBUTTONNONE) { fprintf(setupFile, SF_LAUNCH, wayv->launch->pbutton); } else fprintf(setupFile, SF_LAUNCH, 0); /* Write out the pretty/display sub-section */ fprintf(setupFile, SF_PRETTY, wayv->pretty->display, wayv->pretty->color, wayv->pretty->size, wayv->pretty->feedback, wayv->pretty->wait); /* Write out the universe sub-section */ fprintf(setupFile, SF_UNIVERSE, wayv->universe->griddle, wayv->universe->xgrid, wayv->universe->ygrid, wayv->universe->maxgpoints, wayv->universe->maxvectors); /* Write out the gestures sub-sections */ for(i = 0; wayv->gestures[i] != NULL; i++) { /* Make sure the Matrix and ascii representation are in sync */ wayv->gestures[i]->shape = parseMSpace(wayv->gestures[i]->wshape); wayv->gestures[i]->vector = parseVSpace(wayv->gestures[i]->wvector); fprintf(setupFile, SF_GESTURE, wayv->gestures[i]->name, wayv->gestures[i]->desc, wayv->gestures[i]->shape, wayv->gestures[i]->action, wayv->gestures[i]->vector); } /* Write out the orbits sub-sections */ for(i = 0; wayv->orbits[i] != NULL; i++) fprintf(setupFile, SF_ORBIT, wayv->orbits[i]->name, wayv->orbits[i]->path); /* Write out the actions sub-setions */ for(i = 0; wayv->actions[i] != NULL; i++) fprintf(setupFile, SF_ACTION, wayv->actions[i]->name, wayv->actions[i]->process, wayv->actions[i]->match); fclose(setupFile); return GOOD; } /* * Purpose: * Takes in a setup structure and convert various fields to specific * data structures, i.e. list of x and y points to GPOINTs list, text * matrix to matrix data structure * * Parameters: * Partially completed setup structure * * Returns: * Pointer to filled in WSETUP struct * * History: * 20/05/2000 (Mike Bennett): Extended to parse process lists * 16/05/2000 (Mike Bennett): Got rid of brain code * 03/08/2000 (Simon P Hart): Extended to parse vectors */ WSETUP *processSetup(WSETUP *wayv) { int i; /* Convert ascii gesture matrices to data matrices */ for(i = 0; wayv->gestures[i] != NULL; i++) { wayv->gestures[i]->wshape = parseGSpace(wayv->gestures[i]->shape, wayv->universe->xgrid, wayv->universe->ygrid); wayv->gestures[i]->wvector = parseVector(wayv->gestures[i]->vector, wayv->universe->maxvectors); } /* Convert orbits to GPoints list */ for(i = 0; wayv->orbits[i] != NULL; i++) wayv->orbits[i]->wpath = parseOrbitPath(wayv->orbits[i]->path); /* Convert action processes into component sub-actions */ for(i = 0; wayv->actions[i] != NULL; i++) wayv->actions[i]->subs = parseProcess(wayv->actions[i]->process); return wayv; } /* * Purpose: * Read in the configuration file and parse. * * Parameters: * WSETUP structure to fill in with configuration values * Filename to parse * * Returns: * Pointer to filled in WSETUP struct * * History: * 04/03/2001 (Mike Bennett): Ammended Pretty.display for input box * 12/03/2001 (Mike Bennett): Support for turning on whether the input * window is managed by the window manager * 19/04/2001 (Mike Bennett): Report an error if cannot find the * configuration file and updated to look in * the right place for the keymap * 08/04/2003 (Nick Rusnov): Allow any mouse button to be used to activate * * Notes: * When the parser is rewritten make sure and setup everything with * default values */ WSETUP *parseSetup(WSETUP *wayv, char *fileName) { char *setup, *temp, *nullstr, *type, *file; int i, n, a, pGesture = 0, pAction = 0, pOrbit = 0; FILE *setupFile; if((setupFile = fopen(fileName,"r")) == NULL) { printf("Error: Cannot open the configuration file '%s'\n", fileName); return NULL; } nullstr=(char *)malloc(1); *nullstr='\0'; /* never explictly freed */ temp = (char *)malloc(LINEMAX); setup = (char *)malloc(SETUPSIZE); *setup = '\0'; /* Read the config file into memory and strip out * the excess stuff */ while(fgets(temp, LINEMAX-1, setupFile) != NULL) { if((strlen(temp) + strlen(setup)) < SETUPSIZE) strncat(setup, temp, strlen(temp)); } fclose(setupFile); free(temp); temp = stripPadding(setup); free(setup); setup = temp; /* Now do the parsing */ for(i = 0; i < strlen(setup); i++) { switch(setup[i]) { case 'G': temp = getKeyText(setup, &i, SKT_NONE); wayv->gestures[pGesture] = (WGESTURE *)malloc(sizeof(WGESTURE)); wayv->gestures[pGesture]->name = nullstr; wayv->gestures[pGesture]->desc = nullstr; wayv->gestures[pGesture]->shape = nullstr; wayv->gestures[pGesture]->vector = nullstr; wayv->gestures[pGesture]->action = nullstr; for(n = 0; n < strlen(temp); n++) { switch(temp[n]) { case 'n': wayv->gestures[pGesture]->name = getKeyText(temp, &n, SKT_QUOTES); break; case 'd': wayv->gestures[pGesture]->desc = getKeyText(temp, &n, SKT_QUOTES); break; case 's': wayv->gestures[pGesture]->shape = getKeyText(temp, &n, SKT_NONE); break; case 'a': wayv->gestures[pGesture]->action = getKeyText(temp, &n, SKT_QUOTES); break; case 'v': wayv->gestures[pGesture]->vector = getKeyText(temp, &n, SKT_NONE); break; } } pGesture++; free(temp); break; case 'O': temp = getKeyText(setup, &i, SKT_NONE); wayv->orbits[pOrbit] = (WORBIT *)malloc(sizeof(WORBIT)); for(n = 0; n < strlen(temp); n++) { switch(temp[n]) { case 'n': wayv->orbits[pOrbit]->name = getKeyText(temp, &n, SKT_QUOTES); break; case 'p': wayv->orbits[pOrbit]->path = getKeyText(temp, &n, SKT_NONE); break; } } pOrbit++; free(temp); break; case 'A': temp = getKeyText(setup, &i, SKT_NONE); wayv->actions[pAction] = (WACTION *)malloc(sizeof(WACTION)); wayv->actions[pAction]->name = nullstr; wayv->actions[pAction]->process = nullstr; wayv->actions[pAction]->match = nullstr; for(n = 0; n < strlen(temp); n++) { switch(temp[n]) { case 'n': wayv->actions[pAction]->name = getKeyText(temp, &n, SKT_QUOTES); break; case 'p': wayv->actions[pAction]->process = getKeyText(temp, &n, SKT_NONE); break; case 'm': wayv->actions[pAction]->match = getKeyText(temp, &n, SKT_QUOTES); break; } } pAction++; free(temp); break; case 'V': wayv->version = getKeyText(setup, &i, SKT_NONE); break; case 'L': wayv->launch = (WLAUNCH *)malloc(sizeof(WLAUNCH)); wayv->launch->method = nullstr; wayv->launch->pbutton = PBUTTONNONE; wayv->launch->kmodifier = KMODNONE; wayv->launch->method = getKeyText(setup, &i, SKT_QUOTES); for(n = 0; (temp = getCommaText(wayv->launch->method, &n)) != NULL;) { if((strlen(temp) >= 2) && (temp[0] == 'M') && (isdigit(temp[1]))) wayv->launch->pbutton = atoi(&temp[1]); else if(strcmp(temp, "SHIFT") == 0) wayv->launch->kmodifier |= KMODSHIFT; else if(strcmp(temp, "LOCK") == 0) wayv->launch->kmodifier |= KMODLOCK; else if(strcmp(temp, "CONTROL") == 0) wayv->launch->kmodifier |= KMODCONTROL; else if(strcmp(temp, "MOD1") == 0) wayv->launch->kmodifier |= KMOD1; else if(strcmp(temp, "MOD2") == 0) wayv->launch->kmodifier |= KMOD2; else if(strcmp(temp, "MOD3") == 0) wayv->launch->kmodifier |= KMOD3; else if(strcmp(temp, "MOD4") == 0) wayv->launch->kmodifier |= KMOD4; else if(strcmp(temp, "MOD5") == 0) wayv->launch->kmodifier |= KMOD5; free(temp); } break; case 'T': wayv->think = getKeyText(setup, &i, SKT_QUOTES); break; case 'P': temp = getKeyText(setup, &i, SKT_NONE); wayv->pretty = (WPRETTY *)malloc(sizeof(WPRETTY)); wayv->pretty->display = nullstr; wayv->pretty->managed = nullstr; wayv->pretty->color = nullstr; wayv->pretty->size = DEF_PRETTY_SIZE; wayv->pretty->feedback = nullstr; wayv->pretty->wait = DEF_PRETTY_WAIT; for(n = 0; n < 4; n++) wayv->pretty->window[n] = UNSETINT; for(n = 0; n < strlen(temp); n++) { switch(temp[n]) { case 'd': wayv->pretty->display = getKeyText(temp, &n, SKT_NONE); break; case 'm': wayv->pretty->managed = getKeyText(temp, &n, SKT_NONE); break; case 'c': wayv->pretty->color = getKeyText(temp, &n, SKT_NONE); break; case 's': wayv->pretty->size = getKeyNum(temp, &n); break; case 'f': wayv->pretty->feedback = getKeyText(temp, &n, SKT_NONE); break; case 'w': wayv->pretty->wait = getKeyNum(temp, &n); break; } } /* Are we using an input box? */ if(wayv->pretty->display != nullstr && wayv->pretty->display[0] != 'n' && wayv->pretty->display[0] != 'y') { for(n = 0, a = 0; a < 4; a++) wayv->pretty->window[a] = atoi(getCommaText(wayv->pretty->display, &n)); wayv->pretty->display = strdup("input"); } free(temp); break; case 'U': temp = getKeyText(setup, &i, SKT_NONE); wayv->universe = (WUNIVERSE *)malloc(sizeof(WUNIVERSE)); wayv->universe->griddle = nullstr; wayv->universe->xgrid = DEF_UNI_XGRID; wayv->universe->ygrid = DEF_UNI_YGRID; wayv->universe->maxgpoints = DEF_UNI_MAXGPOINTS; wayv->universe->maxvectors = DEF_UNI_MAXVECTORS; for(n = 0; n < strlen(temp); n++) { switch(temp[n]) { case 'g': wayv->universe->griddle = getKeyText(temp, &n, SKT_QUOTES); break; case 'x': wayv->universe->xgrid = getKeyNum(temp, &n); break; case 'y': wayv->universe->ygrid = getKeyNum(temp, &n); break; case 'm': wayv->universe->maxgpoints = getKeyNum(temp, &n); break; case 'v': wayv->universe->maxvectors = getKeyNum(temp, &n); break; } } free(temp); break; case 'I': temp = getKeyText(setup, &i, SKT_NONE); type = file = NULL; for(n = 0; n < strlen(temp); n++) { switch(temp[n]) { case 't': type = getKeyText(temp, &n, SKT_QUOTES); break; case 'f': file = getKeyText(temp, &n, SKT_QUOTES); break; } } free(temp); if(type != NULL && file != NULL) { /* Figure out the path to the keymap. NOTE: This is nasty code - it'll be gone in the next version */ if(!strrchr(file, '/') && (temp = strrchr(fileName, '/'))) { *temp = '\0'; temp = malloc(sizeof(char) * (strlen(fileName) + strlen(file) + 1)); strcpy(temp, fileName); strcat(temp, "/"); strcat(temp, file); free(file); file = temp; } parseInclude(wayv, type, file); free(type); free(file); } break; } } /* Terminate the array with NULL */ wayv->gestures[pGesture] = NULL; wayv->orbits[pOrbit] = NULL; wayv->actions[pAction] = NULL; free(setup); if(wayv->version == NULL || strlen(wayv->version) > 10) { printf("Error: '%s' is not a recognisable wayV configuration file\n", fileName); return NULL; } return wayv; } /* * Purpose: * Strip out the excess characters in a line, includes \t, \r * and space (don't strip space when between "'s) * * Parameters: * Line to strip * * Returns: * Pointer to stripped line * * History: * 08/04/2000 (Mike Bennett): Created function */ char *stripPadding(char *line) { int i, n, length, ignoreSpace = 1; char *clean; clean = (char *)malloc(strlen(line)); for(i = 0, n = 0, length = strlen(line); i < length; i++) { switch(line[i]) { case '\t': case '\r': case ' ': case '\n': if(!ignoreSpace) clean[n++] = line[i]; break; case '#': if(!ignoreSpace) clean[n++] = line[i]; else for(; i < length && line[i] != '\n'; i++); break; case '\\': switch(line[i+1]) { case '"': case '\\': clean[n++] = line[i++]; clean[n++] = line[i]; break; } break; case '"': if(!ignoreSpace) ignoreSpace = 1; else ignoreSpace = 0; default: clean[n++] = line[i]; break; } } clean[n] = '\0'; return clean; } /* * Purpose: * Return the key value as text - btw the line should already * have been fed through stripPadding() * * Parameters: * 1st - String to get key in * 2nd - Position to start finding key * 3rd - Are first and last quotes(") to be stripped out and * only get the text between them? * * Returns: * Pointer to the key * * History: * 08/04/2000 (Mike Bennett): Created function * 23/04/2000 (Mike Bennett): Renamed * 05/06/2000 (Mike Bennett): Added optional stripping of quotes */ char *getKeyText(char *setup, int *position, int strip) { int n, length, i = *position; char *value; /* Find the start of the key data */ for(length = strlen(setup); i < length && setup[i] != '=' && setup[i] != '{'; i++); /* Are we dealing with a subsection? */ if(setup[i] == '{') for(n = ++i; n < length && setup[n] != '}'; n++); else for(n = ++i; n < length && setup[n] != ';'; n++); *position = n; /* Want to get rid of the first and last quote and so only * get the text between them */ if(strip == SKT_QUOTES) { if(setup[i] == '"') i++; else for(; i < length && setup[i] != '"'; i++); if(setup[n] == '"') n--; else for(; n > 0 && setup[n] != '"'; n--); } value = (char *)malloc(n - i + 1); strncpy(value, setup + i, n - i); *(value + n - i) = '\0'; return value; } /* * Purpose: * Return the key value as a number. Btw the line should * already have been fed through stripPadding() * * Parameters: * String to get key in * Position to begin the search * * Returns: * Int with key value or default value if not present * * History: * 23/04/2000 (Mike Bennett): Created function */ int getKeyNum(char *setup, int *position) { int value; char *text; text = getKeyText(setup, position, SKT_NONE); value = atoi(text); free(text); return value; } /* * Purpose: * Get an item from a list where ',' is the value * used to separate tokens in a string * * Parameters: * String to get value in * Position to begin the search * * Returns: * Pointer to the string * * History: * 13/04/2000 (Mike Bennett): Created function * 03/08/2000 (Simon Hart): Memory check */ char *getCommaText(char *setup, int *position) { int length, n = *position, i = *position; char *value; /* Find the start of the key data */ for(length = strlen(setup); n < length && setup[n] != ',' && setup[n] != ';'; n++); if((n - i) <= 0) return NULL; if((value = (char *)malloc(sizeof(char) * (n - i + 1))) == NULL) { fputs("No mem",stderr); exit(1); } strncpy(value, setup + i, n - i); *(value + n - i) = '\0'; *position = n + 1; return value; } /* * Purpose: * Get an item from a list where ' ' (space) is the value * used to separate tokens in a string * * Parameters: * String to get value in * Position to begin the search * * Returns: * Pointer to the string * * History: * 31/07/2000 (Mike Bennett): Created function * 16/04/2001 (Mike Bennett): Renamed to getDelimText from * getSpaceText and made a little * more generic */ char *getDelimText(char *setup, int *position, char delimiter) { int length, n = *position, i = *position; char *value; /* Find the start of the key data */ for(length = strlen(setup); n < length && setup[n] != delimiter; n++); if((n - i) <= 0) return NULL; value = (char *)malloc(sizeof(char) * (n - i + 1)); strncpy(value, setup + i, n - i); *(value + n - i) = '\0'; *position = n + 1; return value; } /* * Purpose: * Get the text between 2 quotes, the quotes used are the first and * last ones found * * Parameters: * 1st - String to quoted text from * * Returns: * Pointer to the text * NULL on failure * * History: * 20/05/2000 (Mike Bennett): Created function */ char *getQuoteText(char *text) { int i, n; char *value; for(i = 0; i < strlen(text) && text[i] != '"'; i++); for(n = strlen(text); n > 0 && text[i] != '"'; n--); /* Dump the quote symbols */ i++; n--; if((n - i) <= 0) return NULL; value = (char *)malloc(n - i + 1); strncpy(value, text + i, n - i); *(value + n - i) = '\0'; return value; } /* * Purpose: * Turn a gesture x,y path in the setup file into a * list of GPOINTs * * Parameters: * List of x and y points in ascii separated by commas * * Returns: * Pointer to the key * * History: * 13/04/2000 (Mike Bennett): Created function * 23/04/2000 (Mike Bennett): Renamed */ GPOINT *parseOrbitPath(char *values) { GPOINT *gPoints; int i, n; char *xValue, *yValue; /* Work out number of points */ for(i = 0, n = 0; i < strlen(values); i++) if(values[i] == ',') n++; n = (n >> 1) + 1; gPoints = setupGPoints(n); /* Walk through the comma delimiter list */ for(i = 0, n = 0; (xValue = getCommaText(values, &i)) != NULL && (yValue = getCommaText(values, &i)) != NULL; n++) { gPoints[n].x = atoi(xValue); gPoints[n].y = atoi(yValue); free(xValue); free(yValue); } gPoints[n].x = GEND; gPoints[n].y = GEND; return gPoints; } /* * Purpose: * Turn a vector string from the setup file into an array * * Parameters: * 1st - String of comma seperated values * 2nd - Maximum number of vectors to read * * Returns: * array of VECTORs * * History: * 03/08/2000 (Simon P Hart): Created Function * 15/03/2001 (Mike Bennett): Bug fix, wasn't counting the number * of input vectors correctly causing a * memory over run */ VECTOR *parseVector(char *values,int maxvectors) { VECTOR *v; int i, n; char *val; /* Work out number of vectors */ for(i = 0, n = 1; i < strlen(values); i++) if(values[i] == ',') n++; n = (n >> 1) + 1; if((v = (VECTOR *)malloc(sizeof(VECTOR) * (n + 1))) == NULL) { fputs("Not enough mem for vectors from setup file\n", stderr); exit(1); } /* Walk through the comma delimiter list. CODE: Not too efficiently. */ for(i = 0, n = 0; (val = getCommaText(values, &i)) != NULL; n++) { if(n == maxvectors) { printf("Error: Increase Universe.vectors to match the maximum number of vectors in Gesture.vector\n"); exit(1); } v[n] = DIR_NONE; if(0 == strcmp(val, "N")) v[n] = DIR_N; if(0 == strcmp(val, "NE")) v[n] = DIR_NE; if(0 == strcmp(val, "E")) v[n] = DIR_E; if(0 == strcmp(val, "SE")) v[n] = DIR_SE; if(0 == strcmp(val, "S")) v[n] = DIR_S; if(0 == strcmp(val, "SW")) v[n] = DIR_SW; if(0 == strcmp(val, "W")) v[n] = DIR_W; if(0 == strcmp(val, "NW")) v[n] = DIR_NW; if(v[n] == DIR_NONE) { printf("Error: invalid direction in vector %s\n",values); exit(1); } free(val); } v[n] = DIR_NONE; return v; } /* * Purpose: * Turn an ascii list for a matrix into a matrix space * * Parameters: * Text string with comma separated list of values * Number of units matrix goes across * Number of units matrix goes down * * Returns: * Pointer filled in matrix * * History: * 23/04/2000 (Mike Bennett): Created function */ MATRIX *parseGSpace(char *values, int x, int y) { MATRIX *matrix; char *num; int i, n, m; /* Create mem for the matrix */ matrix = createMat(x, y); /* Fill in the matrix */ for(i = 0, n = 0; n < matrix->n; n++) { for(m = 0; m < matrix->m; m++) { /* Get the next value */ if((num = getCommaText(values, &i)) != NULL) { matrix->me[m][n] = atoi(num); free(num); } else { matrix->me[m][n] = 0; } } } return matrix; } /* * Purpose: * Turn a matrix into an ascii comma delimited representation * * Parameters: * Original Matrix * * Returns: * Pointer to comma delimited ascii representation * * History: * 06/05/2000 (Mike Bennett): Created function * 08/05/2000 (Mike Bennett): Fixed silly memory error * 15/06/2000 (Mike Bennett): Slight change to be cleaner output */ char *parseMSpace(MATRIX *matrix) { char *ascii_rep; int i, n, m, no_chars = 100; ascii_rep = (char *)malloc(no_chars); /* Walk through the matrix converting */ for(i = 0, n = 0; n < matrix->n; n++) { for(m = 0; m < matrix->m; m++) { /* Make sure we don't run out of memory */ if(strlen(ascii_rep) >= (no_chars - 50)) { no_chars <<= 1; ascii_rep = (char *)realloc(ascii_rep, no_chars); } if(m == 0 && n == 0) sprintf(ascii_rep, "\n\t %d", (int)matrix->me[m][n]); else sprintf(ascii_rep, "%s, %d", ascii_rep, (int)matrix->me[m][n]); } strcat(ascii_rep, "\n\t"); } return ascii_rep; } /* * Purpose: * Turn a vector into an ascii comma delimited representation * * Parameters: * Array of VECTORs * * Returns: * Pointer to comma delimited ascii representation * * History: * 03/08/2000 (Simon P Hart): Created function (Copy and Paste :) */ char *parseVSpace(VECTOR *v) { char *ascii_rep; int i, n, no_chars = 100; if((ascii_rep = (char *)malloc(no_chars * sizeof(char))) == NULL) { fputs("no mem\n", stderr); exit(1); } /* Walk through the vector converting */ for(i = 0, n = 0; v[n] != DIR_NONE; n++) { /* Make sure we don't run out of memory */ if(strlen(ascii_rep) >= (no_chars - 50)) { no_chars <<= 1; if((ascii_rep = (char *)realloc(ascii_rep, no_chars * sizeof(char))) == NULL) { fputs("no mem\n", stderr); exit(1); } } if(n == 0) sprintf(ascii_rep, "\n\t %d", (int)v[0]); else sprintf(ascii_rep, "%s, %d", ascii_rep, (int)v[n]); } strcat(ascii_rep, "\n"); return ascii_rep; } /* * Purpose: * Turn a process list into a list of sub-actions * * Parameters: * Text string with comma separated list of sub-actions * * Returns: * Pointer to filled in WACTION_PROCESS list * * History: * 21/08/2000 (Mike Bennett): Moved command line parsing elsewhere * 01/03/2001 (Mike Bennett): Added the kill command * 03/03/2001 (Mike Bennett): Updated to handle sending keypress' * * NOTE: * Might be a bug in the code below, counting of comma's is * probably out by one (MB) */ WA_PROCESS **parseProcess(char *process) { WA_PROCESS **subs; int i, n; char *saction; /* Work out the number of sub-actions in this process */ for(i = 0, n = 0; getCommaText(process, &i) != NULL; n++); subs = (WA_PROCESS **)malloc(sizeof(WA_PROCESS *) * (n + 1)); /* Walk through the process list breaking down each sub-action */ for(i = 0, n = 0; (saction = getCommaText(process, &i)) != NULL; n++) { switch(saction[0]) { /* Was it an execute sub-action? */ case 'e': subs[n] = (WA_PROCESS *)malloc(sizeof(WA_PROCESS)); subs[n]->perform = WA_EXEC; subs[n]->tparam = getQuoteText(saction); break; /* Was it a warp pointer back to start position sub-action? */ case 'w': subs[n] = (WA_PROCESS *)malloc(sizeof(WA_PROCESS)); subs[n]->perform = WA_WARP; break; /* Was it a delay for X milliseconds sub-action? */ case 'd': subs[n] = (WA_PROCESS *)malloc(sizeof(WA_PROCESS)); subs[n]->perform = WA_DELAY; subs[n]->nparam = atoi(getQuoteText(saction)); break; /* Was it kill the last started process */ case 'k': subs[n] = (WA_PROCESS *)malloc(sizeof(WA_PROCESS)); subs[n]->perform = WA_KILL; break; /* Was it send a key press */ case 's': subs[n] = (WA_PROCESS *)malloc(sizeof(WA_PROCESS)); subs[n]->perform = WA_SENDKEY; subs[n]->tparam = getQuoteText(saction); break; } } subs[n] = NULL; return subs; } /* * Purpose: * Read in an include file and parse it * * Parameters: * 1st - general wayV config structure * 2nd - type of include file, i.e. Keymap * 3rd - file name that has include information * * Returns: * GOOD on success * BAD on failure * * History: * 14/04/2001 (Mike Bennett): Created * 19/04/2001 (Mike Bennett): Ammended for clearer error reporting */ int parseInclude(WSETUP *wayv, char *type, char *fileName) { char *temp, *token; FILE *setupFile; int i; if(strcmp(type, WF_KEYMAP) == 0) { temp = malloc(LINEMAX); if((setupFile = fopen(fileName, "r")) == NULL) { printf("Error: Cannot open the keymap file '%s'\n", fileName); return BAD; } for(i = 0; fgets(temp, LINEMAX - 1, setupFile) != NULL; i++) { wayv->keymap[i] = (WKEYMAP *)malloc(sizeof(WKEYMAP)); wayv->keymap[i]->kcode = 0; wayv->keymap[i]->normal = NULL; wayv->keymap[i]->shift = NULL; if((token = strtok(temp, " ")) != NULL) wayv->keymap[i]->kcode = (KeyCode)atoi(token); if((token = strtok(NULL, " ")) != NULL) { if(token[strlen(token) - 1] == '\n') token[strlen(token) - 1] = '\0'; wayv->keymap[i]->normal = strdup(token); } if((token = strtok(NULL, " ")) != NULL) { if(token[strlen(token) - 1] == '\n') token[strlen(token) - 1] = '\0'; wayv->keymap[i]->shift = strdup(token); } } wayv->keymap[i] = NULL; fclose(setupFile); free(temp); return GOOD; } return BAD; } wayv-0.3/src/setup.h0000644000175000017500000001051607716664414013116 0ustar nicknick/* wayV - NGUI (Next Generation User Interfaces) * * Copyright (C) 2000-2003 Mike Bennett (smoog at stressbunny dot com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Purpose: * Handle the setup and configuration */ #ifndef __SETUP_H__ #define __SETUP_H__ #include #include "gesture.h" #include "aimath.h" /* Type of sub-actions that are possible, used in WA_PROCESS struct */ #define WA_EXEC 1 /* Execute the program listed in tparam */ #define WA_WARP 2 /* Move the mouse back to the start position */ #define WA_DELAY 3 /* Delay nparam seconds */ #define WA_KILL 4 /* Kill last wayV started program */ #define WA_SENDKEY 5 /* Send key press */ /* Different type of include files */ #define WF_KEYMAP "Keymap" /* Parameters for setup.c:getKeyText(), SKT = Strip Key Text */ #define SKT_NONE 0 #define SKT_QUOTES 1 /* Defines for accessing window box information */ #define WI_X 0 #define WI_Y 1 #define WI_WIDTH 2 #define WI_HEIGHT 3 /* Defaults */ #define DEF_UNI_XGRID 8 #define DEF_UNI_YGRID 8 #define DEF_UNI_MAXGPOINTS 2000 #define DEF_UNI_MAXVECTORS 10 #define DEF_PRETTY_SIZE 2 #define DEF_PRETTY_WAIT 250 /* Structure of the configuration file */ typedef struct { char *method; unsigned int pbutton; unsigned int kmodifier; } WLAUNCH; typedef struct { char *display; char *managed; char *color; int size; char *feedback; int wait; int window[4]; } WPRETTY; typedef struct { char *griddle; int xgrid; int ygrid; int maxgpoints; int maxvectors; } WUNIVERSE; typedef struct { KeyCode kcode; char *normal; char *shift; } WKEYMAP; /* Component parts of an action process */ typedef struct { int perform; char *tparam; int nparam; } WA_PROCESS; typedef struct { char *name; char *process; char *match; WA_PROCESS **subs; } WACTION; typedef struct { char *name; char *desc; char *shape; char *action; char *vector; MATRIX *wshape; VECTOR *wvector; } WGESTURE; typedef struct { char *name; char *path; GPOINT *wpath; } WORBIT; typedef struct { char *version; WLAUNCH *launch; char *think; WPRETTY *pretty; WUNIVERSE *universe; WKEYMAP **keymap; WGESTURE **gestures; WORBIT **orbits; WACTION **actions; } WSETUP; /* Function prototypes */ int writeSetup(WSETUP *, char *); WSETUP *readSetup(char *); WSETUP *processSetup(WSETUP *); WSETUP *parseSetup(WSETUP *, char *); char *stripPadding(char *); char *getKeyText(char *, int *, int); int getKeyNum(char *, int *); char *getCommaText(char *, int *); char *getDelimText(char *, int *, char); char *getQuoteText(char *); GPOINT *parseOrbitPath(char *); VECTOR *parseVector(char *, int); MATRIX *parseGSpace(char *, int, int); char *parseMSpace(MATRIX *); char *parseVSpace(VECTOR *); WA_PROCESS **parseProcess(char *); int parseInclude(WSETUP *, char *, char *); /* Fields in the setup file */ #define SF_HEADER "# wayV configuration file\n#\n# Comments begin with #\n#\n# Empty lines are ignored\n#\n# Keys must go along the lines of:\n# key = value;\n# each key must be terminated with ;\n\n" #define SF_VERSION "Version = %s;\n" #define SF_THINK "Think = \"%s\";\n" #define SF_LAUNCH "Launch = \"M%d\";\n\n" #define SF_PRETTY "Pretty {\n\tdisplay = %s;\n\tcolor = %s;\n\tsize = %d;\n\tfeedback = %s;\n\twait = %d;\n}\n\n" #define SF_UNIVERSE "Universe {\n\tgriddle = \"%s\";\n\txgrid = %d;\n\tygrid = %d;\n\tmaxgpoints = %d;\n\tmaxvectors = %d;\n}\n\n" #define SF_GESTURE "Gesture {\n\tname = \"%s\";\n\tdescription = \"%s\";\n\tshape = %s;\n\taction = \"%s\";\n\tvector = %s;\n}\n\n" #define SF_ORBIT "Orbit {\n\tname = \"%s\";\n\tpath = %s;\n}\n\n" #define SF_ACTION "Action {\n\tname = \"%s\";\n\tprocess = %s;\n\tmatch = \"%s\";\n}\n\n" #endif /* __SETUP_H__ */ wayv-0.3/src/wayv.conf0000644000175000017500000007747307716664472013465 0ustar nicknick#---------------------------------------------------------------------- # wayV configuration file (version 0.3) # # Updated by Mike Bennett (smoog at stressbunny dot com) on # the 14/08/2003 # # Main website: http://www.stressbunny.com/wayv # # Comments begin with # # # Empty lines are ignored # # Keys must go along the lines of: # key = value; # each key must be terminated with "; # # Read "HOWTO-wayv-config" and "HOWTO-wayv-keymap" for more information # on configuring wayV. Alternatively try accessing the man pages via # the commands "man wayv" and "man wayv.conf" # # Process actions available: # exec "COMMAND_LINE" = execute command line # wait "X_SECONDS" = wait X number of seconds # warp = jump mouse back to starting position # kill = kill last command execute through wayV # sendkey "KEYMAP_ALIASES" = send keypress' # #---------------------------------------------------------------------- Version = 0.3; #---------------------------------------------------------------------- # Below are various gesture matching rules #---------------------------------------------------------------------- Think = "Pda"; # Point Density Analysis # Think = "Pda & Vector"; # Point Density Analysis with direction #---------------------------------------------------------------------- # Below are the Launch's, all but one commented out # # Its recommend that you use the X command xmodmap to map the # windows key (on newer keyboards) to one of the MOD keys and # use that in combination with M1 to Launch wayV gesture capture #---------------------------------------------------------------------- # Launch = "M1"; # Mouse Button 1 # Launch = "M1,SHIFT"; # Mouse Button 1 and the Shift key # Launch = "M1,MOD1"; # Mouse Button 1 and Mod1 (run 'xmodmap' to see # your Mod1 to Mod5 setup) Launch = "M2"; # Mouse Button 2 # Launch = "M3"; # Mouse Button 3 # Launch = "M3,SHIFT"; # Mouse Button 3 and the Shift key Pretty { display = yes; # display = no; # display = 0, 0, 100, 100; managed = no; color = ff0056; size = 4; feedback = yes; wait = 500; } Universe { griddle = "Standard"; xgrid = 8; ygrid = 8; maxgpoints = 2000; vectors = 10; } #---------------------------------------------------------------------- # Other configuration files that should be included #---------------------------------------------------------------------- Include { type = "Keymap"; file = "DEFAULT.wkey"; } #---------------------------------------------------------------------- # Data recording the gesture shapes and actions #---------------------------------------------------------------------- Gesture { name = "A"; description = "A"; shape = 0, 0, 0, 0, 1, 0, 0, 0 , 0, 0, 0, 1, 1, 1, 0, 0 , 0, 0, 0, 1, 0, 1, 0, 0 , 0, 0, 1, 0, 0, 1, 0, 0 , 0, 1, 0, 0, 0, 0, 1, 0 , 0, 1, 0, 0, 0, 0, 1, 0 , 1, 1, 0, 0, 0, 0, 1, 1 , 1, 0, 0, 0, 0, 0, 0, 1 ; vector = NE, SE; action = "Action A"; } Gesture { name = "B"; description = "B"; shape = 0, 1, 1, 1, 1, 0, 0, 0 , 1, 1, 0, 0, 1, 1, 0, 0 , 1, 1, 0, 0, 0, 1, 0, 0 , 1, 1, 0, 1, 1, 1, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1 , 1, 1, 0, 0, 0, 0, 1, 1 , 1, 1, 0, 0, 1, 1, 1, 0 , 1, 1, 1, 1, 1, 0, 0, 0 ; vector = N, E, SE, S, W, SE, SW; action = "Action B"; } Gesture { name = "Second B"; description = "Second B"; shape = 0, 1, 1, 1, 1, 1, 0, 0 , 0, 1, 1, 0, 0, 1, 1, 0 , 0, 1, 0, 0, 0, 1, 1, 0 , 0, 1, 1, 1, 1, 1, 0, 0 , 0, 1, 0, 0, 0, 1, 1, 1 , 0, 1, 0, 0, 0, 0, 0, 1 , 0, 1, 1, 1, 1, 1, 1, 1 , 1, 1, 0, 0, 0, 0, 0, 0 ; vector = N, E, SE, S, SW, SE, S, W; action = "Action B"; } Gesture { name = "Third B"; description = "Third B"; shape = 0, 0, 1, 1, 1, 0, 0, 0 , 0, 1, 1, 0, 0, 1, 1, 0 , 1, 1, 0, 0, 0, 0, 1, 0 , 1, 1, 1, 1, 1, 1, 1, 0 , 1, 1, 0, 1, 1, 1, 1, 1 , 1, 1, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 1, 1 , 1, 1, 1, 1, 1, 1, 1, 0 ; vector = N, E, SE, S, SW, SE, S, W; action = "Action B"; } Gesture { name = "Fourth B"; description = "Fourth B"; shape = 0, 0, 1, 1, 1, 1, 0, 0 , 1, 1, 0, 0, 0, 0, 1, 1 , 1, 1, 0, 0, 0, 0, 1, 1 , 1, 1, 1, 1, 1, 1, 0, 0 , 1, 0, 0, 0, 0, 1, 1, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 1, 1, 1, 0 , 1, 1, 1, 1, 0, 0, 0, 0 ; vector = N, E, SE, S, SW, SE, S, W; action = "Action B"; } Gesture { name = "Fifth B"; description = "Fifth B"; shape = 0, 1, 1, 1, 1, 1, 0, 0 , 0, 1, 0, 0, 0, 1, 0, 0 , 0, 1, 0, 0, 0, 1, 0, 0 , 1, 1, 1, 1, 1, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 1, 1 , 1, 1, 0, 0, 0, 0, 0, 1 , 1, 1, 0, 0, 0, 0, 1, 1 , 1, 1, 1, 1, 1, 1, 0, 0 ; vector = N, E, SE, S, SW, SE, S, W; action = "Action B"; } Gesture { name = "C"; description = "C"; shape = 0, 0, 0, 1, 1, 1, 1, 0 , 0, 1, 1, 1, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 1, 0, 0, 0, 0, 0 , 0, 0, 0, 1, 1, 1, 1, 1 ; vector = W, SW, S, SE, E; action = "Action C"; } Gesture { name = "D"; description = "D"; shape = 1, 1, 1, 1, 1, 1, 0, 0 , 1, 0, 0, 0, 0, 1, 1, 0 , 1, 0, 0, 0, 0, 0, 1, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 1, 1, 1 , 1, 0, 0, 0, 1, 1, 0, 0 , 1, 1, 1, 1, 1, 0, 0, 0 ; vector = N, E, SE, SW, W; action = "Action D"; } Gesture { name = "Second D"; description = "Second D"; shape = 0, 1, 1, 1, 0, 0, 0, 0 , 0, 1, 0, 0, 1, 1, 1, 0 , 0, 1, 0, 0, 0, 0, 1, 1 , 0, 1, 0, 0, 0, 0, 0, 1 , 0, 1, 0, 0, 0, 0, 0, 1 , 0, 1, 0, 0, 0, 0, 1, 1 , 0, 1, 1, 1, 1, 1, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 ; vector = N, E, SE, SW, W; action = "Action D"; } Gesture { name = "E"; description = "E"; shape = 0, 0, 1, 1, 1, 1, 1, 0 , 0, 1, 1, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 1, 1, 1, 1, 1, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 1, 1, 1, 1, 1, 1 ; vector = W, E, W, E; action = "Action E"; } Gesture { name = "Second E"; description = "Second E"; shape = 0, 0, 1, 1, 1, 1, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 1, 1, 1, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 1, 1, 1, 1, 1, 1 ; vector = W, E, W, E; action = "Action E"; } Gesture { name = "Third E"; description = "Third E"; shape = 0, 0, 1, 1, 1, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 0, 0, 1, 1, 1, 1, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 1, 0, 0, 0, 0, 0 , 0, 0, 0, 1, 0, 1, 1, 1 ; vector = W, E, W, E; action = "Action E"; } Gesture { name = "F"; description = "F"; shape = 1, 1, 1, 1, 1, 1, 1, 1 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 ; vector = N, E; action = "Action F"; } Gesture { name = "G"; description = "G"; shape = 0, 0, 0, 1, 1, 1, 0, 0 , 0, 0, 1, 1, 0, 0, 0, 0 , 0, 1, 1, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 1, 1, 1, 1 , 1, 0, 0, 0, 0, 0, 1, 0 , 1, 1, 0, 0, 0, 1, 1, 0 , 0, 1, 1, 1, 1, 1, 0, 0 ; vector = W, SW, E, N, W; action = "Action G"; } Gesture { name = "Second G"; description = "Second G"; shape = 0, 0, 0, 1, 1, 1, 0, 0 , 0, 0, 1, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 1, 1, 1, 1, 1 , 1, 0, 0, 0, 1, 1, 0, 0 , 1, 0, 0, 0, 0, 1, 0, 0 , 1, 1, 0, 0, 1, 1, 0, 0 , 0, 1, 1, 1, 1, 0, 0, 0 ; action = "Action G"; } Gesture { name = "Third G"; description = "Third G"; shape = 0, 0, 1, 1, 1, 1, 0, 0 , 0, 1, 1, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 1, 1, 1, 1, 1 , 1, 0, 0, 0, 1, 0, 0, 0 , 0, 1, 0, 0, 1, 0, 0, 0 , 0, 0, 1, 1, 1, 0, 0, 0 ; vector = W, SW, E, N, E; action = "Action G"; } Gesture { name = "h"; description = "h"; shape = 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 1, 1, 1, 1, 0, 0 , 1, 1, 0, 0, 0, 1, 1, 0 , 1, 1, 0, 0, 0, 0, 1, 0 , 1, 1, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 ; vector = S, N, E, S; action = "Action h"; } Gesture { name = "Second h"; description = "Second h"; shape = 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 1, 1, 1, 1, 1, 0 , 1, 1, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 ; vector = S, N, E, S; action = "Action h"; } Gesture { name = "i"; description = "i"; shape = 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 ; vector = S; action = "Action i"; } Gesture { name = "J"; description = "J"; shape = 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 1, 0 , 1, 0, 0, 0, 0, 1, 1, 0 , 1, 1, 1, 0, 0, 1, 0, 0 , 0, 0, 1, 1, 1, 0, 0, 0 ; vector = S, W; action = "Action J"; } Gesture { name = "K"; description = "K"; shape = 0, 0, 0, 0, 0, 0, 1, 1 , 0, 1, 1, 0, 0, 0, 1, 1 , 1, 0, 1, 1, 1, 0, 1, 0 , 1, 0, 0, 0, 1, 1, 1, 0 , 1, 0, 0, 0, 1, 1, 0, 0 , 1, 1, 0, 1, 1, 1, 0, 0 , 0, 1, 1, 0, 0, 0, 1, 0 , 0, 0, 0, 0, 0, 0, 1, 1 ; vector = SW, N, SE; action = "Action K"; } Gesture { name = "Second K"; description = "Second K"; shape = 0, 1, 1, 1, 0, 0, 1, 0 , 1, 0, 0, 1, 1, 0, 1, 0 , 1, 0, 0, 0, 1, 1, 0, 0 , 1, 0, 0, 0, 1, 0, 0, 0 , 0, 1, 1, 1, 0, 1, 0, 0 , 0, 0, 0, 0, 0, 0, 1, 0 , 0, 0, 0, 0, 0, 0, 1, 0 , 0, 0, 0, 0, 0, 0, 0, 1 ; vector = ; action = "Action K"; } Gesture { name = "Third K"; description = "Third K"; shape = 0, 0, 0, 0, 0, 0, 1, 0 , 0, 0, 0, 0, 0, 1, 0, 0 , 1, 1, 1, 1, 0, 1, 0, 0 , 1, 0, 0, 0, 1, 1, 0, 0 , 1, 0, 0, 0, 1, 1, 0, 0 , 0, 1, 1, 1, 0, 1, 1, 0 , 0, 0, 0, 0, 0, 0, 1, 1 , 0, 0, 0, 0, 0, 0, 0, 1 ; vector = ; action = "Action K"; } Gesture { name = "L"; description = "L"; shape = 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1 ; vector = S, E ; action = "Action L"; } Gesture { name = "M"; description = "M"; shape = 0, 1, 1, 1, 1, 1, 0, 0 , 1, 1, 0, 1, 1, 1, 1, 0 , 1, 0, 0, 1, 0, 0, 1, 0 , 1, 0, 0, 1, 0, 0, 1, 1 , 1, 0, 0, 1, 0, 0, 0, 1 , 1, 0, 0, 1, 0, 0, 0, 1 , 1, 0, 0, 1, 0, 0, 0, 1 , 1, 0, 0, 1, 0, 0, 0, 1 ; vector = ; action = "Action M"; } Gesture { name = "Second M"; description = "Second M"; shape = 0, 1, 1, 0, 0, 0, 0, 0 , 1, 0, 1, 0, 0, 0, 0, 0 , 1, 0, 0, 1, 1, 1, 1, 0 , 1, 0, 0, 1, 1, 0, 0, 1 , 1, 0, 0, 1, 0, 0, 0, 1 , 1, 0, 0, 1, 0, 0, 0, 1 , 0, 0, 0, 1, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 ; vector = ; action = "Action M"; } Gesture { name = "Third M"; description = "Third M"; shape = 0, 0, 0, 0, 1, 1, 1, 0 , 1, 1, 0, 0, 1, 0, 1, 1 , 1, 0, 1, 1, 0, 0, 0, 1 , 1, 0, 1, 1, 0, 0, 0, 1 , 1, 0, 0, 1, 0, 0, 0, 1 , 1, 0, 0, 1, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 ; vector = ; action = "Action M"; } Gesture { name = "N"; description = "N"; shape = 1, 0, 0, 0, 0, 0, 0, 1 , 1, 1, 0, 0, 0, 0, 0, 1 , 1, 0, 1, 0, 0, 0, 0, 1 , 1, 0, 0, 1, 1, 0, 0, 1 , 1, 0, 0, 0, 1, 1, 0, 1 , 1, 0, 0, 0, 0, 1, 1, 1 , 1, 0, 0, 0, 0, 0, 1, 1 , 1, 0, 0, 0, 0, 0, 0, 1 ; vector = N, SE, N; action = "Action N"; } Gesture { name = "Second N"; description = "Second N"; shape = 1, 0, 0, 0, 0, 0, 0, 1 , 1, 1, 0, 0, 0, 0, 0, 1 , 1, 1, 0, 0, 0, 0, 0, 1 , 1, 0, 1, 0, 0, 0, 0, 1 , 1, 0, 0, 1, 0, 0, 0, 1 , 1, 0, 0, 0, 1, 1, 0, 1 , 1, 0, 0, 0, 0, 1, 0, 1 , 0, 0, 0, 0, 0, 0, 1, 1 ; vector = N, SE, N; action = "Action N"; } Gesture { name = "Third N"; description = "Third N"; shape = 0, 0, 1, 0, 0, 0, 0, 0 , 0, 1, 1, 0, 0, 0, 0, 1 , 0, 0, 1, 0, 0, 0, 0, 1 , 0, 1, 0, 1, 0, 0, 0, 1 , 0, 1, 0, 1, 0, 0, 0, 1 , 1, 1, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 1, 1, 0 , 0, 0, 0, 0, 0, 0, 1, 0 ; vector = N, SE, N; action = "Action N"; } Gesture { name = "O"; description = "O"; shape = 0, 0, 1, 1, 1, 0, 0, 0 , 0, 1, 1, 0, 1, 1, 0, 0 , 1, 1, 0, 0, 0, 0, 1, 0 , 1, 0, 0, 0, 0, 0, 1, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 1, 0, 0, 0, 0, 1, 1 , 0, 1, 1, 1, 1, 1, 1, 0 ; vector = ; action = "Action O"; } Gesture { name = "Second O"; description = "Second O"; shape = 0, 0, 0, 0, 1, 1, 0, 0 , 0, 0, 0, 1, 0, 1, 1, 0 , 0, 1, 1, 0, 0, 0, 1, 1 , 0, 1, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 1, 1, 0, 0, 0, 0, 1, 1 , 0, 0, 1, 1, 1, 1, 0, 0 ; vector = ; action = "Action O"; } Gesture { name = "P"; description = "P"; shape = 1, 1, 1, 1, 1, 1, 0, 0 , 1, 1, 0, 0, 0, 0, 1, 1 , 1, 1, 0, 0, 0, 0, 1, 1 , 1, 1, 1, 1, 1, 1, 1, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 ; vector = ; action = "Action P"; } Gesture { name = "Second P"; description = "Second P"; shape = 1, 1, 1, 1, 0, 0, 0, 0 , 1, 0, 0, 0, 1, 1, 0, 0 , 1, 0, 0, 0, 0, 0, 1, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 1, 1, 1, 1, 1, 1, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 ; vector = ; action = "Action P"; } Gesture { name = "Third P"; description = "Third P"; shape = 0, 0, 0, 1, 1, 1, 1, 0 , 0, 0, 1, 1, 0, 0, 0, 1 , 0, 1, 1, 0, 0, 0, 0, 1 , 0, 1, 0, 0, 0, 0, 0, 1 , 0, 1, 1, 1, 1, 1, 1, 1 , 1, 1, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 ; vector = ; action = "Action P"; } Gesture { name = "Q"; description = "Q"; shape = 0, 0, 1, 1, 1, 1, 1, 1 , 0, 1, 1, 0, 1, 0, 0, 0 , 1, 1, 0, 0, 0, 1, 0, 0 , 1, 0, 0, 0, 0, 1, 0, 0 , 1, 0, 0, 0, 0, 1, 0, 0 , 1, 0, 0, 0, 0, 1, 0, 0 , 1, 1, 0, 0, 1, 1, 0, 0 , 0, 1, 1, 1, 1, 0, 0, 0 ; vector = ; action = "Action Q"; } Gesture { name = "Second Q"; description = "Other Q"; shape = 0, 0, 0, 1, 0, 0, 0, 0 , 0, 0, 1, 1, 1, 1, 1, 1 , 0, 1, 1, 0, 0, 1, 0, 0 , 1, 0, 0, 0, 0, 1, 0, 0 , 1, 0, 0, 0, 0, 1, 0, 0 , 1, 0, 0, 0, 0, 1, 0, 0 , 1, 1, 0, 0, 0, 1, 0, 0 , 0, 1, 1, 1, 1, 0, 0, 0 ; vector = ; action = "Action Q"; } Gesture { name = "R"; description = "R"; shape = 0, 1, 1, 1, 1, 1, 0, 0 , 1, 1, 0, 0, 0, 0, 1, 1 , 1, 1, 0, 0, 0, 0, 0, 1 , 1, 1, 1, 1, 1, 1, 1, 0 , 1, 1, 0, 1, 1, 0, 0, 0 , 1, 1, 0, 0, 1, 1, 0, 0 , 1, 0, 0, 0, 0, 1, 1, 0 , 1, 0, 0, 0, 0, 0, 1, 0 ; vector = ; action = "Action R"; } Gesture { name = "Second R"; description = "Second R"; shape = 0, 0, 1, 1, 1, 1, 0, 0 , 1, 1, 0, 0, 0, 1, 1, 0 , 1, 0, 0, 0, 0, 0, 1, 0 , 1, 1, 1, 0, 1, 1, 1, 0 , 1, 0, 1, 1, 0, 0, 0, 0 , 1, 0, 0, 1, 1, 0, 0, 0 , 1, 0, 0, 0, 0, 1, 1, 0 , 1, 0, 0, 0, 0, 0, 0, 1 ; vector = ; action = "Action R"; } Gesture { name = "Third R"; description = "Third R"; shape = 0, 1, 0, 0, 0, 0, 0, 0 , 1, 1, 1, 1, 1, 1, 0, 0 , 1, 1, 0, 0, 0, 1, 0, 0 , 1, 1, 0, 0, 0, 1, 0, 0 , 1, 1, 1, 1, 1, 1, 0, 0 , 1, 1, 1, 1, 1, 0, 0, 0 , 1, 0, 0, 0, 1, 1, 1, 0 , 1, 0, 0, 0, 0, 0, 0, 1 ; vector = ; action = "Action R"; } Gesture { name = "Fourth R"; description = "Fourth R"; shape = 0, 1, 0, 1, 1, 1, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 1 , 1, 1, 1, 1, 1, 1, 0, 0 , 1, 1, 1, 1, 0, 0, 0, 0 , 1, 0, 0, 1, 0, 0, 0, 0 , 1, 1, 0, 0, 1, 0, 0, 0 , 0, 1, 0, 0, 0, 1, 0, 0 , 0, 1, 0, 0, 0, 1, 1, 0 ; vector = ; action = "Action R"; } Gesture { name = "Fifth R"; description = "Fifth R"; shape = 0, 0, 1, 0, 0, 0, 0, 0 , 0, 1, 1, 1, 0, 1, 1, 1 , 1, 1, 1, 0, 0, 0, 0, 1 , 1, 1, 1, 1, 1, 1, 1, 0 , 1, 1, 0, 1, 0, 0, 0, 0 , 1, 0, 0, 0, 1, 1, 0, 0 , 1, 0, 0, 0, 0, 0, 1, 0 , 0, 0, 0, 0, 0, 0, 0, 1 ; vector = ; action = "Action R"; } Gesture { name = "Sixth R"; description = "Sixth R"; shape = 0, 1, 1, 1, 1, 1, 0, 0 , 1, 1, 0, 0, 0, 1, 0, 0 , 1, 1, 1, 1, 1, 1, 0, 0 , 1, 1, 1, 1, 0, 0, 0, 0 , 0, 1, 0, 0, 1, 1, 0, 0 , 1, 1, 0, 0, 0, 1, 1, 0 , 1, 1, 0, 0, 0, 0, 1, 1 , 1, 0, 0, 0, 0, 0, 0, 1 ; vector = ; action = "Action R"; } Gesture { name = "S"; description = "S"; shape = 0, 0, 1, 1, 1, 1, 0, 0 , 0, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 1, 1, 1, 1, 0, 0 , 0, 0, 0, 0, 0, 1, 1, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 1, 1, 1 , 1, 1, 1, 1, 1, 1, 0, 0 ; vector = ; action = "Action S"; } Gesture { name = "Second S"; description = "Second S"; shape = 0, 1, 1, 1, 1, 1, 1, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 1, 1, 0, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0 , 0, 0, 0, 0, 0, 0, 1, 1 , 1, 1, 1, 0, 0, 0, 0, 1 , 0, 0, 1, 1, 1, 1, 1, 1 ; vector = ; action = "Action S"; } Gesture { name = "Third S"; description = "Third S"; shape = 0, 0, 0, 0, 1, 1, 0, 0 , 0, 0, 1, 1, 0, 0, 0, 0 , 0, 0, 1, 1, 0, 0, 0, 0 , 0, 0, 0, 1, 1, 1, 0, 0 , 0, 0, 0, 0, 0, 1, 1, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 1, 0, 0, 0, 0, 1, 1 , 0, 0, 1, 1, 1, 1, 1, 0 ; vector = ; action = "Action S"; } Gesture { name = "Fourth S"; description = "Fourth S"; shape = 0, 0, 1, 1, 1, 0, 0, 0 , 0, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 1, 0, 0, 0, 0, 0 , 0, 0, 0, 1, 1, 1, 0, 0 , 0, 0, 0, 0, 0, 0, 1, 1 , 0, 0, 0, 0, 1, 1, 0, 0 , 0, 1, 1, 1, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 ; vector = ; action = "Action S"; } Gesture { name = "Fifth S"; description = "Fifth S"; shape = 0, 1, 1, 1, 1, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 1, 1, 0, 0, 0 , 0, 0, 0, 0, 0, 1, 1, 1 , 0, 0, 0, 0, 0, 1, 1, 1 , 1, 1, 1, 1, 1, 0, 0, 0 ; vector = ; action = "Action S"; } Gesture { name = "T"; description = "T"; shape = 1, 1, 1, 1, 1, 1, 1, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 ; vector = E, S; action = "Action T"; } Gesture { name = "U"; description = "U"; shape = 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 1, 1 , 1, 0, 0, 0, 0, 0, 1, 0 , 0, 1, 0, 0, 0, 1, 1, 0 , 0, 1, 1, 0, 1, 1, 0, 0 , 0, 0, 1, 1, 0, 0, 0, 0 ; vector = ; action = "Action U"; } Gesture { name = "Second U"; description = "Second U"; shape = 0, 0, 0, 0, 0, 0, 0, 1 , 0, 1, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 1, 0 , 1, 0, 0, 0, 0, 0, 1, 0 , 1, 0, 0, 0, 0, 0, 1, 0 , 0, 1, 0, 0, 0, 1, 0, 0 , 0, 0, 1, 0, 1, 0, 0, 0 ; vector = ; action = "Action U"; } Gesture { name = "Third U"; description = "Third U"; shape = 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 0, 1, 0, 0, 0, 0, 1, 0 , 0, 1, 0, 0, 0, 0, 1, 0 , 0, 0, 1, 0, 0, 1, 0, 0 , 0, 0, 0, 1, 1, 0, 0, 0 ; vector = ; action = "Action U"; } Gesture { name = "V"; description = "V"; shape = 1, 0, 0, 0, 0, 0, 0, 1 , 1, 1, 0, 0, 0, 0, 1, 1 , 0, 1, 0, 0, 0, 0, 1, 0 , 0, 1, 0, 0, 0, 1, 1, 0 , 0, 0, 1, 0, 0, 1, 0, 0 , 0, 0, 1, 1, 0, 1, 0, 0 , 0, 0, 0, 1, 1, 0, 0, 0 , 0, 0, 0, 1, 1, 0, 0, 0 ; vector = SE, NE; action = "Action V"; } Gesture { name = "Second V"; description = "Second V"; shape = 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 1 , 0, 1, 0, 0, 0, 0, 1, 1 , 0, 1, 0, 0, 0, 0, 1, 0 , 0, 1, 0, 0, 0, 1, 1, 0 , 0, 0, 1, 0, 0, 1, 0, 0 , 0, 0, 1, 0, 1, 0, 0, 0 , 0, 0, 0, 1, 0, 0, 0, 0 ; vector = SE, NE; action = "Action V"; } Gesture { name = "W"; description = "W"; shape = 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 0, 1, 0, 0, 0, 0, 1, 0 , 0, 1, 0, 0, 0, 0, 1, 0 , 0, 1, 0, 1, 0, 0, 1, 0 , 0, 1, 0, 1, 1, 1, 0, 0 , 0, 0, 1, 0, 1, 1, 0, 0 , 0, 0, 1, 0, 0, 1, 0, 0 ; vector = ; action = "Action W"; } Gesture { name = "Second W"; description = "Second W"; shape = 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 1, 1 , 1, 0, 0, 1, 0, 0, 1, 0 , 0, 1, 0, 1, 0, 0, 1, 0 , 0, 1, 1, 1, 0, 0, 0, 0 , 0, 1, 1, 0, 1, 1, 0, 0 , 0, 1, 1, 0, 1, 0, 0, 0 ; vector = ; action = "Action W"; } Gesture { name = "Third W"; description = "Third W"; shape = 1, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 0, 1, 0, 1, 1, 0, 1, 0 , 0, 1, 1, 1, 1, 0, 1, 0 , 0, 0, 1, 0, 0, 1, 0, 0 , 0, 0, 1, 0, 0, 1, 0, 0 , 0, 0, 0, 0, 0, 1, 0, 0 ; vector = ; action = "Action W"; } Gesture { name = "X"; description = "X"; shape = 1, 0, 0, 0, 0, 0, 0, 1 , 0, 1, 1, 0, 0, 0, 1, 1 , 0, 0, 1, 1, 1, 1, 0, 0 , 0, 1, 1, 1, 1, 0, 0, 0 , 0, 1, 0, 0, 1, 1, 0, 0 , 0, 1, 0, 0, 0, 1, 0, 0 , 0, 1, 1, 0, 0, 1, 0, 0 , 0, 0, 1, 1, 1, 1, 0, 0 ; vector = ; action = "Action X"; } Gesture { name = "Second X"; description = "Second X"; shape = 0, 1, 0, 0, 0, 0, 0, 0 , 0, 0, 1, 1, 0, 1, 1, 1 , 0, 0, 1, 1, 1, 0, 0, 0 , 0, 1, 0, 0, 0, 1, 1, 0 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 1, 1 , 0, 1, 1, 1, 1, 1, 0, 0 ; vector = ; action = "Action X"; } Gesture { name = "Third X"; description = "Third X"; shape = 1, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 0, 1, 1 , 0, 1, 1, 0, 1, 1, 0, 0 , 0, 0, 1, 1, 0, 0, 0, 0 , 0, 1, 0, 1, 1, 0, 0, 0 , 1, 0, 0, 0, 1, 0, 0, 0 , 1, 0, 0, 0, 1, 0, 0, 0 , 0, 1, 1, 1, 0, 0, 0, 0 ; vector = ; action = "Action X"; } Gesture { name = "Fourth X"; description = "Fourth X"; shape = 1, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 1, 0, 0, 0, 1, 1 , 0, 0, 0, 1, 1, 1, 1, 0 , 0, 0, 0, 0, 1, 1, 0, 0 , 0, 0, 0, 1, 1, 1, 1, 0 , 0, 0, 0, 1, 0, 0, 1, 0 , 0, 0, 0, 1, 0, 1, 1, 0 , 0, 0, 0, 1, 1, 1, 0, 0 ; vector = ; action = "Action X"; } Gesture { name = "Y"; description = "Y"; shape = 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 1, 0, 0, 0, 0, 1 , 0, 0, 1, 1, 0, 0, 1, 1 , 0, 0, 0, 0, 1, 1, 1, 1 , 0, 0, 0, 0, 0, 0, 1, 1 , 1, 0, 0, 0, 0, 1, 1, 0 , 1, 1, 0, 0, 1, 1, 0, 0 , 0, 1, 1, 1, 1, 0, 0, 0 ; vector = ; action = "Action Y"; } Gesture { name = "Second Y"; description = "Second Y"; shape = 0, 0, 1, 0, 0, 0, 0, 1 , 0, 1, 0, 0, 0, 0, 0, 1 , 0, 0, 1, 1, 1, 1, 1, 1 , 0, 0, 0, 0, 0, 0, 1, 0 , 0, 0, 0, 0, 0, 0, 1, 0 , 1, 0, 0, 0, 0, 0, 1, 0 , 1, 1, 0, 0, 0, 0, 1, 0 , 0, 0, 0, 1, 1, 1, 0, 0 ; vector = ; action = "Action Y"; } Gesture { name = "Third Y"; description = "Third Y"; shape = 0, 1, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 1, 0, 0, 0, 0, 1, 1 , 0, 1, 1, 1, 1, 1, 1, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 0, 1, 1, 0, 0, 0, 1, 0 , 0, 0, 0, 1, 1, 1, 1, 0 ; vector = ; action = "Action Y"; } Gesture { name = "Z"; description = "Z"; shape = 0, 1, 1, 1, 1, 1, 1, 1 , 0, 0, 0, 0, 0, 0, 1, 1 , 0, 0, 0, 0, 0, 1, 0, 0 , 0, 0, 0, 0, 1, 0, 0, 0 , 0, 0, 1, 1, 0, 0, 0, 0 , 0, 0, 1, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 0, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1 ; vector = E, SW, E; action = "Action Z"; } Gesture { name = "Second Z"; description = "Second Z"; shape = 0, 1, 1, 0, 0, 0, 0, 0 , 0, 0, 0, 1, 1, 1, 1, 0 , 0, 0, 0, 0, 0, 1, 1, 0 , 0, 0, 0, 0, 1, 0, 0, 0 , 0, 1, 1, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 1, 1, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 1, 1, 1 ; vector = E, SW, E; action = "Action Z"; } Gesture { name = "Down \"; description = "\"; shape = 1, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 0, 0, 0 , 0, 0, 1, 0, 0, 0, 0, 0 , 0, 0, 0, 1, 0, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 0, 0 , 0, 0, 0, 0, 0, 1, 0, 0 , 0, 0, 0, 0, 0, 0, 1, 0 , 0, 0, 0, 0, 0, 0, 0, 1 ; vector = SE; action = "Dummy"; } Gesture { name = "Up \"; description = "\"; shape = 1, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 0, 0, 0 , 0, 0, 1, 0, 0, 0, 0, 0 , 0, 0, 0, 1, 0, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 0, 0 , 0, 0, 0, 0, 0, 1, 0, 0 , 0, 0, 0, 0, 0, 0, 1, 0 , 0, 0, 0, 0, 0, 0, 0, 1 ; vector = NW; action = "Dummy"; } Gesture { name = "/"; description = "/"; shape = 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 1, 1 , 0, 0, 0, 0, 0, 1, 0, 0 , 0, 0, 0, 0, 1, 0, 0, 0 , 0, 0, 0, 1, 0, 0, 0, 0 , 0, 0, 1, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 ; vector = SW; action = "Action /"; } Gesture { name = "Shape 1"; description = "Shape 1"; shape = 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 1 , 1, 1, 1, 1, 1, 1, 1, 1 ; vector = ; action = "Dummy"; } Gesture { name = "Shape 2"; description = "Shape 2"; shape = 0, 0, 0, 0, 0, 0, 1, 1 , 0, 0, 0, 0, 1, 1, 0, 0 , 0, 0, 1, 1, 1, 0, 0, 0 , 0, 1, 1, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 1, 1, 0, 0, 0, 0 , 0, 0, 0, 1, 1, 1, 0, 0 , 0, 0, 0, 0, 0, 1, 1, 1 ; vector = ; action = "Dummy"; } Gesture { name = "Shape 3"; description = "Shape 3"; shape = 0, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 1, 1, 0, 0, 0, 0 , 0, 0, 0, 1, 1, 1, 0, 0 , 0, 0, 0, 0, 0, 1, 1, 1 , 0, 0, 0, 0, 0, 0, 1, 1 , 0, 0, 0, 1, 1, 1, 0, 0 , 0, 1, 1, 1, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 ; vector = ; action = "Dummy"; } Gesture { name = "Shape 4"; description = "Shape 4"; shape = 1, 1, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 , 1, 0, 1, 0, 0, 0, 0, 0 , 1, 0, 0, 1, 0, 0, 0, 0 , 1, 0, 0, 0, 1, 1, 0, 0 , 1, 0, 0, 0, 0, 1, 1, 0 , 1, 0, 0, 0, 0, 0, 1, 1 , 1, 0, 0, 0, 0, 0, 0, 1 ; vector = ; action = "Dummy"; } Gesture { name = "Shape 5"; description = "Shape 5"; shape = 1, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 1, 0, 0, 0, 0, 0 , 0, 0, 1, 1, 0, 0, 0, 0 , 0, 0, 0, 1, 1, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 0, 0 , 0, 0, 0, 0, 0, 1, 1, 0 , 0, 0, 0, 0, 0, 0, 1, 1 , 1, 1, 1, 1, 1, 1, 1, 1 ; vector = ; action = "Shape 5"; } Gesture { name = "Shape 6"; description = "Shape 6"; shape = 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 1, 1 , 1, 0, 0, 0, 0, 1, 1, 0 , 1, 0, 0, 0, 1, 1, 0, 0 , 1, 0, 0, 1, 1, 0, 0, 0 , 1, 0, 1, 1, 0, 0, 0, 0 , 1, 1, 1, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 ; vector = ; action = "Dummy"; } Gesture { name = "Shape 7"; description = "Shape 7"; shape = 1, 1, 1, 1, 1, 1, 1, 1 , 0, 0, 0, 0, 0, 0, 1, 0 , 0, 0, 0, 0, 0, 1, 1, 0 , 0, 0, 0, 0, 1, 1, 0, 0 , 0, 0, 0, 1, 1, 0, 0, 0 , 0, 0, 1, 1, 0, 0, 0, 0 , 0, 1, 1, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 0, 0, 0 ; vector = ; action = "Dummy"; } Gesture { name = "Shape 8"; description = "Shape 8"; shape = 1, 1, 1, 1, 1, 1, 1, 1 , 1, 1, 0, 0, 0, 0, 0, 0 , 0, 0, 1, 0, 0, 0, 0, 0 , 0, 0, 1, 1, 0, 0, 0, 0 , 0, 0, 0, 1, 1, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 0, 0 , 0, 0, 0, 0, 0, 1, 1, 0 , 0, 0, 0, 0, 0, 0, 1, 1 ; vector = ; action = "Dummy"; } Gesture { name = "Shape 9"; description = "Shape 9"; shape = 1, 0, 0, 0, 0, 0, 0, 1 , 1, 1, 0, 0, 0, 0, 0, 1 , 0, 1, 1, 0, 0, 0, 0, 1 , 0, 0, 1, 1, 0, 0, 0, 1 , 0, 0, 0, 1, 1, 0, 0, 1 , 0, 0, 0, 0, 1, 1, 0, 1 , 0, 0, 0, 0, 0, 1, 1, 1 , 0, 0, 0, 0, 0, 0, 1, 1 ; vector = ; action = "Dummy"; } Gesture { name = "Shape 10"; description = "Shape 10"; shape = 0, 0, 0, 0, 0, 0, 1, 1 , 0, 0, 0, 0, 0, 1, 1, 0 , 0, 0, 0, 0, 1, 1, 0, 0 , 0, 0, 0, 0, 1, 0, 0, 0 , 0, 0, 0, 1, 0, 0, 0, 0 , 0, 0, 1, 0, 0, 0, 0, 0 , 0, 1, 1, 0, 0, 0, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1 ; vector = ; action = "Shape 10"; } Gesture { name = "Shape 11"; description = "Shape 11"; shape = 0, 0, 0, 0, 0, 0, 1, 1 , 0, 0, 0, 0, 0, 1, 1, 1 , 0, 0, 0, 0, 1, 1, 0, 1 , 0, 0, 0, 1, 1, 0, 0, 1 , 0, 0, 1, 1, 0, 0, 0, 1 , 0, 1, 1, 0, 0, 0, 0, 1 , 1, 1, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 ; vector = ; action = "Dummy"; } Gesture { name = "Shape 12"; description = "Shape 12"; shape = 1, 1, 1, 1, 1, 1, 1, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 1, 1, 1, 1, 1, 1, 1 ; vector = ; action = "Dummy"; } Gesture { name = "Shape 13"; description = "Shape 13"; shape = 0, 0, 1, 1, 1, 0, 0, 0 , 0, 1, 1, 1, 1, 1, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 0 , 1, 1, 1, 1, 1, 1, 1, 1 , 1, 1, 1, 1, 1, 1, 1, 1 , 1, 1, 1, 1, 1, 1, 1, 1 , 1, 1, 1, 1, 1, 1, 1, 1 , 0, 1, 1, 1, 1, 1, 1, 0 ; vector = ; action = "Dummy"; } Gesture { name = "Shape 14"; description = "Shape 14"; shape = 0, 0, 1, 1, 1, 0, 0, 0 , 0, 1, 1, 0, 1, 1, 0, 0 , 1, 1, 0, 0, 0, 0, 1, 0 , 1, 0, 0, 0, 0, 0, 1, 1 , 1, 1, 1, 1, 1, 1, 1, 1 , 1, 1, 1, 1, 1, 1, 1, 1 , 1, 1, 1, 1, 1, 1, 1, 1 , 0, 1, 1, 1, 1, 1, 1, 0 ; vector = ; action = "Dummy"; } Gesture { name = "Shape 15"; description = "Shape 15"; shape = 0, 0, 1, 1, 1, 0, 0, 0 , 0, 1, 1, 1, 1, 1, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 0 , 1, 1, 1, 1, 1, 1, 1, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 0, 0, 0, 0, 0, 0, 1 , 1, 1, 0, 0, 0, 0, 1, 1 , 0, 1, 1, 1, 1, 1, 1, 0 ; vector = ; action = "Dummy"; } Gesture { name = "Shape 16"; description = "Shape 16"; shape = 1, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0 ; vector = ; action = "Dummy"; } Gesture { name = "-"; description = "-"; shape = 1, 1, 1, 1, 1, 1, 1, 1 , 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0 ; vector = ; action = "Action -"; } Action { name = "Action A"; process = sendkey "h t t p : Forwardslash Forwardslash w w w . s t r e s s b u n n y . c o m Forwardslash w a y v Return"; match = ""; } Action { name = "Action B"; process = ""; match = ""; } Action { name = "Action C"; process = exec "xcalc"; match = ""; } Action { name = "Action D"; process = exec "dia"; process = ""; match = ""; } Action { name = "Action E"; process = exec "Eterm"; match = ""; } Action { name = "Action F"; process = exec "gftp"; process = ""; match = ""; } Action { name = "Action G"; process = exec "gimp"; match = ""; } Action { name = "Action h"; process = ""; match = ""; } Action { name = "Action i"; process = ""; match = ""; } Action { name = "Action J"; process = exec "jcc"; match = ""; } Action { name = "Action K"; process = ""; match = ""; } Action { name = "Action L"; process = ""; match = ""; } Action { name = "Action M"; process = exec "kmail"; match = ""; } Action { name = "Action N"; process = exec "netscape"; match = ""; } Action { name = "Action O"; process = exec "soffice"; match = ""; } Action { name = "Action P"; process = ""; match = ""; } Action { name = "Action Q"; process = ""; match = ""; } Action { name = "Action R"; process = exec "rxvt -bg black -fg white -fn fixed -sr -st"; match = ""; } Action { name = "Action S"; process = ""; match = ""; } Action { name = "Action T"; process = exec "ktop"; match = ""; } Action { name = "Action U"; process = ""; match = ""; } Action { name = "Action V"; process = exec "gv"; match = ""; } Action { name = "Action W"; process = ""; match = ""; } Action { name = "Action X"; process = exec "xchat"; match = ""; } Action { name = "Action Y"; process = ""; match = ""; } Action { name = "Action Z"; process = ""; match = ""; } Action { name = "Action -"; process = ""; match = ""; } Action { name = "Action /"; process = kill; match = ""; } Action { name = "Shape 1"; process = ""; match = ""; } Action { name = "Shape 2"; process = ""; match = ""; } Action { name = "Shape 3"; process = ""; match = ""; } Action { name = "Shape 4"; process = ""; match = ""; } Action { name = "Shape 5"; process = sendkey "Control_L+Alt_L+Right"; match = ""; } Action { name = "Shape 6"; process = ""; match = ""; } Action { name = "Shape 7"; process = ""; match = ""; } Action { name = "Shape 8"; process = ""; match = ""; } Action { name = "Shape 9"; process = ""; match = ""; } Action { name = "Shape 10"; process = sendkey "Control_L+Alt_L+Left"; match = ""; } Action { name = "Shape 11"; process = ""; match = ""; } Action { name = "Shape 12"; process = ""; match = ""; } Action { name = "Shape 13"; process = ""; match = ""; } Action { name = "Shape 14"; process = ""; match = ""; } Action { name = "Shape 15"; process = ""; match = ""; } Action { name = "Shape 16"; process = ""; match = ""; } Action { name = "Dummy"; process = warp; match = ""; } wayv-0.3/src/misc.c0000644000175000017500000000327707716664273012715 0ustar nicknick/* wayV - NGUI (Next Generation User Interfaces) * * Copyright (C) 2000-2003 Mike Bennett (smoog at stressbunny dot com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Purpose: * Misc functions that don't fall into any particular * category or there ain't enough to create a new separate * classification */ #include #include #include "defines.h" #include "misc.h" /* * Purpose: * Wait a number of milli seconds before returning * * Parameters: * 1st - number of milli seconds to wait * * Returns: * NONE * * NOTE: * There are 1000 milli-seconds in 1 second * * History: * 19/02/2001 (Mike Bennett): Created function */ void waitMilli(long int milli) { struct timeval millisec, elapse; gettimeofday(&millisec, NULL); millisec.tv_usec += milli * 1000; millisec.tv_sec += millisec.tv_usec / 1000000; millisec.tv_usec = millisec.tv_usec % 1000000; for(gettimeofday(&elapse, NULL); elapse.tv_sec < millisec.tv_sec || elapse.tv_usec < millisec.tv_usec; gettimeofday(&elapse, NULL)); } wayv-0.3/src/misc.h0000644000175000017500000000207107716664307012707 0ustar nicknick/* wayV - NGUI (Next Generation User Interfaces) * * Copyright (C) 2000-2003 Mike Bennett (smoog at stressbunny dot com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Purpose: * Misc functions that don't fall into any particular * category or there ain't enough to create a new separate * classification */ #ifndef __MISC_H__ #define __MISC_H__ void waitMilli(long int); #endif /* __MISC_H__ */ wayv-0.3/src/DEFAULT.wkey0000644000175000017500000000127407432563455013571 0ustar nicknick9 Escape 10 1 ! 11 2 Quote 12 3 £ 13 4 $ 14 5 Percent 15 6 ^ 16 7 & 17 8 * 18 9 ( 19 0 ) 20 - _ 21 = + 22 BackSpace 23 Tab 24 q Q 25 w W 26 e E 27 r R 28 t T 29 y Y 30 u U 31 i I 32 o O 33 p P 34 [ { 35 ] } 36 Return 37 Control_L 38 a A 39 s S 40 d D 41 f F 42 g G 43 h H 44 j J 45 k K 46 l L 47 Semicolon : 48 ' @ 49 ` ¬ 50 Shift_L 51 # ~ 52 z Z 53 x X 54 c C 55 v V 56 b B 57 n N 58 m M 59 Comma < 60 . > 61 Forwardslash ? 62 Shift_R 64 Alt_L 65 Space 66 Caps_Lock 67 F1 68 F2 69 F3 70 F4 71 F5 72 F6 73 F7 74 F8 75 F9 76 F10 77 Num_Lock 94 Backslash | 95 F11 96 F12 97 Home 98 Up 99 Page_Up 100 Left 102 Right 103 End 104 Down 105 Page_Down 106 Insert 107 Delete 109 Control_R 111 Print 113 Alt_R wayv-0.3/Makefile.in0000644000175000017500000002557310251424172013053 0ustar nicknick# Makefile.in generated automatically by automake 1.4-p6 from Makefile.am # Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include DESTDIR = pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : CC = @CC@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ datadir = @datadir@ x_includes = @x_includes@ x_libraries = @x_libraries@ AUTOMAKE_OPTIONS = gnu SUBDIRS = src EXTRA_DIST = AUTHORS BUGS COPYING ChangeLog INSTALL NEWS README TODO VERSION ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \ Makefile.am Makefile.in NEWS TODO acconfig.h aclocal.m4 config.guess \ config.h.in config.sub configure configure.in install-sh missing \ mkinstalldirs DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = tar GZIP_ENV = --best all: all-redirect .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status $(ACLOCAL_M4): configure.in cd $(srcdir) && $(ACLOCAL) config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) config.h: stamp-h @if test ! -f $@; then \ rm -f stamp-h; \ $(MAKE) stamp-h; \ else :; fi stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES= CONFIG_HEADERS=config.h \ $(SHELL) ./config.status @echo timestamp > stamp-h 2> /dev/null $(srcdir)/config.h.in: $(srcdir)/stamp-h.in @if test ! -f $@; then \ rm -f $(srcdir)/stamp-h.in; \ $(MAKE) $(srcdir)/stamp-h.in; \ else :; fi $(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h cd $(top_srcdir) && $(AUTOHEADER) @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null mostlyclean-hdr: clean-hdr: distclean-hdr: -rm -f config.h maintainer-clean-hdr: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. @SET_MAKE@ all-recursive install-data-recursive install-exec-recursive \ installdirs-recursive install-recursive uninstall-recursive \ check-recursive installcheck-recursive info-recursive dvi-recursive: @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ rev="$$subdir $$rev"; \ test "$$subdir" != "." || dot_seen=yes; \ done; \ test "$$dot_seen" = "no" && rev=". $$rev"; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ here=`pwd` && cd $(srcdir) \ && mkid -f$$here/ID $$unique $(LISP) TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP) tags=; \ here=`pwd`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ || (cd $(srcdir) && etags -o $$here/TAGS $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP)) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist -rm -rf $(distdir) GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz mkdir $(distdir)/=build mkdir $(distdir)/=inst dc_install_base=`cd $(distdir)/=inst && pwd`; \ cd $(distdir)/=build \ && ../configure --srcdir=.. --prefix=$$dc_install_base \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) dist -rm -rf $(distdir) @banner="$(distdir).tar.gz is ready for distribution"; \ dashes=`echo "$$banner" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ echo "$$dashes" dist: distdir -chmod -R a+r $(distdir) GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) -rm -rf $(distdir) dist-all: distdir -chmod -R a+r $(distdir) GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) -rm -rf $(distdir) distdir: $(DISTFILES) -rm -rf $(distdir) mkdir $(distdir) -chmod 777 $(distdir) here=`cd $(top_builddir) && pwd`; \ top_distdir=`cd $(distdir) && pwd`; \ distdir=`cd $(distdir) && pwd`; \ cd $(top_srcdir) \ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu Makefile @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done for subdir in $(SUBDIRS); do \ if test "$$subdir" = .; then :; else \ test -d $(distdir)/$$subdir \ || mkdir $(distdir)/$$subdir \ || exit 1; \ chmod 777 $(distdir)/$$subdir; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \ || exit 1; \ fi; \ done info-am: info: info-recursive dvi-am: dvi: dvi-recursive check-am: all-am check: check-recursive installcheck-am: installcheck: installcheck-recursive all-recursive-am: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive install-exec-am: install-exec: install-exec-recursive install-data-am: install-data: install-data-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-recursive uninstall-am: uninstall: uninstall-recursive all-am: Makefile config.h all-redirect: all-recursive-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: installdirs-recursive installdirs-am: mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: mostlyclean-am: mostlyclean-hdr mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-recursive clean-am: clean-hdr clean-tags clean-generic mostlyclean-am clean: clean-recursive distclean-am: distclean-hdr distclean-tags distclean-generic clean-am distclean: distclean-recursive -rm -f config.status maintainer-clean-am: maintainer-clean-hdr maintainer-clean-tags \ maintainer-clean-generic distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." maintainer-clean: maintainer-clean-recursive -rm -f config.status .PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ install-data-recursive uninstall-data-recursive install-exec-recursive \ uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \ all-recursive check-recursive installcheck-recursive info-recursive \ dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \ maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \ install-exec-am install-exec install-data-am install-data install-am \ install uninstall-am uninstall all-redirect all-am all installdirs-am \ installdirs mostlyclean-generic distclean-generic clean-generic \ maintainer-clean-generic clean mostlyclean distclean maintainer-clean # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: wayv-0.3/Makefile.am0000644000175000017500000000016407716652540013045 0ustar nicknickAUTOMAKE_OPTIONS = gnu SUBDIRS = src EXTRA_DIST = AUTHORS BUGS COPYING ChangeLog INSTALL NEWS README TODO VERSION wayv-0.3/COPYING0000644000175000017500000004312707432563455012053 0ustar nicknick GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. wayv-0.3/ChangeLog0000644000175000017500000005250507716665045012575 0ustar nicknickNOTE: The upper case letters in () refer to the authors who made the changes, and anything with () was done by Mike. The date format is DD/MM/YYYY. 14/08/2003 ========== - updated AUTHORS (MB) - updated UPGRADING to inform users of any changes when moving from version 0.2 to version 0.3 (MB) - updated BUGS, NEWS, README (removed "It'd be appreciated"), TODO, VERSION, doc/overview.txt, doc/roadmap.txt, doc/wayv.1, doc/wayv.conf.* - fixed doc/HOWTO-wayv-config to reflect ability to use more than just 5 mouse/pointer launch buttons - the debian directory is now left as part of the standard distribution - updated code with new date and email block 8/04/2003 ========= - generalized fix to allow any mouse button to be used in the form of Mn in the configuration file (NR) - fixed header in wayv.conf.5 to remove lintian warning (NR) - removed boilerplate thingy from copyright (NR) 13/02/2003 =========== - fixed manpage section for wayv.conf(5) and the reference in wayv.1 (NR) - fixed multiline literal and #endif compiler warnings in various headers (NR) - fixed a couple of inclusion compiler warnings (NR) XX/XX/2002 ========== - began Windows port, but stopped, going to do later on when I move over to XML parser for configuration file (MB) 20/02/2002 =========== - Placed wayv.conf man page correctly in man/man5 as per Debian Policy (MY) 24/04/2001 ========== - updated DEFAULT.wkey, HOWTO-wayv-config, wayv.1, wayv.conf.1, README - added UPGRADING that contains information for people upgrading from version 0.1 to 0.2, it explains the main changes required to wayv.conf 23/04/2001 ========== - added CHANGES to record what improvements are made between the stable releases of wayV - updated INSTALL, HOWTO-wayv-keymap, overview.txt, roadmap.txt, wayv.conf 21/04/2001 ========== - updated AUTHORS, NEWS, BUGS, trained-gestures.jpg - bugfix in setup.c:parseSetup() so it doesn't seg fault as easily (yet again its the rubbish parser) - setup.c:readSetup() ammeded so version is NULL, helps detect if the configuration file isn't right 19/04/2001 ========== - got rid of misc.*:parseArgs() - its too late to be putting that into version 0.2 - ammended configure.in, src/Makefile.am and defines.h to use SETUPPATH so the configuration file is looked for in the right place - setup.c:parseSetup(), parseInclude() report clearer error messages if they have problems finding the appropiate files - changed setup.c:parseSetup() to figure out the right path to the keymap (it'll be rewritten for the next version) - removed cannot find file error message from backend.c and updated to be a little more flexiable with the passed in parameter - DEFAULT.wkey is now installed in the same default directory as wayv.conf 17/04/2001 ========== - found a bug there zombie processes where created by the user feedback - added process.*:setupSignals() to manage the signal hanlders required by wayV. It only useful for SIGCHLD at the moment but in later versions that'll change - move the signal setup from process.c:performAction() to backend.c - created misc.*:parseArgs() and the struct MARGS to parse the commandline parameters passed to wayV 16/04/2001 ========== - rename wayv.key to DEFAULT.wkey, decided all wayV keymaps should end in .wkey - created doc/HOWTO-wayv-keymap to explain using and creating the new keymaps - renamed setup.*:getSpaceText() to getDelimText() and ammended it to to work with parameter passed token (must rewrite the parser) - update process.c:performAction() to send keypress' correctly, including composite key press' - means key press stuff is done and dusted for version 0.2 - updated display.c:setupPointer() to properly setup what input events to receive - clearly I was delusional when I wrote the original event handling and pointer grabbing but I've fixed it therefore backend.c should be faster 14/04/2001 ========== - changed the layout of backend.c so its a little more optimised - finally decided how to approach keypress emulation - after reading the code for xev, xscribble and gtkeyboard - added Include {} to configuration, extended setup.*:readSetup(), parseSetup() - created setup.*:processInclude() to parse the various include files, at this stage it only does keymaps - completely rewrote display.*:sendKey() to use the user configurable keymaps - created a basic keymap, its the file called wayv.key and is used by wayv.conf - ammended process.c:performAction() to manage sending keypress' 09/04/2001 ========== - update the TODO with a few new things and created basic 0.3 plan 26/03/2001 ========== - patched display.c:setupDrawable() to put a 1 pixel black border around an always on top input window 22/03/2001 ========== - got rid of mouse.* and moved its one function to display.*, renaming it to display.c:setupPointer() - ammended files that used setupMouse() and updated the build scripts - coded display.*:sendKey() to use a static array for special characters (and it might make localisation easier later on?) 21/03/2001 ========== - renamed display.*:sendKeyPress() to display.*:sendKey() and developed inital code to manage special characters 18/03/2001 ========== - changed display.*:setupDrawable() to set window properties and set backend.c to pass in the extra parameters - coded the input window to receive the close window client message and extended backend.c to handle the ClientMessage event 17/03/2001 ========== - added the file VERSION, to more easily control the version information, and updated configure.in to use it - removed wayv.jcc (Code Crusader IDE project file) - seriously improved the build setup, now properly checks for X libs - ammended display.c to use XExtension and XTest functions if available - created two basic man pages and created doc/Makefile.am to install them correctly - update src/Makefile.am to install wayv.conf properly 15/03/2001 ========== - bug fix in setup.c:parseVectors(), memory over run - bug fix in process.c:createCmdLine(), memory over run - updated TODO with a lot of future possibilities 13/03/2001 ========== - fixed input window bug in backend.c where other mouse presses could be used to draw - updated most of the *.c files, reduced the history information on each function to at most 3 dates - this is the function comment header style going forward. I'll writing a code HACKING document for the 0.2 release 12/03/2001 ========== - rewrote display.c:setupDrawable() to properly setup an input window - added CLEAR to display.c:handleDrawableWindow() to clear a window - updated backend.c to use CLEAR so previously drawn gestures aren't left on the input window - added new option (Pretty.managed) to the configuration that controls turning on or off whether the input window is managed by the window manager (updated setup.*:parseSetup()) 04/03/2001 ========== - wrote code to setup an input box (specifically to support wayv used on mobile devices) - updated setup.c:parseSetup() to parse the Pretty.display key if set to input box - added checks to backend.c to see if display input box - updated mouse.c:setupMouse() to check for input box to match mouse actions on - extended display.h WPRETTY with window[] for input box area - added new parameters to display.*:setupDrawable() to allow the x and y defining of the drawable to create 03/03/2001 ========== - sending single keypress' of non-special keys is now working - added process.h WA_SENDKEY to match for keypress' - updated process.c:performAction() to parse the configuration file for keypress' to send as actions 01/03/2001 ========== - got display.c:writeText() working - now feedback of what action is matched is displayed in a popup window - updated process.c:createCmdLine() to support WAYV_MOUSE_START and WAYV_MOUSE_END for more intelligent window placement (its a quick kludge for now) - added WA_KILL to process.h for new config key - fixed up process.c:performAction() to support cancelling/killing of started programs - updated setup.c:parseProcess() to look for the kill command in the configuration - begin code for sending key presses 28/02/2001 ========== - updated setup.c writeSetup(), parseSetup(), setup.h to support user feedback - updated backend.c to use the config feedback setup - updated backend.c to handle the delays associated with feedback cleanly, i.e. fork off another instance of wayV to close the windows - later on it'll do fades, etc. - added 2 new keys to the wayv.conf Pretty configuration structure. "feedback" which turns on or off the display of what action was matched (not fully working yet) and "wait" which specifies in milli-seconds how long the feedback should be displayed 21/02/2001 ========== - created display.*:createDisplay() to setup a GDISPLAY structure - renamed functions in display.*, setupWindow() to setupDrawable(), createDisplayWindow() to createDrawableWindow(), mapDisplayWindow() to mapDrawableWindow(), unmapDisplayWindow() to unmapDrawableWindow() - updated the source configuration files to build cleaner - got rid of display.*:createDrawableWindow() and merged the code into setupDrawable() - got rid of display.*:unmapDrawableWindow(), renamed mapDrawableWindow() to handleDrawableWindow() and rewrote to control aspects of windows - began serious writing of display.c:writeText(), should be finished it after the next coding session 19/02/2001 ========== - added misc.c and misc.h for new non-specific functions - created misc.c:waitMilli() to wait X number of milli seconds - updated backend.c to wait X number of milli-seconds before closing wayV's UI feedback - updated configure.in to check for more header files and updated src/Makefile.in to compile up misc.* 14/02/2001 ========== - updated all the copright messages in the source code for year 2001 - changed my email address to stressbunny.com - rewrote parts of HOWTO-wayv-conf and moved to the doc directory - got rid of various files from the docs directory - rewrote roadmap.txt and overview.txt 13/02/2001 ========== - began code to optionally tell the user what action, if any, was matched - added display.h:GDISPLAY->font to store information on a loaded font - created display.c:writeText() for writing text to a window - updated display.c:setupDisplay() to load a font - updated backend.c:main() to tell user matched action 10/02/2001 ========== - moved wayV off SourceForge to stressbunny.com/wayv - rewrote wayV webpages as required 15/08/2000 ========== - began code in process.c:performAction() to parse the commandline and replace values 08/08/2000 ========== - added Simon Hart's code to the main codebase - renamed his functions to wayV's coding conventions - updated ai.h and ai.c:findGesture() with new rule called AIRULE_PDA_VECTOR which does PDA with Simon's vectoring (sense of direction) 03/08/2000 (Simon P Hart) ========== - added direction based recognition (badly called vectors - it ignores distance and so should be changed) it works seperately to the pda recognition, then improves the score of a match if the directions match. - made input grid enarge for short side of (almost) straight lines so that the almost straight line can be distinguished from a 45 degree line - fixed setup parameters to be not null if a parameter is missed from the ini file to prevent a segv 31/07/2000 ========== - added kmodifier to setup.h:WLAUNCH structure and changed pbutton type - updated setup.c:parseSetup() to support keyboard modifiers in the wayv.conf Launch key - ammended mouse.h with new keyboard modifier defines - updated mouse.c:setupMouse() to use keyboard modifiers - added setup.c:getSpaceText() to tokenize a string based on spaces - fixed bug in setup.c:parseProcess(), process.c:performAction() and setup.h:WA_PROCESS which didn't allow command line parameters 25/06/2000 ========== - various minor documentation updates pre 0.1 - marked a bug as not existing 19/06/2000 ========== - added configure.in, configure, install-sh, missing, mkinstalldirs, src/Makefile.am and src/Makefile.in to make compiling easier - removed VERSION because configure.in now contains version information - updated various documents to help the end-user setup wayV - updated defines.h and added PDA_REFUSE to set a threshold so gestures which don't have any realistic match aren't matched - updated ai.c:findGesture() with PDA_REFUSE threshold 16/06/2000 ========== - after comming up with a new technique for gesture matching which is far better than previous methods so I'm completely getting rid of all neural net related code - updated aimath.c:printMat() format the output slightly different - decided to get rid of all the neural net (nn) stuff - its cack - rewrote backend.c getting of nn usage - got rid of ai.c:trainMnet() and ai.c:matchNnet() - moved process.c:findGesture() to ai.c and got rid of the neural net based gesture matching - moved process.c:pointDensityAnalysis() to ai.c - cleaned up the code to compile perfectly with "-Wall" - got rid of code in setup.h that had entries for brains - got rid of code in setup.c:readSetup(), setup.c:writeSetup(), setup.c:processSetup(), setup.c:parseSetup() that dealt with brains (neural nets) 15/06/2000 ========== - slightly changed setup.c:parseMSpace() to convert matrices so they're stored in the configuration file in a more user friendly mannger - bug fix in gesture.c:gridGPoints() - I was casting floats to ints and not paying any attention to rounding - ment the gesture matrices weren't always right - added gesture.c:float2Int() to properly handle converting floats to ints - created aimath.c:subMat() to use as part of point density analysis - updated aimath.c:denormMat() to return a pointer to the changed matrix - created aimath.c:pdaMat() to count the number of X int's in a matrix, used as part of point density analysis - fixed loads of functions which were creating memory leaks - I was been silly and had forgotten to use freeMat() - instead I was using free() - duh! - added new gesture matching technique to process.c:findGesture() - added process.c:pointDensityAnalysis() to do the analysis required to match gestures - this is a new technique which I came up with 13/06/2000 ========== - updated backend.c to support specifying the configuration file to open at the command line - added process.c:destroyZombies() to get rid of zombie child processes (not sure how that affects the portability of the code?) - updated process.c:performAction() so that child processes aren't closed when the parent is and to deal with child zombie process properly - updated all the source code with the GPL License information and added the complete license file 10/06/2000 ========== - changed aimath.c:printMat() to support the new matrix structure - rewrote aimath.c:transMat() getting rid of Meschach - rewrote aimath.c:mulMat() which now runs faster - rewrote aimath.c:resizeMat() - yipee all the AI math stuff is done :) 09/06/2000 ========== - added aimath.c:setMat() to set all the entries in a matrix to the same value - rewrote aimath.c:addMat() - got rid of aimath.c:invMat() - it wasn't needed anymore - updated the Makefile to compile without Meschach 07/06/2000 ========== - created MATRIX structure in aimath.h - rewrote aimath.c:createMat() and aimath.c:freeMat() to get rid of Meschach 24/05/2000 ========== - rewrote ai.c:trainNnet() to create multiple brains for the gestures - rewrote process.c:findGesture() to do action matching using the multiple brains - updated backend.c so it now uses multiple brains 20/05/2000 ========== - updated backend.c to turn on/off user feedback based on the configuration file - bug fix in setup.c:parseSetup() where I'd forgotten to strip the quotes from gesture actions - added support to setup.c/h to parse process lists in an action and create list of sub-actions - created setup.c:getQuoteText() to get quoted text - finished process.c:performAction() to handle execute, warp and delay sub-actions 16/05/2000 ========== - updated display.c:createDisplayWindow() to drawn a white border around the whole display when drawn input mode is activated 14/05/2000 ========== - updated process.c:performAction() to close on error starting a child - updated display.c:createDisplayWindow() to invert colors as the line is drawn over them 13/05/2000 ========== - updated process.c:performAction() to properly disassociate from the display in the child - finished display.c:setupDisplay() - added UNSETINT and UNSETCHAR to defines.h for setting empty defaults, esp. in display.c - added display.c:getDisplayInfo() to set values in a GDISPLAY structure when a display has been opened - added display.c:createDisplayWindow() to create an output window to draw on - added display.c:mapDisplayWindow() and display.c:unmapDisplayWindow() to show and hide the output window - added display.c:writePixels() to connect some X and Y points via lines, this is used to draw the gesture on screen 10/05/2000 ========== - whew discovered that the xevent handling wasn't working correctly for the mouse....eventually I figured out what I was doing wrong :) - renamed usex.c/h to display.c/h - rewrote display.c:setupXEnv() to be display.c:setupDisplay() and create the GDISPLAY struct - rewrote display.c:closeDisplay() to support the GDISPLAY struct - added mouse.c/h - created mouse.c:setupMouse() to setup how mouse events are going to be captured - rename main.c to backend.c - updated Makefile to reflect all the filename changes have specific information for building the backend of wayV - added WLAUNCH to setup.h to support various launch options - ammended setup.c:parseSetup() to handle the newly added WLAUNCH structure - updated setup.c:writeSetup() to write out WLAUNCH 08/05/2000 ========== - ok after fixing the weird malloc/realloc error in http.c:delCookie(), it was all my fault, a little bit of silliness overwriting memory - added ai.c:hebbRotate() for rotating a matrix after attempted match, then removed it...it wasn't required after all - created aimath.c:rescaleMat() to change the shape of a matrix while preserving the values - got rid of printMatRatio() because printMat() and rescaleMat() can do the equivalent - added aimath.c:cmpMat() to compare two matrices - created gesture.c:findGesture() to try and find a gesture in the gesture space - created process.h/c to hold processing and matching of gestures - move gesture.c:findGesture() to process.c:findGesture(), mostly because of weird compile time errors - created process.c:performAction() to process an action list in a gesture structure...at the moment it doesn't process an action properly but will execute a program :) 07/05/2000 ========== - hmm, getting strange happenings when using malloc and realloc under Linux 2.2.12-20, egcs-2.91.66, RedHat 6.1 - core dumps are occuring for no sane reason that I can see - updated gesture.c:gridGPoints() to return a MATRIX with a gesture - updated ai.c:matchNnet() to perform AI Hebb rule matching - added aimath.c:denormMat() to convert a matrix from +1/-1 to +1/0 06/05/2000 ========== - updated ai.c:trainNnet() to support the Hebb Rule - added setup.c:parseMSpace() for converting a matrix to the ascii comma delimited equivalent - updated setup.c:writeSetup() to translate the matrices to ascii representations - extended setup.c/h:getKeyText() to support stripping of quotes and updated various function usage in setup.c - add "description" key to the gesture structure and extended various setup.c/h functions to support it 03-05/05/2000 ============= - after spending the last few days looking at matrix math thinking I already need to replace meschach, the end result is that I won't be doing that (yet) 02/05/2000 ========== - updated aimath.c:normMat() to create a new matrix and return it and changed to convert less than 1 to -1 01/05/2000 ========== - added in better function documentation to aimath.c - added aimath.c:copyMat() for copying one matrix to another - added aimath.c:cloneMat() for making an exact clone of a matrix - stripped out a most of the functions from ai.c - added proper function documentation to ai.c - finished ai.c:trainNnet() 30/04/2000 ========== - created roadmap of the features and developments up to version 0.3 - worked on the functional specification - changed the website design slightly 29/04/2000 ========== - worked on the functional specification 27/04/2000 ========== - created a lot of graphics and diagrams for the functional specification - wrote up quite a lot of the functional specification - rewrote the overview slightly and turned it into HTML - added both documents to the website and the CVS 23/04/2000 ========== - updated setup.c, renamed functions and added a wrapper, readSetup(), grouping config file related functions together - renamed 2 functions in setup.c - added setup.c:processSetup() to post process the configuration struct and convert various ascii keys to data structures - added setup.c:getKeyNum() to get int back instead of text key - edited setup.c:parseSetup() to use setup.c:getKeyNum() and to set fields to defaults - updated aimath.c:printMat() to display more than just 1's or 0's - added setup.c:parseGSpace() to convert gridspaces into matrices - created setup.c:writeSetup() to write out the setup file 18-20/04/2000 ============= - worked on the functional specification - researched webcams 15/04/2000 ========== - learn X and write backend for catching mouse events (MOSTLY DONE) - learn GTK and design front end * design UI (MOSTLY DONE) - learn about neural nets (DONE) - obtain matrix library (DONE) wayv-0.3/acconfig.h0000644000175000017500000000011307432563455012726 0ustar nicknick#undef PACKAGE #undef VERSION #undef HAVE_X_EXTENSION #undef HAVE_X_TEST wayv-0.3/VERSION0000644000175000017500000000000407716654747012065 0ustar nicknick0.3 wayv-0.3/config.h.in0000644000175000017500000000167007432563455013040 0ustar nicknick/* config.h.in. Generated automatically from configure.in by autoheader. */ /* Define if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define as the return type of signal handlers (int or void). */ #undef RETSIGTYPE /* Define if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Define if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING #undef HAVE_X_EXTENSION #undef HAVE_X_TEST /* Define if you have the gettimeofday function. */ #undef HAVE_GETTIMEOFDAY /* Define if you have the strdup function. */ #undef HAVE_STRDUP /* Define if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define if you have the header file. */ #undef HAVE_UNISTD_H /* Name of package */ #undef PACKAGE /* Version number of package */ #undef VERSION wayv-0.3/UPGRADING0000644000175000017500000000337007716661040012251 0ustar nicknickUPGRADING ========= Author: Mike Bennett (smoog at stressbunny dot com) Last Update: 14/08/2003 Index ***** 1. Upgrading from 0.2 to 0.3 2. Upgrading from 0.1 to 0.2 1. Section: Upgrading from 0.2 to 0.3 ************************************* There are no major changes when upgrading from version 0.2 to version 0.3, the main thing is that you can now define the Launch action (see wayv.conf) to use mouse button Mx where x refers to a button on your mouse. 2. Section: Upgrading from 0.1 to 0.2 ************************************* Introduction ------------ This should be read by people who have used wayV version 0.1 It outlines the important changes made to the main configuration file wayv.conf - from version 0.1 to version 0.2 When you're installing wayV 0.2 make SURE you backup your existing wayv.conf file! Upgrading from 0.1 to 0.2 ------------------------- At the moment the only method to upgrade the wayv.conf file from version 0.1 to 0.2 is to either: 1. overwrite it completely therefore loosing all your settings 2. manually update the wayv.conf file to be 0.2 compliant Remember backup your existing wayv.conf first! Yes, there should be a shell script which does all this automatically - please write it :) - set Version to 0.2 - serious extensions to Pretty structure, you're best copying the from 0.2 into your 0.1 file and setting the sub-keys as required - small change to Universe, has new sub-key called vectors which should be present - completely new structure called Include, you're best copying it from the 0.2 configuration file - make sure the file DEFAULT.wkey is in the same place as wayv.conf - every Gesture structure has a new sub-key called vector which should be added to every Gesture (it can be set to "vector = ;") wayv-0.3/CHANGES0000644000175000017500000000333007716662365012010 0ustar nicknickLast Update: 14/03/2003 Version 0.3 =========== - Launch can now use any numbered mouse pointer (thanks to Nick Rusnov) - Man page fixes (thanks again) - code compilation fixes (and again :) - adoption of a new development model Version 0.2 =========== - carried out significant work on display so it now supports: * no input window * a popup full display input window * an input window whose size is completely set-able * option to control whether input windows are managed by the window manager - user feedback added that tells the end user what action was matched - option to control how long the user feedback appears on the center of the screen - keymaps files, via new Include structure in wayv.conf, used to control what keycodes to send - second gesture matching method that uses the direction the gesture was made in (Pda & Vector) (thanks to Simon Hart) - vector key added to Gesture for direction matching - 2 new processes for Action: * sendkey (send keypress') * kill (kill the last application that was started by wayV) - experimentally extension of exec so starting and placing an X application is a single occurrence (WAYV_MOUSE_START and WAYV_MOUSE_END) - bug fix so straight lines are recognizable (thanks to Simon Hart) - bug fix so command lines in exec are working properly Version 0.1 =========== - first public version - initial documentation - basic configure build script - wayv.conf readable with matrixes storing gesture information - 3 processes in Action: exec (start app), warp (move the mouse) and delay (wait X seconds between processes) - gesture activation via pointer buttons and modifier keys - display: * no input window * popup full screen input window - width of gesture path line set-able wayv-0.3/debian/0000755000175000017500000000000010251424520012211 5ustar nicknickwayv-0.3/debian/changelog0000644000175000017500000000363510251361471014077 0ustar nicknickwayv (0.3-2) unstable; urgency=low * Fixed minor configuration SNAFU that puts the binary in /bin rather than /usr/bin (Closes: #311082) -- Nick Rusnov Tue, 7 Jun 2005 10:52:11 -0700 wayv (0.3-1) unstable; urgency=low * New Upstream Version (Closes: #280751) + Upstreamed applied all patches previously shipped. -- Nick Rusnov Mon, 21 Mar 2005 09:19:12 -0800 wayv (0.2-5) unstable; urgency=low * Generalized fix to allow any mouse button to be used in the form of Mn in the configuration file. (Closes: #181452) * Fixed header in wayv.conf.5 to remove lintian warning. * Removed boilerplate thingy from copyright. * Now Lintian-Clean(TM)! -- Nick Rusnov Tue, 8 Apr 2003 12:21:51 -0700 wayv (0.2-4) unstable; urgency=low * I'm adopting the program. (Closes: #162061) * Fixed manpage section for wayv.conf(5) and the reference in wayv.1. (Closes: #135410) * Moved to debhelper. * Using packages make install again, but installing docs with debhelper. * Jimmied the Makefiles.in to make everything work right, but its still better than manually installing in the rules file. * Fixed multiline literal and #endif compiler warnings in various headers. * Fixed a couple of inclusion compiler warnings. -- Nick Rusnov Fri, 14 Feb 2003 10:30:01 -0800 wayv (0.2-3) unstable; urgency=low * Placed wayv.conf man page correctly in man/man5 as per Debian Policy. Closes: #134809 -- Muhammad Hussain Yusuf Wed, 20 Feb 2002 21:07:31 +0000 wayv (0.2-2) unstable; urgency=low * Added build-depends xlibs-dev to debian/control. -- Muhammad Hussain Yusuf Sun, 17 Feb 2002 07:43:53 +0000 wayv (0.2-1) unstable; urgency=low * Initial Release. Closes: #71287 -- Muhammad Hussain Yusuf Wed, 13 Feb 2002 15:32:09 +0000 wayv-0.3/debian/menu0000644000175000017500000000016110251422006013073 0ustar nicknick?package(wayv):needs="X11" section="Apps/Tools" \ title="wayV Handwriting Recognition" command="/usr/bin/wayv" wayv-0.3/debian/rules0000755000175000017500000000367010360521446013305 0ustar nicknick#!/usr/bin/make -f # Sample debian/rules that uses debhelper. # GNU copyright 1997 to 1999 by Joey Hess. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 # This is the debhelper compatibility version to use. export DH_COMPAT=4 # These are used for cross-compiling and for saving the configure script # from having to guess our platform (since we know it already) DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) CFLAGS = -Wall -g ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else CFLAGS += -O2 endif ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL_PROGRAM += -s endif config.status: configure dh_testdir ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/ --datadir=\$${prefix}/etc/ --exec-prefix=\$${prefix}/usr --mandir=\$${prefix}/usr/share/man --infodir=\$${prefix}/usr/share/info --sysconfdir=\$${prefix}/etc build: build-stamp build-stamp: config.status dh_testdir $(MAKE) touch build-stamp clean: dh_testdir dh_testroot rm -f build-stamp -$(MAKE) distclean ifneq "$(wildcard /usr/share/misc/config.sub)" "" cp -f /usr/share/misc/config.sub config.sub endif ifneq "$(wildcard /usr/share/misc/config.guess)" "" cp -f /usr/share/misc/config.guess config.guess endif dh_clean install: build dh_testdir dh_testroot dh_clean -k dh_installdirs $(MAKE) install prefix=$(CURDIR)/debian/wayv binary-arch: build install dh_testdir dh_testroot dh_installdocs doc/overview.txt doc/roadmap.txt doc/trained-gestures.jpg doc/HOWTO-wayv-config doc/HOWTO-wayv-keymap dh_installmenu dh_installman doc/wayv.1 doc/wayv.conf.5 dh_installchangelogs CHANGES dh_link dh_strip dh_compress dh_fixperms dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install wayv-0.3/debian/copyright0000644000175000017500000000070610217600111014141 0ustar nicknickThis package was debianized by Muhammad Hussain Yusuf on Wed, 13 Feb 2002 15:32:09 +0000. It was redebianized by Nick Rusnov on Fri, 14 Feb 2003 10:21:10 -0800 It was downloaded from http://wayv.sourceforge.net/ Upstream Author: Mike Bennett Copyright: GPL On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL file. wayv-0.3/debian/control0000644000175000017500000000062110360520053013612 0ustar nicknickSource: wayv Section: x11 Priority: optional Maintainer: Nick Rusnov Build-Depends: debhelper (>> 3.0.0), libx11-dev, libxtst-dev, x-dev Standards-Version: 3.6.1 Package: wayv Architecture: any Depends: ${shlibs:Depends} Description: Experimental hand writing/gesture recognition program Enables human computer interaction, especially using gestures inputed via the mouse. wayv-0.3/debian/docs0000644000175000017500000000004010217600111013050 0ustar nicknickBUGS NEWS README TODO ChangeLog wayv-0.3/config.sub0000644000175000017500000007577710360521457013006 0ustar nicknick#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. timestamp='2005-07-08' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | ms1 \ | msp430 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m32c) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | ms1-* \ | msp430-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; m32c-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: wayv-0.3/config.guess0000644000175000017500000012475310360521457013330 0ustar nicknick#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. timestamp='2005-08-03' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerppc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in *86) UNAME_PROCESSOR=i686 ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: