bool wxTaskBarIconAreaBase::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 window.cpp as well. This // is ugly code duplication, I know, SetInvokingWindow( menu, this ); menu->UpdateUI( m_invokingWindow ); 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 gtk_get_current_event_time() ); while (is_waiting) { gtk_main_iteration(); } gtk_signal_disconnect(GTK_OBJECT(menu->m_menu), handler); return true; }
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(); } }
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 wxGtkTimeLastClick // the time of activation ); 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; }