version 0.4.1 v0.4.1
authorMats Johannesson <devel@bredband.net>
Thu, 26 Jun 2008 18:52:34 +0000 (14:52 -0400)
committerAristeu Rozanski <arozansk@redhat.com>
Thu, 26 Jun 2008 18:52:34 +0000 (14:52 -0400)
* Implemented a slightly better logic for Touch Strip movement detection.
This cuts down on "false positives" that can happen when the user lifts a
finger and places it on another spot, instead of dragging the finger there.

But even with this improved logic, false positives still happen if the touched
spots are too close to each other (one position up/down), and at the same time
have been recorded as being in the same "direction" in relation to the previous
movement.

To make it perfect we would have to examine Proximity Out events as well as
finger position. But that is not feasible - from what I've seen - since both
buttons and strips generate identical out of proximity events, coming from the
same "pad" device.

* With linuxwacom-0.7.7-3, xsetwacom got a parametre named TabletID (as a
synonym for GetTabletID). Since we base our whole tablet identification routine
on a correct return from that program, and don't know if the old form will
disappear in the future, TabletID henceforth is our first choice - with
GetTabletID as a backup.

This means that users with an older linuxwacom package will see a harmless
message from xsetwacom, for each detected device, when running directly in a
console: "Get: Unknown parameter 'TabletID'".

* Bugfix: While looking for a daemon instance of expresskeys, we parse the file
/proc/[PID-nr]/status and compare the program name there with the one read from
our own status.log. Unfortunately, the /proc file truncates program names to
15 chars, so an executable named eg expresskeys-0.4.0 would not be seen as
running even when it was.

We now also examine /proc/[PID-nr]/cmdline to catch such long names.

* The xerror_handler() in on_error.c used static numbers when checking
error_event->error_code Not good... Now changed to a better approach. And
having searched the net _extensively_ for solutions to this elusive X
programming problem, coming up with precious little, I've decided to quote
myself right here. Perhaps some search engine will index it for other hunters:

[...]
#include <X11/Xlib.h> /* XErrorEvent also pulls in X11/X.h with BadWindow def.*/
#include <X11/extensions/XIproto.h> /* Minor opcode error: X_OpenDevice */
[...]
int xerror_handler(Display* display, XErrorEvent* error_event)
{
/* There seems to be no standard way to catch an "BadDevice, invalid or
 uninitialized input device" error when trying to open devices which aren't
 plugged in. The extension error code varies (I've seen 169 and 170 myself)
 and the message string could be localized as well. Therefore we take a
 two-pronged approach here: Just return if the error code falls within the
 extension error range (>= 128) and at the same time is a X_OpenDevice
 "Minor opcode" as defined in X11/extensions/XIproto.h
   Also, in rare cases we might hit "BadWindow (invalid Window parameter)"
 (code 3) when looking for the present focus-window. I've only seen it with
 the "Firefox Preferences" window, but we better ignore any such case
 (standard error code from X11/X.h pulled in through X11/Xlib.h): */
if (((error_event->error_code >= 128)
&& (error_event->minor_code == X_OpenDevice))
|| (error_event->error_code == BadWindow)) {
return 0;
}
[...]
}

18 files changed:
ChangeLog
INSTALL
NEWS
configure
configure.in
src-expresskeys/command_line.c
src-expresskeys/config_read.c
src-expresskeys/config_write.c
src-expresskeys/defines.h
src-expresskeys/event_loop.c
src-expresskeys/get_device.c
src-expresskeys/main_setup.c
src-expresskeys/mark_info.c
src-expresskeys/misc_func.c
src-expresskeys/on_error.c
src-expresskeys/on_signal.c
src-expresskeys/tablet.c
src-expresskeys/tablet.h

index f1b27d3..013ca31 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,70 @@
 
+_Version 0.4.1 28 Mar 2007_
+
+* Implemented a slightly better logic for Touch Strip movement detection.
+This cuts down on "false positives" that can happen when the user lifts a
+finger and places it on another spot, instead of dragging the finger there.
+
+But even with this improved logic, false positives still happen if the touched
+spots are too close to each other (one position up/down), and at the same time
+have been recorded as being in the same "direction" in relation to the previous
+movement.
+
+To make it perfect we would have to examine Proximity Out events as well as
+finger position. But that is not feasible - from what I've seen - since both
+buttons and strips generate identical out of proximity events, coming from the
+same "pad" device.
+
+* With linuxwacom-0.7.7-3, xsetwacom got a parametre named TabletID (as a
+synonym for GetTabletID). Since we base our whole tablet identification routine
+on a correct return from that program, and don't know if the old form will
+disappear in the future, TabletID henceforth is our first choice - with
+GetTabletID as a backup.
+
+This means that users with an older linuxwacom package will see a harmless
+message from xsetwacom, for each detected device, when running directly in a
+console: "Get: Unknown parameter 'TabletID'".
+
+* Bugfix: While looking for a daemon instance of expresskeys, we parse the file
+/proc/[PID-nr]/status and compare the program name there with the one read from
+our own status.log. Unfortunately, the /proc file truncates program names to
+15 chars, so an executable named eg expresskeys-0.4.0 would not be seen as
+running even when it was.
+
+We now also examine /proc/[PID-nr]/cmdline to catch such long names.
+
+* The xerror_handler() in on_error.c used static numbers when checking
+error_event->error_code Not good... Now changed to a better approach. And
+having searched the net _extensively_ for solutions to this elusive X
+programming problem, coming up with precious little, I've decided to quote
+myself right here. Perhaps some search engine will index it for other hunters:
+
+[...]
+#include <X11/Xlib.h> /* XErrorEvent also pulls in X11/X.h with BadWindow def.*/
+#include <X11/extensions/XIproto.h> /* Minor opcode error: X_OpenDevice */
+[...]
+int xerror_handler(Display* display, XErrorEvent* error_event)
+{
+/* There seems to be no standard way to catch an "BadDevice, invalid or
+ uninitialized input device" error when trying to open devices which aren't
+ plugged in. The extension error code varies (I've seen 169 and 170 myself)
+ and the message string could be localized as well. Therefore we take a
+ two-pronged approach here: Just return if the error code falls within the
+ extension error range (>= 128) and at the same time is a X_OpenDevice
+ "Minor opcode" as defined in X11/extensions/XIproto.h
+   Also, in rare cases we might hit "BadWindow (invalid Window parameter)"
+ (code 3) when looking for the present focus-window. I've only seen it with
+ the "Firefox Preferences" window, but we better ignore any such case
+ (standard error code from X11/X.h pulled in through X11/Xlib.h): */
+       if (((error_event->error_code >= 128)
+       && (error_event->minor_code == X_OpenDevice))
+       || (error_event->error_code == BadWindow)) {
+               return 0;
+       }
+[...]
+}
+
+
 _Version 0.4.0 28 Nov 2006_
 
 OBSERVE: linuxwacom-0.7.5-2 or greater is now required for ALL tablets!
diff --git a/INSTALL b/INSTALL
index 807029f..18594fa 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -29,9 +29,26 @@ the normal libraries and header files used for any program development, we need
 what loosely can be called an "X development environment". Specifically the
 following libraries must be available for linking: libX11.so libXext.so libXi.so
 and libXtst.so Header files from X that we must be able to include are:
-X11/Xlib.h X11/Xutil.h X11/extensions/XInput.h and X11/extensions/XTest.h
+X11/Xlib.h X11/Xutil.h X11/extensions/XInput.h X11/extensions/XIproto.h
+and X11/extensions/XTest.h
+
 Some distributions do not provide this environment by default and therefore
 require additional packages to be installed before compiling. Example names
 from one distribution are libxi-dev and libxtst-dev for the xinput and xtest
 packages.
 
+Example: A "beginner-friendly" distribution like Ubuntu lacks practically
+every development package needed for program compilation, in the default
+installation. What must to be done, in eg Ubuntu 7.04 (Feisty Fawn) is:
+
+1) Start the Adept package manager and click on the icon to update the list
+of available packages - otherwise you won't find the ones we need.
+
+2) Search for libc6-dev and mark it (linux-libc-dev will also get marked).
+These packages are required for any C-program compilation.
+
+3) Search for and mark xorg-dev (MANY additional packages will get marked).
+This metapackage contains the rest of our requirements - and more.
+
+4) Install.
+
diff --git a/NEWS b/NEWS
index 44493d7..2315ff4 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,8 +1,7 @@
 
 _Changes since last version. Executive summary_
 
-- Total rewrite. Can handle 3 tablets of 5 different 'models' (sum 15) and 2
-styli per tablet. User defined auto-repeat for each button and touch strip.
+- Implemented a slightly better logic for Touch Strip movement detection.
 
 OBSERVE: linuxwacom-0.7.5-2 or greater is now required for ALL tablets!
 
index 5922bbb..87b3745 100755 (executable)
--- a/configure
+++ b/configure
@@ -2027,7 +2027,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE=expresskeys
- VERSION=0.4.0
+ VERSION=0.4.1
 
 
 cat >>confdefs.h <<_ACEOF
@@ -4466,6 +4466,14 @@ else
    echo "$XINCDIR/X11/extensions/XInput.h OK"
 fi
 
+echo $'#include <X11/extensions/XIproto.h>\nmain(){}'|$CC -I$XINCDIR -xc - -o dum 2>/dev/null
+if test $? != 0 ; then
+   echo "Can not include $XINCDIR/X11/extensions/XIproto.h header file!"
+   SOMEERROR=1
+else
+   echo "$XINCDIR/X11/extensions/XIproto.h OK"
+fi
+
 echo $'#include <X11/extensions/XTest.h>\nmain(){}'|$CC -I$XINCDIR -xc - -o dum 2>/dev/null
 if test $? != 0 ; then
    echo "Can not include $XINCDIR/X11/extensions/XTest.h header file!"
index 198b65c..e363eab 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.4.0)
+AM_INIT_AUTOMAKE(expresskeys, 0.4.1)
 AM_MAINTAINER_MODE
 AC_PROG_CC
 
@@ -170,6 +170,14 @@ else
    echo "$XINCDIR/X11/extensions/XInput.h OK"
 fi
 
+echo $'#include <X11/extensions/XIproto.h>\nmain(){}'|$CC -I$XINCDIR -xc - -o dum 2>/dev/null
+if test $? != 0 ; then
+   echo "Can not include $XINCDIR/X11/extensions/XIproto.h header file!"
+   SOMEERROR=1
+else
+   echo "$XINCDIR/X11/extensions/XIproto.h OK"
+fi
+
 echo $'#include <X11/extensions/XTest.h>\nmain(){}'|$CC -I$XINCDIR -xc - -o dum 2>/dev/null
 if test $? != 0 ; then
    echo "Can not include $XINCDIR/X11/extensions/XTest.h header file!"
index 5ede0c7..e6a762a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  expresskeys - Support ExpressKeys, Touch Strips, Scroll Wheel on Wacom tablets.
 
- Copyright (C) 2005-2006 - Mats Johannesson
+ Copyright (C) 2005-2007 - 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
@@ -40,7 +40,7 @@ int send_sigusr1;
 int send_sigusr2;
 
 /* Our version. Remember to change it: */
-const char* our_prog_version = "0.4.0";
+const char* our_prog_version = "0.4.1";
 
 /* Generic strings used in comparisons,
  and for flow control in some functions: */
index d82e0f9..76c721b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  expresskeys - Support ExpressKeys, Touch Strips, Scroll Wheel on Wacom tablets.
 
- Copyright (C) 2005-2006 - Mats Johannesson
+ Copyright (C) 2005-2007 - 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
index 314f163..f333344 100644 (file)
@@ -1,7 +1,7 @@
 /*
  expresskeys - Support ExpressKeys, Touch Strips, Scroll Wheel on Wacom tablets.
 
- Copyright (C) 2005-2006 - Mats Johannesson
+ Copyright (C) 2005-2007 - 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
index c45b239..31e466e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  expresskeys - Support ExpressKeys, Touch Strips, Scroll Wheel on Wacom tablets.
 
- Copyright (C) 2005-2006 - Mats Johannesson
+ Copyright (C) 2005-2007 - 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
index 95b791f..80d5aca 100644 (file)
@@ -1,7 +1,7 @@
 /*
  expresskeys - Support ExpressKeys, Touch Strips, Scroll Wheel on Wacom tablets.
 
- Copyright (C) 2005-2006 - Mats Johannesson, Denis DerSarkisian
+ Copyright (C) 2005-2007 - 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
@@ -925,13 +925,25 @@ static void do_motion(void* base_address, void* record_address,
 "0 or below keycode 9, above keycode 1023, or in other out-of-bounds areas.\n"
 "Perhaps it is not defined at all in the configuration file.";
 
-/* Set the Touch Strip state histories to some 'smart' values. This is an
- effort to prevent action on the very first touch, before a real history is
- recorded. Top is 1, Bottom is 4096 (prev x*2, ie 13 finger/stylus positions):*/
-       static int elder_rotation = 2048;
-       static int old_rotation = 4096;
-       static int elder_throttle = 2048;
-       static int old_throttle = 4096;
+/* Set the Touch Strip state histories to 'smart' values. This is to prevent
+ action on the very first touch, before a real history is recorded. Top is 1,
+ Bottom is 4096 (previous x*2, ie 13 finger/stylus positions):*/
+       static int elder_rotation = 1;
+       static int old_rotation = 1;
+       static int elder_throttle = 1;
+       static int old_throttle = 1;
+
+/* This might be unnecessary, but the following variables are targets of
+ right/left shifted unsigned values. Make them unsigned as well...:*/
+       unsigned static int more_rotation = 1;
+       unsigned static int less_rotation = 1;
+       unsigned static int more_throttle = 1;
+       unsigned static int less_throttle = 1;
+
+/* We right/left shift these values. Keep them unsigned so that vacant bits
+ become zero no matter which size machine we run on: */
+       unsigned int rotation = 0;
+       unsigned int throttle = 0;
 
 /* We always begin by faking a button "down": */
        int button_state = 1;
@@ -941,9 +953,6 @@ static void do_motion(void* base_address, void* record_address,
        int repeat_right_up = 0;
        int repeat_right_down = 0;
 
-       int rotation = 0;
-       int throttle = 0;
-
        if (motion->axes_count >= 5) {
                rotation = motion->axis_data[3];
                throttle = motion->axis_data[4];
@@ -994,8 +1003,9 @@ defined/enabled in configuration file *\n");
                        if (*tdp->repeat_left_up) {
                                repeat_left_up = 1;
                        }
-                       if ((rotation < old_rotation)
-                       && (old_rotation <= elder_rotation)) {
+                       if ((rotation == less_rotation)
+                       && (rotation < old_rotation)
+                       && (rotation != elder_rotation)) {
                                if (be_verbose) {
                                        fprintf(stderr,
                                        "(Left Touch Strip Up) value %i\n",
@@ -1021,8 +1031,9 @@ defined/enabled in configuration file *\n");
                        if (*tdp->repeat_left_down) {
                                repeat_left_down = 1;
                        }
-                       if ((rotation > old_rotation)
-                       && (old_rotation >= elder_rotation)) {
+                       if ((rotation == more_rotation)
+                       && (rotation > old_rotation)
+                       && (rotation != elder_rotation)) {
                                if (be_verbose) {
                                        fprintf(stderr,
                                        "(Left Touch Strip Down) value %i\n",
@@ -1046,6 +1057,8 @@ defined/enabled in configuration file *\n");
                }
                elder_rotation = old_rotation;
                old_rotation = rotation;
+               more_rotation = rotation << 1;
+               less_rotation = rotation >> 1;
        }
 
 /* Right Touch Strip: */
@@ -1058,8 +1071,9 @@ defined/enabled in configuration file *\n");
                        if (*tdp->repeat_right_up) {
                                repeat_right_up = 1;
                        }
-                       if ((throttle < old_throttle)
-                       && (old_throttle <= elder_throttle)) {
+                       if ((throttle == less_throttle)
+                       && (throttle < old_throttle)
+                       && (throttle != elder_throttle)) {
                                if (be_verbose) {
                                        fprintf(stderr,
                                        "(Right Touch Strip Up) value %i\n",
@@ -1085,8 +1099,9 @@ defined/enabled in configuration file *\n");
                        if (*tdp->repeat_right_down) {
                                repeat_right_down = 1;
                        }
-                       if ((throttle > old_throttle)
-                       && (old_throttle >= elder_throttle)) {
+                       if ((throttle == more_throttle)
+                       && (throttle > old_throttle)
+                       && (throttle != elder_throttle)) {
                                if (be_verbose) {
                                        fprintf(stderr,
                                        "(Right Touch Strip Down) value %i\n",
@@ -1110,6 +1125,8 @@ defined/enabled in configuration file *\n");
                }
                elder_throttle = old_throttle;
                old_throttle = throttle;
+               more_throttle = throttle << 1;
+               less_throttle = throttle >> 1;
        }
 
        if (repeat_left_up && rotation == 1) {
index 782470a..a55b054 100644 (file)
@@ -1,7 +1,7 @@
 /*
  expresskeys - Support ExpressKeys, Touch Strips, Scroll Wheel on Wacom tablets.
 
- Copyright (C) 2005-2006 - Mats Johannesson
+ Copyright (C) 2005-2007 - Mats Johannesson
 
  register_events() based on test.c 1996 by Frederic Lepied (xinput-1.2)
 
@@ -120,12 +120,15 @@ static int identify_device(char* device_name)
        int i;
        int j = 0;
        int len = 0;
+       int ok_value = 0;
 
        FILE* execfp = NULL;
+       read_buffer[0] = '\0';
 
        if ((execfp = popen("xsetwacom -V", "r")) != NULL) {
                fgets(read_buffer, MAXBUFFER, execfp);
-               if ((pclose(execfp)) == 0) {
+               if (((pclose(execfp)) != NON_VALID)
+               && (isdigit(read_buffer[0]))) {
                        len = strcspn(read_buffer, " \t\n");
                        for (i = 0; i < len; i++) {
                                if (isdigit(read_buffer[i])) {
@@ -140,43 +143,57 @@ static int identify_device(char* device_name)
                }
        }
 
+/* linuxwacom-0.7.7-3 changed GetTabletID to plain TabletID. Later, support
+ for both strings were introduced. We follow the same pattern here, defaulting
+ to the new way, should the old format disappear in a linuxwacom future: */
        if (ok_xsetwacom) {
-               snprintf(write_buffer,MAXBUFFER, "xsetwacom get %s GetTabletID",
+               read_buffer[0] = '\0';
+               snprintf(write_buffer,MAXBUFFER, "xsetwacom get %s TabletID",
                                                                device_name);
                if ((execfp = popen(write_buffer, "r")) != NULL) {
                        fgets(read_buffer, MAXBUFFER, execfp);
-                       if ((pclose(execfp)) == 0) {
-                               len = strcspn(read_buffer, " \t\n");
-                               if ((strncmp(read_buffer, cintiq_21UX,
-                                                               len)) == 0) {
-                                       return i3;
-                               }
-                               if (((strncmp(read_buffer, i3_6x8, len)) == 0)
-                                       || ((strncmp(read_buffer, i3_9x12,
-                                                               len)) == 0)
-                                       || ((strncmp(read_buffer, i3_12x12,
-                                                               len)) == 0)
-                                       || ((strncmp(read_buffer, i3_12x19,
-                                                               len)) == 0)
-                                       || ((strncmp(read_buffer, i3_6x11,
-                                                               len)) == 0)) {
-                                       return i3;
-                               }
-                               if (((strncmp(read_buffer, i3s_4x5, len)) == 0)
-                                       || ((strncmp(read_buffer, i3s_4x6,
-                                                               len)) == 0)) {
-                                       return i3s;
-                               }
-                               if (((strncmp(read_buffer, g4_4x5, len)) == 0)
-                                       || ((strncmp(read_buffer, g4_6x8,
-                                                               len)) == 0)) {
-                                       return g4;
-                               }
-                               if ((strncmp(read_buffer, g4b_6x8, len)) == 0) {
-                                       return g4b;
+                       if (((pclose(execfp)) != NON_VALID)
+                       && (isdigit(read_buffer[0]))) {
+                               ok_value = 1;
+                       } else {
+                               read_buffer[0] = '\0';
+                               snprintf(write_buffer,MAXBUFFER,
+                               "xsetwacom get %s GetTabletID", device_name);
+                               if ((execfp = popen(write_buffer, "r"))
+                                                               != NULL) {
+                                       fgets(read_buffer, MAXBUFFER, execfp);
+                                       if (((pclose(execfp)) != NON_VALID)
+                                       && (isdigit(read_buffer[0]))) {
+                                               ok_value = 1;
+                                       }
                                }
                        }
                }
+
+               if (ok_value) {
+                       len = strcspn(read_buffer, " \t\n");
+                       if ((strncmp(read_buffer, cintiq_21UX, len)) == 0) {
+                               return i3;
+                       }
+                       if (((strncmp(read_buffer, i3_6x8, len)) == 0)
+                               || ((strncmp(read_buffer, i3_9x12, len)) == 0)
+                               || ((strncmp(read_buffer, i3_12x12, len)) == 0)
+                               || ((strncmp(read_buffer, i3_12x19, len)) == 0)
+                               || ((strncmp(read_buffer, i3_6x11, len)) == 0)){
+                               return i3;
+                       }
+                       if (((strncmp(read_buffer, i3s_4x5, len)) == 0)
+                               || ((strncmp(read_buffer, i3s_4x6, len)) == 0)){
+                               return i3s;
+                       }
+                       if (((strncmp(read_buffer, g4_4x5, len)) == 0)
+                               || ((strncmp(read_buffer, g4_6x8, len)) == 0)) {
+                               return g4;
+                       }
+                       if ((strncmp(read_buffer, g4b_6x8, len)) == 0) {
+                               return g4b;
+                       }
+               }
        }
 
 /* We must treat all tablets as 'padless' if xsetwacom is missing or too old: */
index edd7d35..04be4ec 100644 (file)
@@ -1,7 +1,7 @@
 /*
  expresskeys - Support ExpressKeys, Touch Strips, Scroll Wheel on Wacom tablets.
 
- Copyright (C) 2005-2006 - Mats Johannesson
+ Copyright (C) 2005-2007 - 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
index 984ed5c..584ba4e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  expresskeys - Support ExpressKeys, Touch Strips, Scroll Wheel on Wacom tablets.
 
- Copyright (C) 2005-2006 - Mats Johannesson
+ Copyright (C) 2005-2007 - 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
index 5d3cb04..6ac49b0 100644 (file)
@@ -1,7 +1,7 @@
 /*
  expresskeys - Support ExpressKeys, Touch Strips, Scroll Wheel on Wacom tablets.
 
- Copyright (C) 2005-2006 - Mats Johannesson
+ Copyright (C) 2005-2007 - 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
@@ -149,6 +149,7 @@ void check_pid(const char* pidfile, const char* statusfile,
                }
        }
 
+/* The /proc "status" file truncates program name after only 15 chars... */
        if ((pid_buffer[0]) && (status_buffer[0])
                && ((kill(atoi(pid_buffer), 0)) != NON_VALID)) {
 
@@ -164,6 +165,24 @@ void check_pid(const char* pidfile, const char* statusfile,
                        }
                        fclose(fp);
                }
+
+/* Checking /proc "cmdline" to catch program names longer than 15 chars: */
+/* Doing it _redundantly_ with loop etc, should the file format change... */
+               if (!live_pid) {
+                       snprintf(write_buffer, MAXBUFFER, "/proc/%s/cmdline",
+                                                               pid_buffer);
+                       if ((fp = fopen(write_buffer, "r")) != NULL) {
+                               while ((fgets(write_buffer, MAXBUFFER, fp))
+                                                               != NULL) {
+                                       if ((strstr(write_buffer,status_buffer))
+                                                               !=NULL) {
+                                               live_pid = atoi(pid_buffer);
+                                               break;
+                                       }
+                               }
+                               fclose(fp);
+                       }
+               }
        }
 
 }
index 4bc8fce..402e642 100644 (file)
@@ -1,7 +1,7 @@
 /*
  expresskeys - Support ExpressKeys, Touch Strips, Scroll Wheel on Wacom tablets.
 
- Copyright (C) 2005-2006 - Mats Johannesson
+ Copyright (C) 2005-2007 - 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
@@ -20,7 +20,8 @@
 
 #include <stdio.h> /* NULL, FILE, fprintf, fopen, fclose */
 #include <signal.h> /* SIGINT */
-#include <X11/Xlib.h>
+#include <X11/Xlib.h> /* XErrorEvent also pulls in X11/X.h with BadWindow def.*/
+#include <X11/extensions/XIproto.h> /* Minor opcode error: X_OpenDevice */
 
 #include "defines.h"
 
@@ -57,14 +58,20 @@ void exit_on_error(FILE* errorfp, char* string1, const char* string2,
 
 int xerror_handler(Display* display, XErrorEvent* error_event)
 {
-/* We just return on "BadDevice, invalid or uninitialized input device"
- (codes 169 and 170) when trying to open devices which aren't plugged in.
- Also, in rare cases we might hit "BadWindow (invalid Window parameter)"
+/* There seems to be no standard way to catch an "BadDevice, invalid or
+ uninitialized input device" error when trying to open devices which aren't
+ plugged in. The extension error code varies (I've seen 169 and 170 myself)
+ and the message string could be localized as well. Therefore we take a
+ two-pronged approach here: Just return if the error code falls within the
+ extension error range (>= 128) and at the same time is a X_OpenDevice
+ "Minor opcode" as defined in X11/extensions/XIproto.h
+   Also, in rare cases we might hit "BadWindow (invalid Window parameter)"
  (code 3) when looking for the present focus-window. I've only seen it with
- the "Firefox Preferences" window, but we better ignore any such case: */
-       if ((error_event->error_code == 169)
-       || (error_event->error_code == 170)
-       || (error_event->error_code == 3)) {
+ the "Firefox Preferences" window, but we better ignore any such case
+ (standard error code from X11/X.h pulled in through X11/Xlib.h): */
+       if (((error_event->error_code >= 128)
+       && (error_event->minor_code == X_OpenDevice))
+       || (error_event->error_code == BadWindow)) {
                return 0;
        }
 
index 0d897ea..8ec84c4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  expresskeys - Support ExpressKeys, Touch Strips, Scroll Wheel on Wacom tablets.
 
- Copyright (C) 2005-2006 - Mats Johannesson
+ Copyright (C) 2005-2007 - 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
index c936e19..b0c415a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  expresskeys - Support ExpressKeys, Touch Strips, Scroll Wheel on Wacom tablets.
 
- Copyright (C) 2005-2006 - Mats Johannesson
+ Copyright (C) 2005-2007 - 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
index 642d93e..22301e0 100644 (file)
@@ -1,7 +1,7 @@
 /*
  expresskeys - Support ExpressKeys, Touch Strips, Scroll Wheel on Wacom tablets.
 
- Copyright (C) 2005-2006 - Mats Johannesson
+ Copyright (C) 2005-2007 - 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