Data structure describing an event
typedef struct Ph_event {
    unsigned long       type;
    unsigned short      subtype;
    unsigned short      processing_flags;
    PhEventRegion_t     emitter;
    PhEventRegion_t     collector;
    unsigned short      input_group;
    unsigned short      flags;
    unsigned long       timestamp;
    PhPoint_t           translation;
    unsigned short      num_rects;
    unsigned short      data_len;
} PhEvent_t;
The PhEvent_t structure describes an
event. It contains at least the following members:
- type
 
- One - and only one - of the predefined event types:
  
These types are described below.
The event type determines how the data associated with the event is
interpreted.
 
- subtype  
 
- Further information about the event. For the
      possible values of subtype, see the
      description of each event type.
 
- processing_flags
 
- Flags used or set in processing the event:
  
- Ph_BACK_EVENT - the event has gone down the
    widget family hierarchy and is now on its way back up.
    
  
 
- Ph_DIRECTED_FOCUS - the event has caused 
    focus to change.
    
  
 
- Ph_FAKE_EVENT - set this bit if the event
    is a fake one created by your application.
    
  
 
- Ph_FOCUS_BRANCH - focus is changing, and the
    current widget is on the focus path, but isn't the destination.
    
  
 
- Ph_TYPE_SPECIFIC - a mask for bits that are
    specific to the type of event.
    
  
 
- Ph_USER_RSRVD_BITS - a mask for bits that 
    you can use for your own purposes.
    
  
 
 
- emitter
 
- Which region emitted the event. An application can
      emit an event from a region- even one it doesn't own-by 
      setting
      emitter to the ID of that
      region. Applications can use this approach when they target the
      device region by setting the Ph_EVENT_INCLUSIVE flag. 
  
 
- collector 
 
- Which region collected the event. When a process 
      has many regions open, collector lets
      the process distinguish which of its regions was involved.
 
- input_group
 
- The number of the input group. A value of 0 means there's
  no input group.
      
 
- flags
 
- Event-modifier flags. You can OR the 
      following values into flags:
      
- Ph_EVENT_ABSOLUTE
      
 
-   Forces the rectangle set associated with the event to be 
            relative to the root region's origin. By default, the
            coordinates of the rectangle set are relative to the origin
            of the emitting region.
        
      
 
-   Ph_EVENT_DIRECT
      
 
-   Emits the event directly from emitter
            to collector.
        
      
 
-   Ph_EVENT_INCLUSIVE
      
 
-   Emits the event first to the
            emitting region and then through the event space. Using
            this flag, an  application can guarantee that the emitter
            sees the event (assuming the emitter is sensitive to
            that event type).
        
      
 
- Ph_EMIT_TOWARD
      
 
-   Emits the event toward the user. By default, events are 
            emitted away from the user.
        
      
 
 
- timestamp
            
 
- When the event was emitted, in milliseconds.
      The Photon Manager generates this member.
 
- translation
      
 
-   The translation between the emitting region's origin and the
      collecting region's origin. An application uses this member
      to convert coordinates that are relative to the emitter's
      region to coordinates that are relative to the collector's
      region.
      
      For example, let's say the graphics driver wants to render
      Ph_EV_DRAW
      events. When these events reach the
      driver, they contain coordinates relative to the region that
      emitted them. To render these events within its own region,
      the graphics driver uses translation
      to convert the coordinates.
 
- num_rects
 
- The number of rectangles associated with the
      event. To extract the list of rectangles, see
      PhGetRects(). 
 
- data_len
 
- The length of the data associated with the event.
      Since event data is optional, you can set data_len to 0 when
      there's no data. To extract the data from an event, see PhGetData().
 
Emitted when the pointer crosses region boundaries. The
subtype member of the
PhEvent_t structure indicates one of
the following boundary conditions:
- Ph_EV_PTR_ENTER
       
     
 
-   Emitted when the pointer enters a region. By default, enter 
           events are emitted to the frontmost region that's under the
           pointer, but only if that region is opaque or
           sensitive to 
           Ph_EV_EXPOSE events.
           
           
           
           
           An application can still force the Photon Manager 
           to emit boundary events to the frontmost region under the
           pointer even if that region isn't sensitive or
           opaque to Ph_EV_EXPOSE. To do so, the application
           sets the region's 
           Ph_FORCE_BOUNDARY
           flag (see the description of PhRegion_t).
     
  | 
           Before entering a region, the pointer usually
           first enters the ancestors of that region. But with some
           pointing devices (for example, touchscreens), the pointer may
           bypass the ancestors and enter the region directly. If this
           happens, the Photon Manager emits an enter  event to the
           region as well as to its ancestors.
      | 
     
      
- Ph_EV_PTR_LEAVE
      
     
 
-   Emitted when the pointer leaves a region. A leave condition 
           occurs only when the pointer enters a region that's
           not a child of the previously
           entered region. (Child regions are always located within the
           bounds of their parents. Thus, the pointer doesn't have to
           leave a parent to enter its child.)
           
     
 
- Ph_EV_PTR_STEADY
     
 
-   Emitted when the pointer remains motionless for 1.25 
            seconds. Another Ph_EV_PTR_STEADY
            won't be emitted until the user moves the pointer and then
            lets it remain motionless again.
           
     
 
- Ph_EV_PTR_UNSTEADY
     
 
-   Emitted when the pointer is moved after a 
           Ph_EV_PTR_STEADY is emitted.
           Another Ph_EV_PTR_UNSTEADY
            won't be emitted until the user
           allows the pointer to remain motionless and then
           moves it again.
           
     
 
Emitted when the user presses a button on a pointing device. 
      This event's rectangle set consists of a point source that indicates 
      the current pointer focus. The event data is a 
PhPointerEvent_t 
      structure that contains at least the following members:
      
- PhPoint_t pos
      
 
-   Indicates the untranslated, absolute position of the current
            pointer focus. As a rule, you should use the event's
            rectangle set to determine coordinate positions. However,
            for situations that demand absolute coordinates (for 
            example, calibrating a touchscreen), you can use 
            pos.
      
      
 
- unsigned char click_count
      
 
-   Indicates the number of clicks (for example, a value 
            of 2 indicates a double-click). See the 
            Ph_EV_RELEASE_ENDCLICK subtype for
            Ph_EV_BUT_RELEASE.
      
 
- short z
      
 
-   Can be used with touchscreens to indicate touch pressure.
            
      
 
- unsigned char flags
      
 
-   Indicates that the z field is valid.
      
 
- unsigned short button_state
      
 
-   Indicates the current state of the buttons.
      
 
- unsigned short buttons
      
 
-   Indicates which buttons the user pressed. For your
            convenience, we've defined the following manifests: 
            
- Ph_BUTTON_SELECT-normally the left button. Because 
            a pointing device might provide only this button, you should
            design most applications such that the user has the option
            to use this button to perform any task. 
              
            
 
- Ph_BUTTON_MENU-can be used to invoke menus when 
            they're available.
              
            
 
- Ph_BUTTON_ADJUST-use is currently unspecified.
              
            
 
             
- unsigned long key_mods
 
- The modifier keys that are currently pressed.
  See
  PhKeyEvent_t.
 
Emitted when the user releases a pointing-device
     button. This event's rectangle set consists of a point
     source that indicates the current pointer focus. The event
     data is a PhPointerEvent_t 
     structure (see 
Ph_EV_BUT_PRESS). 
However, in this
     case, the buttons member indicates the
     buttons that were released.
     
     This event type has the following subtypes:
      
- Ph_EV_RELEASE_REAL
      
 
-   Emitted at the current position of the pointer 
            (that is, where
            the user actually released the button).
        
      
 
- Ph_EV_RELEASE_PHANTOM
      
 
-   Emitted where the user pressed the button.
        
      
 
- Ph_EV_RELEASE_ENDCLICK
      
 
- Emitted when multiclicks are no longer possible, i.e. when
        the user moves the mouse or stops clicking for a while.
        
          
     
 
Emitted when the user presses an auto-repeating button 
      on a pointing device. This event is emitted each time the
      button repeats. Its rectangle set consists of a
      point source that indicates where the button was pressed.
      The event data is a PhPointerEvent_t
      structure 
(see Ph_EV_BUT_PRESS).
(Not yet implemented) Emitted by the Photon Manager when a region is 
      created. 
      The event travels away from the user and appears to originate from 
      the newly created region. 
      
      Since any regions now covered by the new region see 
      the covered event, an application can use this event to
      determine if its regions are partially covered. With this
      information, the application can then take appropriate
      action. For example, an animation program that consumes many
      processor cycles might choose to cease animation when
      covered, then resume animation when exposed again.
      
      This event's rectangle set describes only those areas that
      have become covered. This event has no associated data.
Used by an application to initiate drag events, to determine
    their completion, and to indicate intermediate drag-motion
    events.
    
    The event data is a
    PhDragEvent_t structure that contains
    at least the following members:
- PhRid_t rid
    
 
-   Indicates the region that initiated the drag operation. The
          application needs to set rid when the
          drag is initiated.
     
    
 
- unsigned short flags
    
 
-   Indicates which edges of the drag rectangle track
          the pointer. You can OR the following values into
          flags:
          
- Ph_DRAG_NOBUTTON-Allow the drag to
              start even if the user isn't holding down a button.
            
          
          
 
- Ph_DRAG_KEY_MOTION-During the drag, 
              emit drag events with the 
              Ph_EV_DRAG_KEY_EVENT
              or the 
              Ph_EV_DRAG_MOTION_EVENT
              subtype (these subtypes are described below).
              
         
 
- Ph_DRAG_TRACK-No drag outline is drawn, and
             Ph_EV_DRAG_MOVE
             events are emitted to the
             initiating region. This flag is used by applications that
             wish to implement their own visual interpretation of drag
             operations.
             
         
         
 
- Ph_TRACK_LEFT-left edge tracks the pointer.
           
         
 
- Ph_TRACK_RIGHT-right edge tracks the pointer.
           
         
 
- Ph_TRACK_TOP-top edge tracks the pointer.
           
         
 
- Ph_TRACK_BOTTOM-bottom edge tracks the pointer.
           
         
 
- Ph_TRACK_DRAG-all edges track the pointer
             (same as using all four of the above values).
             
          
 
          
    
     
- PhRect_t rect
    
 
-   Contains the coordinates of the initial, current, or final 
          drag rectangle, depending on the drag-event
          subtype value.
    
 
- PhRect_t boundary
    
 
- Contains the coordinates of the rectangle that constrains 
          the drag operation.
     
 
    The Ph_EV_DRAG event can have any of
    the following subtypes:
    
- Ph_EV_DRAG_BOUNDARY
    
 
-   Emitted when rect hits
          a boundary. The flags
          member of the PhDragEvent_t
          structure specifies which boundary. 
      
    
    
 
- Ph_EV_DRAG_COMPLETE
    
 
-   When the user completes the drag operation, the device
          region emits a Ph_EV_DRAG event with this
          subtype toward the root region so that the initiating
          application collects the event. This event is direct.
      
 
- Ph_EV_DRAG_INIT
 
- To initiate a drag
    operation, an application must emit a Ph_EV_DRAG
    event with this subtype to the device region. The Photon Manager
    takes care of the user's interaction with the screen pointer and
    the drag outline.
    
          
          The PhInitDrag()
          function, which emits Ph_EV_DRAG_INIT,
          provides a convenient way to initiate drag operations.
     
 
- Ph_EV_DRAG_KEY_EVENT
     
 
-  Emit the event with a 
       PhKeyEvent_t
          structure.
       
    
     
 
- Ph_EV_DRAG_MOTION_EVENT
     
 
-  Emit the event with a PhPointerEvent_t
          structure.
       
    
    
 
- Ph_EV_DRAG_MOVE
    
 
-   Indicates intermediate drag motion. The Photon Manager emits
          this drag-event subtype if the 
          Ph_DRAG_TRACK
          flag was set in the flag member of
          the PhDragEvent_t structure when the
          drag operation was initiated.
       
     
 
- Ph_EV_DRAG_START
     
 
-  Emitted when the server begins the drag operation.
       
    
    
 
Emitted by the Pg functions
      when applications perform draw operations. The event travels
      toward the user and is collected by the graphics driver.
      
      The event data is a PhDrawEvent_t
      structure that contains at least the following members:
- unsigned short cmd_buffer_size
      
 
-   Size of the draw buffer, in bytes.
            
      
 
-   unsigned long id
      
 
-   An ID number that's unique for each application
            in this Photon space. The Pg functions set
            this number, which is used to optimize drawing operations.
      
      
 
Emitted by the Photon Manager on behalf of a region being 
      moved, resized, or removed from the event space. The event
      travels away from the user and appears to originate from the
      removed region.
      
      Since any regions now exposed see the
      expose event, an application can determine which of its
      regions have been uncovered. It can then redraw any portion
      of the regions that become visible by passing the rectangle
      set to 
      PgSetClipping().
      This event's rectangle set describes those areas that are now
      exposed. This event has no associated data.
      
      The Ph_EV_EXPOSE event can have any of
      the following subtypes:
- Ph_NORMAL_EXPOSE
      
 
-   Emitted when a region is moved, resized, or removed
              from the event space. This is the most common type
              of expose.
        
              
      
 
- Ph_CAPTURE_EXPOSE
      
 
-   Emitted by an application (typically a printer driver)
            that wishes to receive an encapsulated draw event starting with:
        
            
            PgFFlush (Ph_START_DRAW);
            
                        and ending with:
            
            PgFFlush (Ph_DONE_DRAW);
            
                        when the applications
            that received the expose have completed their updates.
            
            This type of event indicates that the expose wasn't
            caused by a region change. You can use this event type
            to collect data for the purpose of producing some form of hardcopy.
      
 
- Ph_GRAPHIC_EXPOSE
      
 
-   Emitted by a graphics driver.
            This subtype indicates that no region was moved,
            removed, or resized to generate the expose event.
        
      
 
All regions must always be transparent to Ph_EV_INFO
events. They are emitted by applications or service providers to
disseminate information or respond to requests. The currently
defined subtypes are:
- Ph_EV_INVALIDATE_SYSINFO
 
- Emitted by Photon as regions are moved, created, or destroyed.  The
application must ask Photon for updated system information
should a need for this information arise. This is handled
automatically by the widget library. The event data is NULL.
  
 
- Ph_EV_FEP
 
- Emitted primarily by FEP service providers to inform applications of
their presence or impending absence. The data portion of the event is
a PhFEPInfo_t structure that contains at least the
following members:
- long type
 
- The valid types are:
    
- Ph_FEP_REGISTER - a FEP has been launched 
      (all applications can see the event), or is responding to a 
      Ph_FEP_BROADCAST service message (seen only by the 
      application requesting the broadcast).
      
      
    
 
- Ph_FEP_DEREGISTER - a FEP is shutting down.
      
    
 
 
- long subtype
 
- The language type of the FEP. The valid subtypes are:
    
- Ph_FEP_JAPANESE
      
 
    
 
- Ph_FEP_CHINESE
      
    
    
 
- Ph_FEP_KOREAN
      
    
 
 
- long len
    
 
- Not currently used.
 
- char data[1]
    
 
- Not currently used.
 
 
Emitted when a key state changes (for example, the user presses or
      releases a key). This event's rectangle set consists of a
      point source that indicates the current focus. The
event data is a 
PhKeyEvent_t
structure.
The processing_flags member of the PhEvent_t
structure for this event type also include:
- Ph_NOT_CUAKEY
 
- Force PtContainer not to use the key for 
  traversal (CUA).
  
 
- Ph_NOT_HOTKEY
 
- Force PtContainer not to treat the key as 
  a hotkey.
  
 
Emitted when the user moves the pointing device while 
     pressing a button. This event's rectangle set consists of a 
     point source that indicates the current pointer focus. The
     event data is a PhPointerEvent_t
     structure (see Ph_EV_BUT_PRESS).
     The buttons member indicates which buttons
     the user is pressing.
Emitted when the user moves the pointing device
      without pressing a button. This
      event's rectangle set consists of a point source that
      indicates the current pointer focus. The event data is a
      PhPointerEvent_t structure (see
      Ph_EV_BUT_PRESS).
      
  | 
      Large numbers of
      Ph_EV_PTR_MOTION_NOBUTTON events can
      slow down your system. To avoid this, you should make
      your applications sensitive to
      Ph_EV_PTR_MOTION_BUTTON whenever
      possible, rather than to
      Ph_EV_PTR_MOTION_NOBUTTON.
       | 
These events may be emitted by applications requesting services or
providing information to services, other applications that provide
some kind of service in a Photon system. The currently defined
subtypes are:
- Ph_EV_REMOTE_WM 
 
- Handled by relay-type services
such as phrelay. Normally only emitted by a Window Manager
to synchronize a remote Window Manager's state. The event data is a
PhRemoteWMEvent_t structure that contains at least the
following members: 
- short type
 
- Valid values of type are REMOTE_WM_WINDOW 
  or REMOTE_WM_TITLE.
  
  
 
- short len 
 
- Not used.
 
If type is REMOTE_WM_WINDOW, the
window member is also defined. The window member
has at least the following members:
- ushort_t xpos
 
- New absolute x coordinate of the window.
 
- ushort_t ypos
 
- New absolute y coordinate of the window.
 
- ushort_t height
 
- New height dimension of the window.
 
- ushort_t width
 
- New width dimension of the window.
 
- short flags 
 
- Valid flag bits are:
                    
    
- REMOTE_FLAG_FIXED
    
 
- Window shouldn't be resized by the Window Manager; the application
      resizes it.
      
    
 
- REMOTE_FLAG_INITIAL
    
 
- New window.
      
    
 
- REMOTE_FLAG_IS_ORIGIN
    
 
- Use xpos, ypos as the new origin.
      
    
 
- REMOTE_FLAG_NO_DIM
    
 
- The dim variable shouldn't be modified.
      
    
 
 
If type is REMOTE_WM_TITLE, the
title member is defined as follows:
    
- char title[64]
    
 
- A title for the window.
    
 
   
- Ph_EV_FEP 
 
- Handled by Front End Processor (FEP) service providers (e.g. Japanese
input). The event data is a PhFEPService_t
structure that contains at least the following members:
- long type
 
- The valid types are:
    
- Ph_FEP_BROADCAST
    
 
- Request a broadcast from FEP service. If a FEP is present, it 
      responds with an Ph_FEP_REGISTER register event.
      
      
    
 
- Ph_FEP_RECT
    
 
- Give rectangle (for pre-edit window and cursor) to FEP services. The pre-edit rectangle is defined by the event rectangle. The cursor rectangle is defined by this structure's rectangle member.
      
    
 
- Ph_FEP_NORECT
    
 
- Invalidate rectangle in FEP service.
      
    
 
- Ph_FEP_ACTIVATE
    
 
- Request activation of FEP filter.
      
    
 
- Ph_FEP_DEACTIVATE 
    
 
- Request deactivation of FEP filter.
      
    
 
 
- long len
 
- Not used.
 
- PhRect_t rect
 
- The cursor rectangle relative to the event rectangle.
 
- long num_rids
 
- The number of regions that are parents of this region (the region owned 
by the currently focused widget). An array of num_rids RIDs should 
be appended to the event data. The first RID in this list should be the RID 
of the focused widget; otherwise num_rids should be set to 0.
 
 
Ph_EV_SYSTEM events are 
emitted when Photon or a service wants to inform applications of
    changes in the system. The event data is a
    PhSystemEvent_t union. The valid member is
    dictated by the subtype of the system event.
If the event subtype is Ph_SYSTEM_REGION_CHANGE, 
the valid union member is RegionChange, which contains 
at least the following members:
- PhRid_t rid
 
- ID of the region that changed.
 
- PhPoint_t origin
 
- Origin of the region, relative to its parent rid.
 
- PhRect_t rect            
 
- Its rectangle, relative to its origin.
 
- ulong_t flags            
 
- The region's flags.
 
- ulong_t fields           
 
- A set of bits indicating which fields of the PhRegion_t
  structure were modified:
  
- 0xFFFFFFFF - the region was opened.
    
 
- 0x00000000 - the region was closed.
    
 
- Other values - fields with a 1 bit were changed.
  
 
    For more information, see:
  
 
- unsigned short input_group
 
- Nonzero if the region being changed belongs to an input group.
 
    Emitted by an application directly to the Device region to request
    a reciprocal event after a specific amount of time has elapsed
    (arm a timer). This is usually done via 
    PtTimerArm() or
    PhTimerArm().
It is also emitted by Photon when an armed timer expires. In both
        cases, the event data is a PhTimerEvent_t
        structure that contains the following members:
unsigned msec 
unsigned zero
PhEventRegion_t region 
region.rid is the RID, and
        region.handle is a pointer to the widget specified as the
        handle in a PtTimerArm() call.  
When this event is received by
        the widget library, it delivers the event directly to the
        widget designated by region.handle. It's best to avoid setting region.handle to anything other than a valid widget
        pointer.
    
Both the Window Manager and applications can emit this
      event. The Window Manager emits this event when an
      application has asked to be notified. An application can
      emit this event to communicate to the Window Manager
      regarding windows.
      
      Ph_EV_WM can have the following subtype:
      
- Ph_EV_WM_EVENT
      
 
-   The rectangle set of the event has no useful value.
            The event data is a 
         PhWindowEvent_t
            structure. 
         
         
      
 
Photon
PhGetData(),
PhGetRects(),
PhKeyEvent_t,
PhWindowEvent_t
Events chapter of the
Photon Programmer's Guide