diff -ur xpilot-4.U.3.svan/src/client/default.c xpilot-4.U.3.svan2/src/client/default.c
--- xpilot-4.U.3.svan/src/client/default.c	Sat Jul 10 22:14:39 1999
+++ xpilot-4.U.3.svan2/src/client/default.c	Sat Jul 10 22:22:47 1999
@@ -122,7 +122,8 @@
 const char*	winHelpFile;
 #endif
 
-keys_t buttonDefs[MAX_POINTER_BUTTONS];
+buttondef_t	buttonDefs[MAX_POINTER_BUTTONS];
+
 
 /*
  * Structure to store all the client options.
@@ -2970,16 +2971,24 @@
      * Pointer button bindings
      */
     for (i = 0; i < MAX_POINTER_BUTTONS; i++) {
+	buttonDefs[i].num = 0;
 	sprintf(resValue, "pointerButton%d", i+1);
 	Get_resource(rDB, resValue, resValue, sizeof resValue);
 	ptr = resValue;
-	if (*ptr != '\0') {
+	while (ptr && *ptr != '\0') {
+	    char *next = strchr(ptr, ',');
+
+	    if (next) {
+		*next = '\0';
+		next++;
+	    }
 	    if (!strncasecmp(ptr, "key", 3))
 		ptr += 3;
 	    for (j = 0; j < NELEM(options); j++) {
 		if (options[j].key != KEY_DUMMY) {
 		    if (!strcasecmp(ptr, options[j].name + 3)) {
-			buttonDefs[i] = options[j].key;
+			buttonDefs[i].keys[buttonDefs[i].num] = options[j].key;
+			buttonDefs[i].num++;
 			break;
 		    }
 		}
@@ -2988,6 +2997,8 @@
 		errno = 0;
 		error("Unknown key \"%s\" for pointer button %d", resValue, i);
 	    }
+	    if (buttonDefs[i].num >= MAX_KEYS_PER_BUTTON) break;
+	    ptr = next;
 	}
     }
 
diff -ur xpilot-4.U.3.svan/src/client/xevent.c xpilot-4.U.3.svan2/src/client/xevent.c
--- xpilot-4.U.3.svan/src/client/xevent.c	Sat Jul 10 22:14:40 1999
+++ xpilot-4.U.3.svan2/src/client/xevent.c	Sat Jul 10 21:57:15 1999
@@ -65,7 +65,6 @@
 
 int		initialPointerControl = false;
 bool		pointerControl = false;
-extern keys_t	buttonDefs[MAX_POINTER_BUTTONS];
 extern Cursor	pointerControlCursor;
 
 
@@ -673,10 +675,15 @@
 		if (pointerControl
 		    && !talk_mapped
 		    && event.xbutton.button <= MAX_POINTER_BUTTONS) {
-		    if (Key_press(buttonDefs[event.xbutton.button-1])) {
-			Net_key_change();
+		    int i;
+		    
+		    for (i = 0;
+			 i < buttonDefs[event.xbutton.button-1].num; i++) {
+			if (Key_press(buttonDefs[event.xbutton.button-1].keys[i])) {
+			    Net_key_change();
+			}
 		    }
 		}
 		break;
 	    }
 	    if (Widget_event(&event) != 0) {
@@ -707,8 +717,13 @@
 		if (pointerControl
 		    && !talk_mapped
 		    && event.xbutton.button <= MAX_POINTER_BUTTONS) {
-		    if (Key_release(buttonDefs[event.xbutton.button-1])) {
-			Net_key_change();
+		    int i;
+		    
+		    for (i = 0;
+			 i < buttonDefs[event.xbutton.button-1].num; i++) {
+			if (Key_release(buttonDefs[event.xbutton.button-1].keys[i])) {
+			    Net_key_change();
+			}
 		    }
 		}
 		break;
diff -ur xpilot-4.U.3.svan/src/client/xinit.h xpilot-4.U.3.svan2/src/client/xinit.h
--- xpilot-4.U.3.svan/src/client/xinit.h	Fri Oct  2 20:39:22 1998
+++ xpilot-4.U.3.svan2/src/client/xinit.h	Sat Jul 10 21:36:20 1999
@@ -34,8 +34,6 @@
 #define MAX_TOP_HEIGHT	1024
 #define DEF_TOP_HEIGHT	768
 
-#define MAX_POINTER_BUTTONS 5
-
 extern Atom		ProtocolAtom, KillAtom;
 extern int		buttonColor, windowColor, borderColor;
 extern int		ButtonHeight;
diff -ur xpilot-4.U.3.svan/src/client/keys.h xpilot-4.U.3.svan2/src/client/keys.h
--- xpilot-4.U.3.svan/src/common/keys.h	Sat Jul 10 22:14:39 1999
+++ xpilot-4.U.3.svan2/src/common/keys.h	Sat Jul 10 22:05:55 1999
@@ -25,6 +25,9 @@
 #ifndef KEYS_H
 #define KEYS_H
 
+#define MAX_POINTER_BUTTONS	5
+#define MAX_KEYS_PER_BUTTON	10
+
 /*
  * The following enum type defines the possible actions as a result of
  * a keypress or keyrelease.
@@ -161,6 +164,13 @@
 
 extern char* Get_keyHelpString(keys_t key);
 extern const char *Get_keyResourceString(keys_t key);
+
+typedef struct {
+	keys_t	keys[MAX_KEYS_PER_BUTTON];
+	int	num;
+} buttondef_t;
+
+extern buttondef_t	buttonDefs[MAX_POINTER_BUTTONS];
 
 #endif
 
