【问题标题】:gtk+ programmatically scroll back a single line in scrolled_window containing a vte terminalgtk+ 以编程方式在包含 vte 终端的 scrolled_window 中回滚一行
【发布时间】:2012-07-05 22:03:11
【问题描述】:

我正在尝试设置按键功能以分配 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 中使用的调整,允许值的有效范围是从调整->下限到调整->上限-调整->页面大小。

gtk_scrolled_window_set_vadjustment 下不提供任何指导。

所以我想也许这个公式会给我单行的滚动步长:

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

我错了。我尝试了一个等于 GtkAdjust 结构集的 step_increment 的步长:

 step_size = gtk_adjustment_get_step_increment(verticalAdjust);

这只是让 step_size 在大多数情况下保持在 1.0,当上限达到 ~60 时向后滚动太多。

我尝试了 0.1、1、10 的 step_size,但我似乎无法理解整个调整的工作原理。

我刚刚打开了一个新的终端窗口并输入了 dmesg 然后一个 shift+up。我通过上面 printf 语句创建的输出验证了 step_size 是 1.0,upper 是 420,并且滚动窗口一直滚动到顶部。有些东西不正常,或者我什么都没有。

任何指导将不胜感激。谢谢。

【问题讨论】:

  • 我从未使用过 vte,但很可能 get_step_increment 是正确的值。对于给定的缓冲区 # 行,上限和下限将是固定的,但您必须确保 set_value 牢记页面大小。你想要给 set_value 的最大值是 get_upper()-get_page_size()。当然,最小值应该始终 >= 0。
  • @ergosys,get_step_increment 不适合我。我验证它保持在恒定的 1.0,但在 94 的上限时,我通过单按 shift+up 向后滚动了 55 行。您能否为我验证这是以编程方式回滚的唯一方法(使用 GtkAdjustments)。我还没有找到任何其他方法,但我希望。谢谢。
  • 首先进行更正,最小值应该是 >= get_lower(),而不是我所说的 0。继续前进,您似乎正在将值设置为增量。您想做一些类似 set_value(clamp(get_value()-get_step_increment(),get_lower(),get_upper()-get_page_size())) 的事情,其中​​clamp 将其arg #1 限制在arg#2 和arg#3 之间,并返回它。

标签: c gtk scrolledwindow


【解决方案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 应该能够帮助解决这个问题,但我永远无法弄清楚如何。或者,也许我只是误解了文档。无论如何,我只是决定用全局变量来做。

【讨论】:

  • 您不需要全局。调整与滚动窗口相关联并包含滚动位置和相关信息。将它们视为 ScrolledWindow 对象中的对象,您可以通过例如访问(获取指针) get_vadjustment()。您无需调用 set_vadjustment,即用于替换现有对象。所以要回滚一行:adj->set_value(adj->get_value()-1),就这么简单,除了检查限制,正如我提到的。
  • @ergosys,真的就是这么简单。我把它弄得多么复杂有点有趣。我只是找不到将碎片拼凑在一起的方法。同样,如果您愿意重新提交此解释作为答案,我会接受。再次感谢
  • 我没时间。继续并选择您的答案,或者如果您愿意,可以添加另一个答案。
【解决方案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);

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多