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 :

empecher le drag ou position de la fenetre principale ?


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut empecher le drag ou position de la fenetre principale ?
    bonjour,

    J'ai pas réussi à trouver ni sur le net ni sur la doc gtk3.
    Je place la fenetre principale dans le coin haut gauche de l'écran et ensuite je ne veux pas qu'on puisse la changer de place car j'utilise d'autre widget de type window top level que je place en position absolu par dessus la fenetre principale et donc si on la change de place, le widget sera mal placé.

    Merci de votre aide

    Edit : j'ai aussi essayé de récupérer la position de la fenêtre principale mais sans succès car le code suivant plante à l'exécution
    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
    #include <gtk/gtk.h>
     
    int main( int argc, char **argv )
    {
        GtkWidget *window;
     
        gtk_init( &argc, &argv );
     
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_default_size (GTK_WINDOW (window), 1200, 760);
        int *gx, *gy;
        gdk_window_get_root_origin(window, gx, gy);
        g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
        gtk_widget_show_all( window );
        gtk_main();
     
        return( 0 );
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int *gx, *gy;
    gdk_window_get_root_origin(GTK_WINDOW(window), gx, gy);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gint gx, gy;
    gdk_window_get_root_origin(window, &gx, &gy);

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Par défaut
    Bonjour,

    Pour récupérer les coordonnées de la fenêtre, c'est plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    int gx = 0, gy = 0;
    ...
    gtk_window_get_position(GTK_WINDOW (window), &gx, &gy);
    g_message(">>>> %d  %d", gx, gy);
    ...
    Pour garder la main fenêtre au même endroit (chose que je n'avais encore jamais tenté), je commencerais par quelque chose de ce genre (à affiner !) :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #include <gtk/gtk.h>
     
    int gx = 0, gy = 0;
     
    void window_moved(GtkWidget *window, GdkEvent *event, gpointer data)
    {
       int x, y;
       x = event->configure.x;
       y = event->configure.y;
       g_message(">>>> %d  %d", x, y); /* pour info */
       gtk_window_move (GTK_WINDOW (window), gx, gy);
    }
     
    int main (int argc, char **argv)
    {
        GtkWidget *window;
     
        gtk_init (&argc, &argv);
     
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_default_size (GTK_WINDOW (window), 1200, 760);
        gtk_window_move (GTK_WINDOW (window), gx, gy);
        g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
        gtk_widget_add_events (window, GDK_CONFIGURE);
        g_signal_connect(G_OBJECT(window), "configure-event", G_CALLBACK (window_moved), NULL);   /* permet de capturer le signal moved */
        gtk_widget_show_all (window);
        gtk_main();
     
        return 0;
    }
    À affiner et à rendre propre (globales à bannir, passer à la callback une structure pour les coordonnées, etc).

    Ne serait-ce pas mieux de déplacer les widgets si la fenêtre est déplacée ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut
    Merci pour ta réponse.
    Le programme plante quand même mais moins :
    gdk critical **: gdk_window_get_position: assertion 'GDK_IS_WINDOW (window)' failed

    J'ai essayé en enlevant le cast GTK_WINDOW(window), ça change rien.

    Ne serait-ce pas mieux de déplacer les widgets si la fenêtre est déplacée ?
    Tu as raison. C'est pour ça que je cherchais à récupérer les coord de la fenêtre principale.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_window_get_position (GTK_WINDOW (window), &gx, &gy);
    plutôt que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gdk_window_get_position (GTK_WINDOW (window), &gx, &gy);

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut
    J'ai mis mes lunettes, ça va mieux, j'ai corrigé

    Merci.

    Est-ce que tu sais à quoi sert alors gdk_window_get_root_origin ?

    Je me demandais aussi ceci : quand je superpose une autre fenetre TOP_LEVEL sur la fenetre principale, puis-je définir cette 2è fenêtre comme child de la principale ? (pour utiliser widget->allocate.x)

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Par défaut
    Citation Envoyé par rollbich Voir le message
    Est-ce que tu sais à quoi sert alors gdk_window_get_root_origin ?
    La plupart des widgets ont des GdkWindow « caché » ce qui te permet différentes manipulations et traitements dessus.

    Citation Envoyé par rollbich Voir le message
    Je me demandais aussi ceci : quand je superpose une autre fenetre TOP_LEVEL sur la fenetre principale, puis-je définir cette 2è fenêtre comme child de la principale ? (pour utiliser widget->allocate.x)
    Avec gtk_window_set_transient_for ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut
    ok, j'avais déjà vu mais je crois que j'avais mal interprété la doc :

    On Windows, this function puts the child window on top of the parent, much as the window manager would have done on X.

    Je croyais qu'il fallait d'abord définir une fenêtre en tant que child (d'où ma question) pour pouvoir utiliser la fonction set_transient_for.

    Merci pour ces précisions.

    Une dernière question. En fait cette 2è fenêtre est une pop-up pas très haute qui doit s'afficher lorsque je clique sur un widget. A l'intérieur, je compte mettre un label et une liste de 20 nombres avec un ascenseur (ou un vscale). voir l'image ci-dessous (à peu près)
    http://www.auretourdumarche.fr/image.png

    Penses-tu que c'est la bonne méthode d'utiliser une window top_level pour faire cela ?

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Par défaut
    Oui, c'est faisable, en enlevant les décorations (gtk_window_set_decorated à FALSE) par exemple

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut
    merci beaucoup

    bonne soirée,

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

Discussions similaires

  1. position de curseur fenetre swing
    Par yayamo dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 09/02/2007, 17h22
  2. Sauvegarde de la position d'une fenetre
    Par mouck dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 25/07/2006, 10h21
  3. [C#][Débutant] Comment empecher d ouvrir plusieurs fois la meme fenetre
    Par Cazaux-Moutou-Philippe dans le forum Windows Forms
    Réponses: 21
    Dernier message: 27/04/2006, 13h41
  4. [vb.net][Toolstrip] [vs2005] Empecher le drag n drop
    Par graphicsxp dans le forum Windows Forms
    Réponses: 9
    Dernier message: 16/12/2005, 11h36
  5. [MFC] Position d'une fenetre
    Par ni0urk dans le forum MFC
    Réponses: 3
    Dernier message: 24/11/2005, 17h27

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