use "event" signal emission hook to install idle handler for many events

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40854 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Paul Cornett
2006-08-26 22:07:45 +00:00
parent 1136ac0b7c
commit 1481968400
12 changed files with 44 additions and 47 deletions

View File

@@ -184,6 +184,16 @@ void wxApp::WakeUpIdle()
extern "C" 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) ) static gint wxapp_idle_callback( gpointer WXUNUSED(data) )
{ {
if (!wxTheApp) if (!wxTheApp)
@@ -222,6 +232,13 @@ static gint wxapp_idle_callback( gpointer WXUNUSED(data) )
// Release lock again // Release lock again
gdk_threads_leave(); 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 FALSE if no more idle events are to be sent
return moreIdles; return moreIdles;
} }

View File

@@ -706,8 +706,7 @@ extern "C" {
static gint static gint
gtk_dnd_window_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *WXUNUSED(event), wxDropSource *source ) gtk_dnd_window_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *WXUNUSED(event), wxDropSource *source )
{ {
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
source->GiveFeedback( ConvertFromGTK(source->m_dragContext->action) ); source->GiveFeedback( ConvertFromGTK(source->m_dragContext->action) );

View File

@@ -32,8 +32,7 @@ extern "C" {
static static
bool gtk_fontdialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxDialog *win ) bool gtk_fontdialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxDialog *win )
{ {
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
/* /*
printf( "OnDelete from " ); printf( "OnDelete from " );

View File

@@ -235,8 +235,7 @@ extern "C" {
static void static void
gtk_glwindow_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gdk_event, wxGLCanvas *win ) gtk_glwindow_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gdk_event, wxGLCanvas *win )
{ {
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
win->m_exposed = true; win->m_exposed = true;

View File

@@ -157,7 +157,7 @@ gtk_listbox_button_press_callback( GtkWidget *widget,
GdkEventButton *gdk_event, GdkEventButton *gdk_event,
wxListBox *listbox ) 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_blockEventsOnDrag) return FALSE;
if (g_blockEventsOnScroll) return FALSE; if (g_blockEventsOnScroll) return FALSE;
@@ -203,7 +203,7 @@ gtk_listbox_key_press_callback( GtkWidget *widget,
GdkEventKey *gdk_event, GdkEventKey *gdk_event,
wxListBox *listbox ) 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_blockEventsOnDrag) return FALSE;

View File

@@ -64,7 +64,7 @@ static wxColor LightContrastColour(const wxColour& c)
extern "C" { extern "C" {
static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxMiniFrame *win ) 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 (!win->m_hasVMT) return;
if (gdk_event->count > 0) return; if (gdk_event->count > 0) return;
@@ -121,7 +121,7 @@ static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *g
extern "C" { extern "C" {
static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxMiniFrame *win ) 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 (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return TRUE; if (g_blockEventsOnDrag) return TRUE;
@@ -207,7 +207,7 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
extern "C" { extern "C" {
static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxMiniFrame *win ) 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 (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return TRUE; if (g_blockEventsOnDrag) return TRUE;
@@ -242,8 +242,7 @@ extern "C" {
static gboolean static gboolean
gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, wxMiniFrame *win ) gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, wxMiniFrame *win )
{ {
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
if (!win->m_hasVMT) return FALSE; if (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE; if (g_blockEventsOnDrag) return FALSE;
@@ -262,8 +261,7 @@ extern "C" {
static gint static gint
gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion *gdk_event, wxMiniFrame *win ) gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion *gdk_event, wxMiniFrame *win )
{ {
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
if (!win->m_hasVMT) return FALSE; if (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return TRUE; if (g_blockEventsOnDrag) return TRUE;

View File

@@ -192,8 +192,7 @@ gtk_notebook_key_press_callback( GtkWidget *widget,
GdkEventKey *gdk_event, GdkEventKey *gdk_event,
wxNotebook *notebook ) wxNotebook *notebook )
{ {
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
if (!notebook->m_hasVMT) return FALSE; if (!notebook->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE; if (g_blockEventsOnDrag) return FALSE;

View File

@@ -82,8 +82,7 @@ static void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioBo
extern "C" { extern "C" {
static gint gtk_radiobox_keypress_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxRadioBox *rb ) static gint gtk_radiobox_keypress_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxRadioBox *rb )
{ {
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
if (!rb->m_hasVMT) return FALSE; if (!rb->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE; if (g_blockEventsOnDrag) return FALSE;

View File

@@ -57,7 +57,7 @@ extern "C" {
static gboolean static gboolean
gtk_button_press_event(GtkRange*, GdkEventButton*, wxScrollBar* win) 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; win->m_mouseButtonDown = true;
return false; return false;
@@ -98,8 +98,7 @@ extern "C" {
static gboolean static gboolean
gtk_button_release_event(GtkRange* range, GdkEventButton*, wxScrollBar* win) gtk_button_release_event(GtkRange* range, GdkEventButton*, wxScrollBar* win)
{ {
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
win->m_mouseButtonDown = false; win->m_mouseButtonDown = false;
// If thumb tracking // If thumb tracking

View File

@@ -204,7 +204,7 @@ static gint gtk_toolbar_tool_callback( GtkWidget *WXUNUSED(widget),
GdkEventCrossing *gdk_event, GdkEventCrossing *gdk_event,
wxToolBarTool *tool ) 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; if (g_blockEventsOnDrag) return TRUE;

View File

@@ -111,8 +111,7 @@ static gboolean gtk_frame_focus_in_callback( GtkWidget *widget,
GdkEvent *WXUNUSED(event), GdkEvent *WXUNUSED(event),
wxTopLevelWindowGTK *win ) wxTopLevelWindowGTK *win )
{ {
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
switch ( g_sendActivateEvent ) switch ( g_sendActivateEvent )
{ {
@@ -173,8 +172,7 @@ static gboolean gtk_frame_focus_out_callback( GtkWidget *widget,
GdkEventFocus *WXUNUSED(gdk_event), GdkEventFocus *WXUNUSED(gdk_event),
wxTopLevelWindowGTK *win ) wxTopLevelWindowGTK *win )
{ {
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
// if the focus goes out of our app alltogether, OnIdle() will send // if the focus goes out of our app alltogether, OnIdle() will send
// wxActivateEvent, otherwise gtk_window_focus_in_callback() will reset // wxActivateEvent, otherwise gtk_window_focus_in_callback() will reset
@@ -257,8 +255,7 @@ gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget),
GdkEvent *WXUNUSED(event), GdkEvent *WXUNUSED(event),
wxTopLevelWindowGTK *win ) wxTopLevelWindowGTK *win )
{ {
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
if (win->IsEnabled() && if (win->IsEnabled() &&
(g_openDialogs == 0 || (win->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) || (g_openDialogs == 0 || (win->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) ||
@@ -280,8 +277,7 @@ gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget),
GdkEventConfigure *WXUNUSED(event), GdkEventConfigure *WXUNUSED(event),
wxTopLevelWindowGTK *win ) wxTopLevelWindowGTK *win )
{ {
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
if (!win->m_hasVMT || !win->IsShown()) if (!win->m_hasVMT || !win->IsShown())
return FALSE; return FALSE;

View File

@@ -480,8 +480,7 @@ gtk_window_expose_callback( GtkWidget *widget,
{ {
DEBUG_MAIN_THREAD DEBUG_MAIN_THREAD
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
// This callback gets called in drawing-idle time under // This callback gets called in drawing-idle time under
// GTK 2.0, so we don't need to defer anything to idle // 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 DEBUG_MAIN_THREAD
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
if (!win->m_hasVMT) if (!win->m_hasVMT)
return FALSE; return FALSE;
@@ -1244,8 +1242,7 @@ gtk_window_key_release_callback( GtkWidget *widget,
{ {
DEBUG_MAIN_THREAD DEBUG_MAIN_THREAD
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
if (!win->m_hasVMT) if (!win->m_hasVMT)
return FALSE; return FALSE;
@@ -1414,8 +1411,7 @@ int wxWindowGTK::GTKCallbackCommonPrologue(GdkEventAny *event) const
{ {
DEBUG_MAIN_THREAD DEBUG_MAIN_THREAD
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
if (!m_hasVMT) if (!m_hasVMT)
return FALSE; return FALSE;
@@ -1778,8 +1774,7 @@ window_scroll_event(GtkWidget*, GdkEventScroll* gdk_event, wxWindow* win)
{ {
DEBUG_MAIN_THREAD DEBUG_MAIN_THREAD
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
if (gdk_event->direction != GDK_SCROLL_UP && if (gdk_event->direction != GDK_SCROLL_UP &&
gdk_event->direction != GDK_SCROLL_DOWN) gdk_event->direction != GDK_SCROLL_DOWN)
@@ -1837,8 +1832,7 @@ gtk_window_focus_in_callback( GtkWidget *widget,
{ {
DEBUG_MAIN_THREAD DEBUG_MAIN_THREAD
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
if (win->m_imData) if (win->m_imData)
gtk_im_context_focus_in(win->m_imData->context); gtk_im_context_focus_in(win->m_imData->context);
@@ -1895,8 +1889,7 @@ gtk_window_focus_out_callback( GtkWidget *widget,
{ {
DEBUG_MAIN_THREAD DEBUG_MAIN_THREAD
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
if (win->m_imData) if (win->m_imData)
gtk_im_context_focus_out(win->m_imData->context); 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 DEBUG_MAIN_THREAD
if (g_isIdle) // don't need to install idle handler, its done from "event" signal
wxapp_install_idle_handler();
g_blockEventsOnScroll = true; g_blockEventsOnScroll = true;
win->m_mouseButtonDown = true; win->m_mouseButtonDown = true;