[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[mgp-users-jp 00608] Re: xmindpath IR-55 patch



From: Yukimitsu Izawa <izawa@jaist.ac.jp>
Subject: Re: [mgp-users-jp 00606] Re: xmindpath IR-55 patch 

> From: itojun@iijlab.net
> Subject: [mgp-users-jp 00606] Re: xmindpath IR-55 patch 
> > 
> > 	両方で(command line option?)動くようにしてもらえませんか?
> > 	そしたらmergeできますんで。
> 
>   了解です。
>   コマンドラインオプション(-ir55 か?)で切り替えられるようにします。

  ということで、-t オプションで、pocketpoint と ir55 を切り替えられるよ
  うにしました。

-- izawa
xmindpath を MINDPATH IR-55 に対応させるためのパッチ
Copyright (C) 1999 Yukimitsu Izawa <izawa@jaist.ac.jp>

このパッチは、xmindpath をIR-55 でも使えるようにするためのパッチです。

IR-55 については、http://www.mindpath.com/Products/ir50fx.htm を
ご参照下さい。

このパッチを適用すると、

  * IR-55 で以下のことが可能になります。

    + 16方向にマウスポインタを移動させることができます。
    + 左右のマウスクリックが Button{1,2}です。
    + 方向パッドの真ん中を押すと Button3 です。

  * -t オプションで使用するデバイスを指定することができます。
      -t pocketpoint (デフォルト) で PocketPoint です。
      -t ir55 で IR-55 です。

が可能になります。

このパッチを適用したあと、autoconf を実行してください。
パッチによる変更が、configure に反映されます。


diff -Naur xmindpath-orig/configure.in xmindpath/configure.in
--- xmindpath-orig/configure.in	Tue Sep 21 21:44:24 1999
+++ xmindpath/configure.in	Tue Sep 21 23:09:24 1999
@@ -11,9 +11,10 @@
 LIBS="$LIBS $X_PRE_LIBS $X_LIBS -lX11 $X_EXTRA_LIBS"
 AC_CHECK_LIB(Xext, XextAddDisplay)
 AC_CHECK_LIB(Xtst, XTestFakeKeyEvent)
+AC_CHECK_LIB(m, sin)
 
 dnl Checks for header files.
-AC_CHECK_HEADERS(fcntl.h paths.h sys/file.h sys/time.h unistd.h)
+AC_CHECK_HEADERS(fcntl.h paths.h sys/file.h sys/time.h unistd.h math.h)
 
 dnl Checks for typedefs, structures, and compiler characteristics.
 AC_HEADER_TIME
diff -Naur xmindpath-orig/main.c xmindpath/main.c
--- xmindpath-orig/main.c	Tue Sep 21 21:44:24 1999
+++ xmindpath/main.c	Tue Sep 21 23:20:55 1999
@@ -42,13 +42,17 @@
 #include <X11/X.h>
 #include <X11/extensions/XTest.h>
 #include <X11/keysym.h>
+#include <math.h>
+
+#define PI_8 0.39269908169872415481
+#define MOVE_DOTS 10
 
 #ifdef X_DISPLAY_MISSING
 # error this program cannot be compiled without X11.
 #endif
 
 #ifndef REMOTE_DEVICE
-# define REMOTE_DEVICE	"/dev/tty02"	/*biased to VAIO505 :-P*/
+# define REMOTE_DEVICE	"/dev/tty01"
 #endif
 
 static char *remote = REMOTE_DEVICE;
@@ -61,20 +65,49 @@
 static uid_t uid, euid;
 static gid_t gid, egid;
 static int uidswapped = 0;
+static char *irtype = "pocketpoint";
 
 static void usage __P((void));
 static void mainloop __P((int));
 static void buttonpress __P((int, int));
+static void motionmouse __P((int, int));
 static int uucplock __P((char *));
 static int uucpunlock __P((char *));
 static RETSIGTYPE sigtrap __P((int));
 static void daemonuid __P((void));
 static void useruid __P((void));
 
-#define EFFECT	0x15
-#define LEFT	0x16
-#define RIGHT	0x17
-#define RELEASE	0x55
+
+/* generic */
+#define RELEASE     0x55
+
+/* PocketPoint */
+#define PP_EFFECT   0x15
+#define PP_LEFT     0x16
+#define PP_RIGHT    0x17
+
+
+/* IR-55 */
+#define IR55_EFFECT  0x5a
+#define IR55_LEFT    0x2d
+#define IR55_RIGHT   0x2b
+
+#define IR55_CUR_U   0x61
+#define IR55_CUR_R   0x62
+#define IR55_CUR_D   0x63
+#define IR55_CUR_L   0x64
+#define IR55_CUR_UR  0x65
+#define IR55_CUR_DR  0x66
+#define IR55_CUR_DL  0x67
+#define IR55_CUR_UL  0x68
+#define IR55_CUR_UUR 0x69
+#define IR55_CUR_URR 0x6a
+#define IR55_CUR_DRR 0x6b
+#define IR55_CUR_DDR 0x6c
+#define IR55_CUR_DDL 0x6d
+#define IR55_CUR_DLL 0x6e
+#define IR55_CUR_ULL 0x6f
+#define IR55_CUR_UUL 0x70
 
 int
 main(argc, argv)
@@ -93,7 +126,7 @@
 	egid = getegid();
 	useruid();
 
-	while ((ch = getopt(argc, argv, "df:v")) != EOF) {
+	while ((ch = getopt(argc, argv, "df:t:v")) != EOF) {
 		switch (ch) {
 		case 'd':
 			debug++;
@@ -101,6 +134,9 @@
 		case 'f':
 			remote = optarg;
 			break;
+		case 't':
+			irtype = optarg;
+			break;
 		case 'v':
 			verbose++;
 			break;
@@ -111,6 +147,12 @@
 	}
 	argc -= optind;
 	argv += optind;
+	
+	/* check irtype */
+	if ( strcmp (irtype, "ir55") && strcmp (irtype, "pocketpoint")){
+	  fprintf(stderr, "Unknown device type %s\n",irtype);
+	  exit (0);
+	}
 
 	fprintf(stderr, "initializing...\r");
 
@@ -174,7 +216,8 @@
 static void
 usage()
 {
-	fprintf(stderr, "usage: xmindpath [-dv] [-f dev]\n");
+	fprintf(stderr, "usage: xmindpath [-dv] [-f dev] [-t devtype]\n");
+	fprintf(stderr, "       devtype: pocketpoint(default) or ir55\n");
 	exit(0);
 }
 
@@ -212,12 +255,49 @@
 			len = read(fd, buf, sizeof(buf));
 			for (i = 0; i < len; i++) {
 				/* filter out bogus remote commander code */
+
 				switch (buf[i]) {
-				case LEFT:
-				case RIGHT:
-				case EFFECT:
+				case IR55_LEFT:
+				case IR55_RIGHT:
+				case IR55_EFFECT:
+				case IR55_CUR_U:
+				case IR55_CUR_R:
+				case IR55_CUR_D:
+				case IR55_CUR_L:
+				case IR55_CUR_UR:
+				case IR55_CUR_DR:
+				case IR55_CUR_DL:
+				case IR55_CUR_UL:
+				case IR55_CUR_UUR:
+				case IR55_CUR_URR:
+				case IR55_CUR_DRR:
+				case IR55_CUR_DDR:
+				case IR55_CUR_DDL:
+				case IR55_CUR_DLL:
+				case IR55_CUR_ULL:
+				case IR55_CUR_UUL:
+
+					if (strcmp(irtype, "ir55")){
+						dprintf((stderr, "bogus char: %02x\n",
+						buf[i]));
+						continue;
+					}
+					break;
+
+				case PP_LEFT:
+				case PP_EFFECT:
+				case PP_RIGHT:
+
+					if (strcmp(irtype, "pocketpoint")){
+						dprintf((stderr, "bogus char: %02x\n",
+						buf[i]));
+					continue;
+					}
+					break;
+
 				case RELEASE:
 					break;
+
 				default:
 					dprintf((stderr, "bogus char: %02x\n",
 						buf[i]));
@@ -225,15 +305,18 @@
 				}
 
 				switch (buf[i]) {
-				case LEFT:
+				case PP_LEFT:
+				case IR55_LEFT:
 					dprintf((stderr, "left\n"));
 					buttonpress(Button3, 1);
 					break;
-				case RIGHT:
+				case PP_RIGHT:
+				case IR55_RIGHT:
 					dprintf((stderr, "right\n"));
 					buttonpress(Button1, 1);
 					break;
-				case EFFECT:
+				case PP_EFFECT:
+				case IR55_EFFECT:
 					dprintf((stderr, "effect\n"));
 					buttonpress(Button2, 1);
 					break;
@@ -243,6 +326,24 @@
 					buttonpress(Button2, 0);
 					buttonpress(Button3, 0);
 					break;
+				case IR55_CUR_U:
+				case IR55_CUR_R:
+				case IR55_CUR_D:
+				case IR55_CUR_L:
+				case IR55_CUR_UR:
+				case IR55_CUR_DR:
+				case IR55_CUR_DL:
+				case IR55_CUR_UL:
+				case IR55_CUR_UUR:
+				case IR55_CUR_URR:
+				case IR55_CUR_DRR:
+				case IR55_CUR_DDR:
+				case IR55_CUR_DDL:
+				case IR55_CUR_DLL:
+				case IR55_CUR_ULL:
+				case IR55_CUR_UUL:
+					motionmouse(buf[i], 0);
+					break;
 				default:
 					dprintf((stderr, "%02x\n", buf[i]));
 					continue;
@@ -275,6 +376,78 @@
 
 	XTestFakeButtonEvent(display, button, state ? True : False, 0);
 	buttonstate[offset] = state;
+	XFlush(display);
+}
+
+/* fake mouse button press */
+static void
+motionmouse(direction, state)
+	int direction;
+	int state;
+{
+
+	switch(direction){
+	case IR55_CUR_U:
+		XTestFakeRelativeMotionEvent (display, 0 ,-MOVE_DOTS, 0);
+		break;
+	case IR55_CUR_R:
+		XTestFakeRelativeMotionEvent (display, MOVE_DOTS, 0, 0);
+		break;
+	case IR55_CUR_D:
+		XTestFakeRelativeMotionEvent (display, 0, MOVE_DOTS, 0);
+		break;
+	case IR55_CUR_L:
+		XTestFakeRelativeMotionEvent (display, -MOVE_DOTS, 0, 0);
+		break;
+	case IR55_CUR_UR:
+		XTestFakeRelativeMotionEvent (display, sqrt(MOVE_DOTS), 
+			-sqrt(MOVE_DOTS), 0);
+		break;
+	case IR55_CUR_DR:
+		XTestFakeRelativeMotionEvent (display, sqrt(MOVE_DOTS),
+			sqrt(MOVE_DOTS), 0);
+		break;
+	case IR55_CUR_DL:
+		XTestFakeRelativeMotionEvent (display, -sqrt(MOVE_DOTS),
+			sqrt(MOVE_DOTS), 0);
+		break;
+	case IR55_CUR_UL:
+		XTestFakeRelativeMotionEvent (display, -sqrt(MOVE_DOTS),
+			-sqrt(MOVE_DOTS), 0);
+		break;
+	case IR55_CUR_UUR:
+		XTestFakeRelativeMotionEvent (display, sin(PI_8)*MOVE_DOTS,
+			-(cos(PI_8)*MOVE_DOTS), 0);
+		break;
+	case IR55_CUR_URR:
+		XTestFakeRelativeMotionEvent (display, cos(PI_8)*MOVE_DOTS,
+			-(sin(PI_8)*MOVE_DOTS), 0);
+		break;
+	case IR55_CUR_DRR:
+		XTestFakeRelativeMotionEvent (display, cos(PI_8)*MOVE_DOTS,
+			sin(PI_8)*MOVE_DOTS, 0);
+		break;
+	case IR55_CUR_DDR:
+		XTestFakeRelativeMotionEvent (display, sin(PI_8)*MOVE_DOTS,
+			cos(PI_8)*MOVE_DOTS, 0);
+		break;
+	case IR55_CUR_DDL:
+		XTestFakeRelativeMotionEvent (display, -(sin(PI_8)*MOVE_DOTS),
+			cos(PI_8)*MOVE_DOTS, 0);
+		break;
+	case IR55_CUR_DLL:
+		XTestFakeRelativeMotionEvent (display, -(cos(PI_8)*MOVE_DOTS),
+			sin(PI_8)*MOVE_DOTS, 0);
+		break;
+	case IR55_CUR_ULL:
+		XTestFakeRelativeMotionEvent (display, -(cos(PI_8)*MOVE_DOTS),
+			-(sin(PI_8)*MOVE_DOTS), 0);
+		break;
+	case IR55_CUR_UUL:
+		XTestFakeRelativeMotionEvent (display, -(sin(PI_8)*MOVE_DOTS),
+			-(cos(PI_8)*MOVE_DOTS), 0);
+		break;
+	}
 	XFlush(display);
 }