]> git.saurik.com Git - wxWidgets.git/commitdiff
New idle handling. Only that.
authorRobert Roebling <robert@roebling.de>
Tue, 27 Apr 1999 19:32:19 +0000 (19:32 +0000)
committerRobert Roebling <robert@roebling.de>
Tue, 27 Apr 1999 19:32:19 +0000 (19:32 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2295 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

46 files changed:
src/gtk/app.cpp
src/gtk/bmpbuttn.cpp
src/gtk/button.cpp
src/gtk/checkbox.cpp
src/gtk/choice.cpp
src/gtk/combobox.cpp
src/gtk/data.cpp
src/gtk/dialog.cpp
src/gtk/filedlg.cpp
src/gtk/frame.cpp
src/gtk/listbox.cpp
src/gtk/mdi.cpp
src/gtk/menu.cpp
src/gtk/minifram.cpp
src/gtk/notebook.cpp
src/gtk/radiobox.cpp
src/gtk/radiobut.cpp
src/gtk/scrolbar.cpp
src/gtk/slider.cpp
src/gtk/spinbutt.cpp
src/gtk/tbargtk.cpp
src/gtk/textctrl.cpp
src/gtk/window.cpp
src/gtk1/app.cpp
src/gtk1/bmpbuttn.cpp
src/gtk1/button.cpp
src/gtk1/checkbox.cpp
src/gtk1/choice.cpp
src/gtk1/combobox.cpp
src/gtk1/data.cpp
src/gtk1/dialog.cpp
src/gtk1/filedlg.cpp
src/gtk1/frame.cpp
src/gtk1/listbox.cpp
src/gtk1/mdi.cpp
src/gtk1/menu.cpp
src/gtk1/minifram.cpp
src/gtk1/notebook.cpp
src/gtk1/radiobox.cpp
src/gtk1/radiobut.cpp
src/gtk1/scrolbar.cpp
src/gtk1/slider.cpp
src/gtk1/spinbutt.cpp
src/gtk1/tbargtk.cpp
src/gtk1/textctrl.cpp
src/gtk1/window.cpp

index e3bb20d00d55dc2ed4241f3bf1035b3f4c692e08..315d37194cde1ba9dc52d82dfe9b992ccbff8276 100644 (file)
@@ -51,6 +51,7 @@ extern wxList *wxPendingEvents;
 extern wxCriticalSection *wxPendingEventsLocker;
 #endif
 extern wxResourceCache *wxTheResourceCache;
+extern bool g_isIdle;
 
 unsigned char g_palette[64*3] =
 {
@@ -135,7 +136,7 @@ void wxExit()
     gtk_main_quit();
 }
 
-// forward decl
+/* forward declaration */
 gint wxapp_idle_callback( gpointer WXUNUSED(data) );
 
 bool wxYield()
@@ -151,15 +152,62 @@ bool wxYield()
         win->OnInternalIdle();
     }
 
-    // We need to temporarily remove idle callbacks or the loop will
-    // never finish.
+    if (wxTheApp->m_idleTag)
+    {
+        /* We need to temporarily remove idle callbacks or the loop will
+           never finish. */
+        gtk_idle_remove( wxTheApp->m_idleTag );
+        wxTheApp->m_idleTag = 0;
+
+        while (gtk_events_pending())
+            gtk_main_iteration();
+
+        /* re-add idle handler */
+        wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
+    }
+    else
+    {
+        while (gtk_events_pending())
+            gtk_main_iteration();
+    }
+    
+    return TRUE;
+}
+
+gint wxapp_idle_callback( gpointer WXUNUSED(data) )
+{
+    if (!wxTheApp) return TRUE;
+    
+    /* sent idle event to all who request them */
+    while (wxTheApp->ProcessIdle()) { }
+    
+    /* we don't want any more idle events until the next event is
+       sent to wxGTK */
     gtk_idle_remove( wxTheApp->m_idleTag );
+    wxTheApp->m_idleTag = 0;
+
+    /* indicate that we are now in idle mode - even so deeply
+       in idle mode that we don't get any idle events anymore.
+       this is like wxMSW where an idle event is sent only
+       once each time after the event queue has been completely
+       emptied */
+    g_isIdle = TRUE;
+    
+/*  wxMutexGuiLeave();
+    wxUsleep(10);
+    wxMutexGuiEnter(); */
 
-    while (gtk_events_pending())
-        gtk_main_iteration();
+    return TRUE;
+}
+
+void wxapp_install_idle_handler()
+{
+    /* this routine gets called by all event handlers
+       indicating that the idle is over. */
 
     wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
-    return TRUE;
+    
+    g_isIdle = FALSE;
 }
 
 //-----------------------------------------------------------------------------
@@ -172,22 +220,6 @@ BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
     EVT_IDLE(wxApp::OnIdle)
 END_EVENT_TABLE()
 
-gint wxapp_idle_callback( gpointer WXUNUSED(data) )
-{
-    if (wxTheApp)
-    {
-        while (wxTheApp->ProcessIdle())
-        {
-        }
-    }
-
-    wxMutexGuiLeave();
-    wxUsleep(10);
-    wxMutexGuiEnter();
-
-    return TRUE;
-}
-
 wxApp::wxApp()
 {
     wxTheApp = this;
@@ -202,7 +234,7 @@ wxApp::wxApp()
 
 wxApp::~wxApp()
 {
-    gtk_idle_remove( m_idleTag );
+    if (m_idleTag) gtk_idle_remove( m_idleTag );
 
     if (m_colorCube) free(m_colorCube);
 }
@@ -255,14 +287,14 @@ bool wxApp::OnInitGui()
                 int bb = (b << 3) | (b >> 2);
 
                 GdkColor *colors = cmap->colors;
-                int max = 3 * (65536);
+                int max = 3 * 65536;
                 int index = -1;
 
                 for (int i = 0; i < cmap->size; i++)
                 {
                     int rdiff = ((rr << 8) - colors[i].red);
-                    int gdiff = ((gg << 8)- colors[i].green);
-                    int bdiff = ((bb << 8)- colors[i].blue);
+                    int gdiff = ((gg << 8) - colors[i].green);
+                    int bdiff = ((bb << 8) - colors[i].blue);
                     int sum = ABS (rdiff) + ABS (gdiff) + ABS (bdiff);
                     if (sum < max) { index = i; max = sum; }
                 }
@@ -272,7 +304,6 @@ bool wxApp::OnInitGui()
         }
     }
 
-
     return TRUE;
 }
 
@@ -378,7 +409,7 @@ bool wxApp::Initialized()
 
 bool wxApp::Pending()
 {
-    return gtk_events_pending();
+    return (gtk_events_pending() > 0);
 }
 
 void wxApp::Dispatch()
index c6d4499cef1b9b68745feef2757d23421fd9a263..dc24fa7301f2a18fdc6e7765fe28918650737b78 100644 (file)
 
 class wxBitmapButton;
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -34,6 +41,8 @@ extern bool   g_blockEventsOnDrag;
 
 static void gtk_bmpbutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxBitmapButton *button )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!button->HasVMT()) return;
     if (g_blockEventsOnDrag) return;
   
index 07a3dac10842b7f597f25377a4f998f5b4f41a90..1347e6ddaed27cb8438e00bc18884c8aea50f050 100644 (file)
 
 class wxButton;
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -34,12 +41,14 @@ extern bool   g_blockEventsOnDrag;
 
 static void gtk_button_clicked_callback( GtkWidget *WXUNUSED(widget), wxButton *button )
 {
-  if (!button->HasVMT()) return;
-  if (g_blockEventsOnDrag) return;
+    if (g_isIdle) wxapp_install_idle_handler();
+
+    if (!button->HasVMT()) return;
+    if (g_blockEventsOnDrag) return;
   
-  wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, button->GetId());
-  event.SetEventObject(button);
-  button->GetEventHandler()->ProcessEvent(event);
+    wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, button->GetId());
+    event.SetEventObject(button);
+    button->GetEventHandler()->ProcessEvent(event);
 }
 
 //-----------------------------------------------------------------------------
@@ -54,7 +63,7 @@ wxButton::wxButton()
 
 wxButton::~wxButton()
 {
-  if (m_clientData) delete m_clientData;
+    if (m_clientData) delete m_clientData;
 }
 
 bool wxButton::Create(  wxWindow *parent, wxWindowID id, const wxString &label,
index 8cda3d112bfc782c4d11c1e6877ad997cbfdc480..1811807ab04ac7992f496d892926ccdf5474c85c 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -29,6 +36,8 @@ extern bool   g_blockEventsOnDrag;
 
 static void gtk_checkbox_clicked_callback( GtkWidget *WXUNUSED(widget), wxCheckBox *cb )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!cb->HasVMT()) return;
 
     if (cb->m_blockFirstEvent)
index ba049f6447090e75e04c9b5741e7b5a20b552e49..41ef1aba6f6b15d5d3ef292a3524fee49ba797a2 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -29,17 +36,17 @@ extern bool   g_blockEventsOnDrag;
 
 static void gtk_choice_clicked_callback( GtkWidget *WXUNUSED(widget), wxChoice *choice )
 {
-  if (!choice->HasVMT())
-      return;
+    if (g_isIdle) wxapp_install_idle_handler();
+
+    if (!choice->HasVMT()) return;
 
-  if (g_blockEventsOnDrag)
-      return;
+    if (g_blockEventsOnDrag) return;
 
-  wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, choice->GetId() );
-  event.SetInt( choice->GetSelection() );
-  event.SetString( choice->GetStringSelection() );
-  event.SetEventObject(choice);
-  choice->GetEventHandler()->ProcessEvent(event);
+    wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, choice->GetId() );
+    event.SetInt( choice->GetSelection() );
+    event.SetString( choice->GetStringSelection() );
+    event.SetEventObject(choice);
+    choice->GetEventHandler()->ProcessEvent(event);
 }
 
 //-----------------------------------------------------------------------------
index 63162e8ed0f6cc2ab545790dde7d4846c7d8c406..cb5a74135aea13b0d37f14fc84018c6b6a00b854 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -31,11 +38,11 @@ extern bool   g_blockEventsOnDrag;
 static void
 gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo )
 {
-    if (!combo->HasVMT())
-        return;
+    if (g_isIdle) wxapp_install_idle_handler();
 
-    if (g_blockEventsOnDrag)
-        return;
+    if (!combo->HasVMT()) return;
+
+    if (g_blockEventsOnDrag) return;
 
     if (combo->m_alreadySent)
     {
@@ -60,6 +67,8 @@ gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo )
 static void
 gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+    
     wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, combo->GetId() );
     event.SetString( combo->GetValue() );
     event.SetEventObject( combo );
index 37f4f0006c9fcffafb2ef0ad9f290fa0f548b489..b2fdae961cee5d1ba80d3515cb98271ab6e1b06b 100644 (file)
@@ -54,6 +54,10 @@ bool g_blockEventsOnDrag = FALSE;
 /* Don't allow mouse event propagation during scroll */
 bool g_blockEventsOnScroll = FALSE;
 
+/* TRUE when the message queue is empty. this gets set to
+   FALSE by all event callbacks before anything else is done */
+bool g_isIdle = FALSE;
+
 /* Message Strings for Internationalization */
 char **wx_msg_str = (char**)NULL;
 
index dde6539b1671054b6070831662b0709cf8ec73fe..b8adf30bdab00c9de42d84963ac104d0dfeebd07 100644 (file)
 #include "gtk/gtk.h"
 #include "wx/gtk/win_gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
+//-----------------------------------------------------------------------------
+// data
 //-----------------------------------------------------------------------------
 
 extern wxList wxPendingDelete;
@@ -29,6 +38,8 @@ extern wxList wxPendingDelete;
 
 bool gtk_dialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxDialog *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
 /*
     printf( "OnDelete from " );
     if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -47,6 +58,8 @@ bool gtk_dialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED
 
 static void gtk_dialog_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxDialog *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
 
 /*
@@ -70,6 +83,8 @@ static void gtk_dialog_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation
 
 static gint gtk_dialog_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *event, wxDialog *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
 
     win->m_x = event->x;
@@ -92,6 +107,8 @@ static gint gtk_dialog_configure_callback( GtkWidget *WXUNUSED(widget), GdkEvent
 static gint 
 gtk_dialog_realized_callback( GtkWidget *widget, wxDialog *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     /* all this is for Motif Window Manager "hints" and is supposed to be
        recognized by other WM as well. not tested. */
     long decor = (long) GDK_DECOR_ALL;
index fa6d087c991fbaceffa462e5bf55c798e5b445c8..bd7d405395ecd6d1b15850e71d894a0af274ca0e 100644 (file)
 
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // "delete_event"
 //-----------------------------------------------------------------------------
@@ -25,6 +32,8 @@
 static
 bool gtk_filedialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxDialog *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
 /*
     printf( "OnDelete from " );
     if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -44,6 +53,8 @@ bool gtk_filedialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUN
 static
 void gtk_filedialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFileDialog *dialog )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     int style = dialog->GetStyle();
 
     GtkFileSelection *filedlg = GTK_FILE_SELECTION(dialog->m_widget);
@@ -85,6 +96,8 @@ void gtk_filedialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFileDialog *dial
 static
 void gtk_filedialog_cancel_callback( GtkWidget *WXUNUSED(w), wxFileDialog *dialog )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
     event.SetEventObject( dialog );
     dialog->GetEventHandler()->ProcessEvent( event );
index 38b56e56d9e0283228d9b6d33a875bf0e8c8fbdd..f402313c361d4c033f0ab5e1434406c8b027ac3c 100644 (file)
@@ -33,6 +33,13 @@ const int wxMENU_HEIGHT    = 27;
 const int wxSTATUS_HEIGHT  = 25;
 const int wxPLACE_HOLDER   = 0;
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -45,6 +52,8 @@ extern wxList wxPendingDelete;
 
 static void gtk_frame_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
 
 /*
@@ -68,6 +77,8 @@ static void gtk_frame_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation*
 
 static gint gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
 /*
     printf( "OnDelete from " );
     if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -86,6 +97,8 @@ static gint gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WX
 
 static void gtk_menu_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     
     win->m_menuBarDetached = FALSE;
@@ -98,6 +111,8 @@ static void gtk_menu_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *
 
 static void gtk_menu_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     
     win->m_menuBarDetached = TRUE;
@@ -110,6 +125,8 @@ static void gtk_menu_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *
 
 static void gtk_toolbar_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     
     win->m_toolBarDetached = FALSE;
@@ -122,6 +139,8 @@ static void gtk_toolbar_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidge
 
 static void gtk_toolbar_detached_callback( GtkWidget *widget, GtkWidget *WXUNUSED(child), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     
     win->m_toolBarDetached = TRUE;
@@ -134,6 +153,8 @@ static void gtk_toolbar_detached_callback( GtkWidget *widget, GtkWidget *WXUNUSE
 
 static gint gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *event, wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
 
     win->m_x = event->x;
@@ -156,6 +177,8 @@ static gint gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventC
 static gint 
 gtk_frame_realized_callback( GtkWidget *widget, wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     /* all this is for Motif Window Manager "hints" and is supposed to be
        recognized by other WM as well. not tested. */
     long decor = (long) GDK_DECOR_ALL;
index 138fc38d96d1ed72ff6195f22c375807ebb055e9..e0fa8aca7eeba050e2e0e49e65020bc5f97c9956 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-------------------------------------------------------------------------
 // conditional compilation
 //-------------------------------------------------------------------------
@@ -63,6 +70,8 @@ extern bool   g_blockEventsOnScroll;
 static gint
 gtk_listbox_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxListBox *listbox )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return FALSE;
     if (g_blockEventsOnScroll) return FALSE;
 
@@ -116,6 +125,8 @@ gtk_listbox_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event,
 static gint
 gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxListBox *listbox )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return FALSE;
 
     if (!listbox->HasVMT()) return FALSE;
@@ -142,6 +153,8 @@ gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxLis
 
 static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox *listbox )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!listbox->HasVMT()) return;
     if (g_blockEventsOnDrag) return;
 
index 85eb0270c7b38ea91bf954dfc89d9de2cda875e6..064376b54c6a12a25c3692ab6a811bcf4a011cb8 100644 (file)
 
 const int wxMENU_HEIGHT = 27;
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // globals
 //-----------------------------------------------------------------------------
@@ -314,6 +321,8 @@ void wxMDIChildFrame::OnActivate( wxActivateEvent &WXUNUSED(event) )
 
 static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if ((win->m_x == alloc->x) &&
         (win->m_y == alloc->y) &&
         (win->m_width == alloc->width) &&
index dd3d6850bfcc88f9be21c885abb3fad21351a27b..5e6b4c8b03f8c6a193878ef3b32ee1e3583984d4 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // wxMenuBar
 //-----------------------------------------------------------------------------
@@ -343,6 +350,8 @@ wxString wxMenuBar::GetHelpString( int id ) const
 
 static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     int id = menu->FindMenuIdByMenuItem(widget);
 
     /* should find it for normal (not popup) menu */
@@ -392,6 +401,8 @@ static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu )
 
 static void gtk_menu_hilight_callback( GtkWidget *widget, wxMenu *menu )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     int id = menu->FindMenuIdByMenuItem(widget);
 
     wxASSERT( id != -1 ); // should find it!
@@ -424,6 +435,8 @@ static void gtk_menu_hilight_callback( GtkWidget *widget, wxMenu *menu )
 
 static void gtk_menu_nolight_callback( GtkWidget *widget, wxMenu *menu )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     int id = menu->FindMenuIdByMenuItem(widget);
 
     wxASSERT( id != -1 ); // should find it!
index ea6f98fe1a5e1dd8601bfea4b528f36311c0cf72..9b0c1f03093aa49da0ea296aeaf8daca28b6b040 100644 (file)
 #include "gdk/gdkprivate.h"
 #include "gdk/gdkx.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -56,6 +63,8 @@ static void DrawFrame( GtkWidget *widget, int x, int y, int w, int h )
 
 static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     if (gdk_event->count > 0) return;
     
@@ -73,6 +82,8 @@ static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *g
 
 static void gtk_window_own_draw_callback( GtkWidget *widget, GdkRectangle *WXUNUSED(rect), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     
     gtk_draw_shadow( widget->style, 
@@ -89,6 +100,8 @@ static void gtk_window_own_draw_callback( GtkWidget *widget, GdkRectangle *WXUNU
 
 static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxMiniFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return TRUE;
     if (g_blockEventsOnScroll) return TRUE;
@@ -124,6 +137,8 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
 
 static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxMiniFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return TRUE;
     if (g_blockEventsOnScroll) return TRUE;
@@ -155,6 +170,8 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
 
 static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion *gdk_event, wxMiniFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return TRUE;
     if (g_blockEventsOnScroll) return TRUE;
@@ -186,6 +203,8 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
 
 static void gtk_button_clicked_callback( GtkWidget *WXUNUSED(widget), wxMiniFrame *mf )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     mf->Close();
 }
 
index a7b6bd091d9085200ed6668b51ec21c380480636..a690de0dea07547663ec1ec76e1d461deb3d120e 100644 (file)
 #include "wx/gtk/win_gtk.h"
 #include "gdk/gdkkeysyms.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -86,6 +93,8 @@ static void gtk_notebook_page_change_callback(GtkNotebook *WXUNUSED(widget),
                                               gint nPage,
                                               gpointer data)
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     wxNotebook *notebook = (wxNotebook *)data;
 
     int old = notebook->GetSelection();
@@ -104,6 +113,8 @@ static void gtk_notebook_page_change_callback(GtkNotebook *WXUNUSED(widget),
 
 static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if ((win->m_x == alloc->x) &&
         (win->m_y == alloc->y) &&
         (win->m_width == alloc->width) &&
@@ -124,6 +135,8 @@ static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation*
 static gint
 gtk_notebook_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxNotebook *notebook )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return FALSE;
 
     if (!notebook->HasVMT()) return FALSE;
index 1f60b251b04ca8b3caceb083475583987887b966..e9ba1e8c5e2da7a42d9fc9cacbc07bd1442265f4 100644 (file)
 #include "gtk/gtk.h"
 #include "wx/gtk/win_gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -31,6 +38,8 @@ extern bool   g_blockEventsOnDrag;
 
 static void gtk_radiobutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxRadioBox *rb )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!rb->HasVMT()) return;
     if (g_blockEventsOnDrag) return;
 
index 8b93df7380d85888b0968d4afbe7375352002bff..9ab2906909be721ab767294c53cb61be35ff3065 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -29,6 +36,8 @@ extern bool g_blockEventsOnDrag;
 static 
 void gtk_radiobutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxRadioButton *rb )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!rb->HasVMT()) return;
   
     if (rb->m_blockFirstEvent)
index 39aba4ce4698c1624b0b0010966f4628a85f11ce..5c9ddc9eb554b0439d3ba5adc7c4b63dad8cabf0 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -32,6 +39,8 @@ extern bool   g_blockEventsOnScroll;
 
 static void gtk_scrollbar_callback( GtkWidget *WXUNUSED(widget), wxScrollBar *win )
 { 
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     if (g_blockEventsOnDrag) return;
     
@@ -83,10 +92,12 @@ static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget),
                                                  GdkEventButton *WXUNUSED(gdk_event), 
                                                 wxScrollBar *win )
 {
-  win->m_isScrolling = TRUE;
+    if (g_isIdle) wxapp_install_idle_handler();
+
+    win->m_isScrolling = TRUE;
 //  g_blockEventsOnScroll = TRUE;  doesn't work in DialogEd
   
-  return FALSE;
+    return FALSE;
 }
 
 //-----------------------------------------------------------------------------
@@ -97,6 +108,8 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *WXUNUSED(widget),
                                                    GdkEventButton *WXUNUSED(gdk_event), 
                                                   wxScrollBar *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     win->m_isScrolling = FALSE;
 //  g_blockEventsOnScroll = FALSE;
   
index a9a4e9a7d33c859d4f67fc9a912c2b4bd1e008b0..3c7c1ade23184faf52ace2122df0f23083c40194 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -30,6 +37,8 @@ extern bool   g_blockEventsOnDrag;
 
 static void gtk_slider_callback( GtkWidget *WXUNUSED(widget), wxSlider *win )
 { 
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     if (g_blockEventsOnDrag) return;
     
index afbd61ee1ec1b8e51bae5b22555a212e091c9566..73f6493e81ba1801085bb6ec96184d5fce21f4d8 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -33,6 +40,8 @@ static const float sensitivity = 0.2;
 
 static void gtk_spinbutt_callback( GtkWidget *WXUNUSED(widget), wxSpinButton *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     if (g_blockEventsOnDrag) return;
 
index dfc1d7b6311d0a04e83375a7c3babf70efa2d47e..46ca5bad1f744658803834c40a7fc9a57cfa1354 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -30,6 +37,8 @@ extern bool   g_blockEventsOnDrag;
 
 static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget), wxToolBarTool *tool )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return;
     if (!tool->m_enabled) return;
 
@@ -45,6 +54,8 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget), wxToolBarTool *to
 static gint gtk_toolbar_enter_callback( GtkWidget *WXUNUSED(widget), 
   GdkEventCrossing *WXUNUSED(gdk_event), wxToolBarTool *tool )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return TRUE;
     
     /* we grey-out the tip text of disabled tool */
index bdbc8e279ffb4f649b56ad3701821dbc0c88d025..eab7ee1db8bbc225955e7df0d3575fc2bc719c49 100644 (file)
 #include "gtk/gtk.h"
 #include "gdk/gdkkeysyms.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -37,6 +44,8 @@ extern bool   g_blockEventsOnDrag;
 static void
 gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->m_hasVMT) return;
 
     win->SetModified();
@@ -54,6 +63,8 @@ gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
 static void
 gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->m_hasVMT) return;
     
     win->CalculateScrollbar();
index 6310487a741e5390a2c2dee296640cabef823ea2..c1a81398db865985e87eb149631531ef11af90a6 100644 (file)
 extern wxList     wxPendingDelete;
 extern bool       g_blockEventsOnDrag;
 extern bool       g_blockEventsOnScroll;
+extern bool       g_isIdle;
 static bool       g_capturing = FALSE;
 static wxWindow  *g_focusWindow = (wxWindow*) NULL;
 
@@ -135,6 +136,13 @@ static wxWindow  *g_focusWindow = (wxWindow*) NULL;
    the last click here */
 static guint32 gs_timeLastClick = 0;
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 #if (GTK_MINOR_VERSION > 0)
 
 //-----------------------------------------------------------------------------
@@ -231,6 +239,8 @@ static void gtk_window_own_draw_callback( GtkWidget *widget, GdkRectangle *WXUNU
 
 static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gdk_event, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
 
     win->m_updateRegion.Union( gdk_event->area.x,
@@ -260,6 +270,8 @@ static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExp
 
 static void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget), GdkRectangle *rect, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
 
     win->m_updateRegion.Union( rect->x, rect->y, rect->width, rect->height );
@@ -277,6 +289,8 @@ static void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget), GdkRectangle
 
 static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
 
@@ -456,6 +470,8 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e
 
 static gint gtk_window_key_release_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
 
@@ -572,6 +588,8 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, GdkEventKey *gdk
 
 static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
 /*
     wxPrintf( _T("1) OnButtonPress from ") );
     if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -734,6 +752,8 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
 
 static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
     if (g_blockEventsOnScroll) return FALSE;
@@ -838,6 +858,8 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
 
 static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion *gdk_event, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
     if (g_blockEventsOnScroll) return FALSE;
@@ -945,6 +967,8 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
 
 static gint gtk_window_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
 
@@ -992,6 +1016,8 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED(
 
 static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
     
@@ -1028,6 +1054,8 @@ static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEvent *WXUNUSED
 
 static gint gtk_window_enter_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
     
@@ -1078,6 +1106,8 @@ static gint gtk_window_enter_callback( GtkWidget *widget, GdkEventCrossing *gdk_
 
 static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
 
@@ -1128,6 +1158,8 @@ static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_
 
 static void gtk_window_vscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return;
 
 /*
@@ -1176,6 +1208,8 @@ static void gtk_window_vscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow *
 
 static void gtk_window_hscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return;
 
 /*
@@ -1224,6 +1258,8 @@ static void gtk_window_hscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow *
 
 static void gtk_window_vscroll_change_callback( GtkWidget *WXUNUSED(widget), wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return;
 
 /*
@@ -1249,6 +1285,8 @@ static void gtk_window_vscroll_change_callback( GtkWidget *WXUNUSED(widget), wxW
 
 static void gtk_window_hscroll_change_callback( GtkWidget *WXUNUSED(widget), wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return;
 
 /*
@@ -1276,6 +1314,8 @@ static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget),
                                                  GdkEventButton *WXUNUSED(gdk_event),
                                                  wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
 //  don't test here as we can release the mouse while being over
 //  a different window then the slider
 //
@@ -1295,6 +1335,7 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *widget,
                                                    GdkEventButton *WXUNUSED(gdk_event),
                                                    wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
 
 //  don't test here as we can release the mouse while being over
 //  a different window then the slider
@@ -1324,6 +1365,8 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *widget,
 static gint 
 gtk_window_realized_callback( GtkWidget *widget, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (win->m_font != *wxSWISS_FONT)
     {
         wxFont font( win->m_font );
index e3bb20d00d55dc2ed4241f3bf1035b3f4c692e08..315d37194cde1ba9dc52d82dfe9b992ccbff8276 100644 (file)
@@ -51,6 +51,7 @@ extern wxList *wxPendingEvents;
 extern wxCriticalSection *wxPendingEventsLocker;
 #endif
 extern wxResourceCache *wxTheResourceCache;
+extern bool g_isIdle;
 
 unsigned char g_palette[64*3] =
 {
@@ -135,7 +136,7 @@ void wxExit()
     gtk_main_quit();
 }
 
-// forward decl
+/* forward declaration */
 gint wxapp_idle_callback( gpointer WXUNUSED(data) );
 
 bool wxYield()
@@ -151,15 +152,62 @@ bool wxYield()
         win->OnInternalIdle();
     }
 
-    // We need to temporarily remove idle callbacks or the loop will
-    // never finish.
+    if (wxTheApp->m_idleTag)
+    {
+        /* We need to temporarily remove idle callbacks or the loop will
+           never finish. */
+        gtk_idle_remove( wxTheApp->m_idleTag );
+        wxTheApp->m_idleTag = 0;
+
+        while (gtk_events_pending())
+            gtk_main_iteration();
+
+        /* re-add idle handler */
+        wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
+    }
+    else
+    {
+        while (gtk_events_pending())
+            gtk_main_iteration();
+    }
+    
+    return TRUE;
+}
+
+gint wxapp_idle_callback( gpointer WXUNUSED(data) )
+{
+    if (!wxTheApp) return TRUE;
+    
+    /* sent idle event to all who request them */
+    while (wxTheApp->ProcessIdle()) { }
+    
+    /* we don't want any more idle events until the next event is
+       sent to wxGTK */
     gtk_idle_remove( wxTheApp->m_idleTag );
+    wxTheApp->m_idleTag = 0;
+
+    /* indicate that we are now in idle mode - even so deeply
+       in idle mode that we don't get any idle events anymore.
+       this is like wxMSW where an idle event is sent only
+       once each time after the event queue has been completely
+       emptied */
+    g_isIdle = TRUE;
+    
+/*  wxMutexGuiLeave();
+    wxUsleep(10);
+    wxMutexGuiEnter(); */
 
-    while (gtk_events_pending())
-        gtk_main_iteration();
+    return TRUE;
+}
+
+void wxapp_install_idle_handler()
+{
+    /* this routine gets called by all event handlers
+       indicating that the idle is over. */
 
     wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
-    return TRUE;
+    
+    g_isIdle = FALSE;
 }
 
 //-----------------------------------------------------------------------------
@@ -172,22 +220,6 @@ BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
     EVT_IDLE(wxApp::OnIdle)
 END_EVENT_TABLE()
 
-gint wxapp_idle_callback( gpointer WXUNUSED(data) )
-{
-    if (wxTheApp)
-    {
-        while (wxTheApp->ProcessIdle())
-        {
-        }
-    }
-
-    wxMutexGuiLeave();
-    wxUsleep(10);
-    wxMutexGuiEnter();
-
-    return TRUE;
-}
-
 wxApp::wxApp()
 {
     wxTheApp = this;
@@ -202,7 +234,7 @@ wxApp::wxApp()
 
 wxApp::~wxApp()
 {
-    gtk_idle_remove( m_idleTag );
+    if (m_idleTag) gtk_idle_remove( m_idleTag );
 
     if (m_colorCube) free(m_colorCube);
 }
@@ -255,14 +287,14 @@ bool wxApp::OnInitGui()
                 int bb = (b << 3) | (b >> 2);
 
                 GdkColor *colors = cmap->colors;
-                int max = 3 * (65536);
+                int max = 3 * 65536;
                 int index = -1;
 
                 for (int i = 0; i < cmap->size; i++)
                 {
                     int rdiff = ((rr << 8) - colors[i].red);
-                    int gdiff = ((gg << 8)- colors[i].green);
-                    int bdiff = ((bb << 8)- colors[i].blue);
+                    int gdiff = ((gg << 8) - colors[i].green);
+                    int bdiff = ((bb << 8) - colors[i].blue);
                     int sum = ABS (rdiff) + ABS (gdiff) + ABS (bdiff);
                     if (sum < max) { index = i; max = sum; }
                 }
@@ -272,7 +304,6 @@ bool wxApp::OnInitGui()
         }
     }
 
-
     return TRUE;
 }
 
@@ -378,7 +409,7 @@ bool wxApp::Initialized()
 
 bool wxApp::Pending()
 {
-    return gtk_events_pending();
+    return (gtk_events_pending() > 0);
 }
 
 void wxApp::Dispatch()
index c6d4499cef1b9b68745feef2757d23421fd9a263..dc24fa7301f2a18fdc6e7765fe28918650737b78 100644 (file)
 
 class wxBitmapButton;
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -34,6 +41,8 @@ extern bool   g_blockEventsOnDrag;
 
 static void gtk_bmpbutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxBitmapButton *button )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!button->HasVMT()) return;
     if (g_blockEventsOnDrag) return;
   
index 07a3dac10842b7f597f25377a4f998f5b4f41a90..1347e6ddaed27cb8438e00bc18884c8aea50f050 100644 (file)
 
 class wxButton;
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -34,12 +41,14 @@ extern bool   g_blockEventsOnDrag;
 
 static void gtk_button_clicked_callback( GtkWidget *WXUNUSED(widget), wxButton *button )
 {
-  if (!button->HasVMT()) return;
-  if (g_blockEventsOnDrag) return;
+    if (g_isIdle) wxapp_install_idle_handler();
+
+    if (!button->HasVMT()) return;
+    if (g_blockEventsOnDrag) return;
   
-  wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, button->GetId());
-  event.SetEventObject(button);
-  button->GetEventHandler()->ProcessEvent(event);
+    wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, button->GetId());
+    event.SetEventObject(button);
+    button->GetEventHandler()->ProcessEvent(event);
 }
 
 //-----------------------------------------------------------------------------
@@ -54,7 +63,7 @@ wxButton::wxButton()
 
 wxButton::~wxButton()
 {
-  if (m_clientData) delete m_clientData;
+    if (m_clientData) delete m_clientData;
 }
 
 bool wxButton::Create(  wxWindow *parent, wxWindowID id, const wxString &label,
index 8cda3d112bfc782c4d11c1e6877ad997cbfdc480..1811807ab04ac7992f496d892926ccdf5474c85c 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -29,6 +36,8 @@ extern bool   g_blockEventsOnDrag;
 
 static void gtk_checkbox_clicked_callback( GtkWidget *WXUNUSED(widget), wxCheckBox *cb )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!cb->HasVMT()) return;
 
     if (cb->m_blockFirstEvent)
index ba049f6447090e75e04c9b5741e7b5a20b552e49..41ef1aba6f6b15d5d3ef292a3524fee49ba797a2 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -29,17 +36,17 @@ extern bool   g_blockEventsOnDrag;
 
 static void gtk_choice_clicked_callback( GtkWidget *WXUNUSED(widget), wxChoice *choice )
 {
-  if (!choice->HasVMT())
-      return;
+    if (g_isIdle) wxapp_install_idle_handler();
+
+    if (!choice->HasVMT()) return;
 
-  if (g_blockEventsOnDrag)
-      return;
+    if (g_blockEventsOnDrag) return;
 
-  wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, choice->GetId() );
-  event.SetInt( choice->GetSelection() );
-  event.SetString( choice->GetStringSelection() );
-  event.SetEventObject(choice);
-  choice->GetEventHandler()->ProcessEvent(event);
+    wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, choice->GetId() );
+    event.SetInt( choice->GetSelection() );
+    event.SetString( choice->GetStringSelection() );
+    event.SetEventObject(choice);
+    choice->GetEventHandler()->ProcessEvent(event);
 }
 
 //-----------------------------------------------------------------------------
index 63162e8ed0f6cc2ab545790dde7d4846c7d8c406..cb5a74135aea13b0d37f14fc84018c6b6a00b854 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -31,11 +38,11 @@ extern bool   g_blockEventsOnDrag;
 static void
 gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo )
 {
-    if (!combo->HasVMT())
-        return;
+    if (g_isIdle) wxapp_install_idle_handler();
 
-    if (g_blockEventsOnDrag)
-        return;
+    if (!combo->HasVMT()) return;
+
+    if (g_blockEventsOnDrag) return;
 
     if (combo->m_alreadySent)
     {
@@ -60,6 +67,8 @@ gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo )
 static void
 gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+    
     wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, combo->GetId() );
     event.SetString( combo->GetValue() );
     event.SetEventObject( combo );
index 37f4f0006c9fcffafb2ef0ad9f290fa0f548b489..b2fdae961cee5d1ba80d3515cb98271ab6e1b06b 100644 (file)
@@ -54,6 +54,10 @@ bool g_blockEventsOnDrag = FALSE;
 /* Don't allow mouse event propagation during scroll */
 bool g_blockEventsOnScroll = FALSE;
 
+/* TRUE when the message queue is empty. this gets set to
+   FALSE by all event callbacks before anything else is done */
+bool g_isIdle = FALSE;
+
 /* Message Strings for Internationalization */
 char **wx_msg_str = (char**)NULL;
 
index dde6539b1671054b6070831662b0709cf8ec73fe..b8adf30bdab00c9de42d84963ac104d0dfeebd07 100644 (file)
 #include "gtk/gtk.h"
 #include "wx/gtk/win_gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
+//-----------------------------------------------------------------------------
+// data
 //-----------------------------------------------------------------------------
 
 extern wxList wxPendingDelete;
@@ -29,6 +38,8 @@ extern wxList wxPendingDelete;
 
 bool gtk_dialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxDialog *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
 /*
     printf( "OnDelete from " );
     if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -47,6 +58,8 @@ bool gtk_dialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED
 
 static void gtk_dialog_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxDialog *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
 
 /*
@@ -70,6 +83,8 @@ static void gtk_dialog_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation
 
 static gint gtk_dialog_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *event, wxDialog *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
 
     win->m_x = event->x;
@@ -92,6 +107,8 @@ static gint gtk_dialog_configure_callback( GtkWidget *WXUNUSED(widget), GdkEvent
 static gint 
 gtk_dialog_realized_callback( GtkWidget *widget, wxDialog *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     /* all this is for Motif Window Manager "hints" and is supposed to be
        recognized by other WM as well. not tested. */
     long decor = (long) GDK_DECOR_ALL;
index fa6d087c991fbaceffa462e5bf55c798e5b445c8..bd7d405395ecd6d1b15850e71d894a0af274ca0e 100644 (file)
 
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // "delete_event"
 //-----------------------------------------------------------------------------
@@ -25,6 +32,8 @@
 static
 bool gtk_filedialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxDialog *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
 /*
     printf( "OnDelete from " );
     if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -44,6 +53,8 @@ bool gtk_filedialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUN
 static
 void gtk_filedialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFileDialog *dialog )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     int style = dialog->GetStyle();
 
     GtkFileSelection *filedlg = GTK_FILE_SELECTION(dialog->m_widget);
@@ -85,6 +96,8 @@ void gtk_filedialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFileDialog *dial
 static
 void gtk_filedialog_cancel_callback( GtkWidget *WXUNUSED(w), wxFileDialog *dialog )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
     event.SetEventObject( dialog );
     dialog->GetEventHandler()->ProcessEvent( event );
index 38b56e56d9e0283228d9b6d33a875bf0e8c8fbdd..f402313c361d4c033f0ab5e1434406c8b027ac3c 100644 (file)
@@ -33,6 +33,13 @@ const int wxMENU_HEIGHT    = 27;
 const int wxSTATUS_HEIGHT  = 25;
 const int wxPLACE_HOLDER   = 0;
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -45,6 +52,8 @@ extern wxList wxPendingDelete;
 
 static void gtk_frame_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
 
 /*
@@ -68,6 +77,8 @@ static void gtk_frame_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation*
 
 static gint gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
 /*
     printf( "OnDelete from " );
     if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -86,6 +97,8 @@ static gint gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WX
 
 static void gtk_menu_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     
     win->m_menuBarDetached = FALSE;
@@ -98,6 +111,8 @@ static void gtk_menu_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *
 
 static void gtk_menu_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     
     win->m_menuBarDetached = TRUE;
@@ -110,6 +125,8 @@ static void gtk_menu_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *
 
 static void gtk_toolbar_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     
     win->m_toolBarDetached = FALSE;
@@ -122,6 +139,8 @@ static void gtk_toolbar_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidge
 
 static void gtk_toolbar_detached_callback( GtkWidget *widget, GtkWidget *WXUNUSED(child), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     
     win->m_toolBarDetached = TRUE;
@@ -134,6 +153,8 @@ static void gtk_toolbar_detached_callback( GtkWidget *widget, GtkWidget *WXUNUSE
 
 static gint gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *event, wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
 
     win->m_x = event->x;
@@ -156,6 +177,8 @@ static gint gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventC
 static gint 
 gtk_frame_realized_callback( GtkWidget *widget, wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     /* all this is for Motif Window Manager "hints" and is supposed to be
        recognized by other WM as well. not tested. */
     long decor = (long) GDK_DECOR_ALL;
index 138fc38d96d1ed72ff6195f22c375807ebb055e9..e0fa8aca7eeba050e2e0e49e65020bc5f97c9956 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-------------------------------------------------------------------------
 // conditional compilation
 //-------------------------------------------------------------------------
@@ -63,6 +70,8 @@ extern bool   g_blockEventsOnScroll;
 static gint
 gtk_listbox_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxListBox *listbox )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return FALSE;
     if (g_blockEventsOnScroll) return FALSE;
 
@@ -116,6 +125,8 @@ gtk_listbox_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event,
 static gint
 gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxListBox *listbox )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return FALSE;
 
     if (!listbox->HasVMT()) return FALSE;
@@ -142,6 +153,8 @@ gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxLis
 
 static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox *listbox )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!listbox->HasVMT()) return;
     if (g_blockEventsOnDrag) return;
 
index 85eb0270c7b38ea91bf954dfc89d9de2cda875e6..064376b54c6a12a25c3692ab6a811bcf4a011cb8 100644 (file)
 
 const int wxMENU_HEIGHT = 27;
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // globals
 //-----------------------------------------------------------------------------
@@ -314,6 +321,8 @@ void wxMDIChildFrame::OnActivate( wxActivateEvent &WXUNUSED(event) )
 
 static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if ((win->m_x == alloc->x) &&
         (win->m_y == alloc->y) &&
         (win->m_width == alloc->width) &&
index dd3d6850bfcc88f9be21c885abb3fad21351a27b..5e6b4c8b03f8c6a193878ef3b32ee1e3583984d4 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // wxMenuBar
 //-----------------------------------------------------------------------------
@@ -343,6 +350,8 @@ wxString wxMenuBar::GetHelpString( int id ) const
 
 static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     int id = menu->FindMenuIdByMenuItem(widget);
 
     /* should find it for normal (not popup) menu */
@@ -392,6 +401,8 @@ static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu )
 
 static void gtk_menu_hilight_callback( GtkWidget *widget, wxMenu *menu )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     int id = menu->FindMenuIdByMenuItem(widget);
 
     wxASSERT( id != -1 ); // should find it!
@@ -424,6 +435,8 @@ static void gtk_menu_hilight_callback( GtkWidget *widget, wxMenu *menu )
 
 static void gtk_menu_nolight_callback( GtkWidget *widget, wxMenu *menu )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     int id = menu->FindMenuIdByMenuItem(widget);
 
     wxASSERT( id != -1 ); // should find it!
index ea6f98fe1a5e1dd8601bfea4b528f36311c0cf72..9b0c1f03093aa49da0ea296aeaf8daca28b6b040 100644 (file)
 #include "gdk/gdkprivate.h"
 #include "gdk/gdkx.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -56,6 +63,8 @@ static void DrawFrame( GtkWidget *widget, int x, int y, int w, int h )
 
 static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     if (gdk_event->count > 0) return;
     
@@ -73,6 +82,8 @@ static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *g
 
 static void gtk_window_own_draw_callback( GtkWidget *widget, GdkRectangle *WXUNUSED(rect), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     
     gtk_draw_shadow( widget->style, 
@@ -89,6 +100,8 @@ static void gtk_window_own_draw_callback( GtkWidget *widget, GdkRectangle *WXUNU
 
 static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxMiniFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return TRUE;
     if (g_blockEventsOnScroll) return TRUE;
@@ -124,6 +137,8 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
 
 static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxMiniFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return TRUE;
     if (g_blockEventsOnScroll) return TRUE;
@@ -155,6 +170,8 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
 
 static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion *gdk_event, wxMiniFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return TRUE;
     if (g_blockEventsOnScroll) return TRUE;
@@ -186,6 +203,8 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
 
 static void gtk_button_clicked_callback( GtkWidget *WXUNUSED(widget), wxMiniFrame *mf )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     mf->Close();
 }
 
index a7b6bd091d9085200ed6668b51ec21c380480636..a690de0dea07547663ec1ec76e1d461deb3d120e 100644 (file)
 #include "wx/gtk/win_gtk.h"
 #include "gdk/gdkkeysyms.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -86,6 +93,8 @@ static void gtk_notebook_page_change_callback(GtkNotebook *WXUNUSED(widget),
                                               gint nPage,
                                               gpointer data)
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     wxNotebook *notebook = (wxNotebook *)data;
 
     int old = notebook->GetSelection();
@@ -104,6 +113,8 @@ static void gtk_notebook_page_change_callback(GtkNotebook *WXUNUSED(widget),
 
 static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if ((win->m_x == alloc->x) &&
         (win->m_y == alloc->y) &&
         (win->m_width == alloc->width) &&
@@ -124,6 +135,8 @@ static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation*
 static gint
 gtk_notebook_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxNotebook *notebook )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return FALSE;
 
     if (!notebook->HasVMT()) return FALSE;
index 1f60b251b04ca8b3caceb083475583987887b966..e9ba1e8c5e2da7a42d9fc9cacbc07bd1442265f4 100644 (file)
 #include "gtk/gtk.h"
 #include "wx/gtk/win_gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -31,6 +38,8 @@ extern bool   g_blockEventsOnDrag;
 
 static void gtk_radiobutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxRadioBox *rb )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!rb->HasVMT()) return;
     if (g_blockEventsOnDrag) return;
 
index 8b93df7380d85888b0968d4afbe7375352002bff..9ab2906909be721ab767294c53cb61be35ff3065 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -29,6 +36,8 @@ extern bool g_blockEventsOnDrag;
 static 
 void gtk_radiobutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxRadioButton *rb )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!rb->HasVMT()) return;
   
     if (rb->m_blockFirstEvent)
index 39aba4ce4698c1624b0b0010966f4628a85f11ce..5c9ddc9eb554b0439d3ba5adc7c4b63dad8cabf0 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -32,6 +39,8 @@ extern bool   g_blockEventsOnScroll;
 
 static void gtk_scrollbar_callback( GtkWidget *WXUNUSED(widget), wxScrollBar *win )
 { 
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     if (g_blockEventsOnDrag) return;
     
@@ -83,10 +92,12 @@ static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget),
                                                  GdkEventButton *WXUNUSED(gdk_event), 
                                                 wxScrollBar *win )
 {
-  win->m_isScrolling = TRUE;
+    if (g_isIdle) wxapp_install_idle_handler();
+
+    win->m_isScrolling = TRUE;
 //  g_blockEventsOnScroll = TRUE;  doesn't work in DialogEd
   
-  return FALSE;
+    return FALSE;
 }
 
 //-----------------------------------------------------------------------------
@@ -97,6 +108,8 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *WXUNUSED(widget),
                                                    GdkEventButton *WXUNUSED(gdk_event), 
                                                   wxScrollBar *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     win->m_isScrolling = FALSE;
 //  g_blockEventsOnScroll = FALSE;
   
index a9a4e9a7d33c859d4f67fc9a912c2b4bd1e008b0..3c7c1ade23184faf52ace2122df0f23083c40194 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -30,6 +37,8 @@ extern bool   g_blockEventsOnDrag;
 
 static void gtk_slider_callback( GtkWidget *WXUNUSED(widget), wxSlider *win )
 { 
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     if (g_blockEventsOnDrag) return;
     
index afbd61ee1ec1b8e51bae5b22555a212e091c9566..73f6493e81ba1801085bb6ec96184d5fce21f4d8 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -33,6 +40,8 @@ static const float sensitivity = 0.2;
 
 static void gtk_spinbutt_callback( GtkWidget *WXUNUSED(widget), wxSpinButton *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     if (g_blockEventsOnDrag) return;
 
index dfc1d7b6311d0a04e83375a7c3babf70efa2d47e..46ca5bad1f744658803834c40a7fc9a57cfa1354 100644 (file)
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -30,6 +37,8 @@ extern bool   g_blockEventsOnDrag;
 
 static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget), wxToolBarTool *tool )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return;
     if (!tool->m_enabled) return;
 
@@ -45,6 +54,8 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget), wxToolBarTool *to
 static gint gtk_toolbar_enter_callback( GtkWidget *WXUNUSED(widget), 
   GdkEventCrossing *WXUNUSED(gdk_event), wxToolBarTool *tool )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return TRUE;
     
     /* we grey-out the tip text of disabled tool */
index bdbc8e279ffb4f649b56ad3701821dbc0c88d025..eab7ee1db8bbc225955e7df0d3575fc2bc719c49 100644 (file)
 #include "gtk/gtk.h"
 #include "gdk/gdkkeysyms.h"
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
@@ -37,6 +44,8 @@ extern bool   g_blockEventsOnDrag;
 static void
 gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->m_hasVMT) return;
 
     win->SetModified();
@@ -54,6 +63,8 @@ gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
 static void
 gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->m_hasVMT) return;
     
     win->CalculateScrollbar();
index 6310487a741e5390a2c2dee296640cabef823ea2..c1a81398db865985e87eb149631531ef11af90a6 100644 (file)
 extern wxList     wxPendingDelete;
 extern bool       g_blockEventsOnDrag;
 extern bool       g_blockEventsOnScroll;
+extern bool       g_isIdle;
 static bool       g_capturing = FALSE;
 static wxWindow  *g_focusWindow = (wxWindow*) NULL;
 
@@ -135,6 +136,13 @@ static wxWindow  *g_focusWindow = (wxWindow*) NULL;
    the last click here */
 static guint32 gs_timeLastClick = 0;
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 #if (GTK_MINOR_VERSION > 0)
 
 //-----------------------------------------------------------------------------
@@ -231,6 +239,8 @@ static void gtk_window_own_draw_callback( GtkWidget *widget, GdkRectangle *WXUNU
 
 static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gdk_event, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
 
     win->m_updateRegion.Union( gdk_event->area.x,
@@ -260,6 +270,8 @@ static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExp
 
 static void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget), GdkRectangle *rect, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
 
     win->m_updateRegion.Union( rect->x, rect->y, rect->width, rect->height );
@@ -277,6 +289,8 @@ static void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget), GdkRectangle
 
 static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
 
@@ -456,6 +470,8 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e
 
 static gint gtk_window_key_release_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
 
@@ -572,6 +588,8 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, GdkEventKey *gdk
 
 static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
 /*
     wxPrintf( _T("1) OnButtonPress from ") );
     if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -734,6 +752,8 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
 
 static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
     if (g_blockEventsOnScroll) return FALSE;
@@ -838,6 +858,8 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
 
 static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion *gdk_event, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
     if (g_blockEventsOnScroll) return FALSE;
@@ -945,6 +967,8 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
 
 static gint gtk_window_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
 
@@ -992,6 +1016,8 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED(
 
 static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
     
@@ -1028,6 +1054,8 @@ static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEvent *WXUNUSED
 
 static gint gtk_window_enter_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
     
@@ -1078,6 +1106,8 @@ static gint gtk_window_enter_callback( GtkWidget *widget, GdkEventCrossing *gdk_
 
 static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return FALSE;
 
@@ -1128,6 +1158,8 @@ static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_
 
 static void gtk_window_vscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return;
 
 /*
@@ -1176,6 +1208,8 @@ static void gtk_window_vscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow *
 
 static void gtk_window_hscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return;
 
 /*
@@ -1224,6 +1258,8 @@ static void gtk_window_hscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow *
 
 static void gtk_window_vscroll_change_callback( GtkWidget *WXUNUSED(widget), wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return;
 
 /*
@@ -1249,6 +1285,8 @@ static void gtk_window_vscroll_change_callback( GtkWidget *WXUNUSED(widget), wxW
 
 static void gtk_window_hscroll_change_callback( GtkWidget *WXUNUSED(widget), wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (g_blockEventsOnDrag) return;
 
 /*
@@ -1276,6 +1314,8 @@ static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget),
                                                  GdkEventButton *WXUNUSED(gdk_event),
                                                  wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
 //  don't test here as we can release the mouse while being over
 //  a different window then the slider
 //
@@ -1295,6 +1335,7 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *widget,
                                                    GdkEventButton *WXUNUSED(gdk_event),
                                                    wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
 
 //  don't test here as we can release the mouse while being over
 //  a different window then the slider
@@ -1324,6 +1365,8 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *widget,
 static gint 
 gtk_window_realized_callback( GtkWidget *widget, wxWindow *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (win->m_font != *wxSWISS_FONT)
     {
         wxFont font( win->m_font );