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 | 
