moded wxWindow::PopupMenu() from window.cpp to menu.cpp as this allows it to access static functions in menu.cpp; implemented sending of wxEVT_MENU_OPEN/CLOSE for popup menus
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@36556 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
13d3511257
commit
43a11e2a50
121
src/gtk/menu.cpp
121
src/gtk/menu.cpp
@ -1522,3 +1522,124 @@ static wxString GetGtkHotKey( const wxMenuItem& item )
|
||||
}
|
||||
|
||||
#endif // wxUSE_ACCEL
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Pop-up menu stuff
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#if wxUSE_MENUS_NATIVE
|
||||
|
||||
extern "C"
|
||||
void gtk_pop_hide_callback( GtkWidget *WXUNUSED(widget), bool* is_waiting )
|
||||
{
|
||||
*is_waiting = FALSE;
|
||||
}
|
||||
|
||||
static void SetInvokingWindow( wxMenu *menu, wxWindow* win )
|
||||
{
|
||||
menu->SetInvokingWindow( win );
|
||||
|
||||
wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst();
|
||||
while (node)
|
||||
{
|
||||
wxMenuItem *menuitem = node->GetData();
|
||||
if (menuitem->IsSubMenu())
|
||||
{
|
||||
SetInvokingWindow( menuitem->GetSubMenu(), win );
|
||||
}
|
||||
|
||||
node = node->GetNext();
|
||||
}
|
||||
}
|
||||
|
||||
extern "C"
|
||||
void wxPopupMenuPositionCallback( GtkMenu *menu,
|
||||
gint *x, gint *y,
|
||||
#ifdef __WXGTK20__
|
||||
gboolean * WXUNUSED(whatever),
|
||||
#endif
|
||||
gpointer user_data )
|
||||
{
|
||||
// ensure that the menu appears entirely on screen
|
||||
GtkRequisition req;
|
||||
gtk_widget_get_child_requisition(GTK_WIDGET(menu), &req);
|
||||
|
||||
wxSize sizeScreen = wxGetDisplaySize();
|
||||
wxPoint *pos = (wxPoint*)user_data;
|
||||
|
||||
gint xmax = sizeScreen.x - req.width,
|
||||
ymax = sizeScreen.y - req.height;
|
||||
|
||||
*x = pos->x < xmax ? pos->x : xmax;
|
||||
*y = pos->y < ymax ? pos->y : ymax;
|
||||
}
|
||||
|
||||
bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y )
|
||||
{
|
||||
wxCHECK_MSG( m_widget != NULL, false, wxT("invalid window") );
|
||||
|
||||
wxCHECK_MSG( menu != NULL, false, wxT("invalid popup-menu") );
|
||||
|
||||
// NOTE: if you change this code, you need to update
|
||||
// the same code in taskbar.cpp as well. This
|
||||
// is ugly code duplication, I know.
|
||||
|
||||
SetInvokingWindow( menu, this );
|
||||
|
||||
menu->UpdateUI();
|
||||
|
||||
bool is_waiting = true;
|
||||
|
||||
gulong handler = 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;
|
||||
}
|
||||
|
||||
wxMenuEvent eventOpen(wxEVT_MENU_OPEN, -1, menu);
|
||||
DoCommonMenuCallbackCode(menu, eventOpen);
|
||||
|
||||
gtk_menu_popup(
|
||||
GTK_MENU(menu->m_menu),
|
||||
(GtkWidget *) NULL, // parent menu shell
|
||||
(GtkWidget *) NULL, // parent menu item
|
||||
posfunc, // function to position it
|
||||
userdata, // client data
|
||||
0, // button used to activate it
|
||||
#ifdef __WXGTK20__
|
||||
gtk_get_current_event_time()
|
||||
#else
|
||||
gs_timeLastClick // the time of activation
|
||||
#endif
|
||||
);
|
||||
|
||||
while (is_waiting)
|
||||
{
|
||||
gtk_main_iteration();
|
||||
}
|
||||
|
||||
gtk_signal_disconnect(GTK_OBJECT(menu->m_menu), handler);
|
||||
|
||||
wxMenuEvent eventClose(wxEVT_MENU_CLOSE, -1, menu);
|
||||
DoCommonMenuCallbackCode(menu, eventClose);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif // wxUSE_MENUS_NATIVE
|
||||
|
||||
|
@ -4412,120 +4412,6 @@ bool wxWindowGTK::SetBackgroundStyle(wxBackgroundStyle style)
|
||||
return true;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Pop-up menu stuff
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#if wxUSE_MENUS_NATIVE
|
||||
|
||||
extern "C" WXDLLIMPEXP_CORE
|
||||
void gtk_pop_hide_callback( GtkWidget *WXUNUSED(widget), bool* is_waiting )
|
||||
{
|
||||
*is_waiting = FALSE;
|
||||
}
|
||||
|
||||
WXDLLIMPEXP_CORE void SetInvokingWindow( wxMenu *menu, wxWindow* win )
|
||||
{
|
||||
menu->SetInvokingWindow( win );
|
||||
|
||||
wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst();
|
||||
while (node)
|
||||
{
|
||||
wxMenuItem *menuitem = node->GetData();
|
||||
if (menuitem->IsSubMenu())
|
||||
{
|
||||
SetInvokingWindow( menuitem->GetSubMenu(), win );
|
||||
}
|
||||
|
||||
node = node->GetNext();
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" WXDLLIMPEXP_CORE
|
||||
void wxPopupMenuPositionCallback( GtkMenu *menu,
|
||||
gint *x, gint *y,
|
||||
#ifdef __WXGTK20__
|
||||
gboolean * WXUNUSED(whatever),
|
||||
#endif
|
||||
gpointer user_data )
|
||||
{
|
||||
// ensure that the menu appears entirely on screen
|
||||
GtkRequisition req;
|
||||
gtk_widget_get_child_requisition(GTK_WIDGET(menu), &req);
|
||||
|
||||
wxSize sizeScreen = wxGetDisplaySize();
|
||||
wxPoint *pos = (wxPoint*)user_data;
|
||||
|
||||
gint xmax = sizeScreen.x - req.width,
|
||||
ymax = sizeScreen.y - req.height;
|
||||
|
||||
*x = pos->x < xmax ? pos->x : xmax;
|
||||
*y = pos->y < ymax ? pos->y : ymax;
|
||||
}
|
||||
|
||||
bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y )
|
||||
{
|
||||
wxCHECK_MSG( m_widget != NULL, false, wxT("invalid window") );
|
||||
|
||||
wxCHECK_MSG( menu != NULL, false, wxT("invalid popup-menu") );
|
||||
|
||||
// NOTE: if you change this code, you need to update
|
||||
// the same code in taskbar.cpp as well. This
|
||||
// is ugly code duplication, I know.
|
||||
|
||||
SetInvokingWindow( menu, this );
|
||||
|
||||
menu->UpdateUI();
|
||||
|
||||
bool is_waiting = true;
|
||||
|
||||
gulong handler = 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
|
||||
posfunc, // function to position it
|
||||
userdata, // client data
|
||||
0, // button used to activate it
|
||||
#ifdef __WXGTK20__
|
||||
gtk_get_current_event_time()
|
||||
#else
|
||||
gs_timeLastClick // the time of activation
|
||||
#endif
|
||||
);
|
||||
|
||||
while (is_waiting)
|
||||
{
|
||||
gtk_main_iteration();
|
||||
}
|
||||
|
||||
gtk_signal_disconnect(GTK_OBJECT(menu->m_menu), handler);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif // wxUSE_MENUS_NATIVE
|
||||
|
||||
#if wxUSE_DRAG_AND_DROP
|
||||
|
||||
void wxWindowGTK::SetDropTarget( wxDropTarget *dropTarget )
|
||||
|
@ -1522,3 +1522,124 @@ static wxString GetGtkHotKey( const wxMenuItem& item )
|
||||
}
|
||||
|
||||
#endif // wxUSE_ACCEL
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Pop-up menu stuff
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#if wxUSE_MENUS_NATIVE
|
||||
|
||||
extern "C"
|
||||
void gtk_pop_hide_callback( GtkWidget *WXUNUSED(widget), bool* is_waiting )
|
||||
{
|
||||
*is_waiting = FALSE;
|
||||
}
|
||||
|
||||
static void SetInvokingWindow( wxMenu *menu, wxWindow* win )
|
||||
{
|
||||
menu->SetInvokingWindow( win );
|
||||
|
||||
wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst();
|
||||
while (node)
|
||||
{
|
||||
wxMenuItem *menuitem = node->GetData();
|
||||
if (menuitem->IsSubMenu())
|
||||
{
|
||||
SetInvokingWindow( menuitem->GetSubMenu(), win );
|
||||
}
|
||||
|
||||
node = node->GetNext();
|
||||
}
|
||||
}
|
||||
|
||||
extern "C"
|
||||
void wxPopupMenuPositionCallback( GtkMenu *menu,
|
||||
gint *x, gint *y,
|
||||
#ifdef __WXGTK20__
|
||||
gboolean * WXUNUSED(whatever),
|
||||
#endif
|
||||
gpointer user_data )
|
||||
{
|
||||
// ensure that the menu appears entirely on screen
|
||||
GtkRequisition req;
|
||||
gtk_widget_get_child_requisition(GTK_WIDGET(menu), &req);
|
||||
|
||||
wxSize sizeScreen = wxGetDisplaySize();
|
||||
wxPoint *pos = (wxPoint*)user_data;
|
||||
|
||||
gint xmax = sizeScreen.x - req.width,
|
||||
ymax = sizeScreen.y - req.height;
|
||||
|
||||
*x = pos->x < xmax ? pos->x : xmax;
|
||||
*y = pos->y < ymax ? pos->y : ymax;
|
||||
}
|
||||
|
||||
bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y )
|
||||
{
|
||||
wxCHECK_MSG( m_widget != NULL, false, wxT("invalid window") );
|
||||
|
||||
wxCHECK_MSG( menu != NULL, false, wxT("invalid popup-menu") );
|
||||
|
||||
// NOTE: if you change this code, you need to update
|
||||
// the same code in taskbar.cpp as well. This
|
||||
// is ugly code duplication, I know.
|
||||
|
||||
SetInvokingWindow( menu, this );
|
||||
|
||||
menu->UpdateUI();
|
||||
|
||||
bool is_waiting = true;
|
||||
|
||||
gulong handler = 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;
|
||||
}
|
||||
|
||||
wxMenuEvent eventOpen(wxEVT_MENU_OPEN, -1, menu);
|
||||
DoCommonMenuCallbackCode(menu, eventOpen);
|
||||
|
||||
gtk_menu_popup(
|
||||
GTK_MENU(menu->m_menu),
|
||||
(GtkWidget *) NULL, // parent menu shell
|
||||
(GtkWidget *) NULL, // parent menu item
|
||||
posfunc, // function to position it
|
||||
userdata, // client data
|
||||
0, // button used to activate it
|
||||
#ifdef __WXGTK20__
|
||||
gtk_get_current_event_time()
|
||||
#else
|
||||
gs_timeLastClick // the time of activation
|
||||
#endif
|
||||
);
|
||||
|
||||
while (is_waiting)
|
||||
{
|
||||
gtk_main_iteration();
|
||||
}
|
||||
|
||||
gtk_signal_disconnect(GTK_OBJECT(menu->m_menu), handler);
|
||||
|
||||
wxMenuEvent eventClose(wxEVT_MENU_CLOSE, -1, menu);
|
||||
DoCommonMenuCallbackCode(menu, eventClose);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif // wxUSE_MENUS_NATIVE
|
||||
|
||||
|
@ -4412,120 +4412,6 @@ bool wxWindowGTK::SetBackgroundStyle(wxBackgroundStyle style)
|
||||
return true;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Pop-up menu stuff
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#if wxUSE_MENUS_NATIVE
|
||||
|
||||
extern "C" WXDLLIMPEXP_CORE
|
||||
void gtk_pop_hide_callback( GtkWidget *WXUNUSED(widget), bool* is_waiting )
|
||||
{
|
||||
*is_waiting = FALSE;
|
||||
}
|
||||
|
||||
WXDLLIMPEXP_CORE void SetInvokingWindow( wxMenu *menu, wxWindow* win )
|
||||
{
|
||||
menu->SetInvokingWindow( win );
|
||||
|
||||
wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst();
|
||||
while (node)
|
||||
{
|
||||
wxMenuItem *menuitem = node->GetData();
|
||||
if (menuitem->IsSubMenu())
|
||||
{
|
||||
SetInvokingWindow( menuitem->GetSubMenu(), win );
|
||||
}
|
||||
|
||||
node = node->GetNext();
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" WXDLLIMPEXP_CORE
|
||||
void wxPopupMenuPositionCallback( GtkMenu *menu,
|
||||
gint *x, gint *y,
|
||||
#ifdef __WXGTK20__
|
||||
gboolean * WXUNUSED(whatever),
|
||||
#endif
|
||||
gpointer user_data )
|
||||
{
|
||||
// ensure that the menu appears entirely on screen
|
||||
GtkRequisition req;
|
||||
gtk_widget_get_child_requisition(GTK_WIDGET(menu), &req);
|
||||
|
||||
wxSize sizeScreen = wxGetDisplaySize();
|
||||
wxPoint *pos = (wxPoint*)user_data;
|
||||
|
||||
gint xmax = sizeScreen.x - req.width,
|
||||
ymax = sizeScreen.y - req.height;
|
||||
|
||||
*x = pos->x < xmax ? pos->x : xmax;
|
||||
*y = pos->y < ymax ? pos->y : ymax;
|
||||
}
|
||||
|
||||
bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y )
|
||||
{
|
||||
wxCHECK_MSG( m_widget != NULL, false, wxT("invalid window") );
|
||||
|
||||
wxCHECK_MSG( menu != NULL, false, wxT("invalid popup-menu") );
|
||||
|
||||
// NOTE: if you change this code, you need to update
|
||||
// the same code in taskbar.cpp as well. This
|
||||
// is ugly code duplication, I know.
|
||||
|
||||
SetInvokingWindow( menu, this );
|
||||
|
||||
menu->UpdateUI();
|
||||
|
||||
bool is_waiting = true;
|
||||
|
||||
gulong handler = 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
|
||||
posfunc, // function to position it
|
||||
userdata, // client data
|
||||
0, // button used to activate it
|
||||
#ifdef __WXGTK20__
|
||||
gtk_get_current_event_time()
|
||||
#else
|
||||
gs_timeLastClick // the time of activation
|
||||
#endif
|
||||
);
|
||||
|
||||
while (is_waiting)
|
||||
{
|
||||
gtk_main_iteration();
|
||||
}
|
||||
|
||||
gtk_signal_disconnect(GTK_OBJECT(menu->m_menu), handler);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif // wxUSE_MENUS_NATIVE
|
||||
|
||||
#if wxUSE_DRAG_AND_DROP
|
||||
|
||||
void wxWindowGTK::SetDropTarget( wxDropTarget *dropTarget )
|
||||
|
Loading…
Reference in New Issue
Block a user