WINDOW SERVER EVENT TAPS
Methods, devices and an associated application programming interface are described that permits a user to register event tap routines (“ETRs”) with an application such as, for example, a window server application. Event tap routines permit events such as human interface device events to be processed at multiple points and in a manner not provided during normal window server operations. Event tap routines may effect passive or active event responses. Passive ETRs may merely record the occurrence of an event or the time between successive events without modifying or altering the event's processing sequence within a window server. Active ETRs, on the other hand, effect some programmatic response to an event. For example, active ETRs may modify the state of an event, delete the event, create one or more additional events or cause the event to be processed “out of sequence” by the window server application.
Latest Apple Patents:
- User interfaces for viewing live video feeds and recorded video
- Transmission of nominal repetitions of data over an unlicensed spectrum
- Systems and methods for intra-UE multiplexing in new radio (NR)
- Method and systems for multiple precoder indication for physical uplink shared channel communications
- Earphone
The invention relates generally to graphically-oriented computer operating systems and more particularly, but not by way of limitation, to a method and system for processing events in general and human interface device events in particular.
Most modern computer systems employ operating systems that support graphical user interfaces. Central to these operating systems is the use of a low-level application referred to as a “window server.” One function of a window server is to receive, annotate and route signals from external devices (e.g., human interface devices such as keyboards, pointer devices and tablets) to the appropriate application (e.g., an audio, video or multimedia application). It will be recognized that most modern operating systems treat signals generated by human interface devices as “events” which are typically embodied as data structures or objects. In accordance with this view, human interface devices generate input signals which are received by the operating system, converted to an event (ordinarily by a software routine referred to as a “device driver”) and passed to the window server. The window server, in turn, associates each event with a given user or session through a series of processing steps and routes the event to the appropriate application.
This general architecture permits a software developer to customize an application's event-driven interaction with a user. In accordance with one prior art approach, for example, a developer may use an Application Programming Interface (“API”) to obtain access to events immediately prior to their being delivered to a specified application. Event receipt may be used to trigger execution of a developer-specified routine to effect the desired (i.e., modified) human interface device response. In accordance with another prior art approach, all events sent to a window server may be intercepted and processed in accordance with customized developer routines to identify and extract those events for which specialized processing is desired.
One drawback to the former approach is that it limits event response customization to unique/specified applications. One drawback to the latter approach is that it requires developers to develop custom software to receive and identify those events they wish to process and, further, to ensure that those events are subsequently sent to the operating system's window server for conventional processing. Another drawback to the latter approach is that it requires all applications executing in such an environment to communicate with the customized event screening software rather the standard window server application.
Thus, it would be beneficial to provide a means for responding to human interface device events as they are processed by a window server—on receipt (input), immediately prior to being routed to the appropriate application (output) and at processing points within the window server between its input and output.
SUMMARYThe invention provides a method to process user interface events through the use of event tap routines (“ETRs”). As used herein, an “event tap routine” is a procedure that is invoked by one or more of a plurality of points during event processing by a controlling application such as, for example, a window server application. Event tap routines may effect passive or active event responses. Passive ETRs may record the occurrence of an event or the time between successive events without modifying or altering the event's processing sequence within a window server. Active ETRs may be used to effect some programmatic response to an event. In one embodiment, the invention provides a method that includes receiving a user interface event from an operating system, identifying the user interface event as belonging to at least one of a plurality of registered user interface event types, determining the user interface event is associated with an event processing routine, causing the event processing routine to process the user interface event and receiving a result from the user-level event processing routine. Methods in accordance with the invention may be stored in any media that is readable and executable by a computer system.
In another embodiment, the invention provides a user interface event application programming interface (API) including a function allowing a user to register an event processing routine at a specified one of a plurality of user interface event taps within a window server application, wherein the registered event processing routine is associated with a specified user interface event type and is invoked when an event of the associated type is received by the window server application at the specified tap.
Methods and devices to process human interface device events 100 are described. In the disclosed embodiments (see
Event processing in accordance with the invention may be passive or active. Passive ETRs may, for example, merely record the occurrence of an event or the time between successive events without modifying or altering the event's processing sequence (e.g., 125) within window server 120. Active ETRs, on the other hand, effect some programmatic response to an event. For example, active ETRs may be used to effect human interface device event responses that conform to Section 508 of the Rehabilitation Act of 1973 (see 29 U.S.C. 794), a primary purpose of which is to ensure that electronic and information technology equipment purchased by Federal agencies is accessible to, and usable by, individuals with disabilities. Active ETRs in accordance with the invention may also change an event's type, alter the processing sequence of an event by window server 120, delete an event so that further processing of the event by window server 120 is halted, or generate one or more additional events that are then processed by window server 120.
The following descriptions are presented to enable any person skilled in the art to make and use the invention as claimed and is provided in the context of the particular examples discussed below, variations of which will be readily apparent to those skilled in the art. Accordingly, the claims appended hereto are not intended to be limited by the disclosed embodiments, but are to be accorded their widest scope consistent with the principles and features disclosed herein.
As noted above, ETRs are registered with window server 120 through API 110, one embodiment of which is defined in the section entitled “Illustrative API” of this disclosure. Registration permits a user to specify an ETR that is to be performed at one or more of a plurality of points (“taps”) during window server human interface device (“HID”) event processing. When an ETR registers, it identifies one or more events to be observed, an action to be performed (e.g., a routine or function to execute) and indicates whether the ETR is passive or active. In one embodiment, routines may be designated to run when an event is (1) received and accepted by window server 120—a HID type event, (2) prior to being associated with a specific session or user—a session type event, (3) after being associated with a specific session or user—an annotated session type event and/or (4) immediately prior to being routed to a target application—a connection type event.
Referring to
A specific embodiment of window server 120 as designed and implemented for the MAC OS® X operating system is illustrated-in
A check is then made to determine if at least one HID type event ETR has been registered with window server 120 (block 305). If a HID ETR has been registered (the “YES” prong of block 305), the appropriate HID ETR is invoked (block 310). HID ETR 310 represents one or more registered ETRs, each of which may have its own callback routine to effect its desired action. In one embodiment, each event is presented to the registered ETR as an opaque object, referenced by a number of keys, to return an appropriate value. If an ETR's callback routine fails to return cleanly, the ETR associated with the callback function is disabled. This can happen, for example, if the callback function raises an exception rather than returning. (The affected application may re-establish an event tap after a timeout period has expired.) On completion of the one or more HID ETRs (block 310) or in the event no HID type ETR has been registered (the “NO” prong of block 305), the overall state of the user interface is updated (block 315). Acts in accordance with block 315 include, for example, moving the displayed cursor's position or presentation and updating the state of any user interface element (e.g., windows and applications). In some operating systems, HID events 100A from, for example, tablets are input to window server 120 at block 315. Once admitted to window server 120, events 100A may be processed in accordance with any remaining event tap check (e.g., at blocks 320, 335, and/or 350).
Next, a check is made to determine if at least one session type event ETR has been registered with window server 120 (block 320). If a session ETR has been registered (the “YES” prong of block 320), the appropriate session ETR is invoked (block 325). It will be recognized that a “session” is that collection of applications and processes associated with a single user login. Following the acts of block 325 or when no session type event ETR has been registered (the “NO” prong of block 320), the current event object is annotated to, for example, identify the window and connection (e.g., owner/application) associated with the event (block 330). A check is then made to determine if at least one annotated session type event ETR has been registered with window server 120 (block 335). If an annotated session ETR has been registered (the “YES” prong of block 335), the appropriate annotated session ETR is invoked (block 340). Following the acts of block 340 or when no annotated session type event ETR has been registered (the “NO” prong of block 335), the current event object is routed to its associated connection (block 345). If at least one connection type event ETR has been registered with window server 120 (the “YES” prong of block 350), the appropriate connection ETR is invoked (block 355). Following the acts of block 355 or when no connection type event ETR has been registered (the “NO” prong of block 350), the current event object is delivered to its application/process (block 360).
In one embodiment, when an event is passed to an ETR, window server 120 continues to be responsive to remote procedure calls. In addition, the ordering of events is maintained. That is, events not being filtered (events processed via the “NO” prongs of blocks 305, 320, 335 or 350) are not permitted to pass earlier events which are being filtered (events processed via the “YES” prongs of blocks 305, 320, 335 or 350).
As noted above and detailed in the section Illustrative API, each ETR may be passive or active. If the ETR is passive, it does not generate any side-effects. If the ETR is active, its callback routine may be used to effect any desired action. For example, active ETRs may pass an event back to window server 120 unmodified (e.g., at 315, 330, 345 or 360), modify an event, discard an event or create one or more additional events that are inserted in window server processing at any specified tap point (e.g., at 305, 320, 335 and/or 350).
For security reasons, in one embodiment keyboard events are not routed to any event tap other than the HID type tap (block 310) when secure text input is active. It will be recognized that “secure input” is a mode of operation that prevents a program from reading the text input or keyboard events which are directed to the “foreground” or currently active program. Secure text input is typically used for entering passwords and similar sensitive data that other programs should not see. In addition, a notification of secure input being active may be posted through, for example, an API. For the same reasons, if an ETR modifies an event so as to make it a keyboard event, that event will not be passed to any further taps on it's way to its associated application while secure text input is active. It will be recognized that HID type ETRs or taps (see block 310) have access to events from all sessions and for all users. Thus, some embodiments may restrict the registration of HID type ETRs to the super-user or administrator (e.g., the “root” user). In contrast, session taps (e.g., blocks 325, 340 and 355) process events for only a specific user. Accordingly, registered ETRs for these event types may be placed under the same security constraints as the session owner. In another embodiment, an emergency override key sequence not likely to be encountered by accident is provided to disable all active taps. This will allow a user to regain control over a window server in which an ETR has disrupted normal event flow.
One benefit of the invention is that it provides a user with the ability to customize an application's response to a human interface device event at multiple locations within a window server's processing scheme. Another benefit of the invention is that it provides an easy to use API to facilitate the registration and revocation of ETRs. Yet another benefit of the invention is that device event response can be passive or active, where an active response can include the modification or deletion of the triggering event or the creation of one or more additional events. Still another benefit of the invention is that techniques in accordance therewith allows the addition of system-wide behaviors in response to input events. Such behaviors may be added by a third party (e.g., software vendor) without modifying the operating system or the operating system's window server application. Modified system-wide behaviors may include support for novel user input methods or the addition of specialized feedback in response to input events, such as sound or tactile feedback, for example.
Various changes in the components and in the details of the illustrated operational methods are possible without departing from the scope of the following claims. For instance, the illustrative system of
It will also be recognized that computer programs may be executed by a programmable control device. A programmable control device may be a single computer processor, a special purpose processor (e.g., a digital signal processor, “DSP”), a plurality of processors coupled by a communications link or a custom designed state machine. Custom designed state machines may be embodied in a hardware device such as an integrated circuit including, but not limited to, application specific integrated circuits (“ASICs”) or field programmable gate array (“FPGAs”). Storage devices suitable for tangibly embodying program instructions include, but are not limited to: magnetic disks (fixed, floppy, and removable) and tape; optical media such as CD-ROMs and digital video disks (“DVDs”); and semiconductor memory devices such as Electrically Programmable Read-Only Memory (“EPROM”), Electrically Erasable Programmable Read-Only Memory (“EEPROM”), Programmable Gate Arrays and flash devices.
Illustrative API: The following illustrative embodiment of an Application Programming Interface (“API”) in accordance with the invention is applicable to the Apple® OS X operating system. (Apple is a registered trademark of Apple Computer, Inc. of Cupertino, Calif.) CGEventSource: The CGEventSource is an opaque representation of the source of an event. This API permits the user to obtain a CGEventSource from an event, and to create a new event with a CGEventSource. One typical usage would be to take the event source from an event entering the filter (ETR), and to use that source for any new events created as a result of the received event. This has the effect of marking the events as being related.
typedef struct_CGEventSource*CGEventSource;
CGEventRef: The CGEventRef object may be created or copied, retained, released, and modified. The object provides an opaque representation of one low level hardware (human interface device) event.
This API provides the ability to create a NULL event, or to create specialized events reflecting a state specified as parameters to the creation functions.
This API provides the ability to create a NULL event, or to create specialized events reflecting a state specified as parameters to the creation functions.
CFRetain( ) and CFRelease( ) may be used to retain and release CGEventRefs. A set of type codes, accessor functions, and data tags are defined to permit access and modification of data within CGEventRefs.
Event Type Codes: The following enumeration describes all event types currently presented in this API.
Tablet devices may generate mice events with embedded tablet data, or tablet pointer and proximity events. The tablet events as mouse events allow tablets to be used with programs which are not tablet-aware.
High Level Accessor Functions: The following functions provide high level access to selected event data.
Low Level Event Accessor Functions: Additional low level functions provide access to specialized fields of the events include the following.
The CGEventSetPointValueField and CGEventGetPointValueField only works on fields capable of holding point data. The other functions work on any other field in the event record, performing the appropriate type conversions and range clamping automatically.
Low Level Event Accessor Keys: Additional keys and values found in mouse events, including the OtherMouse events include the following. kCGMouseEventNumber
Key associated with an integer encoding the mouse button event number as an integer. Matching mouse-down and mouse-up events will have the same event number.
kCGMouseEventClickState
Key associated with an integer encoding the mouse button clickState as an integer. A clickState of 1 represents a single click. A clickState of 2 represents a double-click. A clickState of 3 represents a triple-click.
kCGMouseEventPressure
Key associated with a double encoding the mouse button pressure. The pressure value may range from 0 to 1.0, with 0 representing the mouse being up. This value is commonly set by tablet pens mimicking a mouse.
kCGMouseEventButtonNumber
Key associated with an integer representing the mouse button number. The left mouse button reports as button 0. A right mouse button reports as button 1. A middle button reports as button 2 and additional buttons report as the appropriate USB button.
Key associated with an integer encoding the mouse delta since the last mouse movement event.
kCGMouseEventInstantMouser
Key associated with an integer value, non-zero if the event should be ignored by the Inkwell subsystem.
kCGMouseEventSubtype
Key associated with an integer encoding the mouse event subtype as a
kCFNumberIntType.
Tablets may generate specially annotated mouse events, which will contain additional keys and values. Mouse events of subtype CGEventMouseSubtypeTabletPoint may also use the tablet accessor keys. Mouse events of subtype kCGEventMouseSubtypeTabletProximity may also use the tablet proximity accessor keys.
Additional keys and values found in keyboard events include the following. kCGKeyboardEventAutorepeat
Key associated with an integer, non-zero when this is an autorepeat of a key-down, and zero otherwise.
kCGKeyboardEventKeycode
Key associated with the integer virtual keycode of the key-down or key-up event.
kCGKeyboardEventKeyboardType
Key associated with the integer representing the keyboard type identifier.
Additional keys and values found in scroll wheel events include the following.
Key associated with an integer value representing a change in scrollwheel position.
kCGScrollWheelEventInstantMouser
Key associated with an integer value, non-zero if the event should be ignored by the Inkwell subsystem.
Additional keys and values found in tablet pointer events, and in mouse events containing embedded tablet event data include the following.
Key associated with an integer encoding the absolute X, Y, or Z tablet coordinate in tablet space at full tablet resolution.
kCGTabletEventPointButtons
Key associated with an integer encoding the tablet button state as a kCFNumberLongType. Bit 0 is the first button, and a set bit represents a closed or pressed button.
kCGTabletEventPointPressure
Key associated with a double encoding the tablet pen pressure. 0 represents no pressure, and 1.0 represents maximum pressure.
Key associated with a double encoding the tablet pen tilt. 0 represents no tilt, and 1.0 represents maximum tilt.
kCGTabletEventRotation
Key associated with a double encoding the tablet pen rotation.
kCGTabletEventTangentialPressure
Key associated with a double encoding the tangential pressure on the device. 0 represents no pressure, and 1.0 represents maximum pressure.
kCGTabletEventDeviceID
Key associated with an integer encoding the system-assigned unique device ID.
Key associated with an integer containing vendor-specified values.
Additional keys and values found in tablet proximity events, and in mouse events containing embedded tablet proximity data:
kCGTabletProximityEventVendorID
Key associated with an integer encoding the vendor-defined ID, typically the USB vendor ID.
kCGTabletProximityEventTabletID
Key associated with an integer encoding the vendor-defined tablet ID, typically the USB product ID.
kCGTabletProximityEventPointerID
Key associated with an integer encoding the vendor-defined ID of the pointing device.
kCGTabletProximityEventDeviceID
Key associated with an integer encoding the system-assigned device ID.
kCGTabletProximityEventSystemTabletID
Key associated with an integer encoding the system-assigned unique tablet ID.
kCGTabletProximityEventVendorPointerType
Key associated with an integer encoding the vendor-assigned pointer type.
kCGTabletProximityEventVendorPointerSerialNumber
Key associated with an integer encoding the vendor-defined pointer serial number.
kCGTabletProximityEventVendorUniqueID
Key associated with an integer encoding the vendor-defined unique ID.
kCGTabletProximityEventCapabilityMask
Key associated with an integer encoding the device capabilities mask.
kCGTabletProximityEventPointerType
Key associated with an integer encoding the pointer type.
kCGTabletProximityEventEnterProximity
Key associated with an integer, non-zero when pen is in proximity to the tablet, and zero when leaving the tablet.
Registering an Event Tap: A function registers an event tap, taking a pointer to the program's tap function (also referred to as a callback routine or function) and an arbitrary reference to be passed to the tap function, and returning a CFMachPortRef the program can add to the appropriate run loop using CFRunLoopAddSource( ) Taps may be placed at the point where HIDSystem events enter the server, at the point where HIDSystem and remote control events enter a session, at the point where events have been annotated to flow to a specific application, or at the point where events are delivered to the application. Taps may be inserted at a specified point at the head of pre-existing filters, or appended after any pre-existing filters. Taps may be passive event listeners, or active filters. An active filter may pass an event through unmodified, modify an event, or discard an event. When a tap is registered, it identifies the set of events to be observed with a mask, and indicates if it is a passive or active event filter. Multiple event type bitmasks may be OR'ed together. Releasing the CFMachPortRef will release the tap. The CGEventTapProxy is an opaque reference to state within the client application associated with the tap. The tap function may pass this reference to other functions, such as the event-posting routines.
Events being routed to individual applications may be tapped using another function. CGEventTapCreateForPSN( )will report all events being routed to the specified application.
Posting New Events: A function to post events from a tap is provided. The events are posted to the same points that an event returned from an event tap would be posted to. If an event tap posts new events, the new events enter the system before the event returned by the tap enters the system. This order may be changed by explicitly posting the filtered event along with new events in the desired order, and then returning NULL from the callback. Events posted into the system will be seen by all taps placed after the tap posting the event.
Functions to post events into the system at various points are provided. Each event posted by these functions enters the system at a point immediately before any taps instantiated for that point, and will pass through any such taps. This mechanism permits an external process to establish an event routing policy, for example, by tapping events at the kCGAnnotatedSessionEventTap and then posting the events to the desired PSN.
Typical Usage as an Event Monitor: This sample code demonstrates the use of this API in the context of a simple event monitor.
Claims
1.-57. (canceled)
58. A method, comprising:
- receiving, by a window server application, a user-interface event associated with an application;
- determining, by the window server application, the user-interface event is associated with an event processing routine, wherein the event processing routing is registered at one or more tap locations within a processing scheme of the window server application;
- invoking, by the window server application, execution of the associated event processing routine using the user interface event;
- receiving, by the window server application, a result event from the event processing routine; and
- delivering, by the window server application, the result event to the application.
59. The method of claim 58, wherein the registered event processing routine comprises at least one of a passive callback function or an active callback function.
60. The method of claim 59, wherein the registered event processing routine comprises an active callback function including a set of functions, and the method further comprising modifying the user-interface event using the set of functions.
61. The method of claim 60, wherein the set of functions to modify comprise functions to change a type attribute associated with the user-interface event.
62. The method of claim 60, wherein the set of functions to modify comprise functions to delete the user-interface event.
63. The method of claim 60, wherein the set of functions to modify comprise functions to create one or more additional events associated with the user-interface event.
64. The method of claim 58, wherein the user-interface event comprises at least one of a human interface device event, a session event, an annotated session event, or a connection event.
65. A device, including:
- memory that stores an event processing routing; and
- one or more processors configured to: receive, by a window server application, a user-interface event associated with an application; determine, by the window server application, the user-interface event is associated with the event processing routine, wherein the event processing routing is registered at one or more tap locations within a processing scheme of the window server application; invoke, by the window server application, execution of the associated event processing routine using the user interface event; receive, by the window server application, a result event from the event processing routine; and deliver, by the window server application, the result event to the application.
66. The device of claim 65, wherein the registered event processing routine comprises at least one of a passive callback function or an active callback function.
67. The device of claim 66, wherein the registered event processing routine comprises an active callback function including a set of functions, and the processers further comprising modify the user-interface event using the set of functions.
68. The device of claim 67, wherein the set of functions to modify comprise functions to change a type attribute associated with the user-interface event.
69. The device of claim 67, wherein the set of functions to modify comprise functions to delete the user-interface event.
70. The device of claim 67, wherein the set of functions to modify comprise functions to create one or more additional events associated with the user-interface event.
71. The device of claim 65, wherein the user-interface event comprises at least one of a human interface device event, a session event, an annotated session event, or a connection event.
72. A computer program product encoded on non-transitory medium, the product comprising computer readable instructions for causing one or more processors to perform operations comprising:
- receiving, by a window server application, a user-interface event associated with an application;
- determining, by the window server application, the user-interface event is associated with an event processing routine, wherein the event processing routing is registered at one or more tap locations within a processing scheme of the window server application;
- invoking, by the window server application, execution of the associated event processing routine using the user interface event;
- receiving, by the window server application, a result event from the event processing routine; and
- delivering, by the window server application, the result event to the application.
73. The computer program product of claim 72, wherein the registered event processing routine comprises at least one of a passive callback function or an active callback function.
74. The computer program product of claim 73, wherein the registered event processing routine comprises an active callback function including a set of functions, and the instructions further comprising modifying the user-interface event using the set of functions.
75. The computer program product of claim 74, wherein the set of functions to modify comprise functions to change a type attribute associated with the user-interface event.
76. The computer program product of claim 74, wherein the set of functions to modify comprise functions to delete the user-interface event.
77. The computer program product of claim 74, wherein the set of functions to modify comprise functions to create one or more additional events associated with the user-interface event.
78. The computer program product of claim 72, wherein the user-interface event comprises at least one of a human interface device event, a session event, an annotated session event, or a connection event.
Type: Application
Filed: Apr 19, 2013
Publication Date: Sep 12, 2013
Applicant: Apple Inc. (Cupertino, CA)
Inventor: Michael James Paquette (Benicia, CA)
Application Number: 13/866,544
International Classification: G06F 9/44 (20060101);