一、匆匆一阅
内核接收到外设的触发事件后,将事件打包成一个数据包(Event)传输给Window Server。Window Server通过应用端口(run-loop port)将事件放入应用的事件容器(Event Source)中。应用在主循环(Main Loop)处理收到的事件。
二、正文
第一步:事件如何进入应用(How an Event Enters a Cocoa Application)
在NSApplication初始化的时候(即调用[NSApplication sharedApplication];),会生成一个
事件容器(Event Source),用来从各种输入来源接收事件(Event)。处理事件的顺序是 先进先出形势(FIFO)。
第二步:应用内部的事件分发(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 鼠标、触摸板事件
[Cocoa 键盘事件 Keyboard Events