git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27599
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
\membersection{wxWindow::PopupMenu}\label{wxwindowpopupmenu}
\membersection{wxWindow::PopupMenu}\label{wxwindowpopupmenu}
+\func{bool}{PopupMenu}{\param{wxMenu* }{menu}}
+
\func{bool}{PopupMenu}{\param{wxMenu* }{menu}, \param{const wxPoint\& }{pos}}
\func{bool}{PopupMenu}{\param{wxMenu* }{menu}, \param{int }{x}, \param{int }{y}}
\func{bool}{PopupMenu}{\param{wxMenu* }{menu}, \param{const wxPoint\& }{pos}}
\func{bool}{PopupMenu}{\param{wxMenu* }{menu}, \param{int }{x}, \param{int }{y}}
Pops up the given menu at the specified coordinates, relative to this
window, and returns control when the user has dismissed the menu. If a
menu item is selected, the corresponding menu event is generated and will be
Pops up the given menu at the specified coordinates, relative to this
window, and returns control when the user has dismissed the menu. If a
menu item is selected, the corresponding menu event is generated and will be
+processed as usually. If the coordinates are not specified, current mouse
+cursor position is used.
-Just before the menu is popped up, \helpref{wxMenu::UpdateUI}{wxmenuupdateui} is called
-to ensure that the menu items are in the correct state. The menu does not get deleted
-by the window.
+Just before the menu is popped up, \helpref{wxMenu::UpdateUI}{wxmenuupdateui}
+is called to ensure that the menu items are in the correct state. The menu does
+not get deleted by the window.
+
+It is recommended to not explicitly specify coordinates when calling PopupMenu
+in response to mouse click, because some of the ports (namely, wxGTK) can do
+a better job of positioning the menu in that case.
\pythonnote{In place of a single overloaded method name, wxPython
implements the following methods:\par
\pythonnote{In place of a single overloaded method name, wxPython
implements the following methods:\par
virtual void DoUpdateWindowUI(wxUpdateUIEvent& event) ;
#if wxUSE_MENUS
virtual void DoUpdateWindowUI(wxUpdateUIEvent& event) ;
#if wxUSE_MENUS
- bool PopupMenu( wxMenu *menu, const wxPoint& pos )
+ bool PopupMenu(wxMenu *menu)
+ { return DoPopupMenu(menu, -1, -1); }
+ bool PopupMenu(wxMenu *menu, const wxPoint& pos)
{ return DoPopupMenu(menu, pos.x, pos.y); }
{ return DoPopupMenu(menu, pos.x, pos.y); }
- bool PopupMenu( wxMenu *menu, int x, int y )
+ bool PopupMenu(wxMenu *menu, int x, int y)
{ return DoPopupMenu(menu, x, y); }
#endif // wxUSE_MENUS
{ return DoPopupMenu(menu, x, y); }
#endif // wxUSE_MENUS
#endif // wxUSE_TOOLTIPS
#if wxUSE_MENUS
#endif // wxUSE_TOOLTIPS
#if wxUSE_MENUS
- virtual bool DoPopupMenu( wxMenu *menu, int x, int y ) = 0;
+ virtual bool DoPopupMenu(wxMenu *menu, int x, int y) = 0;
#endif // wxUSE_MENUS
// Makes an adjustment to the window position to make it relative to the
#endif // wxUSE_MENUS
// Makes an adjustment to the window position to make it relative to the
bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y )
{
bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y )
{
- wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid window") );
+ wxCHECK_MSG( m_widget != NULL, false, wxT("invalid window") );
- wxCHECK_MSG( menu != NULL, FALSE, wxT("invalid popup-menu") );
+ wxCHECK_MSG( menu != NULL, false, wxT("invalid popup-menu") );
SetInvokingWindow( menu, this );
menu->UpdateUI();
SetInvokingWindow( menu, this );
menu->UpdateUI();
- wxPoint pos(ClientToScreen(wxPoint(x, y)));
-
- bool is_waiting = TRUE;
+ bool is_waiting = true;
gtk_signal_connect( GTK_OBJECT(menu->m_menu),
"hide",
GTK_SIGNAL_FUNC(gtk_pop_hide_callback),
(gpointer)&is_waiting );
gtk_signal_connect( GTK_OBJECT(menu->m_menu),
"hide",
GTK_SIGNAL_FUNC(gtk_pop_hide_callback),
(gpointer)&is_waiting );
+ wxPoint pos;
+ gpointer userdata;
+ GtkMenuPositionFunc posfunc;
+ if ( x == -1 && y == -1 )
+ {
+ // use GTK's default positioning algorithm
+ userdata = NULL;
+ posfunc = NULL;
+ }
+ else
+ {
+ pos = ClientToScreen(wxPoint(x, y));
+ userdata = &pos;
+ posfunc = wxPopupMenuPositionCallback;
+ }
+
gtk_menu_popup(
GTK_MENU(menu->m_menu),
(GtkWidget *) NULL, // parent menu shell
(GtkWidget *) NULL, // parent menu item
gtk_menu_popup(
GTK_MENU(menu->m_menu),
(GtkWidget *) NULL, // parent menu shell
(GtkWidget *) NULL, // parent menu item
- wxPopupMenuPositionCallback, // function to position it
- &pos, // client data
- 0 /* FIXME! */, // button used to activate it
+ posfunc, // function to position it
+ userdata, // client data
+ 0, // button used to activate it
#ifdef __WXGTK20__
gtk_get_current_event_time()
#else
#ifdef __WXGTK20__
gtk_get_current_event_time()
#else
}
#endif // wxUSE_MENUS_NATIVE
}
#endif // wxUSE_MENUS_NATIVE
bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y )
{
bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y )
{
- wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid window") );
+ wxCHECK_MSG( m_widget != NULL, false, wxT("invalid window") );
- wxCHECK_MSG( menu != NULL, FALSE, wxT("invalid popup-menu") );
+ wxCHECK_MSG( menu != NULL, false, wxT("invalid popup-menu") );
SetInvokingWindow( menu, this );
menu->UpdateUI();
SetInvokingWindow( menu, this );
menu->UpdateUI();
- wxPoint pos(ClientToScreen(wxPoint(x, y)));
-
- bool is_waiting = TRUE;
+ bool is_waiting = true;
gtk_signal_connect( GTK_OBJECT(menu->m_menu),
"hide",
GTK_SIGNAL_FUNC(gtk_pop_hide_callback),
(gpointer)&is_waiting );
gtk_signal_connect( GTK_OBJECT(menu->m_menu),
"hide",
GTK_SIGNAL_FUNC(gtk_pop_hide_callback),
(gpointer)&is_waiting );
+ wxPoint pos;
+ gpointer userdata;
+ GtkMenuPositionFunc posfunc;
+ if ( x == -1 && y == -1 )
+ {
+ // use GTK's default positioning algorithm
+ userdata = NULL;
+ posfunc = NULL;
+ }
+ else
+ {
+ pos = ClientToScreen(wxPoint(x, y));
+ userdata = &pos;
+ posfunc = wxPopupMenuPositionCallback;
+ }
+
gtk_menu_popup(
GTK_MENU(menu->m_menu),
(GtkWidget *) NULL, // parent menu shell
(GtkWidget *) NULL, // parent menu item
gtk_menu_popup(
GTK_MENU(menu->m_menu),
(GtkWidget *) NULL, // parent menu shell
(GtkWidget *) NULL, // parent menu item
- wxPopupMenuPositionCallback, // function to position it
- &pos, // client data
- 0 /* FIXME! */, // button used to activate it
+ posfunc, // function to position it
+ userdata, // client data
+ 0, // button used to activate it
#ifdef __WXGTK20__
gtk_get_current_event_time()
#else
#ifdef __WXGTK20__
gtk_get_current_event_time()
#else
}
#endif // wxUSE_MENUS_NATIVE
}
#endif // wxUSE_MENUS_NATIVE
{
menu->SetInvokingWindow(this);
menu->UpdateUI();
{
menu->SetInvokingWindow(this);
menu->UpdateUI();
- ClientToScreen( &x , &y ) ;
+
+ if ( x == -1 && y == -1 )
+ {
+ wxPoint mouse = wxGetMousePosition();
+ x = mouse.x; y = mouse.y;
+ }
+ else
+ {
+ ClientToScreen( &x , &y ) ;
+ }
menu->MacBeforeDisplay( true ) ;
long menuResult = ::PopUpMenuSelect((MenuHandle) menu->GetHMenu() ,y,x, 0) ;
menu->MacBeforeDisplay( true ) ;
long menuResult = ::PopUpMenuSelect((MenuHandle) menu->GetHMenu() ,y,x, 0) ;
{
menu->SetInvokingWindow(this);
menu->UpdateUI();
{
menu->SetInvokingWindow(this);
menu->UpdateUI();
- ClientToScreen( &x , &y ) ;
+
+ if ( x == -1 && y == -1 )
+ {
+ wxPoint mouse = wxGetMousePosition();
+ x = mouse.x; y = mouse.y;
+ }
+ else
+ {
+ ClientToScreen( &x , &y ) ;
+ }
menu->MacBeforeDisplay( true ) ;
long menuResult = ::PopUpMenuSelect((MenuHandle) menu->GetHMenu() ,y,x, 0) ;
menu->MacBeforeDisplay( true ) ;
long menuResult = ::PopUpMenuSelect((MenuHandle) menu->GetHMenu() ,y,x, 0) ;
bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
{
bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
{
+ if ( x == -1 && y == -1 )
+ {
+ wxPoint mouse = ScreenToClient(wxGetMousePosition());
+ x = mouse.x; y = mouse.y;
+ }
+
Widget widget = (Widget) GetMainWidget();
/* The menuId field seems to be usused, so we'll use it to
Widget widget = (Widget) GetMainWidget();
/* The menuId field seems to be usused, so we'll use it to
menu->SetInvokingWindow(this);
menu->UpdateUI();
menu->SetInvokingWindow(this);
menu->UpdateUI();
+ if ( x == -1 && y == -1 )
+ {
+ wxPoint mouse = ScreenToClient(wxGetMousePosition());
+ x = mouse.x; y = mouse.y;
+ }
+
HWND hWnd = GetHwnd();
HMENU hMenu = GetHmenuOf(menu);
POINT point;
HWND hWnd = GetHwnd();
HMENU hMenu = GetHmenuOf(menu);
POINT point;
pMenu->SetInvokingWindow(this);
pMenu->UpdateUI();
pMenu->SetInvokingWindow(this);
pMenu->UpdateUI();
-
- DoClientToScreen( &nX
- ,&nY
- );
+
+ if ( x == -1 && y == -1 )
+ {
+ wxPoint mouse = wxGetMousePosition();
+ nX = mouse.x; nY = mouse.y;
+ }
+ else
+ {
+ DoClientToScreen( &nX
+ ,&nY
+ );
+ }
wxCurrentPopupMenu = pMenu;
::WinPopupMenu( hWndParent
wxCurrentPopupMenu = pMenu;
::WinPopupMenu( hWndParent
if (!m_iconWnd)
return false;
wxSize size(m_iconWnd->GetClientSize());
if (!m_iconWnd)
return false;
wxSize size(m_iconWnd->GetClientSize());
- m_iconWnd->PopupMenu(menu, size.x/2, size.y/2);
+ m_iconWnd->PopupMenu(menu);