IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

Associer l'appel d'une callback à la position du curseur sur L'ECRAN


Sujet :

GTK+ avec C & C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Points : 117
    Points
    117
    Par défaut Associer l'appel d'une callback à la position du curseur sur L'ECRAN
    Bonjour,

    Voilà mon idée : j'aimerai avoir une sorte de barre d'outils rétractable pour mon programme, qui s'affiche lorsqu'on place la souris en haut de l'écran.
    En pseudo-code, ça donnerait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (x;y) = coordonnées du curseur
    Si x < 5 alors
         fait apparaitre la barre
         si x > 20 alors
              fait disparaitre la barre
         fin si
    fin si
    Le problème étant que les coordonnées du curseur ne semblent pas être toujours disponibles...
    J'ai tenté ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void affiche_options(GtkWidget *pWidget, GdkEvent *event, gpointer data)
    {
        if (event->type == GDK_MOTION_NOTIFY)
            printf("oui\n");
    }
    C'est la callback que j'ai associé à une GtkWindow qui possède des GtkEntry.
    Et bizarrement, le mot "oui" ne s'affiche que lorsque le curseur se déplace à l'intérieur des entrées de saisies, et nulle part ailleurs dans ou hors de la fenêtre.

    On est bien loin de ce que j'espèrais...
    Y a-t-il un moyen d'accéder aux coordonnées du curseur, quelle que soit sa position ?
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 296
    Points : 4 949
    Points
    4 949
    Billets dans le blog
    5
    Par défaut
    Ta démarche me semble correcte. Je suppose bien sûr que ce CALLBACK est associé au signal "event".

    Deux idées me viennent pour le moment:
    1. As-tu essayé de regarder directement la structure event->motion?
    2. GtkWindow ne gère pas automatiquement le signal GDK_MOTION_NOTIFY

    La deuxième possibilité me semble être la cause. Tu peux ajouter à ton GtkWindow le signal "GDK_MOTION_NOTIFY" avec la fonction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_widget_add_events(GTK_WIDGET(ma_fenetre),GDK_POINTER_MOTION_MASK);
    Tu peux ensuite affecter le signal "motion_notify_event" à ta fenêtre principale. Le prototype du CALLBACK est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gboolean  user_function(GtkWidget  *widget, GdkEventMotion *event,  gpointer  user_data);

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Points : 117
    Points
    117
    Par défaut
    En fait j'ai associé ma fenêtre au signal "motion_notify_event". Je me suis aperçu en lisant ton message que mon if était en effet inutile ^^

    Ajouter le masque à la fenêtre a fonctionné
    En fait, si "oui" ne s'affichait que dans les GtkEntry, c'est parce que c'était les seuls widget de ma fenêtre à avoir un GTK_MOTION_MASK à leur création
    Je ne peux toujours pas connaitre les coordonnées en dehors de la fenêtre, mais je ne crois pas vraiment que ça soit possible...

    Je vais essayer de mettre une petite bande de 5 pixels en haut de l'écran et y associer le motion mask, ça devrait suffire ^^

    Merci pour ton aide

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 296
    Points : 4 949
    Points
    4 949
    Billets dans le blog
    5
    Par défaut
    Il me semble que les variables x_root et y_root de la structure GdkEventMotion devraient répondre à ton dernier problème.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Points : 117
    Points
    117
    Par défaut
    C'est justement ce que j'ai utilisé pour déterminer les coordonnées du pointeur
    Mais ça n'aide pas à connaitre les coordonnées à l'extérieur de la fenêtre, puisque de toute façon la callback n'est appelée et la structure envoyée que lorsque le pointeur se déplace dans la fenêtre en question...

    En fait ce qu'il faudrait, c'est appliquer un GTK_MOTION_MASK à tout l'écran lol
    Et ça, ça m'étonnerait que ça soit possible...

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 296
    Points : 4 949
    Points
    4 949
    Billets dans le blog
    5
    Par défaut
    Impossible, pas sûr!

    Il existe une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    GdkWindow*          gdk_window_get_pointer              (GdkWindow *window,
                                                             gint *x,
                                                             gint *y,
                                                             GdkModifierType *mask);
     
    Obtains the current pointer position and modifier state. The position is given in coordinates relative to the upper left corner of window.
     
    window :
    	a GdkWindow
     
    x :
    	return location for X coordinate of pointer or NULL to not return the X coordinate
     
    y :
    	return location for Y coordinate of pointer or NULL to not return the Y coordinate
     
    mask :
    	return location for modifier mask or NULL to not return the modifier mask
     
    Returns :
    	the window containing the pointer (as with gdk_window_at_pointer()), or NULL if the window containing the pointer isn't known to GDK
    Maintenant il faudrait pouvoir lui transmettre tout l'écran. Pour ca il est possible d'utiliser cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GdkWindow*          gdk_screen_get_root_window          (GdkScreen *screen);
    C'est bien gentil tout ca, mais maintenant il me faut récupérer le GdkScreen.
    Allons, ne perdons pas espoir, la fonction suivante devrait combler toutes mes attentes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GdkScreen*          gdk_screen_get_default              (void);
    A essayer.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD-2003] Connaitre en VBA la position du curseur sur une ligne
    Par electrosat03 dans le forum VBA Word
    Réponses: 1
    Dernier message: 20/04/2010, 11h08
  2. Réponses: 6
    Dernier message: 24/03/2009, 16h17
  3. Réponses: 7
    Dernier message: 31/07/2008, 08h31
  4. Appel d'une callback depuis un autre module
    Par Bayard dans le forum Général Python
    Réponses: 6
    Dernier message: 08/06/2008, 17h47
  5. Appel d'une procédure stockée avec un curseur
    Par lapanne dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/12/2006, 16h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo