From 169ee4cbd1bcd7388ed0074e12cdea7db03665eb Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 15 Nov 2007 13:26:31 +0000 Subject: [PATCH] more tweaks to avoid editor flicker under Mac OS X svn: r7737 --- src/mred/mredmac.cxx | 32 ++++++++++++++++++++++++++++++-- src/mred/wxme/wx_medad.cxx | 12 ++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/mred/mredmac.cxx b/src/mred/mredmac.cxx index 879af98778..3173ed6d2e 100644 --- a/src/mred/mredmac.cxx +++ b/src/mred/mredmac.cxx @@ -533,17 +533,25 @@ void WakeUpMrEd() nothing and return 0. */ static unsigned long lastTime; + +static int wne_delay_on; +static unsigned long wne_delay_until; static int TransferQueue(int all) { EventRecord e; + unsigned long tc; int sleep_time = 0; int delay_time = 0; /* Don't call WaitNextEvent() too often. */ - if (TickCount() <= lastTime + delay_time) + tc = TickCount(); + if (tc <= lastTime + delay_time) return 0; - + if (wne_delay_on && (tc < wne_delay_until)) + return 0; + wne_delay_on = 0; + while (WNE(&e, dispatched ? ((double)sleep_time/60.0) : 0)) { QueueTransferredEvent(&e); } @@ -553,6 +561,26 @@ static int TransferQueue(int all) return 1; } +void wxStartRefreshSequence(void) +{ + /* Editors are not buffered offscreen under Mac OS X, instead + relying on the OS's buffering of all windows, which are updated + on WNE boundaries. To avoid flicker, avoid calling WNE in the + middle of an editor refresh. The refresh might get stuck, + though, so we only wait a little while. */ + + if (!wne_delay_on) { + wne_delay_until = TickCount() + 10; + } + wne_delay_on++; +} + +void wxEndRefreshSequence(void) +{ + if (wne_delay_on) + --wne_delay_on; +} + static void MrDequeue(MrQueueElem *q) { if (q->prev) diff --git a/src/mred/wxme/wx_medad.cxx b/src/mred/wxme/wx_medad.cxx index 20ab0723d4..8d9dc3d37c 100644 --- a/src/mred/wxme/wx_medad.cxx +++ b/src/mred/wxme/wx_medad.cxx @@ -27,6 +27,14 @@ static wxMemoryDC *wx_canvasless_offscreen; +#ifdef wx_mac +extern void wxStartRefreshSequence(void); +extern void wxEndRefreshSequence(void); +#else +# define wxStartRefreshSequence() /* empty */ +# define wxEndRefreshSequence() /* empty */ +#endif + extern void *MrEdGetWindowContext(wxWindow *w); class SimpleScroll @@ -812,6 +820,8 @@ void wxMediaCanvas::Redraw(double localx, double localy, double fw, double fh) if (!media || media->printing) return; + wxStartRefreshSequence(); + GetView(&x, &y, &w, &h); right = x + w; @@ -851,6 +861,8 @@ void wxMediaCanvas::Redraw(double localx, double localy, double fw, double fh) media->SetAdmin(oldadmin); } } + + wxEndRefreshSequence(); } Bool wxMediaCanvas::ScrollTo(double localx, double localy, double fw, double fh,