X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/822cf31c2799fc5c68f7ceaabd64f5bc82bf3409..b931414d91c7240ae42a67b9fc75e18d93aff721:/src/gtk1/window.cpp?ds=sidebyside diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index ad92e20c40..1f90bd83f2 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -56,7 +56,7 @@ #include "wx/thread.h" #endif -#include +#include "wx/math.h" #include #include "wx/gtk/private.h" @@ -960,6 +960,7 @@ static void wxFillOtherKeyEventFields(wxKeyEvent& event, gdk_window_get_pointer(gdk_event->window, &x, &y, &state); event.SetTimestamp( gdk_event->time ); + event.SetId(win->GetId()); event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK) != 0; event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK) != 0; event.m_altDown = (gdk_event->state & GDK_MOD1_MASK) != 0; @@ -1692,21 +1693,6 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, // a chance to correct this win->FixUpMouseEvent(widget, event.m_x, event.m_y); - if ( event_type == wxEVT_RIGHT_DOWN ) - { - // generate a "context menu" event: this is similar to right mouse - // click under many GUIs except that it is generated differently - // (right up under MSW, ctrl-click under Mac, right down here) and - // - // (a) it's a command event and so is propagated to the parent - // (b) under MSW it can be generated from kbd too - // (c) it uses screen coords (because of (a)) - wxContextMenuEvent evtCtx(wxEVT_CONTEXT_MENU, - win->GetId(), - win->ClientToScreen(event.GetPosition())); - (void)win->GetEventHandler()->ProcessEvent(evtCtx); - } - // find the correct window to send the event too: it may be a different one // from the one which got it at GTK+ level because some control don't have // their own X window and thus cannot get any events. @@ -1735,6 +1721,23 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, return TRUE; } + if (event_type == wxEVT_RIGHT_DOWN) + { + // generate a "context menu" event: this is similar to right mouse + // click under many GUIs except that it is generated differently + // (right up under MSW, ctrl-click under Mac, right down here) and + // + // (a) it's a command event and so is propagated to the parent + // (b) under some ports it can be generated from kbd too + // (c) it uses screen coords (because of (a)) + wxContextMenuEvent evtCtx( + wxEVT_CONTEXT_MENU, + win->GetId(), + win->ClientToScreen(event.GetPosition())); + evtCtx.SetEventObject(win); + return win->GetEventHandler()->ProcessEvent(evtCtx); + } + return FALSE; } @@ -1927,7 +1930,20 @@ static gint gtk_window_wheel_callback (GtkWidget * widget, return FALSE; } -#endif + +//----------------------------------------------------------------------------- +// "popup-menu" +//----------------------------------------------------------------------------- +static gboolean wxgtk_window_popup_menu_callback(GtkWidget*, wxWindowGTK* win) +{ + wxContextMenuEvent event( + wxEVT_CONTEXT_MENU, + win->GetId(), + wxPoint(-1, -1)); + event.SetEventObject(win); + return win->GetEventHandler()->ProcessEvent(event); +} +#endif // __WXGTK20__ //----------------------------------------------------------------------------- // "focus_in_event" @@ -2906,6 +2922,8 @@ void wxWindowGTK::ConnectWidget( GtkWidget *widget ) #ifdef __WXGTK20__ gtk_signal_connect( GTK_OBJECT(widget), "scroll_event", GTK_SIGNAL_FUNC(gtk_window_wheel_callback), (gpointer)this ); + g_signal_connect(widget, "popup_menu", + G_CALLBACK(wxgtk_window_popup_menu_callback), this); #endif gtk_signal_connect( GTK_OBJECT(widget), "enter_notify_event", @@ -3332,7 +3350,7 @@ bool wxWindowGTK::Show( bool show ) gtk_widget_hide( m_widget ); wxShowEvent eventShow(GetId(), show); - eventShow.m_eventObject = this; + eventShow.SetEventObject(this); GetEventHandler()->ProcessEvent(eventShow); @@ -4219,9 +4237,10 @@ void gtk_pop_hide_callback( GtkWidget *WXUNUSED(widget), bool* is_waiting ) *is_waiting = FALSE; } -static void SetInvokingWindow( wxMenu *menu, wxWindowGTK *win ) +void SetInvokingWindow( wxMenu *menu, wxWindow* win ) { menu->SetInvokingWindow( win ); + wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst(); while (node) { @@ -4262,6 +4281,10 @@ bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y ) 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();