Revision: 1237 http://svn.sourceforge.net/geany/?rev=1237&view=rev Author: eht16 Date: 2007-01-31 07:53:11 -0800 (Wed, 31 Jan 2007)
Log Message: ----------- Improved the auto scrolling of documents (actually done by Nick).
Modified Paths: -------------- trunk/ChangeLog trunk/scintilla/ScintillaGTK.cxx trunk/src/document.c trunk/src/document.h trunk/src/keybindings.c trunk/src/sci_cb.c trunk/src/sciwrappers.c trunk/src/sciwrappers.h trunk/src/utils.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2007-01-30 21:55:45 UTC (rev 1236) +++ trunk/ChangeLog 2007-01-31 15:53:11 UTC (rev 1237) @@ -1,10 +1,18 @@ +2007-01-31 Enrico Tröger enrico.troeger@uvena.de + + * scintilla/ScintillaGTK.cxx, src/document.c, src/document.h, + src/keybindings.c, src/sci_cb.c, src/sciwrappers.c, + src/sciwrappers.h, src/utils.c: + Improved the auto scrolling of documents (actually done by Nick). + + 2007-01-30 Frank Lanitz frank@frank.uvena.de
- * configure.in, src/about.c, po/fi.po: + * configure.in, THANKS, src/about.c, po/fi.po: Added Finnish translation (Thanks to Harri Koskinen).
-2007-01-27 Enrico Troeger enrico.troeger@uvena.de +2007-01-27 Enrico Tröger enrico.troeger@uvena.de
* src/callbacks.c, src/document.c, src/document.h, src/keyfile.c, src/sci_cb.c, src/sciwrappers.c, src/sciwrappers.h:
Modified: trunk/scintilla/ScintillaGTK.cxx =================================================================== --- trunk/scintilla/ScintillaGTK.cxx 2007-01-30 21:55:45 UTC (rev 1236) +++ trunk/scintilla/ScintillaGTK.cxx 2007-01-31 15:53:11 UTC (rev 1237) @@ -2198,7 +2198,13 @@ rcPaint.right = ose->area.x + ose->area.width; rcPaint.bottom = ose->area.y + ose->area.height;
- PLATFORM_ASSERT(rgnUpdate == NULL); + /* We can receive an expose-event during an expose-event. + * This can happen when two different scroll messages are sent at different times. */ + if (rgnUpdate != NULL) + { + gdk_region_destroy(rgnUpdate); + rgnUpdate = NULL; + } #if GTK_MAJOR_VERSION >= 2 rgnUpdate = gdk_region_copy(ose->region); #endif
Modified: trunk/src/document.c =================================================================== --- trunk/src/document.c 2007-01-30 21:55:45 UTC (rev 1236) +++ trunk/src/document.c 2007-01-31 15:53:11 UTC (rev 1237) @@ -210,6 +210,7 @@ new_doc->sci = NULL; new_doc->undo_actions = NULL; new_doc->redo_actions = NULL; + new_doc->scroll_percent = -1.0F; }
@@ -312,7 +313,6 @@ this->line_breaking = app->pref_editor_line_breaking; this->use_auto_indention = app->pref_editor_use_auto_indention; this->has_tags = FALSE; - this->need_scrolling = FALSE;
treeviews_openfiles_add(new_idx); // sets this->iter
@@ -353,6 +353,7 @@ g_free(doc_list[idx].saved_encoding.encoding); g_free(doc_list[idx].file_name); tm_workspace_remove_object(doc_list[idx].tm_file, TRUE); + doc_list[idx].is_valid = FALSE; doc_list[idx].sci = NULL; doc_list[idx].file_name = NULL; @@ -360,6 +361,7 @@ doc_list[idx].encoding = NULL; doc_list[idx].has_bom = FALSE; doc_list[idx].tm_file = NULL; + doc_list[idx].scroll_percent = -1.0F; document_undo_clear(idx); if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(app->notebook)) == 0) { @@ -741,19 +743,19 @@ if (cl_options.goto_line >= 0) { // goto line which was specified on command line and then undefine the line sci_goto_line(doc_list[idx].sci, cl_options.goto_line - 1, TRUE); - doc_list[idx].need_scrolling = TRUE; + doc_list[idx].scroll_percent = 0.5F; cl_options.goto_line = -1; } else if (pos >= 0) { sci_set_current_position(doc_list[idx].sci, pos, FALSE); - doc_list[idx].need_scrolling = TRUE; + doc_list[idx].scroll_percent = 0.5F; } if (cl_options.goto_column >= 0) { // goto column which was specified on command line and then undefine the column gint cur_pos = sci_get_current_position(doc_list[idx].sci); sci_set_current_position(doc_list[idx].sci, cur_pos + cl_options.goto_column, FALSE); - doc_list[idx].need_scrolling = TRUE; + doc_list[idx].scroll_percent = 0.5F; cl_options.goto_column = -1; }
@@ -1039,7 +1041,7 @@ { sci_set_selection_start(doc_list[idx].sci, ttf.chrgText.cpMin); sci_set_selection_end(doc_list[idx].sci, ttf.chrgText.cpMax); - sci_scroll_to_line(doc_list[idx].sci, -1, 0.3); + doc_list[idx].scroll_percent = 0.3F; } else { @@ -1087,7 +1089,7 @@ if (search_pos != -1) { if (scroll) - sci_scroll_to_line(doc_list[idx].sci, -1, 0.3); + doc_list[idx].scroll_percent = 0.3F; } else {
Modified: trunk/src/document.h =================================================================== --- trunk/src/document.h 2007-01-30 21:55:45 UTC (rev 1236) +++ trunk/src/document.h 2007-01-31 15:53:11 UTC (rev 1237) @@ -64,8 +64,7 @@ gboolean changed; gboolean line_breaking; gboolean use_auto_indention; - // whether the current position in the doc needs to be made visible on a tab switch event - gboolean need_scrolling; + gfloat scroll_percent; // % to scroll view by on paint, if positive. time_t last_check; // to remember the last disk check time_t mtime; GTrashStack *undo_actions;
Modified: trunk/src/keybindings.c =================================================================== --- trunk/src/keybindings.c 2007-01-30 21:55:45 UTC (rev 1236) +++ trunk/src/keybindings.c 2007-01-31 15:53:11 UTC (rev 1237) @@ -788,7 +788,7 @@ if (new_pos != -1) { sci_goto_pos(doc_list[idx].sci, new_pos, TRUE); // set the cursor at the brace - sci_scroll_to_line(doc_list[idx].sci, -1, 0.5); + doc_list[idx].scroll_percent = 0.5F; } }
Modified: trunk/src/sci_cb.c =================================================================== --- trunk/src/sci_cb.c 2007-01-30 21:55:45 UTC (rev 1236) +++ trunk/src/sci_cb.c 2007-01-31 15:53:11 UTC (rev 1237) @@ -54,6 +54,7 @@ static void get_indent(ScintillaObject *sci, gint pos, gboolean use_this_line); static void auto_multiline(ScintillaObject *sci, gint pos); static gboolean is_comment(gint lexer, gint style); +static void scroll_to_line(ScintillaObject *sci, gint line, gfloat percent_of_view);
// calls the edit popup menu in the editor @@ -164,13 +165,16 @@ sci_cb_highlight_braces(sci, pos);
ui_update_statusbar(idx, pos); - - if (doc_list[idx].need_scrolling) - { // scroll the document if needed because here it is already realised - sci_scroll_to_line(doc_list[idx].sci, -1, 0.5F); - doc_list[idx].need_scrolling = FALSE; - }
+ /* Visible lines are only laid out accurately once [SCN_UPDATEUI] is sent, + * so we need to only call sci_scroll_to_line here, because the document + * may have line wrapping and folding enabled. + * http://scintilla.sourceforge.net/ScintillaDoc.html#LineWrapping */ + if (doc_list[idx].scroll_percent > 0.0F) + { + scroll_to_line(sci, -1, doc_list[idx].scroll_percent); + doc_list[idx].scroll_percent = -1.0F; // disable further scrolling + } #if 0 /// experimental code for inverting selections { @@ -2078,3 +2082,30 @@ // reset the selection sci_set_anchor(doc_list[idx].sci, pos); } + + +/* Scroll the view to make line appear at percent_of_view. + * line can be -1 to use the current position. */ +static void scroll_to_line(ScintillaObject *sci, gint line, gfloat percent_of_view) +{ + gint vis1, los, delta; + GtkWidget *wid = GTK_WIDGET(sci); + + if (! wid->window || ! gdk_window_is_viewable(wid->window)) + return; + //if (GTK_WIDGET(sci)->allocation.height <= 1) return; // try to prevent gdk_window_scroll warning + + if (line == -1) + line = sci_get_current_line(sci, -1); + + // sci 'visible line' != doc line number because of folding and line wrapping + /* calling SCI_VISIBLEFROMDOCLINE for line is more accurate than calling + * SCI_DOCLINEFROMVISIBLE for vis1. */ + line = SSM(sci, SCI_VISIBLEFROMDOCLINE, line, 0); + vis1 = SSM(sci, SCI_GETFIRSTVISIBLELINE, 0, 0); + los = SSM(sci, SCI_LINESONSCREEN, 0, 0); + delta = (line - vis1) - los * percent_of_view; + sci_scroll_lines(sci, delta); + //sci_scroll_caret(sci); // ensure visible (maybe not needed now) +} +
Modified: trunk/src/sciwrappers.c =================================================================== --- trunk/src/sciwrappers.c 2007-01-30 21:55:45 UTC (rev 1236) +++ trunk/src/sciwrappers.c 2007-01-31 15:53:11 UTC (rev 1237) @@ -679,28 +679,6 @@ }
-/* Scroll the view to make line appear at percent_of_view. - * line can be -1 to use the current position. */ -void sci_scroll_to_line(ScintillaObject *sci, gint line, gfloat percent_of_view) -{ - gint vis1, los, delta; - - if (GTK_WIDGET(sci)->allocation.height <= 1) return; // try to prevent gdk_window_scroll warning - if (line == -1) - line = sci_get_current_line(sci, -1); - - // sci 'visible line' != doc line number because of folding and line wrapping - /* calling SCI_VISIBLEFROMDOCLINE for line is more accurate than calling - * SCI_DOCLINEFROMVISIBLE for vis1. */ - line = SSM(sci, SCI_VISIBLEFROMDOCLINE, line, 0); - vis1 = SSM(sci, SCI_GETFIRSTVISIBLELINE, 0, 0); - los = SSM(sci, SCI_LINESONSCREEN, 0, 0); - delta = (line - vis1) - los * percent_of_view; - sci_scroll_lines(sci, delta); - sci_scroll_caret(sci); // ensure visible (maybe not needed now) -} - - gint sci_search_next(ScintillaObject *sci, gint flags, const gchar *text) { return SSM(sci, SCI_SEARCHNEXT, flags, (sptr_t) text );
Modified: trunk/src/sciwrappers.h =================================================================== --- trunk/src/sciwrappers.h 2007-01-30 21:55:45 UTC (rev 1236) +++ trunk/src/sciwrappers.h 2007-01-31 15:53:11 UTC (rev 1237) @@ -125,7 +125,6 @@ void sci_set_anchor (ScintillaObject * sci, gint pos); void sci_scroll_caret (ScintillaObject * sci); void sci_scroll_lines (ScintillaObject * sci, gint lines); -void sci_scroll_to_line (ScintillaObject * sci, gint line, gfloat percent_of_view); gint sci_search_next (ScintillaObject * sci, gint flags, const gchar *text); gint sci_search_prev (ScintillaObject * sci, gint flags, const gchar *text); gint sci_find_text (ScintillaObject * sci, gint flags, struct TextToFind *ttf);
Modified: trunk/src/utils.c =================================================================== --- trunk/src/utils.c 2007-01-30 21:55:45 UTC (rev 1236) +++ trunk/src/utils.c 2007-01-31 15:53:11 UTC (rev 1237) @@ -226,7 +226,7 @@ sci_set_marker_at_line(doc_list[idx].sci, line, TRUE, 0);
sci_goto_line(doc_list[idx].sci, line, TRUE); - sci_scroll_to_line(doc_list[idx].sci, -1, 0.25); + doc_list[idx].scroll_percent = 0.25F;
// finally switch to the page page_num = gtk_notebook_page_num(GTK_NOTEBOOK(app->notebook), GTK_WIDGET(doc_list[idx].sci));
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.