Cocoa应用接收外设事件的过程

一、匆匆一阅

内核接收到外设的触发事件后,将事件打包成一个数据包(Event)传输给Window Server。Window Server通过应用端口(run-loop port)将事件放入应用的事件容器(Event Source)中。应用在主循环(Main Loop)处理收到的事件。

Cocoa应用接收外设事件的过程_第1张图片
图片来源于Apple官方文档

二、正文

第一步:事件如何进入应用(How an Event Enters a Cocoa Application)

在NSApplication初始化的时候(即调用[NSApplication sharedApplication];),会生成一个
事件容器(Event Source),用来从各种输入来源接收事件(Event)。处理事件的顺序是 先进先出形势(FIFO)

Cocoa应用接收外设事件的过程_第2张图片
图片来源于Apple官方文档

第二步:应用内部的事件分发(Event Dispatch)

1、在应用的主循环(Main Loop)中,每一次循环都会从事件容器(Event Source)中获取一个事件,然后处理。假如没有事件则不处理,继续下一个循环。

通过调用如下方法获取下一个事件(Event)
nextEventMatchingMask:untilData:inMode:dequeue
方法具体情况如下:
(nullable NSEvent *)nextEventMatchingMask:(NSEventMask)mask untilDate:(nullable NSDate *)expiration inMode:(NSRunLoopMode)mode dequeue:(BOOL)deqFlag;

2、大多数情况下获取到一个事件(Event)后,我们应该把事件转交给应用(NSApplication)处理,当然你也可以交给你自己喜欢的东西去处理获取到的事件。

通过调用如下方法把事件(Event)转发给应用处理(NSApplication)
sendEvent:event
方法具体情况如下:
(void)sendEvent:(NSEvent *)event;

3、大多数情况下应用(NSApplication)只是将得到的Event分发给窗口(NSWindow)。然后窗口(NSWindow)会将部分的事件转发给视图(NSView),例如:mouseDown、keyDown。

三、传送门

阅读导向

Cocoa 文集声明与阅读导向

笔者相关文档:

Mac科技相关阅读导向

Cocoa 鼠标、触摸板事件
[Cocoa 键盘事件 Keyboard Events

你可能感兴趣的:(Cocoa应用接收外设事件的过程)