]> git.saurik.com Git - wxWidgets.git/commitdiff
use "event" signal emission hook to install idle handler for many events
authorPaul Cornett <paulcor@bullseye.com>
Sat, 26 Aug 2006 22:07:45 +0000 (22:07 +0000)
committerPaul Cornett <paulcor@bullseye.com>
Sat, 26 Aug 2006 22:07:45 +0000 (22:07 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40854 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

12 files changed:
src/gtk/app.cpp
src/gtk/dnd.cpp
src/gtk/fontdlg.cpp
src/gtk/glcanvas.cpp
src/gtk/listbox.cpp
src/gtk/minifram.cpp
src/gtk/notebook.cpp
src/gtk/radiobox.cpp
src/gtk/scrolbar.cpp
src/gtk/tbargtk.cpp
src/gtk/toplevel.cpp
src/gtk/window.cpp

index b6e5363c0155b3b7e3b9285dbced55859f67b495..7422385af052edf46a3a6d2065e730593c7804f8 100644 (file)
@@ -184,6 +184,16 @@ void wxApp::WakeUpIdle()
 extern "C"
 {
 
+// One-shot emission hook for "event" signal, to install idle handler.
+// This will be called when the "event" signal is issued on any GtkWidget object.
+static gboolean
+event_emission_hook(GSignalInvocationHint*, guint, const GValue*, gpointer)
+{
+    wxapp_install_idle_handler();
+    // remove hook
+    return false;
+}
+
 static gint wxapp_idle_callback( gpointer WXUNUSED(data) )
 {
     if (!wxTheApp)
@@ -222,6 +232,13 @@ static gint wxapp_idle_callback( gpointer WXUNUSED(data) )
     // Release lock again
     gdk_threads_leave();
 
+    if (!moreIdles)
+    {
+        // add emission hook for "event" signal, to re-install idle handler when needed
+        guint sig_id = g_signal_lookup("event", GTK_TYPE_WIDGET);
+        g_signal_add_emission_hook(sig_id, 0, event_emission_hook, NULL, NULL);
+    }
+
     // Return FALSE if no more idle events are to be sent
     return moreIdles;
 }
index 2d234e0f9217644224ead3c9aaf4fe19e44fd064..aadec6a638c546ff0a457e5883c62fd409bf2509 100644 (file)
@@ -706,8 +706,7 @@ extern "C" {
 static gint
 gtk_dnd_window_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *WXUNUSED(event), wxDropSource *source )
 {
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     source->GiveFeedback( ConvertFromGTK(source->m_dragContext->action) );
 
index 61a204f1e1a8502c6203f4f2aec08b6e8b13067b..8c6f452f53a9cca4a38a99c613a9d73af7015a5b 100644 (file)
@@ -32,8 +32,7 @@ extern "C" {
 static
 bool gtk_fontdialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxDialog *win )
 {
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
 /*
     printf( "OnDelete from " );
index 1a49e90d9024b5aef1caee4c0625ff34f95bef48..c0969bd6e09d987a1aa222893d73718b1bdbd311 100644 (file)
@@ -235,8 +235,7 @@ extern "C" {
 static void
 gtk_glwindow_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gdk_event, wxGLCanvas *win )
 {
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     win->m_exposed = true;
 
index 5d46ab79ceea95c6c20443f51232841bfc056370..fae6eb8e796de3591b5c5e33787cabd6c88f3121 100644 (file)
@@ -157,7 +157,7 @@ gtk_listbox_button_press_callback( GtkWidget *widget,
                                    GdkEventButton *gdk_event,
                                    wxListBox *listbox )
 {
-    if (g_isIdle) wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (g_blockEventsOnDrag) return FALSE;
     if (g_blockEventsOnScroll) return FALSE;
@@ -203,7 +203,7 @@ gtk_listbox_key_press_callback( GtkWidget *widget,
                                 GdkEventKey *gdk_event,
                                 wxListBox *listbox )
 {
-    if (g_isIdle) wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (g_blockEventsOnDrag) return FALSE;
 
index e915efca95bdebc0933af78c4b70a31d8df4f10a..b98eceb5e732504612d8173492dfc14a151bc4ac 100644 (file)
@@ -64,7 +64,7 @@ static wxColor LightContrastColour(const wxColour& c)
 extern "C" {
 static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxMiniFrame *win )
 {
-    if (g_isIdle) wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (!win->m_hasVMT) return;
     if (gdk_event->count > 0) return;
@@ -121,7 +121,7 @@ static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *g
 extern "C" {
 static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxMiniFrame *win )
 {
-    if (g_isIdle) wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (!win->m_hasVMT) return FALSE;
     if (g_blockEventsOnDrag) return TRUE;
@@ -207,7 +207,7 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
 extern "C" {
 static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxMiniFrame *win )
 {
-    if (g_isIdle) wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (!win->m_hasVMT) return FALSE;
     if (g_blockEventsOnDrag) return TRUE;
@@ -242,8 +242,7 @@ extern "C" {
 static gboolean
 gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, wxMiniFrame *win )
 {
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (!win->m_hasVMT) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
@@ -262,8 +261,7 @@ extern "C" {
 static gint
 gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion *gdk_event, wxMiniFrame *win )
 {
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (!win->m_hasVMT) return FALSE;
     if (g_blockEventsOnDrag) return TRUE;
index 756cd7f21b73e52e1d612e7aafb4bade2fde150c..c82ea26a997b96380e717a11fb55238efbdf5714 100644 (file)
@@ -192,8 +192,7 @@ gtk_notebook_key_press_callback( GtkWidget   *widget,
                                  GdkEventKey *gdk_event,
                                  wxNotebook  *notebook )
 {
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (!notebook->m_hasVMT) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
index 9117e587aca3ab6541b156d8e2e353ab75eac4a9..8d399e33e4a56490a58b2f8038013a03d115bc25 100644 (file)
@@ -82,8 +82,7 @@ static void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioBo
 extern "C" {
 static gint gtk_radiobox_keypress_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxRadioBox *rb )
 {
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (!rb->m_hasVMT) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
index f1d1efc384dd28e1aac76e68a132a227f4545280..00ea88097329bf6c5205f06d55c51726004bc47c 100644 (file)
@@ -57,7 +57,7 @@ extern "C" {
 static gboolean
 gtk_button_press_event(GtkRange*, GdkEventButton*, wxScrollBar* win)
 {
-    if (g_isIdle) wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     win->m_mouseButtonDown = true;
     return false;
@@ -98,8 +98,7 @@ extern "C" {
 static gboolean
 gtk_button_release_event(GtkRange* range, GdkEventButton*, wxScrollBar* win)
 {
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     win->m_mouseButtonDown = false;
     // If thumb tracking
index 2bb36714e9955ef0ca13a1be90831c19d04d7e98..cd573461e5e620b10fe57027042c5089d678e8c9 100644 (file)
@@ -204,7 +204,7 @@ static gint gtk_toolbar_tool_callback( GtkWidget *WXUNUSED(widget),
                                        GdkEventCrossing *gdk_event,
                                        wxToolBarTool *tool )
 {
-    if (g_isIdle) wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (g_blockEventsOnDrag) return TRUE;
 
index 2584ec651203cfc39e576e20830964fa80e7bd4a..c6ef11f6812a853a26132c763227f92a785f4d12 100644 (file)
@@ -111,8 +111,7 @@ static gboolean gtk_frame_focus_in_callback( GtkWidget *widget,
                                          GdkEvent *WXUNUSED(event),
                                          wxTopLevelWindowGTK *win )
 {
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     switch ( g_sendActivateEvent )
     {
@@ -173,8 +172,7 @@ static gboolean gtk_frame_focus_out_callback( GtkWidget *widget,
                                           GdkEventFocus *WXUNUSED(gdk_event),
                                           wxTopLevelWindowGTK *win )
 {
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     // if the focus goes out of our app alltogether, OnIdle() will send
     // wxActivateEvent, otherwise gtk_window_focus_in_callback() will reset
@@ -257,8 +255,7 @@ gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget),
                            GdkEvent *WXUNUSED(event),
                            wxTopLevelWindowGTK *win )
 {
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (win->IsEnabled() &&
         (g_openDialogs == 0 || (win->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) ||
@@ -280,8 +277,7 @@ gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget),
                               GdkEventConfigure *WXUNUSED(event),
                               wxTopLevelWindowGTK *win )
 {
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (!win->m_hasVMT || !win->IsShown())
         return FALSE;
index c52acc624112c934fd7d6717f547c65dcbb21ba7..00d1a6c61765f0dcffb96b04e343669edd7a3be7 100644 (file)
@@ -480,8 +480,7 @@ gtk_window_expose_callback( GtkWidget *widget,
 {
     DEBUG_MAIN_THREAD
 
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     // This callback gets called in drawing-idle time under
     // GTK 2.0, so we don't need to defer anything to idle
@@ -991,8 +990,7 @@ gtk_window_key_press_callback( GtkWidget *widget,
 {
     DEBUG_MAIN_THREAD
 
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (!win->m_hasVMT)
         return FALSE;
@@ -1244,8 +1242,7 @@ gtk_window_key_release_callback( GtkWidget *widget,
 {
     DEBUG_MAIN_THREAD
 
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (!win->m_hasVMT)
         return FALSE;
@@ -1414,8 +1411,7 @@ int wxWindowGTK::GTKCallbackCommonPrologue(GdkEventAny *event) const
 {
     DEBUG_MAIN_THREAD
 
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (!m_hasVMT)
         return FALSE;
@@ -1778,8 +1774,7 @@ window_scroll_event(GtkWidget*, GdkEventScroll* gdk_event, wxWindow* win)
 {
     DEBUG_MAIN_THREAD
 
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (gdk_event->direction != GDK_SCROLL_UP &&
         gdk_event->direction != GDK_SCROLL_DOWN)
@@ -1837,8 +1832,7 @@ gtk_window_focus_in_callback( GtkWidget *widget,
 {
     DEBUG_MAIN_THREAD
 
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (win->m_imData)
         gtk_im_context_focus_in(win->m_imData->context);
@@ -1895,8 +1889,7 @@ gtk_window_focus_out_callback( GtkWidget *widget,
 {
     DEBUG_MAIN_THREAD
 
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (win->m_imData)
         gtk_im_context_focus_out(win->m_imData->context);
@@ -2074,8 +2067,7 @@ gtk_scrollbar_button_press_event(GtkRange*, GdkEventButton*, wxWindow* win)
 {
     DEBUG_MAIN_THREAD
 
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     g_blockEventsOnScroll = true;
     win->m_mouseButtonDown = true;