Création d'une librairie native de Clipboard

📅 May 20, 2021

Qu'est ce que le Clipboard ?

Le Clipboard aka le presse-papier, est une donnée que l'on copie temporairement dans la mémoire de l'ordinateur quand on fait le fameux CTRL + C et que l'on peut ensuite coller avec le raccourci CTRL + V. Cela permet d'échanger des données au sein d'un même logiciel ou entre plusieurs logiciels.

Les limitations du Clipboard avec SDL

SDL est une librairie cross-platform multimédia open source permettant l'accès bas niveau aux contrôleurs de jeux, claviers, à l'audio et à OpenGL entre autres. Très utilisée pour le développement de jeux vidéo, elle est parfois intégrée dans différents frameworks, comme OpenFl qui est un framework cross-platform que j'utilise pour tout type de projets. 

Malheureusement sa fonctionnalité de Clipboard est très limitée puisqu'elle ne permet d'échanger que du texte brute. Adieu donc texte html, adieu images, mais aussi adieu à tous types de formats personnalisés, pourtant nécessaires pour des fonctionnalités avancées de presse-papiers.

Ayant besoin de créer mon propre éditeur de scènes et d'interface pour une intégration plus aisée des graphismes dans mes jeux et applications, il me fallait la capacité de copier coller du texte formaté (en html) mais aussi des données provenant d'un logiciel de graphisme comme Photoshop ou Affinity Designer. Sinon autant continuer à utiliser Animate, logiciel odieusement bogué, qui me donne des nausées à chaque fois que je fais cracher la carte bleue.

Comment créer une librairie de Clipboard

Me voici donc finalement à apprendre le langage C afin d'utiliser la librairie native de Windows. Ça tombe bien j'ai également besoin de C pour avancer sur mon projet d'électronique embarqué avec un Raspberry PI. Après quelques heures de travail acharné, ma librairie native de Clipboard sous licence MIT est disponible. Elle peut être directement utilisée en C ou C++, mais aussi en Haxe, grâce aux bindings fournis. Pour ceux-ci, j'ai choisi Ammer qui permet d'avoir des bindings clairs et cross-platform.

Avec Haxe, les bindings dépendent malheureusement de la plateforme cible. Ainsi ils sont différents pour C++ et Hashlink.

#if cpp
private static var get_data = new cpp.Callablecpp.Void>(cpp.Prime._loadPrime("clipboard", "get_data", "o", false));
#elseif hl
("clipboard", "get_data") private static function get_data(type:String):hl.Bytes {}
#end

Mais grâce à ammer, il me suffit de faire seulement ça :

public static function get_data(type:String):String;

Ayant suffisament de quoi décoder différents formats du côté de Haxe (PNG par exemple), la librairie est plutôt bas niveau. Mais on peut désormais lire et écrire du texte, du html, du svg, des images et des PDF. A noter que bien que le svg soit du texte, dans le clipboard, il n'est pas accessible par le format texte (CF_TEXT), mais bien par le format svg (image/x-inkscape-svg), c'est cette petite différente qui empêche de récupérer ce format dans la librairie SDL ou la librairie de Clipboard utilisée par Aseprite, car celles-ci ne laissent pas le choix du format traité et se concentre sur les formats CF_TEXT et CF_DIB.

Aperçu

Et voilà un petit aperçu du résultat dans mon futur outil appelé Kadabra.

Copier coller d'affinity photo vers Kadabra

💾Sources du Native-Clipboard👀