ThinkPad570でスクロールマウスもどき #1

ThinkPad570をWindowsで使っているときに、真ん中ボタンを押しながらポインタを上下するとマウスホイールの上下として機能する。これをNetBSD-2.0.2で使いたい。
ということで、カーネルへのpatchを作ってみた。

--- dev/pckbport/pms.c	8 May 2005 12:42:41 -0000	1.1.1.1
+++ dev/pckbport/pms.c	20 May 2005 22:19:37 -0000	1.5
@@ -85,6 +85,7 @@
 
 	struct device *sc_wsmousedev;
 	struct proc *sc_event_thread;
+	int dz;
 };
 
 int pmsprobe(struct device *, struct cfdata *, void *);
@@ -250,6 +251,7 @@
 
 	sc->inputstate = 0;
 	sc->buttons = 0;
+	sc->dz = 0;
 
 	pckbport_slot_enable(sc->sc_kbctag, sc->sc_kbcslot, 1);
 
@@ -606,6 +608,21 @@
 			dy = -127;
 		
 		sc->inputstate = 0;
+
+		if (newbuttons & 0x02) {
+		    sc->dz += dy;
+		    if (sc->dz < -10 || sc->dz > 10) {
+			dz = -sc->dz;
+			if (dz >= 128)
+			    dz = 127;	/* XXX need? */
+			if (dz <= -128)
+			    dz = -127;	/* XXX need? */
+			sc->dz = 0;
+		    }
+		    dx = dy = 0;
+		}
+		newbuttons &= ~0x02;
+
 		changed = (sc->buttons ^ newbuttons);
 		sc->buttons = newbuttons;
 

どのレイヤをHackしようか迷ったけど、結局pms(4)に手も入れてみた。うーん、dzの値の範囲がこれでいいか自信ないな。dyの値をそのまま使うと感度が良すぎるので、少し遊びを持たせた。
そうそうこのpatchを当てると真ん中ボタンは真ん中ボタンとして使えなくなるので、3ボタンマウスのエミュレーションを有効にした方がいいと思う。