• # A améliorer

    Posté par . En réponse au message "Classe" GtkButton avec menu en C.. É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;
     }
    }