簡體   English   中英

gtk +以編程方式向后滾動scrolled_window中包含vte終端的一行

[英]gtk+ programmatically scroll back a single line in scrolled_window containing a vte terminal

我正在嘗試設置按鍵功能,以指定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;

    }

我在docs中閱讀了gtk_adjustment_set_value ()

請注意,對於在GtkScrollbar中使用的調整,允許值的有效范圍是從調整->降低到調整->上部-調整-> page_size。

它在gtk_scrolled_window_set_vadjustment下沒有提供任何指導。

所以我想也許這個公式會給我單行的滾動步長:

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

我錯了。 我嘗試使用等於GtkAdjust結構Set的step_increment的步長:

 step_size = gtk_adjustment_get_step_increment(verticalAdjust);

這只是將step_size大部分保留為1.0,並且在上限達到〜60時向后滾動太多。

我嘗試將step_size設置為0.1、1、10,但似乎對整個調整過程的工作方式沒有任何意義。

我剛剛打開了一個新的終端窗口,然后輸入dmesg,然后輸入一次shift + up。 我通過上面的printf語句創建的輸出驗證,step_size為1.0,上限為420,滾動窗口一直滾動到頂部。 某些操作不正確,或者我沒有得到任何東西。

任何指導將不勝感激。 謝謝。

啊,燈亮了!

只需簡單地滾動一下您需要的一行:

    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應該可以解決這個問題,但是我永遠也找不到辦法。 也許我只是誤解了文檔。 無論如何,我只是決定使用全局變量來實現。

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

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM