objective c - plata - Ampliación de la funcionalidad de Magic Mouse: ¿Necesito un kext?
magic trackpad 2 plata (4)
¿En qué se diferencia lo que sucede en MultitouchSupport.framework entre el Magic Mouse y un trackpad de cristal? Si se basa en las propiedades del dispositivo IOKit, sospecho que necesitará un KEXT que emule un trackpad pero que realmente se comunique con el mouse. Apple tiene alguna documentación sobre la programación del kernel de Darwin y específicamente sobre las extensiones del kernel:
- Sobre las Extensiones de Kernel
- Introducción a las pautas de diseño del controlador de dispositivo de kit de E / S
- Guía de programación del kernel
(Personalmente, me encantaría algo que permitiera la ampliación de pellizco y más gestos de deslizar / botones; como es, el Magic Mouse es un downgrade funcional de los cuatro botones del Mighty Mouse y [aunque siempre está obstruido] la rueda de desplazamiento 2D. Actualización : última El año en que escribí Sesamouse para hacer precisamente eso, NO necesita un kext (solo una o dos semanas mirando los volcados hexadecimales :-) Vea mi otra respuesta para los códigos de origen y deets).
Hace poco compré un Magic Mouse. Es fantástico y lleno de potencial. Desafortunadamente, está seriamente obstaculizado por el soporte de software. Quiero arreglar eso. He investigado bastante y estas son mis conclusiones con respecto a la cadena de eventos hasta el momento:
- El Magic Mouse envía eventos multitáctiles completos al sistema.
- Los eventos multitáctiles se procesan en MultitouchSupport.framework (Carbon)
- Los eventos se interpretan en el marco y se envían al sistema como eventos normales.
- Cuando se desplaza con un dedo, envía eventos reales de la rueda de desplazamiento.
- Cuando se desliza con dos dedos, envía un evento de deslizamiento.
- No se envían eventos NSTouch al sistema. No puede utilizar la API de NSTouch para interactuar con el mouse.
Después de que descubrí todo lo anterior, desmonté el archivo MultitouchSupport.framework y, con un poco de googlear, descubrí cómo insertar una devolución de llamada propia en la cadena para recibir los datos del evento en bruto. Si enumera la lista de dispositivos, puede adjuntar para cada dispositivo (trackpad y mouse). Este hallazgo nos permitiría crear un marco para el uso multitáctil en el mouse, pero solo en una sola aplicación. Ver mi post aquí: Raw Multitouch Tracking .
Quiero agregar una nueva funcionalidad al mouse en todo el sistema , no solo en una aplicación.
En un intento de hacerlo, me di cuenta de cómo usar las pulsaciones de eventos para ver si la pulsación de eventos del nivel más bajo me permitiría obtener los datos en bruto, interpretarlos y enviar mis propios eventos en su lugar. Por desgracia, este no es el caso. El toque del evento, incluso en el nivel HID, sigue siendo un paso por encima de donde se interpreta la entrada en MultitouchSupport.framework.
Vea mi intento de toque de evento aquí: Toque de evento - Intente Multitouch en bruto .
Una nota al margen interesante: cuando se recibe un evento multitáctil, como un golpe, el caso predeterminado es golpeado e imprime un número de evento de 29. El encabezado muestra 28 como máximo.
En mi pregunta, ahora que tiene toda la información y ha visto lo que he intentado, ¿cuál sería el mejor enfoque para ampliar la funcionalidad del Magic Mouse? Sé que necesito insertar algo en un nivel suficientemente bajo para obtener la entrada antes de que se procese y se envíen eventos predefinidos. Entonces, para resumirlo en preguntas de una sola oración:
- ¿Hay alguna manera de anular las devoluciones de llamada predeterminadas utilizadas en MultitouchSupport.framework?
- ¿Necesito escribir un kext y manejar todos los datos entrantes?
- ¿Es posible escribir un kext que se sienta sobre el kext que maneja la entrada ahora, y lo filtra después de que kext haya hecho todo el trabajo duro?
Mi primer objetivo es poder enviar un evento de clic con el botón central si hay dos dedos en el dispositivo cuando haces clic. Obviamente, hay mucho, mucho más que se podría hacer, pero esto parece ser algo bueno para disparar, por ahora.
¡Gracias por adelantado!
-Sastira
He implementado una prueba de concepto de contenedor de eventos multitáctil personalizable en el espacio de usuario.
Puedes leer sobre esto aquí: http://aladino.dmi.unict.it/?a=multitouch (ver en WaybackMachine )
-- todo lo mejor
Si llega a ese punto, es posible que desee considerar que el clic central sea tres dedos en el mouse en lugar de dos. He pensado en este problema del clic con el mouse mágico y me doy cuenta de que a menudo dejo el dedo meñique del mouse, aunque solo estoy presionando el botón izquierdo. Por lo tanto, un clic de "2 dedos" puede confundirse con un solo clic izquierdo, y también requiere que el usuario haga un mayor esfuerzo para mantener siempre el segundo dedo fuera del mouse. Por lo tanto, si es posible detectar, tres dedos causarán menos confusión y dolores de cabeza. Me pregunto de dónde vendrá la primera solución de "clic con el botón central", ya que estoy ansioso por que mi función de Exponer haga clic en el botón central para regresar :) La mejor de las suertes.
Lo siento, olvidé actualizar esta respuesta, pero terminé descubriendo cómo inyectar eventos multitáctiles y gestuales en el sistema desde la zona de usuario a través de los Servicios de eventos de cuarzo . No estoy seguro de qué tan bien sobrevivió a la actualización de Lion, pero puede consultar el código fuente subyacente en https://github.com/calftrail/Touch
Requiere dos hacks: usar el marco privado Multitouch para obtener la entrada del dispositivo e inyectar estructuras CGEvent no documentadas en los Servicios de eventos de cuarzo. Fue increíblemente divertido descubrir cómo llevarlo a cabo, pero en estos días recomiendo comprar un Magic Trackpad :-P