// Generated by gmmproc 2.51.2 -- DO NOT MODIFY!
#ifndef _GTKMM_MENU_H
#define _GTKMM_MENU_H


#include <glibmm/ustring.h>
#include <sigc++/sigc++.h>

/* Copyright (C) 1998-2002 The gtkmm Development Team
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */


#include <gdkmm/window.h>
#include <gtkmm/menushell.h>
#include <gtkmm/menuitem.h>

#ifndef DOXYGEN_SHOULD_SKIP_THIS
using GtkMenu = struct _GtkMenu;
using GtkMenuClass = struct _GtkMenuClass;
#endif /* DOXYGEN_SHOULD_SKIP_THIS */


#ifndef DOXYGEN_SHOULD_SKIP_THIS
namespace Gtk
{ class Menu_Class; } // namespace Gtk
#endif //DOXYGEN_SHOULD_SKIP_THIS

namespace Gtk
{

class AccelGroup;

/** @defgroup Menus Menu classes
 */

/** A drop-down menu consisting of Gtk::MenuItem objects which can be navigated and activated by the user to perform application functions.
 * Menus are normally placed inside a Gtk::MenuBar or another MenuItem as a sub menu.
 * A Menu can also be popped up, for instance as a right-click context menu, by calling the popup() method.
 *
 * @ingroup Widgets
 * @ingroup Menus
 */

class Menu : public MenuShell
{
  public:
#ifndef DOXYGEN_SHOULD_SKIP_THIS
  typedef Menu CppObjectType;
  typedef Menu_Class CppClassType;
  typedef GtkMenu BaseObjectType;
  typedef GtkMenuClass BaseClassType;
#endif /* DOXYGEN_SHOULD_SKIP_THIS */

  Menu(Menu&& src) noexcept;
  Menu& operator=(Menu&& src) noexcept;

  // noncopyable
  Menu(const Menu&) = delete;
  Menu& operator=(const Menu&) = delete;

  ~Menu() noexcept override;

#ifndef DOXYGEN_SHOULD_SKIP_THIS

private:
  friend class Menu_Class;
  static CppClassType menu_class_;

protected:
  explicit Menu(const Glib::ConstructParams& construct_params);
  explicit Menu(GtkMenu* castitem);

#endif /* DOXYGEN_SHOULD_SKIP_THIS */

public:

  /** Get the GType for this class, for use with the underlying GObject type system.
   */
  static GType get_type()      G_GNUC_CONST;

#ifndef DOXYGEN_SHOULD_SKIP_THIS


  static GType get_base_type() G_GNUC_CONST;
#endif

  ///Provides access to the underlying C GtkObject.
  GtkMenu*       gobj()       { return reinterpret_cast<GtkMenu*>(gobject_); }

  ///Provides access to the underlying C GtkObject.
  const GtkMenu* gobj() const { return reinterpret_cast<GtkMenu*>(gobject_); }


public:
  //C++ methods used to invoke GTK+ virtual functions:

protected:
  //GTK+ Virtual Functions (override these to change behaviour):

  //Default Signal Handlers::


private:

public:
  Menu();

  //This is custom-implemented because the gtk_menu_new_from_model() does more
  //than just call g_object_new. See https://bugzilla.gnome.org/show_bug.cgi?id=704671
  /** Creates a new Menu and populates it with menu items
   * and submenus according to the @a model.
   *
   * The created menu items are connected to actions found in the
   * ApplicationWindow to which the menu belongs - typically
   * by means of being attached to a widget (see attach_to_widget())
   * that is contained within the ApplicationWindow's widget hierarchy.
   *
   * @param model
   *
   * @newin{3,10}
   */
  explicit Menu(const Glib::RefPtr<Gio::MenuModel>& model);
  

/* append, prepend, and insert are defined in MenuShell */

  /** For instance,
   * void on_popup_menu_position(int& x, int& y, bool& push_in);
   */
  typedef sigc::slot<void(int&, int&, bool&)> SlotPositionCalc;

  void popup(MenuShell& parent_menu_shell, MenuItem& parent_menu_item, const SlotPositionCalc& slot, guint button, guint32 activate_time, const Glib::RefPtr<Gdk::Device>& device = Glib::RefPtr<Gdk::Device>());
  

  /** Displays a menu and makes it available for selection.  Applications can use
   * this function to display context-sensitive menus.
   *
   * The @a button  parameter should be the mouse button pressed to initiate
   * the menu popup. If the menu popup was initiated by something other than
   * a mouse button press, such as a mouse button release or a keypress,
   *  @a button  should be 0.
   *
   * The @a activate_time  parameter should be the time stamp of the event that
   * initiated the popup. If such an event is not available, use
   * gtk_get_current_event_time() instead.
   * @param position_calc_slot A user supplied function used to position the menu, or <tt>0</tt>.
   * @param button The mouse button which was pressed to initiate the event.
   * @param activate_time The time at which the activation event occurred.
   * @param device A Gdk::Device.
   */
  void popup(const SlotPositionCalc& position_calc_slot, guint button, guint32 activate_time, const Glib::RefPtr<Gdk::Device>& device = Glib::RefPtr<Gdk::Device>());

  /** Displays a menu and makes it available for selection.
   * Applications can use this function to display context-sensitive menus, at the current pointer position.
   * @param button The button which was pressed to initiate the event.
   * @param activate_time The time at which the activation event occurred.
   * @param device A Gdk::Device.
   */
  void popup(guint button, guint32 activate_time, const Glib::RefPtr<Gdk::Device>& device = Glib::RefPtr<Gdk::Device>());

  
  /** Displays @a menu and makes it available for selection.
   * 
   * See popup_at_widget() and popup_at_pointer(), which
   * handle more common cases for popping up menus.
   * 
   *  @a menu will be positioned at @a rect, aligning their anchor points. @a rect is
   * relative to the top-left corner of @a rect_window. @a rect_anchor and
   *  @a menu_anchor determine anchor points on @a rect and @a menu to pin together.
   *  @a menu can optionally be offset by Gtk::Menu::property_rect_anchor_dx() and
   * Gtk::Menu::property_rect_anchor_dy().
   * 
   * Anchors should be specified under the assumption that the text direction is
   * left-to-right; they will be flipped horizontally automatically if the text
   * direction is right-to-left.
   * 
   * Other properties that influence the behaviour of this function are
   * Gtk::Menu::property_anchor_hints() and Gtk::Menu::property_menu_type_hint(). Connect to the
   * Gtk::Menu::signal_popped_up() signal to find out how it was actually positioned.
   * 
   * Since: 3.22
   * Stability: Unstable
   * 
   * @param rect_window The Gdk::Window @a rect is relative to.
   * @param rect The Gdk::Rectangle to align @a menu with.
   * @param rect_anchor The point on @a rect to align with @a menu's anchor point.
   * @param menu_anchor The point on @a menu to align with @a rect's anchor point.
   * @param trigger_event The Gdk::Event that initiated this request or
   * <tt>nullptr</tt> if it's the current event.
   */
  void popup_at_rect(const Glib::RefPtr<Gdk::Window>& rect_window, const Gdk::Rectangle& rect, Gdk::Gravity rect_anchor, Gdk::Gravity menu_anchor, const GdkEvent* trigger_event);
  
  /** Displays @a menu and makes it available for selection.
   * 
   * See popup_at_pointer() to pop up a menu at the master pointer.
   * popup_at_rect() also allows you to position a menu at an arbitrary
   * rectangle.
   * 
   * ![](popup-anchors.png)
   * 
   *  @a menu will be positioned at @a widget, aligning their anchor points.
   *  @a widget_anchor and @a menu_anchor determine anchor points on @a widget and @a menu
   * to pin together. @a menu can optionally be offset by Gtk::Menu::property_rect_anchor_dx()
   * and Gtk::Menu::property_rect_anchor_dy().
   * 
   * Anchors should be specified under the assumption that the text direction is
   * left-to-right; they will be flipped horizontally automatically if the text
   * direction is right-to-left.
   * 
   * Other properties that influence the behaviour of this function are
   * Gtk::Menu::property_anchor_hints() and Gtk::Menu::property_menu_type_hint(). Connect to the
   * Gtk::Menu::signal_popped_up() signal to find out how it was actually positioned.
   * 
   * Since: 3.22
   * Stability: Unstable
   * 
   * @param widget The Gtk::Widget to align @a menu with.
   * @param widget_anchor The point on @a widget to align with @a menu's anchor point.
   * @param menu_anchor The point on @a menu to align with @a widget's anchor point.
   * @param trigger_event The Gdk::Event that initiated this request or
   * <tt>nullptr</tt> if it's the current event.
   */
  void popup_at_widget(Widget* widget, Gdk::Gravity widget_anchor, Gdk::Gravity menu_anchor, const GdkEvent* trigger_event);
  
  /** Displays @a menu and makes it available for selection.
   * 
   * See popup_at_widget() to pop up a menu at a widget.
   * popup_at_rect() also allows you to position a menu at an arbitrary
   * rectangle.
   * 
   *  @a menu will be positioned at the pointer associated with @a trigger_event.
   * 
   * Properties that influence the behaviour of this function are
   * Gtk::Menu::property_anchor_hints(), Gtk::Menu::property_rect_anchor_dx(), Gtk::Menu::property_rect_anchor_dy(), and
   * Gtk::Menu::property_menu_type_hint(). Connect to the Gtk::Menu::signal_popped_up() signal to find
   * out how it was actually positioned.
   * 
   * Since: 3.22
   * Stability: Unstable
   * 
   * @param trigger_event The Gdk::Event that initiated this request or
   * <tt>nullptr</tt> if it's the current event.
   */
  void popup_at_pointer(const GdkEvent* trigger_event);

  
  /** Repositions the menu according to its position function.
   */
  void reposition();

  
  /** Removes the menu from the screen.
   */
  void popdown();

  
  /** Returns the selected menu item from the menu.  This is used by the
   * Gtk::ComboBox.
   * 
   * @return The Gtk::MenuItem that was last selected
   * in the menu.  If a selection has not yet been made, the
   * first menu item is selected.
   */
  MenuItem* get_active();
  
  /** Returns the selected menu item from the menu.  This is used by the
   * Gtk::ComboBox.
   * 
   * @return The Gtk::MenuItem that was last selected
   * in the menu.  If a selection has not yet been made, the
   * first menu item is selected.
   */
  const MenuItem* get_active() const;
  
  /** Selects the specified menu item within the menu.  This is used by
   * the Gtk::ComboBox and should not be used by anyone else.
   * 
   * @param index The index of the menu item to select.  Index values are
   * from 0 to n-1.
   */
  void set_active(guint index);

  
  /** Set the Gtk::AccelGroup which holds global accelerators for the
   * menu.  This accelerator group needs to also be added to all windows
   * that this menu is being used in with Gtk::Window::add_accel_group(),
   * in order for those windows to support all the accelerators
   * contained in this group.
   * 
   * @param accel_group The Gtk::AccelGroup to be associated
   * with the menu.
   */
  void set_accel_group(const Glib::RefPtr<AccelGroup>& accel_group);
  void unset_accel_group();
  
  /** Gets the Gtk::AccelGroup which holds global accelerators for the
   * menu. See set_accel_group().
   * 
   * @return The Gtk::AccelGroup associated with the menu.
   */
  Glib::RefPtr<AccelGroup> get_accel_group();
  
  /** Gets the Gtk::AccelGroup which holds global accelerators for the
   * menu. See set_accel_group().
   * 
   * @return The Gtk::AccelGroup associated with the menu.
   */
  Glib::RefPtr<const AccelGroup> get_accel_group() const;

  
  /** Sets an accelerator path for this menu from which accelerator paths
   * for its immediate children, its menu items, can be constructed.
   * The main purpose of this function is to spare the programmer the
   * inconvenience of having to call Gtk::MenuItem::set_accel_path() on
   * each menu item that should support runtime user changable accelerators.
   * Instead, by just calling set_accel_path() on their parent,
   * each menu item of this menu, that contains a label describing its
   * purpose, automatically gets an accel path assigned.
   * 
   * For example, a menu containing menu items “New” and “Exit”, will, after
   * `gtk_menu_set_accel_path (menu, "<Gnumeric-Sheet>/File");` has been
   * called, assign its items the accel paths: `"<Gnumeric-Sheet>/File/New"`
   * and `"<Gnumeric-Sheet>/File/Exit"`.
   * 
   * Assigning accel paths to menu items then enables the user to change
   * their accelerators at runtime. More details about accelerator paths
   * and their default setups can be found at Gtk::AccelMap::add_entry().
   * 
   * Note that @a accel_path string will be stored in a Quark. Therefore,
   * if you pass a static string, you can save some memory by interning
   * it first with Glib::intern_static_string().
   * 
   * @param accel_path A valid accelerator path.
   */
  void set_accel_path(const Glib::ustring& accel_path);
  
  /** Retrieves the accelerator path set on the menu.
   * 
   * @newin{2,14}
   * 
   * @return The accelerator path set on the menu.
   */
  Glib::ustring get_accel_path() const;

  
  /** Detaches the menu from the widget to which it had been attached.
   * This function will call the callback function, @a detacher, provided
   * when the attach_to_widget() function was called.
   */
  void detach();
  
  /** Returns the Gtk::Widget that the menu is attached to.
   * 
   * @return The Gtk::Widget that the menu is attached to.
   */
  Widget* get_attach_widget();
  
  /** Returns the Gtk::Widget that the menu is attached to.
   * 
   * @return The Gtk::Widget that the menu is attached to.
   */
  const Widget* get_attach_widget() const;

  
  /** Sets the Gdk::Screen on which the menu will be displayed.
   * 
   * @newin{2,2}
   * 
   * @param screen A Gdk::Screen, or <tt>nullptr</tt> if the screen should be
   * determined by the widget the menu is attached to.
   */
  void set_screen(const Glib::RefPtr<Gdk::Screen>& screen);

  
  /** Adds a new Gtk::MenuItem to a (table) menu. The number of “cells” that
   * an item will occupy is specified by @a left_attach, @a right_attach,
   *  @a top_attach and @a bottom_attach. These each represent the leftmost,
   * rightmost, uppermost and lower column and row numbers of the table.
   * (Columns and rows are indexed from zero).
   * 
   * Note that this function is not related to detach().
   * 
   * @newin{2,4}
   * 
   * @param child A Gtk::MenuItem.
   * @param left_attach The column number to attach the left side of the item to.
   * @param right_attach The column number to attach the right side of the item to.
   * @param top_attach The row number to attach the top of the item to.
   * @param bottom_attach The row number to attach the bottom of the item to.
   */
  void attach(Gtk::Widget& child, guint left_attach, guint right_attach, guint top_attach, guint bottom_attach);

  
  /** Informs GTK+ on which monitor a menu should be popped up.
   * See gdk_monitor_get_geometry().
   * 
   * This function should be called from a Gtk::MenuPositionFunc
   * if the menu should not appear on the same monitor as the pointer.
   * This information can’t be reliably inferred from the coordinates
   * returned by a Gtk::MenuPositionFunc, since, for very long menus,
   * these coordinates may extend beyond the monitor boundaries or even
   * the screen boundaries.
   * 
   * @newin{2,4}
   * 
   * @param monitor_num The number of the monitor on which the menu should
   * be popped up.
   */
  void set_monitor(int monitor_num);
  
  /** Retrieves the number of the monitor on which to show the menu.
   * 
   * @newin{2,14}
   * 
   * @return The number of the monitor on which the menu should
   * be popped up or -1, if no monitor has been set.
   */
  int get_monitor() const;
  //TODO: Wrap or ignore gtk_menu_place_on_monitor(). It's not documented. Does it mean it's private?

  void reorder_child(const MenuItem& child, int position);
  

  /** Sets whether the menu should reserve space for drawing toggles
   * or icons, regardless of their actual presence.
   * 
   * @newin{2,18}
   * 
   * @param reserve_toggle_size Whether to reserve size for toggles.
   */
  void set_reserve_toggle_size(bool reserve_toggle_size =  true);
  
  /** Returns whether the menu reserves space for toggles and
   * icons, regardless of their actual presence.
   * 
   * @newin{2,18}
   * 
   * @return Whether the menu reserves toggle space.
   */
  bool get_reserve_toggle_size() const;

  //TODO: What does "attach" actually mean here? murrayc
  //  Part answer: It has become more important now that it is mentioned in the (apparently newer) gtk_menu_new_from_model() documentation.
  /** Attaches the menu to the widget.
   *
   * @param attach_widget The Widget that the menu will be attached to.
   *
   * @newin{2,10}
   */
  void attach_to_widget(Widget& attach_widget);

    // no_default_handler because the wrapped C signal has no default handler.
 

  /**
   * @par Slot Prototype:
   * <tt>void on_my_%popped_up(const Gdk::Rectangle* flipped_rect, const Gdk::Rectangle* final_rect, bool flipped_x, bool flipped_y)</tt>
   *
   * Emitted when the position of @a menu is finalized after being popped up
   * using Gtk::Menu::popup_at_rect(), Gtk::Menu::popup_at_widget(), or
   * Gtk::Menu::popup_at_pointer().
   * 
   *  @a menu might be flipped over the anchor rectangle in order to keep it
   * on-screen, in which case @a flipped_x and @a flipped_y will be set to <tt>true</tt>
   * accordingly.
   * 
   *  @a flipped_rect is the ideal position of @a menu after any possible flipping,
   * but before any possible sliding. @a final_rect is @a flipped_rect, but possibly
   * translated in the case that flipping is still ineffective in keeping @a menu
   * on-screen.
   * 
   * ![](popup-slide.png)
   * 
   * The blue menu is @a menu's ideal position, the green menu is @a flipped_rect,
   * and the red menu is @a final_rect.
   * 
   * See Gtk::Menu::popup_at_rect(), Gtk::Menu::popup_at_widget(),
   * Gtk::Menu::popup_at_pointer(), Gtk::Menu::property_anchor_hints(),
   * Gtk::Menu::property_rect_anchor_dx(), Gtk::Menu::property_rect_anchor_dy(), and
   * Gtk::Menu::property_menu_type_hint().
   * 
   * Since: 3.22
   * Stability: Unstable
   * 
   * @param flipped_rect The position of @a menu after any possible
   * flipping or <tt>nullptr</tt> if the backend can't obtain it.
   * @param final_rect The final position of @a menu or <tt>nullptr</tt> if the
   * backend can't obtain it.
   * @param flipped_x <tt>true</tt> if the anchors were flipped horizontally.
   * @param flipped_y <tt>true</tt> if the anchors were flipped vertically.
   */

  Glib::SignalProxy<void(const Gdk::Rectangle*, const Gdk::Rectangle*, bool, bool)> signal_popped_up();


  /** The index of the currently selected menu item, or -1 if no
   * menu item is selected.
   * 
   * @newin{2,14}
   *
   * @return A PropertyProxy that allows you to get or set the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy< int > property_active() ;

/** The index of the currently selected menu item, or -1 if no
   * menu item is selected.
   * 
   * @newin{2,14}
   *
   * @return A PropertyProxy_ReadOnly that allows you to get the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly< int > property_active() const;

  /** The accel group holding accelerators for the menu.
   * 
   * @newin{2,14}
   *
   * @return A PropertyProxy that allows you to get or set the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy< Glib::RefPtr<AccelGroup> > property_accel_group() ;

/** The accel group holding accelerators for the menu.
   * 
   * @newin{2,14}
   *
   * @return A PropertyProxy_ReadOnly that allows you to get the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly< Glib::RefPtr<AccelGroup> > property_accel_group() const;

  /** An accel path used to conveniently construct accel paths of child items.
   * 
   * @newin{2,14}
   *
   * @return A PropertyProxy that allows you to get or set the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy< Glib::ustring > property_accel_path() ;

/** An accel path used to conveniently construct accel paths of child items.
   * 
   * @newin{2,14}
   *
   * @return A PropertyProxy_ReadOnly that allows you to get the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly< Glib::ustring > property_accel_path() const;

  /** The widget the menu is attached to. Setting this property attaches
   * the menu without a Gtk::MenuDetachFunc. If you need to use a detacher,
   * use Gtk::Menu::attach_to_widget() directly.
   * 
   * @newin{2,14}
   *
   * @return A PropertyProxy that allows you to get or set the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy< Widget* > property_attach_widget() ;

/** The widget the menu is attached to. Setting this property attaches
   * the menu without a Gtk::MenuDetachFunc. If you need to use a detacher,
   * use Gtk::Menu::attach_to_widget() directly.
   * 
   * @newin{2,14}
   *
   * @return A PropertyProxy_ReadOnly that allows you to get the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly< Widget* > property_attach_widget() const;

  /** The monitor the menu will be popped up on.
   * 
   * @newin{2,14}
   *
   * @return A PropertyProxy that allows you to get or set the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy< int > property_monitor() ;

/** The monitor the menu will be popped up on.
   * 
   * @newin{2,14}
   *
   * @return A PropertyProxy_ReadOnly that allows you to get the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly< int > property_monitor() const;

  /** A boolean that indicates whether the menu reserves space for
   * toggles and icons, regardless of their actual presence.
   * 
   * This property should only be changed from its default value
   * for special-purposes such as tabular menus. Regular menus that
   * are connected to a menu bar or context menus should reserve
   * toggle space for consistency.
   * 
   * @newin{2,18}
   *
   * @return A PropertyProxy that allows you to get or set the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy< bool > property_reserve_toggle_size() ;

/** A boolean that indicates whether the menu reserves space for
   * toggles and icons, regardless of their actual presence.
   * 
   * This property should only be changed from its default value
   * for special-purposes such as tabular menus. Regular menus that
   * are connected to a menu bar or context menus should reserve
   * toggle space for consistency.
   * 
   * @newin{2,18}
   *
   * @return A PropertyProxy_ReadOnly that allows you to get the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly< bool > property_reserve_toggle_size() const;

  /** Positioning hints for aligning the menu relative to a rectangle.
   * 
   * These hints determine how the menu should be positioned in the case that
   * the menu would fall off-screen if placed in its ideal position.
   * 
   * ![](popup-flip.png)
   * 
   * For example, Gdk::ANCHOR_FLIP_Y will replace Gdk::GRAVITY_NORTH_WEST with
   * Gdk::GRAVITY_SOUTH_WEST and vice versa if the menu extends beyond the
   * bottom edge of the monitor.
   * 
   * See Gtk::Menu::popup_at_rect(), Gtk::Menu::popup_at_widget(),
   * Gtk::Menu::popup_at_pointer(), Gtk::Menu::property_rect_anchor_dx(),
   * Gtk::Menu::property_rect_anchor_dy(), Gtk::Menu::property_menu_type_hint(), and Gtk::Menu::signal_popped_up().
   * 
   * Since: 3.22
   * Stability: Unstable
   *
   * @return A PropertyProxy that allows you to get or set the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy< Gdk::AnchorHints > property_anchor_hints() ;

/** Positioning hints for aligning the menu relative to a rectangle.
   * 
   * These hints determine how the menu should be positioned in the case that
   * the menu would fall off-screen if placed in its ideal position.
   * 
   * ![](popup-flip.png)
   * 
   * For example, Gdk::ANCHOR_FLIP_Y will replace Gdk::GRAVITY_NORTH_WEST with
   * Gdk::GRAVITY_SOUTH_WEST and vice versa if the menu extends beyond the
   * bottom edge of the monitor.
   * 
   * See Gtk::Menu::popup_at_rect(), Gtk::Menu::popup_at_widget(),
   * Gtk::Menu::popup_at_pointer(), Gtk::Menu::property_rect_anchor_dx(),
   * Gtk::Menu::property_rect_anchor_dy(), Gtk::Menu::property_menu_type_hint(), and Gtk::Menu::signal_popped_up().
   * 
   * Since: 3.22
   * Stability: Unstable
   *
   * @return A PropertyProxy_ReadOnly that allows you to get the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly< Gdk::AnchorHints > property_anchor_hints() const;

  /** Horizontal offset to apply to the menu, i.e.\ the rectangle or widget
   * anchor.
   * 
   * See Gtk::Menu::popup_at_rect(), Gtk::Menu::popup_at_widget(),
   * Gtk::Menu::popup_at_pointer(), Gtk::Menu::property_anchor_hints(),
   * Gtk::Menu::property_rect_anchor_dy(), Gtk::Menu::property_menu_type_hint(), and Gtk::Menu::signal_popped_up().
   * 
   * Since: 3.22
   * Stability: Unstable
   *
   * @return A PropertyProxy that allows you to get or set the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy< int > property_rect_anchor_dx() ;

/** Horizontal offset to apply to the menu, i.e.\ the rectangle or widget
   * anchor.
   * 
   * See Gtk::Menu::popup_at_rect(), Gtk::Menu::popup_at_widget(),
   * Gtk::Menu::popup_at_pointer(), Gtk::Menu::property_anchor_hints(),
   * Gtk::Menu::property_rect_anchor_dy(), Gtk::Menu::property_menu_type_hint(), and Gtk::Menu::signal_popped_up().
   * 
   * Since: 3.22
   * Stability: Unstable
   *
   * @return A PropertyProxy_ReadOnly that allows you to get the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly< int > property_rect_anchor_dx() const;

  /** Vertical offset to apply to the menu, i.e.\ the rectangle or widget anchor.
   * 
   * See Gtk::Menu::popup_at_rect(), Gtk::Menu::popup_at_widget(),
   * Gtk::Menu::popup_at_pointer(), Gtk::Menu::property_anchor_hints(),
   * Gtk::Menu::property_rect_anchor_dx(), Gtk::Menu::property_menu_type_hint(), and Gtk::Menu::signal_popped_up().
   * 
   * Since: 3.22
   * Stability: Unstable
   *
   * @return A PropertyProxy that allows you to get or set the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy< int > property_rect_anchor_dy() ;

/** Vertical offset to apply to the menu, i.e.\ the rectangle or widget anchor.
   * 
   * See Gtk::Menu::popup_at_rect(), Gtk::Menu::popup_at_widget(),
   * Gtk::Menu::popup_at_pointer(), Gtk::Menu::property_anchor_hints(),
   * Gtk::Menu::property_rect_anchor_dx(), Gtk::Menu::property_menu_type_hint(), and Gtk::Menu::signal_popped_up().
   * 
   * Since: 3.22
   * Stability: Unstable
   *
   * @return A PropertyProxy_ReadOnly that allows you to get the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly< int > property_rect_anchor_dy() const;

  /** The Gdk::WindowTypeHint to use for the menu's Gdk::Window.
   * 
   * See Gtk::Menu::popup_at_rect(), Gtk::Menu::popup_at_widget(),
   * Gtk::Menu::popup_at_pointer(), Gtk::Menu::property_anchor_hints(),
   * Gtk::Menu::property_rect_anchor_dx(), Gtk::Menu::property_rect_anchor_dy(), and Gtk::Menu::signal_popped_up().
   * 
   * Since: 3.22
   * Stability: Unstable
   *
   * @return A PropertyProxy that allows you to get or set the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy< Gdk::WindowTypeHint > property_menu_type_hint() ;

/** The Gdk::WindowTypeHint to use for the menu's Gdk::Window.
   * 
   * See Gtk::Menu::popup_at_rect(), Gtk::Menu::popup_at_widget(),
   * Gtk::Menu::popup_at_pointer(), Gtk::Menu::property_anchor_hints(),
   * Gtk::Menu::property_rect_anchor_dx(), Gtk::Menu::property_rect_anchor_dy(), and Gtk::Menu::signal_popped_up().
   * 
   * Since: 3.22
   * Stability: Unstable
   *
   * @return A PropertyProxy_ReadOnly that allows you to get the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly< Gdk::WindowTypeHint > property_menu_type_hint() const;


protected:

  //TODO: Remove this if it has never been used, at the next ABI break?
  //We can not wrap this as a slot because there is no data parameter, and no destroy callback to destroy that data.
  typedef void (*GtkMenuDetachFunc)   (GtkWidget *attach_widget, GtkMenu   *menu);
  
  /** Attaches the menu to the widget and provides a callback function
   * that will be invoked when the menu calls detach() during
   * its destruction.
   * 
   * If the menu is attached to the widget then it will be destroyed
   * when the widget is destroyed, as if it was a child widget.
   * An attached menu will also move between screens correctly if the
   * widgets moves between screens.
   * 
   * @param attach_widget The Gtk::Widget that the menu will be attached to.
   * @param detacher The user supplied callback function
   * that will be called when the menu calls detach().
   */
  void attach_to_widget(Widget& attach_widget, GtkMenuDetachFunc detacher);


};

} // namespace Gtk


namespace Glib
{
  /** A Glib::wrap() method for this object.
   *
   * @param object The C instance.
   * @param take_copy False if the result should take ownership of the C instance. True if it should take a new copy or ref.
   * @result A C++ instance that wraps this C instance.
   *
   * @relates Gtk::Menu
   */
  Gtk::Menu* wrap(GtkMenu* object, bool take_copy = false);
} //namespace Glib


#endif /* _GTKMM_MENU_H */

