gtk+ программно прокручивает назад одну строку в scrolled_window, содержащую терминал vte
Я пытаюсь настроить функцию нажатия клавиш, чтобы назначить комбинацию клавиш shift+up, чтобы прокрутить назад одну строку в окне терминала vte. Вот что у меня так далеко:
case GDK_Up:
if (event -> state & GDK_SHIFT_MASK)
{
GtkAdjustment *verticalAdjust;
gdouble lower = 0;
gdouble upper = 0;
gdouble page_size = 0;
gdouble step_size = 0.1;
verticalAdjust = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrollwin[0]));
lower = gtk_adjustment_get_lower(verticalAdjust);
upper = gtk_adjustment_get_upper(verticalAdjust);
page_size = gtk_adjustment_get_page_size(verticalAdjust);
step_size = ((upper - page_size) - lower)/page_size;
gtk_adjustment_set_value (verticalAdjust, step_size);
gtk_scrolled_window_set_vadjustment (GTK_SCROLLED_WINDOW(scrollwin[0]), verticalAdjust);
printf("vertAdj: %f, lower: %f, upper: %f, pg_size: %f, step_size: %f\n", gtk_adjustment_get_value(verticalAdjust), lower, upper, page_size, step_size);
return TRUE;
}
Я прочитал в документах для gtk_adjustment_set_value ()
:
Обратите внимание, что для корректировок, которые используются в GtkScrollbar, эффективный диапазон допустимых значений изменяется от корректировки -> ниже до корректировки -> сверху - корректировки->page_size.
Это не дает никаких указаний под gtk_scrolled_window_set_vadjustment
,
Поэтому я подумал, что, возможно, эта формула даст мне размер шага прокрутки в одну строку:
`step_size = ((upper - page_size) - lower)/page_size;`
Я был неправ. Я пробовал размер шага, равный step_increment структуры GtkAdjust. Set with:
step_size = gtk_adjustment_get_step_increment(verticalAdjust);
Это просто оставило значение step_size равным 1,0, по большей части, и слишком много прокрутилось назад, когда верх достиг 60.
Я пробовал step_size 0.1, 1, 10, и я не могу понять, как работает вся эта настройка.
Я просто открыл новое окно терминала и набрал dmesg, затем один сдвиг + вверх. Через вывод, созданный оператором printf выше, я подтвердил, что step_size был 1.0, верхний - 420, а прокручиваемое окно прокручивалось до самого верха. Что-то не работает правильно, или я что-то не понимаю.
Любое руководство будет высоко ценится. Благодарю.
2 ответа
Как отметил ergosys, решение намного проще, чем я думал ранее. Вот две строки, которые я использовал для прокрутки вверх:
vertAdj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrollwin[page]));
gtk_adjustment_set_value (vertAdj,gtk_adjustment_get_value(vertAdj)-1);
и для прокрутки вниз:
vertAdj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrollwin[page]));
adjValue = gtk_adjustment_get_value(vertAdj);
upper = gtk_adjustment_get_upper(vertAdj);
page_size = gtk_adjustment_get_page_size(vertAdj);
if (adjValue < upper - page_size)
{
gtk_adjustment_set_value (vertAdj,gtk_adjustment_get_value(vertAdj)+1);
}
Ах, свет загорелся!
Проще говоря, чтобы прокрутить назад одну строку, вам нужно:
adjust = upper - page_size - 1;
gtk_adjustment_set_value (verticalAdjust, adjust);
gtk_scrolled_window_set_vadjustment (GTK_SCROLLED_WINDOW(scrollwin[0]), verticalAdjust);
Для прокрутки другой строки вам понадобится:
adjust = upper - page_size - 2;
gtk_adjustment_set_value (verticalAdjust, adjust);
gtk_scrolled_window_set_vadjustment (GTK_SCROLLED_WINDOW(scrollwin[0]), verticalAdjust);
Таким образом, вам нужно хранить некоторые значения между итерациями. Предположительно, GtkAdjustment должен помочь с этим, но я никогда не мог понять, как. Или, может быть, я просто неправильно понял документы. Во всяком случае, я просто решил сделать это с глобальными переменными.