【问题标题】:Gtk3 keys bindings in css filesCSS文件中的Gtk3键绑定
【发布时间】:2015-08-09 20:43:39
【问题描述】:

在哪里可以找到用户可以在 GTK+ 3 的 CSS 文件中定义的可用键绑定的详尽列表?

我已经检查了这些资源:

例如,用户如何使<Control>Space 将光标移动到GtkTextView 中的文本末尾?

【问题讨论】:

标签: css gtk gtk3 key-bindings pygobject


【解决方案1】:

似乎没有详尽的文档。以下是我目前发现的:

可能的操作列表(来自 /usr/share/themes/Emacs/gtk-3.0/gtk-keys.css):

  • 移动光标
  • 从光标中删除
  • 剪切剪贴板
  • 过去的剪贴板
  • 开始交互式搜索
  • 移动当前

获取 gtk+ 代码:

git clone git://git.gnome.org/gtk+

例如,“移动光标动作”:

bind  "<ctrl>b" { "move-cursor" (logical-positions, -1, 0) };

如果你这样做:

grep -i logical gtk+/gtk/gtkenums.h

您会找到匹配项并发现还有其他可能性:

/**
 * GtkMovementStep:
 * @GTK_MOVEMENT_LOGICAL_POSITIONS: Move forward or back by graphemes
 * @GTK_MOVEMENT_VISUAL_POSITIONS:  Move left or right by graphemes
 * @GTK_MOVEMENT_WORDS:             Move forward or back by words
 * @GTK_MOVEMENT_DISPLAY_LINES:     Move up or down lines (wrapped lines)
 * @GTK_MOVEMENT_DISPLAY_LINE_ENDS: Move to either end of a line
 * @GTK_MOVEMENT_PARAGRAPHS:        Move up or down paragraphs (newline-ended lines)
 * @GTK_MOVEMENT_PARAGRAPH_ENDS:    Move to either end of a paragraph
 * @GTK_MOVEMENT_PAGES:             Move by pages
 * @GTK_MOVEMENT_BUFFER_ENDS:       Move to ends of the buffer
 * @GTK_MOVEMENT_HORIZONTAL_PAGES:  Move horizontally by pages
 */

例如我想做的绑定(将光标移动到 Gtk::TextView 中文本的末尾)

bind "<Control>KP_Space" { "move-cursor" (buffer-ends, 1, 0) }

“模板”是:

bind "key_combination" { "action" (action_param1, action_param2, ...)}

对于move-cursor 操作,参数为(step, count, extend_selection),其中step 是上述枚举值之一。请注意,对于 line-endsparagraph-endsbuffer-ends,负值 count 表示“开始”,正值表示“结束”。而extend_selection 只是 0 或 1(对于 C 风格的“False”和“True”)。

同样,“删除光标”操作的选项是:

/**
 * GtkDeleteType:
 * @GTK_DELETE_CHARS: Delete characters.
 * @GTK_DELETE_WORD_ENDS: Delete only the portion of the word to the
 *   left/right of cursor if we’re in the middle of a word.
 * @GTK_DELETE_WORDS: Delete words.
 * @GTK_DELETE_DISPLAY_LINES: Delete display-lines. Display-lines
 *   refers to the visible lines, with respect to to the current line
 *   breaks. As opposed to paragraphs, which are defined by line
 *   breaks in the input.
 * @GTK_DELETE_DISPLAY_LINE_ENDS: Delete only the portion of the
 *   display-line to the left/right of cursor.
 * @GTK_DELETE_PARAGRAPH_ENDS: Delete to the end of the
 *   paragraph. Like C-k in Emacs (or its reverse).
 * @GTK_DELETE_PARAGRAPHS: Delete entire line. Like C-k in pico.
 * @GTK_DELETE_WHITESPACE: Delete only whitespace. Like M-\ in Emacs.
 *
 * See also: #GtkEntry::delete-from-cursor.
 */

现在,如果您希望所有人都看到所有可能的硬编码操作,那么 这是一种方法:

find ./gtk+/ -type f | xargs grep -A 2 gtk_binding_entry_add_signal

你会看到很多这样的事情:

./gtk+/gtk/gtklabel.c:  gtk_binding_entry_add_signal (binding_set, GDK_KEY_backslash, GDK_CONTROL_MASK,
./gtk+/gtk/gtklabel.c-              "move-cursor", 3,
./gtk+/gtk/gtklabel.c-              G_TYPE_ENUM, GTK_MOVEMENT_PARAGRAPH_ENDS,
--
./gtk+/gtk/gtklabel.c:  gtk_binding_entry_add_signal (binding_set, GDK_KEY_c, GDK_CONTROL_MASK,
./gtk+/gtk/gtklabel.c-              "copy-clipboard", 0);
./gtk+/gtk/gtklabel.c-
./gtk+/gtk/gtklabel.c:  gtk_binding_entry_add_signal (binding_set, GDK_KEY_Return, 0,
./gtk+/gtk/gtklabel.c-              "activate-current-link", 0);
./gtk+/gtk/gtklabel.c:  gtk_binding_entry_add_signal (binding_set, GDK_KEY_ISO_Enter, 0,
./gtk+/gtk/gtklabel.c-              "activate-current-link", 0);
./gtk+/gtk/gtklabel.c:  gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Enter, 0,
./gtk+/gtk/gtklabel.c-              "activate-current-link", 0);
./gtk+/gtk/gtklabel.c-
--
./gtk+/gtk/gtkdialog.c:  gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, "close", 0);

那么应该很容易找到你要找的东西。

【讨论】:

    【解决方案2】:

    我的猜测是你应该找到任何启​​用了G_SIGNAL_ACTION 标志的信号。您可以通过查找 &lt;glib:signal&gt; 属性设置为 1 的每个 &lt;glib:signal&gt; 实体,以编程方式从 Gtk gir 文件(我的系统上的 /usr/share/gir-1.0/Gtk-3.0.gir)获取此列表。

    不过,我不太喜欢 XPath 提出单行解决方案。

    【讨论】:

      【解决方案3】:

      我也一直在寻找有关可能的键绑定的正确文档,并且偶然发现了单行文本小部件 GtkEntrythese docs。在这种特殊情况下,可以一直向下滚动到菜单的末尾以查找小部件提供的所有其他“键绑定信号”,例如insert_at_cursorpaste_clipboard 等,包括这些信号接受的参数(例如DeleteTypedelete_from_cursor 的情况下)。 It now shouldn't be too hard 查找其他 GTK 小部件的信号。

      更新:如果 Vala 文档提供了键绑定信号的详细描述,人们可能会认为常规 Gtk3 文档也有。 Indeed。如果您知道您要查找的内容,则总是更容易找到您要查找的内容。 :)

      【讨论】:

        【解决方案4】:

        我认为最终 ntd 有最正确的想法,但这里有一个更易于浏览的解决方案,而不是通过 GIR 文件grepping。

        您应该(假设文档全面)能够通过转到感兴趣的小部件的文档页面找到此信息,然后在该页面中搜索术语 keybinding signal

        可用信号与每个小部件页面上的其他信号一起记录,然后在描述中限定它们是否用于键绑定。

        通常您也可以通过它们在信号汇总表的第二列(即信号类型标志)中的值是 Action 来识别它们,正如 ntd 所指出的那样.

        例如GtkComboBox:move-active:

        [处理函数签名]

        ::move-active 信号是一个键绑定信号,它被发射以移动活动选择。

        [参数描述]

        正如 ntd 所指出的,这可能在很大程度上可以自动化。与 GIR 一样,文档是从 C 源文件生成的,因此如果您缺少 GIR 文件或只是更喜欢这种方式,您大概可以巧妙地使用grepsed等。 通过这些来提取信息。

        【讨论】:

          【解决方案5】:

          @ntd 建议查看/usr/share/gir-1.0/Gtk-3.0.gir &lt;glib:signal action="1"&gt; 实体。我没有Gtk-3.0.gir,但我有Gtk-2.0.gir,这些是我使用该方法发现的独特结果:

          cat /usr/share/gir-1.0/Gtk-2.0.gir \
          | sed -n '/.*<glib:signal name="\([^"]*\)".* action="1".*/s//\1/p' \
          | sort -u
          
          abort-column-resize
          accept-position
          activate
          activate-current
          activate-cursor-item
          activate-default
          activate-focus
          backspace
          cancel
          cancel-position
          change-current-page
          change-focus-row-expansion
          change-value
          clicked
          close
          composited-changed
          copy-clipboard
          cut-clipboard
          cycle-focus
          delete-from-cursor
          end-selection
          expand-collapse-cursor-row
          extend-selection
          focus-home-or-end
          focus-tab
          grab-focus
          insert-at-cursor
          kill-char
          kill-line
          kill-word
          move
          move-active
          move-current
          move-cursor
          move-focus
          move-focus-out
          move-handle
          move-page
          move-scroll
          move-slider
          move-to-column
          move-to-row
          move-viewport
          move-word
          page-horizontally
          paste-clipboard
          popdown
          popup
          popup-menu
          reorder-tab
          row-activated
          scroll-child
          scroll-horizontal
          scroll-vertical
          select-all
          select-cursor-item
          select-cursor-parent
          select-cursor-row
          select-page
          set-anchor
          set-editable
          set-scroll-adjustments
          show-help
          start-interactive-search
          start-selection
          toggle-add-mode
          toggle-cursor-item
          toggle-cursor-row
          toggle-cursor-visible
          toggle-focus-row
          toggle-overwrite
          undo-selection
          unselect-all
          

          【讨论】:

            猜你喜欢
            • 2013-01-10
            • 1970-01-01
            • 2014-02-24
            • 1970-01-01
            • 2012-04-23
            • 1970-01-01
            • 2020-02-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多