À force de me voir utiliser Linux (Debian hihi) ma copine semble de plus en plus tentée par l'idée de quitter Windows. C'est des petits trucs tout bête comme cbonsai et oneko qui semblent le plus la fasciner (oui ces petits softs si inutiles mais indispensables
)
Elle adore Oneko (apparemment ça peut tourner sous Windows mais chuuut) et elle m'a suggéré une idée rigolote : avoir un petit cochon qui court après le curseur parmi l’éventail de personnages. Chouette une bonne occasion de bidouiller un peu !
Ni une ni deux je me met en quête du code source, utilisant déjà le Oneko présent dans les paquets Debian et le trouvant fort convenable je vais le chercher
ici.
Me voilà donc avec une belle base de travail. Premièrement et le plus amusant peut-être, éditer les fichiers bitmaps pour produire les différentes trames qui serviront à animer le dodu suidé. Les amateurs éclairés auront remarqué que j'ai utilisé les fichiers bitmaps de Neko comme base
Voilà chose faite pour chacun des 32 fichiers XBM ainsi que leur pendant "mask" sans oublier bien sûr de créer les petits fichiers .include idoines. Dans ma gerbe créatrice, je décide de lui créer un petit curseur spécifique : un gâteau dans une assiette. J'ai utilisé le programme bitmap pour faire tout ça mais il m'a été impossible de paramétrer le hotspot que j'ai dû définir directement en éditant le fichier XBM dans mousepad.
Oui ça ressemble aussi à un petit caca mais on reste dans la thématique du cochon (bien que ces animaux soient bien moins sales que ce que leur attribue leur réputation)
Seconde phase, moins agréable mais intéressante : éditer oneko.c et oneko.h pour leur demander de prendre en compte le petit nouveau.
Avant ça, il m'a été nécessaire d'appliquer les patches proposés dans le dossier debian inclus avec le code source (virer les références à BSD pour une histoire de licence et autres corrections liées à des erreurs typographiques et de compilation). Il m'a fallu faire quelques recherches et je pense ne pas m'être trompé en faisant :
patch -Np1 -i correctif.patch
Les patchs étant dans le même dossier que leurs fichiers cible.
Me voilà donc avec un oneko.c et un oneko.h tout beaux tout patchés. Commence alors le fastidieux travail de modification du code pour y déclarer mes modifications; aucun secret, je me base une nouvelle fois sur les modèles préexistant pour neko, dog, sakura... Et je l'adapte à mon cochon (qui se nomme ici piglet). J'utilise mousepad pour ça, peut-être existe-t-il des outils plus accès "codage" mais ça me convient à mon niveau.
Je relis, tout semble OK. L'étape finale de la compilation approche. J'utilise gcc en m'appuyant sur le man et des tutos pour m'y retrouver, mais je suis en freestyle complet : rien ne fonctionne je ne fais rien comme il faut. Si ça vous intéresse et ça me ferait plaisir d'apprendre de mes erreurs, n'hésitez pas à me donner des pistes. (Eh, pourquoi que t'as pas invoqué les librairies avec -l ?)
zebulon@machine:~/.tmp/Projet oneko_cif/debian-oneko-master/oneko-master$ gcc -c oneko.c
zebulon@machine:~/.tmp/Projet oneko_cif/debian-oneko-master/oneko-master$ gcc -o oneko oneko.o
/usr/bin/ld : oneko.o : dans la fonction « InitBitmapAndGCs » :
oneko.c:(.text+0xc9) : référence indéfinie vers « XCreatePixmapFromBitmapData »
/usr/bin/ld : oneko.c:(.text+0x11d) : référence indéfinie vers « XCreateBitmapFromData »
/usr/bin/ld : oneko.c:(.text+0x14c) : référence indéfinie vers « XCreateGC »
/usr/bin/ld : oneko.o : dans la fonction « NekoGetDefault » :
oneko.c:(.text+0x195) : référence indéfinie vers « XGetDefault »
/usr/bin/ld : oneko.c:(.text+0x1c3) : référence indéfinie vers « XGetDefault »
/usr/bin/ld : oneko.o : dans la fonction « MakeMouseCursor » :
oneko.c:(.text+0x6ac) : référence indéfinie vers « XCreateBitmapFromData »
/usr/bin/ld : oneko.c:(.text+0x73a) : référence indéfinie vers « XCreateBitmapFromData »
/usr/bin/ld : oneko.c:(.text+0x7b7) : référence indéfinie vers « XCreatePixmapCursor »
/usr/bin/ld : oneko.c:(.text+0x7d8) : référence indéfinie vers « XFreePixmap »
/usr/bin/ld : oneko.c:(.text+0x7ee) : référence indéfinie vers « XFreePixmap »
/usr/bin/ld : oneko.o : dans la fonction « SetupColors » :
oneko.c:(.text+0x89d) : référence indéfinie vers « XAllocNamedColor »
/usr/bin/ld : oneko.c:(.text+0x8fc) : référence indéfinie vers « XAllocNamedColor »
/usr/bin/ld : oneko.o : dans la fonction « Select_Window » :
oneko.c:(.text+0x9a2) : référence indéfinie vers « XGrabPointer »
/usr/bin/ld : oneko.c:(.text+0x9fb) : référence indéfinie vers « XAllowEvents »
/usr/bin/ld : oneko.c:(.text+0xa1d) : référence indéfinie vers « XWindowEvent »
/usr/bin/ld : oneko.c:(.text+0xa8a) : référence indéfinie vers « XUngrabPointer »
/usr/bin/ld : oneko.o : dans la fonction « Window_With_Name » :
oneko.c:(.text+0xac3) : référence indéfinie vers « XFetchName »
/usr/bin/ld : oneko.c:(.text+0xb0d) : référence indéfinie vers « XQueryTree »
/usr/bin/ld : oneko.c:(.text+0xb7e) : référence indéfinie vers « XFree »
/usr/bin/ld : oneko.o : dans la fonction « InitScreen » :
oneko.c:(.text+0xba5) : référence indéfinie vers « XOpenDisplay »
/usr/bin/ld : oneko.c:(.text+0xc8b) : référence indéfinie vers « XSynchronize »
/usr/bin/ld : oneko.c:(.text+0xd3c) : référence indéfinie vers « XGetGeometry »
/usr/bin/ld : oneko.c:(.text+0xe9a) : référence indéfinie vers « XQueryTree »
/usr/bin/ld : oneko.c:(.text+0xead) : référence indéfinie vers « XFree »
/usr/bin/ld : oneko.c:(.text+0xf49) : référence indéfinie vers « XChangeWindowAttributes »
/usr/bin/ld : oneko.c:(.text+0xf94) : référence indéfinie vers « XCreateWindow »
/usr/bin/ld : oneko.c:(.text+0xfd9) : référence indéfinie vers « XStoreName »
/usr/bin/ld : oneko.c:(.text+0x1001) : référence indéfinie vers « XSelectInput »
/usr/bin/ld : oneko.c:(.text+0x1010) : référence indéfinie vers « XFlush »
/usr/bin/ld : oneko.o : dans la fonction « RestoreCursor » :
oneko.c:(.text+0x104b) : référence indéfinie vers « XCreateFontCursor »
/usr/bin/ld : oneko.c:(.text+0x108a) : référence indéfinie vers « XChangeWindowAttributes »
/usr/bin/ld : oneko.c:(.text+0x10b4) : référence indéfinie vers « XFreePixmap »
/usr/bin/ld : oneko.c:(.text+0x10d1) : référence indéfinie vers « XFreePixmap »
/usr/bin/ld : oneko.c:(.text+0x10ed) : référence indéfinie vers « XFreeGC »
/usr/bin/ld : oneko.c:(.text+0x1117) : référence indéfinie vers « XFreeCursor »
/usr/bin/ld : oneko.c:(.text+0x1126) : référence indéfinie vers « XCloseDisplay »
/usr/bin/ld : oneko.o : dans la fonction « DrawNeko » :
oneko.c:(.text+0x1244) : référence indéfinie vers « XConfigureWindow »
/usr/bin/ld : oneko.c:(.text+0x1267) : référence indéfinie vers « XMapWindow »
/usr/bin/ld : oneko.c:(.text+0x12a1) : référence indéfinie vers « XFillRectangle »
/usr/bin/ld : oneko.c:(.text+0x12b4) : référence indéfinie vers « XFlush »
/usr/bin/ld : oneko.o : dans la fonction « RedrawNeko » :
oneko.c:(.text+0x130c) : référence indéfinie vers « XFillRectangle »
/usr/bin/ld : oneko.c:(.text+0x131f) : référence indéfinie vers « XFlush »
/usr/bin/ld : oneko.o : dans la fonction « NekoDirection » :
oneko.c:(.text+0x139b) : référence indéfinie vers « sqrt »
/usr/bin/ld : oneko.o : dans la fonction « CalcDxDy » :
oneko.c:(.text+0x171c) : référence indéfinie vers « XQueryPointer »
/usr/bin/ld : oneko.c:(.text+0x1793) : référence indéfinie vers « XGetInputFocus »
/usr/bin/ld : oneko.c:(.text+0x17eb) : référence indéfinie vers « XQueryTree »
/usr/bin/ld : oneko.c:(.text+0x17fb) : référence indéfinie vers « XFree »
/usr/bin/ld : oneko.c:(.text+0x1878) : référence indéfinie vers « XGetWindowAttributes »
/usr/bin/ld : oneko.c:(.text+0x1b35) : référence indéfinie vers « sqrt »
/usr/bin/ld : oneko.o : dans la fonction « ProcessKeyPress » :
oneko.c:(.text+0x2027) : référence indéfinie vers « XLookupString »
/usr/bin/ld : oneko.o : dans la fonction « ProcessEvent » :
oneko.c:(.text+0x2097) : référence indéfinie vers « XNextEvent »
/usr/bin/ld : oneko.c:(.text+0x210c) : référence indéfinie vers « XRaiseWindow »
/usr/bin/ld : oneko.c:(.text+0x2126) : référence indéfinie vers « XPending »
/usr/bin/ld : oneko.o : dans la fonction « NekoErrorHandler » :
oneko.c:(.text+0x2243) : référence indéfinie vers « XGetErrorText »
/usr/bin/ld : oneko.o : dans la fonction « GetArguments » :
oneko.c:(.text+0x29c1) : référence indéfinie vers « XParseGeometry »
/usr/bin/ld : oneko.o : dans la fonction « main » :
oneko.c:(.text+0x2bf6) : référence indéfinie vers « XSetErrorHandler »
collect2: error: ld returned 1 exit status
Je finis, désabusé, par taper la commande trouvée sur ce Github
gcc -Wno-parentheses -std=c11 -pedantic -D_DEFAULT_SOURCE oneko.c -o oneko -lc -lm -lX11 -lXext
Ok, la compilation s'effectue non sans sa petite guirlande de "warnings" et je me trouve à présent avec un oneko exécutable.
Tout content je le lance et là, désillusion : le petit personnage qui se déplace maintenant à l'écran se retrouve devant un petit cadre blanc. Fichtre et c'est pas la ribambelle de messages dispensés par gcc qui m'aident à y voir plus clair. Il y en a beaucoup, vraiment et à moins que vous ne demandiez je ne vais pas les mettre ici.
J'ai eu sensiblement les même problème avec le code source original
Booon... Ok... Je repars de zéro cette fois-ci en essayant avec la version proposée sur le Github sus-cité. Bonus il est livré avec un petit fichier cmake. Je reprends tout mes bitmaps, mes .include, je réécris les fichiers oneko.c et .h... Cette fois-ci pas de patch à appliquer.
Moment de grâce, je lance le cmake et malgré quelques "warnings" la construction se déroule sans encombre et me voilà avec un nouvel exécutable oneko.
me propose bien le nouveau personnage piglet que j'invoque avec
./oneko -piglet -bg pink -fg black
pour de bonnes couleurs de cochon bien rose (mais on peut préférer le cochons verts ou orange hein c'est selon )
Honnêtement, je suis super content du résultat une fois que le petit cochon prend vie et j'ai pris beaucoup de plaisir à bidouiller tout ça. Je regrette néanmoins d'avoir eu des déconvenues avec gcc et ça me rappelle qu'on à beau y mettre le nez, se creuser la cervelle... Quand on sait pas faire, y'a des trucs c'est plus abscons à faire comme on le voudrait
Utiliser les sources Debian (ça marche bien quand je l'installe avec apt alors y'a pas de raison), les éditer et construire un paquet tout propre avec ma version du cochon serait vraiment bien.
Voilà c'était le petit bricolage du jour, toute suggestion d'amélioration et de critique est la bienvenue
Dernière modification par Zébulon (11-08-2024 00:01:56)
Nombreux savent mais peu comprennent.