Apple impose ses règles sur l’utilisation de Sidecar, je les contourne avec Applescript

Disclaimer: En préambule, j’y raconte ma relation avec les produits d’Apple. Si l’anecdote personnelle n’est pas vraiment votre tasse de thé, l’introduction n’est pas nécessaire pour la suite de cet article.

Mon histoire Techno-romantique

Nous sommes fin octobre 2023 et cela clôture mon chapitre chez Octo Technology. Je dois donc restituer mon fidèle compagnon de ces dernières années, un Macbook Pro 16” surboosté avec 32go de RAM, une puce intel core i7 6coeurs cadencée à 2,6 Ghz.

Je me suis habitué à développer sur cette machine, fluide, efficace, dont le logiciel et le matériel ne font qu’un. Je suis un fervent libriste dans mes contributions, pour autant je ne peux nier le confort d’utilisation d’un Mac au quotidien dans un cadre pro.
Grâce au Mac, je n’ai plus à me soucier d’un certain nombre de contraintes de bas niveau lorsque je fais du développement, comme la gestion de drivers propriétaires pour le traitement audio…

Laissez-moi vous emmener quelques années en arrière. Je me revois, jeune et curieux, fouinant dans les déchetteries à la recherche de composants électroniques abandonnés. J’assemblais ces pièces pour redonner vie à des machines en y installant des distributions Linux. À cette époque, il était même possible de commander gratuitement les CD Ubuntu.
Sans même m’en rendre compte, j’expérimentais déjà les prémices d’une économie circulaire. L’histoire avec mon premier Mac est plutôt singulière. C’était un iMac G3 que mon père avait sauvé des encombrants. Bien qu’épris de nostalgie pour son processeur Power PC, ses capacités étaient, disons-le, limitées.
Lorsque j’ai touché mon premier salaire de job d’été, j’ai craqué. Je me suis offert un MacBook Pro (13 pouces, mi-2012). C’est à ce moment-là que j’ai véritablement découvert la puissance d’une interface utilisateur intuitive, couplée à un système d’exploitation ajusté à son matériel.
Imaginez ce même MacBook vieillissant, témoin silencieux de toute une décennie. Le mien, après dix années d’usage intensif, fonctionne toujours à merveille après un update de la RAM et l’ajout d’un SSD. Son propriétaire actuel n’est autre que mon père, qui continue de s’en servir régulièrement. De par mon insouciance de l’époque sur les questions environnementales, je m’étais laissé happé par la nouveauté en achetant le MacBook Retina 12 pouces de 2017. Je rêvais d’un compagnon léger, d’une machine capable de me suivre dans mes pérégrinations. Sa puissance de calcul, je la devais à un VPS que je louais pour mes expérimentations. J’appréciais l’idée d’avoir un terminal léger, avec une puissance de calcul déléguée à un serveur distant. Néanmoins, cette relation avec ce MacBook fût pour le moins tumultueuse. Un été, en plein cœur de la Sicile, pendant que je m’abandonnais aux vagues d’une réserve naturelle, nous nous étions fait, ma copine et moi, dérobé le contenu du véhicule de location lors de notre itinérance. Mon MacBook, nos bagages, tout avait disparu. Sans m’attarder davantage sur cette anecdote, une touriste allemande a retrouvé nos affaires 6 mois plus tard disséminer sur la plage.
Lorsque j’ai retrouvé mon MacBook, malgré une touche récalcitrante, il m’est revenu comme neuf en ayant bravé les intempéries.
Entre temps, Apple venait de sortir l’iPad Pro, moins coûteux, d’une légèreté séduisante, il se révéla être le remplaçant parfait, comblant le vide laissé par un MacBook que je pensais à jamais perdu.

Direction l’inconnu, l’iPad comme moniteur principal

Je dois tourner la page de mon MacBook 16” pour le développement. J’ai songé à faire évoluer mon MacBook 12” avec le projet OpenCoreLegacy https://github.com/dortania/OpenCore-Legacy-Patcher, mais le matériel reste très en deçà de ce dont j’ai besoin à ce jour.
Mes aspirations ont évolué. Je me suis donc dit, pourquoi ne pas fusionner la légèreté de l’iPad avec le potentiel de performance du MacMini. J’ai été attiré par la forte baisse de la consommation des processeurs ARM proposés par Apple: (cf: Informations sur la consommation d’énergie et la puissance calorifique (en BTU) du Mac mini ), l’aspect compact de l’ensemble avec un boitier comme unité de calcul, qui ne possède ni batterie, ni clavier, ni écran, rend le tout extrêmement modulaire et davantage réparable. J’avais donc fait mon choix, mon futur sera mini. Néanmoins, je ne voulais pas investir dans un nouvel écran. Lorsque j’en ai parlé au vendeur, il m’a affirmé qu’utiliser l’écran de l’iPad comme moniteur principal n’était pas possible. La fonction « Sidecar » se limitait à transformer l’iPad en simple écran secondaire. J’étais donc persuadé que je pouvais faire de cet « impossible » une réalité.

De l’exploration à la solution

Matériel

J’ai commencé par me documenter, je suis tombé sur des projets similaires avec des solutions que j’avais vu en ligne, notamment via cette vidéo: Sidecar with iPad as monitor without any dongles! Mais je n’ai visiblement pas réussi à reproduire cette solution sur MacOS Sonoma 14.0.
Dans mes recherches, je suis tombé sur la solution matérielle Luna Display avec un headless mode qui s’apparentait à ce que je cherchais à atteindre.

La solution reste couteuse, je suis donc revenu à une solution vu précédemment sur un forum, qui consistait à automatiser via la manipulation des objets graphiques, l’action humaine de recopie d’écran via le centre de contrôle (GUI script) pour déclencher l’affichage sidecar.
Mais vraisemblablement Apple a bloqué la possibilité d’effectuer cette action sans moniteur principal. Il fallait donc trouver une solution matérielle pour pallier à cette limitation. J’ai donc trouvé une solution, celle de faire croire à MacOS qu’un écran est branché sur le port HDMi.
Je suis donc passé par un composant peu onéreux qu’est un émulateur EDID HDMi programmable.

Kézaco?

Ce petit composant qui se connecte sur le port HDMi du Mac Mini, c’est un dispositif conçu pour imiter les informations EDID (Extended Display Identification Data) d’un écran. Le but de cet outil est de fournir constamment à la source vidéo (comme un ordinateur ou un lecteur multimédia) des informations sur les capacités d’affichage, même si l’écran n’est pas connecté. Ces informations d’affichage incluent des choses comme les résolutions supportées, les taux de rafraîchissement, le type de connecteur, les formats audio supportés, etc.

Pour en comprendre l’origine, reprenons notre machine à remonter le temps. Dans les années 80, la communication entre adaptateurs graphiques et moniteurs étaient rudimentaires. Sans moyen standard pour définir les résolutions supportées, il était possible d’endommager un écran CRT en sélectionnant une fréquence trop élevée. Les fabricants ont donc intégré des circuits de protection affichant un message d’erreur « Out of Scan Range » pour alerter l’utilisateur.

Schéma: Extrait du site lions-wing.net

Pour palier à ces manques, la Video Electronics Standards Association (VESA) a introduit des normes, dont le Display Data Channel, l’Extended Display Identification Data et plus récemment le DisplayID. Ces normes permettent aux adaptateurs graphiques de reconnaître les capacités des moniteurs. Grâce à une ROM intégrée dans les écrans, décrivant leurs spécificités, et à un protocole standard, l’adaptateur et le système d’exploitation peuvent proposer des résolutions compatibles.

Le protocole EDID utilisé par HDMI repose sur le bus I²C pour la communication entre la source vidéo et le moniteur. Ce bus série I²C a également été conçu dans les années 80, pour permettre une communication bidirectionnelle entre différents composants électroniques, en proposant l’acquittement des octets reçus, tout en étant une solution simple avec l’utilisation de seulement 2 fils:

  • SDA (Data Line)
  • SCL (Clock Line)

L’émulateur EDID HDMi est donc intéressant pour dépanner un équipement en simulant plusieurs types de moniteurs, régler des incompatibilités entre 2 systèmes, et dans notre cas, il va nous permettre de simuler la présence d’un écran principal pour exécuter notre AppleScript au démarrage.

Logiciel

AppleScript est un langage de script créé par Apple pour MacOS en 1993, la dernière version date de 2015, il s’agit de la 2.8. L’une des fonctions les moins connues, mais particulièrement puissante d’AppleScript est de pouvoir interagir avec des éléments d’interface graphique (GUI).
Comme avec une console de développement dans Chrome pour identifier des éléments du DOM, il est possible avec XCode d’identifier des éléments de l’interface avec lequel on souhaite interagir. C’est là qu’intervient l’utilisation de l’Accessibility Inspector disponible dans XCode.

Pour ce faire, il suffit d’installer XCode, qu’est l’environnement de développement intégré (IDE) d’Apple et de vous rendre dans la barre de menus via Xcode > Open Developer Tool > Accessibility Inspector.

set IPAD_NAME to "iPad de Clement"
-- Cette fonction est responsable de l'ouverture des préférences système, de la recherche du menu déroulant permettant de connecter des écrans externes, et d'établir la connexion avec l'iPad spécifié.
on sidecar_connection(IPAD_NAME)
    tell application "System Events"
        tell application process "System Settings"
            repeat until exists pop up button 1 of group 1 of group 2 of splitter group 1 of group 1 of window 1
                delay 0
            end repeat

            tell splitter group 1 of group 1 of window 1
                tell pop up button 1 of group 1 of group 2
                    click
                    delay 0.5
                    set add_display_items to name of menu items of menu 1 as list
                    log add_display_items
                    set sel_item to 0
                    set section_break to 0
                    -- Une boucle pour garantir que les éléments graphiques sont biens chargés avant d'exécuter la suite des actions
                    repeat with i from 1 to number of items in add_display_items
                        if item i of add_display_items = missing value then
                            set section_break to i
                            exit repeat
                        end if
                    end repeat
                    if section_break = 0 then
                        set section_break to 1
                    end if
                    repeat with i from section_break to number of items in add_display_items
                        if item i of add_display_items = IPAD_NAME then
                            set sel_item to i
                            log sel_item
                            exit repeat
                        end if
                    end repeat
                    click menu item sel_item of menu 1
                    return sel_item
                end tell
            end tell
        end tell
    end tell
end sidecar_connection

do shell script "/usr/bin/open file:///System/Library/PreferencePanes/Displays.prefPane/"
delay 1

sidecar_connection(IPAD_NAME)

Maintenant, on automatise le lancement du script au démarrage de la session utilisateur avec Automator, mais j’aurais également pu le faire avec launchd.
Pour ça, j’ai simplement écrit le script shell qui permettra d’exécuter l’AppleScript:

#!/bin/bash
osascript ~/Documents/ActiveSidecarSonoma.scpt

Dans Automator, je créé une application en donnant les bonnes autorisations via le gestionnaire de sécurité de MacOS.

Grâce à la puissance d’AppleScript, j’ai découvert une solution de contournement ingénieuse qui permet enfin de transformer mon iPad en moniteur principal pour le Mac Mini. Ce pied de nez à Apple démontre, qu’avec un peu de créativité, il est possible de contourner les contraintes de logiciels propriétaires. J’ai enfin une solution de mobilité qui répond à mes besoins sans dépendre d’un écran externe ou d’une connexion internet lors de mes déplacements.

Démonstration

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *