aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/interface-gtk
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2025-02-02 16:09:08 +0300
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2025-02-16 02:20:39 +0300
commit980dcdaa138a42830af4e2533b7e970d7f5fa3cf (patch)
treea3848f050b86913b4652b44c146077664eeb9028 /src/interface-gtk
parentb87c56799ab6f6d651e1dc6c712a625545a4ad5f (diff)
downloadsciteco-980dcdaa138a42830af4e2533b7e970d7f5fa3cf.tar.gz
only scroll the caret if dot changes
* Fixes scrolling with default ^KMOUSE macro from fnkeys.tes which adjusts the scroll position without changing dot. The unconditional SCI_SCROLLCARET would effectively prevent scrolling to any position that does not contain dot.
Diffstat (limited to 'src/interface-gtk')
-rw-r--r--src/interface-gtk/interface.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/interface-gtk/interface.c b/src/interface-gtk/interface.c
index 4619b75..ed9271b 100644
--- a/src/interface-gtk/interface.c
+++ b/src/interface-gtk/interface.c
@@ -924,13 +924,6 @@ teco_interface_refresh(gboolean current_view_changed)
teco_interface.current_view_widget);
gtk_widget_show(teco_interface.current_view_widget);
}
-
- /*
- * Scintilla has been patched to avoid any automatic scrolling since that
- * has been benchmarked to be a very costly operation.
- * Instead we do it only once after every keypress.
- */
- teco_interface_ssm(SCI_SCROLLCARET, 0, 0);
}
static void
@@ -1342,10 +1335,14 @@ static void
teco_interface_size_allocate_cb(GtkWidget *widget,
GdkRectangle *allocation, gpointer user_data)
{
+ static gboolean scrolled = FALSE;
+
/*
* This especially ensures that the caret is visible after startup.
*/
- teco_interface_ssm(SCI_SCROLLCARET, 0, 0);
+ if (G_UNLIKELY(!scrolled))
+ teco_interface_ssm(SCI_SCROLLCARET, 0, 0);
+ scrolled = TRUE;
}
static gboolean
@@ -1410,7 +1407,9 @@ teco_interface_input_cb(GtkWidget *widget, GdkEvent *event, gpointer user_data)
* the Curses UI.
*/
gdk_window_freeze_updates(top_window);
+
const teco_view_t *last_view = teco_interface_current_view;
+ sptr_t last_pos = teco_interface_ssm(SCI_GETCURRENTPOS, 0, 0);
teco_interrupted = FALSE;
switch (event->type) {
@@ -1432,6 +1431,15 @@ teco_interface_input_cb(GtkWidget *widget, GdkEvent *event, gpointer user_data)
teco_interrupted = FALSE;
teco_interface_refresh(teco_interface_current_view != last_view);
+ /*
+ * Scintilla has been patched to avoid any automatic scrolling since that
+ * has been benchmarked to be a very costly operation.
+ * Instead we do it only once after every keypress.
+ */
+ if (teco_interface_current_view != last_view ||
+ last_pos != teco_interface_ssm(SCI_GETCURRENTPOS, 0, 0))
+ teco_interface_ssm(SCI_SCROLLCARET, 0, 0);
+
gdk_window_thaw_updates(top_window);
if (g_error_matches(error, TECO_ERROR, TECO_ERROR_QUIT)) {