Forum Programmation.c "Classe" GtkButton avec menu en C.

Posté par  (site web personnel) .
Étiquettes :
0
8
mar.
2012

Bonjour,

Parmi les widget Gtk, il n'y a pas de bouton (avec une icone) qui affiche un menu lorsqu'on clique dessus. Bien sur il est possible de le coder en utilisant la fonction pour afficher un GtkMenu.

En fait je l'ai même déjà vu codé proprement avec une classe héritant de GtkToggleButton (en C++ dans Gnote , en Vala dans Gnome-contacts), mais je ne l'ai pas vu en C / Gobject.
Bon ça doit pas prendre longtemps à faire mais savez vous si un projet contient déjà un tel GObject, plutôt que de réinventer? Sinon je m'y mettrai, le principal (seul?) problème semblant être un positionnement propre du menu.

(ce widget étant différent de : GtkComboBox et GtkMenuToolButton )

Mon erreur est peut être de coder la partie interface en C mais bon…

  • # A améliorer

    Posté par  . Évalué à 3.

    Ayant eu à coder un truc similaire pour cairo-dock il y a quelques jours (pas encore commit), je peux déjà te montrer ce que j'ai fait. Le besoin est, sur un bouton existant, de n'afficher le menu que dans le cas rare ou il y a un choix à faire. J'ai donc juste fait un appel simple à 2 petites fonction pour afficher mon menu.

    L'appel :

        GtkRequisition *pPosition = cairo_dock_get_absolute_widget_position (GTK_WINDOW (s_pMainWindow), pWidget);
        gtk_menu_popup (GTK_MENU (pMenu),
            NULL,
            NULL,
            (GtkMenuPositionFunc) cairo_dock_place_menu_under_widget,
            pPosition,
            uButton,
            gtk_get_current_event_time ());
    
    

    et les 2 fonctions

    /**
     * Return absolute position of the bottom left corner of a widget to place a menu.
     * use with @see cairo_dock_place_menu_under_widget
     * see @see cairo_dock_popup_menu_module_instances for an example
     */
    GtkRequisition *cairo_dock_get_absolute_widget_position (GtkWindow *pWindow, GtkWidget *pWidget)
    {
        GtkRequisition *pPosition = g_new (GtkRequisition, 1);
    
        gint dx, dy;
        GdkRectangle win_rect;
        GtkRequisition req;
    
        // Window position.
        gtk_window_get_position (pWindow, &pPosition->width, &pPosition->height);
    
        // Window decorations size.
        gtk_window_get_size (pWindow, &dx, &dy);
        gdk_window_get_frame_extents (gtk_widget_get_window (pWidget), &win_rect);
        pPosition->width += win_rect.width - dx;
        pPosition->height += win_rect.height - dy;
    
        // Widget position inside the window.
        gtk_widget_translate_coordinates (pWidget, gtk_widget_get_toplevel (pWidget), 0, 0, &dx, &dy);
        pPosition->width += dx;
        pPosition->height += dy;
    
        // Widget height.
        #if (GTK_MAJOR_VERSION < 3)
        gtk_widget_size_request (GTK_WIDGET (pWidget), &req);
        #else
        gtk_widget_get_preferred_size (GTK_WIDGET (pWidget), &req, NULL);
        #endif
        pPosition->height += req.height;
    
        return pPosition;
    }
    
    /**
     * Convenient GtkMenuPositionFunc callback function to position menu.
     * use with @see cairo_dock_get_absolute_widget_position
     */
    void cairo_dock_place_menu_under_widget (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, GtkRequisition *pPosition)
    {
        *push_in = TRUE;
        if (pPosition != NULL)
        {
            *x = pPosition->width;
            *y = pPosition->height;
        }
    }
    
    
  • # Dans gedit

    Posté par  . Évalué à 1.

    Il y a plusieurs boutons de ce type dans la barre de statut de gedit, en C.

  • # Merci pour les éclaircissements

    Posté par  (site web personnel) . Évalué à 1.

    Merci, en effet c'est plus clair maintenant pour la position!, à vrai dire je supposais que c'était plus simple! un petit widget standard ne ferait pas de mal, en attendant piocher du code me permet de ne pas réinventer la roue !

    PS : et gloire à cairo-dock

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.