Lines Matching +full:middle +full:- +full:button

5 /*-
6 * SPDX-License-Identifier: BSD-2-Clause
73 #define MAGIC_MOUSE(D) (((D)->vendor_id == 0x5ac) && ((D)->product_id == 0x30d))
82 * Probe for per-device initialisation
87 hid_device_p hid_device = get_hid_device(&s->bdaddr); in hid_initialise()
93 if ((s->ctx = calloc(1, sizeof(struct apple_state))) == NULL) in hid_initialise()
95 write(s->ctrl, rep, 3); in hid_initialise()
115 data[0], bt_ntoa(&s->bdaddr, NULL)); in hid_control()
126 bt_ntoa(&s->bdaddr, NULL), in hid_control()
132 bt_ntoa(&s->bdaddr, NULL)); in hid_control()
137 bt_ntoa(&s->bdaddr, NULL)); in hid_control()
142 bt_ntoa(&s->bdaddr, NULL)); in hid_control()
149 bt_ntoa(&s->bdaddr, NULL), data[0]); in hid_control()
156 "channel from %s", data[0], bt_ntoa(&s->bdaddr, NULL)); in hid_control()
178 assert(s->srv != NULL); in hid_interrupt()
183 "channel from %s", len, bt_ntoa(&s->bdaddr, NULL)); in hid_interrupt()
184 return (-1); in hid_interrupt()
190 data[0], bt_ntoa(&s->bdaddr, NULL)); in hid_interrupt()
191 return (-1); in hid_interrupt()
196 len --; in hid_interrupt()
198 hid_device = get_hid_device(&s->bdaddr); in hid_interrupt()
204 for (d = hid_start_parse(hid_device->desc, 1 << hid_input, -1); in hid_interrupt()
222 const uint32_t usage_offset = val - h.logical_minimum; in hid_interrupt()
240 mouse_z = -val; in hid_interrupt()
246 syslog(LOG_NOTICE, "Sleep button pressed"); in hid_interrupt()
256 bit_set(s->keys1, usage); in hid_interrupt()
259 bit_set(s->keys1, val); in hid_interrupt()
265 bit_set(s->keys1, val); in hid_interrupt()
277 mouse_butt |= (val << (usage - 1)); in hid_interrupt()
283 if (hid_device->keyboard && s->srv->uinput) { in hid_interrupt()
285 uinput_rep_cons(s->ukbd, usage, !!val); in hid_interrupt()
287 if (s->consk > 0) in hid_interrupt()
288 uinput_rep_cons(s->ukbd, in hid_interrupt()
289 s->consk, 0); in hid_interrupt()
290 if (uinput_rep_cons(s->ukbd, val, 1) in hid_interrupt()
292 s->consk = val; in hid_interrupt()
384 /* XXX FIXME - UGLY HACK */ in hid_interrupt()
386 if (hid_device->keyboard) { in hid_interrupt()
390 assert(s->vkbd != -1); in hid_interrupt()
391 write(s->vkbd, buf, sizeof(buf)); in hid_interrupt()
394 "received from non-keyboard " \ in hid_interrupt()
396 bt_ntoa(&s->bdaddr, NULL)); in hid_interrupt()
403 if (!hid_device->battery_power) in hid_interrupt()
409 bt_ntoa(&s->bdaddr, NULL)); in hid_interrupt()
414 bt_ntoa(&s->bdaddr, NULL)); in hid_interrupt()
420 bt_ntoa(&s->bdaddr, NULL)); in hid_interrupt()
435 if (MAGIC_MOUSE(hid_device) && s->ctx) { in hid_interrupt()
436 struct apple_state *c = (struct apple_state *)s->ctx; in hid_interrupt()
437 int firm = 0, middle = 0; in hid_interrupt() local
440 data++, len--; /* Chomp report_id */ in hid_interrupt()
460 * The hard part: accumulate touch events and emulate middle in hid_interrupt()
462 for (data += AMM_BASIC_BLOCK, len -= AMM_BASIC_BLOCK; in hid_interrupt()
464 data += AMM_FINGER_BLOCK, len -= AMM_FINGER_BLOCK) { in hid_interrupt()
471 y = -(((int16_t)(v << 4)) >> 4); in hid_interrupt()
475 z = (y - c->y[id]) / AMM_WHEEL_SPEED; in hid_interrupt()
479 c->y[id] = y; in hid_interrupt()
484 c->y[id] += z * AMM_WHEEL_SPEED; in hid_interrupt()
491 /* Count firm touches vs. firm+middle touches */ in hid_interrupt()
492 if (force >= 8 && ++firm && x > -350 && x < 350) in hid_interrupt()
493 ++middle; in hid_interrupt()
498 * touches which are all in center, make it a middle click in hid_interrupt()
500 if (mouse_butt && !c->button_state && firm && middle == firm) in hid_interrupt()
505 * to a middle click, keep it middle clicking in hid_interrupt()
508 if (mouse_butt && c->button_state == 0x2) in hid_interrupt()
511 if (mouse_butt != c->button_state) in hid_interrupt()
512 c->button_state = mouse_butt, mevents++; in hid_interrupt()
524 if (hid_device->keyboard) { in hid_interrupt()
525 assert(s->vkbd != -1); in hid_interrupt()
529 "non-keyboard device %s. Please report", in hid_interrupt()
530 bt_ntoa(&s->bdaddr, NULL)); in hid_interrupt()
536 * Need to track double-clicks etc. in hid_interrupt()
548 /* translate T-axis into button presses */ in hid_interrupt()
551 if (ioctl(s->srv->cons, CONS_MOUSECTL, &mi) < 0) in hid_interrupt()
554 bt_ntoa(&s->bdaddr, NULL), in hid_interrupt()
563 if (ioctl(s->srv->cons, CONS_MOUSECTL, &mi) < 0) in hid_interrupt()
565 "%s. %s (%d)", bt_ntoa(&s->bdaddr, NULL), in hid_interrupt()
568 if (hid_device->mouse && s->srv->uinput && in hid_interrupt()
569 uinput_rep_mouse(s->umouse, mouse_x, mouse_y, mouse_z, in hid_interrupt()
570 mouse_t, mouse_butt, s->obutt) < 0) in hid_interrupt()
572 "%s. %s (%d)", bt_ntoa(&s->bdaddr, NULL), in hid_interrupt()
574 s->obutt = mouse_butt; in hid_interrupt()