2011-07-19 5 views
2

J'ai essayé ce qui suit dans un appel à XCreateWindow():Set X11 curseur flèche

unsigned long ctt_attribute_mask = CWWinGravity | CWCursor; 

ctt_attributes->win_gravity = NorthEastGravity; 
ctt_attributes->cursor = XC_arrow; 

ctt_window = XCreateWindow(dpy, parent, ctt_xpos, ctt_ypos, 
      ctt_xy_size, ctt_xy_size, ctt_border, 
      ctt_depth, ctt_class, ctt_visual, 
      ctt_attribute_mask, ctt_attributes); 

Cela crée la fenêtre, mais il ne touche pas le pointeur quand il roule sur la fenêtre.

Je souhaite utiliser le curseur de pointeur standard de l'environnement de bureau de l'utilisateur lorsque la souris apparaît sur ma fenêtre.

Xlib est requis, car il s'agit d'un programme indépendant de la boîte à outils.

ETA: un contexte supplémentaire est disponible; voir create_ctt_window à partir de la ligne 35 dans le source file.

Répondre

4
  1. ctt_attributes->cursor = XCreateFontCursor(dpy, XC_arrow);
  2. Ce n'est pas le pointeur standard de l'environnement de bureau curseur, c'est le X11 curseur plutôt laid pixélisée. Si vous voulez des curseurs à thème, utilisez libXcursor. Je n'ai aucune expérience avec ça.
+0

Intéressant, merci pour le pointeur sur libXcursor. Maintenant, je dois juste comprendre comment l'utiliser. Les API répertoriées dans la page de manuel pour cela, eh bien, elles ne semblent pas fonctionner; 'char * XcursorGetTheme (Display * dpy)' renvoie NULL même pour les noms de thème présents dans le répertoire des thèmes du curseur, et 'Cursor XcursorLibraryLoadCursor (Affichage * dpy, const char * name)' ne semble pas réellement faire quoi que ce soit. Bien sûr, je fais probablement quelque chose de mal. On dirait que je suis damné quand il s'agit de programmation X11 de bas niveau. :) –

+1

Aha. Il s'avère que libXcursor ne peut pas découvrir quel est le thème de la souris en cours d'utilisation. Je devrai recourir à la découverte de la WM sous-jacente et/ou DE d'une manière dépendante de WM/DE. Tellement pour la portabilité ... –

1

Voici l'exemple du manuel de programmation Xlib, vol 1, p 182.

#include <X11/cursorfont.h> 
int cursor_shape = XC_arrow; 
Window window; 
Cursor cursor; 
cursor = XCreateFontCursor(display, cursor_shape); 
XDefineCursor(display, window, cursor); 
/* Now cursor will appear when pointer is in window */ 

il ressemble N.m est spot-on. Vous devez appeler XCreateFontCursor pour traduire XC_arrow (qui est simplement un entier désignant l'emplacement du curseur dans le vecteur de codage de la police) dans une ressource Cursor. Je pense que la ressource Cursor est juste un entier, aussi. C'est pourquoi vous n'obtenez pas d'erreur de compilation. Mais vous avez en effet une discordance de type.