diff --git a/meson.build b/meson.build index 804b5a2..d83a01b 100644 --- a/meson.build +++ b/meson.build @@ -38,8 +38,8 @@ libm = cc.find_library('m', required: false) girara = dependency('girara-gtk3', version: '>=0.4.3', fallback: ['girara', 'girara_dependency']) glib = dependency('glib-2.0', version: '>=2.72') gio = dependency('gio-unix-2.0', required: host_machine.system() != 'windows') -gthread = dependency('gthread-2.0', version: '>=2.74') -gmodule = dependency('gmodule-no-export-2.0', version: '>=2.74') +gthread = dependency('gthread-2.0', version: '>=2.72') +gmodule = dependency('gmodule-no-export-2.0', version: '>=2.72') gtk3 = dependency('gtk+-3.0', version: '>=3.24') json_glib = dependency('json-glib-1.0') cairo = dependency('cairo') diff --git a/zathura/config.c b/zathura/config.c index 545bc44..4c097e8 100644 --- a/zathura/config.c +++ b/zathura/config.c @@ -509,6 +509,9 @@ void config_load_default(zathura_t* zathura) { girara_shortcut_add(gsession, 0, GDK_KEY_Tab, NULL, sc_toggle_index, INDEX, 0, NULL); girara_shortcut_add(gsession, 0, GDK_KEY_k, NULL, sc_navigate_index, INDEX, UP, NULL); girara_shortcut_add(gsession, 0, GDK_KEY_j, NULL, sc_navigate_index, INDEX, DOWN, NULL); + girara_shortcut_add(gsession, GDK_CONTROL_MASK, GDK_KEY_d, NULL, sc_navigate_index, INDEX, HALF_DOWN, NULL); + girara_shortcut_add(gsession, GDK_CONTROL_MASK, GDK_KEY_u, NULL, sc_navigate_index, INDEX, HALF_UP, NULL); + girara_shortcut_add(gsession, 0, GDK_KEY_j, NULL, sc_navigate_index, INDEX, DOWN, NULL); girara_shortcut_add(gsession, 0, GDK_KEY_h, NULL, sc_navigate_index, INDEX, COLLAPSE, NULL); girara_shortcut_add(gsession, 0, GDK_KEY_l, NULL, sc_navigate_index, INDEX, EXPAND, NULL); girara_shortcut_add(gsession, 0, GDK_KEY_L, NULL, sc_navigate_index, INDEX, EXPAND_ALL, NULL); diff --git a/zathura/shortcuts.c b/zathura/shortcuts.c index cd5be3c..884a79c 100644 --- a/zathura/shortcuts.c +++ b/zathura/shortcuts.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: Zlib */ +#include #include #include #include @@ -1035,17 +1036,28 @@ sc_navigate_index(girara_session_t* session, girara_argument_t* argument, GtkTreeView *tree_view = gtk_container_get_children(GTK_CONTAINER(zathura->ui.index))->data; GtkTreePath *path; + GtkTreePath *start_path; + GtkTreePath *end_path; gtk_tree_view_get_cursor(tree_view, &path, NULL); if (path == NULL) { return false; } + if (gtk_tree_view_get_visible_range(tree_view, &start_path, &end_path) != TRUE) + { + girara_error("Cannot get visible range for index"); + gtk_tree_path_free(start_path); + gtk_tree_path_free(end_path); + return false; + } + GtkTreeModel *model = gtk_tree_view_get_model(tree_view); GtkTreeIter iter; GtkTreeIter child_iter; gboolean is_valid_path = TRUE; + gboolean need_to_scroll = FALSE; switch(argument->n) { case TOP: @@ -1101,6 +1113,18 @@ sc_navigate_index(girara_session_t* session, girara_argument_t* argument, && gtk_tree_path_up(path)); } break; + case HALF_UP: + gtk_tree_path_free(path); + gtk_tree_path_free(end_path); + path = start_path; + need_to_scroll = TRUE; + break; + case HALF_DOWN: + gtk_tree_path_free(path); + gtk_tree_path_free(start_path); + path = end_path; + need_to_scroll = TRUE; + break; case EXPAND: if (gtk_tree_view_expand_row(tree_view, path, FALSE)) { gtk_tree_path_down(path); @@ -1133,6 +1157,9 @@ sc_navigate_index(girara_session_t* session, girara_argument_t* argument, if (is_valid_path == TRUE) { gtk_tree_view_set_cursor(tree_view, path, NULL, FALSE); + if (need_to_scroll == TRUE) { + gtk_tree_view_scroll_to_cell(tree_view, path, NULL, TRUE, 0.5, 0.0); + } } gtk_tree_path_free(path);