aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--doc/ScintillaHistory.html4
-rw-r--r--gtk/ScintillaGTK.cxx39
-rw-r--r--gtk/ScintillaGTK.h3
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