talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 3c8f5d6e9e699b83877a991bdff6ad344480d0b1
parent 3d765a3396a0fb59802723fc9319a3c0f50b0056
Author: Oliver Lowe <o@olowe.co>
Date:   Sun, 24 Aug 2025 14:37:19 +1000

Use GTK default scrolling in message, text views

Diffstat:
Msrc/gtk/gtkutils.c | 60------------------------------------------------------------
Msrc/gtk/gtkutils.h | 6------
Msrc/messageview.c | 4+---
Msrc/mimeview.c | 100-------------------------------------------------------------------------------
Msrc/mimeview.h | 6------
Msrc/prefs_common.c | 2--
Msrc/prefs_common.h | 1-
Msrc/prefs_message.c | 10----------
Msrc/summaryview.c | 27+++++++--------------------
Msrc/textview.c | 113-------------------------------------------------------------------------------
Msrc/textview.h | 6------
11 files changed, 8 insertions(+), 327 deletions(-)

diff --git a/src/gtk/gtkutils.c b/src/gtk/gtkutils.c @@ -1079,66 +1079,6 @@ GtkWidget *gtkut_sc_combobox_create(GtkWidget *eventbox, gboolean focus_on_click return combobox; } -gboolean gtkutils_scroll_page(GtkWidget *widget, GtkAdjustment *vadj, gboolean up) -{ - gfloat upper; - gfloat page_incr; - gfloat old_value; - - page_incr = gtk_adjustment_get_page_increment(vadj); - if (prefs_common.scroll_halfpage) - page_incr /= 2; - - old_value = gtk_adjustment_get_value(vadj); - if (!up) { - upper = gtk_adjustment_get_upper(vadj) - gtk_adjustment_get_page_size(vadj); - if (old_value < upper) { - old_value += page_incr; - old_value = MIN(old_value, upper); - gtk_adjustment_set_value(vadj, old_value); - g_signal_emit_by_name(G_OBJECT(vadj), - "value_changed", 0); - } else - return FALSE; - } else { - if (old_value > 0.0) { - old_value -= page_incr; - old_value = MAX(old_value, 0.0); - gtk_adjustment_set_value(vadj, old_value); - g_signal_emit_by_name(G_OBJECT(vadj), - "value_changed", 0); - } else - return FALSE; - } - return TRUE; -} - -void gtkutils_scroll_one_line(GtkWidget *widget, GtkAdjustment *vadj, gboolean up) -{ - gfloat upper; - gfloat old_value; - - old_value = gtk_adjustment_get_value(vadj); - if (!up) { - upper = gtk_adjustment_get_upper(vadj) - gtk_adjustment_get_page_size(vadj); - if (old_value < upper) { - old_value += gtk_adjustment_get_step_increment(vadj); - old_value = MIN(old_value, upper); - gtk_adjustment_set_value(vadj, old_value); - g_signal_emit_by_name(G_OBJECT(vadj), - "value_changed", 0); - } - } else { - if (old_value > 0.0) { - old_value -= gtk_adjustment_get_step_increment(vadj); - old_value = MAX(old_value, 0.0); - gtk_adjustment_set_value(vadj, old_value); - g_signal_emit_by_name(G_OBJECT(vadj), - "value_changed", 0); - } - } -} - gboolean gtkut_tree_model_text_iter_prev(GtkTreeModel *model, GtkTreeIter *iter, const gchar* text) diff --git a/src/gtk/gtkutils.h b/src/gtk/gtkutils.h @@ -183,12 +183,6 @@ gboolean get_tag_range(GtkTextIter *iter, GtkWidget *face_get_from_header(const gchar *o_face); GtkWidget *gtkut_sc_combobox_create(GtkWidget *eventbox, gboolean focus_on_click); -void gtkutils_scroll_one_line (GtkWidget *widget, - GtkAdjustment *vadj, - gboolean up); -gboolean gtkutils_scroll_page (GtkWidget *widget, - GtkAdjustment *vadj, - gboolean up); gboolean gtkut_tree_model_text_iter_prev(GtkTreeModel *model, GtkTreeIter *iter, diff --git a/src/messageview.c b/src/messageview.c @@ -1381,10 +1381,8 @@ static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event, messageview->window) { MsgInfo *new_msginfo = summary_get_selected_msg(messageview->mainwin->summaryview); messageview_show(messageview, new_msginfo, messageview->all_headers); - return FALSE; } - - return mimeview_pass_key_press_event(messageview->mimeview, event); + return FALSE; } static void select_account_cb(GtkWidget *w, gpointer data) diff --git a/src/mimeview.c b/src/mimeview.c @@ -81,9 +81,6 @@ static void mimeview_selected (GtkTreeSelection *selection, static gint mimeview_button_pressed (GtkWidget *widget, GdkEventButton *event, MimeView *mimeview); -static gint mimeview_key_pressed (GtkWidget *widget, - GdkEventKey *event, - MimeView *mimeview); static void mimeview_drag_data_get (GtkWidget *widget, GdkDragContext *drag_context, @@ -349,8 +346,6 @@ MimeView *mimeview_create(MainWindow *mainwin) G_CALLBACK(mimeview_selected), mimeview); g_signal_connect(G_OBJECT(ctree), "button_release_event", G_CALLBACK(mimeview_button_pressed), mimeview); - g_signal_connect(G_OBJECT(ctree), "key_press_event", - G_CALLBACK(mimeview_key_pressed), mimeview); g_signal_connect(G_OBJECT(ctree), "drag_data_get", G_CALLBACK(mimeview_drag_data_get), mimeview); @@ -1490,12 +1485,6 @@ static gboolean part_button_pressed(MimeView *mimeview, GdkEventButton *event, return FALSE; } - -gboolean mimeview_pass_key_press_event(MimeView *mimeview, GdkEventKey *event) -{ - return mimeview_key_pressed(mimeview->ctree, event, mimeview); -} - void mimeview_select_next_part(MimeView *mimeview) { GtkTreeView *ctree = GTK_TREE_VIEW(mimeview->ctree); @@ -1568,56 +1557,6 @@ skip: #define BREAK_ON_MODIFIER_KEY() \ if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0) break -static gint mimeview_key_pressed(GtkWidget *widget, GdkEventKey *event, - MimeView *mimeview) -{ - SummaryView *summaryview; - - if (!event) return FALSE; - if (!mimeview->opened) return FALSE; - - summaryview = mimeview->messageview->mainwin->summaryview; - - if (summaryview && quicksearch_has_focus(summaryview->quicksearch)) - return FALSE; - - switch (event->keyval) { - case GDK_KEY_Home: - case GDK_KEY_End: - textview_scroll_max(mimeview->textview, - (event->keyval == GDK_KEY_Home)); - return TRUE; - case GDK_KEY_Page_Down: - case GDK_KEY_space: - if (mimeview_scroll_page(mimeview, - (event->state & GDK_SHIFT_MASK) != 0)) - return TRUE; - - if (!(event->state & GDK_SHIFT_MASK)) - mimeview_select_next_part(mimeview); - return TRUE; - case GDK_KEY_Page_Up: - case GDK_KEY_BackSpace: - mimeview_scroll_page(mimeview, TRUE); - return TRUE; - case GDK_KEY_Return: - case GDK_KEY_KP_Enter: - mimeview_scroll_one_line(mimeview, - (event->state & GDK_MOD1_MASK) != 0); - return TRUE; - case GDK_KEY_Up: - case GDK_KEY_Down: - mimeview_scroll_one_line(mimeview, (event->keyval == GDK_KEY_Up)); - return TRUE; - default: - break; - } - - if (mimeview->messageview->new_window) return FALSE; - - return summary_pass_key_press_event(summaryview, event); -} - static void mimeview_drag_data_get(GtkWidget *widget, GdkDragContext *drag_context, GtkSelectionData *selection_data, @@ -2342,22 +2281,6 @@ static gint icon_key_pressed(GtkWidget *button, GdkEventKey *event, if (!event) return FALSE; switch (event->keyval) { - case GDK_KEY_space: - if (mimeview_scroll_page(mimeview, FALSE)) - return TRUE; - - mimeview_select_next_part(mimeview); - return TRUE; - - break; - case GDK_KEY_BackSpace: - mimeview_scroll_page(mimeview, TRUE); - return TRUE; - case GDK_KEY_Return: - case GDK_KEY_KP_Enter: - mimeview_scroll_one_line(mimeview, - (event->state & GDK_MOD1_MASK) != 0); - return TRUE; case GDK_KEY_y: BREAK_ON_MODIFIER_KEY(); mimeview_save_as(mimeview); @@ -2773,26 +2696,3 @@ void mimeview_handle_cmd(MimeView *mimeview, const gchar *cmd, GdkEventButton *e g_free(buf); } } - -gboolean mimeview_scroll_page(MimeView *mimeview, gboolean up) -{ - if (mimeview->type == MIMEVIEW_TEXT) - return textview_scroll_page(mimeview->textview, up); - else if (mimeview->mimeviewer) { - MimeViewer *mimeviewer = mimeview->mimeviewer; - if (mimeviewer->scroll_page) - return mimeviewer->scroll_page(mimeviewer, up); - } - return TRUE; -} - -void mimeview_scroll_one_line(MimeView *mimeview, gboolean up) -{ - if (mimeview->type == MIMEVIEW_TEXT) - textview_scroll_one_line(mimeview->textview, up); - else if (mimeview->mimeviewer) { - MimeViewer *mimeviewer = mimeview->mimeviewer; - if (mimeviewer->scroll_one_line) - mimeviewer->scroll_one_line(mimeviewer, up); - } -} diff --git a/src/mimeview.h b/src/mimeview.h @@ -107,8 +107,6 @@ struct _MimeViewer void (*clear_viewer) (MimeViewer *); void (*destroy_viewer) (MimeViewer *); gchar *(*get_selection) (MimeViewer *); - gboolean (*scroll_page) (MimeViewer *, gboolean up); - void (*scroll_one_line) (MimeViewer *, gboolean up); gboolean (*text_search) (MimeViewer *, gboolean backward, const gchar *str, gboolean case_sensitive); @@ -147,10 +145,6 @@ void mimeview_handle_cmd (MimeView *mimeview, gpointer data); void mimeview_select_mimepart_icon (MimeView *mimeview, MimeInfo *partinfo); -gboolean mimeview_scroll_page (MimeView *mimeview, - gboolean up); -void mimeview_scroll_one_line (MimeView *mimeview, - gboolean up); gint mimeview_get_selected_part_num (MimeView *mimeview); void mimeview_select_part_num (MimeView *mimeview, gint i); diff --git a/src/prefs_common.c b/src/prefs_common.c @@ -508,8 +508,6 @@ static PrefParam param[] = { {"never_send_retrcpt", "FALSE", &prefs_common.never_send_retrcpt, P_BOOL, NULL, NULL, NULL}, - {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL, - NULL, NULL, NULL}, {"hide_quoted", "TRUE", &prefs_common.hide_quoted, P_BOOL, NULL, NULL, NULL}, diff --git a/src/prefs_common.h b/src/prefs_common.h @@ -326,7 +326,6 @@ struct _PrefsCommon gint line_space; gboolean render_html; gboolean promote_html_part; - gboolean scroll_halfpage; gboolean hide_quoted; gboolean respect_flowed_format; gboolean show_all_headers; diff --git a/src/prefs_message.c b/src/prefs_message.c @@ -54,7 +54,6 @@ typedef struct _MessagePage GtkWidget *checkbtn_promote_html_part; GtkWidget *spinbtn_linespc; - GtkWidget *checkbtn_halfpage; GtkWidget *checkbtn_hide_quoted; GtkWidget *checkbtn_attach_desc; @@ -84,7 +83,6 @@ static void prefs_message_create_widget(PrefsPage *_page, GtkWindow *window, GtkWidget *vbox_scr; GtkWidget *hbox_scr; GtkWidget *label_scr; - GtkWidget *checkbtn_halfpage; GtkWidget *checkbtn_hide_quoted; GtkWidget *checkbtn_attach_desc; @@ -156,9 +154,6 @@ static void prefs_message_create_widget(PrefsPage *_page, GtkWindow *window, gtk_widget_show_all (hbox1); vbox_scr = gtkut_get_options_frame(vbox1, &frame, _("Scroll")); - - PACK_CHECK_BUTTON(vbox_scr, checkbtn_halfpage, _("Half page")); - hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 32); gtk_widget_show (hbox1); gtk_box_pack_start (GTK_BOX (vbox_scr), hbox1, FALSE, TRUE, 0); @@ -200,8 +195,6 @@ static void prefs_message_create_widget(PrefsPage *_page, GtkWindow *window, prefs_common.promote_html_part); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_hide_quoted), prefs_common.hide_quoted); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_halfpage), - prefs_common.scroll_halfpage); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_attach_desc), prefs_common.attach_desc); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbtn_linespc), @@ -215,7 +208,6 @@ static void prefs_message_create_widget(PrefsPage *_page, GtkWindow *window, prefs_message->checkbtn_promote_html_part = checkbtn_promote_html_part; prefs_message->spinbtn_linespc = spinbtn_linespc; prefs_message->checkbtn_hide_quoted = checkbtn_hide_quoted; - prefs_message->checkbtn_halfpage = checkbtn_halfpage; prefs_message->checkbtn_attach_desc = checkbtn_attach_desc; prefs_message->page.widget = vbox1; @@ -235,8 +227,6 @@ static void prefs_message_save(PrefsPage *_page) GTK_TOGGLE_BUTTON(page->checkbtn_html)); prefs_common.promote_html_part = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(page->checkbtn_promote_html_part)); - prefs_common.scroll_halfpage = gtk_toggle_button_get_active( - GTK_TOGGLE_BUTTON(page->checkbtn_halfpage)); prefs_common.hide_quoted = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(page->checkbtn_hide_quoted)); prefs_common.attach_desc = gtk_toggle_button_get_active( diff --git a/src/summaryview.c b/src/summaryview.c @@ -5926,40 +5926,27 @@ static gboolean summary_key_pressed(GtkWidget *widget, GdkEventKey *event, if (summaryview->selected) { gboolean handled = FALSE; switch (event->keyval) { - case GDK_KEY_space: /* Page down or go to the next */ + case GDK_KEY_space: handled = TRUE; if (event->state & GDK_CONTROL_MASK) { handled = FALSE; break; } - if (event->state & GDK_SHIFT_MASK) - mimeview_scroll_page(messageview->mimeview, TRUE); if (summaryview->displayed != summaryview->selected) { - summary_display_msg(summaryview, - summaryview->selected); + summary_display_msg(summaryview, summaryview->selected); } else { if (mod_pressed) { - if (!mimeview_scroll_page(messageview->mimeview, TRUE)) - summary_select_prev_unread(summaryview); + summary_select_prev_unread(summaryview); } else { - if (!mimeview_scroll_page(messageview->mimeview, FALSE)) - summary_select_next_unread(summaryview); + summary_select_next_unread(summaryview); } } break; - case GDK_KEY_BackSpace: /* Page up */ - handled = TRUE; - mimeview_scroll_page(messageview->mimeview, TRUE); - break; - case GDK_KEY_Return: /* Scroll up/down one line */ + case GDK_KEY_Return: case GDK_KEY_KP_Enter: handled = TRUE; - if (summaryview->displayed != summaryview->selected) { - summary_display_msg(summaryview, - summaryview->selected); - break; - } - mimeview_scroll_one_line(messageview->mimeview, mod_pressed); + if (summaryview->displayed != summaryview->selected) + summary_display_msg(summaryview, summaryview->selected); break; } diff --git a/src/textview.c b/src/textview.c @@ -150,9 +150,6 @@ static GPtrArray *textview_scan_header (TextView *textview, static void textview_show_header (TextView *textview, GPtrArray *headers); -static gint textview_key_pressed (GtkWidget *widget, - GdkEventKey *event, - TextView *textview); static gboolean textview_motion_notify (GtkWidget *widget, GdkEventMotion *motion, TextView *textview); @@ -264,8 +261,6 @@ TextView *textview_create(void) gtk_container_add(GTK_CONTAINER(scrolledwin), text); - g_signal_connect(G_OBJECT(text), "key-press-event", - G_CALLBACK(textview_key_pressed), textview); g_signal_connect(G_OBJECT(text), "motion-notify-event", G_CALLBACK(textview_motion_notify), textview); g_signal_connect(G_OBJECT(text), "leave-notify-event", @@ -1985,114 +1980,6 @@ gboolean textview_search_string_backward(TextView *textview, const gchar *str, return gtkut_text_view_search_string_backward(text, str, case_sens); } -void textview_scroll_one_line(TextView *textview, gboolean up) -{ - GtkTextView *text = GTK_TEXT_VIEW(textview->text); - GtkAdjustment *vadj = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(text)); - - gtkutils_scroll_one_line(GTK_WIDGET(text), vadj, up); -} - -gboolean textview_scroll_page(TextView *textview, gboolean up) -{ - GtkTextView *text = GTK_TEXT_VIEW(textview->text); - GtkAdjustment *vadj = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(text)); - - return gtkutils_scroll_page(GTK_WIDGET(text), vadj, up); -} - -void textview_scroll_max(TextView *textview, gboolean up) -{ - GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview->text)); - GtkTextIter iter; - - if (up) { - gtk_text_buffer_get_start_iter(buffer, &iter); - gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(textview->text), - &iter, 0.0, TRUE, 0.0, 1.0); - - } else { - gtk_text_buffer_get_end_iter(buffer, &iter); - gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(textview->text), - &iter, 0.0, TRUE, 0.0, 0.0); - } -} - -#define KEY_PRESS_EVENT_STOP() \ - g_signal_stop_emission_by_name(G_OBJECT(widget), \ - "key_press_event"); - -static gint textview_key_pressed(GtkWidget *widget, GdkEventKey *event, - TextView *textview) -{ - GdkWindow *window = NULL; - SummaryView *summaryview = NULL; - MessageView *messageview = textview->messageview; - gboolean mod_pressed; - - if (!event) return FALSE; - if (messageview->mainwin) - summaryview = messageview->mainwin->summaryview; - - switch (event->keyval) { - case GDK_KEY_Tab: - case GDK_KEY_Left: - case GDK_KEY_Up: - case GDK_KEY_Right: - case GDK_KEY_Down: - case GDK_KEY_Control_L: - case GDK_KEY_Control_R: - return FALSE; - case GDK_KEY_Home: - case GDK_KEY_End: - textview_scroll_max(textview,(event->keyval == GDK_KEY_Home)); - return TRUE; - case GDK_KEY_space: - mod_pressed = ((event->state & (GDK_SHIFT_MASK|GDK_MOD1_MASK)) != 0); - if (!mimeview_scroll_page(messageview->mimeview, mod_pressed) && - summaryview != NULL) { - if (mod_pressed) - summary_select_prev_unread(summaryview); - else - summary_select_next_unread(summaryview); - } - break; - case GDK_KEY_Page_Down: - mimeview_scroll_page(messageview->mimeview, FALSE); - break; - case GDK_KEY_Page_Up: - case GDK_KEY_BackSpace: - mimeview_scroll_page(messageview->mimeview, TRUE); - break; - case GDK_KEY_Return: - case GDK_KEY_KP_Enter: - mimeview_scroll_one_line - (messageview->mimeview, (event->state & - (GDK_SHIFT_MASK|GDK_MOD1_MASK)) != 0); - break; - case GDK_KEY_Delete: - if (summaryview) - summary_pass_key_press_event(summaryview, event); - break; - default: - if (messageview->mainwin) { - window = gtk_widget_get_window(messageview->mainwin->window); - if (summaryview && - event->window != window) { - GdkEventKey tmpev = *event; - - tmpev.window = window; - KEY_PRESS_EVENT_STOP(); - gtk_widget_event(messageview->mainwin->window, - (GdkEvent *)&tmpev); - } - } - break; - } - - return TRUE; -} - static gboolean textview_motion_notify(GtkWidget *widget, GdkEventMotion *event, TextView *textview) diff --git a/src/textview.h b/src/textview.h @@ -103,12 +103,6 @@ void textview_set_text (TextView *textview, const gchar *text); void textview_set_position (TextView *textview, gint pos); -void textview_scroll_one_line (TextView *textview, - gboolean up); -gboolean textview_scroll_page (TextView *textview, - gboolean up); -void textview_scroll_max (TextView *textview, - gboolean up); gboolean textview_search_string (TextView *textview, const gchar *str,