1 /* 2 * drivers/macintosh/mac_hid.c 3 * 4 * HID support stuff for Macintosh computers. 5 * 6 * Copyright (C) 2000 Franz Sirl. 7 * 8 * This file will soon be removed in favor of an uinput userspace tool. 9 */ 10 11 #include <linux/init.h> 12 #include <linux/proc_fs.h> 13 #include <linux/sysctl.h> 14 #include <linux/input.h> 15 #include <linux/module.h> 16 17 18 static struct input_dev *emumousebtn; 19 static int emumousebtn_input_register(void); 20 static int mouse_emulate_buttons; 21 static int mouse_button2_keycode = KEY_RIGHTCTRL; /* right control key */ 22 static int mouse_button3_keycode = KEY_RIGHTALT; /* right option key */ 23 static int mouse_last_keycode; 24 25 #if defined(CONFIG_SYSCTL) 26 /* file(s) in /proc/sys/dev/mac_hid */ 27 static ctl_table mac_hid_files[] = { 28 { 29 .ctl_name = DEV_MAC_HID_MOUSE_BUTTON_EMULATION, 30 .procname = "mouse_button_emulation", 31 .data = &mouse_emulate_buttons, 32 .maxlen = sizeof(int), 33 .mode = 0644, 34 .proc_handler = &proc_dointvec, 35 }, 36 { 37 .ctl_name = DEV_MAC_HID_MOUSE_BUTTON2_KEYCODE, 38 .procname = "mouse_button2_keycode", 39 .data = &mouse_button2_keycode, 40 .maxlen = sizeof(int), 41 .mode = 0644, 42 .proc_handler = &proc_dointvec, 43 }, 44 { 45 .ctl_name = DEV_MAC_HID_MOUSE_BUTTON3_KEYCODE, 46 .procname = "mouse_button3_keycode", 47 .data = &mouse_button3_keycode, 48 .maxlen = sizeof(int), 49 .mode = 0644, 50 .proc_handler = &proc_dointvec, 51 }, 52 { .ctl_name = 0 } 53 }; 54 55 /* dir in /proc/sys/dev */ 56 static ctl_table mac_hid_dir[] = { 57 { 58 .ctl_name = DEV_MAC_HID, 59 .procname = "mac_hid", 60 .maxlen = 0, 61 .mode = 0555, 62 .child = mac_hid_files, 63 }, 64 { .ctl_name = 0 } 65 }; 66 67 /* /proc/sys/dev itself, in case that is not there yet */ 68 static ctl_table mac_hid_root_dir[] = { 69 { 70 .ctl_name = CTL_DEV, 71 .procname = "dev", 72 .maxlen = 0, 73 .mode = 0555, 74 .child = mac_hid_dir, 75 }, 76 { .ctl_name = 0 } 77 }; 78 79 static struct ctl_table_header *mac_hid_sysctl_header; 80 81 #endif /* endif CONFIG_SYSCTL */ 82 83 int mac_hid_mouse_emulate_buttons(int caller, unsigned int keycode, int down) 84 { 85 switch (caller) { 86 case 1: 87 /* Called from keyboard.c */ 88 if (mouse_emulate_buttons 89 && (keycode == mouse_button2_keycode 90 || keycode == mouse_button3_keycode)) { 91 if (mouse_emulate_buttons == 1) { 92 input_report_key(emumousebtn, 93 keycode == mouse_button2_keycode ? BTN_MIDDLE : BTN_RIGHT, 94 down); 95 input_sync(emumousebtn); 96 return 1; 97 } 98 mouse_last_keycode = down ? keycode : 0; 99 } 100 break; 101 } 102 return 0; 103 } 104 105 static int emumousebtn_input_register(void) 106 { 107 int ret; 108 109 emumousebtn = input_allocate_device(); 110 if (!emumousebtn) 111 return -ENOMEM; 112 113 emumousebtn->name = "Macintosh mouse button emulation"; 114 emumousebtn->id.bustype = BUS_ADB; 115 emumousebtn->id.vendor = 0x0001; 116 emumousebtn->id.product = 0x0001; 117 emumousebtn->id.version = 0x0100; 118 119 emumousebtn->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); 120 emumousebtn->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); 121 emumousebtn->relbit[0] = BIT(REL_X) | BIT(REL_Y); 122 123 ret = input_register_device(emumousebtn); 124 if (ret) 125 input_free_device(emumousebtn); 126 127 return ret; 128 } 129 130 static int __init mac_hid_init(void) 131 { 132 int err; 133 134 err = emumousebtn_input_register(); 135 if (err) 136 return err; 137 138 #if defined(CONFIG_SYSCTL) 139 mac_hid_sysctl_header = register_sysctl_table(mac_hid_root_dir); 140 #endif /* CONFIG_SYSCTL */ 141 142 return 0; 143 } 144 145 device_initcall(mac_hid_init); 146