Skip to content

Instantly share code, notes, and snippets.

@KokaKiwi
Last active June 18, 2024 19:24
Show Gist options
  • Save KokaKiwi/4052375 to your computer and use it in GitHub Desktop.
Save KokaKiwi/4052375 to your computer and use it in GitHub Desktop.
[HOWTO] Gérer d'autres évènements avec la MinilibX

Hello, voici un petit guide pour ceux qui aimeraient savoir comment gérer des évènements autres que "KeyRelease", "ButtonPress" (souris), "Expose" et "Loop".

En effet, la minilibx ne dispose que des fonctions permettant de gérer ces évènements. Or ils ne sont pas suffisants pour faire des programmes évolués (cool un Wolf3D qui nécessite que j'appuie plusieurs fois sur la touche HAUT pour avancer!)

En fait, il faut pour cela regarder dans le code de la MinilibX et voir comment sont gérés les évènements envoyés par le serveur X.

Si vous voulez en savoir plus, regardez le fichier "mlx_int_param_events.c" ;)

Mais revenons au sujet principal: Comment gérer d'autres évènements?

La Minilibx dispose en fait d'une fonction nommée "mlx_hook" permettant d'ajouter une fonction de gestion d'évènement à son code (un int) associé, dont le prototype est le suivant:

int mlx_hook(void *win_ptr, int x_event, int x_mask, int (*funct)(), void *param);

Les paramètres sont les suivants:

  • win_ptr: Ca normalement vous savez ce que c'est si vous avez un peu utilisé la MinilibX :)
  • x_event: Le code de l'évènement que l'on veut gérer, vous pouvez utiliser les constantes définies par Xlib.
  • x_mask: Le "masque" de l'évènement que l'on veut gérer, je vous laisse lire le manuel de X pour en savoir plus. Vous pouvez utiliser les constantes définies par Xlib.
  • funct: Un pointeur vers la fonction qui va gérer l'évènement. On verra plus bas pour les prototypes des différentes fonctions gérées par la MinilibX.
  • param: Un paramètre divers que vous pouvez passer à la fonction qui gère l'évènement.

Pour les prototypes des fonctions qui gèrent les différents évènements, la MinilibX en supporte certaines pour quelques types d'évènements précis:

  • Evènement de type KeyPress:

    int funct(int keycode, void *param);
  • Evènement de type KeyRelease:

    int funct(int keycode, void *param);
  • Evènement de type ButtonPress (souris):

    int funct(int button, int x, int y, void *param);
  • Evènement de type MotionNotify (mouvement de la souris):

    int funct(int x, int y, void *param);
  • Tous les autres évènements:

    int funct(void *param);

Après, si vous voulez gérer plus précisément les autres types d'évènements (pour, par exemple, avoir accès aux détails dudit évènement), je vous laisse fouiller un peu dans la doc de Xlib et dans le fichier de la MinilibX que j'ai cité plus haut. ;)

@ghazette
Copy link

Merci, tres utile

@alkanna
Copy link

alkanna commented Mar 9, 2019

Super, merci beaucoup !

@lambertspiess
Copy link

Merci !

@constantoine
Copy link

Très chouette pour comprendre les hooks, merci beaucoup !

Je tiendrai à rajouter que sur certaines distros linux mlx_hook(mlx_window, DestroyNotify, StructureNotifyMask, exit_hook, (void *)0);, censé fermer proprement la fenêtre si on "clique sur la croix" ne fonctionnera pas. C'est parfaitement normal et devrait fonctionner comme prévu sur MacOS.

@mjidelouss
Copy link

thnks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment