diff options
author | Neil <nyamatongwe@gmail.com> | 2014-05-14 21:21:42 +1000 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2014-05-14 21:21:42 +1000 |
commit | a12ff8ecb654569d32cb11baa71d4fb46196b3da (patch) | |
tree | 7c31590418323e8c5432ac244c43de3937629901 | |
parent | dba0764a6759c3ba067aa124906ef3bfed5b87a3 (diff) | |
download | scintilla-mirror-a12ff8ecb654569d32cb11baa71d4fb46196b3da.tar.gz |
Bug [#1567]. Fix display flashing when scrolling with Gtk+ 3.10.
Includes work from Sébastien Granjoux and Colomban Wendling.
-rw-r--r-- | doc/ScintillaHistory.html | 4 | ||||
-rw-r--r-- | gtk/ScintillaGTK.cxx | 27 |
2 files changed, 27 insertions, 4 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 88029ec52..dcee1c353 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -504,6 +504,10 @@ <a href="http://sourceforge.net/p/scintilla/bugs/1592/">Bug #1592</a>. </li> <li> + Fixed display flashing when scrolling with Gtk+ 3.10. + <a href="http://sourceforge.net/p/scintilla/bugs/1567/">Bug #1567</a>. + </li> + <li> Fixed calls and constants deprecated in GTK+ 3.10. </li> <li> diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index 0d868db63..d106c1713 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -160,6 +160,7 @@ class ScintillaGTK : public ScintillaBase { #else GdkRegion *rgnUpdate; #endif + bool repaintFullWindow; // Private so ScintillaGTK objects can not be copied ScintillaGTK(const ScintillaGTK &); @@ -172,6 +173,7 @@ public: private: virtual void Initialise(); virtual void Finalise(); + virtual bool AbandonPaint(); virtual void DisplayCursor(Window::Cursor c); virtual bool DragThreshold(Point ptStart, Point ptNow); virtual void StartDrag(); @@ -365,7 +367,8 @@ ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) : im_context(NULL), lastWheelMouseDirection(0), wheelMouseIntensity(0), - rgnUpdate(0) { + rgnUpdate(0), + repaintFullWindow(false) { sci = sci_; wMain = GTK_WIDGET(sci); @@ -756,10 +759,10 @@ void ScintillaGTK::Initialise() { #else g_signal_connect(G_OBJECT(widtxt), "expose_event", G_CALLBACK(ScintillaGTK::ExposeText), this); -#endif - gtk_widget_set_events(widtxt, GDK_EXPOSURE_MASK); // Avoid background drawing flash gtk_widget_set_double_buffered(widtxt, FALSE); +#endif + gtk_widget_set_events(widtxt, GDK_EXPOSURE_MASK); gtk_widget_set_size_request(widtxt, 100, 100); adjustmentv = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 201.0, 1.0, 20.0, 20.0)); #if GTK_CHECK_VERSION(3,0,0) @@ -825,6 +828,13 @@ void ScintillaGTK::Finalise() { ScintillaBase::Finalise(); } +bool ScintillaGTK::AbandonPaint() { + if ((paintState == painting) && !paintingAllText) { + repaintFullWindow = true; + } + return false; +} + void ScintillaGTK::DisplayCursor(Window::Cursor c) { if (cursorMode == SC_CURSORNORMAL) wText.SetCursor(c); @@ -2374,6 +2384,7 @@ void ScintillaGTK::Destroy(GObject *object) { gboolean ScintillaGTK::DrawTextThis(cairo_t *cr) { try { paintState = painting; + repaintFullWindow = false; rcPaint = GetClientRectangle(); @@ -2401,11 +2412,12 @@ gboolean ScintillaGTK::DrawTextThis(cairo_t *cr) { surfaceWindow->Release(); delete surfaceWindow; } - if (paintState == paintAbandoned) { + if ((paintState == paintAbandoned) || repaintFullWindow) { // Painting area was insufficient to cover new styling or brace highlight positions FullPaint(); } paintState = notPainting; + repaintFullWindow = false; if (rgnUpdate) { cairo_rectangle_list_destroy(rgnUpdate); @@ -2429,6 +2441,13 @@ gboolean ScintillaGTK::DrawThis(cairo_t *cr) { GTK_CONTAINER(PWidget(wMain)), PWidget(scrollbarh), cr); gtk_container_propagate_draw( GTK_CONTAINER(PWidget(wMain)), PWidget(scrollbarv), cr); +// Starting from the following version, the expose event are not propagated +// for double buffered non native windows, so we need to call it ourselves +// or keep the default handler +#if GTK_CHECK_VERSION(3,9,2) + gtk_container_propagate_draw( + GTK_CONTAINER(PWidget(wMain)), PWidget(wText), cr); +#endif } catch (...) { errorStatus = SC_STATUS_FAILURE; } |