* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
* file for a list of people on the GTK+ Team. See the ChangeLog
* files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
+#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
+#error "Only <gtk/gtk.h> can be included directly."
+#endif
+
#ifndef __GTK_MENU_H__
#define __GTK_MENU_H__
-#include <gdk/gdk.h>
#include <gtk/gtkaccelgroup.h>
#include <gtk/gtkmenushell.h>
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
+G_BEGIN_DECLS
#define GTK_TYPE_MENU (gtk_menu_get_type ())
#define GTK_MENU(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_MENU, GtkMenu))
#define GTK_MENU_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_MENU, GtkMenuClass))
-typedef struct _GtkMenu GtkMenu;
-typedef struct _GtkMenuClass GtkMenuClass;
-
+typedef struct _GtkMenu GtkMenu;
+typedef struct _GtkMenuClass GtkMenuClass;
+typedef struct _GtkMenuPrivate GtkMenuPrivate;
+
+/**
+ * GtkMenuPositionFunc:
+ * @menu: a #GtkMenu.
+ * @x: (out): address of the #gint representing the horizontal
+ * position where the menu shall be drawn.
+ * @y: (out): address of the #gint representing the vertical position
+ * where the menu shall be drawn. This is an output parameter.
+ * @push_in: (out): This parameter controls how menus placed outside
+ * the monitor are handled. If this is set to %TRUE and part of
+ * the menu is outside the monitor then GTK+ pushes the window
+ * into the visible area, effectively modifying the popup
+ * position. Note that moving and possibly resizing the menu
+ * around will alter the scroll position to keep the menu items
+ * "in place", i.e. at the same monitor position they would have
+ * been without resizing. In practice, this behavior is only
+ * useful for combobox popups or option menus and cannot be used
+ * to simply confine a menu to monitor boundaries. In that case,
+ * changing the scroll offset is not desirable.
+ * @user_data: the data supplied by the user in the gtk_menu_popup()
+ * @data parameter.
+ *
+ * A user function supplied when calling gtk_menu_popup() which
+ * controls the positioning of the menu when it is displayed. The
+ * function sets the @x and @y parameters to the coordinates where the
+ * menu is to be drawn. To make the menu appear on a different
+ * monitor than the mouse pointer, gtk_menu_set_monitor() must be
+ * called.
+ */
typedef void (*GtkMenuPositionFunc) (GtkMenu *menu,
gint *x,
gint *y,
gboolean *push_in,
gpointer user_data);
+
+/**
+ * GtkMenuDetachFunc:
+ * @attach_widget: the #GtkWidget that the menu is being detached from.
+ * @menu: the #GtkMenu being detached.
+ *
+ * A user function supplied when calling gtk_menu_attach_to_widget() which
+ * will be called when the menu is later detached from the widget.
+ */
typedef void (*GtkMenuDetachFunc) (GtkWidget *attach_widget,
GtkMenu *menu);
struct _GtkMenu
{
GtkMenuShell menu_shell;
-
- GtkWidget *parent_menu_item;
- GtkWidget *old_active_menu_item;
-
- GtkAccelGroup *accel_group;
- gchar *accel_path;
- GtkMenuPositionFunc position_func;
- gpointer position_func_data;
-
- guint toggle_size;
- /* Do _not_ touch these widgets directly. We hide the reference
- * count from the toplevel to the menu, so it must be restored
- * before operating on these widgets
- */
- GtkWidget *toplevel;
-
- GtkWidget *tearoff_window;
- GtkWidget *tearoff_hbox;
- GtkWidget *tearoff_scrollbar;
- GtkAdjustment *tearoff_adjustment;
-
- GdkWindow *view_window;
- GdkWindow *bin_window;
-
- gint scroll_offset;
- gint saved_scroll_offset;
- gint scroll_step;
- guint timeout_id;
-
- /* When a submenu of this menu is popped up, motion in this
- * region is ignored
- */
- GdkRegion *navigation_region;
- guint navigation_timeout;
-
- guint needs_destruction_ref_count : 1;
- guint torn_off : 1;
- /* The tearoff is active when it is torn off and the not-torn-off
- * menu is not popped up.
- */
- guint tearoff_active : 1;
-
- guint scroll_fast : 1;
-
- guint upper_arrow_visible : 1;
- guint lower_arrow_visible : 1;
- guint upper_arrow_prelight : 1;
- guint lower_arrow_prelight : 1;
+
+ /*< private >*/
+ GtkMenuPrivate *priv;
};
struct _GtkMenuClass
GType gtk_menu_get_type (void) G_GNUC_CONST;
GtkWidget* gtk_menu_new (void);
+GDK_AVAILABLE_IN_3_4
+GtkWidget* gtk_menu_new_from_model (GMenuModel *model);
/* Display the menu onscreen */
void gtk_menu_popup (GtkMenu *menu,
gpointer data,
guint button,
guint32 activate_time);
+void gtk_menu_popup_for_device (GtkMenu *menu,
+ GdkDevice *device,
+ GtkWidget *parent_menu_shell,
+ GtkWidget *parent_menu_item,
+ GtkMenuPositionFunc func,
+ gpointer data,
+ GDestroyNotify destroy,
+ guint button,
+ guint32 activate_time);
/* Position the menu according to its position function. Called
* from gtkmenuitem.c when a menu-item changes its allocation
*/
GtkWidget* gtk_menu_get_active (GtkMenu *menu);
void gtk_menu_set_active (GtkMenu *menu,
- guint index_);
+ guint index);
/* set/get the accelerator group that holds global accelerators (should
* be added to the corresponding toplevel with gtk_window_add_accel_group().
GtkAccelGroup* gtk_menu_get_accel_group (GtkMenu *menu);
void gtk_menu_set_accel_path (GtkMenu *menu,
const gchar *accel_path);
+const gchar* gtk_menu_get_accel_path (GtkMenu *menu);
/* A reference count is kept for a widget when it is attached to
* a particular widget. This is typically a menu item; it may also
/* This sets the window manager title for the window that
* appears when a menu is torn off
*/
-void gtk_menu_set_title (GtkMenu *menu,
- const gchar *title);
-G_CONST_RETURN gchar *gtk_menu_get_title (GtkMenu *menu);
+void gtk_menu_set_title (GtkMenu *menu,
+ const gchar *title);
+const gchar * gtk_menu_get_title (GtkMenu *menu);
void gtk_menu_reorder_child (GtkMenu *menu,
GtkWidget *child,
void gtk_menu_set_monitor (GtkMenu *menu,
gint monitor_num);
+gint gtk_menu_get_monitor (GtkMenu *menu);
GList* gtk_menu_get_for_attach_widget (GtkWidget *widget);
-#ifndef GTK_DISABLE_DEPRECATED
-#define gtk_menu_append(menu,child) gtk_menu_shell_append ((GtkMenuShell *)(menu),(child))
-#define gtk_menu_prepend(menu,child) gtk_menu_shell_prepend ((GtkMenuShell *)(menu),(child))
-#define gtk_menu_insert(menu,child,pos) gtk_menu_shell_insert ((GtkMenuShell *)(menu),(child),(pos))
-#endif /* GTK_DISABLE_DEPRECATED */
+void gtk_menu_set_reserve_toggle_size (GtkMenu *menu,
+ gboolean reserve_toggle_size);
+gboolean gtk_menu_get_reserve_toggle_size (GtkMenu *menu);
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
+G_END_DECLS
#endif /* __GTK_MENU_H__ */