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 :

GTK / GDK et X11


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 108
    Par défaut GTK / GDK et X11
    Bonjour,

    Afin de réutiliser des applications de tracé/gestion des courbes basées sur des fonctions de base X11, je crée des fenêtres GTK et les transformer en des éléments de X11, puis activer les fonctions de X11 pour éviter une réécriture complète en GDK. Les trois éléments X11 nécessaires pour ces applications sont Window, Display et GC. Le mappage entre des GTK et X11 se fait le lon le code suivant :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
    #include <gdk/gdkx.h>
    #include <gtk/gtk.h>
    #include <glade/glade.h>
     
    int main (int argc,
              char *argv[])
    {
      GtkWidget *window, *courbes_1;
      GladeXML *xml;
      static Window gxDrawable, gxRootWindow;
      static Display *gxDisplay;
      static GC gxGC, gxRootGC;
      static XWindowAttributes gxRootAttr;
     
      gtk_init (&argc, &argv);
     
      xml = glade_xml_new ("browser.glade", NULL, NULL);
      window = glade_xml_get_widget (xml, "window");
      courbes_1 = glade_xml_get_widget (xml, "courbes_1");
     
    /* Début mappage GTK - X11 */
     
      gxGC = GDK_GC_XGC(courbes_1->style->fg_gc[GTK_WIDGET_STATE(courbes_1)]);
      gxDrawable = GDK_WINDOW_XWINDOW(courbes_1->window),
      gxDisplay = GDK_GC_XDISPLAY(courbes_1->style->fg_gc[GTK_WIDGET_STATE(courbes_1)]);
      gxRootWindow = GDK_ROOT_WINDOW();
      XGetWindowAttributes(gxDisplay, gxRootWindow, &gxRootAttr);
      gxRootGC = XCreateGC(gxDisplay, gxDrawable, 0, NULL);
     
    /* Fin mappage GTK - X11 */
     
      glade_xml_signal_autoconnect (xml);
     
      gtk_widget_show_all (window);
      gtk_main ();
     
      return 0;
    }
    Or ce code sort des erreurs suivantes en exécution :

    (appli:9011): Gdk-CRITICAL **: gdk_x11_gc_get_xgc: assertion `GDK_IS_GC_X11 (gc)' failed

    (appli:9011): Gdk-WARNING **: gdkdrawable-x11.c:878 drawable is not a pixmap or window

    (appli:9011): Gdk-CRITICAL **: gdk_x11_gc_get_xdisplay: assertion `GDK_IS_GC_X11 (gc)' failed
    Erreur de segmentation
    J'aimerais savoir si quelqu'un parmi vous a des exemples traitant ce type de problème.

    Merci à l'avance et cordialement.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Il est possible que gtk ne cree pas de fenetre X11 pour un widget tant qu'il n'est pas affiche a l'ecran. Ca pourrait expliquer pourquoi ton code ne fonctionne pas vu que gtk n'affichera rien avant que gtk_main ne soit affiche. Je commencerais par verifier ca, c'est pas dit du tout que ca soit la vraie raison :p

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Pour continuer sur la lancée de Teuf13 il est possible d'initialiser un widget avant le lancement de la boucle gtk, donc avant son affichage. Il faut pour cela utiliser la fonction gtk_widget_realize();

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    mes predecesseurs ont raison...

    Toutes les fonctions de creation de Widget, comme celle de creation de fenetres (XCreateWindow etc..) fonctionnent avec des structures d'objet en memoire...

    Ce n'est qu'a l'affichage (Map) que les fenetres reelles sont creees.

    En particulier, ce n'est qu'a partir de ce moment-la que largeur et huateur ont une valeur.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 108
    Par défaut Problème résolu
    Bonjour,

    Vous êtes formidables. Effectivement mon code fonctionne quand je place le mappage GTK/GDK et X11 après l'initialisation par gtk_widget_realize() ou gtk_widget_show_all().
    Un grand merci à vous tous et cordialement.

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

Discussions similaires

  1. Modifier position texte pango gtk gdk
    Par dongonis38 dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 29/04/2010, 17h29
  2. Interagir avec la 'root window' ( gtk.gdk.Window )
    Par Skami 18 dans le forum GTK+ avec Python
    Réponses: 1
    Dernier message: 10/01/2010, 12h41
  3. [Gtk/Gdk] Image de fond qui cache les widgets
    Par Aspic dans le forum GTK+ avec C & C++
    Réponses: 14
    Dernier message: 10/11/2009, 17h16
  4. Gtk Gdk "Espace insuffisant pour traiter cette commande"
    Par gy0m76 dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 19/05/2009, 12h24
  5. [gtk/gdk] Codes des touches clavier
    Par drKzs dans le forum GTK+ avec C & C++
    Réponses: 11
    Dernier message: 27/02/2008, 12h21

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