version 0.2.2 v0.2.2
authorMats Johannesson <devel@bredband.net>
Thu, 26 Jun 2008 18:16:28 +0000 (14:16 -0400)
committerAristeu Rozanski <arozansk@redhat.com>
Thu, 26 Jun 2008 18:16:28 +0000 (14:16 -0400)
* Included an example of how to use an external program through
the simple "system" command (see exec_shell.c). The sample
"xsetwacom" utilization (pen pressure sensitivity) is not particularly
exciting as a new feature, but nevertheless an opening for future
implementations.

It's hard to imagine someone wasting three full expresskeys to get
a comfortable workflow, but here you are:

Keycode field value (regular button only, not touch strips or Plus)
1001 <-- Pen sensitivity gets lower with each press, until roll over.
1002 <-- Pen sensitivity is set to wacom default, a middle curve.
1003 <-- Pen sensitivity gets higher with each press, until roll over.

A pen name must be specified on the command line, of course.

Since both the 1001 and 1003 flip over in a carousel fashion at the
top and bottom values, you could manage the operation with only one
button. But if you go too far, there are 6 presses to be made until
next rendezvous in the 7 state circle. Not good.

The curve values are picked from how the "wacomcpl" program sets them
(the tcl utility) in Feel -> Sensitivity [1 to 7].

I've refrained from documenting the 1001 - 1003 in the USAGE file, and
a new configuration file won't have them listed in the header. The real
world usability is too limited, I feel. Better things will hopefully
come in the future.

The old pen mode toggle code could be rewritten so it was handled by
this external xsetwacom functionality, in good *nix tradition of reuse.
But what if the user environment doesn't have the xsetwacom program
installed? Better leave the code as is, I think.

-------------------------------------------------------------------------
Speaking of the future, this 0.2.2 version will be the last one (from me
at least) for quite some time. When I began the project, more than 1 1/2
months ago, it was out of pure necessity. I had a brand new (expensive)
Wacom tablet with semi functional hardware. Extensive web searches didn't
reveal any program to unlock the enticing ExpressKeys and Touch Strips,
so I reluctantly opened a C language book and set to work.

I never planned to enter the "programmer" domain in earnest. Neither
did I anticipate a perpetual development. When the job was done, it
would be done...

And now it's done, from my point of view. Core functions are rather
complete, and the program runs without hiccups. Ideas have dried up
and I am frankly getting bored with code hacking. Now I want to USE
the tablet, finally.

The code is free as in beer and freedom. If anyone feels like expanding
or even forking it, just do so (according to the GPL). There's the whole
bag of internationalization, installation and graphical configuration
left to a fresh mind. I'm too tired right now.

Though, I'll dive in again if a pressing issue turns up ;-)

Bye for now,
Mats
-------------------------------------------------------------------------

ChangeLog
NEWS
README
USAGE
src-server/Makefile
src-server/event_loop.c
src-server/exec_shell.c [new file with mode: 0644]
src-server/globals.c
src-server/globals.h

index 5b3c665..4acdee2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,72 @@
 
+_Version 0.2.2 5 May 2005_
+
+* Included an example of how to use an external program through
+the simple "system" command (see exec_shell.c). The sample
+"xsetwacom" utilization (pen pressure sensitivity) is not particularly
+exciting as a new feature, but nevertheless an opening for future
+implementations.
+
+It's hard to imagine someone wasting three full expresskeys to get
+a comfortable workflow, but here you are:
+
+Keycode field value (regular button only, not touch strips or Plus)
+1001 <-- Pen sensitivity gets lower with each press, until roll over.
+1002 <-- Pen sensitivity is set to wacom default, a middle curve.
+1003 <-- Pen sensitivity gets higher with each press, until roll over.
+
+A pen name must be specified on the command line, of course.
+
+Since both the 1001 and 1003 flip over in a carousel fashion at the
+top and bottom values, you could manage the operation with only one
+button. But if you go too far, there are 6 presses to be made until
+next rendezvous in the 7 state circle. Not good.
+
+The curve values are picked from how the "wacomcpl" program sets them
+(the tcl utility) in Feel -> Sensitivity [1 to 7].
+
+I've refrained from documenting the 1001 - 1003 in the USAGE file, and
+a new configuration file won't have them listed in the header. The real
+world usability is too limited, I feel. Better things will hopefully
+come in the future.
+
+The old pen mode toggle code could be rewritten so it was handled by
+this external xsetwacom functionality, in good *nix tradition of reuse.
+But what if the user environment doesn't have the xsetwacom program
+installed? Better leave the code as is, I think.
+
+-------------------------------------------------------------------------
+Speaking of the future, this 0.2.2 version will be the last one (from me
+at least) for quite some time. When I began the project, more than 1 1/2
+months ago, it was out of pure necessity. I had a brand new (expensive)
+Wacom tablet with semi functional hardware. Extensive web searches didn't
+reveal any program to unlock the enticing ExpressKeys and Touch Strips,
+so I reluctantly opened a C language book and set to work.
+
+I never planned to enter the "programmer" domain in earnest. Neither
+did I anticipate a perpetual development. When the job was done, it
+would be done...
+
+And now it's done, from my point of view. Core functions are rather
+complete, and the program runs without hiccups. Ideas have dried up
+and I am frankly getting bored with code hacking. Now I want to USE
+the tablet, finally.
+
+The code is free as in beer and freedom. If anyone feels like expanding
+or even forking it, just do so (according to the GPL). There's the whole
+bag of internationalization, installation and graphical configuration
+left to a fresh mind. I'm too tired right now.
+
+Though, I'll dive in again if a pressing issue turns up ;-)
+
+Bye for now,
+Mats
+-------------------------------------------------------------------------
+
+
 _Version 0.2.1 2 May 2005_
 
-* Added support for faking mouse button events. "Anonymous1"
-(I have not received permission to use his real name or e-mail)
+* Added support for faking mouse button events. Denis DerSarkisian
 sent a function called "fake_event" (top of event_loop.c) which
 in essence acts like a traffic cop, steering true keycodes to
 XTestFakeKeyEvent and a set of false ones to XTestFakeButtonEvent.
diff --git a/NEWS b/NEWS
index 5d0adfc..82aee68 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,9 +1,5 @@
 
 _Changes since last version. Executive summary_
 
-- Support for faking mouse button events.
-
-- Expanded the "-v" (verbose mode) printing.
-
-- Added some more knowledge to the BUGS file.
+- Sample xsetwacom utilization (pen pressure sensitivity).
 
diff --git a/README b/README
index aa8ccc2..7230476 100644 (file)
--- a/README
+++ b/README
@@ -1,6 +1,7 @@
 
 This program gives basic linux support for the ExpressKeys and
-Touch Strips of a Wacom Intuos3 tablet. Latest version can be found at:
+Touch Strips of a Wacom Intuos3 tablet or a Cintiq 21UX Interactive
+Pen Display. Latest version can be found at:
 
 http://web.telia.com/~u46133770/wacom/index.html
 
diff --git a/USAGE b/USAGE
index 9b57f6e..3547169 100644 (file)
--- a/USAGE
+++ b/USAGE
@@ -22,7 +22,9 @@ USAGE of expresskeys:
 
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
-* Program can not be started unless X is running.
+* 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).
 
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
@@ -63,7 +65,8 @@ 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.
+The included shell script "expresskeys-reread.sh" will do it for you if
+a pid-file from a daemon instance is present.
 
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
index b622db9..e60aed4 100644 (file)
@@ -9,7 +9,8 @@ LIBS = -lX11 -lXext -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 main_setup.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)
index ed67751..bc4da3d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  event_loop.c -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
  
- Copyright (C) 2005 - Mats Johannesson
+ Copyright (C) 2005 - 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
@@ -342,6 +342,12 @@ Right ExpressKey Pad
                                        }
                                        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 );
@@ -376,6 +382,11 @@ Right ExpressKey Pad
                                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) {
diff --git a/src-server/exec_shell.c b/src-server/exec_shell.c
new file mode 100644 (file)
index 0000000..414f0a6
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ exec_shell.c -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
+ Copyright (C) 2005 - 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 uses the simple "system" command to execute another program in
+ a shell, waiting for it to return. Here it calls the "xsetwacom" from
+ 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
+ carousel fashion at the top and bottom values.
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+
+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--;
+                               } else {
+                                       pen_presscurve = 7;
+                               }
+                       }
+                       if (num == PEN_CURVE_DEFAULT) {
+                               pen_presscurve = 4;
+                       }
+                       if (num == PEN_CURVE_UPWARD) {
+                               if (pen_presscurve < 7) {
+                                       pen_presscurve++;
+                               } else {
+                                       pen_presscurve = 1;
+                               }
+                       }
+                       switch (pen_presscurve) {
+
+                               case 1:
+                               sprintf(curve, "0 75 25 100");
+                               break;
+
+                               case 2:
+                               sprintf(curve, "0 50 50 100");
+                               break;
+
+                               case 3:
+                               sprintf(curve, "0 25 75 100");
+                               break;
+
+                               case 4:
+                               sprintf(curve, "0 0 100 100");
+                               break;
+
+                               case 5:
+                               sprintf(curve, "25 0 100 75");
+                               break;
+
+                               case 6:
+                               sprintf(curve, "50 0 100 50");
+                               break;
+
+                               case 7:
+                               sprintf(curve, "75 0 100 25");
+                               break;
+
+                               default:
+                               sprintf(curve, "0 0 100 100");
+                               break;
+                       
+                       }
+                       snprintf(buffer, MAXBUFFER, "xsetwacom set %s PressCurve %s", pen_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);
+                               }
+                       }
+               }
+       }
+
+       return 0;
+
+}
+
+/* End Code */
+
index eecd80a..f69072d 100644 (file)
@@ -46,6 +46,7 @@ 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 motion_type = NON_VALID;
 int button_press_type = NON_VALID;
index 347ed06..97a3acb 100644 (file)
@@ -56,7 +56,10 @@ enum {                 /* Strings signaling key's use as a mouse button */
        MOUSE_6,
        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 MAXRECORDS 64  /* Max program definitions to handle (enough? ;-) */
 #define MAXFIELDS 25   /* Max entries (minus program name) in each record */
@@ -84,6 +87,7 @@ 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 motion_type;                /* Event type to keep track of - Touch Strips */
 extern int button_press_type;  /* Event type to keep track of - Pad Buttons */
@@ -106,6 +110,7 @@ extern int 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 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 clean_up_exit(int signum);