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

[patch] Disable adb trackpad on plugging usb mouse



Hi all,
this is a patch for kernel >2.6.5  (i am using it on a 2.6.6-rc2-mm1 )
that allows you to disable the trackpad on iBook/PowerBook when you plug
one or more usb mouses.

The behaviour is driven by a proc file:

/proc/sys/dev/mac_hid/adb_trackpad_disable_on_usb_mouse

when this file is setted > 0 the trackpad will be disabled
if you plug >= N mouse in the system,where N is the number written
in the proc file.

Please test it :)


-- 
Roberto De Ioris
the Packardt imaging
via belfiore, 20 10125 Torino Italy
tel. 0116699470 --- cel.3886699470 --- fax.0116695528
diff -Naur linux-2.6.5/drivers/macintosh/Kconfig linux-2.6.5-robbo/drivers/macintosh/Kconfig
--- linux-2.6.5/drivers/macintosh/Kconfig	2004-04-04 05:36:57.000000000 +0200
+++ linux-2.6.5-robbo/drivers/macintosh/Kconfig	2004-05-04 17:10:35.000000000 +0200
@@ -168,6 +168,19 @@
 
 	  If you have an Apple machine with a 1-button mouse, say Y here.
 
+config MAC_DISABLE_ADB_TRACKPAD_ON_USB_MOUSE
+        bool "Support for disabling trackpad on usbmouse plugging"
+	depends on INPUT_ADBHID
+	help
+	  This provides support for disabling the iBook/PowerBook
+	  trackpad when one or more usb mouses are plugged in.
+	  This behavior remains off until you specify in
+
+          /proc/sys/dev/mac_hid/adb_trackpad_disable_on_usb_mouse
+
+          the minimum number of usb mouses that have to be plugged
+          in to disable the trackpad (normally 1).
+
 config THERM_WINDTUNNEL
 	tristate "Support for thermal management on Windtunnel G4s"
 	depends on I2C && I2C_KEYWEST && PPC_PMAC && !PPC_PMAC64
diff -Naur linux-2.6.5/drivers/macintosh/adbhid.c linux-2.6.5-robbo/drivers/macintosh/adbhid.c
--- linux-2.6.5/drivers/macintosh/adbhid.c	2004-04-04 05:38:27.000000000 +0200
+++ linux-2.6.5-robbo/drivers/macintosh/adbhid.c	2004-05-04 17:15:44.000000000 +0200
@@ -54,6 +54,58 @@
 #include <asm/backlight.h>
 #endif
 
+
+#ifdef CONFIG_MAC_DISABLE_ADB_TRACKPAD_ON_USB_MOUSE
+
+#include <linux/proc_fs.h>
+#include <linux/sysctl.h>
+
+static int disable_adb_on_usb = 0 ;
+
+ctl_table mac_hid_files2[] = {
+        {
+                .ctl_name       = DEV_MAC_HID_ADB_TRACKPAD_DISABLE_ON_USB_MOUSE,
+                .procname       = "adb_trackpad_disable_on_usb_mouse",
+                .data           = &disable_adb_on_usb,
+                .maxlen         = sizeof(int),
+                .mode           = 0644,
+                .proc_handler   = &proc_dointvec,
+        },
+        { .ctl_name = 0 }
+};
+
+ctl_table mac_hid_dir2[] = {
+        {
+                .ctl_name       = DEV_MAC_HID,
+                .procname       = "mac_hid",
+                .maxlen         = 0,
+                .mode           = 0555,
+                .child          = mac_hid_files2,
+        },
+        { .ctl_name = 0 }
+};
+
+ctl_table mac_hid_root_dir2[] = {
+        {
+                .ctl_name       = CTL_DEV,
+                .procname       = "dev",
+                .maxlen         = 0,
+                .mode           = 0555,
+                .child          = mac_hid_dir2,
+        },
+        { .ctl_name = 0 }
+};
+
+static struct ctl_table_header *mac_hid_sysctl_header;
+
+
+int mouseesterno = 0 ;
+EXPORT_SYMBOL(mouseesterno) ;
+
+#endif
+
+
+
 MODULE_AUTHOR("Franz Sirl <Franz.Sirl-kernel@lauterbach.com>");
 
 #define KEYB_KEYREG	0	/* register # for key up/down data */
@@ -321,6 +373,13 @@
                 break;
 	}
 
+#ifdef CONFIG_MAC_DISABLE_ADB_TRACKPAD_ON_USB_MOUSE
+
+	if (disable_adb_on_usb>0 && adbhid[id]->mouse_kind == ADBMOUSE_TRACKPAD && mouseesterno>=disable_adb_on_usb) {
+	}
+	else {
+#endif
+
 	input_regs(&adbhid[id]->input, regs);
 
 	input_report_key(&adbhid[id]->input, BTN_LEFT,   !((data[1] >> 7) & 1));
@@ -335,6 +394,11 @@
 			 ((data[1]&0x7f) < 64 ? (data[1]&0x7f) : (data[1]&0x7f)-128 ));
 
 	input_sync(&adbhid[id]->input);
+
+#ifdef CONFIG_MAC_DISABLE_ADB_TRACKPAD_ON_USB_MOUSE
+	        }
+#endif
+
 }
 
 static void
@@ -1046,6 +1110,13 @@
 
 	notifier_chain_register(&adb_client_list, &adbhid_adb_notifier);
 
+#ifdef CONFIG_MAC_DISABLE_ADB_TRACKPAD_ON_USB_MOUSE
+
+	mac_hid_sysctl_header = register_sysctl_table(mac_hid_root_dir2, 1);
+
+#endif
+
+
 	return 0;
 }
 
diff -Naur linux-2.6.5/drivers/usb/input/hid-core.c linux-2.6.5-robbo/drivers/usb/input/hid-core.c
--- linux-2.6.5/drivers/usb/input/hid-core.c	2004-04-04 05:37:23.000000000 +0200
+++ linux-2.6.5-robbo/drivers/usb/input/hid-core.c	2004-05-04 17:18:37.000000000 +0200
@@ -33,6 +33,12 @@
 #include "hid.h"
 #include <linux/hiddev.h>
 
+#ifdef CONFIG_MAC_DISABLE_ADB_TRACKPAD_ON_USB_MOUSE
+
+extern int mouseesterno ;
+
+#endif
+
 /*
  * Version Information
  */
@@ -1678,10 +1684,13 @@
 static void hid_disconnect(struct usb_interface *intf)
 {
 	struct hid_device *hid = usb_get_intfdata (intf);
+	char *c ;
 
 	if (!hid)
 		return;
 
+	c = hid_types[hid->collection[0].usage & 0xffff];
+
 	usb_set_intfdata(intf, NULL);
 	usb_unlink_urb(hid->urbin);
 	usb_unlink_urb(hid->urbout);
@@ -1697,6 +1706,14 @@
 	if (hid->urbout)
 		usb_free_urb(hid->urbout);
 
+#ifdef CONFIG_MAC_DISABLE_ADB_TRACKPAD_ON_USB_MOUSE
+
+	        if (c == "Mouse" && mouseesterno>0) {
+		    mouseesterno-- ;
+		}
+
+#endif
+
 	hid_free_buffers(hid->dev, hid);
 	hid_free_device(hid);
 }
@@ -1754,6 +1771,14 @@
 	printk(": USB HID v%x.%02x %s [%s] on %s\n",
 		hid->version >> 8, hid->version & 0xff, c, hid->name, path);
 
+#ifdef CONFIG_MAC_DISABLE_ADB_TRACKPAD_ON_USB_MOUSE
+
+	        if (c == "Mouse") {
+		   mouseesterno++ ;
+		}
+
+#endif
+
 	return 0;
 }
 
diff -Naur linux-2.6.5/include/linux/sysctl.h linux-2.6.5-robbo/include/linux/sysctl.h
--- linux-2.6.5/include/linux/sysctl.h	2004-04-04 05:37:23.000000000 +0200
+++ linux-2.6.5-robbo/include/linux/sysctl.h	2004-05-04 17:29:14.000000000 +0200
@@ -716,7 +716,8 @@
 	DEV_MAC_HID_MOUSE_BUTTON_EMULATION=3,
 	DEV_MAC_HID_MOUSE_BUTTON2_KEYCODE=4,
 	DEV_MAC_HID_MOUSE_BUTTON3_KEYCODE=5,
-	DEV_MAC_HID_ADB_MOUSE_SENDS_KEYCODES=6
+	DEV_MAC_HID_ADB_MOUSE_SENDS_KEYCODES=6,
+	DEV_MAC_HID_ADB_TRACKPAD_DISABLE_ON_USB_MOUSE=7
 };
 
 /* /proc/sys/dev/scsi */

Attachment: signature.asc
Description: This is a digitally signed message part


Reply to: