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 должен помочь с этим, но я никогда не мог понять, как. Или, может быть, я просто неправильно понял документы. Во всяком случае, я просто решил сделать это с глобальными переменными.

Другие вопросы по тегам