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+-2.24 et gtk_widget_modify_bg(): comment lutter contre le changement du climat informatique.


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut GTK+-2.24 et gtk_widget_modify_bg(): comment lutter contre le changement du climat informatique.
    J'indique ceci pour faire gagner du temps à ceux que cela peut intéresser.

    Le but est de choisir des couleurs codées en dur en utilisant une palette, toujours la même depuis la plus haute antiquité et indépendantes du thème utilisé sur une machine donnée.
    Il serai en effet gênant de comparer deux courbes censés être de même couleur sans l'être vraiment.
    Avec ma vieille Debian-6, en utilisant gtk_widget_modify_bg(), j'affichais la palette:
    Nom : panneau_colore.jpg
Affichages : 1013
Taille : 35,3 Ko
    mais avec des versions plus récentes, comme Mint-18, j'obtenais ceci:
    Nom : panneau_gris.jpg
Affichages : 797
Taille : 50,0 Ko

    Après avoir erré dans la doc de GTK sans succès, j'ai finalement trouvé la solution à mon problème ici:
    http://wxwidgets.10942.n7.nabble.com...n-td90794.html
    Il faut désactiver l'influence du thème sur les boutons avec ceci:
    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
    gtk_rc_parse_string(
                          "style \"our_button\" {\n"
                          // This disables any engines that may be setting button
                          // background images:
                          "   engine \"\" {}\n"
                          // This should disable any other theme settings for button
                          // background images:
                          "   bg_pixmap[NORMAL] = \"<none>\"\n"
                          "   bg_pixmap[ACTIVE] = \"<none>\"\n"
                          "   bg_pixmap[PRELIGHT] = \"<none>\"\n"
                          "   bg_pixmap[SELECTED] = \"<none>\"\n"
                          "   bg_pixmap[INSENSITIVE] = \"<none>\"\n"
                          "}\n"
                          "class \"GtkButton\" style : highest \"our_button\"\n"
                          );
    Plus de détails sont donnés sur le lien cité.

    Je pense que ce serai une bonne idée de rajouter cet exemple dans la doc de GTK qui ne traite que de GtkLabel sachant que la méthode préconisée dans ce cas (rajouter une EventBox) ne convient pas pour un bouton: seulement un mince cadre autour du bouton est changé de couleur.

  2. #2
    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
    Une remarque sûrement stupide : ne pourrais-tu pas simplement connecter sur tes boutons un callback associé au signal «*draw*» pour changer le fond ?

  3. #3
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut
    C'est plutôt que j'ai dû mal définir le problème: pour gtk_widget_modify_bg() on a
    Note that “no window” widgets (which have the GTK_NO_WINDOW flag set) draw on their parent container’s window and thus may not draw any background themselves. This is the case for e.g. GtkLabel.To modify the background of such widgets, you have to set the background color on their parent; if you want to set the background of a rectangular area around a label, try placing the label in a GtkEventBox widget and setting the background color on that.
    Apparemment, les GtkButton sont dans ce cas. Quand on les place dans une EventBox, c'est celle-ci qui est coloriée, mais le bouton recouvre presque entièrement cette boite et la couleur visible reste fixée en principe par le thème utilisé, alors que le GtkLabel ne change que la couleur des caractères qu'il trace, laissant transparaître la EventBox derrière. C'est pourquoi on est obligé de désactiver le thème pour les boutons.
    Le problème n'est donc pas d'appeler ou non un Callback.
    Remarque: le procédé utilisé désactive le thème pour tous les boutons.
    Remarque: comme je suis toujours en GTK+-2, c'est le signal "expose-event" (remplacé par "draw" dans GTK-3) qui pourrait être concerné.

    En fait, j'ai tout un tas de récriminations en stock concernant les changements forcés induits par l'évolution du paysage informatique. Par exemple pour ce qui est des thèmes, sur ma Debian-6 j'avais installé le thème Glossy avec pour les bordures de fenêtres Glider: ceux-ci ont disparus depuis et comme je n'ai pas envie de passer des heures à essayer d'en trouver un aussi beau, je me contente d'un aspect moins élégant.
    Plus sérieusement, j'aime bien le débogueur DDD mais, faute de maintenance, celui-ci n'a pas été adapté au nouveau format ELF et n'est donc plus opérationnel. J'oscille donc entre Nemiver, convivial mais pour lequel je n'ai pas trouvé comment envoyer directement une commande à GDB, et GUD, l'interface Emacs de GDB bien moins conviviale que DDD mais plus puissante que Nemiver.
    En définitive, je reviens souvent sous Debian-6 pour retrouver avec délice mes habitudes de dinosaure.

  4. #4
    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
    Je me suis mis à chercher une petite solution pérenne à ton problème. Effectivement on n'accède pas à l'espace graphique d'un GtkButton. J'ai contourné le problème en insérant dans les GtkButton des GtkLabel. Pour eux il est possible de "bricoler" un peu leur affichage.

    Malheureusement je n'ai pas pu compiler pour Gtk+v2.0. Mais je pense que ca doit fonctionner aussi sous cette version. Voila le résultat obtenu :
    Nom : Capture d’écran_2018-01-27_12-05-35.png
Affichages : 818
Taille : 64,9 Ko

    Si ca t'intéresse je te livre le code version Gtk+3.0.

    [Edit]
    Au final ce n'est pas fonctionnel sous Gtk+2.0. Il faut bien utiliser un GtkEventBox pour contourner le problème...
    [/Edit]

  5. #5
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut
    Il faut bien utiliser un GtkEventBox pour contourner le problème...
    En fait, sous GTK-2, il n'y a même pas besoin d'une EventBox: l'appel à gtk_rc_parse_string() qui désactive le thème suffit pour rétablir l'action de gtk_widget_modify_bg() sur tous les boutons...

    Merci pour ton offre pour le code GTK-3. Je n'en suis pas encore là: j'essaye d'adapter mon code pour me passer des fonctions de GDK-2 dépréciées dans 2.24, ce qui pose encore quelques problèmes, mais ton code peut toujours m'intéresser.

  6. #6
    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
    Oups j’ai effacé le code source .

    Bon, ce n’est pas grave. Je vais l’ecrire à nouveau. Ça pourra toujours intéresser...

    Pour rebondir sur ton dernier post ce n’est pas un peu energivore de vouloir modifier ton code pour être à jour sur la v2.24 pour ensuite se dire de passer à la v3.0 ?

    Le passage à la v3.0 ne doit pas être bien compliqué je pense.

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

Discussions similaires

  1. Comment mieux lutter contre le travail dissimulé
    Par Invité dans le forum Développement
    Réponses: 0
    Dernier message: 29/01/2016, 21h03
  2. Comment lutter efficacement contre les virus ?
    Par Hinault Romaric dans le forum Actualités
    Réponses: 34
    Dernier message: 20/01/2014, 21h57
  3. Réponses: 161
    Dernier message: 30/04/2009, 08h27
  4. Comment lutter contre le plagiat ?
    Par boux2 dans le forum Juridique
    Réponses: 6
    Dernier message: 03/07/2007, 08h07
  5. [Myphpnews] Comment lutter contre le spam dans les commentaires ?
    Par fireworks dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 30
    Dernier message: 25/10/2006, 14h07

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