Extension de la fonctionnalité de Magic Mouse: ai-je besoin d'un kext?

J'ai récemment acheté une souris magique. C'est fantastique et plein de potentiel. Malheureusement, il est sérieusement entravé par le support logiciel. Je veux le corriger. J'ai fait beaucoup de recherches et ce sont mes conclusions concernant la chaîne d'événements jusqu'à présent:

  1. la souris magique envoie des événements multitouch complets au système.
  2. les événements Multitouch sont traités dans le MultitouchSupport.cadre (carbone)
  3. Les événements sont interprétés dans le cadre et envoyés à le système comme des événements normaux
    • Lorsque vous faites défiler avec un doigt, il envoie des événements réels de la molette de défilement.
    • Lorsque vous balayez avec deux doigts, il envoie un événement swipe.
  4. aucun événement NSTouch n'est envoyé au système. Vous ne pouvez pas utiliser L'API NSTouch pour interagir avec la souris.

Après avoir découvert tout ce qui précède, j'ai diassemblé le MultitouchSupport.fichier framework et, avec quelques recherches sur Google, compris Comment insérer un rappel de mon propre dans la chaîne donc je recevrait les données d'événement tactile brutes. Si vous énumérez la liste des périphériques, vous pouvez joindre pour chaque périphérique (trackpad et souris). Cette constatation nous permettrait de créer un cadre pour l'utilisation du multitouch sur la souris, mais seulement dans une seule application. Voir mon post ici: Raw Multitouch Tracking .

Je veux ajouter de nouvelles fonctionnalités à la souris dans l'ensemble système, pas juste une seule application.

Pour tenter de le faire, j'ai compris comment utiliser l'événement Robinets pour voir si le niveau le plus bas de l'événement appuyez sur me permettrait d'obtenir les données brutes, l'interpréter, et d'envoyer mes propres événements à sa place. Malheureusement, ce n'est pas le cas. Le robinet d'événement, même au niveau HID, est toujours une étape au-dessus où l'entrée est interprétée dans MultitouchSupport.Framework.

Voir ma tentative de tap d'événement ici: Tap D'événement-tentative Multitouch Raw .
Une note intéressante: lorsqu'un événement multitouch est reçu, comme un balayage, le cas par défaut est frappé et imprime un numéro d'événement de 29. L'en-tête montre 28 comme étant le max.

Sur ma question, maintenant que vous avez toutes les informations et avez vu ce que j'ai essayé: quelle serait la meilleure approche pour étendre la fonctionnalité de la souris magique? Je sais que j'ai besoin d'insérer quelque chose à un niveau assez bas pour obtenir l'entrée avant elle est traitée et événements prédéfinis sont expédiés. Donc, pour le réduire à des questions à une seule phrase:

  • Existe-t-il un moyen de remplacer les rappels par défaut utilisés dans MultitouchSupport.cadre?
  • Dois-je écrire un kext et gérer toutes les données entrantes moi-même?
  • est-il possible d'écrire un kext qui se trouve sur haut du kext qui gère l'Entrée maintenant, et le filtre après que kext a fait tout le travail dur?

Mon premier objectif est de pouvoir envoyer un événement de clic de bouton du milieu s'il y a deux doigts sur l'appareil lorsque vous cliquez. Évidemment, il est beaucoup, beaucoup plus cela pourrait être fait, mais cela semble être une bonne chose à tirer pour, pour l'instant.

Merci d'avance!

- Sastira

24
demandé sur Tyler 2009-11-03 23:21:14

4 réponses

Comment se passe ce qui se passe dans MultitouchSupport.cadre diffèrent entre la souris magique et un trackpad en verre? Si elle est basée sur les propriétés du périphérique IOKit, je soupçonne que vous aurez besoin d'un KEXT qui émule un trackpad mais communique réellement avec la souris. Apple a de la documentation sur la programmation du noyau Darwin et les extensions du noyau spécifiquement:

(personnellement, j'aimerais quelque chose qui a permis le grossissement de pincement et plus de gestes de balayage/bouton; en l'état, la souris magique est une rétrogradation fonctionnelle des quatre boutons de la souris puissante et [bien que toujours obstruant] molette de défilement 2D. Update : l'année dernière, j'ai écrit Sesamouse pour faire exactement cela, et il N'a pas besoin d'un kext (juste une semaine ou deux regardant les décharges hexadécimales: -) Voir mon autre réponse pour les deets et le code source.)

4
répondu natevw 2011-07-22 16:54:30

Désolé, j'ai oublié de mettre à jour cette réponse, mais j'ai fini par comprendre comment injecter des événements multitouch et gestuels dans le système depuis userland via Quartz Event Services. Je ne suis pas sûr de savoir à quel point il a survécu à la mise à jour Lion, mais vous pouvez consulter le code source sous-jacent à https://github.com/calftrail/Touch

Il nécessite deux hacks: en utilisant le cadre Multitouchprivate pour obtenir l'entrée du périphérique, et en injectant des structuresnon documentées CGEvent dans Quartz Event Services. C'était incroyablement amusant de comprendre comment le retirer, mais ces jours-ci, je recommande simplement d'acheter un trackpad magique: - P

3
répondu natevw 2011-07-22 17:36:45

J'ai implémenté une preuve de concept d'espace utilisateur personnalisable multi-touch events wrapper.

Vous pouvez lire à ce sujet ici: http://aladino.dmi.unict.it/?a=multitouch (voir WaybackMachine)

-- tous les meilleurs

3
répondu valv0 2011-11-21 15:24:14

Si vous arrivez à ce point, vous voudrez peut-être considérer le clic du milieu étant trois doigts sur la souris au lieu de deux. J'ai pensé à ce problème de clic du milieu avec la souris magique et je remarque que je laisse souvent mon doigt 2nd sur la souris même si Je ne fais qu'appuyer sur un clic gauche. Donc, un clic "2 doigt" peut être confondu avec un seul clic gauche, et il faudrait également plus d'efforts à l'utilisateur d'avoir toujours à garder le 2ème doigt de la souris. À cet effet si il est possible de détecter, trois doigts causerait moins de confusion et de maux de tête. Je me demande d'où viendra la première solution "clic du milieu", car je suis impatient que ma fonction D'exposition au clic du milieu revienne :) bonne chance.

2
répondu deblabla 2009-11-04 07:46:45