我如何理解以下含义?

时间:2010-05-01 16:43:07

标签: c gtk scrollbar

引自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标记重力,而不是重力,是吗?

3 个答案:

答案 0 :(得分:1)

标记<滚动条的位置没有任何关系

它们在该代码中使用标记,因为它方便了函数gtk_text_view_scroll_mark_onscreen(),它是计算标记位置的快捷方式,然后将滚动条移动到该位置。

"end"标记是右重力标记,因此当它们将文本添加到缓冲区的末尾时,标记会保留在结尾处。这样,当它们scroll_mark_onscreen时,垂直和水平滚动条都会移动,以显示最后一行的结尾。

"scroll"标记留下了重力。当他们将文本添加到缓冲区的末尾时,他们并不关心它的位置,因为他们在添加文本时将它们自动移动到最后一行的开头。这样,当他们scroll_mark_onscreen时,只有垂直滚动条移动,以显示最后一行的开头

他们也可以对两个标记都有正确的重力,因为他们不关心"scroll"标记的去向。

他们也可以为两个标记留下重力,并且只要他们添加文字,就会手动将"end"标记移动到最后一行的末尾,但他们没有,因为他们可以获得通过赋予"end"标记右重力自动生效相同。

答案 1 :(得分:0)

在检查GTK文档后,似乎mark是滚动区域中的某种命名位置,而滚动条的位置是您实际滚动到的缓冲区中的位置。如果您对HTML更熟悉,那么mark似乎与网页上的锚点略微相同,您可以通过编程方式滚动到该页面。

答案 2 :(得分:0)

在滚动功能中,函数gtk_text_view_scroll_mark_onscreen()用于定位滚动条。这似乎是同步文本位置和滚动条位置的最简单方法。

他们使用两个函数来模拟“显示文本的结尾”(即可能包含水平偏移的内容)和“显示文本的最后一行”(其中水平偏移保持不变)。