[英]GTK: Get pointer position on scroll-event AFTER scrolled_window has scrolled
[英]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.