Bonjour à tous,

Je souhaiterais réaliser une application qui se réduit dans la barre des taches. Pour cela je compte utiliser les fonctions GTKStatusIcon de GTK+.
En copiant collant de bouts de codes trouvés sur le site, j'arrive à afficher une icone dans la barre des taches mais je ne parviens pas à afficher le menu contextuel lors du clique droit.

Merci de votre aide,

Ben.

PS: Je cherche exemple de code d'un GtKStatusIcon avec menu contextuel


PS: pour le test du code, l'image est disponible ici GTK.PNG
ou en mettre une autre en redéfinissant le define IMAGE...

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <gtk/gtk.h>
 
#define IMAGE "gtk.png" //Image à afficher dans la barre des taches
#define ACCEL_PATH_NEW "<EditeurGTK>/Fichier/Nouveau"
 
static void cb_status_icon_activate (GtkStatusIcon * p_status_icon, gpointer p_data)
{
  GtkWidget *p_window = p_data;
 
  g_return_if_fail (p_window != NULL);
  g_return_if_fail (GTK_IS_WIDGET (p_window));
 
  if (GTK_WIDGET_VISIBLE (p_window))
  {
    gtk_widget_hide (p_window);
  }
  else
  {
    gtk_widget_show (p_window);
  }
}
 
 
void cb_new (GtkWidget *p_widget, gpointer user_data)
{
  printf("blablabla\n");
}
 
static void menu_item_new (GtkMenu *p_menu, const gchar *title, const gchar *accel_path, GCallback callback, gpointer user_data)
{
  GtkWidget *p_menu_item = NULL;
 
  p_menu_item = gtk_menu_item_new_with_mnemonic (title);
  gtk_menu_shell_append (GTK_MENU_SHELL (p_menu), p_menu_item);
  g_signal_connect (G_OBJECT (p_menu_item), "activate", callback, user_data);
  gtk_menu_item_set_accel_path (GTK_MENU_ITEM (p_menu_item), accel_path);
}
 
void popup_menu_function(GtkStatusIcon *status_icon, guint button, guint          activate_time,  gpointer       user_data)
{
   GtkWidget *p_menu = NULL;
    GtkWidget *p_menu_item = NULL;
 
    p_menu = gtk_menu_new ();
    //gtk_menu_set_accel_group (GTK_MENU (p_menu), accel_group_new (user_data));//
    p_menu_item = gtk_menu_item_new_with_mnemonic ("_Fichier");
    menu_item_new (GTK_MENU (p_menu), "_Nouveau", ACCEL_PATH_NEW, G_CALLBACK (cb_new), user_data);
    menu_item_new (GTK_MENU (p_menu), "_Ouvrir", ACCEL_PATH_NEW, G_CALLBACK (cb_new), user_data);
    gtk_menu_item_set_submenu (GTK_MENU_ITEM (p_menu_item), p_menu);
 
    gtk_menu_popup(p_menu,NULL,NULL,NULL ,user_data, button, activate_time);
}
 
int main (int argc, char ** argv)
{
  GtkWidget *p_window = NULL;
  GtkStatusIcon *p_status_icon = NULL;
 
  gtk_init (&argc, &argv);
  p_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (p_window), "GTK+ in SysTray!");
  g_signal_connect (G_OBJECT (p_window), "destroy", G_CALLBACK (gtk_main_quit),
                    NULL);
  /* Creation de l'icone et d'une info-bulle. */
  p_status_icon = gtk_status_icon_new_from_file (IMAGE);
  gtk_status_icon_set_tooltip (GTK_STATUS_ICON (p_status_icon),
                               "GTK+ in SysTray!");
 
  /* On attache un callback sur le widget GtkStatusIcon. */
  g_signal_connect (G_OBJECT (p_status_icon), "activate",
                    G_CALLBACK (cb_status_icon_activate), p_window);
  g_signal_connect (G_OBJECT (p_status_icon), "popup-menu",G_CALLBACK (popup_menu_function), p_window);
  gtk_widget_show_all (p_window);
  gtk_main ();
  return 0;
}