0

キープレス機能をセットアップして、Shift + Upキーの組み合わせをvteターミナルウィンドウで1行スクロールバックするように割り当てようとしています。これが私がこれまでに持っているものです:

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

したがって、この式で1行のスクロールステップサイズが得られるのではないかと思いました。

 `step_size = ((upper - page_size) - lower)/page_size;`

私は間違っていた。GtkAdjust 構造体 Set の step_increment に等しいステップ サイズを試しました。

 step_size = gtk_adjustment_get_step_increment(verticalAdjust);

これにより、ほとんどの場合、step_size が 1.0 のままになり、upper が ~60 に達するとスクロールしすぎました。

step_size を 0.1、1、10 に設定してみましたが、この調整全体がどのように機能するのかまったく理解できません。

新しいターミナル ウィンドウを開いて dmesg と入力し、次に Shift+Up を 1 回入力しました。上記の printf ステートメントによって作成された出力で、step_size が 1.0、upper が 420 で、スクロールされたウィンドウが一番上までスクロールしたことを確認しました。何かが正しく機能していないか、何かが得られません。

どんなガイダンスでも大歓迎です。ありがとう。

4

2 に答える 2

0

ergosysが指摘したように、解決策は私が以前考えていたよりもはるかに簡単です。上にスクロールするために使用した2行は次のとおりです。

    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);

    }
于 2012-07-12T19:22:50.467 に答える
0

あ、光りました!

必要な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 がこれを支援できるはずですが、その方法がわかりませんでした。または、ドキュメントを誤解しただけかもしれません。とにかく、グローバル変数でそれを行うことにしました。

于 2012-07-06T05:59:35.113 に答える