Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/11/2023, à 09:35

Omega38

C et Gtk3 - icône de la fenêtre principale [Résolu]

Bonjour à toutes et à tous,

J'essaye de m'initier aux subtilités de Gtk3 avec c, et je tente de mettre une icône personnalisée sur la fenêtre de l'application. Mon code est le suivant :

#include <gtk/gtk.h>

GdkPixbuf *create_pixbuf(const gchar *fichier_image) {
    GdkPixbuf *pixbuf;
    GError *error = NULL;
    pixbuf = gdk_pixbuf_new_from_file(fichier_image, &error);
    if (!pixbuf) {
        fprintf(stderr, "%s\n", error->message);
        g_error_free(error);
    }
    return pixbuf;
}

int main(int argc, char *argv[]) {
    GtkWidget *window;
    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     GdkPixbuf *icon = create_pixbuf("ZetaIconBlanc32.png");
    if (icon != NULL) {
	printf("Icone ok");
        gtk_window_set_default_icon (icon);
        g_object_unref(icon); 
    }else{
	printf("Pas d'icone");
	}
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}

Si je compile avec la ligne

gcc -o main main.c $(pkg-config --cflags --libs gtk+-2.0)

l'icône s'affiche bien. Par contre si je compile en remplaçant gtk+-2.0 par gtk+-3.0, aucune erreur de compilation, mais l'icône ne s'affiche plus.
Quelqu'un aurait-il une idée sur cette difficulté?

Merci, et bonne journée.

Dernière modification par Omega38 (Le 01/12/2023, à 06:15)

Hors ligne

#2 Le 30/11/2023, à 12:27

kamaris

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

Bizarre, l'icône s'affiche bien pour moi.
Il n'y a rien qui s'affiche en console quand tu exécutes le programme, pas de warning GTK/GDK?

NB: il faut par contre que gtk_window_set_default_icon() soit placé avant gtk_widget_show(window), mais dans le code que tu montres c'est bien le cas.

Dernière modification par kamaris (Le 30/11/2023, à 12:42)

Hors ligne

#3 Le 30/11/2023, à 13:24

Omega38

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

Merci de t’intéresser à mon problème. Je n'avais (bêtement) pas essayé de compiler en console.
Le résultat est le suivant :

az@az-System-Product-Name:/mnt/7f8eb8d7-0d5f-42ec-88b2-1606648f3d37/CodeCGeany/widgets/test$ gcc -o main main.c $(pkg-config --cflags --libs gtk+-2.0)
In file included from /usr/include/gtk-2.0/gtk/gtkobject.h:37,
                 from /usr/include/gtk-2.0/gtk/gtkwidget.h:36,
                 from /usr/include/gtk-2.0/gtk/gtkcontainer.h:35,
                 from /usr/include/gtk-2.0/gtk/gtkbin.h:35,
                 from /usr/include/gtk-2.0/gtk/gtkwindow.h:36,
                 from /usr/include/gtk-2.0/gtk/gtkdialog.h:35,
                 from /usr/include/gtk-2.0/gtk/gtkaboutdialog.h:32,
                 from /usr/include/gtk-2.0/gtk/gtk.h:33,
                 from main.c:1:
/usr/include/gtk-2.0/gtk/gtktypeutils.h:236:1: warning: ‘GTypeDebugFlags’ is deprecated [-Wdeprecated-declarations]
  236 | void            gtk_type_init   (GTypeDebugFlags    debug_flags);
      | ^~~~
In file included from /usr/include/glib-2.0/gobject/gobject.h:24,
                 from /usr/include/glib-2.0/gobject/gbinding.h:29,
                 from /usr/include/glib-2.0/glib-object.h:22,
                 from /usr/include/glib-2.0/gio/gioenums.h:28,
                 from /usr/include/glib-2.0/gio/giotypes.h:28,
                 from /usr/include/glib-2.0/gio/gio.h:26,
                 from /usr/include/gtk-2.0/gdk/gdkapplaunchcontext.h:30,
                 from /usr/include/gtk-2.0/gdk/gdk.h:32,
                 from /usr/include/gtk-2.0/gtk/gtk.h:32,
                 from main.c:1:
/usr/include/glib-2.0/gobject/gtype.h:698:1: note: declared here
  698 | {
      | ^
In file included from /usr/include/gtk-2.0/gtk/gtktoolitem.h:31,
                 from /usr/include/gtk-2.0/gtk/gtktoolbutton.h:30,
                 from /usr/include/gtk-2.0/gtk/gtkmenutoolbutton.h:30,
                 from /usr/include/gtk-2.0/gtk/gtk.h:126,
                 from main.c:1:
/usr/include/gtk-2.0/gtk/gtktooltips.h:73:3: warning: ‘GTimeVal’ is deprecated: Use 'GDateTime' instead [-Wdeprecated-declarations]
   73 |   GTimeVal last_popdown;
      |   ^~~~~~~~
In file included from /usr/include/glib-2.0/glib/galloca.h:32,
                 from /usr/include/glib-2.0/glib.h:30,
                 from /usr/include/glib-2.0/gobject/gbinding.h:28,
                 from /usr/include/glib-2.0/glib-object.h:22,
                 from /usr/include/glib-2.0/gio/gioenums.h:28,
                 from /usr/include/glib-2.0/gio/giotypes.h:28,
                 from /usr/include/glib-2.0/gio/gio.h:26,
                 from /usr/include/gtk-2.0/gdk/gdkapplaunchcontext.h:30,
                 from /usr/include/gtk-2.0/gdk/gdk.h:32,
                 from /usr/include/gtk-2.0/gtk/gtk.h:32,
                 from main.c:1:
/usr/include/glib-2.0/glib/gtypes.h:553:8: note: declared here
  553 | struct _GTimeVal
      |        ^~~~~~~~~
az@az-System-Product-Name:/mnt/7f8eb8d7-0d5f-42ec-88b2-1606648f3d37/CodeCGeany/widgets/test$ gcc -o main main.c $(pkg-config --cflags --libs gtk+-3.0)
az@az-System-Product-Name:/mnt/7f8eb8d7-0d5f-42ec-88b2-1606648f3d37/CodeCGeany/widgets/test$ 

Au lancement, même résultat, icône visible avec compilation Gtk2, pas visible avec Gtk3. Les 2 fichiers comptent exactement le même nombre d'octets.
Si l'icône s'affiche chez toi, est-ce qu'il pourrait me manquer une dépendance?

Hors ligne

#4 Le 30/11/2023, à 13:35

kamaris

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

Et à l'exécution du programme en console (./main), quelque chose s'affiche ?
Si il te manquait une dépendance, on pourrait s'attendre à ce que ça plante à la compilation où que ça dise quelque chose à l'exécution, selon la nature de le dépendance.

Hors ligne

#5 Le 30/11/2023, à 14:57

Omega38

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

Aucun message (nota : j'ai renommé les exécutables avec des noms différents mainGtk2 et mainGtk3)

az@az-System-Product-Name:/mnt/7f8eb8d7-0d5f-42ec-88b2-1606648f3d37/CodeCGeany/widgets/test$ ./mainGtk2
Icone ok

az@az-System-Product-Name:/mnt/7f8eb8d7-0d5f-42ec-88b2-1606648f3d37/CodeCGeany/widgets/test$ ./mainGtk3
Icone ok

On voit seulement que dans les 2 cas, l'image a bien été trouvée.

Hors ligne

#6 Le 30/11/2023, à 15:15

hotnuma

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

Ça fonctionne chez moi mais j'ai mi un chemin absolu, c'est peut-être là le soucis :

GdkPixbuf *icon = create_pixbuf("/usr/share/icons/hicolor/16x16/apps/geany.png");

On peut aussi utiliser set_icon comme ça il me semble :

    GdkPixbuf *pix = create_pixbuf("/usr/share/icons/hicolor/16x16/apps/geany.png");
    if (pix)
    {
        gtk_window_set_icon(GTK_WINDOW(window), pix);
        g_object_unref(pix);
    }

Xubuntu / GitHub

Hors ligne

#7 Le 30/11/2023, à 17:10

Omega38

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

Merci de ton aide.
J'ai essayé de mettre un chemin absolu, puis j'ai ensuite essayé l'autre  usage de set_icon, même résultat dans les 2 cas : affichage de l'image si compilation en Gtk2, pas d'affichage en Gtk3.
Désespérant!

Hors ligne

#8 Le 30/11/2023, à 17:25

kamaris

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

Quel est ton gestionnaire de fenêtres ? Il a son mot à dire dans cette histoire.

Dernière modification par kamaris (Le 30/11/2023, à 17:25)

Hors ligne

#9 Le 30/11/2023, à 18:00

lann

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

Et si tu remplaces

gtk_window_set_default_icon (icon);

par

gtk_window_set_icon (window, icon);

Le

 g_object_unref(icon); 

me parait bizarre également


<Modéré>

Hors ligne

#10 Le 30/11/2023, à 18:03

kamaris

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

lann a écrit :

Le

 g_object_unref(icon); 

me parait bizarre également

Non c'est bien, ces fonctions prennent leur propre référence sur le pixbuf.

Hors ligne

#11 Le 30/11/2023, à 18:43

Omega38

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

Kamaris : je ne comprends pas ta question;

Iann : même chose c'est à dire affichage de l'icône si compilation avec Gtk2, pas d'affichage avec Gtk3, et avec un warning :

main.c:29:30: warning: passing argument 1 of ‘gtk_window_set_icon’ from incompatible pointer type [-Wincompatible-pointer-types]

Hors ligne

#12 Le 30/11/2023, à 18:51

kamaris

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

Omega38 a écrit :

Kamaris : je ne comprends pas ta question;

https://fr.wikipedia.org/wiki/Gestionna … %C3%AAtres
Par exemple le gestionnaire de fenêtres par défaut de Xfce est xfwm4.
Or c'est lui qui décide en dernière instance si l'icône doit être affichée ou non:

https://docs.gtk.org/gtk3/method.Window.set_icon.html a écrit :

This icon is used when the window is minimized (also known as iconified). Some window managers or desktop environments may also place it in the window frame, or display it in other contexts. On others, the icon is not used at all, so your mileage may vary.

Hors ligne

#13 Le 30/11/2023, à 19:10

Omega38

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

Kamaris : désolé, j'ai pas suffisamment réfléchi avant de répondre. Je suis en Ubuntu 22.04.3 avec Gnome. Ce qui me gêne, c'est le fait que sur le même poste de travail, en utilisant le même IDE (Geany), cela fonctionne si je compile en utilisant Gtk2, mais pas si j'utilise Gtk3.
Quand je dis "cela fonctionne" pour être plus précis, je n'ai jamais d'icône affichée sur la fenêtre à côté du titre de celle-ci, mais dans la barre latérale je vois soit mon icône (Gtk2), soit l'icône classique "roue dentée" (je ne connais pas son nom) si Gtk3.

Hors ligne

#14 Le 30/11/2023, à 19:21

kamaris

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

Je n'utilise pas Gnome habituellement mais Xfce, qui est certes basé aussi sur GTK mais est très différent, surtout depuis que Gnome est devenu un DE pour smartphone big_smile
Plaisanterie mise à part, il est tout à fait possible que le comportement de la barre latérale soit différent pour une fenêtre GTK 3 par rapport à GTK 2.
Je ne sais pas si tu peux forcer les choses à ce niveau, ton code ci-dessus est correct en tout cas.

Dernière modification par kamaris (Le 30/11/2023, à 19:21)

Hors ligne

#15 Le 30/11/2023, à 20:34

lann

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

Et si tu créé une GtkWindow plutôt qu'un GtkWidget

GtkWindow *window;
    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

Tu ne devrais plus avoir de warning à la compilation et ça marcherait peut être ?


<Modéré>

Hors ligne

#16 Le 30/11/2023, à 20:37

kamaris

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

C'est gtk_window_new() qui décide ce qu'il crée, pas le type de la variable dans laquelle tu stockes le pointeur wink
Tu peux aussi bien mettre GObject *window ou gpointer window, ça ne changera rien.

Dernière modification par kamaris (Le 30/11/2023, à 20:38)

Hors ligne

#17 Le 30/11/2023, à 21:05

hotnuma

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

Si ça intéresse du monde, j'ai traduit la plupart des exemples de zetcode https://zetcode.com/gui/gtk2/ en Gtk3 :

https://github.com/hotnuma/testgtk/tree/master/zetcode

tongue


Xubuntu / GitHub

Hors ligne

#18 Le 30/11/2023, à 21:22

kamaris

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

@Omega38: je pense que c'est le pixbuf qu'il n'aime pas.
Il semble que GNOME Shell veuille une icône nommée (dispo dans le thème d'icônes, et donc à ajouter au thème si nécessaire).
Cf. https://discourse.gnome.org/t/gtk-4-use … ine/9757/4
Tu peux essayer de mettre une icône dispo dans tous les thèmes pour tester, du genre

  gtk_window_set_default_icon_name ("document-print");

Hors ligne

#19 Le 01/12/2023, à 06:13

Omega38

Re : C et Gtk3 - icône de la fenêtre principale [Résolu]

J'ai testé mon programme compilé dans les 2 versions sur un autre poste que le mien, et j'ai constaté que l'icône s'affichait pour les 2 (ce qui correspond au constat de kamaris et hotnuma). J'ai comparé les librairies installées sur les ce poste et le mien,  ce sont les mêmes, dans la même version. J'ai également ré-installé libGtk-dev, sans résultat. J'en conclus donc la difficulté est liée à mon poste, sans doute pas matériel (Gtk2 fonctionne) mais logiciel.

Je remercie vivement tous ceux qui ont pris de leur temps pour m'aider.

Hors ligne