From 33c0d0ed7516b743a59969bc0c6d069735e39d7a Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Mon, 27 Feb 2006 09:16:28 +0000 Subject: [PATCH] Make wxTransientPopupWindow ignore button down events which have been sent before or at the same time as the control creation time so that these evens don't make the control disappear again. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37747 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/popupwin.h | 3 +++ src/gtk/popupwin.cpp | 21 +++++++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/include/wx/gtk/popupwin.h b/include/wx/gtk/popupwin.h index b35eb73004..b32e4684b5 100644 --- a/include/wx/gtk/popupwin.h +++ b/include/wx/gtk/popupwin.h @@ -35,6 +35,9 @@ public: // -------------- virtual void OnInternalIdle(); + + // GTK time when connecting to button_press signal + wxUint32 m_time; protected: diff --git a/src/gtk/popupwin.cpp b/src/gtk/popupwin.cpp index 0676e6e639..91ed9b009b 100644 --- a/src/gtk/popupwin.cpp +++ b/src/gtk/popupwin.cpp @@ -39,13 +39,16 @@ static gint gtk_popup_button_press (GtkWidget *widget, GdkEvent *gdk_event, wxPo { GtkWidget *child = gtk_get_event_widget (gdk_event); - /* We don't ask for button press events on the grab widget, so - * if an event is reported directly to the grab widget, it must - * be on a window outside the application (and thus we remove - * the popup window). Otherwise, we check if the widget is a child - * of the grab widget, and only remove the popup window if it - * is not. - */ + /* Ignore events sent out before we connected to the signal */ + if (win->m_time >= ((GdkEventButton*)gdk_event)->time) + return FALSE; + + /* We don't ask for button press events on the grab widget, so + * if an event is reported directly to the grab widget, it must + * be on a window outside the application (and thus we remove + * the popup window). Otherwise, we check if the widget is a child + * of the grab widget, and only remove the popup window if it + * is not. */ if (child != widget) { while (child) @@ -75,7 +78,7 @@ static gint gtk_dialog_focus_callback( GtkWidget *widget, GtkDirectionType WXUNU if (g_isIdle) wxapp_install_idle_handler(); - // This disables GTK's tab traversal + /* This disables GTK's tab traversal */ g_signal_stop_emission_by_name (widget, "focus"); return TRUE; } @@ -214,6 +217,8 @@ bool wxPopupWindow::Create( wxWindow *parent, int style ) g_signal_connect (m_widget, "focus", G_CALLBACK (gtk_dialog_focus_callback), this); + m_time = gtk_get_current_event_time(); + g_signal_connect (m_widget, "button_press_event", G_CALLBACK (gtk_popup_button_press), this); -- 2.47.2