text:
/*
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
 * file for a list of people on the GTK+ Team.  See the ChangeLog
 * files for a list of changes.  These files are distributed with
 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
 */

#ifndef __GDK_EVENTS_H__
#define __GDK_EVENTS_H__

#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
#error "Only <gdk/gdk.h> can be included directly."
#endif

#include <gdk/gdkversionmacros.h>
#include <gdk/gdkcolor.h>
#include <gdk/gdktypes.h>
#include <gdk/gdkdnd.h>
#include <gdk/gdkdevice.h>

G_BEGIN_DECLS

/**
 * SECTION:event_structs
 * @Short_description: Data structures specific to each type of event
 * @Title: Event Structures
 *
 * The event structures contain data specific to each type of event in GDK.
 *
 * > A common mistake is to forget to set the event mask of a widget so that
 * > the required events are received. See gtk_widget_set_events().
 */

#define GDK_TYPE_EVENT          (gdk_event_get_type ())

/**
 * GDK_PRIORITY_EVENTS:
 *
 * This is the priority that events from the X server are given in the
 * [GLib Main Loop][glib-The-Main-Event-Loop].
 */
#define GDK_PRIORITY_EVENTS	(G_PRIORITY_DEFAULT)

/**
 * GDK_PRIORITY_REDRAW:
 *
 * This is the priority that the idle handler processing window updates
 * is given in the
 * [GLib Main Loop][glib-The-Main-Event-Loop].
 */
#define GDK_PRIORITY_REDRAW     (G_PRIORITY_HIGH_IDLE + 20)

/**
 * GDK_EVENT_PROPAGATE:
 *
 * Use this macro as the return value for continuing the propagation of
 * an event handler.
 *
 * Since: 3.4
 */
#define GDK_EVENT_PROPAGATE     (FALSE)

/**
 * GDK_EVENT_STOP:
 *
 * Use this macro as the return value for stopping the propagation of
 * an event handler.
 *
 * Since: 3.4
 */
#define GDK_EVENT_STOP          (TRUE)

/**
 * GDK_BUTTON_PRIMARY:
 *
 * The primary button. This is typically the left mouse button, or the
 * right button in a left-handed setup.
 *
 * Since: 3.4
 */
#define GDK_BUTTON_PRIMARY      (1)

/**
 * GDK_BUTTON_MIDDLE:
 *
 * The middle button.
 *
 * Since: 3.4
 */
#define GDK_BUTTON_MIDDLE       (2)

/**
 * GDK_BUTTON_SECONDARY:
 *
 * The secondary button. This is typically the right mouse button, or the
 * left button in a left-handed setup.
 *
 * Since: 3.4
 */
#define GDK_BUTTON_SECONDARY    (3)

typedef struct _GdkEventAny	    GdkEventAny;
typedef struct _GdkEventExpose	    GdkEventExpose;
typedef struct _GdkEventVisibility  GdkEventVisibility;
typedef struct _GdkEventMotion	    GdkEventMotion;
typedef struct _GdkEventButton	    GdkEventButton;
typedef struct _GdkEventTouch       GdkEventTouch;
typedef struct _GdkEventScroll      GdkEventScroll;
typedef struct _GdkEventKey	    GdkEventKey;
typedef struct _GdkEventFocus	    GdkEventFocus;
typedef struct _GdkEventCrossing    GdkEventCrossing;
typedef struct _GdkEventConfigure   GdkEventConfigure;
typedef struct _GdkEventProperty    GdkEventProperty;
typedef struct _GdkEventSelection   GdkEventSelection;
typedef struct _GdkEventOwnerChange GdkEventOwnerChange;
typedef struct _GdkEventProximity   GdkEventProximity;
typedef struct _GdkEventDND         GdkEventDND;
typedef struct _GdkEventWindowState GdkEventWindowState;
typedef struct _GdkEventSetting     GdkEventSetting;
typedef struct _GdkEventGrabBroken  GdkEventGrabBroken;

typedef struct _GdkEventSequence    GdkEventSequence;

typedef union  _GdkEvent	    GdkEvent;

/**
 * GdkEventFunc:
 * @event: the #GdkEvent to process.
 * @data: (closure): user data set when the event handler was installed with
 *   gdk_event_handler_set().
 *
 * Specifies the type of function passed to gdk_event_handler_set() to
 * handle all GDK events.
 */
typedef void (*GdkEventFunc) (GdkEvent *event,
			      gpointer	data);

/* Event filtering */

/**
 * GdkXEvent:
 *
 * Used to represent native events (XEvents for the X11
 * backend, MSGs for Win32).
 */
typedef void GdkXEvent;	  /* Can be cast to window system specific
			   * even type, XEvent on X11, MSG on Win32.
			   */

/**
 * GdkFilterReturn:
 * @GDK_FILTER_CONTINUE: event not handled, continue processing.
 * @GDK_FILTER_TRANSLATE: native event translated into a GDK event and stored
 *  in the `event` structure that was passed in.
 * @GDK_FILTER_REMOVE: event handled, terminate processing.
 *
 * Specifies the result of applying a #GdkFilterFunc to a native event.
 */
typedef enum {
  GDK_FILTER_CONTINUE,	  /* Event not handled, continue processesing */
  GDK_FILTER_TRANSLATE,	  /* Native event translated into a GDK event and
                             stored in the "event" structure that was
                             passed in */
  GDK_FILTER_REMOVE	  /* Terminate processing, removing event */
} GdkFilterReturn;

/**
 * GdkFilterFunc:
 * @xevent: the native event to filter.
 * @event: the GDK event to which the X event will be translated.
 * @data: user data set when the filter was installed.
 *
 * Specifies the type of function used to filter native events before they are
 * converted to GDK events.
 *
 * When a filter is called, @event is unpopulated, except for
 * `event->window`. The filter may translate the native
 * event to a GDK event and store the result in @event, or handle it without
 * translation. If the filter translates the event and processing should
 * continue, it should return %GDK_FILTER_TRANSLATE.
 *
 * Returns: a #GdkFilterReturn value.
 */
typedef GdkFilterReturn (*GdkFilterFunc) (GdkXEvent *xevent,
					  GdkEvent *event,
					  gpointer  data);

/**
 * GdkEventType:
 * @GDK_NOTHING: a special code to indicate a null event.
 * @GDK_DELETE: the window manager has requested that the toplevel window be
 *   hidden or destroyed, usually when the user clicks on a special icon in the
 *   title bar.
 * @GDK_DESTROY: the window has been destroyed.
 * @GDK_EXPOSE: all or part of the window has become visible and needs to be
 *   redrawn.
 * @GDK_MOTION_NOTIFY: the pointer (usually a mouse) has moved.
 * @GDK_BUTTON_PRESS: a mouse button has been pressed.
 * @GDK_2BUTTON_PRESS: a mouse button has been double-clicked (clicked twice
 *   within a short period of time). Note that each click also generates a
 *   %GDK_BUTTON_PRESS event.
 * @GDK_DOUBLE_BUTTON_PRESS: alias for %GDK_2BUTTON_PRESS, added in 3.6.
 * @GDK_3BUTTON_PRESS: a mouse button has been clicked 3 times in a short period
 *   of time. Note that each click also generates a %GDK_BUTTON_PRESS event.
 * @GDK_TRIPLE_BUTTON_PRESS: alias for %GDK_3BUTTON_PRESS, added in 3.6.
 * @GDK_BUTTON_RELEASE: a mouse button has been released.
 * @GDK_KEY_PRESS: a key has been pressed.
 * @GDK_KEY_RELEASE: a key has been released.
 * @GDK_ENTER_NOTIFY: the pointer has entered the window.
 * @GDK_LEAVE_NOTIFY: the pointer has left the window.
 * @GDK_FOCUS_CHANGE: the keyboard focus has entered or left the window.
 * @GDK_CONFIGURE: the size, position or stacking order of the window has changed.
 *   Note that GTK+ discards these events for %GDK_WINDOW_CHILD windows.
 * @GDK_MAP: the window has been mapped.
 * @GDK_UNMAP: the window has been unmapped.
 * @GDK_PROPERTY_NOTIFY: a property on the window has been changed or deleted.
 * @GDK_SELECTION_CLEAR: the application has lost ownership of a selection.
 * @GDK_SELECTION_REQUEST: another application has requested a selection.
 * @GDK_SELECTION_NOTIFY: a selection has been received.
 * @GDK_PROXIMITY_IN: an input device has moved into contact with a sensing
 *   surface (e.g. a touchscreen or graphics tablet).
 * @GDK_PROXIMITY_OUT: an input device has moved out of contact with a sensing
 *   surface.
 * @GDK_DRAG_ENTER: the mouse has entered the window while a drag is in progress.
 * @GDK_DRAG_LEAVE: the mouse has left the window while a drag is in progress.
 * @GDK_DRAG_MOTION: the mouse has moved in the window while a drag is in
 *   progress.
 * @GDK_DRAG_STATUS: the status of the drag operation initiated by the window
 *   has changed.
 * @GDK_DROP_START: a drop operation onto the window has started.
 * @GDK_DROP_FINISHED: the drop operation initiated by the window has completed.
 * @GDK_CLIENT_EVENT: a message has been received from another application.
 * @GDK_VISIBILITY_NOTIFY: the window visibility status has changed.
 * @GDK_SCROLL: the scroll wheel was turned
 * @GDK_WINDOW_STATE: the state of a window has changed. See #GdkWindowState
 *   for the possible window states
 * @GDK_SETTING: a setting has been modified.
 * @GDK_OWNER_CHANGE: the owner of a selection has changed. This event type
 *   was added in 2.6
 * @GDK_GRAB_BROKEN: a pointer or keyboard grab was broken. This event type
 *   was added in 2.8.
 * @GDK_DAMAGE: the content of the window has been changed. This event type
 *   was added in 2.14.
 * @GDK_TOUCH_BEGIN: A new touch event sequence has just started. This event
 *   type was added in 3.4.
 * @GDK_TOUCH_UPDATE: A touch event sequence has been updated. This event type
 *   was added in 3.4.
 * @GDK_TOUCH_END: A touch event sequence has finished. This event type
 *   was added in 3.4.
 * @GDK_TOUCH_CANCEL: A touch event sequence has been canceled. This event type
 *   was added in 3.4.
 * @GDK_EVENT_LAST: marks the end of the GdkEventType enumeration. Added in 2.18
 *
 * Specifies the type of the event.
 *
 * Do not confuse these events with the signals that GTK+ widgets emit.
 * Although many of these events result in corresponding signals being emitted,
 * the events are often transformed or filtered along the way.
 *
 * In some language bindings, the values %GDK_2BUTTON_PRESS and
 * %GDK_3BUTTON_PRESS would translate into something syntactically
 * invalid (eg `Gdk.EventType.2ButtonPress`, where a
 * symbol is not allowed to start with a number). In that case, the
 * aliases %GDK_DOUBLE_BUTTON_PRESS and %GDK_TRIPLE_BUTTON_PRESS can
 * be used instead.
 */
typedef enum
{
  GDK_NOTHING		= -1,
  GDK_DELETE		= 0,
  GDK_DESTROY		= 1,
  GDK_EXPOSE		= 2,
  GDK_MOTION_NOTIFY	= 3,
  GDK_BUTTON_PRESS	= 4,
  GDK_2BUTTON_PRESS	= 5,
  GDK_DOUBLE_BUTTON_PRESS = GDK_2BUTTON_PRESS,
  GDK_3BUTTON_PRESS	= 6,
  GDK_TRIPLE_BUTTON_PRESS = GDK_3BUTTON_PRESS,
  GDK_BUTTON_RELEASE	= 7,
  GDK_KEY_PRESS		= 8,
  GDK_KEY_RELEASE	= 9,
  GDK_ENTER_NOTIFY	= 10,
  GDK_LEAVE_NOTIFY	= 11,
  GDK_FOCUS_CHANGE	= 12,
  GDK_CONFIGURE		= 13,
  GDK_MAP		= 14,
  GDK_UNMAP		= 15,
  GDK_PROPERTY_NOTIFY	= 16,
  GDK_SELECTION_CLEAR	= 17,
  GDK_SELECTION_REQUEST = 18,
  GDK_SELECTION_NOTIFY	= 19,
  GDK_PROXIMITY_IN	= 20,
  GDK_PROXIMITY_OUT	= 21,
  GDK_DRAG_ENTER        = 22,
  GDK_DRAG_LEAVE        = 23,
  GDK_DRAG_MOTION       = 24,
  GDK_DRAG_STATUS       = 25,
  GDK_DROP_START        = 26,
  GDK_DROP_FINISHED     = 27,
  GDK_CLIENT_EVENT	= 28,
  GDK_VISIBILITY_NOTIFY = 29,
  GDK_SCROLL            = 31,
  GDK_WINDOW_STATE      = 32,
  GDK_SETTING           = 33,
  GDK_OWNER_CHANGE      = 34,
  GDK_GRAB_BROKEN       = 35,
  GDK_DAMAGE            = 36,
  GDK_TOUCH_BEGIN       = 37,
  GDK_TOUCH_UPDATE      = 38,
  GDK_TOUCH_END         = 39,
  GDK_TOUCH_CANCEL      = 40,
  GDK_EVENT_LAST        /* helper variable for decls */
} GdkEventType;

/**
 * GdkVisibilityState:
 * @GDK_VISIBILITY_UNOBSCURED: the window is completely visible.
 * @GDK_VISIBILITY_PARTIAL: the window is partially visible.
 * @GDK_VISIBILITY_FULLY_OBSCURED: the window is not visible at all.
 *
 * Specifies the visiblity status of a window for a #GdkEventVisibility.
 */
typedef enum
{
  GDK_VISIBILITY_UNOBSCURED,
  GDK_VISIBILITY_PARTIAL,
  GDK_VISIBILITY_FULLY_OBSCURED
} GdkVisibilityState;

/**
 * GdkScrollDirection:
 * @GDK_SCROLL_UP: the window is scrolled up.
 * @GDK_SCROLL_DOWN: the window is scrolled down.
 * @GDK_SCROLL_LEFT: the window is scrolled to the left.
 * @GDK_SCROLL_RIGHT: the window is scrolled to the right.
 * @GDK_SCROLL_SMOOTH: the scrolling is determined by the delta values
 *   in #GdkEventScroll. See gdk_event_get_scroll_deltas(). Since: 3.4
 *
 * Specifies the direction for #GdkEventScroll.
 */
typedef enum
{
  GDK_SCROLL_UP,
  GDK_SCROLL_DOWN,
  GDK_SCROLL_LEFT,
  GDK_SCROLL_RIGHT,
  GDK_SCROLL_SMOOTH
} GdkScrollDirection;

/**
 * GdkNotifyType:
 * @GDK_NOTIFY_ANCESTOR: the window is entered from an ancestor or
 *   left towards an ancestor.
 * @GDK_NOTIFY_VIRTUAL: the pointer moves between an ancestor and an
 *   inferior of the window.
 * @GDK_NOTIFY_INFERIOR: the window is entered from an inferior or
 *   left towards an inferior.
 * @GDK_NOTIFY_NONLINEAR: the window is entered from or left towards
 *   a window which is neither an ancestor nor an inferior.
 * @GDK_NOTIFY_NONLINEAR_VIRTUAL: the pointer moves between two windows
 *   which are not ancestors of each other and the window is part of
 *   the ancestor chain between one of these windows and their least
 *   common ancestor.
 * @GDK_NOTIFY_UNKNOWN: an unknown type of enter/leave event occurred.
 *
 * Specifies the kind of crossing for #GdkEventCrossing.
 *
 * See the X11 protocol specification of LeaveNotify for
 * full details of crossing event generation.
 */
typedef enum
{
  GDK_NOTIFY_ANCESTOR		= 0,
  GDK_NOTIFY_VIRTUAL		= 1,
  GDK_NOTIFY_INFERIOR		= 2,
  GDK_NOTIFY_NONLINEAR		= 3,
  GDK_NOTIFY_NONLINEAR_VIRTUAL	= 4,
  GDK_NOTIFY_UNKNOWN		= 5
} GdkNotifyType;

/**
 * GdkCrossingMode:
 * @GDK_CROSSING_NORMAL: crossing because of pointer motion.
 * @GDK_CROSSING_GRAB: crossing because a grab is activated.
 * @GDK_CROSSING_UNGRAB: crossing because a grab is deactivated.
 * @GDK_CROSSING_GTK_GRAB: crossing because a GTK+ grab is activated.
 * @GDK_CROSSING_GTK_UNGRAB: crossing because a GTK+ grab is deactivated.
 * @GDK_CROSSING_STATE_CHANGED: crossing because a GTK+ widget changed
 *   state (e.g. sensitivity).
 * @GDK_CROSSING_TOUCH_BEGIN: crossing because a touch sequence has begun,
 *   this event is synthetic as the pointer might have not left the window.
 * @GDK_CROSSING_TOUCH_END: crossing because a touch sequence has ended,
 *   this event is synthetic as the pointer might have not left the window.
 * @GDK_CROSSING_DEVICE_SWITCH: crossing because of a device switch (i.e.
 *   a mouse taking control of the pointer after a touch device), this event
 *   is synthetic as the pointer didn't leave the window.
 *
 * Specifies the crossing mode for #GdkEventCrossing.
 */
typedef enum
{
  GDK_CROSSING_NORMAL,
  GDK_CROSSING_GRAB,
  GDK_CROSSING_UNGRAB,
  GDK_CROSSING_GTK_GRAB,
  GDK_CROSSING_GTK_UNGRAB,
  GDK_CROSSING_STATE_CHANGED,
  GDK_CROSSING_TOUCH_BEGIN,
  GDK_CROSSING_TOUCH_END,
  GDK_CROSSING_DEVICE_SWITCH
} GdkCrossingMode;

/**
 * GdkPropertyState:
 * @GDK_PROPERTY_NEW_VALUE: the property value was changed.
 * @GDK_PROPERTY_DELETE: the property was deleted.
 *
 * Specifies the type of a property change for a #GdkEventProperty.
 */
typedef enum
{
  GDK_PROPERTY_NEW_VALUE,
  GDK_PROPERTY_DELETE
} GdkPropertyState;

/**
 * GdkWindowState:
 * @GDK_WINDOW_STATE_WITHDRAWN: the window is not shown.
 * @GDK_WINDOW_STATE_ICONIFIED: the window is minimized.
 * @GDK_WINDOW_STATE_MAXIMIZED: the window is maximized.
 * @GDK_WINDOW_STATE_STICKY: the window is sticky.
 * @GDK_WINDOW_STATE_FULLSCREEN: the window is maximized without
 *   decorations.
 * @GDK_WINDOW_STATE_ABOVE: the window is kept above other windows.
 * @GDK_WINDOW_STATE_BELOW: the window is kept below other windows.
 * @GDK_WINDOW_STATE_FOCUSED: the window is presented as focused (with active decorations).
 * @GDK_WINDOW_STATE_TILED: the window is in a tiled state, Since 3.10
 *
 * Specifies the state of a toplevel window.
 */
typedef enum
{
  GDK_WINDOW_STATE_WITHDRAWN  = 1 << 0,
  GDK_WINDOW_STATE_ICONIFIED  = 1 << 1,
  GDK_WINDOW_STATE_MAXIMIZED  = 1 << 2,
  GDK_WINDOW_STATE_STICKY     = 1 << 3,
  GDK_WINDOW_STATE_FULLSCREEN = 1 << 4,
  GDK_WINDOW_STATE_ABOVE      = 1 << 5,
  GDK_WINDOW_STATE_BELOW      = 1 << 6,
  GDK_WINDOW_STATE_FOCUSED    = 1 << 7,
  GDK_WINDOW_STATE_TILED      = 1 << 8
} GdkWindowState;

/**
 * GdkSettingAction:
 * @GDK_SETTING_ACTION_NEW: a setting was added.
 * @GDK_SETTING_ACTION_CHANGED: a setting was changed.
 * @GDK_SETTING_ACTION_DELETED: a setting was deleted.
 *
 * Specifies the kind of modification applied to a setting in a
 * #GdkEventSetting.
 */
typedef enum
{
  GDK_SETTING_ACTION_NEW,
  GDK_SETTING_ACTION_CHANGED,
  GDK_SETTING_ACTION_DELETED
} GdkSettingAction;

/**
 * GdkOwnerChange:
 * @GDK_OWNER_CHANGE_NEW_OWNER: some other app claimed the ownership
 * @GDK_OWNER_CHANGE_DESTROY: the window was destroyed
 * @GDK_OWNER_CHANGE_CLOSE: the client was closed
 *
 * Specifies why a selection ownership was changed.
 */
typedef enum
{
  GDK_OWNER_CHANGE_NEW_OWNER,
  GDK_OWNER_CHANGE_DESTROY,
  GDK_OWNER_CHANGE_CLOSE
} GdkOwnerChange;

/**
 * GdkEventAny:
 * @type: the type of the event.
 * @window: the window which received the event.
 * @send_event: %TRUE if the event was sent explicitly.
 *
 * Contains the fields which are common to all event structs.
 * Any event pointer can safely be cast to a pointer to a #GdkEventAny to
 * access these fields.
 */
struct _GdkEventAny
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
};

/**
 * GdkEventExpose:
 * @type: the type of the event (%GDK_EXPOSE or %GDK_DAMAGE).
 * @window: the window which received the event.
 * @send_event: %TRUE if the event was sent explicitly.
 * @area: bounding box of @region.
 * @region: the region that needs to be redrawn.
 * @count: the number of contiguous %GDK_EXPOSE events following this one.
 *   The only use for this is "exposure compression", i.e. handling all
 *   contiguous %GDK_EXPOSE events in one go, though GDK performs some
 *   exposure compression so this is not normally needed.
 *
 * Generated when all or part of a window becomes visible and needs to be
 * redrawn.
 */
struct _GdkEventExpose
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  GdkRectangle area;
  cairo_region_t *region;
  gint count; /* If non-zero, how many more events follow. */
};

/**
 * GdkEventVisibility:
 * @type: the type of the event (%GDK_VISIBILITY_NOTIFY).
 * @window: the window which received the event.
 * @send_event: %TRUE if the event was sent explicitly.
 * @state: the new visibility state (%GDK_VISIBILITY_FULLY_OBSCURED,
 *   %GDK_VISIBILITY_PARTIAL or %GDK_VISIBILITY_UNOBSCURED).
 *
 * Generated when the window visibility status has changed.
 *
 * Deprecated: 3.12: Modern composited windowing systems with pervasive
 *     transparency make it impossible to track the visibility of a window
 *     reliably, so this event can not be guaranteed to provide useful
 *     information.
 */
struct _GdkEventVisibility
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  GdkVisibilityState state;
};

/**
 * GdkEventMotion:
 * @type: the type of the event.
 * @window: the window which received the event.
 * @send_event: %TRUE if the event was sent explicitly.
 * @time: the time of the event in milliseconds.
 * @x: the x coordinate of the pointer relative to the window.
 * @y: the y coordinate of the pointer relative to the window.
 * @axes: @x, @y translated to the axes of @device, or %NULL if @device is
 *   the mouse.
 * @state: (type GdkModifierType): a bit-mask representing the state of
 *   the modifier keys (e.g. Control, Shift and Alt) and the pointer
 *   buttons. See #GdkModifierType.
 * @is_hint: set to 1 if this event is just a hint, see the
 *   %GDK_POINTER_MOTION_HINT_MASK value of #GdkEventMask.
 * @device: the master device that the event originated from. Use
 * gdk_event_get_source_device() to get the slave device.
 * @x_root: the x coordinate of the pointer relative to the root of the
 *   screen.
 * @y_root: the y coordinate of the pointer relative to the root of the
 *   screen.
 *
 * Generated when the pointer moves.
 */
struct _GdkEventMotion
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  guint32 time;
  gdouble x;
  gdouble y;
  gdouble *axes;
  guint state;
  gint16 is_hint;
  GdkDevice *device;
  gdouble x_root, y_root;
};

/**
 * GdkEventButton:
 * @type: the type of the event (%GDK_BUTTON_PRESS, %GDK_2BUTTON_PRESS,
 *   %GDK_3BUTTON_PRESS or %GDK_BUTTON_RELEASE).
 * @window: the window which received the event.
 * @send_event: %TRUE if the event was sent explicitly.
 * @time: the time of the event in milliseconds.
 * @x: the x coordinate of the pointer relative to the window.
 * @y: the y coordinate of the pointer relative to the window.
 * @axes: @x, @y translated to the axes of @device, or %NULL if @device is
 *   the mouse.
 * @state: (type GdkModifierType): a bit-mask representing the state of
 *   the modifier keys (e.g. Control, Shift and Alt) and the pointer
 *   buttons. See #GdkModifierType.
 * @button: the button which was pressed or released, numbered from 1 to 5.
 *   Normally button 1 is the left mouse button, 2 is the middle button,
 *   and 3 is the right button. On 2-button mice, the middle button can
 *   often be simulated by pressing both mouse buttons together.
 * @device: the master device that the event originated from. Use
 * gdk_event_get_source_device() to get the slave device.
 * @x_root: the x coordinate of the pointer relative to the root of the
 *   screen.
 * @y_root: the y coordinate of the pointer relative to the root of the
 *   screen.
 *
 * Used for button press and button release events. The
 * @type field will be one of %GDK_BUTTON_PRESS,
 * %GDK_2BUTTON_PRESS, %GDK_3BUTTON_PRESS or %GDK_BUTTON_RELEASE,
 *
 * Double and triple-clicks result in a sequence of events being received.
 * For double-clicks the order of events will be:
 *
 * - %GDK_BUTTON_PRESS
 * - %GDK_BUTTON_RELEASE
 * - %GDK_BUTTON_PRESS
 * - %GDK_2BUTTON_PRESS
 * - %GDK_BUTTON_RELEASE
 *
 * Note that the first click is received just like a normal
 * button press, while the second click results in a %GDK_2BUTTON_PRESS
 * being received just after the %GDK_BUTTON_PRESS.
 *
 * Triple-clicks are very similar to double-clicks, except that
 * %GDK_3BUTTON_PRESS is inserted after the third click. The order of the
 * events is:
 *
 * - %GDK_BUTTON_PRESS
 * - %GDK_BUTTON_RELEASE
 * - %GDK_BUTTON_PRESS
 * - %GDK_2BUTTON_PRESS
 * - %GDK_BUTTON_RELEASE
 * - %GDK_BUTTON_PRESS
 * - %GDK_3BUTTON_PRESS
 * - %GDK_BUTTON_RELEASE
 *
 * For a double click to occur, the second button press must occur within
 * 1/4 of a second of the first. For a triple click to occur, the third
 * button press must also occur within 1/2 second of the first button press.
 */
struct _GdkEventButton
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  guint32 time;
  gdouble x;
  gdouble y;
  gdouble *axes;
  guint state;
  guint button;
  GdkDevice *device;
  gdouble x_root, y_root;
};

/**
 * GdkEventTouch:
 * @type: the type of the event (%GDK_TOUCH_BEGIN, %GDK_TOUCH_UPDATE,
 *   %GDK_TOUCH_END, %GDK_TOUCH_CANCEL)
 * @window: the window which received the event
 * @send_event: %TRUE if the event was sent explicitly.
 * @time: the time of the event in milliseconds.
 * @x: the x coordinate of the pointer relative to the window
 * @y: the y coordinate of the pointer relative to the window
 * @axes: @x, @y translated to the axes of @device, or %NULL if @device is
 *   the mouse
 * @state: (type GdkModifierType): a bit-mask representing the state of
 *   the modifier keys (e.g. Control, Shift and Alt) and the pointer
 *   buttons. See #GdkModifierType
 * @sequence: the event sequence that the event belongs to
 * @emulating_pointer: whether the event should be used for emulating
 *   pointer event
 * @device: the master device that the event originated from. Use
 * gdk_event_get_source_device() to get the slave device.
 * @x_root: the x coordinate of the pointer relative to the root of the
 *   screen
 * @y_root: the y coordinate of the pointer relative to the root of the
 *   screen
 *
 * Used for touch events.
 * @type field will be one of %GDK_TOUCH_BEGIN, %GDK_TOUCH_UPDATE,
 * %GDK_TOUCH_END or %GDK_TOUCH_CANCEL.
 *
 * Touch events are grouped into sequences by means of the @sequence
 * field, which can also be obtained with gdk_event_get_event_sequence().
 * Each sequence begins with a %GDK_TOUCH_BEGIN event, followed by
 * any number of %GDK_TOUCH_UPDATE events, and ends with a %GDK_TOUCH_END
 * (or %GDK_TOUCH_CANCEL) event. With multitouch devices, there may be
 * several active sequences at the same time.
 */
struct _GdkEventTouch
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  guint32 time;
  gdouble x;
  gdouble y;
  gdouble *axes;
  guint state;
  GdkEventSequence *sequence;
  gboolean emulating_pointer;
  GdkDevice *device;
  gdouble x_root, y_root;
};

/**
 * GdkEventScroll:
 * @type: the type of the event (%GDK_SCROLL).
 * @window: the window which received the event.
 * @send_event: %TRUE if the event was sent explicitly.
 * @time: the time of the event in milliseconds.
 * @x: the x coordinate of the pointer relative to the window.
 * @y: the y coordinate of the pointer relative to the window.
 * @state: (type GdkModifierType): a bit-mask representing the state of
 *   the modifier keys (e.g. Control, Shift and Alt) and the pointer
 *   buttons. See #GdkModifierType.
 * @direction: the direction to scroll to (one of %GDK_SCROLL_UP,
 *   %GDK_SCROLL_DOWN, %GDK_SCROLL_LEFT, %GDK_SCROLL_RIGHT or
 *   %GDK_SCROLL_SMOOTH).
 * @device: the master device that the event originated from. Use
 * gdk_event_get_source_device() to get the slave device.
 * @x_root: the x coordinate of the pointer relative to the root of the
 *   screen.
 * @y_root: the y coordinate of the pointer relative to the root of the
 *   screen.
 * @delta_x: the x coordinate of the scroll delta
 * @delta_y: the y coordinate of the scroll delta
 *
 * Generated from button presses for the buttons 4 to 7. Wheel mice are
 * usually configured to generate button press events for buttons 4 and 5
 * when the wheel is turned.
 *
 * Some GDK backends can also generate "smooth" scroll events, which
 * can be recognized by the %GDK_SCROLL_SMOOTH scroll direction. For
 * these, the scroll deltas can be obtained with
 * gdk_event_get_scroll_deltas().
 */
struct _GdkEventScroll
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  guint32 time;
  gdouble x;
  gdouble y;
  guint state;
  GdkScrollDirection direction;
  GdkDevice *device;
  gdouble x_root, y_root;
  gdouble delta_x;
  gdouble delta_y;
};

/**
 * GdkEventKey:
 * @type: the type of the event (%GDK_KEY_PRESS or %GDK_KEY_RELEASE).
 * @window: the window which received the event.
 * @send_event: %TRUE if the event was sent explicitly.
 * @time: the time of the event in milliseconds.
 * @state: (type GdkModifierType): a bit-mask representing the state of
 *   the modifier keys (e.g. Control, Shift and Alt) and the pointer
 *   buttons. See #GdkModifierType.
 * @keyval: the key that was pressed or released. See the
 *   `gdk/gdkkeysyms.h` header file for a
 *   complete list of GDK key codes.
 * @length: the length of @string.
 * @string: a string containing an approximation of the text that
 *   would result from this keypress. The only correct way to handle text
 *   input of text is using input methods (see #GtkIMContext), so this
 *   field is deprecated and should never be used.
 *   (gdk_unicode_to_keyval() provides a non-deprecated way of getting
 *   an approximate translation for a key.) The string is encoded in the
 *   encoding of the current locale (Note: this for backwards compatibility:
 *   strings in GTK+ and GDK are typically in UTF-8.) and NUL-terminated.
 *   In some cases, the translation of the key code will be a single
 *   NUL byte, in which case looking at @length is necessary to distinguish
 *   it from the an empty translation.
 * @hardware_keycode: the raw code of the key that was pressed or released.
 * @group: the keyboard group.
 * @is_modifier: a flag that indicates if @hardware_keycode is mapped to a
 *   modifier. Since 2.10
 *
 * Describes a key press or key release event.
 */
struct _GdkEventKey
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  guint32 time;
  guint state;
  guint keyval;
  gint length;
  gchar *string;
  guint16 hardware_keycode;
  guint8 group;
  guint is_modifier : 1;
};

/**
 * GdkEventCrossing:
 * @type: the type of the event (%GDK_ENTER_NOTIFY or %GDK_LEAVE_NOTIFY).
 * @window: the window which received the event.
 * @send_event: %TRUE if the event was sent explicitly.
 * @subwindow: the window that was entered or left.
 * @time: the time of the event in milliseconds.
 * @x: the x coordinate of the pointer relative to the window.
 * @y: the y coordinate of the pointer relative to the window.
 * @x_root: the x coordinate of the pointer relative to the root of the screen.
 * @y_root: the y coordinate of the pointer relative to the root of the screen.
 * @mode: the crossing mode (%GDK_CROSSING_NORMAL, %GDK_CROSSING_GRAB,
 *  %GDK_CROSSING_UNGRAB, %GDK_CROSSING_GTK_GRAB, %GDK_CROSSING_GTK_UNGRAB or
 *  %GDK_CROSSING_STATE_CHANGED).  %GDK_CROSSING_GTK_GRAB, %GDK_CROSSING_GTK_UNGRAB,
 *  and %GDK_CROSSING_STATE_CHANGED were added in 2.14 and are always synthesized,
 *  never native.
 * @detail: the kind of crossing that happened (%GDK_NOTIFY_INFERIOR,
 *  %GDK_NOTIFY_ANCESTOR, %GDK_NOTIFY_VIRTUAL, %GDK_NOTIFY_NONLINEAR or
 *  %GDK_NOTIFY_NONLINEAR_VIRTUAL).
 * @focus: %TRUE if @window is the focus window or an inferior.
 * @state: (type GdkModifierType): a bit-mask representing the state of
 *   the modifier keys (e.g. Control, Shift and Alt) and the pointer
 *   buttons. See #GdkModifierType.
 *
 * Generated when the pointer enters or leaves a window.
 */
struct _GdkEventCrossing
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  GdkWindow *subwindow;
  guint32 time;
  gdouble x;
  gdouble y;
  gdouble x_root;
  gdouble y_root;
  GdkCrossingMode mode;
  GdkNotifyType detail;
  gboolean focus;
  guint state;
};

/**
 * GdkEventFocus:
 * @type: the type of the event (%GDK_FOCUS_CHANGE).
 * @window: the window which received the event.
 * @send_event: %TRUE if the event was sent explicitly.
 * @in: %TRUE if the window has gained the keyboard focus, %FALSE if
 *   it has lost the focus.
 *
 * Describes a change of keyboard focus.
 */
struct _GdkEventFocus
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  gint16 in;
};

/**
 * GdkEventConfigure:
 * @type: the type of the event (%GDK_CONFIGURE).
 * @window: the window which received the event.
 * @send_event: %TRUE if the event was sent explicitly.
 * @x: the new x coordinate of the window, relative to its parent.
 * @y: the new y coordinate of the window, relative to its parent.
 * @width: the new width of the window.
 * @height: the new height of the window.
 *
 * Generated when a window size or position has changed.
 */
struct _GdkEventConfigure
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  gint x, y;
  gint width;
  gint height;
};

/**
 * GdkEventProperty:
 * @type: the type of the event (%GDK_PROPERTY_NOTIFY).
 * @window: the window which received the event.
 * @send_event: %TRUE if the event was sent explicitly.
 * @atom: the property that was changed.
 * @time: the time of the event in milliseconds.
 * @state: (type GdkPropertyState): whether the property was changed
 *   (%GDK_PROPERTY_NEW_VALUE) or deleted (%GDK_PROPERTY_DELETE).
 *
 * Describes a property change on a window.
 */
struct _GdkEventProperty
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  GdkAtom atom;
  guint32 time;
  guint state;
};

/**
 * GdkEventSelection:
 * @type: the type of the event (%GDK_SELECTION_CLEAR,
 *   %GDK_SELECTION_NOTIFY or %GDK_SELECTION_REQUEST).
 * @window: the window which received the event.
 * @send_event: %TRUE if the event was sent explicitly.
 * @selection: the selection.
 * @target: the target to which the selection should be converted.
 * @property: the property in which to place the result of the conversion.
 * @time: the time of the event in milliseconds.
 * @requestor: the window on which to place @property or %NULL if none.
 *
 * Generated when a selection is requested or ownership of a selection
 * is taken over by another client application.
 */
struct _GdkEventSelection
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  GdkAtom selection;
  GdkAtom target;
  GdkAtom property;
  guint32 time;
  GdkWindow *requestor;
};

/**
 * GdkEventOwnerChange:
 * @type: the type of the event (%GDK_OWNER_CHANGE).
 * @window: the window which received the event
 * @send_event: %TRUE if the event was sent explicitly.
 * @owner: the new owner of the selection, or %NULL if there is none
 * @reason: the reason for the ownership change as a #GdkOwnerChange value
 * @selection: the atom identifying the selection
 * @time: the timestamp of the event
 * @selection_time: the time at which the selection ownership was taken
 *   over
 *
 * Generated when the owner of a selection changes. On X11, this
 * information is only available if the X server supports the XFIXES
 * extension.
 *
 * Since: 2.6
 */
struct _GdkEventOwnerChange
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  GdkWindow *owner;
  GdkOwnerChange reason;
  GdkAtom selection;
  guint32 time;
  guint32 selection_time;
};

/**
 * GdkEventProximity:
 * @type: the type of the event (%GDK_PROXIMITY_IN or %GDK_PROXIMITY_OUT).
 * @window: the window which received the event.
 * @send_event: %TRUE if the event was sent explicitly.
 * @time: the time of the event in milliseconds.
 * @device: the master device that the event originated from. Use
 * gdk_event_get_source_device() to get the slave device.
 *
 * Proximity events are generated when using GDK's wrapper for the
 * XInput extension. The XInput extension is an add-on for standard X
 * that allows you to use nonstandard devices such as graphics tablets.
 * A proximity event indicates that the stylus has moved in or out of
 * contact with the tablet, or perhaps that the user's finger has moved
 * in or out of contact with a touch screen.
 *
 * This event type will be used pretty rarely. It only is important for
 * XInput aware programs that are drawing their own cursor.
 */
struct _GdkEventProximity
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  guint32 time;
  GdkDevice *device;
};

/**
 * GdkEventSetting:
 * @type: the type of the event (%GDK_SETTING).
 * @window: the window which received the event.
 * @send_event: %TRUE if the event was sent explicitly.
 * @action: what happened to the setting (%GDK_SETTING_ACTION_NEW,
 *   %GDK_SETTING_ACTION_CHANGED or %GDK_SETTING_ACTION_DELETED).
 * @name: the name of the setting.
 *
 * Generated when a setting is modified.
 */
struct _GdkEventSetting
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  GdkSettingAction action;
  char *name;
};

/**
 * GdkEventWindowState:
 * @type: the type of the event (%GDK_WINDOW_STATE).
 * @window: the window which received the event.
 * @send_event: %TRUE if the event was sent explicitly.
 * @changed_mask: mask specifying what flags have changed.
 * @new_window_state: the new window state, a combination of
 *   #GdkWindowState bits.
 *
 * Generated when the state of a toplevel window changes.
 */
struct _GdkEventWindowState
{
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  GdkWindowState changed_mask;
  GdkWindowState new_window_state;
};

/**
 * GdkEventGrabBroken:
 * @type: the type of the event (%GDK_GRAB_BROKEN)
 * @window: the window which received the event, i.e. the window
 *   that previously owned the grab
 * @send_event: %TRUE if the event was sent explicitly.
 * @keyboard: %TRUE if a keyboard grab was broken, %FALSE if a pointer
 *   grab was broken
 * @implicit: %TRUE if the broken grab was implicit
 * @grab_window: If this event is caused by another grab in the same
 *   application, @grab_window contains the new grab window. Otherwise
 *   @grab_window is %NULL.
 *
 * Generated when a pointer or keyboard grab is broken. On X11, this happens
 * when the grab window becomes unviewable (i.e. it or one of its ancestors
 * is unmapped), or if the same application grabs the pointer or keyboard
 * again. Note that implicit grabs (which are initiated by button presses)
 * can also cause #GdkEventGrabBroken events.
 *
 * Since: 2.8
 */
struct _GdkEventGrabBroken {
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  gboolean keyboard;
  gboolean implicit;
  GdkWindow *grab_window;
};

/**
 * GdkEventDND:
 * @type: the type of the event (%GDK_DRAG_ENTER, %GDK_DRAG_LEAVE,
 *   %GDK_DRAG_MOTION, %GDK_DRAG_STATUS, %GDK_DROP_START or
 *   %GDK_DROP_FINISHED).
 * @window: the window which received the event.
 * @send_event: %TRUE if the event was sent explicitly.
 * @context: the #GdkDragContext for the current DND operation.
 * @time: the time of the event in milliseconds.
 * @x_root: the x coordinate of the pointer relative to the root of the
 *   screen, only set for %GDK_DRAG_MOTION and %GDK_DROP_START.
 * @y_root: the y coordinate of the pointer relative to the root of the
 *   screen, only set for %GDK_DRAG_MOTION and %GDK_DROP_START.
 *
 * Generated during DND operations.
 */
struct _GdkEventDND {
  GdkEventType type;
  GdkWindow *window;
  gint8 send_event;
  GdkDragContext *context;

  guint32 time;
  gshort x_root, y_root;
};

/**
 * GdkEvent:
 * @type: the #GdkEventType
 * @any: a #GdkEventAny
 * @expose: a #GdkEventExpose
 * @visibility: a #GdkEventVisibility
 * @motion: a #GdkEventMotion
 * @button: a #GdkEventButton
 * @touch: a #GdkEventTouch
 * @scroll: a #GdkEventScroll
 * @key: a #GdkEventKey
 * @crossing: a #GdkEventCrossing
 * @focus_change: a #GdkEventFocus
 * @configure: a #GdkEventConfigure
 * @property: a #GdkEventProperty
 * @selection: a #GdkEventSelection
 * @owner_change: a #GdkEventOwnerChange
 * @proximity: a #GdkEventProximity
 * @dnd: a #GdkEventDND
 * @window_state: a #GdkEventWindowState
 * @setting: a #GdkEventSetting
 * @grab_broken: a #GdkEventGrabBroken
 *
 * A #GdkEvent contains a union of all of the event types,
 * and allows access to the data fields in a number of ways.
 *
 * The event type is always the first field in all of the event types, and
 * can always be accessed with the following code, no matter what type of
 * event it is:
 * |[<!-- language="C" -->
 *   GdkEvent *event;
 *   GdkEventType type;
 *
 *   type = event->type;
 * ]|
 *
 * To access other fields of the event, the pointer to the event
 * can be cast to the appropriate event type, or the union member
 * name can be used. For example if the event type is %GDK_BUTTON_PRESS
 * then the x coordinate of the button press can be accessed with:
 * |[<!-- language="C" -->
 *   GdkEvent *event;
 *   gdouble x;
 *
 *   x = ((GdkEventButton*)event)->x;
 * ]|
 * or:
 * |[<!-- language="C" -->
 *   GdkEvent *event;
 *   gdouble x;
 *
 *   x = event->button.x;
 * ]|
 */
union _GdkEvent
{
  GdkEventType		    type;
  GdkEventAny		    any;
  GdkEventExpose	    expose;
  GdkEventVisibility	    visibility;
  GdkEventMotion	    motion;
  GdkEventButton	    button;
  GdkEventTouch             touch;
  GdkEventScroll            scroll;
  GdkEventKey		    key;
  GdkEventCrossing	    crossing;
  GdkEventFocus		    focus_change;
  GdkEventConfigure	    configure;
  GdkEventProperty	    property;
  GdkEventSelection	    selection;
  GdkEventOwnerChange  	    owner_change;
  GdkEventProximity	    proximity;
  GdkEventDND               dnd;
  GdkEventWindowState       window_state;
  GdkEventSetting           setting;
  GdkEventGrabBroken        grab_broken;
};

GDK_AVAILABLE_IN_ALL
GType     gdk_event_get_type            (void) G_GNUC_CONST;

GDK_AVAILABLE_IN_ALL
gboolean  gdk_events_pending	 	(void);
GDK_AVAILABLE_IN_ALL
GdkEvent* gdk_event_get			(void);

GDK_AVAILABLE_IN_ALL
GdkEvent* gdk_event_peek                (void);
GDK_AVAILABLE_IN_ALL
void      gdk_event_put	 		(const GdkEvent *event);

GDK_AVAILABLE_IN_ALL
GdkEvent* gdk_event_new                 (GdkEventType    type);
GDK_AVAILABLE_IN_ALL
GdkEvent* gdk_event_copy     		(const GdkEvent *event);
GDK_AVAILABLE_IN_ALL
void	  gdk_event_free     		(GdkEvent 	*event);

GDK_AVAILABLE_IN_3_10
GdkWindow *gdk_event_get_window         (const GdkEvent *event);

GDK_AVAILABLE_IN_ALL
guint32   gdk_event_get_time            (const GdkEvent  *event);
GDK_AVAILABLE_IN_ALL
gboolean  gdk_event_get_state           (const GdkEvent  *event,
                                         GdkModifierType *state);
GDK_AVAILABLE_IN_ALL
gboolean  gdk_event_get_coords		(const GdkEvent  *event,
					 gdouble	 *x_win,
					 gdouble	 *y_win);
GDK_AVAILABLE_IN_ALL
gboolean  gdk_event_get_root_coords	(const GdkEvent *event,
					 gdouble	*x_root,
					 gdouble	*y_root);
GDK_AVAILABLE_IN_3_2
gboolean  gdk_event_get_button          (const GdkEvent *event,
                                         guint          *button);
GDK_AVAILABLE_IN_3_2
gboolean  gdk_event_get_click_count     (const GdkEvent *event,
                                         guint          *click_count);
GDK_AVAILABLE_IN_3_2
gboolean  gdk_event_get_keyval          (const GdkEvent *event,
                                         guint          *keyval);
GDK_AVAILABLE_IN_3_2
gboolean  gdk_event_get_keycode         (const GdkEvent *event,
                                         guint16        *keycode);
GDK_AVAILABLE_IN_3_2
gboolean gdk_event_get_scroll_direction (const GdkEvent *event,
                                         GdkScrollDirection *direction);
GDK_AVAILABLE_IN_3_4
gboolean  gdk_event_get_scroll_deltas   (const GdkEvent *event,
                                         gdouble         *delta_x,
                                         gdouble         *delta_y);

GDK_AVAILABLE_IN_ALL
gboolean  gdk_event_get_axis            (const GdkEvent  *event,
                                         GdkAxisUse       axis_use,
                                         gdouble         *value);
GDK_AVAILABLE_IN_ALL
void       gdk_event_set_device         (GdkEvent        *event,
                                         GdkDevice       *device);
GDK_AVAILABLE_IN_ALL
GdkDevice* gdk_event_get_device         (const GdkEvent  *event);
GDK_AVAILABLE_IN_ALL
void       gdk_event_set_source_device  (GdkEvent        *event,
                                         GdkDevice       *device);
GDK_AVAILABLE_IN_ALL
GdkDevice* gdk_event_get_source_device  (const GdkEvent  *event);
GDK_AVAILABLE_IN_ALL
void       gdk_event_request_motions    (const GdkEventMotion *event);
GDK_AVAILABLE_IN_3_4
gboolean   gdk_event_triggers_context_menu (const GdkEvent *event);

GDK_AVAILABLE_IN_ALL
gboolean  gdk_events_get_distance       (GdkEvent        *event1,
                                         GdkEvent        *event2,
                                         gdouble         *distance);
GDK_AVAILABLE_IN_ALL
gboolean  gdk_events_get_angle          (GdkEvent        *event1,
                                         GdkEvent        *event2,
                                         gdouble         *angle);
GDK_AVAILABLE_IN_ALL
gboolean  gdk_events_get_center         (GdkEvent        *event1,
                                         GdkEvent        *event2,
                                         gdouble         *x,
                                         gdouble         *y);

GDK_AVAILABLE_IN_ALL
void	  gdk_event_handler_set 	(GdkEventFunc    func,
					 gpointer        data,
					 GDestroyNotify  notify);

GDK_AVAILABLE_IN_ALL
void       gdk_event_set_screen         (GdkEvent        *event,
                                         GdkScreen       *screen);
GDK_AVAILABLE_IN_ALL
GdkScreen *gdk_event_get_screen         (const GdkEvent  *event);

GDK_AVAILABLE_IN_3_4
GdkEventSequence *gdk_event_get_event_sequence (const GdkEvent *event);

GDK_AVAILABLE_IN_3_10
GdkEventType gdk_event_get_event_type   (const GdkEvent *event);

GDK_AVAILABLE_IN_ALL
void	  gdk_set_show_events		(gboolean	 show_events);
GDK_AVAILABLE_IN_ALL
gboolean  gdk_get_show_events		(void);

#ifndef GDK_MULTIHEAD_SAFE

GDK_AVAILABLE_IN_ALL
gboolean gdk_setting_get                (const gchar    *name,
                                         GValue         *value);

#endif /* GDK_MULTIHEAD_SAFE */

G_END_DECLS

#endif /* __GDK_EVENTS_H__ */


text:
package nl.dykam.dev.spector;

public class SpectorShield {
    private boolean canInteract = false;
    private boolean canChat = true;
    private boolean canPickup = false;
    private boolean canDrop = false;
    private boolean targetable = true;
    private boolean invincible = true;
    private boolean peaceful = true;

    public boolean canInteract() {
        return canInteract;
    }
    public SpectorShield canInteract(boolean canInteract) {
        this.canInteract = canInteract;
        return this;
    }

    public boolean canChat() {
        return canChat;
    }
    public SpectorShield canChat(boolean canChat) {
        this.canChat = canChat;
        return this;
    }

    public boolean canPickup() {
        return canPickup;
    }
    public SpectorShield canPickup(boolean canPickup) {
        this.canPickup = canPickup;
        return this;
    }

    public boolean canDrop() {
        return canDrop;
    }
    public SpectorShield canDrop(boolean canDrop) {
        this.canDrop = canDrop;
        return this;
    }

    public boolean isTargetable() {
        return targetable;
    }
    public SpectorShield setTargetable(boolean canFollow) {
        this.targetable = canFollow;
        return this;
    }

    public boolean isInvincible() {
        return invincible;
    }
    public SpectorShield setInvincible(boolean invincible) {
        this.invincible = invincible;
        return this;
    }

    public boolean isPeaceful() {
        return peaceful;
    }
    public SpectorShield setPeaceful(boolean peaceful) {
        this.peaceful = peaceful;
        return this;
    }

    public static SpectorShield ghost() {
        return ghost(new SpectorShield());
    }

    public static SpectorShield ghost(SpectorShield spectorShield) {
        return spectorShield
                .setInvincible(true)
                .setPeaceful(true)
                .setTargetable(false)
                .canPickup(false)
                .canDrop(false)
                .canInteract(false)
                .canChat(false);
    }

    public static SpectorShield noShield() {
        return noShield(new SpectorShield());
    }

    public static SpectorShield noShield(SpectorShield spectorShield) {
        return spectorShield
                .setInvincible(false)
                .setPeaceful(false)
                .setTargetable(true)
                .canPickup(true)
                .canDrop(true)
                .canInteract(true)
                .canChat(true);
    }
}

redpajama_set_name: RedPajamaGithub


text:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using MvcTemplate.Components.Security;
using MvcTemplate.Services;

namespace MvcTemplate.Controllers
{
    [AllowUnauthorized]
    public class HomeController : ServicedController<IAccountService>
    {
        public HomeController(IAccountService service)
            : base(service)
        {
        }

        [HttpGet]
        public ActionResult Index()
        {
            if (!Service.IsActive(CurrentAccountId))
                return RedirectToAction("Logout", "Auth");

            return View();
        }

        [HttpGet]
        [AllowAnonymous]
        public ViewResult Error()
        {
            return View();
        }

        [HttpGet]
        [AllowAnonymous]
        public new ViewResult NotFound()
        {
            return View();
        }

        [HttpGet]
        public new ActionResult Unauthorized()
        {
            if (!Service.IsActive(CurrentAccountId))
                return RedirectToAction("Logout", "Auth");

            return View();
        }
    }
}


text:
package net.cristcost.study.services;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;

/**
 * The Class TestServiceImpl.
 */
public class AspectSecuredService implements TestService {
  private static final Logger logger = Logger.getLogger(AspectSecuredService.class.getName());

  @Override
  public String getName() {
    return AspectSecuredService.class.getSimpleName();
  }

  @Override
  public String getDescription() {
    return "This Service is secured with a Spring Security pointcut "
        + "and require ADMIN role on each method";
  }

  @Override
  public List<String> serviceFive() {
    logger.info("serviceFive");
    return new CopyOnWriteArrayList<>(Arrays.asList("one", "two", "three"));
  }

  @Override
  public String serviceFour(String input) {
    logger.info("serviceFour: " + input);
    return "ok " + input;
  }

  @Override
  public void serviceOne() {
    logger.info("serviceOne");
  }

  @Override
  public String serviceThree() {
    logger.info("serviceThree");
    return "ok";
  }

  @Override
  public void serviceTwo(String input) {
    logger.info("serviceTwo: " + input);
  }
}


text:
/**
 * The Video Game Object Stopped Event.
 *
 * This event is dispatched when a Video is stopped from playback via a call to the `Video.stop` method,
 * either directly via game code, or indirectly as the result of changing a video source or destroying it.
 *
 * Listen for it from a Video Game Object instance using `Video.on('stop', listener)`.
 *
 * @event Phaser.GameObjects.Events#VIDEO_STOP
 * @since 3.20.0
 *
 * @param {Phaser.GameObjects.Video} video - The Video Game Object which stopped playback.
 */
module.exports = 'stop';


text:
namespace edash_packager {
namespace media {

namespace error {

/// Error codes for the packager APIs.
enum Code {
  // Not an error; returned on success
  OK,

  // Unknown error.  An example of where this error may be returned is
  // errors raised by APIs that do not return enough error information
  // may be converted to this error.
  UNKNOWN,

  // The operation was cancelled (typically by the caller).
  CANCELLED,

  // Client specified an invalid argument. INVALID_ARGUMENT indicates
  // arguments that are problematic regardless of the state of the system
  // (e.g. a malformed file name).
  INVALID_ARGUMENT,

  // Operation is not implemented or not supported/enabled.
  UNIMPLEMENTED,

  // Cannot open file.
  FILE_FAILURE,

  // End of stream.
  END_OF_STREAM,

  // Failure to get HTTP response successfully,
  HTTP_FAILURE,

  // Unable to parse the media file.
  PARSER_FAILURE,

  // Fail to mux the media file.
  MUXER_FAILURE,

  // This track fragment is finalized.
  FRAGMENT_FINALIZED,

  // Server errors. Receives malformed response from server.
  SERVER_ERROR,

  // Internal errors. Some invariants have been broken.
  INTERNAL_ERROR,

  // The operation was stopped.
  STOPPED,

  // The operation timed out.
  TIME_OUT,

  // Value was not found.
  NOT_FOUND,
};

}  // namespace error

class Status {
 public:
  /// Creates a "successful" status.
  Status() : error_code_(error::OK) {}

  /// Create a status with the specified code, and error message.
  /// If "error_code == error::OK", error_message is ignored and a Status
  /// object identical to Status::OK is constructed.
  Status(error::Code error_code, const std::string& error_message)
      : error_code_(error_code) {
    if (!ok())
      error_message_ = error_message;
  }

  ~Status() {}

  /// @name Some pre-defined Status objects.
  /// @{
  static const Status& OK;  // Identical to 0-arg constructor.
  static const Status& UNKNOWN;
  /// @}

  /// Store the specified error in this Status object.
  /// If "error_code == error::OK", error_message is ignored and a Status
  /// object identical to Status::OK is constructed.
  void SetError(error::Code error_code, const std::string& error_message) {
    if (error_code == error::OK) {
      Clear();
    } else {
      error_code_ = error_code;
      error_message_ = error_message;
    }
  }

  /// If "ok()", stores "new_status" into *this.  If "!ok()", preserves
  /// the current "error_code()/error_message()",
  ///
  /// Convenient way of keeping track of the first error encountered.
  /// Instead of:
  ///   if (overall_status.ok()) overall_status = new_status
  /// Use:
  ///   overall_status.Update(new_status);
  void Update(const Status& new_status) {
    if (ok())
      *this = new_status;
  }

  /// Clear this status object to contain the OK code and no error message.
  void Clear() {
    error_code_ = error::OK;
    error_message_ = "";
  }

  bool ok() const { return error_code_ == error::OK; }
  error::Code error_code() const { return error_code_; }
  const std::string& error_message() const { return error_message_; }

  bool operator==(const Status& x) const {
    return error_code_ == x.error_code() && error_message_ == x.error_message();
  }
  bool operator!=(const Status& x) const { return !(*this == x); }

  /// @return true iff this has the same error_code as "x", i.e., the two
  ///         Status objects are identical except possibly for the error
  ///         message.
  bool Matches(const Status& x) const { return error_code_ == x.error_code(); }

  /// @return A combination of the error code name and message.
  std::string ToString() const;

  void Swap(Status* other) {
    error::Code error_code = error_code_;
    error_code_ = other->error_code_;
    other->error_code_ = error_code;
    error_message_.swap(other->error_message_);
  }

 private:
  error::Code error_code_;
  std::string error_message_;

  // Not using DISALLOW_COPY_AND_ASSIGN here intentionally to allow the compiler
  // generated copy constructor and assignment operator.
};

extern std::ostream& operator<<(std::ostream& os, const Status& x);

}  // namespace media
}  // namespace edash_packager

#endif  // MEDIA_BASE_STATUS_H_


text:
package za.redbridge.simulator;

import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;

import org.encog.neural.hyperneat.substrate.Substrate;
import za.redbridge.simulator.ScoreCalculator;
import org.encog.neural.neat.NEATPopulation; //importing the neat population
import za.redbridge.simulator.config.MorphologyConfig;
import org.encog.neural.neat.NEATNetwork;
//import org.encog.neural.hyperneat.substrate.SubstrateFactory;
import org.encog.ml.ea.train.basic.TrainEA;
import za.redbridge.simulator.StatsRecorder;
import za.redbridge.simulator.Morphology;
import za.redbridge.simulator.config.SimConfig;
import za.redbridge.simulator.NEATUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.text.ParseException;
import org.encog.neural.neat.training.species.OriginalNEATSpeciation;

import za.redbridge.simulator.phenotype.ChasingPhenotype;

import org.encog.ml.train.strategy.Strategy;
import java.util.List;

import static za.redbridge.simulator.Utils.isBlank;
import static za.redbridge.simulator.Utils.readObjectFromFile;

import za.redbridge.simulator.Archive;

import za.redbridge.simulator.Utils;

public class Main {

	private final static Logger log = LoggerFactory.getLogger(Main.class);
	private final static double convergenceScore = 1000;

	private final static boolean PerformingObjectiveSearch = true;
	private final static boolean PerformingNoveltySearch = false;
	private final static boolean PerformingHybridSearch = false;

	private static int numInputs;
	private int numOutputs = 2;
	private int populationSize;
	private int simulationRuns;
	private int numIterations;
	private int threadCount;

	private static Archive archive;

	private static int schemaConfigIndex; //the schema against which the construction zone should be checked

	private static String resConfig;

	private static double envHeight;
	private static double envWidth;

	public static void main(String args[]) throws IOException, ParseException{

		for(int k = 0; k < 3; k++) { //PERFORMING OBJECTIVE SEARCH

			Args options = new Args();
			new JCommander(options, args);

			log.info(options.toString());
			int ind = k+1;

			double connectionDensity = 0.5;
			//fetching the correct simConfig for each experiment
			String simConfigFP = "configs/simConfig" + Integer.toString(ind) + ".yml";
			//String experimentConfigFP = "configs/experimentConfig.yml";
			String morphologyConfigFP = "configs/morphologyConfig.yml";
			String folderDir = "/ObjectiveResults/Schema_" + Integer.toString(ind) + "/FirstRun/";
			Utils.setDirectoryName(folderDir);

			MorphologyConfig morphologyConfig = new MorphologyConfig(morphologyConfigFP);
			Morphology morphology = morphologyConfig.getMorphology(1);
			numInputs = morphology.getNumSensors();

			SimConfig simConfig = new SimConfig(simConfigFP);
			// if( !isBlank(options.configFile) ) {
			// 	simConfig = new SimConfig(options.configFile);
			// }
			// else {
			// 	simConfig = new SimConfig();
			// }

			resConfig = options.environment;

			envWidth = simConfig.getEnvironmentWidth();
			envHeight = simConfig.getEnvironmentHeight();

			schemaConfigIndex = simConfig.getConfigNumber();
			ScoreCalculator scoreCalculator = new ScoreCalculator(simConfig, options.simulationRuns,
							morphology, options.populationSize, schemaConfigIndex, envHeight, envWidth); //got this from the Main class in last years Controller Master folder

			if (!isBlank(options.genomePath)) {
	            NEATNetwork network = (NEATNetwork) readObjectFromFile(options.genomePath);
	            scoreCalculator.demo(network);
	            return;
	        }

			//defines the structure of the produced HyperNEAT network
			Substrate substrate = SubstrateFactory.createSubstrate(numInputs,2);

			//initialising the population
			NEATPopulation population = new NEATPopulation(substrate, options.populationSize);

			population.setInitialConnectionDensity(options.connectionDensity); //set the density based on a value that gets passed through using that Args options nested class thing in Main.java
			population.setActivationCycles(4); //THIS COULD BE IMPORTANT (FROM ONLINE EXAMPLE)
			population.reset();

			TrainEA trainer = NEATUtil.constructNEATTrainer(population, scoreCalculator);
			trainer.setThreadCount(0);

			final StatsRecorder statsRecorder = new StatsRecorder(trainer, scoreCalculator); //this is basically where the simulation runs
			//scoreCalculator.demo(trainer.getCODEC().decode(trainer.getBestGenome()));

			for(int i = 0; i < options.numGenerations; i++) { //for(int i = trainer.getIteration(); i < numIterations; i++)
				trainer.iteration(); //training the network for a single iteration
				statsRecorder.recordIterationStats();

				//once an individual has found an optimal solution, break out of the training loop
				if(trainer.getBestGenome().getScore() >= convergenceScore) {
					log.info("convergence reached at epoch(iteration): " + trainer.getIteration());
					break;
				}
			}

			//scoreCalculator.demo(trainer.getCODEC().decode(trainer.getBestGenome()));
			log.debug("Training Complete");

		}

		if(PerformingNoveltySearch) {

			NoveltyTrainEA trainer = NEATUtil.constructNoveltyTrainer(population, scoreCalculator);
			trainer.addStrategy(new NoveltySearchStrategy(options.populationSize, scoreCalculator));
			trainer.setThreadCount(0);

			scoreCalculator.setPerformNovelty(true);

			final StatsRecorder statsRecorder = new StatsRecorder(trainer, scoreCalculator); //this is basically where the simulation runs
			//scoreCalculator.demo(trainer.getCODEC().decode(trainer.getBestGenome()));

			for(int i = 0; i < options.numGenerations; i++) { //for(int i = trainer.getIteration(); i < numIterations; i++)
				trainer.iteration(); //training the network for a single iteration
				statsRecorder.recordIterationStats();

				//once an individual has found an optimal solution, break out of the training loop
				if(trainer.getBestGenome().getScore() >= convergenceScore) {
					log.info("convergence reached at epoch(iteration): " + trainer.getIteration());
					break;
				}
			}

			scoreCalculator.demo(trainer.getCODEC().decode(trainer.getBestGenome()));
			log.debug("Training Complete");
		}
		else {

			TrainEA trainer = NEATUtil.constructNEATTrainer(population, scoreCalculator);
			trainer.setThreadCount(0);

			final StatsRecorder statsRecorder = new StatsRecorder(trainer, scoreCalculator); //this is basically where the simulation runs
			//scoreCalculator.demo(trainer.getCODEC().decode(trainer.getBestGenome()));

			for(int i = 0; i < options.numGenerations; i++) { //for(int i = trainer.getIteration(); i < numIterations; i++)
				trainer.iteration(); //training the network for a single iteration
				statsRecorder.recordIterationStats();

				//once an individual has found an optimal solution, break out of the training loop
				if(trainer.getBestGenome().getScore() >= convergenceScore) {
					log.info("convergence reached at epoch(iteration): " + trainer.getIteration());
					break;
				}
			}

			//scoreCalculator.demo(trainer.getCODEC().decode(trainer.getBestGenome()));
			log.debug("Training Complete");
		}
	}

	private static class Args {
        @Parameter(names = "-c", description = "Simulation config file to load")
        private String configFile = "configs/simConfig.yml";

        @Parameter(names = "-i", description = "Number of generations to train for")
        private int numGenerations = 2;

        @Parameter(names = "-p", description = "Initial population size")
        private int populationSize = 3;

        @Parameter(names = "--sim-runs", description = "Number of simulation runs per iteration")
        private int simulationRuns = 2;

        @Parameter(names = "--conn-density", description = "Adjust the initial connection density"
                + " for the population")
        private double connectionDensity = 0.5;
        @Parameter(names = "--demo", description = "Show a GUI demo of a given genome")
        private String genomePath = null;
        //private String genomePath = "results/Hex-20160920T2134_null__NEAT/best networks/epoch-5/network.ser";
        //private String genomePath = "results/ruben-GE72-2QD-20161030T1126_null/best networks/epoch-1/network.ser";
        //private String genomePath = "results/ruben-GE72-2QD-20161102T1342_null/best networks/epoch-1/network.ser";

        @Parameter(names = "--control", description = "Run with the control case")
        private boolean control = false;

        @Parameter(names = "--advanced", description = "Run with advanced envrionment and morphology")
        private boolean advanced = true;

        @Parameter(names = "--environment", description = "Run with advanced envrionment and morphology")
        private String environment = "";

        @Parameter(names = "--morphology", description = "For use with the control case, provide"
                + " the path to a serialized MMNEATNetwork to have its morphology used for the"
                + " control case")
        private String morphologyPath = null;

        @Parameter(names = "--population", description = "To resume a previous controller, provide"
                + " the path to a serialized population")
        private String populationPath = null;

        @Override
        public String toString() {
            return "Options: \n"
                    + "\tConfig file path: " + configFile + "\n"
                    + "\tNumber of generations: " + numGenerations + "\n"
                    + "\tPopulation size: " + populationSize + "\n"
                    + "\tNumber of simulation tests per iteration: " + simulationRuns + "\n"
                    + "\tInitial connection density: " + connectionDensity + "\n"
                    + "\tDemo network config path: " + genomePath + "\n"
                    + "\tRunning with the control case: " + control + "\n"
                    + "\tMorphology path: " + morphologyPath + "\n"
                    + "\tPopulation path: " + populationPath;
        }
    }

}


text:
package com.example.zlx.zlxbase.util;/**
 * Created by Zlx on 2017/2/14.
 */

import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.view.View;
import android.view.animation.BounceInterpolator;

/**
 * Created by Zlx on 2017/2/14.
 */
public class AnimUtil {
    /**
     * 闪光
     *
     * @param view
     */
    public static void AnimFlash(View view) {
        ObjectAnimator.ofFloat(view, "alpha", 1, 0, 1, 0, 1).setDuration(1000).start();
    }

    /**
     * 脉冲
     *
     * @param view
     */
    public static void AnimPulse(View view) {
        ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1, 1.2f, 1);
        ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1, 1.2f, 1);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(scaleX, scaleY);
        animatorSet.start();
    }

    /**
     * 摇
     *
     * @param view
     */
    public static void AnimShake(View view) {
        ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "translationX", 0, 25, -25, 25, -25, 15, -15, 6, -6, 0);
        scaleX.setDuration(1000);
        scaleX.start();
    }

    /**
     * 摆动
     *
     * @param view
     */
    public static void AnimSwing(View view) {
        ObjectAnimator.ofFloat(view, "rotation", 0, 10, -10, 6, -6, 3, -3, 0).setDuration(1000).start();
    }

    /**
     * 晃动
     *
     * @param view
     */
    public static void AnimWobble(View view) {
        float width = view.getWidth();
        float one = (float) (width / 100.0);
        ObjectAnimator translationX = ObjectAnimator.ofFloat(view, "translationX", 0 * one, -25 * one, 20 * one, -15 * one, 10 * one, -5 * one, 0 * one, 0);
        ObjectAnimator rotation = ObjectAnimator.ofFloat(view, "rotation", 0, -5, 3, -3, 2, -1, 0);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(translationX, rotation);
        animatorSet.start();
    }

    /**
     * 反弹
     *
     * @param view
     */
    public static void AnimBounce(View view) {
        ObjectAnimator.ofFloat(view, "translationY", 0, 0, -30, 0, -15, 0, 0).setDuration(1000).start();
    }

    /**
     * 出炉了
     *
     * @param view
     */
    public static void AnimTada(View view) {
        ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1, 0.9f, 0.9f, 1.1f, 1.1f, 1.1f, 1.1f, 1.1f, 1.1f, 1);
        ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1, 0.9f, 0.9f, 1.1f, 1.1f, 1.1f, 1.1f, 1.1f, 1.1f, 1);
        ObjectAnimator rotation = ObjectAnimator.ofFloat(view, "rotation", 0, -3, -3, 3, -3, 3, -3, 3, -3, 0);
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(scaleX, scaleY, rotation);
        animatorSet.start();
    }

    /**
     * 站立
     *
     * @param target
     */
    public static void AnimStandUp(View target) {
        float x = (target.getWidth() - target.getPaddingLeft() - target.getPaddingRight()) / 2
                + target.getPaddingLeft();
        float y = target.getHeight() - target.getPaddingBottom();

        ObjectAnimator pivotX = ObjectAnimator.ofFloat(target, "pivotX", x, x, x, x, x);
        ObjectAnimator pivotY = ObjectAnimator.ofFloat(target, "pivotY", y, y, y, y, y);
        ObjectAnimator rotationX = ObjectAnimator.ofFloat(target, "rotationX", 55, -30, 15, -15, 0);
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(pivotX, pivotY, rotationX);
        animatorSet.start();
    }

    /**
     * 波
     *
     * @param target
     */
    public static void AnimWave(View target) {
        float x = (target.getWidth() - target.getPaddingLeft() - target.getPaddingRight()) / 2
                + target.getPaddingLeft();
        float y = target.getHeight() - target.getPaddingBottom();
        ObjectAnimator rotation = ObjectAnimator.ofFloat(target, "rotation", 12, -12, 3, -3, 0);
        ObjectAnimator pivotX = ObjectAnimator.ofFloat(target, "pivotX", x, x, x, x, x);
        ObjectAnimator pivotY = ObjectAnimator.ofFloat(target, "pivotY", y, y, y, y, y);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(pivotX, pivotY, rotation);
        animatorSet.start();
    }

    /**
     * 滚进
     *
     * @param target
     */
    public static void AnimRollIn(View target) {
        ObjectAnimator alpha = ObjectAnimator.ofFloat(target, "alpha", 0, 1);
        ObjectAnimator translationX = ObjectAnimator.ofFloat(target, "translationX",
                -(target.getWidth() - target.getPaddingLeft() - target.getPaddingRight()), 0);
        ObjectAnimator rotation = ObjectAnimator.ofFloat(target, "rotation", -120, 0);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(alpha, translationX, rotation);
        animatorSet.start();
    }

    /**
     * 滚出
     *
     * @param target
     */
    public static void AnimRollOut(View target) {
        ObjectAnimator alpha = ObjectAnimator.ofFloat(target, "alpha", 1, 0);
        ObjectAnimator translationX = ObjectAnimator.ofFloat(target, "translationX", 0, target.getWidth());
        ObjectAnimator rotation = ObjectAnimator.ofFloat(target, "rotation", 0, 120);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(alpha, translationX, rotation);
        animatorSet.start();
    }

    /**
     * 登陆
     *
     * @param target
     */
    public static void AnimLandIn(View target) {
        ObjectAnimator scaleX = ObjectAnimator.ofFloat(target, "scaleX", 1.5f, 1f);
        ObjectAnimator scaleY = ObjectAnimator.ofFloat(target, "scaleY", 1.5f, 1f);
        ObjectAnimator alpha = ObjectAnimator.ofFloat(target, "alpha", 0, 1f);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(alpha, scaleX, scaleY);
        animatorSet.start();
    }

    /**
     * 起飞
     *
     * @param target
     */
    public static void AnimTakingOff(View target) {
        ObjectAnimator scaleX = ObjectAnimator.ofFloat(target, "scaleX", 1f, 1.5f);
        ObjectAnimator scaleY = ObjectAnimator.ofFloat(target, "scaleY", 1f, 1.5f);
        ObjectAnimator alpha = ObjectAnimator.ofFloat(target, "alpha", 1, 0);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(alpha, scaleX, scaleY);
        animatorSet.start();
    }

    /**
     * 掉落
     *
     * @param target
     */
    public static void AnimDropIn(View target) {
        int distance = target.getTop() + target.getHeight();
        ValueAnimator translationY = ObjectAnimator.ofFloat(target, "translationY", -distance, 0);
        translationY.setDuration(1000);
        translationY.setInterpolator(new BounceInterpolator());
        translationY.start();
    }

    /**
     * 掉出
     *
     * @param target
     */
    public static void AnimDropOut(View target) {
        int distance = target.getTop() + target.getHeight();
        ValueAnimator translationY = ObjectAnimator.ofFloat(target, "translationY", 0, distance);
        translationY.setDuration(1000);
        translationY.start();
    }

    /**
     * 弹进
     *
     * @param target
     */
    public static void AnimBounceIn(View target) {
        ObjectAnimator alpha = ObjectAnimator.ofFloat(target, "alpha", 0, 1, 1, 1);
        ObjectAnimator scaleX = ObjectAnimator.ofFloat(target, "scaleX", 0.3f, 1.05f, 0.9f, 1);
        ObjectAnimator scaleY = ObjectAnimator.ofFloat(target, "scaleY", 0.3f, 1.05f, 0.9f, 1);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(alpha, scaleX, scaleY);
        animatorSet.start();
    }

    /**
     * 从上弹进
     *
     * @param target
     */
    public static void AnimBounceInUp(View target) {
        ObjectAnimator alpha = ObjectAnimator.ofFloat(target, "alpha", 0, 1, 1, 1);
        ObjectAnimator translationY = ObjectAnimator.ofFloat(target, "translationY", -target.getHeight(), 30, -10, 0);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(alpha, translationY);
        animatorSet.start();
    }

    /**
     * 从左弹进
     *
     * @param target
     */
    public static void AnimBounceInLeft(View target) {
        ObjectAnimator translationX = ObjectAnimator.ofFloat(target, "translationX", -target.getWidth(), 30, -10, 0);
        ObjectAnimator alpha = ObjectAnimator.ofFloat(target, "alpha", 0, 1, 1, 1);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(alpha, translationX);
        animatorSet.start();
    }

    /**
     * 从右弹进
     *
     * @param target
     */
    public static void AnimBounceInRight(View target) {
        ObjectAnimator translationX = ObjectAnimator.ofFloat(target, "translationX", target.getMeasuredWidth() + target.getWidth(), -30, 10, 0);
        ObjectAnimator alpha = ObjectAnimator.ofFloat(target, "alpha", 0, 1, 1, 1);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(alpha, translationX);
        animatorSet.start();
    }

    /**
     * 从下弹进
     *
     * @param target
     */
    public static void AnimBounceInDown(View target) {
        ObjectAnimator translationY = ObjectAnimator.ofFloat(target, "translationY", target.getMeasuredHeight(), -30, 10, 0);
        ObjectAnimator alpha = ObjectAnimator.ofFloat(target, "alpha", 0, 1, 1, 1);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(alpha, translationY);
        animatorSet.start();
    }

    /**
     * 渐显
     *
     * @param target
     */
    public static void AnimFadeIn(View target) {
        ObjectAnimator alpha = ObjectAnimator.ofFloat(target, "alpha", 0, 1);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(alpha);
        animatorSet.start();
    }

    /**
     * 从上往下渐显
     *
     * @param target
     */
    public static void AnimFadeInUp(View target) {
        ObjectAnimator alpha = ObjectAnimator.ofFloat(target, "alpha", 0, 1);
        ObjectAnimator translationY = ObjectAnimator.ofFloat(target, "translationY", -target.getHeight() / 4, 0);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(alpha, translationY);
        animatorSet.start();
    }

    /**
     * 从下往上渐显
     *
     * @param target
     */
    public static void AnimFadeInDown(View target) {
        ObjectAnimator alpha = ObjectAnimator.ofFloat(target, "alpha", 0, 1);
        ObjectAnimator translationY = ObjectAnimator.ofFloat(target, "translationY", target.getHeight() / 4, 0);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(alpha, translationY);
        animatorSet.start();
    }

    /**
     * 轻弹
     *
     * @param target
     */
    public static void AnimFlipInX(View target) {
        ObjectAnimator rotationX = ObjectAnimator.ofFloat(target, "rotationX", 90, -15, 15, 0);
        ObjectAnimator alpha = ObjectAnimator.ofFloat(target, "alpha", 0.25f, 0.5f, 0.75f, 1);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(alpha, rotationX);
        animatorSet.start();
    }
    public static void AnimFlipOutX(View target) {
        ObjectAnimator rotationX = ObjectAnimator.ofFloat(target, "rotationX", 0, 90);
        ObjectAnimator alpha = ObjectAnimator.    ofFloat(target, "alpha", 1, 0);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(alpha, rotationX);
        animatorSet.start();
    }
    public static void AnimFlipOutY(View target) {
        ObjectAnimator rotationX = ObjectAnimator.ofFloat(target, "rotationY", 0, 90);
        ObjectAnimator alpha = ObjectAnimator.    ofFloat(target, "alpha", 1, 0);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000).playTogether(alpha, rotationX);
        animatorSet.start();
    }
}


text:
'''
Copyright 2015 by Tobias Houska
This file is part of Statistical Parameter Estimation Tool (SPOTPY).

:author: Tobias Houska

This class holds the example code from the ackley tutorial web-documention.
'''
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import spotpy
from spotpy.examples.spot_setup_ackley import spot_setup

#Create samplers for every algorithm:
results=[]
spot_setup=spot_setup()
rep=5000

sampler=spotpy.algorithms.mc(spot_setup,    dbname='ackleyMC',    dbformat='csv')
sampler.sample(rep)
results.append(sampler.getdata())
#
sampler=spotpy.algorithms.lhs(spot_setup,   dbname='ackleyLHS',   dbformat='csv')
sampler.sample(rep)
results.append(sampler.getdata())

sampler=spotpy.algorithms.mle(spot_setup,   dbname='ackleyMLE',   dbformat='csv')
sampler.sample(rep)
results.append(sampler.getdata())

sampler=spotpy.algorithms.mcmc(spot_setup,  dbname='ackleyMCMC',  dbformat='csv')
sampler.sample(rep)
results.append(sampler.getdata())

sampler=spotpy.algorithms.sceua(spot_setup, dbname='ackleySCEUA', dbformat='csv')
sampler.sample(rep,ngs=2)
results.append(sampler.getdata())

sampler=spotpy.algorithms.sa(spot_setup,    dbname='ackleySA',    dbformat='csv')
sampler.sample(rep)
results.append(sampler.getdata())

sampler=spotpy.algorithms.demcz(spot_setup, dbname='ackleyDEMCz', dbformat='csv')
sampler.sample(rep,nChains=30)
results.append(sampler.getdata())
#
sampler=spotpy.algorithms.rope(spot_setup,  dbname='ackleyROPE',  dbformat='csv')
sampler.sample(rep)
results.append(sampler.getdata())

algorithms=['MC','LHS','MLE','MCMC','SCEUA','SA','DEMCz','ROPE']
results=[]
for algorithm in algorithms:
    results.append(spotpy.analyser.load_csv_results('ackley'+algorithm))

evaluation = spot_setup.evaluation()

spotpy.analyser.plot_objectivefunctiontraces(results,evaluation,algorithms)


text:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
<title>at.irian.ankor.switching (Ankor - Project 0.4-SNAPSHOT API)</title>
<meta name="date" content="2014-09-25">
<link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">

JavaScript is disabled on your browser.

Overview

Package

Class

Use

Tree

Deprecated

Index

Help

Prev Package

Next Package

Frames

No Frames

All Classes

Package at.irian.ankor.switching

Message routing and connection handling.

See: Description

Interface Summary

Interface
Description

Switchboard

The Switchboard is the central point for connecting shared models and handling the message sending
 between connected models.

SwitchboardFactory

SwitchboardImplementor

Class Summary

Class
Description

AbstractSwitchboard

AkkaAddressBoundSwitchboard

AkkaAddressBoundSwitchboardActor

AkkaAddressBoundSwitchboardActor.CloseFromMsg

AkkaAddressBoundSwitchboardActor.CloseToMsg

AkkaAddressBoundSwitchboardActor.OpenMsg

AkkaAddressBoundSwitchboardActor.SendFromMsg

AkkaAddressBoundSwitchboardActor.SendToMsg

AkkaConsistentHashingSwitchboard

AkkaConsistentHashingSwitchboardActor

AkkaConsistentHashingSwitchboardActor.CloseFromMsg

AkkaConsistentHashingSwitchboardActor.CloseToMsg

AkkaConsistentHashingSwitchboardActor.OpenMsg

AkkaConsistentHashingSwitchboardActor.SendFromMsg

AkkaConsistentHashingSwitchboardActor.SendToMsg

AkkaConsistentHashingSwitchboardActor.StartMsg

AkkaConsistentHashingSwitchboardActor.StopMsg

DefaultSwitchboard

Package at.irian.ankor.switching Description

Message routing and connection handling.

Overview

Package

Class

Use

Tree

Deprecated

Index

Help

Prev Package

Next Package

Frames

No Frames

All Classes

Copyright © 2014 Ankor Developers Team. All rights reserved.


text:
package me.imli.swipelayout;

import me.imli.swipelayout.sb.SwipeBackLayout;
import me.imli.swipelayout.sb.SwipeBackLayout.OnSwipeBackListener;
import me.imli.swipelayout.sb.SwipeLayout;
import android.app.Activity;
import android.os.Bundle;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;

public class SwipeBackActivity extends Activity{

	SwipeBackLayout sb;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_swipe_back);

		sb = (SwipeBackLayout) findViewById(R.id.pl);
		sb.setOnSwipeBackListener(new OnSwipeBackListener() {

			@Override
			public void onBack() {
				finish();
			}
		});

		RadioGroup group = (RadioGroup) findViewById(R.id.rg);
		for (int i = 0; i < group.getChildCount(); i++) {
			RadioButton btn = (RadioButton) group.getChildAt(i);
			btn.setId(i+1);
		}
		group.setOnCheckedChangeListener(new OnCheckedChangeListener() {

			@Override
			public void onCheckedChanged(RadioGroup group, int checkedId) {

				switch (checkedId) {
				case 1:
					sb.setDirection(SwipeLayout.DIRECTION_LEFT);
					break;
				case 2:
					sb.setDirection(SwipeLayout.DIRECTION_TOP);
					break;
				case 3:
					sb.setDirection(SwipeLayout.DIRECTION_RIGHT);
					break;
				case 4:
					sb.setDirection(SwipeLayout.DIRECTION_BUTTOM);
					break;
				case 5:
					sb.setDirection(SwipeLayout.DIRECTION_LEFT | SwipeLayout.DIRECTION_RIGHT);
					break;
				case 6:
					sb.setDirection(SwipeLayout.DIRECTION_TOP | SwipeLayout.DIRECTION_BUTTOM);
					break;

				default:
					break;
				}
			}
		});
	}

}


text:
/**
 * Configurations
 */
var config = {
    logging : true,
    baseURL : location.protocol + "//" + location.hostname + "/admin"
};

/**
 * Bootstrap IE10 viewport bug workaround
 */
if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
    var msViewportStyle = document.createElement('style')
    msViewportStyle.appendChild(
        document.createTextNode(
            '@-ms-viewport{width:auto!important}'
        )
    )
    document.querySelector('head').appendChild(msViewportStyle)
}

/**
 * Global core functions
 */
$(document).ready(function() {

});


text:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AtomicArcade.ViewLogic.Shared.TimeZoneHelper
{
    public interface ITimeZoneHelper
    {
        DateTime GetUTCDateTime(DateTime dateToConvert, TimeZoneInfo timeZone);
    }
}


text:
import logging

_log = logging.getLogger(__name__)

def logging_exceptions(logger):
    def decorator(fn):
        def wrapped(*args, **kwargs):
            try:
                return fn(*args, **kwargs)
            except:
                logger.exception("Exception in function %s")
                raise
        return wrapped
    return decorator


text:
package org.springframework.data.neo4j;

import org.springframework.data.neo4j.annotation.NodeEntity;

/**
 * @author mh
 * @since 20.01.11
 */
@NodeEntity
public class Named {
    public String name;

    public String getName() {
        return name;
    }
}


text:
var Container = require('react-container');
var React = require('react');
var Tappable = require('react-tappable');
var Timers = require('react-timers');
var { Link, UI } = require('touchstonejs');

module.exports = React.createClass({
	mixins: [Timers()],
	statics: {
		navigationBar: 'main',
		getNavigation () {
			return {
				title: 'Controls'
			}
		}
	},
	getInitialState () {
		return {
			alertbar: {
				visible: false,
				type: '',
				text: ''
			},
			popup: {
				visible: false
			}
		}
	},
	showLoadingPopup () {
		this.setState({
			popup: {
				visible: true,
				loading: true,
				header: 'Loading',
				iconName: 'ion-load-c',
				iconType: 'default'
			}
		});

		var self = this;

		this.setTimeout(function () {
			self.setState({
				popup: {
					visible: true,
					loading: false,
					header: 'Done!',
					iconName: 'ion-ios-checkmark',
					iconType: 'success'
				}
			});
		}, 2000);

		this.setTimeout(function () {
			self.setState({
				popup: {
					visible: false
				}
			});
		}, 3000);
	},
	showAlertbar (type, text) {
		var self = this;

		this.setState({
			alertbar: {
				visible: true,
				type: type,
				text: text
			}
		});

		this.setTimeout(function () {
			self.setState({
				alertbar: {
					visible: false
				}
			});
		}, 2000);
	},
	handleModeChange (newMode) {
		var selectedItem = newMode;

		if (this.state.selectedMode === newMode) {
			selectedItem = null;
		}

		this.setState({
			selectedMode: selectedItem
		});

	},
	render () {
		var { alertbar } = this.state;
		return (
			<Container scrollable>
				<UI.Alertbar type={alertbar.type} visible={alertbar.visible}>{alertbar.text}</UI.Alertbar>
				<UI.GroupHeader>Segmented Control</UI.GroupHeader>
				<UI.SegmentedControl value={this.state.selectedMode} onChange={this.handleModeChange} hasGutter options={[
					{ label: 'One', value: 'one' },
					{ label: 'Two', value: 'two' },
					{ label: 'Three', value: 'three' },
					{ label: 'Four', value: 'four' }
				]} />

				<UI.GroupHeader>Alert Bar</UI.GroupHeader>
				<UI.ButtonGroup>
					<UI.Button type="primary" onTap={this.showAlertbar.bind(this, 'danger', 'No Internet Connection')} disabled={this.state.alertbar.visible}>
						Danger
					</UI.Button>
					<UI.Button type="primary" onTap={this.showAlertbar.bind(this, 'warning', 'Connecting...')} disabled={this.state.alertbar.visible}>
						Warning
					</UI.Button>
					<UI.Button type="primary" onTap={this.showAlertbar.bind(this, 'success', 'Connected')} disabled={this.state.alertbar.visible}>
						Success
					</UI.Button>
				</UI.ButtonGroup>
				<UI.GroupHeader>Popup</UI.GroupHeader>
				<UI.Button type="primary" onTap={this.showLoadingPopup} disabled={this.state.popup.visible}>
					Show Popup
				</UI.Button>
				<UI.GroupHeader>Application State</UI.GroupHeader>
				<UI.Group>
					<Link linkTo="tabs:non-existent" transition="show-from-right">
						<UI.Item showDisclosureArrow>
							<UI.ItemInner>Invalid View</UI.ItemInner>
						</UI.Item>
					</Link>
				</UI.Group>

				<UI.Popup visible={this.state.popup.visible}>
					<UI.PopupIcon name={this.state.popup.iconName} type={this.state.popup.iconType} spinning={this.state.popup.loading} />

{this.state.popup.header}

				</UI.Popup>
			</Container>
		);
	}
});


text:
'use strict';

var module = angular.module('trackit.cloudmover', [])

module.controller('ToggleCloudmoverCtrl', ['$scope', '$cookies', '$state',
    function($scope, $cookies, $state) {

        if ($cookies.get('cloudmover')) {
            $cookies.remove('cloudmover');
        } else {
            $cookies.put('cloudmover', 'true');
        }

        $state.go('app.home');

    }
]);


text:
<?php

declare(strict_types=1);

namespace Doctrine\Tests\Models\GH7316;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;

class GH7316Article
{
    /** @psalm-var Collection<int, mixed> */
    private $tags;

    public function __construct()
    {
        $this->tags = new ArrayCollection();
    }
}


text:
using System.Collections.Generic;

namespace AwfulRedux.UI.Models.Posts
{
    public class PostElements
    {
        public string InnerText { get; set; }

        public List<string> ImageUrls { get; set; }
    }
}


text:
class CompatTests : public QObject
{
    Q_OBJECT

private Q_SLOTS:
    void bswapTests();
};

#endif // BITCOIN_QT_TEST_COMPATTESTS_H


text:
var mongoose = require('mongoose');
var Schema   = mongoose.Schema;

var CheckEvent = new Schema({
  timestamp   : { type: Date, default: Date.now },
  check       : { type: Schema.ObjectId, ref: 'Check' },
  tags        : [String],
  message     : String, // possible values are 'down', 'up', 'paused', 'restarted'
  details     : String,
  // for error events, more details need to be persisted
  downtime    : Number,
  owner: { type: Schema.ObjectId, ref: 'Account' }
});
CheckEvent.index({ check: 1, timestamp: -1 });
CheckEvent.plugin(require('mongoose-lifecycle'));

CheckEvent.methods.findCheck = function(callback) {
  return this.db.model('Check').findById(this.check, callback);
};

CheckEvent.statics.aggregateEventsByDay = function(events, callback) {
  // list checks concerned by all events
  var checkIds = [];
  events.forEach(function(event) {
    var check = event.check.toString();
    if (checkIds.indexOf(check) == -1) checkIds.push(check);
  });
  this.db.model('Check').find({ _id: { $in: checkIds } }).select({ _id: 1, name: 1, url: 1 }).exec(function(err, checks) {
    // populate related check for each event
    if (err) return callback(err);
    var indexedChecks = {};
    checks.forEach(function(check) {
      indexedChecks[check._id] = check;
    });
    events.forEach(function(event, index) {
      event = event.toJSON(); // bypass mongoose's magic setters
      event.check = indexedChecks[event.check];
      delete event.__v;
      delete event._id;
      if (event.message == 'up') {
        delete event.details;
      }
      events[index] = event;
    });

    // aggregate events by day
    var currentDay;
    var aggregatedEvents = {};
    var currentAggregate = [];
    events.forEach(function(event) {
      var date = new Date(event.timestamp).toLocaleDateString();
      if (date != currentDay) {
        currentDay = date;
        currentAggregate = aggregatedEvents[date] = [];
      }
      currentAggregate.push(event);
    });
    callback(null, aggregatedEvents);
  });
};

CheckEvent.statics.cleanup = function(maxAge, callback) {
  var oldestDateToKeep = new Date(Date.now() - (maxAge ||  3 * 31 * 24 * 60 * 60 * 1000));
  this.find({ timestamp: { $lt: oldestDateToKeep } }).remove(callback);
};

module.exports = mongoose.model('CheckEvent', CheckEvent);


text:
package org.dcm4chex.archive.config;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Iterator;
import java.util.Map;
import java.util.StringTokenizer;

import org.dcm4cheri.util.StringUtils;

/**
 * @author gunter.zeilinter@tiani.com
 * @version $Revision: 2010 $ $Date: 2005-10-07 03:55:27 +0800 (周五, 07 10月 2005) $
 * @since 15.05.2004
 *
 */
public class ForwardingRules {

private static final long MS_PER_HOUR = 3600000L;
    static final String NONE = "NONE";

    static final String[] EMPTY = {};

    private final ArrayList list = new ArrayList();

    public static final class Entry {

        final Condition condition;

        final String[] forwardAETs;

        Entry(Condition condition, String[] forwardAETs) {
            this.condition = condition;
            this.forwardAETs = forwardAETs;
        }
    }

    public ForwardingRules(String s) {
        StringTokenizer stk = new StringTokenizer(s, "\r\n;");
        while (stk.hasMoreTokens()) {
            String tk = stk.nextToken().trim();
            if (tk.length() == 0) continue;
            try {
                int endCond = tk.indexOf(']') + 1;
                Condition cond = new Condition(tk.substring(0, endCond));
                String second = tk.substring(endCond);
                String[] aets = (second.length() == 0 || NONE
                        .equalsIgnoreCase(second)) ? EMPTY : StringUtils.split(
                        second, ',');
                for (int i = 0; i < aets.length; i++) {
                    checkAET(aets[i]);
                }
                list.add(new Entry(cond, aets));
            } catch (IllegalArgumentException e) {
                throw new IllegalArgumentException(tk);
            }
        }
    }

    private static void checkAET(String s) {
        int delim = s.lastIndexOf('!');
        if (delim == -1) return;
        int hypen = s.lastIndexOf('-');
        int start = Integer.parseInt(s.substring(delim+1, hypen));
        int end = Integer.parseInt(s.substring(hypen+1));
        if (start < 0 || end > 24 || start >= end)
            throw new IllegalArgumentException();
    }

    public static String toAET(String s) {
        int delim = s.lastIndexOf('!');
        return delim == -1 ? s : s.substring(0,delim);
    }

    public static long toScheduledTime(String s) {
        int delim = s.lastIndexOf('!');
        if (delim != -1) {
	        Calendar cal = Calendar.getInstance();
	        long now = cal.getTimeInMillis();
	        cal.set(Calendar.MILLISECOND, 0);
	        cal.set(Calendar.SECOND, 0);
	        cal.set(Calendar.MINUTE, 0);
	        cal.set(Calendar.HOUR_OF_DAY, 0);
	        long date = cal.getTimeInMillis();
	        long time = now - date;
	        int hypen = s.lastIndexOf('-');
	        long start = Integer.parseInt(s.substring(delim+1, hypen)) * MS_PER_HOUR;
	        long end = Integer.parseInt(s.substring(hypen+1)) * MS_PER_HOUR;
	        if (time > start && time < end)
	            return date + end;
        }
        return 0L;
    }

    public String[] getForwardDestinationsFor(Map param) {
    	ArrayList l = new ArrayList();
        for (Iterator it = list.iterator(); it.hasNext();) {
            Entry e = (Entry) it.next();
            if (e.condition.isTrueFor(param) && e.forwardAETs.length > 0 ) l.addAll( Arrays.asList( e.forwardAETs ) );
        }
        if ( l.isEmpty() )
        	return EMPTY;
        else
        	return (String[]) l.toArray( new String[l.size()]);
    }

    public String toString() {
        if (list.isEmpty()) return "";
        StringBuffer sb = new StringBuffer();
        for (Iterator it = list.iterator(); it.hasNext();) {
            Entry e = (Entry) it.next();
            e.condition.toStringBuffer(sb);
            if (e.forwardAETs.length == 0) {
                sb.append(NONE);
            } else {
                for (int i = 0; i < e.forwardAETs.length; ++i)
                    sb.append(e.forwardAETs[i]).append(',');
                sb.setLength(sb.length() - 1);
            }
            sb.append('\r').append('\n');
        }
        sb.setLength(sb.length() - 2);
        return sb.toString();
    }
}


text:
describe("ProductUtils Service", function () {
	  var ProductUtils,
      comments = [
          {
              "rate": 2,
              "user": "Regis Legrand",
              "comment": "Test comment"
          },
          {
              "rate": 4,
              "user": "François Facon",
              "comment": "My comment"
          }
      ];

	  beforeEach(function () {

	      module('app');
	      inject(function ($injector) {
	          ProductUtils = $injector.get('ProductUtils');
	      });
	  });

	  it("getRatingCss should return the correct CSS classes as an array", function () {
	      expect(ProductUtils.getRatingCss(comments)).toEqual(['rating','three']);
	  });
});