引自here

  if (to_end)
  {
    /* If we want to scroll to the end, including horizontal scrolling,
     * then we just create a mark with right gravity at the end of the
     * buffer. It will stay at the end unless explicitely moved with
     * gtk_text_buffer_move_mark.
     */
    gtk_text_buffer_create_mark (buffer, "end", &iter, FALSE);

    /* Add scrolling timeout. */
    return g_timeout_add (50, (GSourceFunc) scroll_to_end, textview);
  }
  else
  {
    /* If we want to scroll to the bottom, but not scroll horizontally,
     * then an end mark won't do the job. Just create a mark so we can
     * use it with gtk_text_view_scroll_mark_onscreen, we'll position it
     * explicitely when needed. Use left gravity so the mark stays where
     * we put it after inserting new text.
     */
    gtk_text_buffer_create_mark (buffer, "scroll", &iter, TRUE);

    /* Add scrolling timeout. */
    return g_timeout_add (100, (GSourceFunc) scroll_to_bottom, textview);
  }

虽然有不少评论,但我还是不明白其中的逻辑,特别是一个标记和滚动条的位置有什么关系?
更新
我似乎被这句话误导了:
  /* and place the mark at iter. the mark will stay there after we
   * insert some text at the end because it has right gravity.
   */

比方说,scroll标记有左重力,而不是右重力,对吗?

最佳答案

标记与滚动条的位置没有任何关系。
他们在代码中使用标记,因为函数gtk_text_view_scroll_mark_onscreen()很方便,它是计算标记位置的快捷方式,然后将滚动条移动到该位置。
"end"标记是一个右重力标记,因此当它们将文本添加到缓冲区的末尾时,该标记将保留在末尾。这样,当它们scroll_mark_onscreen时,垂直和水平滚动条都会移动,以显示最后一行的结尾。
"scroll"标记已离开重力。当他们把文本添加到缓冲区的末尾时,他们并不关心它的去向,因为每当他们把文本添加到最后一行的开头时,他们都会自己移动它。这样,当它们scroll_mark_onscreen时,只有垂直滚动条移动,以显示最后一行的开头。
他们也可以对两个标记都有正确的重力,因为他们不关心"scroll"标记的去向。
他们也可以对两个标记都使用左重力,并且在添加文本时手动将"end"标记移动到最后一行的末尾,但是他们没有,因为他们可以通过使用"end"标记右重力自动获得相同的效果。

关于c - 我如何理解以下含义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2750729/

10-16 19:17