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 StatusIcon avec menu OU comment faire un menu en gtk


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 49
    Points : 51
    Points
    51
    Par défaut Cherche exemple de code d'un GtKStatusIcon avec menu contextuel
    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;
    }

  2. #2
    Membre expérimenté
    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
    Points : 1 633
    Points
    1 633
    Par défaut
    Tu pourrais détailler un peu plus ton pb. Pour t'aider, c'est intéressant de savoir si ce qui ne va pas c'est le callback pour le signal "popup-menu" qui n'est pas appelé, s'il est appelé mais que tu n'arrives pas à ensuite construire le menu pour qu'il soit affiché, ...

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 49
    Points : 51
    Points
    51
    Par défaut
    Salut,

    J'ai terminé par trouver la solution,
    Pour ceux que ça interresse voici un code d'exemple,
    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
    77
    78
    79
    80
    81
    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);
         GtkWidget *menu, *item;
     
    	menu = gtk_menu_new ();
     
    	// this opens the downloader window, or brings it to the foreground if already open
    	item = gtk_menu_item_new_with_mnemonic (("_Show Downloads"));
    	g_signal_connect_swapped (item, "activate",G_CALLBACK (cb_new), NULL);
    	gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
    	gtk_widget_show_all (menu);
     
    	gtk_menu_popup (GTK_MENU (menu), NULL, NULL,gtk_status_icon_position_menu, status_icon,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;
    }
    Merci,

    Ben

  4. #4
    Membre habitué
    Avatar de yvesall
    Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2006
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 208
    Points : 127
    Points
    127
    Par défaut
    moi ca ma aider, merci

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

Discussions similaires

  1. [Joomla!] Comment faire un menu avec plus de 2 sous-menus ?
    Par sircus dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 11/02/2009, 18h52
  2. Réponses: 3
    Dernier message: 29/04/2008, 12h33
  3. Pas de menu "requete" !!! comment faire ?
    Par mosquitout dans le forum Access
    Réponses: 5
    Dernier message: 04/11/2005, 18h56
  4. Réponses: 4
    Dernier message: 20/10/2005, 14h58
  5. [SQL] jointure externe avec 3 tables, comment faire ....
    Par grumbok dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/08/2005, 16h13

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