version 0.3.0 v0.3.0
authorMats Johannesson <devel@bredband.net>
Thu, 26 Jun 2008 18:48:59 +0000 (14:48 -0400)
committerAristeu Rozanski <arozansk@redhat.com>
Thu, 26 Jun 2008 18:48:59 +0000 (14:48 -0400)
* Finally and totally obliterated the src-expresskeysconf directory.
Such a tool will never be written by me. But there is hope balancing
on the horizon! At http://alavaliant.googlepages.com you'll find
"wacom-config", which is a pygtk (2.8+) point-and-click program for
configuration of the linuxwacom driver (through "xsetwacom") and
expresskeys version 0.2.x config file editing.

No more manual wrangling with "xprop" and "xev"! A future version
will support expresskeys 0.3.x (I've been assured).

* New configuration file (version 3), incompatible with version 2. The
reasoning around this switch can be read about in the USAGE file, ca
2/3 down under the heading "NEW in expresskeys version 0.3.0".

This will hopefully be the _last_ config file change that impacts the
user in a negative way. Future changes can be done non-destructively.

* New configuration _file name_. Depending on devices identified, either
a "padless.conf1" or an "intuos3.conf1" file is written out. Apart from
only containing relevant record fields, the headers of these files are
tagged with device "Identifier" strings from xorg.conf, like:

_intuos3.conf1_                         _padless.conf1_

ConfigVersion 3                         ConfigVersion 3
Identifier1Pad 1stIntuos3Pad            Identifier1Pad LACKING
Identifier1Sty 1stIntuos3Stylus1        Identifier1Sty Stylus1

The TODO file - better known as the "Wish-list" - hints towards why this
filename change has become desirable...

* Automatic detection and use of the first 'pad' and/or 'stylus' device found
through the XListInputDevices call. This happens unconditionally, but can be
overridden by specifically naming a device on the command line.

We still only allow one device of each kind (for now) so eg an automatically
picked stylus, say 1stIntuos3Stylus1, gets dropped if the user specifies the
1stIntuos3Stylus2 or a 2ndIntuos3Stylus1.

Anyone with a little programming understanding can change a copy of the code
in globals.c and alter the config_dir string to eg "/.expresskeys2". Then
that program copy can support another set of pad/stylus (until expresskeys
properly handles multi-devices).

* Expresskeys can now trace the stylus usage and automatically change
the pressure sensitivity (PressCurve) depending on which program window
that has focus. We call "xsetwacom" for the actual change, but the
implementation has minimal overhead - can't be felt or seen on my machine:

NOTE: To partially overcome a limitation in any Qt3 program (see the BUGS
file; they swallow all stylus button presses) we also have to judge the
state _every time_ the pen comes within operational height of the tablet,
aka ProximityIn.

1a) Stylusbutton - tip or rocker - pressed (doesn't matter which),
1b) or stylus reports itself as having entered proximity of the tablet.
2) Is the current focuswindow in our program list (plus "default")? = True.
3) Does the program name differ from the name in a historybuffer (1 back)?
4) Does the program presscurve differ from a historybuffer curve (1 back)?
5) Call xsetwacom only if these are true.

The above mentioned USAGE entry has all the important details.

So... now the program enters a more generic stage where it's beneficial
to any Wacom tablet user. Though, the name will remain expresskeys ;-)

* Deleted the old-extra directory with the small scripts for re-reading the
configuration file or terminating the program.

It is actually quite embarrassing, but the two options have been available
from _within_ the main_setup.c file since... forever. We already did a signal
send to check for a running daemon, so all it took was a slight rearrangement
and a few extra code lines. I _am_ myopic, but this oversight borders on
blindness.

It is now possible to do an "expresskeys -r" or "expresskeys -k" against
a daemon instance. (BLUSH)!

* A few more command line switches have been introduced:

-x sets -v and exits after some important info blocks.
-s tells a daemon instance to report status (info block).

The 'status' signal is triggered through SIGUSR2 (re-read of the config file
has always been linked with SIGUSR1). The information printed out by -s
is almost exactly how -x displays it during a non-daemon run. Difference
being that -s also gives the "OUR RUN-PID" field.

OBSERVE: If expresskeys is started from the "outside" by use of .xinitrc or
similar methods, the output of -s will be seen on that first text terminal
(most often back at "Ctrl-Alt-F1" when in X). To get visibility from a terminal
_inside_ X, first do an "expresskeys -k" then "expresskeys -d" and THEN the
"expresskeys -s" ;-)

* Finally remembered to give a warning about Gimp and the pad device.
The USAGE file has it as a top item, and I'll copy the text here:

"Important: Gimp doesn't know _anything_ about a "pad" device, so the option
File --> Preferences --> Input Devices --> Configure Extended Input Devices...
--> [Device: pad  Mode: Disabled] is how it should be set. If you change it
to Sceen or Window, pressing pad buttons or using touch strips will NOT work."

* Updated to a working email address in the AUTHORS file and removed the
obsolete private project page from README. The canonical page now is:

http://freshmeat.net/projects/wacomexpresskeys

It has been so since version 0.2.1, I just never got around to mentioning it.

36 files changed:
BUGS
COPYING
ChangeLog
INSTALL
Makefile.in
NEWS
README
TODO
USAGE
aclocal.m4
configure
configure.in
depcomp
install-sh
missing
old-extra/Makefile-expresskeys [deleted file]
old-extra/Makefile-expresskeysconf [deleted file]
old-extra/Makefile-top [deleted file]
old-extra/expresskeys-reread.sh [deleted file]
old-extra/expresskeys-terminate.sh [deleted file]
src-expresskeys/Makefile.in
src-expresskeys/config_read.c
src-expresskeys/config_write.c
src-expresskeys/event_loop.c
src-expresskeys/exec_shell.c
src-expresskeys/get_device.c
src-expresskeys/globals.c
src-expresskeys/globals.h
src-expresskeys/main_setup.c
src-expresskeys/on_error.c
src-expresskeys/on_signal.c
src-expresskeys/pen_mode.c
src-expresskeys/reg_events.c
src-expresskeysconf/Makefile.am [deleted file]
src-expresskeysconf/Makefile.in [deleted file]
src-expresskeysconf/main_dummy.c [deleted file]

diff --git a/BUGS b/BUGS
index 3e8c8f9..a47345c 100644 (file)
--- a/BUGS
+++ b/BUGS
@@ -1,13 +1,74 @@
 
+_NOTABUG_
+
+Any program built with the Qt3 toolkit (like eg the KDE desktop...)
+completely swallows the 'stylus' DeviceButtonPress event that we've
+registered to be notified of, through the Xlib XSelectExtensionEvent
+call. The same event coming from the 'pad' device is all OK, though.
+
+This is a (deliberate?) Qt pattern where only other Qt programs,
+with difficulty, can get deliverance of these low-level events. At
+least that's my impression after a first round of bug-report emails
+between here and there --> Qt producer company Trolltech.
+
+Why they let 'pad' button events pass through is probably due to lack
+of knowledge. They recognize an oldtimer like the 'stylus', so BAM,
+grab it. But this strange 'pad' thing... better stay out of contact...
+
+Programs based on the GTK+ toolkit like the Gnome desktop (with the
+notable exception being the Gimp canvas - more about that below) do
+behave appropriate vis-a-vis both the 'stylus' and 'pad' button events.
+
+This situation has led to one design compromise (performance slippage)
+in expresskeys 0.3.0, and a not wholly ideal usability pattern when
+dealing with Qt3 programs.
+
+Performance wise we take a hit by also registering for and acting on
+a 'stylus' ProximityIn event. These events are not blocked by Qt3.
+
+Execution of the "automatic change of stylus pressure sensitivity"
+in a Qt3 program is achieved by first lifting the pen slightly (until
+it goes out of proximity - the cursor stops being effected by pen
+movement) and then lowering the pen again on the target window.
+
+If we happen to be in Gnome, it is enough to touch the Qt3 program on
+the titlebar or on its other borders (since they are GTK+ derived).
+
+GTK+ based programs suffer no such limitation. In those we just press
+the pen tip in the window, and by that action the pressure sensitivity
+change is performed. Unless the target is the Gimp canvas (at least as
+high as version 2.2.10)...
+
+The Gimp canvas is even _more_ broken (in regards to our expectations)
+than the Qt3 programs. Here both the 'stylus' DeviceButtonPress AND
+the ProximityIn events are filtered away from interested parties.
+
+So in order to get the automatic change of stylus pressure sensitivity
+when coming in from another program window, the pen tip or side button
+rocker first must engage _somwhere else_ than the canvas. Just touching
+the Gimp titlebar or touching an area outside of the canvas will work.
+
+If we happen to be in KDE while using Gimp, then a simple titlebar
+touch won't work (all the borders are Qt3 derived). Here we must do the
+proximity out/in trick on a part not being the canvas, or touch
+somewhere else than the window borders/Gimp canvas.
+
+Phew. But there's a mitigating factor to all this Qt3/Gimp canvas
+mess. We can use the "non-trigger" to our advantage.
+
+For example, I normally like the PressCurve to be "0 25 75 100"
+(sensitivity 3) in Gimp. But sometimes I'd like it to be a bit firmer.
+So if the root window (the "background" in X) or some other window
+nearby is set to sensitivity 4, it is a quick touch operation away to
+either stay with a level 3, or switch to a level 4 while painting.
+
 _Known bugs marked with FIXME in the code_
 
 ! Parsing of the configuration file still leaves some corner cases
-to chance. The behaviour when reading in the next line/part, after
-having cut a line longer than MAXBUFFER, is totally unpredictable.
+to chance.
 
-Also doesn't handle situations where multiple fields are specified
-on the same line, or if the program record begin/end "%%" sign is
-written in a field line. Possibly other cases.
+It doesn't handle situations where multiple fields are specified
+on the same line. Possibly other cases, see the FIXME markers.
 
 ! The exit_on_error function drops the EXIT_KO when callig
 clean_up_exit. It becomes a normal EXIT_OK signal for any controlling
diff --git a/COPYING b/COPYING
index 5b6e7c6..dcfa4c2 100644 (file)
--- a/COPYING
+++ b/COPYING
@@ -55,7 +55,7 @@ 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.
-\f
+
                    GNU GENERAL PUBLIC LICENSE
    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
     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.)
-\f
+
 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
@@ -168,7 +168,7 @@ 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.
-\f
+
   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
@@ -225,7 +225,7 @@ impose that choice.
 
 This section is intended to make thoroughly clear what is believed to
 be a consequence of the rest of this License.
-\f
+
   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
@@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
 POSSIBILITY OF SUCH DAMAGES.
 
                     END OF TERMS AND CONDITIONS
-\f
+
            How to Apply These Terms to Your New Programs
 
   If you develop a new program, and you want it to be of the greatest
index befeada..2cf1019 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,116 @@
 
+_Version 0.3.0 27 Jul 2006_
+
+* Finally and totally obliterated the src-expresskeysconf directory.
+Such a tool will never be written by me. But there is hope balancing
+on the horizon! At http://alavaliant.googlepages.com you'll find
+"wacom-config", which is a pygtk (2.8+) point-and-click program for
+configuration of the linuxwacom driver (through "xsetwacom") and
+expresskeys version 0.2.x config file editing.
+
+No more manual wrangling with "xprop" and "xev"! A future version
+will support expresskeys 0.3.x (I've been assured).
+
+* New configuration file (version 3), incompatible with version 2. The
+reasoning around this switch can be read about in the USAGE file, ca
+2/3 down under the heading "NEW in expresskeys version 0.3.0".
+
+This will hopefully be the _last_ config file change that impacts the
+user in a negative way. Future changes can be done non-destructively.
+
+* New configuration _file name_. Depending on devices identified, either
+a "padless.conf1" or an "intuos3.conf1" file is written out. Apart from
+only containing relevant record fields, the headers of these files are
+tagged with device "Identifier" strings from xorg.conf, like:
+
+_intuos3.conf1_                                                _padless.conf1_
+
+ConfigVersion 3                                                ConfigVersion 3
+Identifier1Pad 1stIntuos3Pad           Identifier1Pad LACKING
+Identifier1Sty 1stIntuos3Stylus1       Identifier1Sty Stylus1
+
+The TODO file - better known as the "Wish-list" - hints towards why this
+filename change has become desirable...
+
+* Automatic detection and use of the first 'pad' and/or 'stylus' device found
+through the XListInputDevices call. This happens unconditionally, but can be
+overridden by specifically naming a device on the command line.
+
+We still only allow one device of each kind (for now) so eg an automatically
+picked stylus, say 1stIntuos3Stylus1, gets dropped if the user specifies the
+1stIntuos3Stylus2 or a 2ndIntuos3Stylus1.
+
+Anyone with a little programming understanding can change a copy of the code
+in globals.c and alter the config_dir string to eg "/.expresskeys2". Then
+that program copy can support another set of pad/stylus (until expresskeys
+properly handles multi-devices).
+
+* Expresskeys can now trace the stylus usage and automatically change
+the pressure sensitivity (PressCurve) depending on which program window
+that has focus. We call "xsetwacom" for the actual change, but the
+implementation has minimal overhead - can't be felt or seen on my machine:
+
+NOTE: To partially overcome a limitation in any Qt3 program (see the BUGS
+file; they swallow all stylus button presses) we also have to judge the
+state _every time_ the pen comes within operational height of the tablet,
+aka ProximityIn.
+
+1a) Stylusbutton - tip or rocker - pressed (doesn't matter which),
+1b) or stylus reports itself as having entered proximity of the tablet.
+2) Is the current focuswindow in our program list (plus "default")? = True.
+3) Does the program name differ from the name in a historybuffer (1 back)?
+4) Does the program presscurve differ from a historybuffer curve (1 back)?
+5) Call xsetwacom only if these are true.
+
+The above mentioned USAGE entry has all the important details.
+
+So... now the program enters a more generic stage where it's beneficial
+to any Wacom tablet user. Though, the name will remain expresskeys ;-)
+
+* Deleted the old-extra directory with the small scripts for re-reading the
+configuration file or terminating the program.
+
+It is actually quite embarrassing, but the two options have been available
+from _within_ the main_setup.c file since... forever. We already did a signal
+send to check for a running daemon, so all it took was a slight rearrangement
+and a few extra code lines. I _am_ myopic, but this oversight borders on
+blindness.
+
+It is now possible to do an "expresskeys -r" or "expresskeys -k" against
+a daemon instance. (BLUSH)!
+
+* A few more command line switches have been introduced:
+
+-x sets -v and exits after some important info blocks.
+-s tells a daemon instance to report status (info block).
+
+The 'status' signal is triggered through SIGUSR2 (re-read of the config file
+has always been linked with SIGUSR1). The information printed out by -s
+is almost exactly how -x displays it during a non-daemon run. Difference
+being that -s also gives the "OUR RUN-PID" field.
+
+OBSERVE: If expresskeys is started from the "outside" by use of .xinitrc or
+similar methods, the output of -s will be seen on that first text terminal
+(most often back at "Ctrl-Alt-F1" when in X). To get visibility from a terminal
+_inside_ X, first do an "expresskeys -k" then "expresskeys -d" and THEN the
+"expresskeys -s" ;-)
+
+* Finally remembered to give a warning about Gimp and the pad device.
+The USAGE file has it as a top item, and I'll copy the text here:
+
+"Important: Gimp doesn't know _anything_ about a "pad" device, so the option
+File --> Preferences --> Input Devices --> Configure Extended Input Devices...
+--> [Device: pad  Mode: Disabled] is how it should be set. If you change it
+to Sceen or Window, pressing pad buttons or using touch strips will NOT work."
+
+* Updated to a working email address in the AUTHORS file and removed the
+obsolete private project page from README. The canonical page now is:
+
+http://freshmeat.net/projects/wacomexpresskeys
+
+It has been so since version 0.2.1, I just never got around to mentioning it.
+
+
 _Version 0.2.6 25 Feb 2006_
 
 * Continuation of the maintenance by future proofing the ./configure phase
diff --git a/INSTALL b/INSTALL
index 94e540a..0e1db8b 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -15,10 +15,6 @@ undesirable, eg:
 
 The binary will then be installed to a /home/user/bin directory instead.
 
-The old-extra directory holds the expresskeys-reread.sh and
-expresskeys-terminate.sh shell scripts. They are not installed by the
-GNU Autotools. Copy them manually if you want them.
-
 Use the "--with-xlib=" and/or "--with-xinc=" options if your Xlib environment
 is nonstandard. By default we test what is returned from the commands
 "pkg-config --variable=libdir x11" and "pkg-config --variable=includedir x11"
@@ -27,13 +23,6 @@ which works in the modular X11R7 releases. If that fails, we try a hardcoded
 
 --------------------------------------------------------------------------
 
-I've also left the old style Makefiles in the old-extra directory. If the
-GNU Autotools fail for some reason, those are easier to understand and
-edit. Then just copy them over to each Makefile in the source directories.
-Type "make" and copy the binary to a suitable location.
-
---------------------------------------------------------------------------
-
 Problems?
 
 Make sure that the dependencies for compiling this program are met.
index 177cebc..0c03e91 100644 (file)
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.4 from Makefile.am.
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004  Free Software Foundation, Inc.
+# 2003, 2004, 2005  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.
@@ -90,8 +90,6 @@ ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
-EXPRESSKEYSCONF_INCL = @EXPRESSKEYSCONF_INCL@
-EXPRESSKEYSCONF_LIBS = @EXPRESSKEYSCONF_LIBS@
 EXPRESSKEYS_INCL = @EXPRESSKEYS_INCL@
 EXPRESSKEYS_LIBS = @EXPRESSKEYS_LIBS@
 INSTALL_DATA = @INSTALL_DATA@
@@ -212,7 +210,13 @@ uninstall-info-am:
 #     (which will cause the Makefiles to be regenerated when you run `make');
 # (2) otherwise, pass the desired values on the `make' command line.
 $(RECURSIVE_TARGETS):
-       @set fnord $$MAKEFLAGS; amf=$$2; \
+       @failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
        dot_seen=no; \
        target=`echo $@ | sed s/-recursive//`; \
        list='$(SUBDIRS)'; for subdir in $$list; do \
@@ -224,7 +228,7 @@ $(RECURSIVE_TARGETS):
            local_target="$$target"; \
          fi; \
          (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+         || eval $$failcom; \
        done; \
        if test "$$dot_seen" = "no"; then \
          $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
@@ -232,7 +236,13 @@ $(RECURSIVE_TARGETS):
 
 mostlyclean-recursive clean-recursive distclean-recursive \
 maintainer-clean-recursive:
-       @set fnord $$MAKEFLAGS; amf=$$2; \
+       @failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
        dot_seen=no; \
        case "$@" in \
          distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
@@ -253,7 +263,7 @@ maintainer-clean-recursive:
            local_target="$$target"; \
          fi; \
          (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+         || eval $$failcom; \
        done && test -z "$$fail"
 tags-recursive:
        list='$(SUBDIRS)'; for subdir in $$list; do \
diff --git a/NEWS b/NEWS
index 6b830ec..b745f93 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,6 @@
 
 _Changes since last version. Executive summary_
 
-- X11R6 monolithic and X11R7 modular X discovery at ./configure time.
+- New configuration file structure (open-ended). Automatic stylus PressCurve
+  usage. Automatic device detection on program start-up.
 
diff --git a/README b/README
index 1bc542c..850028b 100644 (file)
--- a/README
+++ b/README
@@ -1,9 +1,15 @@
 
-This program gives basic linux support for the ExpressKeys and
-Touch Strips of a Wacom Intuos3 tablet or a Cintiq 21UX Interactive
-Pen Display. Latest version can be found at:
+This program gives linux support for the ExpressKeys and Touch Strips
+of a Wacom Intuos3 tablet or a Cintiq 21UX Interactive Pen Display.
 
-http://web.telia.com/~u46133770/wacom/index.html
+It can also provide an automatic change of stylus pressure sensitivity
+- aka PressCurve - going from one program window to the next, by way
+of "xsetwacom" from the driver package at linuxwacom.sourceforge.net
+This feature is totally independent of the connected Wacom tablet model.
+
+Latest version can be found through the project page at:
+
+http://freshmeat.net/projects/wacomexpresskeys
 
 Please direct any bug reports or questions to the top address in
 the AUTHORS file. This program is _not_ a linuxwacom project.
diff --git a/TODO b/TODO
index 22d6ac2..c6d149f 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,10 +1,9 @@
 
 _Wish-list_
 
-+ Graphical client for editing the configuration file, signalling
-the server to re-read it when done. Should optimally fill in the
-keycodes when user pushes a key (maybe just show the key) and fill
-in the class name as well when user clicks on a window.
++ Graphire4 support of their 2 buttons and 1 wheel.
+
++ Multi-device support (more than 1 stylus and 1 pad).
 
 + Replace ASCII with something more international, like UTF-8.
 
diff --git a/USAGE b/USAGE
index 517c88c..ab03c84 100644 (file)
--- a/USAGE
+++ b/USAGE
@@ -10,7 +10,7 @@ file to:
 
 Section "ServerLayout"
 [...]
-InputDevice "pad" # Intuos3 or Cintiq 21UX. It must NOT send core event
+InputDevice "pad" # Intuos3/Cintiq 21UX/Graphire4. It must NOT send core event
 [...]
 EndSection
 
@@ -22,59 +22,86 @@ in proximity.
 
 ///////////////////////////////////////////////////////////////////////////
 
+Important: Gimp doesn't know _anything_ about a "pad" device, so the option
+File --> Preferences --> Input Devices --> Configure Extended Input Devices...
+--> [Device: pad  Mode: Disabled] is how it should be set. If you change it
+to Sceen or Window, pressing pad buttons or using touch strips will NOT work.
+
+///////////////////////////////////////////////////////////////////////////
+
 USAGE of expresskeys:
 
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 * Program can not be started unless X is running, and refuses to start
-if another active instance of the program is detected (through a live
-pid-file).
+if a daemon instance of the program is detected (through a live pid-file).
 
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
-* Command line can be:
+* Command line:
 
-expresskeys <pad-device-name> [<pen-device-name>] [-d] [-v]
+Usage: expresskeys [OPTION]... [DEVICE]...
+Any combination of pad and/or stylus can be specified.
+An empty command line means automatic device search.
+Options can be written like -dv or -d -v in any place.
 
-Where the pad name is mandatory. Specify a pen name
-if you want the program to handle pen mode switches.
-Use -d to make the program a daemon (run in the background).
-Use -v to print info to the screen at many execution points.
+  -d makes the program a daemon (runs in the background).
+  -k terminates (kills) an already running daemon instance.
+  -r re-reads the configuration file of a running daemon.
+  -v prints info to the screen at many execution points.
+  -x sets -v and exits after some important info blocks.
+  -s tells a daemon instance to report status (info block).
+  -h unconditionally brings up this help text.
 
-Example: expresskeys pad stylus -d
+Example1: expresskeys -d (first 'pad' and/or 'stylus' found get used)
+Example2: expresskeys 1stIntuos3Pad 1stIntuos3Stylus2 -d (named devices)
+Example3: expresskeys -rv (visibly re-read the configuration file)
 
-The names are the "Identifier" strings in your X config file (xorg.conf)
-Myself I start expresskeys just before the window manager in my 
-.xinitrc with: /usr/local/bin/expresskeys pad stylus -d
+The names of pad or stylus devices are the "Identifier" strings in your
+X config file (xorg.conf). Myself I start expresskeys just before the
+window manager in .xinitrc with: /usr/local/bin/expresskeys -d
 
-OBS! I just found out that it should be started AFTER any usage of
+OBS! I've found out that it should be started AFTER any usage of
 the X program "xmodmap", else expresskeys could crash. Reason unknown.
 See the BUGS file for further info.
 
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 * A minimal configuration file is written on first run to the user home
-directory: ~/.expresskeys/expresskeys.conf
+directory: ~/.expresskeys/intuos3.conf1 (or padless.conf1)
 
 It contains "default", "Gimp", "Blender" and "XTerm" entries and is
-recreated whenever a configuration file is missing on program start.
+re-created whenever a configuration file is missing on program start.
 
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 * A file with the program PID number is written if run with -d in:
 ~/.expresskeys/expresskeys.pid
 
-The pid-file is deleted on normal program exit like "kill <pid>",
-"killall expresskeys", "kill -TERM <pid>" etc. A brutal "kill -9 <pid>"
-or a program crash will leave the pid-file undeleted. This is also
-the case if the program is terminated by X close-down on some systems.
+The pid-file is deleted on normal program exit like "expresskeys -k"
+
+You can also type "kill <pid>", "killall expresskeys", "kill -TERM <pid>"
+etc. A brutal "kill -9 <pid>" or a program crash will leave the pid-file
+undeleted. This is also the case if the program is terminated by X
+close-down on some systems.
 
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
-* The configuration file is re-read upon receipt of the signal SIGUSR1.
-Do a "kill -USR1 <pid-of-expresskeys>" after a config file edit (or -USR2).
-The included shell script "expresskeys-reread.sh" will do it for you if
-a pid-file from a daemon instance is present.
+* The configuration file is re-read when you do an "expresskeys -r" and a
+daemon instance of the program is running.
+
+What happens then is that we send the SIGUSR1 signal, which has been
+defined to call the re_read_file_config function in on_signal.c The
+action can also be performed by doing a "kill -USR1 <pid-of-expresskeys>"
+after a config file edit.
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+NOTE: There's a graphical point-and-click program in the offing at:
+http://alavaliant.googlepages.com that already supports expresskeys 0.2.x
+config file editing. The pygtk (2.8+) program is called "wacom-config"
+and will be updated to support expresskeys 0.3.x. It really does obsolete
+the following explanations of how to find keycodes and program names :NOTE
 
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
@@ -128,8 +155,8 @@ spacebar. Ok, here's Left Arrow:
 KeyPress event, serial 27, synthetic NO, window 0x1200001,
     root 0x115, subw 0x0, time 5281166, (128,125), root:(138,145),
     state 0x0, keycode 100 (keysym 0xff51, Left), same_screen YES,
-    XLookupString gives 0 bytes: 
-    XmbLookupString gives 0 bytes: 
+    XLookupString gives 0 bytes:
+    XmbLookupString gives 0 bytes:
     XFilterEvent returns: False
 
 Keycode is 100 here. Let's go to Right Arrow:
@@ -137,8 +164,8 @@ Keycode is 100 here. Let's go to Right Arrow:
 KeyPress event, serial 27, synthetic NO, window 0x1200001,
     root 0x115, subw 0x0, time 5283438, (128,125), root:(138,145),
     state 0x0, keycode 102 (keysym 0xff53, Right), same_screen YES,
-    XLookupString gives 0 bytes: 
-    XmbLookupString gives 0 bytes: 
+    XLookupString gives 0 bytes:
+    XmbLookupString gives 0 bytes:
     XFilterEvent returns: False
 
 So it's 102. When you are finished looking for the keycodes, give the
@@ -150,24 +177,24 @@ That's how it looks on this Swedish keyboard. Now open the expresskeys
 configuration file with any editor. The location is a hidden directory
 in your home directory. Here's mine:
 
-/home/loke/.expresskeys/expresskeys.conf
+/home/loke/.expresskeys/intuos3.conf1
 
 Replace the keycodes in the section you are interested in, I'd do:
+[Original configfile version 2 text here updated to version 3. Ed.]
 
-10 Left Pad - Button 9:         100     # Button 9 Left Arrow
-11 Left Pad - Button 9 Plus:    0       # Extra key
+LeftPadButton9        100     # Button 9 Left Arrow
+LeftPadButton9Plus    0       # Extra keycode
 
-12 Left Pad - Button 10:        102     # Button 10 Right Arrow
-13 Left Pad - Button 10 Plus:   0       # Extra key
+LeftPadButton10       102     # Button 10 Right Arrow
+LeftPadButton10Plus   0       # Extra keycode
 
-14 Left Pad - Button 11:        37      # Button 11
-15 Left Pad - Button 11 Plus:   0       # Extra key
+LeftPadButton11       37      # Button 11
+LeftPadButton11Plus   0       # Extra keycode
 
-16 Left Pad - Button 12:        65      # Button 12 Space (was default)
-17 Left Pad - Button 12 Plus:   0       # Extra key
+LeftPadButton12       65      # Button 12 Space (was default)
+LeftPadButton12Plus   0       # Extra keycode
 
-Save the file and read in the new values with the shell script I
-supplied (expresskeys-reread.sh)
+Save the file and read in the new values with "expresskeys -r"
 
 The extra key are for when you want two keys pressed. First the normal,
 then the extra, like Ctrl-s or so. I've been informed that a US keyboard
@@ -191,6 +218,11 @@ It's the last string we would use, the "OpenOffice.org 1.1.4". We always
 use the last part, and the spelling is case sensitive. Putting
 "openoffice.org 1.1.4" in the configuration file would not match up.
 
+A cleaner looking output from xprop can be had by eg running:
+
+$ xprop | grep WM_CLASS | cut -d ',' -f2
+ "OpenOffice.org 1.1.4"
+
 Also, since spaces are accepted as part of a class name, make sure there
 are no space _before or after_ the name, within the double quotes:
 
@@ -204,19 +236,130 @@ The very first entry (at the top) in the configuration file is named
 in another entry. It also takes care of the root window (the "background")
 and programs lacking a class name in their WM_CLASS.
 
-"default" must always stay as the first entry in the configuration file!
+The "default" record must always exist in the configuration file! But it
+doesn't matter _where_. Put it last or first or wherever...
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+NEW in expresskeys version 0.3.0:
+
+Config file version 3 is completely independent of how you organize the
+program fields or records. Only limitation is that all the fields must
+be _present_ somewhere in the record for it to be counted. In version 3
+that means 27 fields for a 'pad' device user ('stylus' field is included),
+and 2 fields for a 'stylus' device only user.
+
+This open-ended nature was enforced to facilitate the inclusion of
+future fields - or elimination of already existing ones - without
+invalidating what the user already has (which happens now when going
+from version 2 to 3).
+
+The new field introduced with version 3 is Stylus1PressCurve. Here's
+what I've written in the README file:
+
+"It can also provide an automatic change of stylus pressure sensitivity
+- aka PressCurve - going from one program window to the next, by way
+of "xsetwacom" from the driver package at linuxwacom.sourceforge.net
+This feature is totally independent of the connected Wacom tablet model."
+
+Finding good numbers (they must be in groups of four) for this field is
+not an intuitive act... The "wacomcpl" program - the tcl utility from
+linuxwacom - uses a slider (stylus/eraser --> Feel --> Sensitivity)
+with steps from 1 (Soft) to 7 (Firm) and 4 being the default. It then
+calls the "xsetwacom" program to actually set a true "Bezier curve".
+
+The seven curves chosen by wacomcpl are (Soft to Firm):
+
+1               2               3               4 (default)
+"0 75 25 100" | "0 50 50 100" | "0 25 75 100" | "0 0 100 100"
+5               6               7
+"25 0 100 75" | "50 0 100 50" | "75 0 100 25"
+
+Experimenting with other values can probably be a fun... activity on a
+rainy day. My thanks go to Pablo Gimenez, a user who wanted this
+automatic pressure sensitivity change. He made me start thinking about
+a possible implementation.
+
+It works really well but, as I've written in the BUGS file:
+
+--Quote--
+
+_NOTABUG_
+
+Any program built with the Qt3 toolkit (like eg the KDE desktop...)
+completely swallows the 'stylus' DeviceButtonPress event that we've
+registered to be notified of, through the Xlib XSelectExtensionEvent
+call. The same event coming from the 'pad' device is all OK, though.
+
+This is a (deliberate?) Qt pattern where only other Qt programs,
+with difficulty, can get deliverance of these low-level events. At
+least that's my impression after a first round of bug-report emails
+between here and there --> Qt producer company Trolltech.
+
+Why they let 'pad' button events pass through is probably due to lack
+of knowledge. They recognize an oldtimer like the 'stylus', so BAM,
+grab it. But this strange 'pad' thing... better stay out of contact...
+
+Programs based on the GTK+ toolkit like the Gnome desktop (with the
+notable exception being the Gimp canvas - more about that below) do
+behave appropriate vis-a-vis both the 'stylus' and 'pad' button events.
+
+This situation has led to one design compromise (performance slippage)
+in expresskeys 0.3.0, and a not wholly ideal usability pattern when
+dealing with Qt3 programs.
+
+Performance wise we take a hit by also registering for and acting on
+a 'stylus' ProximityIn event. These events are not blocked by Qt3.
+
+Execution of the "automatic change of stylus pressure sensitivity"
+in a Qt3 program is achieved by first lifting the pen slightly (until
+it goes out of proximity - the cursor stops being effected by pen
+movement) and then lowering the pen again on the target window.
+
+If we happen to be in Gnome, it is enough to touch the Qt3 program on
+the titlebar or on its other borders (since they are GTK+ derived).
+
+GTK+ based programs suffer no such limitation. In those we just press
+the pen tip in the window, and by that action the pressure sensitivity
+change is performed. Unless the target is the Gimp canvas (at least as
+high as version 2.2.10)...
+
+The Gimp canvas is even _more_ broken (in regards to our expectations)
+than the Qt3 programs. Here both the 'stylus' DeviceButtonPress AND
+the ProximityIn events are filtered away from interested parties.
+
+So in order to get the automatic change of stylus pressure sensitivity
+when coming in from another program window, the pen tip or side button
+rocker first must engage _somwhere else_ than the canvas. Just touching
+the Gimp titlebar or touching an area outside of the canvas will work.
+
+If we happen to be in KDE while using Gimp, then a simple titlebar
+touch won't work (all the borders are Qt3 derived). Here we must do the
+proximity out/in trick on a part not being the canvas, or touch
+somewhere else than the window borders/Gimp canvas.
+
+Phew. But there's a mitigating factor to all this Qt3/Gimp canvas
+mess. We can use the "non-trigger" to our advantage.
+
+For example, I normally like the PressCurve to be "0 25 75 100"
+(sensitivity 3) in Gimp. But sometimes I'd like it to be a bit firmer.
+So if the root window (the "background" in X) or some other window
+nearby is set to sensitivity 4, it is a quick touch operation away to
+either stay with a level 3, or switch to a level 4 while painting.
+
+--Unquote--
 
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 The "default" entry holds keycodes to make the pad buttons behave just
 as Wacom list them in the Quick Start Guide: Shift, Alt, Ctrl and Space
 mirrored on both sides. Touch Strip support is turned off by default. Use
-the number 1 in the "Handle Touch Strips" field to turn it on. You then get
+the number 1 in the "HandleTouchStrips" field to turn it on. You then get
 Arrow-key Up/Down on the left strip and Arrow-key Right/Left on the right.
 Change direction of the movement by switching the "Up" and "Down" values.
 
 Both pad buttons and touch strips can send two keys at a time if so
-configured through usage of the "Plus" keycode fields.
+configured through usage of the "...Plus" keycode fields.
 
 If you want a button to do a mouse button press instead of a keypress,
 use a value between 991 and 997 in the corresponding keycode field, where
@@ -230,14 +373,10 @@ extra buttons on the mouse.
 
 If you want a button to do pen mode toggling between Absolute and Relative,
 use the value 999 in the corresponding keycode field. To be able to switch
-mode anywhere each program block must contain one 999 definition. And,
-of course, a pen name must be used on the command line when starting the
-program. OBS: The pen mode toggle can only be assigned to a "real" button,
-not the "Plus" version :OBS.
+mode anywhere each program block must contain one 999 definition.
 
-Please don't alter or remove the colons ":" before the class name or
-keycodes. They must be there to separate the fields, just like the "%%" is
-used to separate and define the program blocks.
+OBS: The pen mode toggle can only be assigned to a "real" button,
+not the "Plus" version :OBS.
 
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
@@ -276,7 +415,7 @@ pen mode even with such a window in focus, so I've set 999 in one field.
 Below is some ASCII art showing the "default":
 
 Left ExpressKey Pad
------------- 
+------------
 |  |   |   |           Wacom Intuos3 defaults are:
 |  | 9 | T |
 |11|---| O |           Key 9  = (left) Shift   = keycode 50
@@ -286,7 +425,7 @@ Left ExpressKey Pad
 ------------
 
 Right ExpressKey Pad
------------- 
+------------
 |   |   |  |           Wacom Intuos3 defaults are:
 | T |13 |  |
 | O |---|15|           Key 13 = (left) Shift   = keycode 50
index fa31882..2b84dd9 100644 (file)
@@ -1,7 +1,7 @@
-# generated automatically by aclocal 1.9.4 -*- Autoconf -*-
+# generated automatically by aclocal 1.9.5 -*- Autoconf -*-
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
-# Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005  Free Software Foundation, Inc.
 # This file 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.
 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 # PARTICULAR PURPOSE.
 
-#                                                        -*- Autoconf -*-
-# Copyright (C) 2002, 2003  Free Software Foundation, Inc.
-# Generated from amversion.in; do not edit by hand.
-
-# 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
+# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file 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.
 
 # AM_AUTOMAKE_VERSION(VERSION)
 # ----------------------------
@@ -40,26 +28,15 @@ AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
 # Call AM_AUTOMAKE_VERSION so it can be traced.
 # This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-        [AM_AUTOMAKE_VERSION([1.9.4])])
-
-# AM_AUX_DIR_EXPAND
-
-# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+        [AM_AUTOMAKE_VERSION([1.9.5])])
 
-# 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.
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# 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.
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file 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.
 
 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
 # $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
@@ -106,26 +83,16 @@ AC_PREREQ([2.50])dnl
 am_aux_dir=`cd $ac_aux_dir && pwd`
 ])
 
-# AM_CONDITIONAL                                              -*- Autoconf -*-
+# AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
-
-# 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.
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file 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.
 
-# serial 6
+# serial 7
 
 # AM_CONDITIONAL(NAME, SHELL-CONDITION)
 # -------------------------------------
@@ -149,26 +116,15 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# serial 7                                             -*- Autoconf -*-
 
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
 # Free Software Foundation, Inc.
+#
+# This file 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 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.
-
+# serial 8
 
 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
 # written in clear, in which case automake, when reading aclocal.m4,
@@ -177,7 +133,6 @@ fi])])
 # CC etc. in the Makefile, will ask for an AC_PROG_CC use...
 
 
-
 # _AM_DEPENDENCIES(NAME)
 # ----------------------
 # See how the compiler implements dependency checking.
@@ -317,27 +272,16 @@ AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
 AC_SUBST([AMDEPBACKSLASH])
 ])
 
-# Generate code to set up dependency tracking.   -*- Autoconf -*-
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
-#   Free Software Foundation, Inc.
-
-# 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.
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# 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.
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file 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.
 
-#serial 2
+#serial 3
 
 # _AM_OUTPUT_DEPENDENCY_COMMANDS
 # ------------------------------
@@ -396,54 +340,31 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
      [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
 ])
 
-# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc.
-
-# 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.
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file 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.
 
-# serial 7
+# serial 8
 
 # AM_CONFIG_HEADER is obsolete.  It has been replaced by AC_CONFIG_HEADERS.
 AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
 
-# Do all the work for Automake.                            -*- Autoconf -*-
-
-# 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.
+# Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
 # Free Software Foundation, Inc.
+#
+# This file 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 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.
+# serial 12
 
-# serial 11
+# 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.
 
 # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
 # AM_INIT_AUTOMAKE([OPTIONS])
@@ -545,51 +466,27 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
 
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file 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.
+
 # AM_PROG_INSTALL_SH
 # ------------------
 # Define $install_sh.
-
-# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
-
-# 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.
-
 AC_DEFUN([AM_PROG_INSTALL_SH],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
 install_sh=${install_sh-"$am_aux_dir/install-sh"}
 AC_SUBST(install_sh)])
 
-#                                                          -*- Autoconf -*-
-# Copyright (C) 2003  Free Software Foundation, Inc.
-
-# 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.
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file 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.
 
-# serial 1
+# serial 2
 
 # Check whether the underlying file-system supports filenames
 # with a leading dot.  For instance MS-DOS doesn't.
@@ -604,28 +501,17 @@ fi
 rmdir .tst 2>/dev/null
 AC_SUBST([am__leading_dot])])
 
-# Add --enable-maintainer-mode option to configure.
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
 # From Jim Meyering
 
-# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005
 # Free Software Foundation, Inc.
+#
+# This file 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 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.
-
-# serial 3
+# serial 4
 
 AC_DEFUN([AM_MAINTAINER_MODE],
 [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
@@ -644,26 +530,15 @@ AC_DEFUN([AM_MAINTAINER_MODE],
 
 AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
 
-# Check to see how 'make' treats includes.     -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
-
-# 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.
+# Check to see how 'make' treats includes.                 -*- Autoconf -*-
 
-# 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.
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file 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.
 
-# serial 2
+# serial 3
 
 # AM_MAKE_INCLUDE()
 # -----------------
@@ -707,27 +582,16 @@ AC_MSG_RESULT([$_am_result])
 rm -f confinc confmf
 ])
 
-#  -*- Autoconf -*-
-
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
-
-# 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.
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# 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.
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file 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.
 
-# serial 3
+# serial 4
 
 # AM_MISSING_PROG(NAME, PROGRAM)
 # ------------------------------
@@ -753,27 +617,16 @@ else
 fi
 ])
 
+# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
+#
+# This file 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.
+
 # AM_PROG_MKDIR_P
 # ---------------
 # Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
-
-# Copyright (C) 2003, 2004 Free Software Foundation, Inc.
-
-# 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.
-
+#
 # Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
 # created by `make install' are always world readable, even if the
 # installer happens to have an overly restrictive umask (e.g. 077).
@@ -827,26 +680,15 @@ else
 fi
 AC_SUBST([mkdir_p])])
 
-# Helper functions for option handling.                    -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003  Free Software Foundation, Inc.
+# Helper functions for option handling.                     -*- Autoconf -*-
 
-# 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.
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file 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.
 
-# serial 2
+# serial 3
 
 # _AM_MANGLE_OPTION(NAME)
 # -----------------------
@@ -871,28 +713,16 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-#
-# Check to make sure that the build environment is sane.
-#
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc.
-
-# 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.
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file 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.
 
-# serial 3
+# serial 4
 
 # AM_SANITY_CHECK
 # ---------------
@@ -935,25 +765,14 @@ Check your system clock])
 fi
 AC_MSG_RESULT(yes)])
 
-# AM_PROG_INSTALL_STRIP
-
-# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
-
-# 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.
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file 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.
 
+# AM_PROG_INSTALL_STRIP
+# ---------------------
 # One issue with vendor `install' (even GNU) is that you can't
 # specify the program used to strip binaries.  This is especially
 # annoying in cross-compiling environments, where the build's strip
@@ -976,25 +795,13 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004  Free Software Foundation, Inc.
-
-# 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.
-
-# serial 1
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file 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.
 
+# serial 2
 
 # _AM_PROG_TAR(FORMAT)
 # --------------------
index a2cd22c..2669c31 100755 (executable)
--- a/configure
+++ b/configure
@@ -309,7 +309,7 @@ ac_includes_default="\
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP EGREP SRC_DIRS EXPRESSKEYS_LIBS EXPRESSKEYS_INCL EXPRESSKEYSCONF_LIBS EXPRESSKEYSCONF_INCL LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP EGREP SRC_DIRS EXPRESSKEYS_LIBS EXPRESSKEYS_INCL LIBOBJS LTLIBOBJS'
 ac_subst_files=''
 
 # Initialize some variables set by options.
@@ -850,9 +850,6 @@ Optional Features:
   --disable-dependency-tracking  speeds up one-time build
   --enable-dependency-tracking   do not reject slow dependency extractors
   --enable-expresskeys    Enable building expresskeys [default=yes]
-  --enable-expresskeysconf
-                          Enable building a non-working dummy file
-                          [default=no]
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -1616,7 +1613,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE=expresskeys
- VERSION=0.2.6
+ VERSION=0.3.0
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3521,7 +3518,6 @@ done
 
 SRC_DIRS=""
 SRC_EXPRESSKEYS=src-expresskeys
-SRC_EXPRESSKEYSCONF=src-expresskeysconf
 
 
 if test -d /usr/X11R6/lib64 ; then
@@ -3684,57 +3680,6 @@ if test "$enable_expresskeys" != "no"; then
 fi
 
 
-EXPRESSKEYSCONF_DEFAULT=no
-OPTION_EXPRESSKEYSCONF=no
-# Check whether --enable-expresskeysconf or --disable-expresskeysconf was given.
-if test "${enable_expresskeysconf+set}" = set; then
-  enableval="$enable_expresskeysconf"
-
-else
-  enable_expresskeysconf=$EXPRESSKEYSCONF_DEFAULT
-fi;
-if test "$enable_expresskeysconf" != "no"; then
-       if test x$ENV_XLIB != xyes; then
-                echo "***"; echo "*** WARNING libraries:";
-                echo "*** We failed to locate a full Xlib environment,"
-                echo "*** and will therefore not build expresskeysconf."
-                echo "*** Try './configure --with-xlib=/some/directory'"
-                echo "*** where your Xlib libraries can be found."
-                echo "*** By default we test what is returned from the"
-                echo "*** command 'pkg-config --variable=libdir x11'"
-                echo "*** which works in the modular X11R7 releases."
-                echo "*** If that fails, we try a hardcoded $XLIBDIR_X11R6"
-                echo "*** for the monolithic X11R6 releases. Both these"
-                echo "*** tests have obviously failed to produce a path."
-                echo "*** "
-                echo "***"
-                exit
-       else
-               OPTION_EXPRESSKEYSCONF=yes
-               EXPRESSKEYSCONF_LIBS="-L$XLIBDIR -lX11"
-               SRC_DIRS="$SRC_DIRS $SRC_EXPRESSKEYSCONF"
-       fi
-       if test x$ENV_XINC != xyes; then
-               echo "***"; echo "*** WARNING include files:";
-               echo "*** We failed to locate a full Xlib environment,"
-               echo "*** and will therefore not build expresskeysconf."
-               echo "*** Try './configure --with-xinc=/some/directory'"
-               echo "*** where your Xlib include files can be found."
-               echo "*** By default we test what is returned from the"
-               echo "*** command 'pkg-config --variable=includedir x11'"
-               echo "*** which works in the modular X11R7 releases."
-               echo "*** If that fails, we try a hardcoded $XINCDIR_X11R6"
-               echo "*** for the monolithic X11R6 releases. Both these"
-               echo "*** tests have obviously failed to produce a path."
-               echo "*** "
-               echo "***"
-               exit
-       else
-               EXPRESSKEYSCONF_INCL="-I$XINCDIR"
-       fi
-fi
-
-
 
 
 SOMEERROR=0
@@ -3828,9 +3773,7 @@ fi
 
 
 
-
-
-                              ac_config_files="$ac_config_files Makefile src-expresskeys/Makefile src-expresskeysconf/Makefile"
+                    ac_config_files="$ac_config_files Makefile src-expresskeys/Makefile"
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
 # tests run on this system so they can be shared between configure
@@ -4389,7 +4332,6 @@ do
   # Handling of arguments.
   "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
   "src-expresskeys/Makefile" ) CONFIG_FILES="$CONFIG_FILES src-expresskeys/Makefile" ;;
-  "src-expresskeysconf/Makefile" ) CONFIG_FILES="$CONFIG_FILES src-expresskeysconf/Makefile" ;;
   "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
   "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
   *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
@@ -4523,8 +4465,6 @@ s,@EGREP@,$EGREP,;t t
 s,@SRC_DIRS@,$SRC_DIRS,;t t
 s,@EXPRESSKEYS_LIBS@,$EXPRESSKEYS_LIBS,;t t
 s,@EXPRESSKEYS_INCL@,$EXPRESSKEYS_INCL,;t t
-s,@EXPRESSKEYSCONF_LIBS@,$EXPRESSKEYSCONF_LIBS,;t t
-s,@EXPRESSKEYSCONF_INCL@,$EXPRESSKEYSCONF_INCL,;t t
 s,@LIBOBJS@,$LIBOBJS,;t t
 s,@LTLIBOBJS@,$LTLIBOBJS,;t t
 CEOF
@@ -5251,7 +5191,6 @@ echo "      X libraries - $ENV_XLIB $XLIBDIR"
 echo "       X includes - $ENV_XINC $XINCDIR"
 echo ""
 echo "  BUILD OPTIONS:"
-echo "  expresskeysconf - $OPTION_EXPRESSKEYSCONF <-- (Non-working dummy file)"
 echo "      expresskeys - $OPTION_EXPRESSKEYS"
 echo "----------------------------------------"
 echo ""
index 45c21dd..9c28dd6 100644 (file)
@@ -4,7 +4,7 @@ dnl --- Style and some code below nicked from the linuxwacom package ;-) ---
 
 AC_INIT(src-expresskeys/main_setup.c)
 AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(expresskeys, 0.2.6)
+AM_INIT_AUTOMAKE(expresskeys, 0.3.0)
 AM_MAINTAINER_MODE
 AC_PROG_CC
 
@@ -16,7 +16,6 @@ dnl also be changed accordingly (at the end of this file) ---
 
 SRC_DIRS=""
 SRC_EXPRESSKEYS=src-expresskeys
-SRC_EXPRESSKEYSCONF=src-expresskeysconf
 
 dnl --- Specify some old monolithic X paths. 
 
@@ -251,54 +250,6 @@ if test "$enable_expresskeys" != "no"; then
        fi
 fi
 
-dnl --- Check if we should build expresskeysconf (default no - not ready) ---
-
-EXPRESSKEYSCONF_DEFAULT=no
-OPTION_EXPRESSKEYSCONF=no
-AC_ARG_ENABLE(expresskeysconf,
-AC_HELP_STRING([--enable-expresskeysconf], [Enable building a non-working dummy file [[default=no]]]),
-       , enable_expresskeysconf=$EXPRESSKEYSCONF_DEFAULT)
-if test "$enable_expresskeysconf" != "no"; then
-       if test x$ENV_XLIB != xyes; then
-                echo "***"; echo "*** WARNING libraries:";
-                echo "*** We failed to locate a full Xlib environment,"
-                echo "*** and will therefore not build expresskeysconf."
-                echo "*** Try './configure --with-xlib=/some/directory'"
-                echo "*** where your Xlib libraries can be found."
-                echo "*** By default we test what is returned from the"
-                echo "*** command 'pkg-config --variable=libdir x11'"
-                echo "*** which works in the modular X11R7 releases."
-                echo "*** If that fails, we try a hardcoded $XLIBDIR_X11R6"
-                echo "*** for the monolithic X11R6 releases. Both these"
-                echo "*** tests have obviously failed to produce a path."
-                echo "*** "
-                echo "***"
-                exit
-       else
-               OPTION_EXPRESSKEYSCONF=yes
-               EXPRESSKEYSCONF_LIBS="-L$XLIBDIR -lX11"
-               SRC_DIRS="$SRC_DIRS $SRC_EXPRESSKEYSCONF"
-       fi
-       if test x$ENV_XINC != xyes; then
-               echo "***"; echo "*** WARNING include files:";
-               echo "*** We failed to locate a full Xlib environment,"
-               echo "*** and will therefore not build expresskeysconf."
-               echo "*** Try './configure --with-xinc=/some/directory'"
-               echo "*** where your Xlib include files can be found."
-               echo "*** By default we test what is returned from the"
-               echo "*** command 'pkg-config --variable=includedir x11'"
-               echo "*** which works in the modular X11R7 releases."
-               echo "*** If that fails, we try a hardcoded $XINCDIR_X11R6"
-               echo "*** for the monolithic X11R6 releases. Both these"
-               echo "*** tests have obviously failed to produce a path."
-               echo "*** "
-               echo "***"
-               exit
-       else
-               EXPRESSKEYSCONF_INCL="-I$XINCDIR"
-       fi
-fi
-
 dnl --- Call function to check X in detail ---
 
 AC_CHECK_XDETAIL
@@ -308,14 +259,11 @@ dnl --- Separate test output from file-generation output ---
 AC_SUBST(SRC_DIRS)
 AC_SUBST(EXPRESSKEYS_LIBS)
 AC_SUBST(EXPRESSKEYS_INCL)
-AC_SUBST(EXPRESSKEYSCONF_LIBS)
-AC_SUBST(EXPRESSKEYSCONF_INCL)
 
 dnl --- Create the files ---
 
 AC_OUTPUT(Makefile
-       src-expresskeys/Makefile
-       src-expresskeysconf/Makefile)
+       src-expresskeys/Makefile)
 
 dnl --- Show the result ---
 
@@ -326,7 +274,6 @@ echo "      X libraries - $ENV_XLIB $XLIBDIR"
 echo "       X includes - $ENV_XINC $XINCDIR"
 echo ""
 echo "  BUILD OPTIONS:"
-echo "  expresskeysconf - $OPTION_EXPRESSKEYSCONF <-- (Non-working dummy file)"
 echo "      expresskeys - $OPTION_EXPRESSKEYS"
 echo "----------------------------------------"
 echo ""
diff --git a/depcomp b/depcomp
index 11e2d3b..ffcd540 100755 (executable)
--- a/depcomp
+++ b/depcomp
@@ -1,9 +1,9 @@
 #! /bin/sh
 # depcomp - compile a program generating dependencies as side-effects
 
-scriptversion=2004-05-31.23
+scriptversion=2005-02-09.22
 
-# Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
 
 # 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
@@ -50,11 +50,11 @@ Environment variables:
 
 Report bugs to <bug-automake@gnu.org>.
 EOF
-    exit 0
+    exit $?
     ;;
   -v | --v*)
     echo "depcomp $scriptversion"
-    exit 0
+    exit $?
     ;;
 esac
 
@@ -287,36 +287,43 @@ tru64)
    base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
 
    if test "$libtool" = yes; then
-      # Dependencies are output in .lo.d with libtool 1.4.
-      # With libtool 1.5 they are output both in $dir.libs/$base.o.d
-      # and in $dir.libs/$base.o.d and $dir$base.o.d.  We process the
-      # latter, because the former will be cleaned when $dir.libs is
-      # erased.
-      tmpdepfile1="$dir.libs/$base.lo.d"
-      tmpdepfile2="$dir$base.o.d"
-      tmpdepfile3="$dir.libs/$base.d"
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mecanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
       "$@" -Wc,-MD
    else
-      tmpdepfile1="$dir$base.o.d"
-      tmpdepfile2="$dir$base.d"
-      tmpdepfile3="$dir$base.d"
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
       "$@" -MD
    fi
 
    stat=$?
    if test $stat -eq 0; then :
    else
-      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
       exit $stat
    fi
 
-   if test -f "$tmpdepfile1"; then
-      tmpdepfile="$tmpdepfile1"
-   elif test -f "$tmpdepfile2"; then
-      tmpdepfile="$tmpdepfile2"
-   else
-      tmpdepfile="$tmpdepfile3"
-   fi
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
    if test -f "$tmpdepfile"; then
       sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
       # That's a tab and a space in the [].
index 6ebe46d..1a83534 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2004-12-17.09
+scriptversion=2005-02-02.21
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -109,7 +109,7 @@ while test -n "$1"; do
         shift
         continue;;
 
-    --help) echo "$usage"; exit 0;;
+    --help) echo "$usage"; exit $?;;
 
     -m) chmodcmd="$chmodprog $2"
         shift
@@ -134,7 +134,7 @@ while test -n "$1"; do
        shift
        continue;;
 
-    --version) echo "$0 $scriptversion"; exit 0;;
+    --version) echo "$0 $scriptversion"; exit $?;;
 
     *)  # When -d is used, all remaining arguments are directories to create.
        # When -t is used, the destination is already specified.
diff --git a/missing b/missing
index 64b5f90..09edd88 100755 (executable)
--- a/missing
+++ b/missing
@@ -1,9 +1,9 @@
 #! /bin/sh
 # Common stub for a few missing GNU programs while installing.
 
-scriptversion=2004-09-07.08
+scriptversion=2005-02-08.22
 
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
 #   Free Software Foundation, Inc.
 # Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
 
@@ -87,12 +87,12 @@ Supported PROGRAM values:
   yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
 
 Send bug reports to <bug-automake@gnu.org>."
-    exit 0
+    exit $?
     ;;
 
   -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
     echo "missing $scriptversion (GNU Automake)"
-    exit 0
+    exit $?
     ;;
 
   -*)
@@ -288,10 +288,14 @@ WARNING: \`$1' is $msg.  You should only need it if
          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."
+    # The file to touch is that specified with -o ...
     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`
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
     fi
     touch $file
     ;;
diff --git a/old-extra/Makefile-expresskeys b/old-extra/Makefile-expresskeys
deleted file mode 100644 (file)
index 3f492d0..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-CC = gcc
-CFLAGS = -O -g3 -Wall
-# Use -g3 to get full debug info
-
-INCLUDES = -I/usr/X11R6/include
-LDFLAGS = -L/usr/X11R6/lib
-LIBS = -lX11 -lXi -lXtst
-
-TARGET = expresskeys
-
-SRCS = globals.c config_read.c config_write.c on_error.c on_signal.c \
-       pen_mode.c get_device.c reg_events.c event_loop.c exec_shell.c \
-       main_setup.c
-
-OBJS = $(SRCS:.c=.o)
-ALL =  $(SRCS)
-
-all:   $(TARGET)
-
-$(TARGET):     $(OBJS)
-       $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
-
-.c.o:
-       $(CC) $(CFLAGS) $(INCLUDES) -c $*.c
-
-clean:
-       rm -f $(OBJS) $(TARGET)
-
diff --git a/old-extra/Makefile-expresskeysconf b/old-extra/Makefile-expresskeysconf
deleted file mode 100644 (file)
index c9a1619..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-CC = gcc
-CFLAGS = -O -g3 -Wall
-# Use -g3 to get full debug info
-
-INCLUDES = -I/usr/X11R6/include
-LDFLAGS = -L/usr/X11R6/lib
-LIBS = -lX11
-
-TARGET = expresskeysconf
-
-SRCS = main_dummy.c
-
-OBJS = $(SRCS:.c=.o)
-ALL =  $(SRCS)
-
-all:   $(TARGET)
-
-$(TARGET):     $(OBJS)
-       $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
-
-.c.o:
-       $(CC) $(CFLAGS) $(INCLUDES) -c $*.c
-
-clean:
-       rm -f $(OBJS) $(TARGET)
-
diff --git a/old-extra/Makefile-top b/old-extra/Makefile-top
deleted file mode 100644 (file)
index d4f5a3e..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-
-all:
-       $(MAKE) -C src-expresskeys
-       mv src-expresskeys/expresskeys .
-
-#      $(MAKE) -C src-expresskeysconf
-#      mv src-expresskeysconf/expresskeysconf .
-clean:
-       rm -f expresskeys expresskeysconf src-expresskeys/*.o src-expresskeysconf/*.o
-
diff --git a/old-extra/expresskeys-reread.sh b/old-extra/expresskeys-reread.sh
deleted file mode 100755 (executable)
index b01c5f5..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-
-# Re-read expresskeys config file.
-
-if [ -f ~/.expresskeys/expresskeys.pid ]; then
-
-   echo "Re-reading expresskeys config file."
-
-   kill -USR1 `cat ~/.expresskeys/expresskeys.pid | head -n 1`
-
-else
-
-   echo "expresskeys doesn't seem to be running as a daemon..."
-
-fi
-
diff --git a/old-extra/expresskeys-terminate.sh b/old-extra/expresskeys-terminate.sh
deleted file mode 100755 (executable)
index 3b10dfa..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/sh
-
-# Terminate expresskeys by its PID number.
-
-if [ -f ~/.expresskeys/expresskeys.pid ]; then
-
-   echo "Will try to terminate expresskeys."
-
-   kill -TERM `cat ~/.expresskeys/expresskeys.pid | head -n 1`
-
-   sleep 1
-
-   if ! [ -f ~/.expresskeys/expresskeys.pid ]; then
-      echo "Success!"
-   else
-      echo "Failure!"
-   fi
-
-else
-
-   echo "expresskeys doesn't seem to be running as a daemon..."
-
-fi
-
index cbaf563..f20da39 100644 (file)
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.4 from Makefile.am.
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004  Free Software Foundation, Inc.
+# 2003, 2004, 2005  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.
@@ -89,8 +89,6 @@ ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
-EXPRESSKEYSCONF_INCL = @EXPRESSKEYSCONF_INCL@
-EXPRESSKEYSCONF_LIBS = @EXPRESSKEYSCONF_LIBS@
 EXPRESSKEYS_INCL = @EXPRESSKEYS_INCL@
 EXPRESSKEYS_LIBS = @EXPRESSKEYS_LIBS@
 INSTALL_DATA = @INSTALL_DATA@
index fff0bf3..1a952b8 100644 (file)
@@ -1,18 +1,18 @@
 /*
  config_read.c -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
+
  Copyright (C) 2005-2006 - Mats Johannesson
+
  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.
 #include "globals.h"
 
 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- Function reads a configuration file containing program names and
- definitions of which keys that should be mapped to pad buttons and
- touch strips. It takes a file pointer and a pointer to a global
structure as input. Returns nothing unless an error occured.
+ Function reads a configuration file containing program names and definitions
+ of which keys that should be mapped to pad buttons and touch strips. It takes
+ a file pointer and two pointers to global structures as input (data and
keywords). Returns nothing unless an error occured.
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
 
-int read_file_config(int *ip, FILE *fp)
+int read_file_config(int *ip, int *ihp, FILE *fp)
 {
 
        struct program *p;
-       
+       struct configstrings *hp;
+
        /* Convert to long for x86_64 systems */
        p = (void *)(long)*ip;
+       hp = (void *)(long)*ihp;
 
        int i;
+       int j;
+       int klen;
+       int flen;
+       int slen;
        int num_record = 0;
        int num_field = 0;
-       
+       int sane = 0;
+       int programname_alloced = 0;
+       int presscurve_alloced = 0;
+
        int *field_index = 0;
+       const char *string_index = 0;
+
+       int ifilter;
+       unsigned char cfilter;
+
+       char read_buffer [MAXBUFFER];
+       char write_buffer [MAXBUFFER];
 
-       char buffer [MAXBUFFER];
-       char line_buffer [MAXBUFFER];
-       const char ignore[] = " \t\n";
-       const char *delimiter_first, *delimiter_last;
-       char *token;
+       const char *newline = 0;
+       const char *comment = 0;
+       const char *keyword = 0;
+       const char *quote = 0;
+       const char *record = 0;
+       const char *field = 0;
 
-/* Previously allocated memory for the program names must be released
-   on subsequent reads of the config file. At program start the flag is 0 */
+/* Previously allocated memory for all the config record names and stylus
+   PressCurve must be released on subsequent reads of the file. At program
+   start the flag is 0 */
 
        if (reread_config) {
                for (i = 0; i < num_list; i++, p++) {
+                       free(p->stylus1_presscurve);
                        free(p->class_name);
                }
                /* Convert to long for x86_64 systems */
@@ -60,150 +79,254 @@ int read_file_config(int *ip, FILE *fp)
        reread_config = 1;
        num_list = 0;
 
-/* Begin by making sure that the Config File Version number is present before
-   a record begins. We exit if it's lacking or the number doesn't match up */
+/* Begin by making sure that the Config File version number is present before
+   a record begins. We exit if it's lacking or the number doesn't match up.
+   Also exit if the line was too long to handle */
 
-/* FIXME Unpredictable behaviour on lines longer than MAXBUFFER etc. See BUGS */
+/* Since parsing of a file is a complex action, this comment is almost line by line:
+ 1) Read until end of file or until the first program record is encountered.
+ 2) No newline character means that the line extended beyond MAXBUFFER bytes - exit.
+ 3) The configstring must reside to the _left_ of an eventual comment.
+ 4) A pointer to the string is incremented by string length - to step past it.
+ 5) Next the pointer is stepped past any following whitespace, landing at the value.
+ 6) Whitespace and newline is computed away, and the value written to a null-terminated buffer.
+ 7) Compare... */
 
-       while ((fgets(line_buffer, MAXBUFFER, fp)) != NULL) {
-               if ((delimiter_first = (strchr(line_buffer, '#'))) != NULL) {
-                       strncpy(buffer, line_buffer, ((delimiter_first) - (line_buffer)));
-                       strncpy(buffer + ((delimiter_first) - (line_buffer)), "\0", 1);
-                       strcpy(line_buffer, buffer);
-               }
-               if ((delimiter_first = (strchr(line_buffer, '%'))) != NULL &&
-               (delimiter_last = (strrchr(line_buffer, '%'))) != NULL &&
-               (delimiter_last != delimiter_first)) {
-                       return 3;
-               }
-               if ((delimiter_first = (strchr(line_buffer, ':'))) != NULL) {
-                       strcpy(buffer, line_buffer);
-                       token = strtok(buffer, ":");
-                       token = strtok(NULL, ignore);
-                       strcpy(buffer, token);
-                       if (be_verbose) {
-                               fprintf(stderr, "Config File Version on disk = %s Expected = %d\n", buffer, CONFIG_VERSION);
-                       }
-                       if ((atoi(buffer)) != CONFIG_VERSION) {
-                               return 3;
+/* Version loop */
+       while (((fgets(read_buffer, MAXBUFFER, fp)) != NULL) && ((strstr(read_buffer, "%%")) == NULL)) {
+               if ((newline = (strchr(read_buffer, '\n'))) != NULL) {
+                       if ((keyword = (strstr(read_buffer, configstring))) != NULL) {
+                               if (((comment = (strchr(read_buffer, '#'))) != NULL) && (comment < keyword)) {
+                                       keyword = 0;
+                               }
+                               if (keyword) {
+                                       keyword = (keyword+(strlen(configstring)));
+                                       keyword = (keyword+(strspn(keyword, " \t")));
+
+                                       flen = strcspn(keyword, " \t\n#");
+                                       strncpy(write_buffer, keyword, flen);
+                                       strncpy(write_buffer + flen, "\0", 1);
+
+                                       if (be_verbose) {
+                                               fprintf(stderr, "%s-user = %s\n", configstring, write_buffer);
+                                               fprintf(stderr, "%s-ours = %s\n", configstring, configversion);
+                                       }
+                                       if (*write_buffer != *configversion) {
+                                               if (atoi(write_buffer) < 3) {
+                                                       return 3;       /* Config file version is too old to handle */
+                                               }
+                                       }
+                                       userconfigversion = atoi(write_buffer);
+                                       if (userconfigversion == 3) {
+                                               if (stylus1_info) {
+                                                       configfields = 2; /* Users with only a 'stylus' device */
+                                               }
+                                               if (pad1_info) {
+                                                       configfields = config3fields; /* Full 'pad' and 'stylus' */
+                                               }
+                                               configheaderfields = config3headerfields;
+                                       } else {
+                                               return 3;               /* Add handling when next version exist! */
+                                       }
+                                       if (be_verbose) {
+                                               fprintf(stderr, "ConfigHeaderFields = %d\n", configheaderfields);
+                                       }
+                                       break;                          /* Found a compatible config file */
+                               }
                        }
-                       break;
+               } else {
+                       return 4;                                       /* Line was too long to parse */
                }
        }
+/* End version loop */
+       if (keyword == NULL) {
+               return 3;                                               /* End of file or a record begins */
+       }
 
 /* Read the config file in one go from top to bottom. Parse out the info
-   between record start "%%" and record end "%%". Recognize field beginnings
-   by a colon ":". Each full record is written to a global memory structure,
-   while partial records are discarded and excessive fields are truncated.
-   No sanity check on program names is performed and only a basic control
-   of the keycodes is in place - it filters out anything below 9 [Esc]. 
+   between one record separator "%%" and the next. Recognize field beginnings
+   by a keyword, for example HandleTouchStrips. Each full record is written
+   to a global memory structure, while partial records are discarded and
+   excessive fields are truncated. No sanity check on program names is
+   performed (except for the mandatory "default") and only a basic control
+   of the keycodes is in place - it filters out anything below 9 [Esc].
    A global counter variable of full record instances is updated before the
    function exits to reflect the new state. */
 
-/* FIXME Unpredictable behaviour on lines longer than MAXBUFFER etc. See BUGS */
+/* FIXME Doesn't discard duplicate keywords and is thus prone to become out of sync in such cases */
 
-       while ((fgets(line_buffer, MAXBUFFER, fp)) != NULL) {
-               if (num_record < MAXRECORDS) {
-                       if ((delimiter_first = (strchr(line_buffer, '#'))) != NULL) {
-                               strncpy(buffer, line_buffer, ((delimiter_first) - (line_buffer)));
-                               strncpy(buffer + ((delimiter_first) - (line_buffer)), "\0", 1);
-                               strcpy(line_buffer, buffer);
-                       }
-                       if ((delimiter_first = (strchr(line_buffer, '%'))) == NULL &&
-                       (delimiter_last = (strrchr(line_buffer, '%'))) == NULL &&
-                       (delimiter_last == delimiter_first)) {
-                               if ((delimiter_first = (strchr(line_buffer, ':'))) != NULL) {
-                                       if ((delimiter_first = (strchr(line_buffer, '"'))) != NULL) {
-                                               strcpy(buffer, line_buffer);
-                                               token = strtok(buffer, "\t\n");
-                                               while ((delimiter_first = (strchr(token, '"'))) == NULL) {
-                                                       token = strtok(NULL, "\t\n");
-                                               }
-                                               if (((delimiter_last = (strrchr(token, '"'))) != NULL) &&
-                                               (delimiter_last != delimiter_first)) {
-                                                       strncpy(buffer, delimiter_first+1, ((delimiter_last) - (delimiter_first + 1)));
-                                                       strncpy(buffer + ((delimiter_last) - (delimiter_first + 1)), "\0", 1);
-                                                       if ((p->class_name = (char *)malloc(strlen(buffer)+1)) == NULL) {
-                                                               return 2;
-                                                       }
-                                                       sprintf(p->class_name, "%s", buffer);
-                                                       if (be_verbose) {
-                                                               fprintf(stderr, "PGR RECNAME = %s\n", buffer);
-                                                       }
-                                                       field_index = &p->handle_touch;
+/* Fake that we've already read a line with a record separator, so that the while loop can begin */
 
-/* FIXME Unpredictable behaviour on lines longer than MAXBUFFER etc. See BUGS */
+       sprintf(read_buffer, "%s", "%%\n");
 
-                                                       while ((fgets(line_buffer, MAXBUFFER, fp)) != NULL) {
-                                                               if ((delimiter_first = (strchr(line_buffer, '%'))) != NULL &&
-                                                               (delimiter_last = (strrchr(line_buffer, '%'))) != NULL &&
-                                                               (delimiter_last != delimiter_first)) {
-                                                                       break;
-                                                               }
-                                                               if (num_field < MAXFIELDS) {
-                                                                       if ((delimiter_first = (strchr(line_buffer, '#'))) != NULL) {
-                                                                               strncpy(buffer, line_buffer, ((delimiter_first) - (line_buffer)));
-                                                                               strncpy(buffer + ((delimiter_first) - (line_buffer)), "\0", 1);
-                                                                               strcpy(line_buffer, buffer);
+/* Record loop */
+       while ((num_record < MAXRECORDS) && ((record = (strstr(read_buffer, "%%"))) != NULL)) {
+               if ((newline = (strchr(read_buffer, '\n'))) != NULL) {
+                       if (((comment = (strchr(read_buffer, '#'))) != NULL) && (comment < record)) {
+                               record = 0;
+                               sprintf(read_buffer, "%s", "%%\n");     /* <-- Since no new reads from the file */
+                       }                                                                               /* is performed in this part of the loop, */
+                       if (record) {                                                   /* we break out by erasing an encountered */
+                               num_field = 0;                      /* commented record separator. We must */
+                               programname_alloced = 0;                                        /* write an actual separator here! */
+                               presscurve_alloced = 0;
+
+/* Field loop*/        while ((((fgets(read_buffer, MAXBUFFER, fp)) != NULL) && ((record = (strstr(read_buffer, "%%"))) == NULL))
+                                               || (((comment = (strchr(read_buffer, '#'))) != NULL) && (comment < record))) {
+                                       if ((newline = (strchr(read_buffer, '\n'))) != NULL) {
+
+                                               keyword = hp->h_class_name;
+
+/* Keyword loop */             for (i = 0; i < configfields; i++) {
+
+                                                       klen = strlen(keyword);
+                                                       if ((field = (strstr(read_buffer, keyword))) != NULL) {
+                                                               flen = strcspn(field, " \t");
+                                                               if (flen == klen) {
+                                                                       if (((comment = (strchr(read_buffer, '#'))) != NULL) && (comment < field)) {
+                                                                               field = 0;
                                                                        }
-                                                                       if ((delimiter_first = (strchr(line_buffer, ':'))) != NULL) {
-                                                                               strcpy(buffer, line_buffer);
-                                                                               token = strtok(buffer, ":");
-                                                                               token = strtok(NULL, ignore);
-                                                                               strcpy(buffer, token);
+                                                                       if ((field) && (num_field < configfields)) {
 
-/* FIXME Only a basic control of the keycodes is in place - it filters out anything below 9 [Esc] and above 0 */
+                                                                               field = (field+flen);
+                                                                               field = (field+(strspn(field, " \t\"")));
+                                                                               if ((quote = (strchr(field, '\"'))) != NULL) {
+                                                                                       flen = (quote - field);
+                                                                               } else {
+                                                                                       flen = strcspn(field, " \t\n#");
+                                                                               }
+                                                                               strncpy(write_buffer, field, flen);
+                                                                               strncpy(write_buffer + flen, "\0", 1);
+/* Begin basic sanity checks */
+                                                                               ifilter = atoi(write_buffer);
+                                                                               cfilter = *write_buffer;
 
-                                                                               if (field_index == &p->handle_touch) {
-                                                                                       if ((atoi(buffer) == 1) || (atoi(buffer) == 0)) {
-                                                                                               *field_index = atoi(buffer);
+/* Users of boolean 0 or 1 */                  if (keyword == hp->h_handle_touch) {
+                                                                                       if ((flen == 1) && (isdigit(cfilter))) {
+                                                                                               if ((ifilter != 0) && (ifilter != 1)) {
+                                                                                                       sprintf(write_buffer, "%s", "0");
+                                                                                                       if (be_verbose) {
+                                                                                                               fprintf(stderr, "Only boolean 1 or 0 allowed in %s field <-- RESETTING T0 ZERO\n", keyword);
+                                                                                                       }
+                                                                                               }
                                                                                        } else {
-                                                                                               *field_index = 0;
+                                                                                               sprintf(write_buffer, "%s", "0");
                                                                                                if (be_verbose) {
-                                                                                                       fprintf(stderr, "Illegal value (not 0 or 1) in Handle Touch Strips field <-- keycode IGNORED\n");
+                                                                                                       fprintf(stderr, "Only boolean 1 or 0 allowed in %s field <-- RESETTING T0 ZERO\n", keyword);
                                                                                                }
                                                                                        }
+/* FIXME Only a basic control of the keycodes is in place - it filters out anything below 9 [Esc] and above 0 */
                                                                                } else {
-                                                                                       if ((atoi(buffer) > 8) || (atoi(buffer) == 0)) {
-                                                                                               *field_index = atoi(buffer);
-                                                                                       } else {
-                                                                                               *field_index = 0;
-                                                                                               if (be_verbose) {
-                                                                                                       fprintf(stderr, "Illegal keycode (not 0 or above 8) encountered in a field <-- keycode IGNORED\n");
+/* Users not in this if-condition */           if ((keyword != hp->h_class_name)
+                                                                                               && (keyword != hp->h_stylus1_presscurve)) {
+                                                                                               if ((ifilter != 0) && (ifilter < 9)) {
+                                                                                                       sprintf(write_buffer, "%s", "0");
+                                                                                                       if (be_verbose) {
+                                                                                                               fprintf(stderr, "Only a 9 [Esc] or above allowed in %s field <-- RESETTING T0 ZERO\n", keyword);
+                                                                                                       }
                                                                                                }
                                                                                        }
                                                                                }
-                                                                               field_index++;
-                                                                               num_field++;
+/* End basic sanity checks */
+                                                                               if (keyword == hp->h_class_name) {
+/* Memory allocation. Freed on reread */       if ((p->class_name = (char *)malloc(flen+1)) == NULL) {
+                                                                                               return 2;
+                                                                                       }
+/* Write the field to memory structure */      sprintf(p->class_name, "%s", write_buffer);
+                                                                                       num_record++; /* Only count record if program name is present */
+                                                                                       num_field++;
+                                                                                       programname_alloced = 1;
+                                                                               } else if (keyword == hp->h_stylus1_presscurve) {
+/* Memory allocation. Freed on reread */               if ((p->stylus1_presscurve = (char *)malloc(flen+1)) == NULL) {
+                                                                                                       return 2;
+                                                                                               }
+/* Write the field to memory structure */              sprintf(p->stylus1_presscurve, "%s", write_buffer);
+                                                                                               num_field++;
+                                                                                               presscurve_alloced = 1;
+                                                                               } else {
+/* Walking through members of a structure only using pointers, when the member name
+ in effect is unknown, still eludes me. This hack must suffice until the fog clears.
+ What I _do_ know is that the data structure begins with two char members, so
+ subtract them from the configfields number loop. They are already handled further
+ up in the code. The rest of the data structure consists of int members, where
+ a simple increment will walk correctly (while keeping in sync with the string
+ structure through string length+1). */
+                                                                                       field_index = &p->handle_touch;
+                                                                                       string_index = hp->h_handle_touch;
+                                                                                       for (j = 0; j < (configfields - 2); j++) {
+                                                                                               slen = strlen(string_index);
+                                                                                               if ((strcmp(string_index, keyword)) == 0) {
+/* Write the field to memory structure */                      *field_index = atoi(write_buffer);
+                                                                                                       num_field++;
+                                                                                                       break;
+                                                                                               }
+                                                                                               field_index++;
+                                                                                               string_index = string_index+slen+1;
+                                                                                       }
+                                                                               }
+                                                                               break;
                                                                        }
                                                                }
                                                        }
-                                                       if (num_field == MAXFIELDS) {
-                                                               num_record++;
-                                                               p++;
-                                                       } else {
-                                                               if (be_verbose) {
-                                                                       fprintf(stderr, "%s skipped! (fields were too few)\n", p->class_name);
-                                                               }
-                                                               free(p->class_name);
-                                                       }
-                                                       num_field = 0;
+                                                       keyword = keyword+klen+1; /* Steps to the next string member in the struct */
                                                }
+/* End keyword loop */
+                                       } else {
+                                               return 4;       /* Line was too long to parse */
                                        }
                                }
+/* End field loop */
                        }
+                       if ((num_field < configfields) && (num_field > 0)) {
+                               if (be_verbose) {
+                                       fprintf(stderr, "Check configfile! A record is incomplete or has a premature record separator\n");
+                               }
+                               if (presscurve_alloced) {
+                                       free(p->stylus1_presscurve);
+                               }
+                               if ((num_record) && (programname_alloced)) {
+                                       if (be_verbose) {
+                                               fprintf(stderr, "PGR RECNAME = %s skipped! (too few fields or a misplaced record separator)\n", p->class_name);
+                                       }
+                                       num_record--;
+                                       free(p->class_name);
+                               }
+                       } else {
+                               if (num_field == configfields) {
+                                       if (be_verbose) {
+                                               fprintf(stderr, "PGR RECNAME = %s\n", p->class_name);
+                                               fprintf(stderr, "ST1 PRCURVE = \"%s\"\n", p->stylus1_presscurve);
+                                       }
+                                       p++;
+                               }
+                       }
+               } else {
+                       return 4;                                       /* Line was too long to parse */
                }
        }
+/* End record loop */
        if (!num_record) {
-               return 1;
+               return 1;                                               /* Could not find a complete record */
        }
-       num_list = num_record;
 
+       sane = 0;
+       p = p - num_record;
+       for (i = 0; i < num_record; i++, p++) {
+               if ((strcmp(p->class_name, "default")) == 0) {
+                       default_program = p;
+                       sane = 1;
+                       break;
+               }
+       }
+       if (!sane) {
+               return 5;                                               /* No "default" program record. Exit */
+       }
+
+       num_list = num_record;
        if (be_verbose) {
                fprintf(stderr, "PGR RECORDS = %d\n", num_list);
        }
-
-       return 0;
+       return 0;                                                       /* Return without errors */
 }
 
 /* End Code */
index fc1e6fa..b822011 100644 (file)
@@ -1,18 +1,18 @@
 /*
  config_write.c -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
+
  Copyright (C) 2005-2006 - Mats Johannesson
+
  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.
 int write_file_config_header(FILE *fp)
 {
 
-       fprintf(fp, "\nVersion: %d              # Config File Version. Please don't remove.\n\n", CONFIG_VERSION);
+       fprintf(fp, "\n%s %s\n", configstring, configversion);
+       if (pad1_name) {
+               fprintf(fp, "%s %s\n", pad1idstring, pad1_name);
+       } else {
+               fprintf(fp, "%s %s\n", pad1idstring, "LACKING");
+       }
+       if (stylus1_name) {
+               fprintf(fp, "%s %s\n", stylus1idstring, stylus1_name);
+       } else {
+               fprintf(fp, "%s %s\n", stylus1idstring, "LACKING");
+       }
+       fprintf(fp, "\n# ***************** Please do not remove the above header! ****************\n\n");
        fprintf(fp, "# Blank lines and everything following a comment \"#\" sign are ignored.\n\n");
-       fprintf(fp, "# Some ASCII art showing the \"default\" program record:\n");
-       fprintf(fp, "#\n");
-       fprintf(fp, "# Left ExpressKey Pad\n");
-       fprintf(fp, "# ------------\n");
-       fprintf(fp, "# |  |   |   |             Wacom Intuos3 defaults are:\n");
-       fprintf(fp, "# |  | 9 | T |\n");
-       fprintf(fp, "# |11|---| O |             Button 9  = (left) Shift        = keycode 50\n");
-       fprintf(fp, "# |  |10 | U |             Button 10 = (left) Alt          = keycode 64\n");
-       fprintf(fp, "# |------| C |             Button 11 = (left) Control      = keycode 37\n");
-       fprintf(fp, "# |  12  | H |             Button 12 = Space               = keycode 65\n");
-       fprintf(fp, "# ------------\n");
-       fprintf(fp, "#\n");
-       fprintf(fp, "# Right ExpressKey Pad\n");
-       fprintf(fp, "# ------------\n");
-       fprintf(fp, "# |   |   |  |             Wacom Intuos3 defaults are:\n");
-       fprintf(fp, "# | T |13 |  |\n");
-       fprintf(fp, "# | O |---|15|             Button 13 = (left) Shift        = keycode 50\n");
-       fprintf(fp, "# | U |14 |  |             Button 14 = (left) Alt          = keycode 64\n");
-       fprintf(fp, "# | C |------|             Button 15 = (left) Control      = keycode 37\n");
-       fprintf(fp, "# | H |  16  |             Button 16 = Space               = keycode 65\n");
-       fprintf(fp, "# ------------\n");
-       fprintf(fp, "#\n");
-       fprintf(fp, "# The \"default\" program record must be the very first record, at the top.\n");
-       fprintf(fp, "# Use the value 999 as a keycode to enable pen mode toggling. To be able\n");
-       fprintf(fp, "# to switch mode anywhere each program block must then contain one 999\n");
-       fprintf(fp, "# definition.\n\n");
-       fprintf(fp, "# Use the values 991 to 997 for simulating mouse buttons 1 to 7. Only existing\n");
-       fprintf(fp, "# mouse buttons, defined through the driver of the active core pointer, can be\n");
-       fprintf(fp, "# simulated.\n\n");
-       fprintf(fp, "# Each program record is enclosed between two sets of double percentage signs.\n");
-       fprintf(fp, "# Each program field begins after a colon \":\". Whitespace (tabs and spaces)\n");
-       fprintf(fp, "# are ignored in the keycode fields, but spaces are recorded when in a\n");
-       fprintf(fp, "# Program Name field (between the double quotes).\n\n\n");
+       fprintf(fp, "# This file will be re-created whenever missing, but the name and layout depend\n");
+       fprintf(fp, "# on which devices that are detected at the very moment of program execution.\n\n");
+       if (pad1_info) {
+               fprintf(fp, "# Some ASCII art showing the \"default\" program record:\n");
+               fprintf(fp, "#\n");
+               fprintf(fp, "# Left ExpressKey Pad\n");
+               fprintf(fp, "# ------------\n");
+               fprintf(fp, "# |  |   |   |             Wacom Intuos3 defaults are:\n");
+               fprintf(fp, "# |  | 9 | T |\n");
+               fprintf(fp, "# |11|---| O |             Button 9  = (left) Shift        = keycode 50\n");
+               fprintf(fp, "# |  |10 | U |             Button 10 = (left) Alt          = keycode 64\n");
+               fprintf(fp, "# |------| C |             Button 11 = (left) Control      = keycode 37\n");
+               fprintf(fp, "# |  12  | H |             Button 12 = Space               = keycode 65\n");
+               fprintf(fp, "# ------------\n");
+               fprintf(fp, "#\n");
+               fprintf(fp, "# Right ExpressKey Pad\n");
+               fprintf(fp, "# ------------\n");
+               fprintf(fp, "# |   |   |  |             Wacom Intuos3 defaults are:\n");
+               fprintf(fp, "# | T |13 |  |\n");
+               fprintf(fp, "# | O |---|15|             Button 13 = (left) Shift        = keycode 50\n");
+               fprintf(fp, "# | U |14 |  |             Button 14 = (left) Alt          = keycode 64\n");
+               fprintf(fp, "# | C |------|             Button 15 = (left) Control      = keycode 37\n");
+               fprintf(fp, "# | H |  16  |             Button 16 = Space               = keycode 65\n");
+               fprintf(fp, "# ------------\n");
+               fprintf(fp, "#\n");
+               fprintf(fp, "# Use the value 999 as a keycode to enable pen mode toggling. To be able\n");
+               fprintf(fp, "# to switch mode anywhere each program block must then contain one 999\n");
+               fprintf(fp, "# definition.\n\n");
+               fprintf(fp, "# Use the values 991 to 997 for simulating mouse buttons 1 to 7. Only existing\n");
+               fprintf(fp, "# mouse buttons, defined through the driver of the active core pointer, can be\n");
+               fprintf(fp, "# simulated.\n\n");
+       }
+       fprintf(fp, "# OBSERVE: The \"default\" program record must exist _somewhere_ in the file!\n");
+       fprintf(fp, "# Each program record is separated by one set of double percentage signs: %s\n", "%%");
+       fprintf(fp, "# Each program field begins after a case sensitive keyword, eg: ProgramName\n");
+       fprintf(fp, "# Whitespace (tabs and spaces) are ignored in the keycode fields, but spaces\n");
+       fprintf(fp, "# are recorded when in a ProgramName or Stylus1PressCurve field (between the\n");
+       fprintf(fp, "# double quotes).\n\n");
 
        return 0;
 
@@ -79,39 +95,41 @@ int write_file_config(int *ip, FILE *fp)
 {
 
        struct program *p;
-       
+       struct configstrings *hp;
+       hp = human_readable;
        /* Convert to long for x86_64 systems */
        p = (void *)(long)*ip;
 
-       fprintf(fp, "%s                         # <--- Begin New Program Record\n\n", "%%");
-       fprintf(fp, "00 Program Name: \"%s\"    # Name must be within double quotes \"\"\n", p->class_name);
-       fprintf(fp, "01 Handle Touch Strips: %d # Main switch. Use 1 to enable the Touch Strips\n\n", p->handle_touch);
-       fprintf(fp, "02 Left Pad - Touch Up:            %d      # Left Touch Up\n", p->l_touch_up);
-       fprintf(fp, "03 Left Pad - Touch Up Plus:       %d      # Extra key\n\n", p->l_touch_up_plus);
-       fprintf(fp, "04 Left Pad - Touch Down:  %d      # Left Touch Down\n", p->l_touch_down);
-       fprintf(fp, "05 Left Pad - Touch Down Plus:     %d      # Extra key\n\n", p->l_touch_down_plus);
-       fprintf(fp, "06 Right Pad - Touch Up:   %d      # Right Touch Up\n", p->r_touch_up);
-       fprintf(fp, "07 Right Pad - Touch Up Plus:      %d      # Extra key\n\n", p->r_touch_up_plus);
-       fprintf(fp, "08 Right Pad - Touch Down: %d      # Right Touch Down\n", p->r_touch_down);
-       fprintf(fp, "09 Right Pad - Touch Down Plus:    %d      # Extra key\n\n", p->r_touch_down_plus);
-       fprintf(fp, "10 Left Pad - Button 9:            %d      # Button 9\n", p->key_9);
-       fprintf(fp, "11 Left Pad - Button 9 Plus:       %d      # Extra key\n\n", p->key_9_plus);
-       fprintf(fp, "12 Left Pad - Button 10:   %d      # Button 10\n", p->key_10);
-       fprintf(fp, "13 Left Pad - Button 10 Plus:      %d      # Extra key\n\n", p->key_10_plus);
-       fprintf(fp, "14 Left Pad - Button 11:   %d      # Button 11\n", p->key_11);
-       fprintf(fp, "15 Left Pad - Button 11 Plus:      %d      # Extra key\n\n", p->key_11_plus);
-       fprintf(fp, "16 Left Pad - Button 12:   %d      # Button 12\n", p->key_12);
-       fprintf(fp, "17 Left Pad - Button 12 Plus:      %d      # Extra key\n\n", p->key_12_plus);
-       fprintf(fp, "18 Right Pad - Button 13:  %d      # Button 13\n", p->key_13);
-       fprintf(fp, "19 Right Pad - Button 13 Plus:     %d      # Extra key\n\n", p->key_13_plus);
-       fprintf(fp, "20 Right Pad - Button 14:  %d      # Button 14\n", p->key_14);
-       fprintf(fp, "21 Right Pad - Button 14 Plus:     %d      # Extra key\n\n", p->key_14_plus);
-       fprintf(fp, "22 Right Pad - Button 15:  %d      # Button 15\n", p->key_15);
-       fprintf(fp, "23 Right Pad - Button 15 Plus:     %d      # Extra key\n\n", p->key_15_plus);
-       fprintf(fp, "24 Right Pad - Button 16:  %d      # Button 16\n", p->key_16);
-       fprintf(fp, "25 Right Pad - Button 16 Plus:     %d      # Extra key\n\n", p->key_16_plus);
-       fprintf(fp, "%s                         # <--- End Program Record\n\n", "%%");
-
+       fprintf(fp, "%s                 # <---  ********** BEGIN NEW PROGRAM RECORD **********\n\n", "%%");
+       fprintf(fp, "%s         \"%s\" # Name must be within double quotes \"\"\n\n", hp->h_class_name, p->class_name);
+       fprintf(fp, "%s \"%s\" # PressCurve must be within double quotes \"\"\n\n", hp->h_stylus1_presscurve, p->stylus1_presscurve);
+       if (pad1_info) {
+               fprintf(fp, "%s %d      # Main switch. Use 1 to enable the Touch Strips\n\n", hp->h_handle_touch, p->handle_touch);
+               fprintf(fp, "%s         %d      # First keycode\n", hp->h_l_touch_up, p->l_touch_up);
+               fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_l_touch_up_plus, p->l_touch_up_plus);
+               fprintf(fp, "%s %d      # First keycode\n", hp->h_l_touch_down, p->l_touch_down);
+               fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_l_touch_down_plus, p->l_touch_down_plus);
+               fprintf(fp, "%s         %d      # First keycode\n", hp->h_r_touch_up, p->r_touch_up);
+               fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_r_touch_up_plus, p->r_touch_up_plus);
+               fprintf(fp, "%s %d      # First keycode\n", hp->h_r_touch_down, p->r_touch_down);
+               fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_r_touch_down_plus, p->r_touch_down_plus);
+               fprintf(fp, "%s         %d      # First keycode\n", hp->h_key_9, p->key_9);
+               fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_key_9_plus, p->key_9_plus);
+               fprintf(fp, "%s         %d      # First keycode\n", hp->h_key_10, p->key_10);
+               fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_key_10_plus, p->key_10_plus);
+               fprintf(fp, "%s         %d      # First keycode\n", hp->h_key_11, p->key_11);
+               fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_key_11_plus, p->key_11_plus);
+               fprintf(fp, "%s         %d      # First keycode\n", hp->h_key_12, p->key_12);
+               fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_key_12_plus, p->key_12_plus);
+               fprintf(fp, "%s %d      # First keycode\n", hp->h_key_13, p->key_13);
+               fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_key_13_plus, p->key_13_plus);
+               fprintf(fp, "%s %d      # First keycode\n", hp->h_key_14, p->key_14);
+               fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_key_14_plus, p->key_14_plus);
+               fprintf(fp, "%s %d      # First keycode\n", hp->h_key_15, p->key_15);
+               fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_key_15_plus, p->key_15_plus);
+               fprintf(fp, "%s %d      # First keycode\n", hp->h_key_16, p->key_16);
+               fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_key_16_plus, p->key_16_plus);
+       }
        return 0;
 }
 
index 7c50068..3cda2aa 100644 (file)
@@ -1,18 +1,18 @@
 /*
  event_loop.c -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
+
  Copyright (C) 2005-2006 - Mats Johannesson, Denis DerSarkisian
+
  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.
@@ -70,17 +70,25 @@ int fake_event(Display *display, unsigned int keycode, Bool is_press,
 
 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  Function waits perpetually for the X server to deliver information
- about events from the input device. Receipt of an event that we've
- registered for (button press/release and motion) triggers a good deal
- of activity in a setup phase, after which we send the fake key press.
- A button press or release will always cause first a motion and then 
- a button event. That's why you'll see the focus window name being
- printed twice if running with the verbose flag set.
+ about events from the input devices. Receipt of an event that we've
+ registered for ('pad' button press/release/motion and 'stylus'
+ button press/proximityin) triggers a good deal of activity in a
+ setup phase, after which we send the fake key press. A 'pad' button
+ press will always cause first a motion and then a button event.
+ That's why you'll see the focus window name being printed twice if
+ running with the verbose flag set.
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
 
 int use_events(Display *display)
 {
 
+       char curve1buffer [CURVEMAX];
+       char namebuffer [MAXBUFFER];
+       char execbuffer [MAXBUFFER];
+
+       snprintf(curve1buffer, CURVEMAX, "0 0 100 100");
+       snprintf(namebuffer, MAXBUFFER, "dummy");
+
        XClassHint *class_hint;
 
        Window focus_window;
@@ -112,74 +120,112 @@ int use_events(Display *display)
 
                XNextEvent(display, &Event);
 
-               class_hint = XAllocClassHint(); /* Memory allocation. Free it later! */
+/* We've registered for 'stylus' ProximityIn events but will in fact also
+   see the ProximityOut events. Therefore list exactly what should be
+   reacted on, so that we at least can skip one focus window lookup */
+
+               if ((Event.type == button_press_type)
+                       || (Event.type == button_release_type)
+                       || (Event.type == motion_type)
+                       ||  (Event.type == proximity_in_type)) {
 
-               focus_window = None;
-               in_list = 0;
+                       class_hint = XAllocClassHint(); /* Memory allocation. Free it later! */
+
+                       focus_window = None;
+                       in_list = 0;
 
 /* Locate which window that currently has the focus and get its list of
    related windows. Then pull its ClassHint into our allocated structure */
 
-               XGetInputFocus(display, &focus_window, &focus_state);
-               XQueryTree(display, focus_window, &root, &parent, &children, &num_children);
-               XGetClassHint(display, focus_window, class_hint);
+                       XGetInputFocus(display, &focus_window, &focus_state);
+                       XQueryTree(display, focus_window, &root, &parent, &children, &num_children);
+                       XGetClassHint(display, focus_window, class_hint);
 
 /* If the class hint (aka WM_CLASS) contains no class string we free the
    allocated memory for each structure member and get the ClassHint of the
    window parent, if it has one. Observe that we must skip the root window */
 
-               if ((!class_hint->res_class) && (parent) && (focus_window != root)) {
-                       XFree(class_hint->res_class);
-                       XFree(class_hint->res_name);
-                       XGetClassHint(display, parent, class_hint);
-               }
+                       if ((!class_hint->res_class) && (parent) && (focus_window != root)) {
+                               XFree(class_hint->res_class);
+                               XFree(class_hint->res_name);
+                               XGetClassHint(display, parent, class_hint);
+                       }
 
 /* If the root window had the focus, or if the active window or its parent
-   had no class string at all, we use the top ("default") program definition
+   had no class string at all, we use the "default" program definition
    from the read in configuration file when evaluating the event. Otherwise
    we start scanning for a match between the class strings in our list and
    the found window class. Set a flag if a match is encountered */
 
-               if ((focus_window == root) || (class_hint->res_class == NULL)) {
-                       p = external_list;
-               } else {
-                       for (p = external_list; p < external_list + num_list; p++)
-                               if (strcmp (class_hint->res_class, p->class_name) == 0) {
-                                       in_list = 1;
-                                       break;
+                       if ((focus_window == root) || (class_hint->res_class == NULL)) {
+                               p = default_program;
+                       } else {
+                               for (p = external_list; p < external_list + num_list; p++) {
+                                       if (strcmp (class_hint->res_class, p->class_name) == 0) {
+                                               in_list = 1;
+                                               break;
+                                       }
                                }
                        }
 
 /* Any program not found in our configuration gets the "default" treatment */
 
-               if (!in_list) {
-                       p = external_list;
-               }
+                       if (!in_list) {
+                               p = default_program;
+                       }
 
 /* The allocated memory for the ClassHint structure, and each of its
    members, must be freed here. Also, the call to XQueryTree to get a
    list of related windows might have allocated memory for child entries.
    It must be released as well */
-               
-               XFree(class_hint->res_class);
-               XFree(class_hint->res_name);
-               XFree(class_hint);
-               if (children) XFree((char *)children);
 
-               if (be_verbose) {
-                       fprintf(stderr, "PGR FOCUS = %s\n", p->class_name);
-               }
+                       XFree(class_hint->res_class);
+                       XFree(class_hint->res_name);
+                       XFree(class_hint);
+                       if (children) XFree((char *)children);
 
-/* Finally start to look at the actual event. Touch Strips come first */
+                       if (be_verbose) {
+                               fprintf(stderr, "PGR FOCUS = %s\n", p->class_name);
+                       }
 
-               if (Event.type == motion_type) {
+/* Finally start to look at the actual event. Stylus button events come first */
+
+                       if ((Event.type == button_press_type)
+                               || (Event.type == proximity_in_type)) {
+                               if (stylus1_info) {
+                                       button = (XDeviceButtonEvent *) &Event;
+                                       if (button->deviceid == stylus1_info->id) {
+                                               if (in_list || (strcmp ("default", p->class_name) == 0)) {
+                                                       if (strcmp (namebuffer, p->class_name) != 0) {
+                                                               if (strcmp (curve1buffer, p->stylus1_presscurve) != 0) {
+                                                                       snprintf(curve1buffer, CURVEMAX, "%s", p->stylus1_presscurve);
+                                                                       snprintf(execbuffer, MAXBUFFER, "xsetwacom set %s PressCurve %s", stylus1_name, curve1buffer);
+                                                                       if ((system(execbuffer)) == NON_VALID) {
+                                                                               fprintf(stderr, "Failed to fork a shell for xsetwacom to set PressCurve!\n");
+                                                                       } else {
+                                                                               if (be_verbose) {
+                                                                                       fprintf(stderr, "ST1 PRCURVE = \"%s\"\n", p->stylus1_presscurve);
+                                                                               }
+                                                                       /* Save current program name with focus as a compare history */
+                                                                       snprintf(namebuffer, MAXBUFFER, "%s", p->class_name);
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
 
-                       if (p->handle_touch) {
+/* Next we look for Touch Strip events */
 
-                       motion = (XDeviceMotionEvent *) &Event;
+                       if (Event.type == motion_type) {
+                               if (pad1_info) {
 
-                               rotation = motion->axis_data[3];
-                               throttle = motion->axis_data[4];
+                                       if (p->handle_touch) {
+                                               motion = (XDeviceMotionEvent *) &Event;
+                                               if (motion->deviceid == pad1_info->id) {
+                                                       rotation = motion->axis_data[3];
+                                                       throttle = motion->axis_data[4];
 
 /* As can be analyzed with Frederic Lepied's excellent xinput-1.2 program
    the touch strip data comes in on axis 3 and 4 (left and right strips).
@@ -196,105 +242,107 @@ int use_events(Display *display)
 
 /* Left Touch Strip */
 
-                               if (rotation > 1) {
-                                       if ((rotation < old_rotation) && (old_rotation <= elder_rotation)) {
-                                               if (p->l_touch_up) {
-                                                       fake_event(display, p->l_touch_up, True, CurrentTime);
-                                                       if (be_verbose) {
-                                                               fprintf(stderr, "LTCHUP = %d dn\n", p->l_touch_up);
-                                                       }
-                                                       if (p->l_touch_up_plus) {
-                                                               fake_event(display, p->l_touch_up_plus, True, CurrentTime);
-                                                               if (be_verbose) {
-                                                                       fprintf(stderr, "LTCHUP+ = %d dn\n", p->l_touch_up_plus);
+                                                       if (rotation > 1) {
+                                                               if ((rotation < old_rotation) && (old_rotation <= elder_rotation)) {
+                                                                       if (p->l_touch_up) {
+                                                                               fake_event(display, p->l_touch_up, True, CurrentTime);
+                                                                               if (be_verbose) {
+                                                                                       fprintf(stderr, "LTCHUP = %d dn\n", p->l_touch_up);
+                                                                               }
+                                                                               if (p->l_touch_up_plus) {
+                                                                                       fake_event(display, p->l_touch_up_plus, True, CurrentTime);
+                                                                                       if (be_verbose) {
+                                                                                               fprintf(stderr, "LTCHUP+ = %d dn\n", p->l_touch_up_plus);
+                                                                                       }
+                                                                                       fake_event(display, p->l_touch_up_plus, False, CurrentTime);
+                                                                                       if (be_verbose) {
+                                                                                               fprintf(stderr, "LTCHUP+ = %d up\n", p->l_touch_up_plus);
+                                                                                       }
+                                                                               }
+                                                                               fake_event(display, p->l_touch_up, False, CurrentTime);
+                                                                               if (be_verbose) {
+                                                                                       fprintf(stderr, "LTCHUP = %d up\n", p->l_touch_up);
+                                                                               }
+                                                                       }
+                                                               } else if ((rotation > old_rotation) && (old_rotation >= elder_rotation)) {
+                                                                       if (p->l_touch_down) {
+                                                                               fake_event(display, p->l_touch_down, True, CurrentTime);
+                                                                               if (be_verbose) {
+                                                                                       fprintf(stderr, "LTCHDN = %d dn\n", p->l_touch_down);
+                                                                               }
+                                                                               if (p->l_touch_down_plus) {
+                                                                                       fake_event(display, p->l_touch_down_plus, True, CurrentTime);
+                                                                                       if (be_verbose) {
+                                                                                               fprintf(stderr, "LTCHDN+ = %d dn\n", p->l_touch_down_plus);
+                                                                                       }
+                                                                                       fake_event(display, p->l_touch_down_plus, False, CurrentTime);
+                                                                                       if (be_verbose) {
+                                                                                               fprintf(stderr, "LTCHDN+ = %d up\n", p->l_touch_down_plus);
+                                                                                       }
+                                                                               }
+                                                                               fake_event(display, p->l_touch_down, False, CurrentTime);
+                                                                               if (be_verbose) {
+                                                                                       fprintf(stderr, "LTCHDN = %d up\n", p->l_touch_down);
+                                                                               }
+                                                                       }
                                                                }
-                                                               fake_event(display, p->l_touch_up_plus, False, CurrentTime);
-                                                               if (be_verbose) {
-                                                                       fprintf(stderr, "LTCHUP+ = %d up\n", p->l_touch_up_plus);
-                                                               }
-                                                       }
-                                                       fake_event(display, p->l_touch_up, False, CurrentTime);
-                                                       if (be_verbose) {
-                                                               fprintf(stderr, "LTCHUP = %d up\n", p->l_touch_up);
-                                                       }
-                                               }
-                                       } else if ((rotation > old_rotation) && (old_rotation >= elder_rotation)) {
-                                               if (p->l_touch_down) {
-                                                       fake_event(display, p->l_touch_down, True, CurrentTime);
-                                                       if (be_verbose) {
-                                                               fprintf(stderr, "LTCHDN = %d dn\n", p->l_touch_down);
+                                                       elder_rotation = old_rotation;
+                                                       old_rotation = rotation;
                                                        }
-                                                       if (p->l_touch_down_plus) {
-                                                               fake_event(display, p->l_touch_down_plus, True, CurrentTime);
-                                                               if (be_verbose) {
-                                                                       fprintf(stderr, "LTCHDN+ = %d dn\n", p->l_touch_down_plus);
-                                                               }
-                                                               fake_event(display, p->l_touch_down_plus, False, CurrentTime);
-                                                               if (be_verbose) {
-                                                                       fprintf(stderr, "LTCHDN+ = %d up\n", p->l_touch_down_plus);
-                                                               }
-                                                       }
-                                                       fake_event(display, p->l_touch_down, False, CurrentTime);
-                                                       if (be_verbose) {
-                                                               fprintf(stderr, "LTCHDN = %d up\n", p->l_touch_down);
-                                                       }
-                                               }
-                                       }
-                               elder_rotation = old_rotation;
-                               old_rotation = rotation;
-                               }
 
 /* Right Touch Strip */
 
-                               if (throttle > 1) {
-                                       if ((throttle < old_throttle) && (old_throttle <= elder_throttle)) {
-                                               if (p->r_touch_up) {
-                                                       fake_event(display, p->r_touch_up, True, CurrentTime);
-                                                       if (be_verbose) {
-                                                               fprintf(stderr, "RTCHUP = %d dn\n", p->r_touch_up);
-                                                       }
-                                                       if (p->r_touch_up_plus) {
-                                                               fake_event(display, p->r_touch_up_plus, True, CurrentTime);
-                                                               if (be_verbose) {
-                                                                       fprintf(stderr, "RTCHUP+ = %d dn\n", p->r_touch_up_plus);
-                                                               }
-                                                               fake_event(display, p->r_touch_up_plus, False, CurrentTime);
-                                                               if (be_verbose) {
-                                                                       fprintf(stderr, "RTCHUP+ = %d up\n", p->r_touch_up_plus);
-                                                               }
-                                                       }
-                                                       fake_event(display, p->r_touch_up, False, CurrentTime);
-                                                       if (be_verbose) {
-                                                               fprintf(stderr, "RTCHUP = %d up\n", p->r_touch_up);
-                                                       }
-                                               }
-                                       } else if ((throttle > old_throttle) && (old_throttle >= elder_throttle)) {
-                                               if (p->r_touch_down) {
-                                                       fake_event(display, p->r_touch_down, True, CurrentTime);
-                                                       if (be_verbose) {
-                                                               fprintf(stderr, "RTCHDN = %d dn\n", p->r_touch_down);
-                                                       }
-                                                       if (p->r_touch_down_plus) {
-                                                               fake_event(display, p->r_touch_down_plus, True, CurrentTime);
-                                                               if (be_verbose) {
-                                                                       fprintf(stderr, "RTCHDN+ = %d dn\n", p->r_touch_down_plus);
+                                                       if (throttle > 1) {
+                                                               if ((throttle < old_throttle) && (old_throttle <= elder_throttle)) {
+                                                                       if (p->r_touch_up) {
+                                                                               fake_event(display, p->r_touch_up, True, CurrentTime);
+                                                                               if (be_verbose) {
+                                                                                       fprintf(stderr, "RTCHUP = %d dn\n", p->r_touch_up);
+                                                                               }
+                                                                               if (p->r_touch_up_plus) {
+                                                                                       fake_event(display, p->r_touch_up_plus, True, CurrentTime);
+                                                                                       if (be_verbose) {
+                                                                                               fprintf(stderr, "RTCHUP+ = %d dn\n", p->r_touch_up_plus);
+                                                                                       }
+                                                                                       fake_event(display, p->r_touch_up_plus, False, CurrentTime);
+                                                                                       if (be_verbose) {
+                                                                                               fprintf(stderr, "RTCHUP+ = %d up\n", p->r_touch_up_plus);
+                                                                                       }
+                                                                               }
+                                                                               fake_event(display, p->r_touch_up, False, CurrentTime);
+                                                                               if (be_verbose) {
+                                                                                       fprintf(stderr, "RTCHUP = %d up\n", p->r_touch_up);
+                                                                               }
+                                                                       }
+                                                               } else if ((throttle > old_throttle) && (old_throttle >= elder_throttle)) {
+                                                                       if (p->r_touch_down) {
+                                                                               fake_event(display, p->r_touch_down, True, CurrentTime);
+                                                                               if (be_verbose) {
+                                                                                       fprintf(stderr, "RTCHDN = %d dn\n", p->r_touch_down);
+                                                                               }
+                                                                               if (p->r_touch_down_plus) {
+                                                                                       fake_event(display, p->r_touch_down_plus, True, CurrentTime);
+                                                                                       if (be_verbose) {
+                                                                                               fprintf(stderr, "RTCHDN+ = %d dn\n", p->r_touch_down_plus);
+                                                                                       }
+                                                                                       fake_event(display, p->r_touch_down_plus, False, CurrentTime);
+                                                                                       if (be_verbose) {
+                                                                                               fprintf(stderr, "RTCHDN+ = %d up\n", p->r_touch_down_plus);
+                                                                                       }
+                                                                               }
+                                                                               fake_event(display, p->r_touch_down, False, CurrentTime);
+                                                                               if (be_verbose) {
+                                                                                       fprintf(stderr, "RTCHDN = %d up\n", p->r_touch_down);
+                                                                               }
+                                                                       }
                                                                }
-                                                               fake_event(display, p->r_touch_down_plus, False, CurrentTime);
-                                                               if (be_verbose) {
-                                                                       fprintf(stderr, "RTCHDN+ = %d up\n", p->r_touch_down_plus);
-                                                               }
-                                                       }
-                                                       fake_event(display, p->r_touch_down, False, CurrentTime);
-                                                       if (be_verbose) {
-                                                               fprintf(stderr, "RTCHDN = %d up\n", p->r_touch_down);
+                                                       elder_throttle = old_throttle;
+                                                       old_throttle = throttle;
                                                        }
                                                }
                                        }
-                               elder_throttle = old_throttle;
-                               old_throttle = throttle;
                                }
                        }
-               }
 
 /* Now see if the event concerned the pad buttons. Not much to talk about.
    We follow the configuration definitions, and handle a pen if requested
@@ -302,7 +350,7 @@ int use_events(Display *display)
    and 13, 14, 15, 16 on the right. Template:
 
 Left ExpressKey Pad
------------- 
+------------
 |  |   |   |           Wacom Intuos3 defaults are:
 |  | 9 | T |
 |11|---| O |           Key 9  = (left) Shift   = keycode 50
@@ -312,7 +360,7 @@ Left ExpressKey Pad
 ------------
 
 Right ExpressKey Pad
------------- 
+------------
 |   |   |  |           Wacom Intuos3 defaults are:
 | T |13 |  |
 | O |---|15|           Key 13 = (left) Shift   = keycode 50
@@ -324,82 +372,94 @@ Right ExpressKey Pad
 
 /* Pad Button Press */
 
-               if (Event.type == button_press_type) {
+                       if (Event.type == button_press_type) {
+                               if (pad1_info) {
 
-                       button = (XDeviceButtonEvent *) &Event;
+                                       button = (XDeviceButtonEvent *) &Event;
+                                       if (button->deviceid == pad1_info->id) {
+                                               button_index = &p->key_9;
 
-                       button_index = &p->key_9;
+                                               for (i = 9; i < button->button; i++) {
+                                                       button_index++;
+                                                       button_index++;
+                                               }
 
-                       for (i = 9; i < button->button; i++) {
-                               button_index++;
-                               button_index++;
-                       }
+                                               if (*button_index == TOGGLE_STYLUS1) {
+                                                       if (stylus1_info) {
+                                                               if (be_verbose) {
+                                                                       fprintf(stderr, "BTN %d = %d dn\n", button->button, *button_index);
+                                                               }
+                                                               toggle_stylus1_mode(display, stylus1_name);
+                                                       }
+                                               } else if ((*button_index >= STYLUS1_CURVE_DOWNWARD)
+                                                                       && (*button_index <= STYLUS1_CURVE_UPWARD)
+                                                                       && (stylus1_info)) {
+                                                       if (be_verbose) {
+                                                               fprintf(stderr, "BTN %d = %d dn\n", button->button, *button_index);
+                                                       }
+                                                       call_xsetwacom(*button_index);
 
-                       if (*button_index == TOGGLE_PEN) {
-                               if (handle_pen) {
-                                       if (be_verbose) {
-                                               fprintf(stderr, "BTN %d = %d dn\n", button->button, *button_index);
-                                       }
-                                       toggle_pen_mode(display, pen_name);
-                               }
-                       } else if ((*button_index >= PEN_CURVE_DOWNWARD) &&
-                                               (*button_index <= PEN_CURVE_UPWARD)) {
-                               if (be_verbose) {
-                                       fprintf(stderr, "BTN %d = %d dn\n", button->button, *button_index);
-                               }
-                               call_xsetwacom(*button_index);
-                       } else {
-                               if (*button_index) {
-                                       fake_event(display, *button_index, True, CurrentTime );
-                                       if (be_verbose) {
-                                               fprintf(stderr, "BTN %d = %d dn\n", button->button, *button_index);
-                                       }
-                               }
-                               button_index++;
-                               if (*button_index) {
-                                       fake_event(display, *button_index, True, CurrentTime );
-                                       if (be_verbose) {
-                                               fprintf(stderr, "BTN+ %d = %d dn\n", button->button, *button_index);
+                                               } else {
+                                                       if (*button_index) {
+                                                               fake_event(display, *button_index, True, CurrentTime );
+                                                               if (be_verbose) {
+                                                                       fprintf(stderr, "BTN %d = %d dn\n", button->button, *button_index);
+                                                               }
+                                                       }
+                                                       button_index++;
+                                                       if (*button_index) {
+                                                               fake_event(display, *button_index, True, CurrentTime );
+                                                               if (be_verbose) {
+                                                                       fprintf(stderr, "BTN+ %d = %d dn\n", button->button, *button_index);
+                                                               }
+                                                       }
+                                               }
                                        }
                                }
                        }
-               }
 
 /* Pad Button Release */
 
-               if (Event.type == button_release_type) {
+                       if (Event.type == button_release_type) {
+                               if (pad1_info) {
 
-                       button = (XDeviceButtonEvent *) &Event;
+                                       button = (XDeviceButtonEvent *) &Event;
+                                       if (button->deviceid == pad1_info->id) {
+                                               button_index = &p->key_9;
 
-                       button_index = &p->key_9;
-
-                       for (i = 9; i < button->button; i++) {
-                               button_index++;
-                               button_index++;
-                       }
+                                               for (i = 9; i < button->button; i++) {
+                                                       button_index++;
+                                                       button_index++;
+                                               }
 
-                       if (*button_index == TOGGLE_PEN) {
-                               if (be_verbose) {
-                                       fprintf(stderr, "BTN %d = %d up\n", button->button, *button_index);
-                               }
-                       } else if ((*button_index >= PEN_CURVE_DOWNWARD) &&
-                                               (*button_index <= PEN_CURVE_UPWARD)) {
-                               if (be_verbose) {
-                                       fprintf(stderr, "BTN %d = %d up\n", button->button, *button_index);
-                               }
-                       } else {
-                               button_index++;
-                               if (*button_index) {
-                                       fake_event(display, *button_index, False, CurrentTime );
-                                       if (be_verbose) {
-                                               fprintf(stderr, "BTN+ %d = %d up\n", button->button, *button_index);
-                                       }
-                               }
-                               button_index--;
-                               if (*button_index) {
-                                       fake_event(display, *button_index, False, CurrentTime );
-                                       if (be_verbose) {
-                                               fprintf(stderr, "BTN %d = %d up\n", button->button, *button_index);
+                                               if (*button_index == TOGGLE_STYLUS1) {
+                                                       if (stylus1_info) {
+                                                               if (be_verbose) {
+                                                                       fprintf(stderr, "BTN %d = %d up\n", button->button, *button_index);
+                                                               }
+                                                       }
+                                               } else if ((*button_index >= STYLUS1_CURVE_DOWNWARD)
+                                                                       && (*button_index <= STYLUS1_CURVE_UPWARD)
+                                                                       && (stylus1_info)) {
+                                                       if (be_verbose) {
+                                                               fprintf(stderr, "BTN %d = %d up\n", button->button, *button_index);
+                                                       }
+                                               } else {
+                                                       button_index++;
+                                                       if (*button_index) {
+                                                               fake_event(display, *button_index, False, CurrentTime );
+                                                               if (be_verbose) {
+                                                                       fprintf(stderr, "BTN+ %d = %d up\n", button->button, *button_index);
+                                                               }
+                                                       }
+                                                       button_index--;
+                                                       if (*button_index) {
+                                                               fake_event(display, *button_index, False, CurrentTime );
+                                                               if (be_verbose) {
+                                                                       fprintf(stderr, "BTN %d = %d up\n", button->button, *button_index);
+                                                               }
+                                                       }
+                                               }
                                        }
                                }
                        }
index e80eef5..7c0defc 100644 (file)
@@ -1,18 +1,18 @@
 /*
  exec_shell.c -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
+
  Copyright (C) 2005-2006 - Mats Johannesson
+
  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.
  the linuxwacom.sourceforge.net driver package. Observe that it doesn't
  check whether the program gets executed or not, just that the shell gets
  forked without an error.
+
  This sample utilization of xsetwacom alters the pen sensitivity to pressure
  just like setting the Feel -> Sensitivity in wacomcpl (the tcl utility
  program) between Soft (lower) and Firm (higher) values (1 to 7, 4 is
- default). Both PEN_CURVE_DOWNWARD and PEN_CURVE_UPWARD flip over in a
+ default). Both STYLUS1_CURVE_DOWNWARD and STYLUS1_CURVE_UPWARD flip over in a
  carousel fashion at the top and bottom values.
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
 
@@ -40,27 +40,27 @@ int call_xsetwacom(int num)
        char buffer [MAXBUFFER];
        char curve [12];
 
-       if ((num >= PEN_CURVE_DOWNWARD) &&
-               (num <= PEN_CURVE_UPWARD)) {
-               if (handle_pen) {
-                       if (num == PEN_CURVE_DOWNWARD) {
-                               if (pen_presscurve > 1) {
-                                       pen_presscurve--;
+       if ((num >= STYLUS1_CURVE_DOWNWARD) &&
+               (num <= STYLUS1_CURVE_UPWARD)) {
+               if (stylus1_info) {
+                       if (num == STYLUS1_CURVE_DOWNWARD) {
+                               if (padstylus1_presscurve > 1) {
+                                       padstylus1_presscurve--;
                                } else {
-                                       pen_presscurve = 7;
+                                       padstylus1_presscurve = 7;
                                }
                        }
-                       if (num == PEN_CURVE_DEFAULT) {
-                               pen_presscurve = 4;
+                       if (num == STYLUS1_CURVE_DEFAULT) {
+                               padstylus1_presscurve = 4;
                        }
-                       if (num == PEN_CURVE_UPWARD) {
-                               if (pen_presscurve < 7) {
-                                       pen_presscurve++;
+                       if (num == STYLUS1_CURVE_UPWARD) {
+                               if (padstylus1_presscurve < 7) {
+                                       padstylus1_presscurve++;
                                } else {
-                                       pen_presscurve = 1;
+                                       padstylus1_presscurve = 1;
                                }
                        }
-                       switch (pen_presscurve) {
+                       switch (padstylus1_presscurve) {
 
                                case 1:
                                sprintf(curve, "0 75 25 100");
@@ -93,19 +93,18 @@ int call_xsetwacom(int num)
                                default:
                                sprintf(curve, "0 0 100 100");
                                break;
-                       
+
                        }
-                       snprintf(buffer, MAXBUFFER, "xsetwacom set %s PressCurve %s", pen_name, curve);
+                       snprintf(buffer, MAXBUFFER, "xsetwacom set %s PressCurve %s", stylus1_name, curve);
                        if ((system(buffer)) == NON_VALID) {
                                fprintf(stderr, "Failed to fork a shell for xsetwacom!\n");
                        } else {
                                if (be_verbose) {
-                                       fprintf(stderr, "%s Sensitivity = %d PressCurve = %s\n", pen_name, pen_presscurve, curve);
+                                       fprintf(stderr, "%s Sensitivity = %d PressCurve = %s\n", stylus1_name, padstylus1_presscurve, curve);
                                }
                        }
                }
        }
-
        return 0;
 
 }
index 2542d8c..a9abe46 100644 (file)
@@ -1,20 +1,20 @@
 /*
  get_device.c -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
+
  Copyright (C) 2005-2006 - Mats Johannesson
+
  Based on xinput.c 1996 by Frederic Lepied (xinput-1.2)
+
  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.
 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  Function queries the X server for input devices. It only cares about non
  core ones, and compares them with what was specified on the command line.
- The "info" is a XDeviceInfo construct whos address is transferred to a
+ If no device was specified we do an automatic search for 'pad' and 'stylus'.
+ The "info" is a XDeviceInfo structure whos address is transferred to a
  permanent global copy for freeing at program exit
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
 
 /* get_device_info returns a long to satisfy x86_64 systems */
 long get_device_info(Display *display, XDeviceInfo *info, char *name)
 {
-       int             i;
-       int             nr_devices;
+       int     i, j, c;
+       int     nr_devices;
+       int len = 0;
+
+       char read_buffer [MAXBUFFER];
+       char write_buffer [MAXBUFFER];
 
        info = XListInputDevices(display, &nr_devices);
 
-       if (pad_info_block) {
-               pen_info_block = info;
+       if (!pad1_info_block) {
+               pad1_info_block = info;
        } else {
-               pad_info_block = info;
+               if (!stylus1_info_block) {
+                       stylus1_info_block = info;
+               }
        }
 
-       for(i = 0; i < nr_devices; i++) {
-               if ((info[i].use == IsXExtensionDevice) &&
-               (strcmp (info[i].name, name) == 0)) {
-                       /* Convert to long for x86_64 systems */
-                       return (long) &info[i];
+/* Device specified on the command line */
+
+       if ((pad1_name) || (stylus1_name)) {
+               for(i = 0; i < nr_devices; i++) {
+                       if ((info[i].use == IsXExtensionDevice) &&
+                       (strcmp (info[i].name, name) == 0)) {
+                               /* Convert to long for x86_64 systems */
+                               return (long) &info[i];
+                       }
+               }
+               return 0;
+       } else {
+
+/* No device specified on the command line */
+
+               for(i = 0; i < nr_devices; i++) {
+                       if (info[i].use == IsXExtensionDevice) {
+                               len = strlen(info[i].name);
+                               if (len < MAXBUFFER) {
+                                       sprintf(read_buffer, "%s", info[i].name);
+                                       for (j = 0; j < len; j++) {
+                                               c = tolower(read_buffer[j]); /* Turn everything into lower case */
+                                               sprintf(write_buffer+j, "%c", c);
+                                               ++read_buffer[j];
+                                       }
+                                       strncpy(write_buffer + len, "\0", 1);
+                                       if ((strstr(write_buffer, name)) !=NULL) {
+                                               /* Convert to long for x86_64 systems */
+                                               return (long) &info[i];
+                                       }
+                               }
+                       }
                }
-       }
        return 0;
+       }
 }
 
 /* End Code */
index dd909b8..d30aba3 100644 (file)
@@ -1,18 +1,18 @@
 /*
  globals.c -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
+
  Copyright (C) 2005-2006 - Mats Johannesson
+
  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.
 #include "globals.h"
 
 Display *display;
-XDeviceInfo *pad_info_block;
-XDeviceInfo *pen_info_block;
-XDeviceInfo *pad_info;
-XDeviceInfo *pen_info;
-XDevice *pad_device;
-XDevice *pen_device;
+XDeviceInfo *pad1_info_block;
+XDeviceInfo *stylus1_info_block;
+XDeviceInfo *pad1_info;
+XDeviceInfo *stylus1_info;
+XDevice *pad1_device;
+XDevice *stylus1_device;
 
+char *configstring = "ConfigVersion"; /* Searchable string in the config file */
+char *configversion = "3"; /* Our version. Remember to change it if necessary! */
+char *pad1idstring = "Identifier1Pad";         /* Marker to bind tablet and config file */
+char *stylus1idstring = "Identifier1Sty";      /* Marker that can't bind... */
+char *our_prog_version = "0.3.0"; /* Our version. Remember to change it! */
 char *our_prog_name;
-char *our_prog_version = "0.2.6"; /* Our version. Remember to change it! */
-char *pen_name;
+char *pad1_name = 0;
+char *pad1_autoname = "pad";
+char *stylus1_name = 0;
+char *stylus1_autoname = "stylus";
 char *total_config_dir;
 char *total_config_file;
 char *total_pid_file;
 char *total_error_file;
 char *config_dir = "/.expresskeys";    /* This is where in the user home */
-char *config_file = "/expresskeys.conf";/* directory we'd like to reside, */
+char *config_file = 0;                         /* directory we'd like to reside, */
 char *pid_file = "/expresskeys.pid";   /* and what our different status */
 char *error_file = "/error.log";       /* files should be called */
+char *config_file_padless = "/padless.conf1";
+char *config_file_intuos3 = "/intuos3.conf1";
+char *config_file_graphire4 = "/graphire4.conf1";
 
-int screen;
+int userconfigversion = 0; /* Keep track of which format the user has */
+int config3headerfields = 3; /* Number of fields in the header of a configversion 3 file */
+int configheaderfields = 0; /* How many header fields to actually parse in each file */
+int config3fields = 27; /* Number of fields in a configversion 3 record */
+int configfields = 0; /* How many fields to actually parse in each record */
+int screen;                    /* Active screen. An X thing */
+int just_exit = 0;     /* Do not terminate the program immediately */
 int go_daemon = 0;     /* Do not become a daemon without a command */
+int second_instance = 0; /* Prevent a running program's PID file from erasure */
 int be_verbose = 0; /* Run silently per default */
 int reread_config = 0; /* No memory should be freed on the first read */
-int handle_pen = 0;    /* Pen should not be handled per default */
-int pen_mode = 1;      /* Assume pen is in Absolute mode initially */
-int pen_open = 0;      /* Pen device hasn't been opened */
-int pen_presscurve = 4; /* Pen default Sensitivity. Sample xsetwacom usage */
+int stylus1_mode = 1;  /* Assume pen is in Absolute mode initially */
+int padstylus1_presscurve = 4; /* Stylus default Sensitivity. Sample xsetwacom usage */
 
 int motion_type = NON_VALID;
 int button_press_type = NON_VALID;
 int button_release_type = NON_VALID;
+int proximity_in_type = NON_VALID;
+
+struct program *default_program; /* Pointer to the "default" program record */
 
 /* Allocate space for a list of program definitions (config file based)
    Also initialize a small list that is written out if no config file exists */
 
 struct program external_list [MAXRECORDS];
 struct program internal_list[] = {
-/*     Name    handle_touch */
-{"default",    0,
+/*     Name    stylus1_presscurve      handle_touch */
+{"default",    "0 0 100 100",  0,
 /*             l_touch_up      l_touch_up_plus l_touch_down    l_touch_down_plus */
                98,             0,              104,            0,
 /*             r_touch_up      r_touch_up_plus r_touch_down    r_touch_down_plus */
@@ -73,8 +91,8 @@ struct program internal_list[] = {
 /*             key_15          key_15_plus     key_16          key_16_plus */
                37,             0,              65,             0       },
 
-/*     Name    handle_touch */
-{"Gimp",       1,
+/*     Name    stylus1_presscurve      handle_touch */
+{"Gimp", "0 0 100 100",        1,
 /*             l_touch_up      l_touch_up_plus l_touch_down    l_touch_down_plus */
                20,             0,              61,             0,
 /*             r_touch_up      r_touch_up_plus r_touch_down    r_touch_down_plus */
@@ -88,8 +106,8 @@ struct program internal_list[] = {
 /*             key_15          key_15_plus     key_16          key_16_plus */
                999,            0,              65,             0       },
 
-/*     Name    handle_touch */
-{"Blender",    1,
+/*     Name    stylus1_presscurve      handle_touch */
+{"Blender",    "0 0 100 100",  1,
 /*             l_touch_up      l_touch_up_plus l_touch_down    l_touch_down_plus */
                102,            0,              100,            0,
 /*             r_touch_up      r_touch_up_plus r_touch_down    r_touch_down_plus */
@@ -103,8 +121,8 @@ struct program internal_list[] = {
 /*             key_15          key_15_plus     key_16          key_16_plus */
                999,            0,              65,             0       },
 
-/*     Name    handle_touch */
-{"XTerm",      0,
+/*     Name    stylus1_presscurve      handle_touch */
+{"XTerm",      "0 0 100 100",  0,
 /*             l_touch_up      l_touch_up_plus l_touch_down    l_touch_down_plus */
                0,              0,              0,              0,
 /*             r_touch_up      r_touch_up_plus r_touch_down    r_touch_down_plus */
@@ -116,10 +134,27 @@ struct program internal_list[] = {
 /*             key_13          key_13_plus     key_14          key_14_plus */
                0,              0,              0,              0,
 /*             key_15          key_15_plus     key_16          key_16_plus */
-               999,            0,              0,              0       },
+               999,            0,              0,              0       }
 };
 /* The number of programs (num_list) must be computed here. After the struct */
 int num_list = (sizeof internal_list / sizeof internal_list[0]);
 
+/* These are the keywords prefacing a value in the config file */
+struct configstrings human_readable[] = {
+{"ProgramName", "Stylus1PressCurve", "HandleTouchStrips",
+"LeftPadTouchUp", "LeftPadTouchUpPlus",
+"LeftPadTouchDown", "LeftPadTouchDownPlus",
+"RightPadTouchUp", "RightPadTouchUpPlus",
+"RightPadTouchDown", "RightPadTouchDownPlus",
+"LeftPadButton9", "LeftPadButton9Plus",
+"LeftPadButton10", "LeftPadButton10Plus",
+"LeftPadButton11", "LeftPadButton11Plus",
+"LeftPadButton12", "LeftPadButton12Plus",
+"RightPadButton13", "RightPadButton13Plus",
+"RightPadButton14", "RightPadButton14Plus",
+"RightPadButton15", "RightPadButton15Plus",
+"RightPadButton16", "RightPadButton16Plus" }
+};
+
 /* End Code */
 
index ef58a47..95f54a9 100644 (file)
@@ -1,18 +1,18 @@
 /*
  globals.h -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
+
  Copyright (C) 2005-2006 - Mats Johannesson
+
  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.
@@ -57,71 +57,91 @@ enum {                 /* Strings signaling key's use as a mouse button */
        MOUSE_7,
        MOUSE_BUTTON_MAX
 };
-#define PEN_CURVE_DOWNWARD 1001        /* Pen Sensitivity. Sample xsetwacom usage */
-#define PEN_CURVE_DEFAULT 1002
-#define PEN_CURVE_UPWARD 1003
-#define TOGGLE_PEN 999 /* String signaling the key's use as a mode toggle */
+#define STYLUS1_CURVE_DOWNWARD 1001    /* Pen Sensitivity. Sample xsetwacom usage */
+#define STYLUS1_CURVE_DEFAULT 1002
+#define STYLUS1_CURVE_UPWARD 1003
+#define TOGGLE_STYLUS1 999     /* String signaling the key's use as a mode toggle */
 #define MAXRECORDS 64  /* Max program definitions to handle (enough? ;-) */
-#define MAXFIELDS 25   /* Max entries (minus program name) in each record */
 #define MAXBUFFER 160  /* Scratch buffer. Two full terminal lines */
-#define CONFIG_VERSION 2 /* Config file version - for future format changes */
+#define CURVEMAX 16    /* PressCurve max number length, eg "100 100 100 100" + NULL */
 
 /* Our global variables */
+extern char *configstring; /* Config file string preceding config file version nr. */
+extern char *configversion; /* For future format changes. Define it in globals.c! */
+extern char *pad1idstring;             /* Marker preceding the xorg.conf device Identifier */
+extern char *stylus1idstring;  /* Marker preceding the xorg.conf device Identifier */
 extern char *our_prog_name;    /* This program's file name */
-extern char *our_prog_version; /* Our version. Change it in globals.c! */
-extern char *pen_name;         /* Identifier as set in the X config file */
+extern char *our_prog_version; /* Our program version. Change it in globals.c! */
+extern char *pad1_name;                        /* Identifier as set in the X config file */
+extern char *pad1_autoname;            /* Picking the name directly from X */
+extern char *stylus1_name;             /* Identifier as set in the X config file */
+extern char *stylus1_autoname; /*  Picking the name directly from X */
 extern char *total_config_dir; /* The "~/" of the user, plus our config_dir */
 extern char *total_config_file;        /* total_config_dir plus config_file */
 extern char *total_pid_file;   /* total_config_dir plus pid_file */
 extern char *total_error_file; /* total_config_dir plus error_file */
 extern char *config_dir;       /* Set to a dot directory: .expresskeys */
-extern char *config_file;      /* Set to expresskeys.conf */
+extern char *config_file;      /* Set to NULL */
 extern char *pid_file;         /* Set to expresskeys.pid */
 extern char *error_file;       /* Set to error.log */
+extern char *config_file_padless;
+extern char *config_file_intuos3;
+extern char *config_file_graphire4;
+
 
+extern int userconfigversion; /* Keep track of which format to parse */
+extern int config3headerfields; /* Nr. of fields in the header of a configversion 3 file */
+extern int configheaderfields; /* The decided number of fields to parse in each file */
+extern int config3fields; /* Nr. of fields in a configversion 3 record: globals.c! */
+extern int configfields; /* The decided number of fields to parse in each record */
 extern int screen;     /* Active screen. An X thing */
 extern int num_list;   /* Number of programs we currently handle */
 
+extern int just_exit;  /* Flag to see if we should exit the program immediately */
 extern int go_daemon;  /* Flag to see if this program is in daemon mode */
+extern int second_instance; /* Flag it if a second instance of a daemon run is tried */
 extern int be_verbose; /* Flag to see if we should be spitting out info */
-extern int reread_config; /* Flag for memory release if redoing the config */
-extern int handle_pen; /* Flag (main switch) to see if a pen is handled */
-extern int pen_mode;   /* Flag to keep track of the pen mode we are in */
-extern int pen_open;   /* Flag to make sure we only open the pen once */
-extern int pen_presscurve; /* Pen Sensitivity. Sample xsetwacom usage */
+extern int reread_config; /* Flag for memory release if re-reading the config */
+extern int stylus1_mode;       /* Flag to keep track of the stylus mode we are in */
+extern int padstylus1_presscurve; /* Pen Sensitivity. Sample xsetwacom usage */
 
 extern int motion_type;                /* Event type to keep track of - Touch Strips */
-extern int button_press_type;  /* Event type to keep track of - Pad Buttons */
+extern int button_press_type;  /* Event type to keep track of - Pad/Stylus Buttons */
 extern int button_release_type;        /* Event type to keep track of - Pad Buttons */
-
-/* Global X functions */
-extern Display *display;       /* Active display. An X thing */
-extern XDeviceInfo *pad_info_block;    /* Base address - searching pad info */
-extern XDeviceInfo *pen_info_block; /* Base address - searching pen info */
-extern XDeviceInfo *pad_info;  /* Keeps all X knowledge of the pad device */
-extern XDeviceInfo *pen_info;  /* Keeps all X knowledge of the pen device */
-extern XDevice *pad_device;    /* The actual pointer to the pad device */
-extern XDevice *pen_device;    /* The actual pointer to the pen device */
+extern int proximity_in_type;  /* Event type to keep track of - Stylus In */
 
 /* Our global (internal) functions */
 extern int write_file_config_header(FILE *fp);
 extern int write_file_config(int *ip, FILE *fp);
-extern int read_file_config(int *ip, FILE *fp);
+extern int read_file_config(int *ip, int *ihp, FILE *fp);
 /* get_device_info returns a long to satisfy x86_64 systems */
 extern long get_device_info(Display *display, XDeviceInfo *info, char *name);
-extern int register_events(Display *display, XDeviceInfo *pad_info, char *name);
-extern int toggle_pen_mode(Display *display, char *name);
+extern int register_events(Display *display, XDeviceInfo *dev_info, char *name);
+extern int toggle_stylus1_mode(Display *display, char *name);
 extern int use_events(Display *display);
 extern int call_xsetwacom(int num);
 extern void exit_on_error(FILE *fp, char *string1, char *string2, char *string3);
 extern void re_read_file_config(int signum);
+extern void status_report(int signum);
 extern void clean_up_exit(int signum);
 
+/* Global X structures */
+extern Display *display;       /* Active display. An X thing */
+extern XDeviceInfo *pad1_info_block;   /* Base address - searching pad info */
+extern XDeviceInfo *stylus1_info_block; /* Base address - searching pen info */
+extern XDeviceInfo *pad1_info; /* Keeps all X knowledge of the pad device */
+extern XDeviceInfo *stylus1_info;      /* Keeps all X knowledge of the pen device */
+extern XDevice *pad1_device;   /* The actual pointer to the pad device */
+extern XDevice *stylus1_device;        /* The actual pointer to the pen device */
+
 /* Our global structures */
+extern struct program *default_program; /* Pointer to the "default" program record */
+
 /* The internal_list is initialized in globals.c
    The external_list is initialized from file reads */
 extern struct program {
        char *class_name;
+       char *stylus1_presscurve;
        int handle_touch;
        int l_touch_up;
        int l_touch_up_plus;
@@ -149,5 +169,36 @@ extern struct program {
        int key_16_plus;
 }internal_list [], external_list [];
 
+/* This list is initialized in globals.c */
+extern struct configstrings {
+       char *h_class_name;
+       char *h_stylus1_presscurve;
+       char *h_handle_touch;
+       char *h_l_touch_up;
+       char *h_l_touch_up_plus;
+       char *h_l_touch_down;
+       char *h_l_touch_down_plus;
+       char *h_r_touch_up;
+       char *h_r_touch_up_plus;
+       char *h_r_touch_down;
+       char *h_r_touch_down_plus;
+       char *h_key_9;
+       char *h_key_9_plus;
+       char *h_key_10;
+       char *h_key_10_plus;
+       char *h_key_11;
+       char *h_key_11_plus;
+       char *h_key_12;
+       char *h_key_12_plus;
+       char *h_key_13;
+       char *h_key_13_plus;
+       char *h_key_14;
+       char *h_key_14_plus;
+       char *h_key_15;
+       char *h_key_15_plus;
+       char *h_key_16;
+       char *h_key_16_plus;
+}human_readable [];
+
 /* End Code */
 
index d1131ec..e68d32e 100644 (file)
@@ -1,18 +1,18 @@
 /*
  main_setup.c -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
+
  Copyright (C) 2005-2006 - Mats Johannesson
+
  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.
@@ -25,21 +25,14 @@ int main (int argc, char *argv[])
 
        our_prog_name = basename(argv[0]);
 
-       struct program *p;
-
-       int i = 0;
        int len = 0;
 
+       struct program *p;
+       struct configstrings *hp;
+
        FILE *fp = NULL;
        FILE *errorfp = NULL;
 
-/* Prelaunch sanity checks: See if X is OK */
-
-       if ((display = XOpenDisplay(NULL)) == NULL) {
-               exit_on_error(errorfp, "%s ERROR: Can not connect to your X Server\n", our_prog_name, "");
-       }
-       screen = DefaultScreen(display);
-
 /* Locate the home directory of the user running this program */
 
        char *user_homedir;
@@ -59,22 +52,12 @@ int main (int argc, char *argv[])
        sprintf(total_config_dir_block, "%s%s", user_homedir, config_dir);
        total_config_dir = total_config_dir_block;
 
-/* Concatenate the full path with the config file name. Store address */
-
-       char *total_config_file_block;
-       len = strlen(total_config_dir) + strlen(config_file) + 1;
-       if ((total_config_file_block = (char *)malloc(len)) == NULL) {
-               exit_on_error(errorfp, "%s ERROR: Memory allocation trouble at stage 2!\n", our_prog_name, "");
-       }
-       sprintf(total_config_file_block, "%s%s", total_config_dir, config_file);
-       total_config_file = total_config_file_block;
-
 /* Concatenate the full path with the pid file name. Store address */
 
        char *total_pid_file_block;
        len = strlen(total_config_dir) + strlen(pid_file) + 1;
        if ((total_pid_file_block = (char *)malloc(len)) == NULL) {
-               exit_on_error(errorfp, "%s ERROR: Memory allocation trouble at stage 3!\n", our_prog_name, "");
+               exit_on_error(errorfp, "%s ERROR: Memory allocation trouble at stage 2!\n", our_prog_name, "");
        }
        sprintf(total_pid_file_block, "%s%s", total_config_dir, pid_file);
        total_pid_file = total_pid_file_block;
@@ -84,15 +67,11 @@ int main (int argc, char *argv[])
        char *total_error_file_block;
        len = strlen(total_config_dir) + strlen(error_file) + 1;
        if ((total_error_file_block = (char *)malloc(len)) == NULL) {
-               exit_on_error(errorfp, "%s ERROR: Memory allocation trouble at stage 4!\n", our_prog_name, "");
+               exit_on_error(errorfp, "%s ERROR: Memory allocation trouble at stage 3!\n", our_prog_name, "");
        }
        sprintf(total_error_file_block, "%s%s", total_config_dir, error_file);
        total_error_file = total_error_file_block;
 
-/* Prepare a scratch buffer for reading in an eventual PID */
-
-       char pid_buffer [MAXBUFFER];
-
 /* Try to open the the configuration directory for reading, just as a
    test to see if it exists. A failure here can mean many things, but we
    then try to create it as a means to rule out a true lack of existence */
@@ -105,27 +84,19 @@ int main (int argc, char *argv[])
                fclose(fp);
        }
 
-/* If a pid file exists it is a sign of either A) program already runs, or
-   B) a crash/brutal kill not handled by our exit routine has occured
-   previously. We therefore read in such a PID and perform a "fake" kill
-   with it (signal number 0). If -1 (error) is returned we just carry on.
-   Otherwise our kill test detected a process with that PID and we exit,
-   based on the assumption that another instance is running */
-
-       if ((fp = fopen(total_pid_file, "r")) != NULL) {
-               fgets(pid_buffer, MAXBUFFER, fp);
-               fclose(fp);
-               if ((kill(atoi(pid_buffer), 0)) != NON_VALID) {
-                       exit_on_error(errorfp, "%s ERROR: Another instance of %s seems to be running!\n", our_prog_name, our_prog_name);
-               }
-       }
-
 /* Open (and truncate) an error log for future reference */
 
        if ((errorfp = fopen(total_error_file, "w")) == NULL) {
                exit_on_error(errorfp, "%s ERROR: Can not open %s in write mode\n", our_prog_name, total_error_file);
        }
 
+/* Prelaunch sanity checks: See if X is OK */
+
+       if ((display = XOpenDisplay(NULL)) == NULL) {
+               exit_on_error(errorfp, "%s ERROR: Can not connect to your X Server\n", our_prog_name, "");
+       }
+       screen = DefaultScreen(display);
+
 /* Can we use XTest to send fake key presses */
 
        int event_base, error_base;
@@ -145,64 +116,302 @@ int main (int argc, char *argv[])
                exit_on_error(errorfp, "%s ERROR: XInput extension not present on your X server\n", our_prog_name, "");
        }
 
-/* We need at least the pad name specified... */
+/* Automatically discover, open and register events with the first devices
+   that contain the string 'pad' and/or 'stylus' in their xorg.conf "Identifier"
+   entries (case insensitive). These devices will be invalidated if the user
+   specifies a named device on the command line (at least for now, since we only
+   allow one device of each kind to be registered) */
+
+       pad1_info = (void *) get_device_info(display, pad1_info_block, pad1_autoname);
+       if (pad1_info) {
+               if (register_events(display, pad1_info, pad1_info->name)) {
+                       pad1_autoname = pad1_info->name;
+               } else {
+                       pad1_autoname = 0;
+               }
+       } else {
+               pad1_autoname = 0;
+       }
+
+       stylus1_info = (void *) get_device_info(display, stylus1_info_block, stylus1_autoname);
+       if (stylus1_info) {
+               if (register_events(display, stylus1_info, stylus1_info->name)) {
+                       stylus1_autoname = stylus1_info->name;
+               } else {
+                       stylus1_autoname = 0;
+               }
+       } else {
+               stylus1_autoname = 0;
+       }
+
+/* Free X memory allocations for missing devices */
 
-       if (argc < 2) {
+       if (!pad1_autoname) {
+               XFreeDeviceList(pad1_info_block);
+               pad1_info_block = 0;
+       }
+       if (!stylus1_autoname) {
+               XFreeDeviceList(stylus1_info_block);
+               stylus1_info_block = 0;
+       }
+
+/* If NO device can be found or have its events registered, we exit. Fair? */
+
+       if ((!pad1_autoname) && (!stylus1_autoname)) {
+               exit_on_error(errorfp, "%s ERROR: Absolutely NO 'pad' or 'stylus' device seem to be connected. Check your system (eg xorg.conf)! Verify this lack by running \"xsetwacom list\" or \"xidump -l\"\n", our_prog_name, "");
+       }
+
+/* Command line handling */
+
+       char read_buffer [MAXBUFFER];
+       char write_buffer [MAXBUFFER];
+
+       int send_sigterm = 0;
+       int send_sigusr1 = 0;
+       int send_sigusr2 = 0;
+       int give_help = 0;
+
+       int i, c, d;
+
+       while ((--argc > 0) && (**++argv == '-' || **argv != '-')) {
+               if (**argv == '-') {
+                       while (((c = *++argv[0])) && (argc != NON_VALID)) {
+                               switch (c) {
+
+                                       case 'd':
+                                       go_daemon = 1;
+                                       break;
+
+                                       case 'k':
+                                       send_sigterm = 1;
+                                       break;
+
+                                       case 'r':
+                                       send_sigusr1 = 1;
+                                       break;
+
+                                       case 'v':
+                                       be_verbose = 1;
+                                       break;
+
+                                       case 'x':
+                                       just_exit = 1;
+                                       be_verbose = 1;
+                                       break;
+
+                                       case 's':
+                                       send_sigusr2 = 1;
+                                       break;
+
+                                       case 'h':
+                                       give_help = 1;
+                                       break;
+
+                                       default:
+                                       fprintf(stderr, "\n%s ERROR: Invalid switch '-%c' on command line.\n", our_prog_name, c);
+                                       argc = NON_VALID;
+                                       break;
+                               }
+                       }
+               } else {
+                       len = strlen(*argv);
+                       if (len < MAXBUFFER) {
+                               sprintf(read_buffer, "%s", *argv);
+                               for (i = 0; i < len; i++) {
+                                       d = tolower(read_buffer[i]); /* Turn everything into lower case */
+                                       sprintf(write_buffer+i, "%c", d);
+                                       ++read_buffer[i];
+                               }
+                               strncpy(write_buffer + len, "\0", 1);
+                       } else {
+                               exit_on_error(errorfp, "%s ERROR: A device name on the command line was too long to handle!\n", our_prog_name, "");
+                       }
+                       if (!pad1_name) {
+                               if ((strstr(write_buffer, "pad")) !=NULL) {
+                                       pad1_name = *argv;
+                               }
+                       }
+                       if (!stylus1_name) {
+                               if ((strstr(write_buffer, "stylus")) !=NULL) {
+                                       stylus1_name = *argv;
+                               }
+                       }
+                       if ((!pad1_name) && (!stylus1_name)) {
+                               argc = NON_VALID;
+                       }
+               }
+       }
+       if ((argc != 0) || (give_help == 1)) {
                fprintf(stderr, "\n");
                fprintf(stderr, "%s Version: %s\n", our_prog_name, our_prog_version);
                fprintf(stderr, "\n");
-               fprintf(stderr, "Usage: %s <pad-device-name> [<pen-device-name>] [-d] [-v]\n", our_prog_name);
+               fprintf(stderr, "Usage: %s [OPTION]... [DEVICE]...\n", our_prog_name);
+               fprintf(stderr, "Any combination of pad and/or stylus can be specified.\n");
+               fprintf(stderr, "An empty command line means automatic device search.\n");
+               fprintf(stderr, "Options can be written like -dv or -d -v in any place.\n");
                fprintf(stderr, "\n");
-               fprintf(stderr, "Where the pad name is mandatory. Specify a pen name\n");
-               fprintf(stderr, "if you want the program to handle pen mode switches.\n");
-               fprintf(stderr, "Use -d to make the program a daemon (run in the background).\n");
-               fprintf(stderr, "Use -v to print info to the screen at many execution points.\n");
+               fprintf(stderr, "  -d makes the program a daemon (runs in the background).\n");
+               fprintf(stderr, "  -k terminates (kills) an already running daemon instance.\n");
+               fprintf(stderr, "  -r re-reads the configuration file of a running daemon.\n");
+               fprintf(stderr, "  -v prints info to the screen at many execution points.\n");
+               fprintf(stderr, "  -x sets -v and exits after some important info blocks.\n");
+               fprintf(stderr, "  -s tells a daemon instance to report status (info block).\n");
+               fprintf(stderr, "  -h unconditionally brings up this help text.\n");
                fprintf(stderr, "\n");
-               fprintf(stderr, "Example: %s pad stylus -d\n", our_prog_name);
+               fprintf(stderr, "Example1: %s -d (first 'pad' and/or 'stylus' found get used)\n", our_prog_name);
+               fprintf(stderr, "Example2: %s 1stIntuos3Pad 1stIntuos3Stylus2 -d (named devices)\n", our_prog_name);
+               fprintf(stderr, "Example3: %s -rv (visibly re-read the configuration file)\n", our_prog_name);
                fprintf(stderr, "\n");
                fprintf(stderr, "Please direct any bug reports or questions to the top address\n");
                fprintf(stderr, "in the AUTHORS file. This program is _not_ a linuxwacom project.\n");
-               fprintf(stderr, "\n");
                exit_on_error(errorfp, "", "", "");
        }
 
-/* See if the pad is for real, and if it is active */
+/* Prepare a scratch buffer for reading in an eventual PID */
 
-       pad_info = (void *) get_device_info(display, pad_info_block, argv[1]);
-       if (!pad_info) {
-               exit_on_error(errorfp, "%s ERROR: Can not find pad device: %s\n", our_prog_name, argv[1]);
-       }
+       char pid_buffer [MAXBUFFER];
 
-/* Set a flag if we should run as a daemon or/and in verbose mode. Also
-   register and check a pen device, should such an action be requested */
+/* The following routine handles both intentional re-runs of the program
+   (configuration file re-read requests or a terminate to a daemon), and
+   unintentional attempts to start another daemon. The latter goes like:
 
-       if (argc > 2) {
-               for (i = 2; i < argc; i++) {
-                       if (strcmp(argv[i], "-d") == 0) {
-                               go_daemon = 1;
-                               break;
+   If a pid file exists it is a sign of either A) program already runs, or
+   B) a crash/brutal kill not handled by our exit routine has occured
+   previously. We therefore read in such a PID and perform a "fake" kill
+   with it (signal number 0). If -1 (error) is returned we just carry on.
+   Otherwise our kill test detected a process with that PID and we exit,
+   based on the assumption that another instance is running */
+
+       if ((fp = fopen(total_pid_file, "r")) != NULL) { /* File exists */
+               fgets(pid_buffer, MAXBUFFER, fp);
+               fclose(fp);
+               if (((kill(atoi(pid_buffer), 0)) != NON_VALID)) { /* Live pid-file */
+                       if ((send_sigusr1) || (send_sigusr2) || (send_sigterm)) {
+                               if (send_sigusr1) {
+                                       if ((kill(atoi(pid_buffer), SIGUSR1)) != NON_VALID) {
+                                               if (be_verbose) {
+                                                       exit_on_error(errorfp, "%s SUCCESS: The %s configuration file has been re-read\n", our_prog_name, our_prog_name);
+                                               }
+                                               exit_on_error(errorfp, "", "", "");
+                                       } else {
+                                               exit_on_error(errorfp, "%s FAILURE: The %s configuration file could not be re-read!\n", our_prog_name, our_prog_name);
+                                       }
+                               }
+                               if (send_sigusr2) {
+                                       if ((kill(atoi(pid_buffer), SIGUSR2)) != NON_VALID) {
+                                               if (be_verbose) {
+                                                       exit_on_error(errorfp, "%s SUCCESS: The %s status has been reported\n", our_prog_name, our_prog_name);
+                                               }
+                                               exit_on_error(errorfp, "", "", "");
+                                       } else {
+                                               exit_on_error(errorfp, "%s FAILURE: The %s status could not be reported!\n", our_prog_name, our_prog_name);
+                                       }
+                               }
+                               if (send_sigterm) {
+                                       if ((kill(atoi(pid_buffer), SIGTERM)) != NON_VALID) {
+                                               if (be_verbose) {
+                                                       exit_on_error(errorfp, "%s SUCCESS: The %s daemon has been terminated\n", our_prog_name, our_prog_name);
+                                               }
+                                               exit_on_error(errorfp, "", "", "");
+                                       } else {
+                                               exit_on_error(errorfp, "%s FAILURE: The %s daemon could not be terminated!\n", our_prog_name, our_prog_name);
+                                       }
+                               }
+                       } else {
+                               second_instance = 1; /* Flag prevents a PID-file deletion */
+                               exit_on_error(errorfp, "%s ERROR: Another instance of %s seems to be running!\n", our_prog_name, our_prog_name);
                        }
+               } else { /* Dead pid-file */
+                       if ((send_sigusr1) || (send_sigusr2) || (send_sigterm)) {
+                               exit_on_error(errorfp, "%s ERROR: No daemon instance of %s found to send a -r -s or -k\n", our_prog_name, our_prog_name);
+                       }
+               }
+       } else { /* No file at all */
+               if ((send_sigusr1) || (send_sigusr2) || (send_sigterm)) {
+                       exit_on_error(errorfp, "%s ERROR: No daemon instance of %s found to send a -r -s or -k\n", our_prog_name, our_prog_name);
                }
-               for (i = 2; i < argc; i++) {
-                       if (strcmp(argv[i], "-v") == 0) {
-                               be_verbose = 1;
-                               break;
+       }
+
+/* See if a requested pad is for real, and if events can be registered with it */
+
+       if (pad1_name) {
+               if ((pad1_autoname) && ((strlen(pad1_autoname) != (strlen(pad1_name))))) {
+                       XFreeDeviceList(pad1_info_block);
+                       pad1_info_block = 0;
+                       pad1_autoname = 0;
+               } else {
+                       if ((pad1_autoname) && ((strcmp(pad1_autoname, pad1_name)) != 0)) {
+                               XFreeDeviceList(pad1_info_block);
+                               pad1_info_block = 0;
+                               pad1_autoname = 0;
                        }
                }
-               for (i = 2; i < argc; i++) {
-                       if ((strcmp(argv[i], "-d")) != 0 &&
-                       ((strcmp(argv[i], "-v")) != 0)) {
-                               pen_name = argv[i];
-                               handle_pen = 1;
-                               pen_info = (void *) get_device_info(display, pen_info_block, argv[i]);
-                               if (!pen_info) {
-                                       exit_on_error(errorfp, "%s ERROR: Can not find pen device: %s\n", our_prog_name, pen_name);
-                               }
-                               break;
+               if (!pad1_info_block) {
+                       pad1_info = (void *) get_device_info(display, pad1_info_block, pad1_name);
+                       if (!pad1_info) {
+                               exit_on_error(errorfp, "%s ERROR: Can not find pad device: %s\n", our_prog_name, pad1_name);
+                       }
+                       if (!register_events(display, pad1_info, pad1_name)) {
+                               exit_on_error(errorfp, "%s ERROR: Could not register any pad events with %s\n", our_prog_name, pad1_name);
                        }
+               } else {
+                       pad1_name = pad1_autoname;
+               }
+       } else {
+               pad1_name = pad1_autoname;
+       }
+
+/* See if a requested stylus is for real, and if events can be registered with it */
+
+       if (stylus1_name) {
+               if ((stylus1_autoname) && ((strlen(stylus1_autoname) != (strlen(stylus1_name))))) {
+                       XFreeDeviceList(stylus1_info_block);
+                       stylus1_info_block = 0;
+                       stylus1_autoname = 0;
+               } else {
+                       if ((stylus1_autoname) && ((strcmp(stylus1_autoname, stylus1_name)) != 0)) {
+                               XFreeDeviceList(stylus1_info_block);
+                               stylus1_info_block = 0;
+                               stylus1_autoname = 0;
+                       }
+               }
+               if (!stylus1_info_block) {
+                       stylus1_info = (void *) get_device_info(display, stylus1_info_block, stylus1_name);
+                       if (!stylus1_info) {
+                               exit_on_error(errorfp, "%s ERROR: Can not find stylus device: %s\n", our_prog_name, stylus1_name);
+                       }
+                       if (!register_events(display, stylus1_info, stylus1_name)) {
+                               exit_on_error(errorfp, "%s ERROR: Could not register any stylus events with %s\n", our_prog_name, stylus1_name);
+                       }
+               } else {
+                       stylus1_name = stylus1_autoname;
+               }
+       } else {
+               stylus1_name = stylus1_autoname;
+       }
+
+/* Now determine what the config file will be named as */
+
+       if ((pad1_name) && (stylus1_name)) {
+               config_file = config_file_intuos3;
+       } else {
+               if (stylus1_name) {
+                       config_file = config_file_padless;
+               } else {
+                       config_file = config_file_intuos3; /* User error? 'pad' without 'stylus'! */
                }
        }
 
+/* Concatenate the full path with the config file name. Store address */
+
+       char *total_config_file_block;
+       len = strlen(total_config_dir) + strlen(config_file) + 1;
+       if ((total_config_file_block = (char *)malloc(len)) == NULL) {
+               exit_on_error(errorfp, "%s ERROR: Memory allocation trouble at stage 4!\n", our_prog_name, "");
+       }
+       sprintf(total_config_file_block, "%s%s", total_config_dir, config_file);
+       total_config_file = total_config_file_block;
+
        if (be_verbose) {
                fprintf(stderr, "PGR VERSION = %s\n", our_prog_version);
                fprintf(stderr, "USR HOMEDIR = %s\n", user_homedir);
@@ -210,18 +419,11 @@ int main (int argc, char *argv[])
                fprintf(stderr, "OUR CNFFILE = %s\n", total_config_file);
                fprintf(stderr, "OUR PIDFILE = %s\n", total_pid_file);
                fprintf(stderr, "OUR LOGFILE = %s\n", total_error_file);
-               fprintf(stderr, "OUR PADNAME = %s\n", argv[1]);
-               if (pen_name) {
-                       fprintf(stderr, "OUR PENNAME = %s\n", pen_name);
+               if (pad1_name) {
+                       fprintf(stderr, "OUR PD1NAME = %s\n", pad1_name);
                }
-       }
-
-/* Make sure we can open a requested pen */
-
-       if (handle_pen) {
-               pen_mode = Relative;
-               if (toggle_pen_mode(display, pen_name)) {
-                       exit_on_error(errorfp, "%s ERROR: Can not open pen device: %s\n", our_prog_name, pen_name);
+               if (stylus1_name) {
+                       fprintf(stderr, "OUR ST1NAME = %s\n", stylus1_name);
                }
        }
 
@@ -247,26 +449,36 @@ int main (int argc, char *argv[])
 /* Read in an existing configuration file */
 
        p = external_list;
+       hp = human_readable;
        if ((fp = fopen(total_config_file, "r")) == NULL) {
                exit_on_error(errorfp, "%s ERROR: Can not open %s in read mode\n", our_prog_name, total_config_file);
        } else {
-               switch (read_file_config((void *)&p, fp)){
-                       
-                       case 0:
+               switch (read_file_config((void *)&p, (void *)&hp, fp)){
+
+                       case 0: /* No errors */
                        fclose(fp);
-                       break;
+                       break; /* OBS An identical list of error code returns exist in the on_signal.c
+                                       file (the re_read_file_config function). So change both when altering. */
 
                        case 1:
                        fclose(fp);
                        exit_on_error(errorfp, "%s ERROR: No complete record found in %s\n", our_prog_name, total_config_file);
-                       
+
                        case 2:
                        fclose(fp);
                        exit_on_error(errorfp, "%s ERROR: Memory allocation error while parsing %s\n", our_prog_name, total_config_file);
 
                        case 3:
                        fclose(fp);
-                       exit_on_error(errorfp, "%s ERROR: Config File Version %d not found\n", our_prog_name, (void *)CONFIG_VERSION);
+                       exit_on_error(errorfp, "%s ERROR: Config File Version 3 or higher not found\n", our_prog_name, "");
+
+                       case 4:
+                       fclose(fp);
+                       exit_on_error(errorfp, "%s ERROR: A line was too long to handle in the Config File %s\n", our_prog_name, total_config_file);
+
+                       case 5:
+                       fclose(fp);
+                       exit_on_error(errorfp, "%s ERROR: A program record named \"default\" must exist in %s\n", our_prog_name, total_config_file);
 
                        default:
                        fclose(fp);
@@ -274,25 +486,31 @@ int main (int argc, char *argv[])
                }
        }
 
+/* Exit if all we wanted to see was the main 'debugging' info block */
+
+       if (just_exit) {
+               exit_on_error(errorfp, "", "", "");
+       }
+
 /* Replace some of the normal signal handlers with our own functions. We
-   want SIGUSR1 and SIGUSR2 to read in the config file after a modification,
+   want SIGUSR1 to read in the config file after a modification, SIGUSR2
+   to print status (the information we would get from -x) to the screen,
    and all the normal program exits should first clean up a bit */
 
        if ((signal(SIGUSR1, re_read_file_config) == SIG_ERR)
-               || (signal(SIGUSR2, re_read_file_config) == SIG_ERR)
+               || (signal(SIGUSR2, status_report) == SIG_ERR)
                || (signal(SIGINT, clean_up_exit) == SIG_ERR)
                || (signal(SIGHUP, clean_up_exit) == SIG_ERR)
                || (signal(SIGTERM, clean_up_exit) == SIG_ERR)) {
                exit_on_error(errorfp, "%s ERROR: Failed to modify signal handling!\n", our_prog_name, "");
        }
 
-/* Ready to launch in the foreground or as a daemon after one last check.
+/* Ready to launch in the foreground or as a daemon.
    In daemon mode we also take care of storing our PID in the config dir
    Observe that with a (0, 0) standard input/output/error goes to /dev/null
    I've found it better to use (0, 1) and see errors while writing the code
    It also comes in handy when running in (-v) verbose mode */
 
-       if (register_events(display, pad_info, argv[1])) {
                if (go_daemon) {
                        if ((daemon(0, 1)) == NON_VALID) {
                                exit_on_error(errorfp, "%s ERROR: Failed to fork into daemon mode! EXITING!\n", our_prog_name, "");
@@ -315,9 +533,6 @@ int main (int argc, char *argv[])
                }
                fclose(errorfp);
                use_events(display); /* <-- Our true launch! The event loop */
-       } else {
-               exit_on_error(errorfp, "%s ERROR: Could not register any events!\n", our_prog_name, "");
-       }
 
        exit(EXIT_OK); /* We should never reach this */
 
index 09d31e5..15c493d 100644 (file)
@@ -1,18 +1,18 @@
 /*
  on_error.c -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
+
  Copyright (C) 2005-2006 - Mats Johannesson
+
  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.
@@ -33,7 +33,8 @@ void exit_on_error(FILE *fp, char *string1, char *string2, char *string3)
        }
 
        fprintf(stderr, string1, string2, string3);
-       clean_up_exit(SIGTERM);
+       clean_up_exit(SIGINT); /* We use SIGINT here instead of SIGTERM to get rid */
+                            /* of the "Terminated" message printed by the shell */
 
 /* FIXME Drops the state EXIT_KO when calling clean_up_exit, becomes EXIT_OK */
 
index 2438a4a..ed19229 100644 (file)
@@ -1,18 +1,18 @@
 /*
  on_signal.c -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
+
  Copyright (C) 2005-2006 - Mats Johannesson
+
  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.
 #include "globals.h"
 
 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- Function acts as a signal handler replacement for SIGUSR1 and SIGUSR2
- On these signals we read a possibly changed configuration file again
+ Function acts as a signal handler replacement for SIGUSR1
+ On this signal we read a possibly changed configuration file again
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
 
 void re_read_file_config(int signum)
 {
 
        struct program *p;
+       struct configstrings *hp;
 
        FILE *fp;
        FILE *errorfp;
 
 /* Open (and truncate) an error log for future reference */
-       
+
        if ((errorfp = fopen(total_error_file, "w")) == NULL) {
                exit_on_error(errorfp, "%s ERROR: Reread - Can not open %s in write mode\n", our_prog_name, total_error_file);
        }
@@ -42,36 +43,82 @@ void re_read_file_config(int signum)
 /* Read in an existing configuration file */
 
        p = external_list;
+       hp = human_readable;
        if ((fp = fopen(total_config_file, "r")) == NULL) {
                exit_on_error(errorfp, "%s ERROR: Reread - Can not open %s in read mode\n", our_prog_name, total_config_file);
        } else {
-               switch (read_file_config((void *)&p, fp)){
-                       
-                       case 0:
+               switch (read_file_config((void *)&p, (void *)&hp, fp)){
+
+                       case 0: /* No errors */
                        fclose(fp);
-                       break;
+                       break; /* OBS An identical list of error code returns exist in the
+                                       main_setup.c file. So change both when altering. */
 
                        case 1:
                        fclose(fp);
                        exit_on_error(errorfp, "%s ERROR: Reread - No complete record found in %s\n", our_prog_name, total_config_file);
-                       
+
                        case 2:
                        fclose(fp);
                        exit_on_error(errorfp, "%s ERROR: Reread - Memory allocation error while parsing %s\n", our_prog_name, total_config_file);
 
                        case 3:
                        fclose(fp);
-                       exit_on_error(errorfp, "%s ERROR: Reread - Config File Version %d not found\n", our_prog_name, (void *)CONFIG_VERSION);
+                       exit_on_error(errorfp, "%s ERROR: Reread - Config File Version 3 or higher not found\n", our_prog_name, "");
+
+                       case 4:
+                       fclose(fp);
+                       exit_on_error(errorfp, "%s ERROR: Reread - A line was too long to handle in the Config File %s\n", our_prog_name, total_config_file);
+
+                       case 5:
+                       fclose(fp);
+                       exit_on_error(errorfp, "%s ERROR: Reread - A program record named \"default\" must exist in %s\n", our_prog_name, total_config_file);
 
                        default:
                        fclose(fp);
                        exit_on_error(errorfp, "%s ERROR: Reread - Unknown error while parsing %s\n", our_prog_name, total_config_file);
                }
        }
-       
+
        fclose(errorfp);
 }
 
+/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Function acts as a signal handler replacement for SIGUSR2
+ On this signal we print some choise information to the screen
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+
+void status_report(int signum)
+{
+
+       struct program *p;
+       p = external_list;
+       int i;
+
+       fprintf(stderr, "PGR VERSION = %s\n", our_prog_version);
+       fprintf(stderr, "USR HOMEDIR = %s\n", getenv("HOME"));
+       fprintf(stderr, "OUR CNF-DIR = %s\n", total_config_dir);
+       fprintf(stderr, "OUR CNFFILE = %s\n", total_config_file);
+       fprintf(stderr, "OUR PIDFILE = %s\n", total_pid_file);
+       fprintf(stderr, "OUR LOGFILE = %s\n", total_error_file);
+       if (pad1_name) {
+               fprintf(stderr, "OUR PD1NAME = %s\n", pad1_name);
+       }
+       if (stylus1_name) {
+               fprintf(stderr, "OUR ST1NAME = %s\n", stylus1_name);
+       }
+       fprintf(stderr, "%s-user = %d\n", configstring, userconfigversion);
+       fprintf(stderr, "%s-ours = %s\n", configstring, configversion);
+       fprintf(stderr, "ConfigHeaderFields = %d\n", configheaderfields);
+       for (i = 0; i < num_list; i++, p++) {
+               fprintf(stderr, "PGR RECNAME = %s\n", p->class_name);
+               fprintf(stderr, "ST1 PRCURVE = \"%s\"\n", p->stylus1_presscurve);
+       }
+       fprintf(stderr, "PGR RECORDS = %d\n", num_list);
+       fprintf(stderr, "OUR RUN-PID = %d\n", getpid());
+
+}
+
 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  Function acts as a signal handler replacement for SIGINT, SIGHUP and
  SIGTERM. All are normal exit signals. We want to trap them in order to
@@ -92,8 +139,8 @@ void clean_up_exit(int signum)
                raise(signum);
        }
        clean_up_exit_in_progress = 1;
-       
-       if (go_daemon) {
+
+       if ((go_daemon) && (!second_instance)) { /* Prevent accidental deletion */
                unlink(total_pid_file);
        }
 
@@ -115,21 +162,23 @@ void clean_up_exit(int signum)
 
        if (num_list) {
                for (i = 0; i < num_list; i++, p++) {
+                       free(p->stylus1_presscurve);
                        free(p->class_name);
                }
        }
 
-       if (pad_info_block) {
-               XFreeDeviceList(pad_info_block);
+       if (pad1_info_block) {
+               XFreeDeviceList(pad1_info_block);
        }
 
-       if (pen_info_block) {
-               XFreeDeviceList(pen_info_block);
+       if (stylus1_info_block) {
+               XFreeDeviceList(stylus1_info_block);
        }
 
-/* pad_device and pen_device should not be explicitly closed by a
+/* pad1_device and stylus1_device should not be explicitly closed by a
    call to XCloseDevice. It leaves a message from X (in the terminal
-   where X is started from) saying: "ProcXCloseDevice to close or not ?" */
+   where X is started from) saying: "ProcXCloseDevice to close or not ?"
+   Like the program "xsetwacom" does on every device change...*/
 
        if (display) {
                XCloseDisplay(display);
index 903ff41..5d1924a 100644 (file)
@@ -1,20 +1,20 @@
 /*
  pen_mode.c -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
+
  Copyright (C) 2005-2006 - Mats Johannesson
+
  Based on setmode.c 1996 by Frederic Lepied (xinput-1.2)
+
  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.
 #include "globals.h"
 
 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- Function opens the X input device (which stays open until program end)
- and toggles mode between Absolute and Relative based on a flag status.
- We make sure to only open the pen once by setting another flag.
+ Function toggles mode between Absolute and Relative based on a flag status.
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
 
-int toggle_pen_mode(Display *display, char *name)
+int toggle_stylus1_mode(Display *display, char *name)
 {
 
-       if (pen_mode == Absolute) {
-               pen_mode = Relative;
+       if (stylus1_mode == Absolute) {
+               stylus1_mode = Relative;
        } else {
-               pen_mode = Absolute;
+               stylus1_mode = Absolute;
        }
 
        if (be_verbose) {
-               fprintf(stderr, "PEN MODE = %d\n", pen_mode);
+               fprintf(stderr, "ST1 MODE = %d\n", stylus1_mode);
        }
 
-       if (!pen_open){
-               pen_device = XOpenDevice(display, pen_info->id);
-               pen_open = 1;
-       }
-       
-       if ((pen_device) && (pen_open)) {
-               XSetDeviceMode(display, pen_device, pen_mode);
+       if (stylus1_info) {
+               XSetDeviceMode(display, stylus1_device, stylus1_mode);
                return 0;
        } else {
                return 1;
index 335ddba..57ed878 100644 (file)
@@ -1,20 +1,20 @@
 /*
  reg_events.c -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
+
  Copyright (C) 2005-2006 - Mats Johannesson
+
  Based on test.c 1996 by Frederic Lepied (xinput-1.2)
+
  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.
  Function opens the X input device (which stays open until program end)
  and starts to look for supported event types. The scope should be the
  root window (ie everywhere) and we're only interested in motion events
- (touch strip action) and button press/release. Having found the info
- we ask the X server to keep us continuously notified about these events
+ (touch strip action) and button press/release (for stylus only press and
+ proximityin). Having found the info we ask the X server to keep us
+ continuously notified about these events.
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
 
-int register_events(Display *display, XDeviceInfo *pad_info, char *name)
+int register_events(Display *display, XDeviceInfo *dev_info, char *name)
 {
        int i;
        int count = 0;
-       XEventClass event_list[3];
+
        XInputClassInfo *ip;
        Window root_win;
 
        root_win = RootWindow(display, screen);
 
-       pad_device = XOpenDevice(display, pad_info->id);
-       if (!pad_device) {
-               return 0;
-       }
-
-       if (pad_device->num_classes > 0) {
-               for (ip = pad_device->classes, i = 0; i < pad_info->num_classes; ip++, i++) {
-                       switch (ip->input_class) {
+       if ((pad1_info) && (dev_info->id == pad1_info->id)) {
+               XEventClass event_list[3];
+               pad1_device = XOpenDevice(display, dev_info->id);
+               if (!pad1_device) {
+                       return 0;
+               }
+               if (pad1_device->num_classes > 0) {
+                       for (ip = pad1_device->classes, i = 0; i < pad1_info->num_classes; ip++, i++) {
+                               switch (ip->input_class) {
 
-                       case ButtonClass:
-                       DeviceButtonPress(pad_device, button_press_type, event_list[count]);
-                       count++;
-                       DeviceButtonRelease(pad_device, button_release_type, event_list[count]);
-                       count++;
-                       break;
+                               case ButtonClass:
+                               DeviceButtonPress(pad1_device, button_press_type, event_list[count]);
+                               count++;
+                               DeviceButtonRelease(pad1_device, button_release_type, event_list[count]);
+                               count++;
+                               break;
 
-                       case ValuatorClass:
-                       DeviceMotionNotify(pad_device, motion_type, event_list[count]);
-                       count++;
-                       break;
+                               case ValuatorClass:
+                               DeviceMotionNotify(pad1_device, motion_type, event_list[count]);
+                               count++;
+                               break;
 
-                       default:
-                       break;
+                               default:
+                               break;
+                               }
                        }
                }
+               if (XSelectExtensionEvent(display, root_win, event_list, count)) {
+                       return 0;
+               }
+               return count;
+       }
+       if ((stylus1_info) && (dev_info->id == stylus1_info->id)) {
+               XEventClass event_list[2];
+               stylus1_device = XOpenDevice(display, dev_info->id);
+               if (!stylus1_device) {
+                       return 0;
+               }
+               if (stylus1_device->num_classes > 0) {
+                       for (ip = stylus1_device->classes, i = 0; i < stylus1_info->num_classes; ip++, i++) {
+                               switch (ip->input_class) {
 
-       if (XSelectExtensionEvent(display, root_win, event_list, count)) {
-               return 0;
+                               case ButtonClass:
+                               DeviceButtonPress(stylus1_device, button_press_type, event_list[count]);
+                               count++;
+                               break;
+
+                               case ValuatorClass:
+                               ProximityIn(stylus1_device, proximity_in_type, event_list[count]);
+                               count++;
+                               break;
+
+                               default:
+                               break;
+                               }
+                       }
+               }
+               if (XSelectExtensionEvent(display, root_win, event_list, count)) {
+                       return 0;
                }
+               return count;
        }
-       return count;
+       return 0;
 }
 
 /* End Code */
diff --git a/src-expresskeysconf/Makefile.am b/src-expresskeysconf/Makefile.am
deleted file mode 100644 (file)
index 3517624..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-AM_CFLAGS = -Wall
-AM_LDFLAGS = @EXPRESSKEYSCONF_LIBS@
-AM_CPPFLAGS = @EXPRESSKEYSCONF_INCL@
-
-bin_PROGRAMS = expresskeysconf
-
-expresskeysconf_SOURCES = main_dummy.c
-
diff --git a/src-expresskeysconf/Makefile.in b/src-expresskeysconf/Makefile.in
deleted file mode 100644 (file)
index 664e75e..0000000
+++ /dev/null
@@ -1,401 +0,0 @@
-# Makefile.in generated by automake 1.9.4 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004  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.
-
-@SET_MAKE@
-
-SOURCES = $(expresskeysconf_SOURCES)
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-bin_PROGRAMS = expresskeysconf$(EXEEXT)
-subdir = src-expresskeysconf
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)"
-binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
-PROGRAMS = $(bin_PROGRAMS)
-am_expresskeysconf_OBJECTS = main_dummy.$(OBJEXT)
-expresskeysconf_OBJECTS = $(am_expresskeysconf_OBJECTS)
-expresskeysconf_LDADD = $(LDADD)
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = $(expresskeysconf_SOURCES)
-DIST_SOURCES = $(expresskeysconf_SOURCES)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPRESSKEYSCONF_INCL = @EXPRESSKEYSCONF_INCL@
-EXPRESSKEYSCONF_LIBS = @EXPRESSKEYSCONF_LIBS@
-EXPRESSKEYS_INCL = @EXPRESSKEYS_INCL@
-EXPRESSKEYS_LIBS = @EXPRESSKEYS_LIBS@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
-MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
-MAKEINFO = @MAKEINFO@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-SRC_DIRS = @SRC_DIRS@
-STRIP = @STRIP@
-VERSION = @VERSION@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build_alias = @build_alias@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host_alias = @host_alias@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-AM_CFLAGS = -Wall
-AM_LDFLAGS = @EXPRESSKEYSCONF_LIBS@
-AM_CPPFLAGS = @EXPRESSKEYSCONF_INCL@
-expresskeysconf_SOURCES = main_dummy.c
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-               && exit 0; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src-expresskeysconf/Makefile'; \
-       cd $(top_srcdir) && \
-         $(AUTOMAKE) --gnu  src-expresskeysconf/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-       esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-install-binPROGRAMS: $(bin_PROGRAMS)
-       @$(NORMAL_INSTALL)
-       test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
-       @list='$(bin_PROGRAMS)'; for p in $$list; do \
-         p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
-         if test -f $$p \
-         ; then \
-           f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
-          echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-          $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
-         else :; fi; \
-       done
-
-uninstall-binPROGRAMS:
-       @$(NORMAL_UNINSTALL)
-       @list='$(bin_PROGRAMS)'; for p in $$list; do \
-         f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
-         echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
-         rm -f "$(DESTDIR)$(bindir)/$$f"; \
-       done
-
-clean-binPROGRAMS:
-       -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
-expresskeysconf$(EXEEXT): $(expresskeysconf_OBJECTS) $(expresskeysconf_DEPENDENCIES) 
-       @rm -f expresskeysconf$(EXEEXT)
-       $(LINK) $(expresskeysconf_LDFLAGS) $(expresskeysconf_OBJECTS) $(expresskeysconf_LDADD) $(LIBS)
-
-mostlyclean-compile:
-       -rm -f *.$(OBJEXT)
-
-distclean-compile:
-       -rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main_dummy.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
-@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
-@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
-uninstall-info-am:
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '    { files[$$0] = 1; } \
-              END { for (i in files) print i; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       tags=; \
-       here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '    { files[$$0] = 1; } \
-              END { for (i in files) print i; }'`; \
-       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
-         test -n "$$unique" || unique=$$empty_fix; \
-         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-           $$tags $$unique; \
-       fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       tags=; \
-       here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '    { files[$$0] = 1; } \
-              END { for (i in files) print i; }'`; \
-       test -z "$(CTAGS_ARGS)$$tags$$unique" \
-         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-            $$tags $$unique
-
-GTAGS:
-       here=`$(am__cd) $(top_builddir) && pwd` \
-         && cd $(top_srcdir) \
-         && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-       list='$(DISTFILES)'; for file in $$list; do \
-         case $$file in \
-           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-         esac; \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-           dir="/$$dir"; \
-           $(mkdir_p) "$(distdir)$$dir"; \
-         else \
-           dir=''; \
-         fi; \
-         if test -d $$d/$$file; then \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-           fi; \
-           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-         else \
-           test -f $(distdir)/$$file \
-           || cp -p $$d/$$file $(distdir)/$$file \
-           || exit 1; \
-         fi; \
-       done
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS)
-installdirs:
-       for dir in "$(DESTDIR)$(bindir)"; do \
-         test -z "$$dir" || $(mkdir_p) "$$dir"; \
-       done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
-
-distclean: distclean-am
-       -rm -rf ./$(DEPDIR)
-       -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-       distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am: install-binPROGRAMS
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-       -rm -rf ./$(DEPDIR)
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-binPROGRAMS uninstall-info-am
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
-       clean-generic ctags distclean distclean-compile \
-       distclean-generic distclean-tags distdir dvi dvi-am html \
-       html-am info info-am install install-am install-binPROGRAMS \
-       install-data install-data-am install-exec install-exec-am \
-       install-info install-info-am install-man install-strip \
-       installcheck installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
-       uninstall-am uninstall-binPROGRAMS uninstall-info-am
-
-# 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:
diff --git a/src-expresskeysconf/main_dummy.c b/src-expresskeysconf/main_dummy.c
deleted file mode 100644 (file)
index c58abbf..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-int main (int argc, char *argv[])
-{
-       return 0;
-}
-