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:
121
src/gtk/menu.cpp
121
src/gtk/menu.cpp
@@ -1522,3 +1522,124 @@ static wxString GetGtkHotKey( const wxMenuItem& item )
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif // wxUSE_ACCEL
|
#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;
|
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
|
#if wxUSE_DRAG_AND_DROP
|
||||||
|
|
||||||
void wxWindowGTK::SetDropTarget( wxDropTarget *dropTarget )
|
void wxWindowGTK::SetDropTarget( wxDropTarget *dropTarget )
|
||||||
|
@@ -1522,3 +1522,124 @@ static wxString GetGtkHotKey( const wxMenuItem& item )
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif // wxUSE_ACCEL
|
#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;
|
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
|
#if wxUSE_DRAG_AND_DROP
|
||||||
|
|
||||||
void wxWindowGTK::SetDropTarget( wxDropTarget *dropTarget )
|
void wxWindowGTK::SetDropTarget( wxDropTarget *dropTarget )
|
||||||
|
Reference in New Issue
Block a user