New idle handling. Only that.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2295 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
1999-04-27 19:32:19 +00:00
parent e5e41feafa
commit acfd422afa
46 changed files with 724 additions and 100 deletions

View 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.
gtk_idle_remove( wxTheApp->m_idleTag );
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();
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(); */
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()