22.7.4 点击事件

当用户按下鼠标按键并在同一位置释放时, 会产生一个 点击(click) 事件。根据窗口系统报告 鼠标滚轮事件的方式,转动鼠标滚轮可能产生 鼠标点击事件或鼠标滚轮事件。所有鼠标事件 都使用相同的格式:

(event-type position click-count)
event-type

这是一个符号,表示使用了哪个鼠标按键。它是 符号 mouse-1mouse-2、… 之一, 按键从左到右编号。对于鼠标滚轮事件,它可以是 wheel-upwheel-down

你也可以使用前缀 ‘A-’、‘C-’、‘H-’、‘M-’、 ‘S-’ 和 ‘s-’ 分别表示 Alt、Control、Hyper、Meta、Shift 和 Super 修饰键,用法与功能键相同。

该符号同时也作为事件的事件类型。按键绑定通过类型 描述事件;因此,如果存在针对 mouse-1 的按键绑定, 该绑定将应用于所有 event-typemouse-1 的事件。

position

这是一个 鼠标位置列表(mouse position list),指定鼠标事件发生的位置; 详细说明见下文。

click-count

这是同一鼠标按键到目前为止快速重复按下的次数, 或滚轮重复转动的次数。See 重复事件

要访问鼠标事件的 position 字段中 鼠标位置列表的内容,通常应使用 访问鼠标事件 中描述的函数。

该列表的显式格式取决于事件发生的位置。 对于在文本区域、模式行、标题行、标签行、 或边栏与边缘区域中的点击,鼠标位置列表的格式为:

(window pos-or-area (x . y) timestamp
 object text-pos (col . row)
 image (dx . dy) (width . height))

这些列表元素的含义如下:

window

发生鼠标事件的窗口。

pos-or-area

在文本区域中被点击的字符对应的缓冲区位置; 或者,如果事件发生在文本区域之外,则为事件发生的窗口区域。 它是符号 mode-lineheader-linetab-linevertical-lineleft-marginright-marginleft-fringeright-fringe 之一。

有一种特殊情况:pos-or-area 是一个包含符号 (上述符号之一)的列表,而不只是符号本身。 这种情况发生在 Emacs 注册了事件的虚拟前缀键之后。 See 读取按键序列

x, y

事件的相对像素坐标。对于窗口文本区域中的事件, 坐标原点 (0 . 0) 取为文本区域的左上角。 See Window Sizes。对于模式行、标题行或标签行中的事件, 坐标原点是窗口本身的左上角。对于边栏、边缘区域 和垂直边框,x 没有有效数据。 对于边栏和边缘区域,y 相对于标题行的下边缘。 在所有情况下,xy 坐标分别向右和向下递增。

timestamp

事件发生的时间,以从系统相关的初始时间开始 计算的毫秒整数表示。

object

可以是 nil(表示事件发生在缓冲区文本上), 或者是格式为 (string . string-pos) 的 cons 单元 (如果事件位置存在来自文本属性或覆盖层的字符串)。

string

被点击的字符串,包含所有属性。

string-pos

点击发生在字符串中的位置。

text-pos

对于在边缘区域或边栏上的点击,这是窗口中对应行 第一个可见字符的缓冲区位置。对于在模式行、标题行 或标签行上的点击,该值为 nil。对于其他事件, 它是距离点击位置最近的缓冲区位置。

col, row

这是 xy 位置下方字形的实际列号和行号。 如果 x 超出所在行实际文本的最后一列, col 会通过添加具有默认字符宽度的虚拟额外列来计算。 如果窗口有标题行,则第 0 行为标题行; 如果窗口还有标签行,则第 1 行为标题行; 否则为文本区域的最顶行。 对于窗口文本区域上的点击,第 0 列为文本区域的最左列; 对于模式行或标题行上的点击,则为对应区域的最左列。 对于边栏或垂直边框上的点击,这些值无有效数据。 对于边缘区域上的点击,col 从边缘区域左边缘开始计算, row 从边缘区域顶部开始计算。

image

如果点击位置有图像,则为 find-image 返回的图像对象 (see Defining Images);否则为 nil

dx, dy

点击位置相对于距离最近的 object 字形 左上角的像素偏移。相关的 object 可以是缓冲区、 字符串或图像,见上文。如果 objectnil 或字符串, 坐标相对于被点击字符字形的左上角。 注意,在文本模式框架中,当 objectnil 时, 偏移始终为 0,因为那里每个字形都被视为恰好 1×1 像素大小。

width, height

如果点击在某个字符上(来自缓冲区文本、覆盖层或显示字符串), 则为该字符字形的像素宽度和高度;否则为被点击的 object 的尺寸。

对于在滚动条上的点击,position 具有以下格式:

(window area (portion . whole) timestamp part)
window

被点击滚动条所属的窗口。

area

该值为符号 vertical-scroll-bar

portion

从滚动条顶部到点击位置的像素数。 在某些工具包(包括 GTK+)中,Emacs 无法提取此数据, 因此该值始终为 0

whole

滚动条的总长度(以像素为单位)。 在某些工具包(包括 GTK+)中,Emacs 无法提取此数据, 因此该值始终为 0

timestamp

事件发生的时间,以毫秒为单位。 在某些工具包(包括 GTK+)中,Emacs 无法提取此数据, 因此该值始终为 0

part

点击发生在滚动条的哪个部分。 它是以下符号之一:handle(滚动条滑块)、 above-handle(滑块上方区域)、 below-handle(滑块下方区域)、 up(滚动条一端的上箭头)或 down(滚动条一端的下箭头)。

对于在框架内部边框(see Frame Layout)、 框架工具栏(see 工具栏)、标签栏或菜单栏上的点击, position 具有以下格式:

 (frame part (X . Y) timestamp object)
frame

被点击的内部边框、工具栏、标签栏或菜单栏所属的框架。

part

被点击的框架部分。可以是以下之一:

tool-bar

框架有工具栏,且事件发生在工具栏区域。

tab-bar

框架有标签栏,且事件发生在标签栏区域。

menu-bar

事件发生在框架的菜单栏区域。此类点击事件 仅在纯文本框架或非工具包编译的 X 框架上发生。 (在工具包编译的 Emacs 中,菜单栏点击由工具包处理, 不会以点击事件形式暴露给 Emacs。)

left-edge
top-edge
right-edge
bottom-edge

点击发生在对应边框上,且距离边框最近角点 至少一个标准字符的偏移量。

top-left-corner
top-right-corner
bottom-right-corner
bottom-left-corner

点击发生在内部边框的对应角点。

nil

框架没有内部边框,且事件不在标签栏或工具栏上。 这通常发生在文本模式框架。 在带有内部边框的 GUI 框架上,如果框架的 drag-internal-border 参数(see Mouse Dragging Parameters) 未设置为非 nil 值,也可能出现此情况。

object

该成员仅在标签栏上的点击时存在, 它是包含被点击按钮信息的带属性字符串。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike