From iPhone Development Wiki
Jump to: navigation, search

GSEvent is a group of C functions located in GraphicsServices.framework that passes hardware events around the system. GSEvent is a core part of UIEvent, which is simply a wrapper around GSEvent.

GSEvents are sent using Mach messages. A basic event consists of the following information:

  • The type of event.
  • Location and time of the event.
  • Which process sent the event.
  • Which window should receive the event.

Event types

Some events can be used only for SpringBoard. They will usually become no-op when sent to non-SpringBoard apps. Note that some sensor events like the gyroscope and magnetometer are processed in CoreMotion by directly communicating with the HID subsystem, instead of via the slower GSEvent system.

type name
2000 Launch
2013  ?
2001 Another application finished launching
2002  ?
2012 Imminent process assertion expiration
2003 Resume
2014 Start running in task switcher and deactivate
2015 Stop running in task switcher and activate
2006 Handle test URL
2004 Did end resume animation
2005 Will begin suspend animation
2007 Suspend, events only
2008 Suspend
2009 Exit
2011 Suspend settings updated
12 Modifier changed
1012 Ringer off
1013 Ringer on
4001 Accessory key state changed
1022 Media key up
1023 Media key down
1014 Lock device
2010 Quit top application
500 Dump UI hierarchy
501 Dump screen contents
200 Process script
1100 Vibrate
1103 Set backlight level
23 Accelerometer event
50 Device orientation changed
24 Proximity state changed
6000 Urgent memory warning
1024 Status bar tapped
100 Reset idle timer and undim
60 App preference changed
1000 Menu button down
1001 Menu button up
1010 Lock button down
1011 Lock button up
1018 Headset button down
1019 Headset button up
1021 Headset availability changed
14 Hardware key down?
1020 Shake motion event
13 Simulator key down
22 Scroll wheel
3001 Hand event (i.e. touch-screen event)
10 Key down
11 Key up
1006 Volume Upper button down
1007 Volume Upper button up
1008 Volume Lower button down
1009 Volume Lower button up
1015 Status bar mouse down
1016 Status bar mouse dragged
1017 Status bar mouse up
1102 Set backlight factor
4000 Accessory availability changed
4002  ?
5000 Out-of-line data request
5001 Out-of-line data response

Sending a GSEvent

In order to send a GSEvent, one must first create a struct consisting of a GSEventRecord followed by the actual event data. Below is an example of creating and sending an orientation event to a specific process.

struct GSOrientationEvent {
        GSEventRecord record;
        GSDeviceOrientationInfo orientationInfo;
} event; //Declare the struct containing the GSEventRecord and the event info

event.record.type = kGSEventDeviceOrientationChanged; //Set the event record's type.
event.record.timestamp = mach_absolute_time(); //Set the timestamp.
event.record.senderPID = getpid();//Set the record's sender PID.
event.record.infoSize = sizeof(GSDeviceOrientationInfo); //Set the size of the event info (the size of the data following the GSEventRecord)

event.orientationInfo.orientation = UIInterfaceOrientationPortrait; //Set the orientation info to the orientation wanted.

SBApplication *safari = [[SBApplicationController sharedInstance] applicationWithDisplayIdentifier:@""];

GSSendEvent((GSEventRecord*)event, (mach_port_t)[safari eventPort]); //Send the GSEvent to Safari's event port.

Purple system event port

The "Purple system event port" is the Mach port that receives system events (e.g. kGSEventLockDevice). This port is registered whenever the --RegisterForSystemEvents flag is provided to a UIKit application, or it is the first application that registers the service for bootstrap lookup. In other words, these system events are directed to SpringBoard.