diff options
author | Neil Hodgson <nyamatongwe@gmail.com> | 2017-07-29 11:23:49 +1000 |
---|---|---|
committer | Neil Hodgson <nyamatongwe@gmail.com> | 2017-07-29 11:23:49 +1000 |
commit | 685c1c667e33144f014c23fd94e3ccd7abf7779b (patch) | |
tree | e37f57c9f3306385ac637fee8bf6cda5e5574ddf | |
parent | 6d70cdf468c8b48cd178b6c11d525790b7414cdf (diff) | |
download | scintilla-mirror-685c1c667e33144f014c23fd94e3ccd7abf7779b.tar.gz |
Bug [#1876]. Fix scrollbar and corner drawing and flickering of text.
-rw-r--r-- | doc/ScintillaHistory.html | 4 | ||||
-rw-r--r-- | gtk/ScintillaGTK.cxx | 39 | ||||
-rw-r--r-- | gtk/ScintillaGTK.h | 3 |
3 files changed, 40 insertions, 6 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index ece2981b6..2bcfaeebe 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -580,6 +580,10 @@ <a href="http://sourceforge.net/p/scintilla/bugs/1949/">Bug #1949</a>. </li> <li> + On GTK+ fix drawing problems including incorrect scrollbar redrawing and flickering of text. + <a href="http://sourceforge.net/p/scintilla/bugs/1876">Bug #1876</a>. + </li> + <li> On Cocoa, fix doCommandBySelector but avoid double effect of 'delete' key. <a href="http://sourceforge.net/p/scintilla/bugs/1958">Bug #1958</a>. diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index aaf5c3fd7..0cbf83652 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -297,7 +297,9 @@ void ScintillaGTK::RealizeThis(GtkWidget *widget) { gdk_window_set_cursor(PWindow(scrollbarh), cursor); UnRefCursor(cursor); - gtk_selection_add_targets(widget, GDK_SELECTION_PRIMARY, + g_signal_connect(PWidget(wSelection), "selection_get", G_CALLBACK(PrimarySelection), (gpointer) this); + g_signal_connect(PWidget(wSelection), "selection_clear_event", G_CALLBACK(PrimaryClear), (gpointer) this); + gtk_selection_add_targets(PWidget(wSelection), GDK_SELECTION_PRIMARY, clipboardCopyTargets, nClipboardCopyTargets); } @@ -308,7 +310,7 @@ void ScintillaGTK::Realize(GtkWidget *widget) { void ScintillaGTK::UnRealizeThis(GtkWidget *widget) { try { - gtk_selection_clear_targets(widget, GDK_SELECTION_PRIMARY); + gtk_selection_clear_targets(PWidget(wSelection), GDK_SELECTION_PRIMARY); if (IS_WIDGET_MAPPED(widget)) { gtk_widget_unmap(widget); @@ -542,6 +544,8 @@ void ScintillaGTK::Init() { } #endif + wSelection = gtk_invisible_new(); + gtk_widget_set_can_focus(PWidget(wMain), TRUE); gtk_widget_set_sensitive(PWidget(wMain), TRUE); gtk_widget_set_events(PWidget(wMain), @@ -664,6 +668,8 @@ void ScintillaGTK::Finalise() { accessible = 0; } + wSelection.Destroy(); + ScintillaBase::Finalise(); } @@ -1336,16 +1342,16 @@ void ScintillaGTK::AddToPopUp(const char *label, int cmd, bool enabled) { bool ScintillaGTK::OwnPrimarySelection() { return ((gdk_selection_owner_get(GDK_SELECTION_PRIMARY) - == PWindow(wMain)) && - (PWindow(wMain) != NULL)); + == PWindow(wSelection)) && + (PWindow(wSelection) != NULL)); } void ScintillaGTK::ClaimSelection() { // X Windows has a 'primary selection' as well as the clipboard. // Whenever the user selects some text, we become the primary selection - if (!sel.Empty() && IS_WIDGET_REALIZED(GTK_WIDGET(PWidget(wMain)))) { + if (!sel.Empty() && IS_WIDGET_REALIZED(GTK_WIDGET(PWidget(wSelection)))) { primarySelection = true; - gtk_selection_owner_set(GTK_WIDGET(PWidget(wMain)), + gtk_selection_owner_set(GTK_WIDGET(PWidget(wSelection)), GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME); primary.Clear(); } else if (OwnPrimarySelection()) { @@ -1554,6 +1560,27 @@ void ScintillaGTK::UnclaimSelection(GdkEventSelection *selection_event) { } } +void ScintillaGTK::PrimarySelection(GtkWidget *, GtkSelectionData *selection_data, guint info, guint, ScintillaGTK *sciThis) { + try { + if (SelectionOfGSD(selection_data) == GDK_SELECTION_PRIMARY) { + if (sciThis->primary.Empty()) { + sciThis->CopySelectionRange(&sciThis->primary); + } + sciThis->GetSelection(selection_data, info, &sciThis->primary); + } + } catch (...) { + sciThis->errorStatus = SC_STATUS_FAILURE; + } +} + +gboolean ScintillaGTK::PrimaryClear(GtkWidget *widget, GdkEventSelection *event, ScintillaGTK *sciThis) { + sciThis->UnclaimSelection(event); + if (GTK_WIDGET_CLASS(sciThis->parentClass)->selection_clear_event) { + return GTK_WIDGET_CLASS(sciThis->parentClass)->selection_clear_event(widget, event); + } + return TRUE; +} + void ScintillaGTK::Resize(int width, int height) { //Platform::DebugPrintf("Resize %d %d\n", width, height); //printf("Resize %d %d\n", width, height); diff --git a/gtk/ScintillaGTK.h b/gtk/ScintillaGTK.h index 40ed39ecd..8255db9c6 100644 --- a/gtk/ScintillaGTK.h +++ b/gtk/ScintillaGTK.h @@ -23,6 +23,7 @@ class ScintillaGTK : public ScintillaBase { Window scrollbarh; GtkAdjustment *adjustmentv; GtkAdjustment *adjustmenth; + Window wSelection; int verticalScrollBarWidth; int horizontalScrollBarHeight; @@ -139,6 +140,8 @@ private: static void ClipboardClearSelection(GtkClipboard* clip, void *data); void UnclaimSelection(GdkEventSelection *selection_event); + static void PrimarySelection(GtkWidget *widget, GtkSelectionData *selection_data, guint info, guint time_stamp, ScintillaGTK *sciThis); + static gboolean PrimaryClear(GtkWidget *widget, GdkEventSelection *event, ScintillaGTK *sciThis); void Resize(int width, int height); // Callback functions |