aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornyamatongwe <unknown>2006-04-25 13:05:22 +0000
committernyamatongwe <unknown>2006-04-25 13:05:22 +0000
commit8fcd543a7e41bef0e040a7c9b77ac8c7d1ac6439 (patch)
treedf7d45d8394d570deec36eb729e69571c3efa2fa
parent7d47a101ed4562fe1a27905d4eb1f42d0d3b578f (diff)
downloadscintilla-mirror-8fcd543a7e41bef0e040a7c9b77ac8c7d1ac6439.tar.gz
Set of patches from John Ehresman:
Make sure the ListBox widget is created before modifying it. Call DropGraphics() when a widget is unmapped to conserve resources and because DropGraphics() ends up being called from the map signal handler so nothing is saved by not calling it. Remove the nearly identical accent / character macro re-definitions. Make sure widget is realized before grabbing the primary selection. Ensure the caret is visible after a selection is pasted. Ensure uri data is NULL-terminated before calling NotifyURIDropped. Use correct call, gdk_region_destroy, to free a region. The fixed-height-mode property is used to optimize display of large autocompletion lists. This property was added in gtk 2.4, but is probed for at runtime so the code should work with older gtk versions. The active color is set to the selected color on the list box so the selected lines are more clearly selected when the listbox widget does not have the focus. The autocompletion popup never gets the focus so the active color ends up being used.
-rw-r--r--gtk/PlatGTK.cxx34
-rw-r--r--gtk/ScintillaGTK.cxx23
2 files changed, 42 insertions, 15 deletions
diff --git a/gtk/PlatGTK.cxx b/gtk/PlatGTK.cxx
index f841a96f0..9abeb5454 100644
--- a/gtk/PlatGTK.cxx
+++ b/gtk/PlatGTK.cxx
@@ -1968,6 +1968,31 @@ static gboolean ButtonPress(GtkWidget *, GdkEventButton* ev, gpointer p) {
return FALSE;
}
+#if GTK_MAJOR_VERSION >= 2
+/* Change the active color to the selected color so the listbox uses the color
+scheme that it would use if it had the focus. */
+static void StyleSet(GtkWidget *w, GtkStyle*, void*) {
+ GtkStyle* style;
+
+ g_return_if_fail(w != NULL);
+
+ /* Copy the selected color to active. Note that the modify calls will cause
+ recursive calls to this function after the value is updated and w->style to
+ be set to a new object */
+ style = gtk_widget_get_style(w);
+ if (style == NULL)
+ return;
+ if (!gdk_color_equal(&style->base[GTK_STATE_SELECTED], &style->base[GTK_STATE_ACTIVE]))
+ gtk_widget_modify_base(w, GTK_STATE_ACTIVE, &style->base[GTK_STATE_SELECTED]);
+
+ style = gtk_widget_get_style(w);
+ if (style == NULL)
+ return;
+ if (!gdk_color_equal(&style->text[GTK_STATE_SELECTED], &style->text[GTK_STATE_ACTIVE]))
+ gtk_widget_modify_text(w, GTK_STATE_ACTIVE, &style->text[GTK_STATE_SELECTED]);
+}
+#endif
+
void ListBoxX::Create(Window &, int, Point, int, bool) {
id = gtk_window_new(GTK_WINDOW_POPUP);
@@ -2003,6 +2028,8 @@ void ListBoxX::Create(Window &, int, Point, int, bool) {
gtk_list_store_new(N_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING);
list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+ g_signal_connect(G_OBJECT(list), "style-set", G_CALLBACK(StyleSet), NULL);
+
GtkTreeSelection *selection =
gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
@@ -2011,7 +2038,7 @@ void ListBoxX::Create(Window &, int, Point, int, bool) {
/* Columns */
GtkTreeViewColumn *column = gtk_tree_view_column_new();
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+ gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
gtk_tree_view_column_set_title(column, "Autocomplete");
GtkCellRenderer *renderer = gtk_cell_renderer_pixbuf_new();
@@ -2020,11 +2047,14 @@ void ListBoxX::Create(Window &, int, Point, int, bool) {
"pixbuf", PIXBUF_COLUMN);
renderer = gtk_cell_renderer_text_new();
+ gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1);
gtk_tree_view_column_pack_start(column, renderer, TRUE);
gtk_tree_view_column_add_attribute(column, renderer,
"text", TEXT_COLUMN);
gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
+ if (g_object_class_find_property(G_OBJECT_GET_CLASS(list), "fixed-height-mode"))
+ g_object_set(G_OBJECT(list), "fixed-height-mode", TRUE, NULL);
gtk_container_add(GTK_CONTAINER(PWidget(scroller)), PWidget(list));
gtk_widget_show(PWidget(list));
@@ -2047,7 +2077,7 @@ void ListBoxX::SetFont(Font &scint_font) {
}
#else
// Only do for Pango font as there have been crashes for GDK fonts
- if (PFont(scint_font)->pfd) {
+ if (Created() && PFont(scint_font)->pfd) {
// Current font is Pango font
gtk_widget_modify_font(PWidget(list), PFont(scint_font)->pfd);
}
diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx
index 6e560decb..9361df5e3 100644
--- a/gtk/ScintillaGTK.cxx
+++ b/gtk/ScintillaGTK.cxx
@@ -527,6 +527,7 @@ void ScintillaGTK::Map(GtkWidget *widget) {
void ScintillaGTK::UnMapThis() {
//Platform::DebugPrintf("ScintillaGTK::unmap this\n");
GTK_WIDGET_UNSET_FLAGS(PWidget(wMain), GTK_MAPPED);
+ DropGraphics();
gdk_window_hide(PWidget(wMain)->window);
gtk_widget_unmap(PWidget(wText));
gtk_widget_unmap(PWidget(scrollbarh));
@@ -1189,14 +1190,6 @@ const char *ScintillaGTK::CharacterSetID() const {
#define IS_ACC_OR_CHAR(x) \
(IS_CHAR(x)) || (IS_ACC(x))
-#define IS_ACC(x) \
- ((x) >= 65103 && (x) <= 65111)
-#define IS_CHAR(x) \
- ((x) >= 0 && (x) <= 128)
-
-#define IS_ACC_OR_CHAR(x) \
- (IS_CHAR(x)) || (IS_ACC(x))
-
static int MakeAccent(int key, int acc) {
const char *conv[] = {
"aeiounc AEIOUNC",
@@ -1399,7 +1392,7 @@ bool ScintillaGTK::OwnPrimarySelection() {
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 (currentPos != anchor) {
+ if (currentPos != anchor && GTK_WIDGET_REALIZED(GTK_WIDGET(PWidget(wMain)))) {
primarySelection = true;
gtk_selection_owner_set(GTK_WIDGET(PWidget(wMain)),
GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME);
@@ -1491,6 +1484,7 @@ void ScintillaGTK::ReceivedSelection(GtkSelectionData *selection_data) {
SetEmptySelection(currentPos + selText.len);
}
pdoc->EndUndoAction();
+ EnsureCaretVisible();
}
}
// else fprintf(stderr, "Target non string %d %d\n", (int)(selection_data->type),
@@ -1506,9 +1500,12 @@ void ScintillaGTK::ReceivedDrop(GtkSelectionData *selection_data) {
GetGtkSelectionText(selection_data, selText);
DropAt(posDrop, selText.s, false, selText.rectangular);
}
- } else {
- char *ptr = reinterpret_cast<char *>(selection_data->data);
- NotifyURIDropped(ptr);
+ } else if (selection_data->length > 0) {
+ char *ptr = new char[selection_data->length + 1];
+ ptr[selection_data->length] = '\0';
+ memcpy(ptr, selection_data->data, selection_data->length);
+ NotifyURIDropped(ptr);
+ delete []ptr;
}
Redraw();
}
@@ -2199,7 +2196,7 @@ gint ScintillaGTK::ExposeTextThis(GtkWidget * /*widget*/, GdkEventExpose *ose) {
paintState = notPainting;
if (rgnUpdate) {
- g_free(rgnUpdate);
+ gdk_region_destroy(rgnUpdate);
}
rgnUpdate = 0;