extern "C"
{
+// One-shot emission hook for "event" signal, to install idle handler.
+// This will be called when the "event" signal is issued on any GtkWidget object.
+static gboolean
+event_emission_hook(GSignalInvocationHint*, guint, const GValue*, gpointer)
+{
+ wxapp_install_idle_handler();
+ // remove hook
+ return false;
+}
+
static gint wxapp_idle_callback( gpointer WXUNUSED(data) )
{
if (!wxTheApp)
// Release lock again
gdk_threads_leave();
+ if (!moreIdles)
+ {
+ // add emission hook for "event" signal, to re-install idle handler when needed
+ guint sig_id = g_signal_lookup("event", GTK_TYPE_WIDGET);
+ g_signal_add_emission_hook(sig_id, 0, event_emission_hook, NULL, NULL);
+ }
+
// Return FALSE if no more idle events are to be sent
return moreIdles;
}
static gint
gtk_dnd_window_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *WXUNUSED(event), wxDropSource *source )
{
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
source->GiveFeedback( ConvertFromGTK(source->m_dragContext->action) );
static
bool gtk_fontdialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxDialog *win )
{
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
/*
printf( "OnDelete from " );
static void
gtk_glwindow_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gdk_event, wxGLCanvas *win )
{
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
win->m_exposed = true;
GdkEventButton *gdk_event,
wxListBox *listbox )
{
- if (g_isIdle) wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (g_blockEventsOnDrag) return FALSE;
if (g_blockEventsOnScroll) return FALSE;
GdkEventKey *gdk_event,
wxListBox *listbox )
{
- if (g_isIdle) wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (g_blockEventsOnDrag) return FALSE;
extern "C" {
static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxMiniFrame *win )
{
- if (g_isIdle) wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (!win->m_hasVMT) return;
if (gdk_event->count > 0) return;
extern "C" {
static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxMiniFrame *win )
{
- if (g_isIdle) wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return TRUE;
extern "C" {
static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxMiniFrame *win )
{
- if (g_isIdle) wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return TRUE;
static gboolean
gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, wxMiniFrame *win )
{
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE;
static gint
gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion *gdk_event, wxMiniFrame *win )
{
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return TRUE;
GdkEventKey *gdk_event,
wxNotebook *notebook )
{
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (!notebook->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE;
extern "C" {
static gint gtk_radiobox_keypress_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxRadioBox *rb )
{
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (!rb->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE;
static gboolean
gtk_button_press_event(GtkRange*, GdkEventButton*, wxScrollBar* win)
{
- if (g_isIdle) wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
win->m_mouseButtonDown = true;
return false;
static gboolean
gtk_button_release_event(GtkRange* range, GdkEventButton*, wxScrollBar* win)
{
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
win->m_mouseButtonDown = false;
// If thumb tracking
GdkEventCrossing *gdk_event,
wxToolBarTool *tool )
{
- if (g_isIdle) wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (g_blockEventsOnDrag) return TRUE;
GdkEvent *WXUNUSED(event),
wxTopLevelWindowGTK *win )
{
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
switch ( g_sendActivateEvent )
{
GdkEventFocus *WXUNUSED(gdk_event),
wxTopLevelWindowGTK *win )
{
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
// if the focus goes out of our app alltogether, OnIdle() will send
// wxActivateEvent, otherwise gtk_window_focus_in_callback() will reset
GdkEvent *WXUNUSED(event),
wxTopLevelWindowGTK *win )
{
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (win->IsEnabled() &&
(g_openDialogs == 0 || (win->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) ||
GdkEventConfigure *WXUNUSED(event),
wxTopLevelWindowGTK *win )
{
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (!win->m_hasVMT || !win->IsShown())
return FALSE;
{
DEBUG_MAIN_THREAD
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
// This callback gets called in drawing-idle time under
// GTK 2.0, so we don't need to defer anything to idle
{
DEBUG_MAIN_THREAD
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (!win->m_hasVMT)
return FALSE;
{
DEBUG_MAIN_THREAD
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (!win->m_hasVMT)
return FALSE;
{
DEBUG_MAIN_THREAD
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (!m_hasVMT)
return FALSE;
{
DEBUG_MAIN_THREAD
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (gdk_event->direction != GDK_SCROLL_UP &&
gdk_event->direction != GDK_SCROLL_DOWN)
{
DEBUG_MAIN_THREAD
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (win->m_imData)
gtk_im_context_focus_in(win->m_imData->context);
{
DEBUG_MAIN_THREAD
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
if (win->m_imData)
gtk_im_context_focus_out(win->m_imData->context);
{
DEBUG_MAIN_THREAD
- if (g_isIdle)
- wxapp_install_idle_handler();
+ // don't need to install idle handler, its done from "event" signal
g_blockEventsOnScroll = true;
win->m_mouseButtonDown = true;