7¤0ìZL#?°Ò80Ã0Ã0ÃÀAiûÑ–RÆÙÝFh“R’³tèÐ.ùÕ¾*ÛPŒiÕÆ·ÿ]ò;hçF¸#™“  �ˆ$"i8i³< €Š™Œ
	I£‘P$ä`ÇQAFQ‡Q(�"  D—'=ê2                    _dead_U 0xfe89
#define CLUTTER_KEY_dead_small_schwa 0xfe8a
#define CLUTTER_KEY_dead_capital_schwa 0xfe8b
#define CLUTTER_KEY_dead_ses>.
 */


/*
 * File auto-generated from script at:
 *  http://git.clutter-project.org/clutter/plain/clutter/clutter-keysyms-update.pl
 *
 * using the input files:
 *  http://cgit.freedesktop.org/xorg/proto/x11proto/plain/keysymdef.h
 * and
 *  http://cgit.freedesktop.org/xorg/proto/x11proto/plain/XF86keysym.h
 */

#define CLUTTER_KEY_VoidSymbol 0xffffff
#define CLUTTER_KEY_BackSpace 0xff08
#define CLUTTER_KEY_Tab 0xff09
#define CLUTTER_KEY_Linefeed 0xff0a
#define CLUTTER_KEY_Clear 0xff0b
#define CLUTTER_KEY_Return 0xff0d
#define CLUTTER_KEY_Pause 0xff13
#define CLUTTER_KEY_Scroll_Lock 0xff14
#define CLUTTER_KEY_Sys_Req 0xff15
#define CLUTTER_KEY_Escape 0xff1b
#define CLUTTER_KEY_Delete 0xffff
#define CLUTTER_KEY_Multi_key 0xff20
#define CLUTTER_KEY_Codeinput 0xff37
#define CLUTTER_KEY_SingleCandidate 0xff3c
#define CLUTTER_KEY_MultipleCandidate 0xff3d
#define CLUTTER_KEY_PreviousCandidate 0xff3e
#define CLUTTER_KEY_Kanji 0xff21
#define CLUTTER_KEY_Muhenkan 0xff22
#define CLUTTER_KEY_Henkan_Mode 0xff23
#defibit_culling                 (ClutterActor               *actor);

/**
 * ClutterActorCreateChildFunc:
 * @item: (type GObject): the item in the model
 * @user_data: Data passed to clutter_actor_bind_model()
 *
 * Creates a #ClutterActor using the @item in the model.
 *
 * The usual way to implement this function is to create a #ClutterActor
 * instance and then bind the #GObject properties to the actor properties
 * of interest, using g_object_bind_property(). This way, when the @item
 * in the #GListModel changes, the #ClutterActor changes as well.
 *
 * Returns: (transfer full): The newly created child #ClutterActor4
 */
typedef ClutterActor * (* ClutterActorCreateChildFunc) (gpointer item,
                                                        gpointer user_data);

CLUTTER_EXPORT
void                            clutter_actor_bind_model                        (ClutterActor               *self,
                                                                                 GListModel                 *mode  clutter_actor_set_child_above_sibling           (ClutterActor               *self,
                                                                                 ClutterActor               *child,
                                                                                 ClutterActor               *sibling);
CLUTTER_EXPORT
void                            clutter_actor_set_child_at_index                (ClutterActor               *self,
                                                                                 ClutterActor               *child,
                                                                                 gint                        index_);
CLUTTER_EXPORT
void                            clutter_actor_iter_init                         (ClutterActorIter           *iter,
                                                                                 ClutterActor               *root);
CLUTTER_EXPORT
gboolean                        clutter_actor_iter_next    ter_actor_get_content_scaling_filters       (ClutterActor               *self,
                                                                                 ClutterScalingFilter       *min_filter,
                                                                                 ClutterScalingFilter       *mag_filter);
CLUTTER_EXPORT
void                            clutter_actor_set_content_repeat                (ClutterActor               *self,
                                                                                 ClutterContentRepeat        repeat);
CLUTTER_EXPORT
ClutterContentRepeat            clutter_actor_get_content_repeat                (ClutterActor               *self);

CLUTTER_EXPORT
void                            clutter_actor_set_color_state                   (ClutterActor               *self,
                                                                                 ClutterColorState          *color_state);

CLUTTER_EXPORT
void                            clutter_actor_unset_csition_set            (ClutterActor                *self);
CLUTTER_EXPORT
void                            clutter_actor_set_fixed_position_set            (ClutterActor                *self,
                                                                                 gboolean                     is_set);
CLUTTER_EXPORT
void                            clutter_actor_move_by                           (ClutterActor                *self,
                                                                                 gfloat                       dx,
                                                                                 gfloat                       dy);

/* Actor geometry */
CLUTTER_EXPORT
gfloat                          clutter_actor_get_width                         (ClutterActor                *self);
CLUTTER_EXPORT
gfloat                          clutter_actor_get_height                        (ClutterActor                *self);
CLUTTER_EXPORT
void                            clutter_actor_set_widt       *name);
CLUTTER_EXPORT
const gchar *                   clutter_actor_get_accessible_name               (ClutterActor                *self);
CLUTTER_EXPORT
AtkObject *                     clutter_actor_get_accessible                    (ClutterActor                *self);
CLUTTER_EXPORT
void                            clutter_actor_set_accessible                    (ClutterActor                *self,
                                                                                 AtkObject                   *accessible);
CLUTTER_EXPORT
gboolean                        clutter_actor_is_visible                        (ClutterActor                *self);
CLUTTER_EXPORT
gboolean                        clutter_actor_is_mapped                         (ClutterActor                *self);
CLUTTER_EXPORT
gboolean                        clutter_actor_is_realized                       (ClutterActor                *self);

/* Size negotiation */
CLUTTER_EXPORT
void                            clutter_actor_set_no_layctor::captured-event]
 * @key_focus_in: signal class closure for [signal@Clutter.Actor::key-focus-in]
 * @key_focus_out: signal class closure for [signal@Clutter.Actor::key-focus-out]
 * @queue_relayout: class handler for [signal@Clutter.Actor::queue-relayout]
 * @get_accessible: virtual function, returns the accessible object that
 *   describes the actor to an assistive technology.
 * @get_accessible_type: returns the type of the accessible object that
 *   describes the actor to an assistive technology.
 * @get_paint_volume: virtual function, for sub-classes to define their
 *   #ClutterPaintVolume
 * @has_overlaps: virtual function for
 *   sub-classes to advertise whether they need an offscreen redirect
 *   to get the correct opacity. See
 *   clutter_actor_set_offscreen_redirect() for details.
 * @paint_node: virtual function for creating paint nodes and attaching
 *   them to the render tree
 * @touch_event: signal class closure for [signal@Clutter.Actor::touch-event]
 *
 * Base class for actors.
 */
_CLASS ((obj), CLUTTER_TYPE_ACTOR, ClutterActorClass))

G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterActor, g_object_unref)

typedef struct _ClutterActorClass    ClutterActorClass;
typedef struct _ClutterActorPrivate  ClutterActorPrivate;


struct _ClutterActor
{
  /*< private >*/
  GInitiallyUnowned parent_instance;

  /*< public >*/
  guint32 flags;
  AtkRole accessible_role;

  /*< private >*/
  guint32 private_flags;

  ClutterActorPrivate *priv;
};

/**
 * ClutterActorClass:
 * @show: signal class handler for [signal@Clutter.Actor::show]; it must chain
 *   up to the parent's implementation
 * @hide: signal class handler for [signal@Clutter.Actor::hide]; it must chain
 *   up to the parent's implementation
 * @hide_all: virtual function for containers and composite actors, to
 *   determine which children should be shown when calling
 *   clutter_actor_hide_all() on the actor. Defaults to calling
 *   clutter_actor_hide(). This virtual function is deprecated and it
 *   should not be overridden.
 * @realize: vierFrameClock *frame_clock);

CLUTTER_EXPORT
void clutter_frame_clock_uninhibit (ClutterFrameClock *frame_clock);

void clutter_frame_clock_add_timeline (ClutterFrameClock *frame_clock,
                                       ClutterTimeline   *timeline);

void clutter_frame_clock_remove_timeline (ClutterFrameClock *frame_clock,
                                          ClutterTimeline   *timeline);

CLUTTER_EXPORT
float clutter_frame_clock_get_refresh_rate (ClutterFrameClock *frame_clock);

void clutter_frame_clock_record_flip_time (ClutterFrameClock *frame_clock,
                                           int64_t            flip_time_us);

GString * clutter_frame_clock_get_max_render_time_debug_info (ClutterFrameClock *frame_clock);

CLUTTER_EXPORT
void clutter_frame_clock_set_deadline_evasion (ClutterFrameClock *frame_clock,
                                               int64_t            deadline_evasion_us);
/*
 * Clutter.
 *
 * An OpenGL based 'interactive canvas' library.
 *
 * Copyright (C) 2012  Intelgesture).
 * In these cases, the last event with report the phase
 * %CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL, this should be used as a hint
 * to undo any visible/permanent changes that were done throughout the
 * progress of the gesture.
 *
 * See also #ClutterTouchpadPinchEvent and #ClutterTouchpadPinchEvent.4
 */
typedef enum
{
  CLUTTER_TOUCHPAD_GESTURE_PHASE_BEGIN,
  CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE,
  CLUTTER_TOUCHPAD_GESTURE_PHASE_END,
  CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL
} ClutterTouchpadGesturePhase;

/**
 * ClutterScrollSource:
 * @CLUTTER_SCROLL_SOURCE_UNKNOWN: Source of scroll events is unknown.
 * @CLUTTER_SCROLL_SOURCE_WHEEL: The scroll event is originated by a mouse wheel.
 * @CLUTTER_SCROLL_SOURCE_FINGER: The scroll event is originated by one or more
 *   fingers on the device (eg. touchpads).
 * @CLUTTER_SCROLL_SOURCE_CONTINUOUS: The scroll event is originated by the
 *   motion of some device (eg. a scroll button is set).
 *
 * The scroll source determines the source of the scroor should align itself inside the extra space
 * assigned to it during the allocation.
 *
 * Alignment only matters if the allocated space given to an actor is
 * bigger than its natural size; for example, when
 * the [property@Clutter.Actor:x-expand] or the [property@Clutter.Actor:y-expand]
 * properties of #ClutterActor are set to %TRUE.
 */
typedef enum
{
  CLUTTER_ACTOR_ALIGN_FILL,
  CLUTTER_ACTOR_ALIGN_START,
  CLUTTER_ACTOR_ALIGN_CENTER,
  CLUTTER_ACTOR_ALIGN_END
} ClutterActorAlign;

/**
 * ClutterRepaintFlags:
 * @CLUTTER_REPAINT_FLAGS_PRE_PAINT: Run the repaint function prior to
 *   painting the stages
 * @CLUTTER_REPAINT_FLAGS_POST_PAINT: Run the repaint function after
 *   painting the stages
 *
 * Flags to pass to clutter_threads_add_repaint_func_full().
 */
typedef enum
{
  CLUTTER_REPAINT_FLAGS_PRE_PAINT = 1 << 0,
  CLUTTER_REPAINT_FLAGS_POST_PAINT = 1 << 1,
} ClutterRepaintFlags;

/**
 * ClutterContentGravity:
 * @CLUTTER_CONTENT_GRAVITY_TOP_LEFT: Align the content to the top left corner
 * @Cal device
 * @CLUTTER_INPUT_MODE_FLOATING: A physical device, not attached
 *   to a logical device
 *
 * The mode for input devices available.
 */
typedef enum
{
  CLUTTER_INPUT_MODE_LOGICAL,
  CLUTTER_INPUT_MODE_PHYSICAL,
  CLUTTER_INPUT_MODE_FLOATING
} ClutterInputMode;

/**
 * ClutterInputAxis:
 * @CLUTTER_INPUT_AXIS_IGNORE: Unused axis
 * @CLUTTER_INPUT_AXIS_X: The position on the X axis
 * @CLUTTER_INPUT_AXIS_Y: The position of the Y axis
 * @CLUTTER_INPUT_AXIS_PRESSURE: The pressure information
 * @CLUTTER_INPUT_AXIS_XTILT: The tilt on the X axis
 * @CLUTTER_INPUT_AXIS_YTILT: The tile on the Y axis
 * @CLUTTER_INPUT_AXIS_WHEEL: A wheel
 * @CLUTTER_INPUT_AXIS_DISTANCE: Distance (Since 1.12)
 * @CLUTTER_INPUT_AXIS_ROTATION: Rotation along the z-axis (Since 1.28)
 * @CLUTTER_INPUT_AXIS_SLIDER: A slider (Since 1.28)
 * @CLUTTER_INPUT_AXIS_LAST: Last value of the enumeration; this value is
 *   useful when iterating over the enumeration values (Since 1.12)
 *
 * The type of axes Clutter recognizes on a #Clued by the third pointer button
 * @CLUTTER_BUTTON4_MASK: Mask applied by the fourth pointer button
 * @CLUTTER_BUTTON5_MASK: Mask applied by the fifth pointer button
 * @CLUTTER_SUPER_MASK: Mask applied by the Super key
 * @CLUTTER_HYPER_MASK: Mask applied by the Hyper key
 * @CLUTTER_META_MASK: Mask applied by the Meta key
 * @CLUTTER_RELEASE_MASK: Mask applied during release
 * @CLUTTER_MODIFIER_MASK: A mask covering all modifier types
 *
 * Masks applied to a #ClutterEvent by modifiers.
 *
 * Note that Clutter may add internal values to events which include
 * reserved values such as %CLUTTER_MODIFIER_RESERVED_13_MASK.  Your code
 * should preserve and ignore them.  You can use %CLUTTER_MODIFIER_MASK to
 * remove all reserved values.
 */
typedef enum
{
  CLUTTER_SHIFT_MASK    = 1 << 0,
  CLUTTER_LOCK_MASK     = 1 << 1,
  CLUTTER_CONTROL_MASK  = 1 << 2,
  CLUTTER_MOD1_MASK     = 1 << 3,
  CLUTTER_MOD2_MASK     = 1 << 4,
  CLUTTER_MOD3_MASK     = 1 << 5,
  CLUTTER_MOD4_MASK     = 1 << 6,
  CLUTTER_MOD5_MASK LUTTER_EASE_OUT_EXPO: exponential tweening, inverse of
 *    %CLUTTER_EASE_IN_EXPO
 * @CLUTTER_EASE_IN_OUT_EXPO: exponential tweening, combining
 *    %CLUTTER_EASE_IN_EXPO and %CLUTTER_EASE_OUT_EXPO
 * @CLUTTER_EASE_IN_CIRC: circular tweening
 * @CLUTTER_EASE_OUT_CIRC: circular tweening, inverse of
 *    %CLUTTER_EASE_IN_CIRC
 * @CLUTTER_EASE_IN_OUT_CIRC: circular tweening, combining
 *    %CLUTTER_EASE_IN_CIRC and %CLUTTER_EASE_OUT_CIRC
 * @CLUTTER_EASE_IN_ELASTIC: elastic tweening, with offshoot on start
 * @CLUTTER_EASE_OUT_ELASTIC: elastic tweening, with offshoot on end
 * @CLUTTER_EASE_IN_OUT_ELASTIC: elastic tweening with offshoot on both ends
 * @CLUTTER_EASE_IN_BACK: overshooting cubic tweening, with
 *   backtracking on start
 * @CLUTTER_EASE_OUT_BACK: overshooting cubic tweening, with
 *   backtracking on end
 * @CLUTTER_EASE_IN_OUT_BACK: overshooting cubic tweening, with
 *   backtracking on both ends
 * @CLUTTER_EASE_IN_BOUNCE: exponentially decaying parabolic (bounce)
 *   tweening, with bounce _Greek_alpha - CLUTTER_KEY_Greek_ALPHA);
      break;

    default:
      break;
    }

  if (lower)
    *lower = xlower;
  if (upper)
    *upper = xupper;
}

static int
clutter_keys_keyval_compare (const void *pkey, const void *pbase)
{
  return (*(int *) pkey) - ((clutter_key *) pbase)->keyval;
}

/**
 * clutter_keyval_name:
 * @keyval: A key value.
 *  
 * Returns: (nullable) (transfer none): The corresponding symbolic name.
 */
const char *
clutter_keyval_name (unsigned int keyval)
{
  static char buf[100];
  clutter_key *found;

  /* Check for directly encoded 24-bit UCS characters: */
  if ((keyval & 0xff000000) == 0x01000000)
    {
      g_sprintf (buf, "U+%.04X", (keyval & 0x00ffffff));
      return buf;
    }

  found = bsearch (&keyval, clutter_keys_by_keyval,
		   CLUTTER_NUM_KEYS, sizeof (clutter_key),
		   clutter_keys_keyval_compare);

  if (found != NULL)
    {
      while ((found > clutter_keys_by_keyval) &&
             ((found - 1)->keyval == keyval))
        found--;

      return (char *) oui <belmous@redhat.com>
 * 
 * The code is a modified version of the GDK implementation
 */

#include <glib.h>
#include <glib/gprintf.h>

#include "config.h"

#include "clutter/clutter-keyval.h"
#include "clutter/clutter-event.h"
#include "clutter/clutter-keysyms.h"
#include "clutter/clutter-keyname-table.h"

#define CLUTTER_NUM_KEYS G_N_ELEMENTS (clutter_keys_by_keyval)

/**
 * clutter_keyval_convert_case: 
 * @symbol: a keyval.
 * @lower: (out): return location of the lowercase version of @symbol.
 * @upper: (out): return location of the uppercase version of @symbol.
 */
void
clutter_keyval_convert_case (unsigned int  symbol,
                             unsigned int *lower,
                             unsigned int *upper)
{
  unsigned int xlower, xupper;

  xlower = symbol;
  xupper = symbol;

  /* Check for directly encoded 24-bit UCS characters: */
  if ((symbol & 0xff000000) == 0x01000000)
    {
      if (lower)
        *lower = clutter_unicode_to_keysym (g_unichar_tolower (symbol & 0x00ffffff));
    geView *view,
                       const MtkRegion  *redraw_clip,
                       ClutterFrame     *frame);
};

/**
 * ClutterPerspective:
 * @fovy: the field of view angle, in degrees, in the y direction
 * @aspect: the aspect ratio that determines the field of view in the x
 *   direction. The aspect ratio is the ratio of x (width) to y (height)
 * @z_near: the distance from the viewer to the near clipping
 *   plane (always positive)
 * @z_far: the distance from the viewer to the far clipping
 *   plane (always positive)
 *
 * Stage perspective definition.
 */
struct _ClutterPerspective
{
  gfloat fovy;
  gfloat aspect;
  gfloat z_near;
  gfloat z_far;
};

typedef enum
{
  CLUTTER_FRAME_INFO_FLAG_NONE = 0,
  /* presentation_time timestamp was provided by the hardware */
  CLUTTER_FRAME_INFO_FLAG_HW_CLOCK = 1 << 0,
  /*
   * The presentation of this frame was done zero-copy. This means the buffer
   * from the client was given to display hardware as is, without copying it.
   * Compositing with OpelClickType dwell_click_type;
  ClutterPointerA11yDwellMode dwell_mode;
  ClutterPointerA11yDwellDirection dwell_gesture_single;
  ClutterPointerA11yDwellDirection dwell_gesture_double;
  ClutterPointerA11yDwellDirection dwell_gesture_drag;
  ClutterPointerA11yDwellDirection dwell_gesture_secondary;
  gint secondary_click_delay;
  gint dwell_delay;
  gint dwell_threshold;
} ClutterPointerA11ySettings;

/**
 * ClutterVirtualDeviceType:
 */
typedef enum
{
  CLUTTER_VIRTUAL_DEVICE_TYPE_NONE = 0,
  CLUTTER_VIRTUAL_DEVICE_TYPE_KEYBOARD = 1 << 0,
  CLUTTER_VIRTUAL_DEVICE_TYPE_POINTER = 1 << 1,
  CLUTTER_VIRTUAL_DEVICE_TYPE_TOUCHSCREEN = 1 << 2,
} ClutterVirtualDeviceType;

typedef struct _ClutterSeatClass ClutterSeatClass;

struct _ClutterSeatClass
{
  GObjectClass parent_class;

  ClutterInputDevice * (* get_pointer)  (ClutterSeat *seat);
  ClutterInputDevice * (* get_keyboard) (ClutterSeat *seat);

  const GList * (* peek_devices) (ClutterSeat *seat);

  void (* bell_notify) (ClutterSeat *seat);

  ClutterKeymap *         progress);
CLUTTER_EXPORT
void                            clutter_timeline_add_marker_at_time             (ClutterTimeline          *timeline,
                                                                                 const gchar              *marker_name,
                                                                                 guint                     msecs);
CLUTTER_EXPORT
void                            clutter_timeline_remove_marker                  (ClutterTimeline          *timeline,
                                                                                 const gchar              *marker_name);
CLUTTER_EXPORT
gchar **                        clutter_timeline_list_markers                   (ClutterTimeline          *timeline,
                                                                                 gint                      msecs,
                                                                                 gsize                    *n_markers) G_GNUC_MALLOC;
CLUTT                                  ClutterModifierType  modifiers);

CLUTTER_EXPORT
gboolean              clutter_binding_pool_activate         (ClutterBindingPool  *pool,
                                                             guint                key_val,
                                                             ClutterModifierType  modifiers,
                                                             GObject             *gobject);

CLUTTER_EXPORT
void                  clutter_binding_pool_block_action     (ClutterBindingPool  *pool,
                                                             const gchar         *action_name);
CLUTTER_EXPORT
void                  clutter_binding_pool_unblock_action   (ClutterBindingPool  *pool,
                                                             const gchar         *action_name);

G_END_DECLS
/*
 * Clutter.
 *
 * An OpenGL based 'interactive canvas' library.
 *
 * Authored By Matthew Allum  <mallum@openedhand.com>
 *
 * Copyright (C) 2006 OpenedHand
 *
 *         unsigned int      n_rects);
CLUTTER_EXPORT
void                    clutter_paint_node_add_texture_rectangles       (ClutterPaintNode *node,
                                                                         const float      *coords,
                                                                         unsigned int      n_rects);

CLUTTER_EXPORT
void                    clutter_paint_node_add_primitive                (ClutterPaintNode      *node,
                                                                         CoglPrimitive         *primitive);

G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterPaintNode, clutter_paint_node_unref)

/**
 * CLUTTER_VALUE_HOLDS_PAINT_NODE:
 * @value: a #GValue
 *
 * Evaluates to %TRUE if the @value has been initialized to hold
 * a #ClutterPaintNode.
 */
#define CLUTTER_VALUE_HOLDS_PAINT_NODE(value)   (G_VALUE_HOLDS (value, CLUTTER_TYPE_PAINT_NODE))

CLUTTER_EXPORT
void                    clutter_value_set_paint_node                    (GValue                *value,
aLaunchContext *
             meta_startup_notification_create_launcher (MetaStartupNotification *sn);

META_EXPORT
const char * meta_startup_sequence_get_id             (MetaStartupSequence *seq);

META_EXPORT
gboolean     meta_startup_sequence_get_completed      (MetaStartupSequence *seq);

META_EXPORT
const char * meta_startup_sequence_get_name           (MetaStartupSequence *seq);

META_EXPORT
int          meta_startup_sequence_get_workspace      (MetaStartupSequence *seq);

META_EXPORT
uint64_t     meta_startup_sequence_get_timestamp      (MetaStartupSequence *seq);

META_EXPORT
const char * meta_startup_sequence_get_icon_name      (MetaStartupSequence *seq);

META_EXPORT
const char * meta_startup_sequence_get_application_id (MetaStartupSequence *seq);

META_EXPORT
const char * meta_startup_sequence_get_wmclass        (MetaStartupSequence *seq);

META_EXPORT
void        meta_startup_sequence_complete           (MetaStartupSequence *seq);
/* clutter-text-buffer.h
 * Copyright (C) 2011 Collabora Ltd.
 *
 *CH_CONFIG_ALL_LINEAR,
  META_MONITOR_SWITCH_CONFIG_EXTERNAL,
  META_MONITOR_SWITCH_CONFIG_BUILTIN,
  META_MONITOR_SWITCH_CONFIG_UNKNOWN,
} MetaMonitorSwitchConfigType;

typedef enum _MetaPowerSaveChangeReason
{
  META_POWER_SAVE_CHANGE_REASON_MODE_CHANGE,
  META_POWER_SAVE_CHANGE_REASON_HOTPLUG,
} MetaPowerSaveChangeReason;

typedef struct _MetaMonitorManagerClass    MetaMonitorManagerClass;
typedef struct _MetaMonitorManager         MetaMonitorManager;

META_EXPORT
GType meta_monitor_manager_get_type (void);

META_EXPORT
gint meta_monitor_manager_get_monitor_for_connector (MetaMonitorManager *manager,
                                                     const char         *connector);

META_EXPORT
gboolean meta_monitor_manager_get_is_builtin_display_on (MetaMonitorManager *manager);

META_EXPORT
void meta_monitor_manager_switch_config (MetaMonitorManager          *manager,
                                         MetaMonitorSwitchConfigType  config_type);

META_EXPORT
gboolean meta_monitor_manager_can_switchfor_rect (MetaDisplay  *display,
                                             MtkRectangle *rect);

META_EXPORT
int meta_display_get_monitor_neighbor_index (MetaDisplay         *display,
                                             int                  which_monitor,
                                             MetaDisplayDirection dir);

META_EXPORT
void meta_display_focus_default_window (MetaDisplay *display,
                                        guint32      timestamp);

/**
 * MetaDisplayCorner:
 * @META_DISPLAY_TOPLEFT: top-left corner
 * @META_DISPLAY_TOPRIGHT: top-right corner
 * @META_DISPLAY_BOTTOMLEFT: bottom-left corner
 * @META_DISPLAY_BOTTOMRIGHT: bottom-right corner
 */
typedef enum
{
  META_DISPLAY_TOPLEFT,
  META_DISPLAY_TOPRIGHT,
  META_DISPLAY_BOTTOMLEFT,
  META_DISPLAY_BOTTOMRIGHT
} MetaDisplayCorner;

META_EXPORT
MetaWorkspaceManager *meta_display_get_workspace_manager (MetaDisplay *display);

/**
 * meta_display_get_startup_notification: (skip)
 */
META_EXPORT
MetaStartupNotification * id meta_log (const char *format, ...) G_GNUC_PRINTF (1, 2);

#define meta_topic(debug_topic, ...) \
  G_STMT_START \
    { \
      if (meta_is_topic_enabled (debug_topic)) \
        { \
          g_autofree char *_topic_message = NULL; \
\
          _topic_message = g_strdup_printf (__VA_ARGS__); \
          meta_log ("%s: %s", meta_topic_to_string (debug_topic), \
                     _topic_message); \
        } \
    } \
  G_STMT_END

#define meta_verbose(...) meta_topic (META_DEBUG_VERBOSE, __VA_ARGS__)

#else

#  ifdef G_HAVE_ISO_VARARGS
#    define meta_verbose(...)
#    define meta_topic(...)
#  elif defined(G_HAVE_GNUC_VARARGS)
#    define meta_verbose(format...)
#    define meta_topic(format...)
#  else
#    error "This compiler does not support varargs macros and thus verbose mode can't be disabled meaningfully"
#  endif

#endif /* !WITH_VERBOSE_MODE */
/*
 * meta-background-content.h: ClutterContent for painting the wallpaper
 *
 * Copyright 2010 Red Hat, Inc.
 * Copyright 2020 Endless Foundation
 a once

#include <glib.h>

#include "meta/types.h"
#include "meta/boxes.h"
#include "meta/window.h"
#include "meta/workspace.h"

#define META_TYPE_COMPOSITOR (meta_compositor_get_type ())
META_EXPORT
G_DECLARE_DERIVABLE_TYPE (MetaCompositor, meta_compositor,
                          META, COMPOSITOR, GObject)

/**
 * MetaCompEffect:
 * @META_COMP_EFFECT_CREATE: The window is newly created
 *   (also used for a window that was previously on a different
 *   workspace and is changed to become visible on the active
 *   workspace.)
 * @META_COMP_EFFECT_UNMINIMIZE: The window should be shown
 *   as unminimizing from its icon geometry.
 * @META_COMP_EFFECT_DESTROY: The window is being destroyed
 * @META_COMP_EFFECT_MINIMIZE: The window should be shown
 *   as minimizing to its icon geometry.
 * @META_COMP_EFFECT_NONE: No effect, the window should be
 *   shown or hidden immediately.
 *
 * Indicates the appropriate effect to show the user for
 * meta_compositor_show_window() and meta_compositor_hide_window()
 */
META_LAYER_LAST	       = 8
} MetaStackLayer;

/* MetaGravity: (skip)
 *
 * Identical to the corresponding gravity value macros from libX11.
 */
typedef enum _MetaGravity
{
  META_GRAVITY_NONE = 0,
  META_GRAVITY_NORTH_WEST = 1,
  META_GRAVITY_NORTH = 2,
  META_GRAVITY_NORTH_EAST = 3,
  META_GRAVITY_WEST = 4,
  META_GRAVITY_CENTER = 5,
  META_GRAVITY_EAST = 6,
  META_GRAVITY_SOUTH_WEST = 7,
  META_GRAVITY_SOUTH = 8,
  META_GRAVITY_SOUTH_EAST = 9,
  META_GRAVITY_STATIC = 10,
} MetaGravity;

/**
 * MetaKeyboardA11yFlags:
 * @META_A11Y_KEYBOARD_ENABLED:
 * @META_A11Y_TIMEOUT_ENABLED:
 * @META_A11Y_MOUSE_KEYS_ENABLED:
 * @META_A11Y_SLOW_KEYS_ENABLED:
 * @META_A11Y_SLOW_KEYS_BEEP_PRESS:
 * @META_A11Y_SLOW_KEYS_BEEP_ACCEPT:
 * @META_A11Y_SLOW_KEYS_BEEP_REJECT:
 * @META_A11Y_BOUNCE_KEYS_ENABLED:
 * @META_A11Y_BOUNCE_KEYS_BEEP_REJECT:
 * @META_A11Y_TOGGLE_KEYS_ENABLED:
 * @META_A11Y_STICKY_KEYS_ENABLED:
 * @META_A11Y_STICKY_KEYS_TWO_KEY_OFF:
 * @META_A11Y_STICKY_KEYS_BEEP:
 * @META_A11Y_FEATURE_STATE_CHANGE_BEEP:
 *
 P_KEYBOARD_RESIZING_SW: Resizing SW with keyboard
 * @META_GRAB_OP_KEYBOARD_RESIZING_NW: Resizing NS with keyboard
 */

/* The lower 16 bits of the grab operation is its type.
 *
 * Window grab operations have the following layout:
 *
 * 0000  0000  | 0000 0011
 * NSEW  flags | type
 *
 * Flags contains whether the operation is a keyboard operation,
 * and whether the keyboard operation is "unknown".
 *
 * The rest of the flags tell you which direction the resize is
 * going in.
 *
 * If the directions field is 0000, then the operation is a move,
 * not a resize.
 */
enum
{
  META_GRAB_OP_WINDOW_FLAG_KEYBOARD = 0x0100,
  META_GRAB_OP_WINDOW_FLAG_UNKNOWN  = 0x0200,
  META_GRAB_OP_WINDOW_FLAG_UNCONSTRAINED = 0x0400,
  META_GRAB_OP_WINDOW_DIR_WEST      = 0x1000,
  META_GRAB_OP_WINDOW_DIR_EAST      = 0x2000,
  META_GRAB_OP_WINDOW_DIR_SOUTH     = 0x4000,
  META_GRAB_OP_WINDOW_DIR_NORTH     = 0x8000,
  META_GRAB_OP_WINDOW_DIR_MASK      = 0xF000,

  /* WGO = "window grab op". shorthand for below */
  _WGO_K = META_Gcalled when handling each keybinding.
   *
   * Returns: %TRUE if the plugin handled the keybinding.
   */
  gboolean (*keybinding_filter) (MetaPlugin     *plugin,
                                 MetaKeyBinding *binding);

  /**
   * MetaPluginClass::confirm_display_config:
   * @plugin: a #MetaPlugin
   *
   * Virtual function called when the display configuration changes.
   * The common way to implement this function is to show some form
   * of modal dialog that should ask the user if everything was ok.
   *
   * When confirmed by the user, the plugin must call meta_plugin_complete_display_change()
   * to make the configuration permanent. If that function is not
   * called within the timeout, the previous configuration will be
   * reapplied.
   */
  void (*confirm_display_change) (MetaPlugin *plugin);

  /**
   * MetaPluginClass::plugin_info:
   * @plugin: a #MetaPlugin
   *
   * Virtual function that returns information about the #MetaPlugin.
   *
   * Returns: a #MetaPluginInfo.
   */
  const MetaPle
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
 */

#pragma once

#include <glib-object.h>
#include <gio/gio.h>

#include "meta/display.h"

G_BEGIN_DECLS

#define META_TYPE_WAYLAND_CLIENT (meta_wayland_client_get_type ())
META_EXPORT
G_DECLARE_FINAL_TYPE (MetaWaylandClient, meta_wayland_client, META, WAYLAND_CLIENT, GObject)

META_EXPORT
MetaWaylandClient *meta_wayland_client_new (MetaContext          *context,
                                            GSubprocessLauncher  *launcher,
                                            GError              **error);

META_EXPORT
GSubprocess *meta_wayland_client_spawn (MetaWaylandClient  *client,
                                        MetaDisplay        *display,
                                        GError            **error,
                                        const char         *argv0,
                                        ...) G_GNUC_NULL_TERMINATED;

META_EXPORT
GSubprocess *meta_wayland_client_spawnv (MetaWaylandClient   *clieTION_CYCLE_GROUP,
  META_KEYBINDING_ACTION_CYCLE_GROUP_BACKWARD,
  META_KEYBINDING_ACTION_CYCLE_WINDOWS,
  META_KEYBINDING_ACTION_CYCLE_WINDOWS_BACKWARD,
  META_KEYBINDING_ACTION_CYCLE_PANELS,
  META_KEYBINDING_ACTION_CYCLE_PANELS_BACKWARD,
  META_KEYBINDING_ACTION_SHOW_DESKTOP,
  META_KEYBINDING_ACTION_PANEL_RUN_DIALOG,
  META_KEYBINDING_ACTION_TOGGLE_RECORDING,
  META_KEYBINDING_ACTION_SET_SPEW_MARK,
  META_KEYBINDING_ACTION_ACTIVATE_WINDOW_MENU,
  META_KEYBINDING_ACTION_TOGGLE_FULLSCREEN,
  META_KEYBINDING_ACTION_TOGGLE_MAXIMIZED,
  META_KEYBINDING_ACTION_TOGGLE_TILED_LEFT,
  META_KEYBINDING_ACTION_TOGGLE_TILED_RIGHT,
  META_KEYBINDING_ACTION_TOGGLE_ABOVE,
  META_KEYBINDING_ACTION_MAXIMIZE,
  META_KEYBINDING_ACTION_UNMAXIMIZE,
  META_KEYBINDING_ACTION_TOGGLE_SHADED,
  META_KEYBINDING_ACTION_MINIMIZE,
  META_KEYBINDING_ACTION_CLOSE,
  META_KEYBINDING_ACTION_BEGIN_MOVE,
  META_KEYBINDING_ACTION_BEGIN_RESIZE,
  META_KEYBINDING_ACTION_TOGGLE_ON_ALL_WORKSPACES,
  META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_1,
  MEPREF_AUDIBLE_BELL: audible bell
 * @META_PREF_VISUAL_BELL_TYPE: visual bell type
 * @META_PREF_GNOME_ACCESSIBILITY: GNOME accessibility
 * @META_PREF_GNOME_ANIMATIONS: GNOME animations
 * @META_PREF_CURSOR_THEME: cursor theme
 * @META_PREF_CURSOR_SIZE: cursor size
 * @META_PREF_RESIZE_WITH_RIGHT_BUTTON: resize with right button
 * @META_PREF_EDGE_TILING: edge tiling
 * @META_PREF_FORCE_FULLSCREEN: force fullscreen
 * @META_PREF_WORKSPACES_ONLY_ON_PRIMARY: workspaces only on primary
 * @META_PREF_DRAGGABLE_BORDER_WIDTH: draggable border width
 * @META_PREF_AUTO_MAXIMIZE: auto-maximize
 * @META_PREF_CENTER_NEW_WINDOWS: center new windows
 * @META_PREF_DRAG_THRESHOLD: drag threshold
 * @META_PREF_LOCATE_POINTER: show pointer location
 */

/* Keep in sync with GSettings schemas! */
typedef enum
{
  META_PREF_MOUSE_BUTTON_MODS,
  META_PREF_FOCUS_MODE,
  META_PREF_FOCUS_NEW_WINDOWS,
  META_PREF_ATTACH_MODAL_DIALOGS,
  META_PREF_RAISE_ON_CLICK,
  META_PREF_ACTION_DOUBLE_CLICK_TITLEBAR,
  META_PREF_ACTION_MIDDLE_CLIC *options,
                              const char  *model);

META_EXPORT
void meta_backend_lock_layout_group (MetaBackend *backend,
                                     guint        idx);

META_EXPORT
MetaContext * meta_backend_get_context (MetaBackend *backend);

META_EXPORT
ClutterActor *meta_backend_get_stage (MetaBackend *backend);

META_EXPORT
MetaDnd      *meta_backend_get_dnd   (MetaBackend *backend);

META_EXPORT
MetaSettings *meta_backend_get_settings (MetaBackend *backend);

META_EXPORT
MetaIdleMonitor * meta_backend_get_core_idle_monitor (MetaBackend *backend);

META_EXPORT
MetaMonitorManager * meta_backend_get_monitor_manager (MetaBackend *backend);

META_EXPORT
MetaOrientationManager * meta_backend_get_orientation_manager (MetaBackend *backend);

META_EXPORT
MetaRemoteAccessController * meta_backend_get_remote_access_controller (MetaBackend *backend);

META_EXPORT
gboolean meta_backend_is_rendering_hardware_accelerated (MetaBackend *backend);

META_EXPORT
gboolean meta_backend_is_headless (MetaOG_RESPONSE_WAIT,
  META_CLOSE_DIALOG_RESPONSE_FORCE_CLOSE,
} MetaCloseDialogResponse;

struct _MetaCloseDialogInterface
{
  GTypeInterface parent_iface;

  void (* show) (MetaCloseDialog *dialog);
  void (* hide) (MetaCloseDialog *dialog);
  void (* focus) (MetaCloseDialog *dialog);
};

META_EXPORT
void              meta_close_dialog_show (MetaCloseDialog *dialog);

META_EXPORT
void              meta_close_dialog_hide (MetaCloseDialog *dialog);

META_EXPORT
void              meta_close_dialog_focus (MetaCloseDialog *dialog);

META_EXPORT
gboolean          meta_close_dialog_is_visible (MetaCloseDialog *dialog);

META_EXPORT
void              meta_close_dialog_response (MetaCloseDialog         *dialog,
                                              MetaCloseDialogResponse  response);
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */

/*
 * Copyright (C) 2001 Havoc Pennington
 * Copyright (C) 2004, 2005 Elijah

  /* buttons in the group on the right side */
  MetaButtonFunction right_buttons[MAX_BUTTONS_PER_CORNER];
  gboolean right_buttons_has_spacer[MAX_BUTTONS_PER_CORNER];
};

/**
 * MetaFrameBorder:
 * @left: left border
 * @right: right border
 * @top: top border
 * @bottom: bottom border
 */
typedef struct _MetaFrameBorder
{
  int16_t left;
  int16_t right;
  int16_t top;
  int16_t bottom;
} MetaFrameBorder;

/**
 * MetaFrameBorders:
 * @visible: inner visible portion of frame border
 * @invisible: outer invisible portion of frame border
 * @total: sum of the two borders above
 */
typedef struct _MetaFrameBorders MetaFrameBorders;
struct _MetaFrameBorders
{
  /* The frame border is made up of two pieces - an inner visible portion
   * and an outer portion that is invisible but responds to events.
   */
  MetaFrameBorder visible;
  MetaFrameBorder invisible;

  /* For convenience, we have a "total" border which is equal to the sum
   * of the two borders above. */
  MetaFrameBorder total;
};

/* sets all dime_CURSOR_PRIMARY = 1 << 1,
  META_DEBUG_PAINT_DISABLE_DIRECT_SCANOUT = 1 << 2,
} MetaDebugPaintFlag;

META_EXPORT
void meta_add_verbose_topic    (MetaDebugTopic topic);

META_EXPORT
void meta_remove_verbose_topic (MetaDebugTopic topic);

META_EXPORT
void meta_push_no_msg_prefix (void);

META_EXPORT
void meta_pop_no_msg_prefix  (void);

META_EXPORT
gint  meta_unsigned_long_equal (gconstpointer v1,
                                gconstpointer v2);

META_EXPORT
guint meta_unsigned_long_hash  (gconstpointer v);

META_EXPORT
const char* meta_frame_type_to_string (MetaFrameType type);
META_EXPORT
const char* meta_gravity_to_string (MetaGravity gravity);

META_EXPORT
char* meta_external_binding_name_for_action (guint keybinding_action);

META_EXPORT
char* meta_g_utf8_strndup (const gchar *src, gsize n);

META_EXPORT
void meta_add_clutter_debug_flags (ClutterDebugFlag     debug_flags,
                                   ClutterDrawDebugFlag draw_flags,
                                   ClutterPickDebugFlag pick_flagsutter.h"
#include "meta/compositor.h"
#include "meta/meta-shaped-texture.h"

#define META_TYPE_WINDOW_ACTOR (meta_window_actor_get_type ())

META_EXPORT
G_DECLARE_DERIVABLE_TYPE (MetaWindowActor,
                          meta_window_actor,
                          META, WINDOW_ACTOR,
                          ClutterActor)

META_EXPORT
MetaWindow *       meta_window_actor_get_meta_window      (MetaWindowActor *self);

META_EXPORT
MetaShapedTexture *meta_window_actor_get_texture          (MetaWindowActor *self);

META_EXPORT
void               meta_window_actor_sync_visibility      (MetaWindowActor *self);

META_EXPORT
gboolean       meta_window_actor_is_destroyed (MetaWindowActor *self);

META_EXPORT
cairo_surface_t * meta_window_actor_get_image (MetaWindowActor *self,
                                               MtkRectangle    *clip);

META_EXPORT
ClutterContent * meta_window_actor_paint_to_content (MetaWindowActor  *self,
                                                     MtkRectangle     *clip,
    * @META_WINDOW_NOTIFICATION: Notification
 * @META_WINDOW_COMBO: Combobox
 * @META_WINDOW_DND: Drag and drop
 * @META_WINDOW_OVERRIDE_OTHER: Other override-redirect window type
 */
typedef enum
{
  META_WINDOW_NORMAL,
  META_WINDOW_DESKTOP,
  META_WINDOW_DOCK,
  META_WINDOW_DIALOG,
  META_WINDOW_MODAL_DIALOG,
  META_WINDOW_TOOLBAR,
  META_WINDOW_MENU,
  META_WINDOW_UTILITY,
  META_WINDOW_SPLASHSCREEN,

  /* override redirect window types: */
  META_WINDOW_DROPDOWN_MENU,
  META_WINDOW_POPUP_MENU,
  META_WINDOW_TOOLTIP,
  META_WINDOW_NOTIFICATION,
  META_WINDOW_COMBO,
  META_WINDOW_DND,
  META_WINDOW_OVERRIDE_OTHER
} MetaWindowType;

/**
 * MetaMaximizeFlags:
 * @META_MAXIMIZE_HORIZONTAL: Horizontal
 * @META_MAXIMIZE_VERTICAL: Vertical
 * @META_MAXIMIZE_BOTH: Both
 */
typedef enum
{
  META_MAXIMIZE_HORIZONTAL = 1 << 0,
  META_MAXIMIZE_VERTICAL   = 1 << 1,
  META_MAXIMIZE_BOTH       = (1 << 0 | 1 << 1),
} MetaMaximizeFlags;

/**
 * MetaWindowClientType:
 * @META_WINDOW_CLIENT_TYPE_WAYLAND: A Wayland based window_next (&iter))
 *  {
 *    [ Use iter.rectangle, iter.line_start, iter.line_end ]
 *  }
 *```
 */
typedef struct MtkaRegionIterator MtkRegionIterator;

struct MtkaRegionIterator {
  MtkRegion *region;
  MtkRectangle rectangle;
  gboolean line_start;
  gboolean line_end;
  int i;

  /*< private >*/
  int n_rectangles;
  MtkRectangle next_rectangle;
};

MTK_EXPORT
void mtk_region_iterator_init (MtkRegionIterator *iter,
                               MtkRegion          *region);

MTK_EXPORT
gboolean mtk_region_iterator_at_end (MtkRegionIterator *iter);

MTK_EXPORT
void mtk_region_iterator_next (MtkRegionIterator *iter);

typedef struct _MtkRegionBuilder MtkRegionBuilder;

#define MTK_REGION_BUILDER_MAX_LEVELS 16

struct _MtkRegionBuilder {
  /* To merge regions in binary tree order, we need to keep track of
   * the regions that we've already merged together at different
   * levels of the tree. We fill in an array in the pattern:
   *
   * |a  |
   * |b  |a  |
   * |c  |   |ab |
   * |d  |c  |ab |
   * |e  |   81.1, gsettings-desktop-schemas >=  47.beta, gl, egl, wayland-server >=  1.23, mutter-clutter-15
Libs: -L${prefix}/lib -lmutter-15
Cflags: -I${includedir}/mutter-15
prefix=/usr
includedir=${prefix}/include
libdir=${prefix}/lib

apiversion=15

Name: Mutters Clutter
Description: Mutters Clutter Private Library
Version: 47.10
Requires: atk >=  2.5.3, cairo >=  1.10.0, glib-2.0 >=  2.81.1, gobject-2.0 >=  2.81.1, gio-unix-2.0 >=  2.81.1, pango >=  1.46.0, harfbuzz >=  2.6, mutter-cogl-15, mutter-mtk-15
Libs: -L${prefix}/lib/mutter-15 -lmutter-clutter-15 -lm
Cflags: -I${includedir}/mutter-15/clutter
prefix=/usr
includedir=${prefix}/include
libdir=${prefix}/lib

apiversion=15

Name: CoglPango
Description: A text rendering for Cogl in mutter
Version: 47.10
Requires: glib-2.0 >=  2.81.1, gio-unix-2.0 >=  2.81.1, gobject-2.0 >=  2.81.1, graphene-gobject-1.0 >=  1.10.2, wayland-server >=  1.23, egl, gl, glesv2, mutter-cogl-15, pango >=  1.46.0, pangocairo >=  1.20
Libs: -L${prefix}/lib/mutter-15 -lmutter-cogl-pango-15
#include "clutter/clutter-property-transition.h"

G_BEGIN_DECLS

#define CLUTTER_TYPE_KEYFRAME_TRANSITION                (clutter_keyframe_transition_get_type ())

CLUTTER_EXPORT
G_DECLARE_DERIVABLE_TYPE (ClutterKeyframeTransition,
                          clutter_keyframe_transition,
                          CLUTTER,
                          KEYFRAME_TRANSITION,
                          ClutterPropertyTransition)


/**
 * ClutterKeyframeTransitionClass:
 *
 * The `ClutterKeyframeTransitionClass` structure contains only
 * private data.
 */
struct _ClutterKeyframeTransitionClass
{
  /*< private >*/
  ClutterPropertyTransitionClass parent_class;
};

CLUTTER_EXPORT
ClutterTransition *     clutter_keyframe_transition_new                 (const char *property_name);

CLUTTER_EXPORT
void                    clutter_keyframe_transition_set_key_frames      (ClutterKeyframeTransition  *transition,
                                                                         guint                       n_key_frames,
        blue);
CLUTTER_EXPORT
void            clutter_brightness_contrast_effect_set_contrast                 (ClutterBrightnessContrastEffect *effect,
                                                                                 float                            contrast);
CLUTTER_EXPORT
void            clutter_brightness_contrast_effect_get_contrast                 (ClutterBrightnessContrastEffect *effect,
                                                                                 float                           *red,
                                                                                 float                           *green,
                                                                                 float                           *blue);

G_END_DECLS
/* Clutter.
 *
 * Copyright (C) 2008 Igalia, S.L.
 *
 * Author: Alejandro PiÃ±eiro Iglesias <apinheiro@igalia.com>
 *
 * Some parts are based on GailWidget from GAIL
 * GAIL - The GNOME Accessibility Implementation Library
 * Copyright 200h> can be included directly."
#endif

#include "clutter/clutter-constraint.h"

G_BEGIN_DECLS

#define CLUTTER_TYPE_BIND_CONSTRAINT    (clutter_bind_constraint_get_type ())

CLUTTER_EXPORT
G_DECLARE_FINAL_TYPE (ClutterBindConstraint, clutter_bind_constraint,
                      CLUTTER, BIND_CONSTRAINT, ClutterConstraint)

CLUTTER_EXPORT
ClutterConstraint *   clutter_bind_constraint_new            (ClutterActor          *source,
                                                              ClutterBindCoordinate  coordinate,
                                                              gfloat                 offset);

CLUTTER_EXPORT
void                  clutter_bind_constraint_set_source     (ClutterBindConstraint *constraint,
                                                              ClutterActor          *source);
CLUTTER_EXPORT
ClutterActor *        clutter_bind_constraint_get_source     (ClutterBindConstraint *constraint);
CLUTTER_EXPORT
void                  clutter_bind_constraint_set_coordinate (ClUTTER, CONTEXT, GObject)

/**
 * clutter_context_new: (skip)
 */
ClutterContext * clutter_context_new (ClutterBackendConstructor   backend_constructor,
                                      gpointer                    user_data,
                                      GError                    **error);

/**
 * clutter_context_destroy: (skip)
 */
CLUTTER_EXPORT
void clutter_context_destroy (ClutterContext *context);

/**
 * clutter_context_get_backend:
 *
 * Returns: (transfer none): The %ClutterBackend
 */
CLUTTER_EXPORT
ClutterBackend * clutter_context_get_backend (ClutterContext *context);

/**
 * clutter_context_get_pango_fontmap: (skip)
 */
CoglPangoFontMap * clutter_context_get_pango_fontmap (ClutterContext *context);

ClutterTextDirection clutter_context_get_text_direction (ClutterContext *context);

CLUTTER_EXPORT
ClutterPipelineCache * clutter_context_get_pipeline_cache (ClutterContext *clutter_context);

/**
 * clutter_context_get_color_manager:
 *
 * Returns: (transfer none): The %ClutterColorManagerutter/clutter-actor.h"
#include "clutter/clutter-stage.h"
#include <pango/pango.h>

G_BEGIN_DECLS

typedef enum
{
  CLUTTER_DEBUG_MISC                = 1 << 0,
  CLUTTER_DEBUG_ACTOR               = 1 << 1,
  CLUTTER_DEBUG_TEXTURE             = 1 << 2,
  CLUTTER_DEBUG_EVENT               = 1 << 3,
  CLUTTER_DEBUG_PAINT               = 1 << 4,
  CLUTTER_DEBUG_PANGO               = 1 << 5,
  CLUTTER_DEBUG_BACKEND             = 1 << 6,
  CLUTTER_DEBUG_SCHEDULER           = 1 << 7,
  CLUTTER_DEBUG_SCRIPT              = 1 << 8,
  CLUTTER_DEBUG_SHADER              = 1 << 9,
  CLUTTER_DEBUG_MULTISTAGE          = 1 << 10,
  CLUTTER_DEBUG_ANIMATION           = 1 << 11,
  CLUTTER_DEBUG_LAYOUT              = 1 << 12,
  CLUTTER_DEBUG_PICK                = 1 << 13,
  CLUTTER_DEBUG_EVENTLOOP           = 1 << 14,
  CLUTTER_DEBUG_CLIPPING            = 1 << 15,
  CLUTTER_DEBUG_OOB_TRANSFORMS      = 1 << 16,
  CLUTTER_DEBUG_FRAME_TIMINGS       = 1 << 17,
  CLUTTER_DEBUG_DETAILED_TRACE      = 1 << 18,
  CLUTTER_DEBUG_GRABS      ter_event_get_event_sequence        (const ClutterEvent     *event);

CLUTTER_EXPORT
guint32                 clutter_keysym_to_unicode               (guint                   keyval);
CLUTTER_EXPORT
guint                   clutter_unicode_to_keysym               (guint32                 wc);

CLUTTER_EXPORT
guint32                 clutter_get_current_event_time          (void);
CLUTTER_EXPORT
const ClutterEvent *    clutter_get_current_event               (void);

CLUTTER_EXPORT
guint                   clutter_event_get_touchpad_gesture_finger_count (const ClutterEvent  *event);

CLUTTER_EXPORT
gdouble                 clutter_event_get_gesture_pinch_angle_delta  (const ClutterEvent     *event);

CLUTTER_EXPORT
gdouble                 clutter_event_get_gesture_pinch_scale        (const ClutterEvent     *event);

CLUTTER_EXPORT
ClutterTouchpadGesturePhase clutter_event_get_gesture_phase          (const ClutterEvent     *event);

CLUTTER_EXPORT
void                    clutter_event_get_gesture_motion_delta       llocated on the stack;
 * in order to avoid people poking at their internals, we use this macro to
 * ensure that users don't accidentally access a struct private members.
 *
 * we use the CLUTTER_COMPILATION define to allow us easier access, though.
 */
#ifdef CLUTTER_COMPILATION
#define CLUTTER_PRIVATE_FIELD(x)        x
#else
#define CLUTTER_PRIVATE_FIELD(x)        clutter_private_ ## x
#endif

#define _CLUTTER_EXTERN __attribute__((visibility("default"))) extern

#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) || \
  __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4)
#define _CLUTTER_GNUC_DO_PRAGMA(x) _Pragma(G_STRINGIFY (x))
#define _CLUTTER_DEPRECATED_MACRO _CLUTTER_GNUC_DO_PRAGMA(GCC warning "Deprecated macro")
#define _CLUTTER_DEPRECATED_MACRO_FOR(f) _CLUTTER_GNUC_DO_PRAGMA(GCC warning #f)
#else
#define _CLUTTER_DEPRECATED_MACRO
#define _CLUTTER_DEPRECATED_MACRO_FOR(f)
#endif

/* these macros are used to mark deprecated functions, and thus have to be
 * exposed in a publicexture: virtual function
 * @paint_target: virtual function
 *
 * The #ClutterOffscreenEffectClass structure contains only private data
 */
struct _ClutterOffscreenEffectClass
{
  /*< private >*/
  ClutterEffectClass parent_class;

  /*< public >*/
  CoglTexture* (* create_texture) (ClutterOffscreenEffect *effect,
                                   CoglContext            *cogl_context,
                                   gfloat                  width,
                                   gfloat                  height);
  CoglPipeline* (* create_pipeline) (ClutterOffscreenEffect *effect,
                                     CoglTexture            *texture);
  void (* paint_target) (ClutterOffscreenEffect *effect,
                         ClutterPaintNode       *node,
                         ClutterPaintContext    *paint_context);
};

CLUTTER_EXPORT
CoglPipeline *  clutter_offscreen_effect_get_pipeline           (ClutterOffscreenEffect *effect);

CLUTTER_EXPORT
CoglTexture*    clutter_offscreen_effect_get_texturYOUT,
                      ClutterLayoutManager)

CLUTTER_EXPORT
ClutterLayoutManager * clutter_flow_layout_new                (ClutterOrientation      orientation);

CLUTTER_EXPORT
void                   clutter_flow_layout_set_orientation    (ClutterFlowLayout      *layout,
                                                               ClutterOrientation      orientation);
CLUTTER_EXPORT
ClutterOrientation     clutter_flow_layout_get_orientation    (ClutterFlowLayout      *layout);
CLUTTER_EXPORT
void                   clutter_flow_layout_set_homogeneous    (ClutterFlowLayout      *layout,
                                                               gboolean                homogeneous);
CLUTTER_EXPORT
gboolean               clutter_flow_layout_get_homogeneous    (ClutterFlowLayout      *layout);

CLUTTER_EXPORT
void                   clutter_flow_layout_set_column_spacing (ClutterFlowLayout      *layout,
                                                               gfloat                  spacing);
CLUT (ClutterMargin       *margin_);

G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterMargin, clutter_margin_free)

/**
 * ClutterProgressFunc:
 * @a: the initial value of an interval
 * @b: the final value of an interval
 * @progress: the progress factor, between 0 and 1
 * @retval: the value used to store the progress
 *
 * Prototype of the progress function used to compute the value
 * between the two ends @a and @b of an interval depending on
 * the value of @progress.
 *
 * The #GValue in @retval is already initialized with the same
 * type as @a and @b.
 *
 * This function will be called by #ClutterInterval if the
 * type of the values of the interval was registered using
 * [func@Clutter.Interval.register_progress_func].
 *
 * Return value: %TRUE if the function successfully computed
 *   the value and stored it inside @retval
 */
typedef gboolean (* ClutterProgressFunc) (const GValue *a,
                                          const GValue *b,
                                          gdouble       progress,
    tVolume:
 *
 * A #ClutterPaintVolume represents a bounding volume whose internal
 * representation isn't defined but can be set and queried in terms
 * of an axis aligned bounding box.
 *
 * A #ClutterPaintVolume for a [class@Actor]
 * is defined to be relative from the current actor modelview matrix.
 *
 * Other internal representation and methods for describing the
 * bounding volume may be added in the future.
 */
typedef struct _ClutterPaintVolume      ClutterPaintVolume;

/**
 * ClutterActorBox:
 * @x1: X coordinate of the top left corner
 * @y1: Y coordinate of the top left corner
 * @x2: X coordinate of the bottom right corner
 * @y2: Y coordinate of the bottom right corner
 *
 * Bounding box of an actor.
 *
 * The coordinates of the top left and right bottom corners
 * of an actor. The coordinates of the two points are expressed in
 * pixels with sub-pixel precision
 */
struct _ClutterActorBox
{
  gfloat x1;
  gfloat y1;

  gfloat x2;
  gfloat y2;
};

/**
 * CLUTTER_ACTOR_BOX_INIT:
 * @x_1: the X coorclude "clutter/clutter-types.h"

G_BEGIN_DECLS

#define CLUTTER_TYPE_ANIMATABLE (clutter_animatable_get_type ())

CLUTTER_EXPORT
G_DECLARE_INTERFACE (ClutterAnimatable, clutter_animatable,
                     CLUTTER, ANIMATABLE,
                     GObject)

/**
 * ClutterAnimatableInterface:
 * @find_property: virtual function for retrieving the #GParamSpec of
 *   an animatable property
 * @get_initial_state: virtual function for retrieving the initial
 *   state of an animatable property
 * @set_final_state: virtual function for setting the state of an
 *   animatable property
 * @interpolate_value: virtual function for interpolating the progress
 *   of a property
 * @get_actor: virtual function for getting associated actor
 */
struct _ClutterAnimatableInterface
{
  /*< private >*/
  GTypeInterface parent_iface;

  /*< public >*/
  GParamSpec *(* find_property)     (ClutterAnimatable *animatable,
                                     const gchar       *property_name);
  void        (* get_initial_state)oid (* focus_out) (ClutterInputMethod *im);

  void (* reset) (ClutterInputMethod *im);

  void (* set_cursor_location) (ClutterInputMethod    *im,
                                const graphene_rect_t *rect);
  void (* set_surrounding) (ClutterInputMethod *im,
                            const gchar        *text,
                            guint               cursor,
                            guint               anchor);
  void (* update_content_hints) (ClutterInputMethod           *im,
                                 ClutterInputContentHintFlags  hint);
  void (* update_content_purpose) (ClutterInputMethod         *im,
                                   ClutterInputContentPurpose  purpose);

  gboolean (* filter_key_event) (ClutterInputMethod *im,
                                 const ClutterEvent *key);
};

CLUTTER_EXPORT
void clutter_input_method_focus_in  (ClutterInputMethod *im,
                                     ClutterInputFocus  *focus);
CLUTTER_EXPORT
void clutter_input_method_focus_out (Clut*
   * ClutterGestureClass::should_be_influenced_by: (skip)
   */
  void (* should_be_influenced_by) (ClutterGesture *self,
                                    ClutterGesture *other_gesture,
                                    gboolean       *cancelled_on_recognizing);
};

CLUTTER_EXPORT
void clutter_gesture_set_state (ClutterGesture      *self,
                                ClutterGestureState  state);

CLUTTER_EXPORT
ClutterGestureState clutter_gesture_get_state (ClutterGesture *self);

CLUTTER_EXPORT
void clutter_gesture_cancel (ClutterGesture *self);

CLUTTER_EXPORT
void clutter_gesture_reset_state_machine (ClutterGesture *self);

CLUTTER_EXPORT
unsigned int clutter_gesture_get_n_points (ClutterGesture *self);

CLUTTER_EXPORT
unsigned int * clutter_gesture_get_points (ClutterGesture *self,
                                           size_t         *n_points);

CLUTTER_EXPORT
void clutter_gesture_get_point_coords (ClutterGesture   *self,
                                       int               point_indexary. If not, see <http://www.gnu.org/licenses/>.
 *
 * Author: Carlos Garnacho <carlosg@gnome.org>
 */

#pragma once

#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
#error "Only <clutter/clutter.h> can be included directly."
#endif

#include "clutter/clutter-types.h"
#include "clutter/clutter-enum-types.h"

G_BEGIN_DECLS

#define CLUTTER_TYPE_INPUT_DEVICE_TOOL            (clutter_input_device_tool_get_type ())

struct _ClutterInputDeviceToolClass
{
  GObjectClass parent_class;
};

CLUTTER_EXPORT
G_DECLARE_DERIVABLE_TYPE (ClutterInputDeviceTool,
                          clutter_input_device_tool,
                          CLUTTER, INPUT_DEVICE_TOOL,
                          GObject)

CLUTTER_EXPORT
guint64                    clutter_input_device_tool_get_serial    (ClutterInputDeviceTool *tool);

CLUTTER_EXPORT
ClutterInputDeviceToolType clutter_input_device_tool_get_tool_type (ClutterInputDeviceTool *tool);

CLUTTER_EXPORT
guint64                    clutter_input_device_tool_get_id     JECT_BOXED_BOXEDv (GClosure *closure,
                                                 GValue   *return_value,
                                                 gpointer  instance,
                                                 va_list   args,
                                                 gpointer  marshal_data,
                                                 int       n_params,
                                                 GType    *param_types);

/* VOID:OBJECT,FLAGS (../../mutter-47.10/clutter/clutter/clutter-marshal.list:23) */
extern
void _clutter_marshal_VOID__OBJECT_FLAGS (GClosure     *closure,
                                          GValue       *return_value,
                                          guint         n_param_values,
                                          const GValue *param_values,
                                          gpointer      invocation_hint,
                                          gpointer      marshal_data);
extern
void _clutter_marshal_VOID__OBJECT_FLAGSv (hal.list:18) */
extern
void _clutter_marshal_VOID__INT_POINTER (GClosure     *closure,
                                         GValue       *return_value,
                                         guint         n_param_values,
                                         const GValue *param_values,
                                         gpointer      invocation_hint,
                                         gpointer      marshal_data);
extern
void _clutter_marshal_VOID__INT_POINTERv (GClosure *closure,
                                          GValue   *return_value,
                                          gpointer  instance,
                                          va_list   args,
                                          gpointer  marshal_data,
                                          int       n_params,
                                          GType    *param_types);

/* VOID:FLOAT,FLOAT (../../mutter-47.10/clutter/clutter/clutter-marshal.list:19) */
extern
void _clutter_marshal_VOID__FLOAT_FLOAT (GClos,
                                              GValue       *return_value,
                                              guint         n_param_values,
                                              const GValue *param_values,
                                              gpointer      invocation_hint,
                                              gpointer      marshal_data);
extern
void _clutter_marshal_BOOLEAN__BOXED_INT_INTv (GClosure *closure,
                                               GValue   *return_value,
                                               gpointer  instance,
                                               va_list   args,
                                               gpointer  marshal_data,
                                               int       n_params,
                                               GType    *param_types);

/* BOOLEAN:OBJECT,BOOLEAN (../../mutter-47.10/clutter/clutter/clutter-marshal.list:3) */
extern
void _clutter_marshal_BOOLEAN__OBJECT_BOOLEAN (GClosure     *closupes.h"
#include "clutter/clutter-timeline.h"

G_BEGIN_DECLS

#define CLUTTER_TYPE_TRANSITION                 (clutter_transition_get_type ())

CLUTTER_EXPORT
G_DECLARE_DERIVABLE_TYPE (ClutterTransition,
                          clutter_transition,
                          CLUTTER,
                          TRANSITION,
                          ClutterTimeline)

/**
 * ClutterTransitionClass:
 * @attached: virtual function; called when a transition is attached to
 *   a #ClutterAnimatable instance
 * @detached: virtual function; called when a transition is detached from
 *   a #ClutterAnimatable instance
 * @compute_value: virtual function; called each frame to compute and apply
 *   the interpolation of the interval
 *
 * The #ClutterTransitionClass structure contains
 * private data.
 */
struct _ClutterTransitionClass
{
  /*< private >*/
  ClutterTimelineClass parent_class;

  /*< public >*/
  void (* attached) (ClutterTransition *transition,
                     ClutterAnimatable *animatable);
  void (* dtervalClass:
 * @validate: virtual function for validating an interval
 *   using a #GParamSpec
 * @compute_value: virtual function for computing the value
 *   inside an interval using an adimensional factor between 0 and 1
 *
 * The #ClutterIntervalClass contains only private data.
 */
struct _ClutterIntervalClass
{
  /*< private >*/
  GInitiallyUnownedClass parent_class;

  /*< public >*/
  gboolean (* validate)      (ClutterInterval *interval,
                              GParamSpec      *pspec);
  gboolean (* compute_value) (ClutterInterval *interval,
                              gdouble          factor,
                              GValue          *value);
};

CLUTTER_EXPORT
ClutterInterval *clutter_interval_new                (GType            gtype,
                                                      ...);
CLUTTER_EXPORT
ClutterInterval *clutter_interval_new_with_values    (GType            gtype,
                                                      const GValue    *initial,
   
/* enumerations from "clutter-frame-clock.h" */
CLUTTER_EXPORT GType clutter_frame_result_get_type (void) G_GNUC_CONST;
#define CLUTTER_TYPE_FRAME_RESULT (clutter_frame_result_get_type())
CLUTTER_EXPORT GType clutter_frame_clock_mode_get_type (void) G_GNUC_CONST;
#define CLUTTER_TYPE_FRAME_CLOCK_MODE (clutter_frame_clock_mode_get_type())
/* enumerations from "clutter-main.h" */
CLUTTER_EXPORT GType clutter_debug_flag_get_type (void) G_GNUC_CONST;
#define CLUTTER_TYPE_DEBUG_FLAG (clutter_debug_flag_get_type())
CLUTTER_EXPORT GType clutter_pick_debug_flag_get_type (void) G_GNUC_CONST;
#define CLUTTER_TYPE_PICK_DEBUG_FLAG (clutter_pick_debug_flag_get_type())
CLUTTER_EXPORT GType clutter_draw_debug_flag_get_type (void) G_GNUC_CONST;
#define CLUTTER_TYPE_DRAW_DEBUG_FLAG (clutter_draw_debug_flag_get_type())
CLUTTER_EXPORT GType clutter_pipeline_capability_get_type (void) G_GNUC_CONST;
#define CLUTTER_TYPE_PIPELINE_CAPABILITY (clutter_pipeline_capability_get_type())
/* enumerations from "clutter-paint-context.h" */AXIS (clutter_align_axis_get_type())
CLUTTER_EXPORT GType clutter_bind_coordinate_get_type (void) G_GNUC_CONST;
#define CLUTTER_TYPE_BIND_COORDINATE (clutter_bind_coordinate_get_type())
CLUTTER_EXPORT GType clutter_effect_paint_flags_get_type (void) G_GNUC_CONST;
#define CLUTTER_TYPE_EFFECT_PAINT_FLAGS (clutter_effect_paint_flags_get_type())
CLUTTER_EXPORT GType clutter_long_press_state_get_type (void) G_GNUC_CONST;
#define CLUTTER_TYPE_LONG_PRESS_STATE (clutter_long_press_state_get_type())
CLUTTER_EXPORT GType clutter_event_flags_get_type (void) G_GNUC_CONST;
#define CLUTTER_TYPE_EVENT_FLAGS (clutter_event_flags_get_type())
CLUTTER_EXPORT GType clutter_event_type_get_type (void) G_GNUC_CONST;
#define CLUTTER_TYPE_EVENT_TYPE (clutter_event_type_get_type())
CLUTTER_EXPORT GType clutter_scroll_direction_get_type (void) G_GNUC_CONST;
#define CLUTTER_TYPE_SCROLL_DIRECTION (clutter_scroll_direction_get_type())
CLUTTER_EXPORT GType clutter_input_capabilities_get_type (void) G_GNUC_CONST;
#define CLUTTER_TYPE_INPUT_                                    PangoAlignment        alignment);
CLUTTER_EXPORT
PangoAlignment        clutter_text_get_line_alignment   (ClutterText          *self);
CLUTTER_EXPORT
void                  clutter_text_set_justify          (ClutterText          *self,
                                                         gboolean              justify);
CLUTTER_EXPORT
gboolean              clutter_text_get_justify          (ClutterText          *self);

CLUTTER_EXPORT
void                  clutter_text_insert_unichar       (ClutterText          *self,
                                                         gunichar              wc);
CLUTTER_EXPORT
void                  clutter_text_delete_chars         (ClutterText          *self,
                                                         guint                 n_chars);
CLUTTER_EXPORT
void                  clutter_text_insert_text          (ClutterText          *self,
                                                         const gchar          *text,
    tterActor          *actor);
  void     (* gesture_cancel)   (ClutterGestureAction  *action,
                                 ClutterActor          *actor);
  gboolean (* gesture_prepare)  (ClutterGestureAction  *action,
                                 ClutterActor          *actor);
};

CLUTTER_EXPORT
ClutterAction *        clutter_gesture_action_new                      (void);

CLUTTER_EXPORT
gint                   clutter_gesture_action_get_n_touch_points   (ClutterGestureAction *action);
CLUTTER_EXPORT
void                   clutter_gesture_action_set_n_touch_points   (ClutterGestureAction *action,
                                                                    gint                  nb_points);
CLUTTER_EXPORT
void                   clutter_gesture_action_get_press_coords     (ClutterGestureAction *action,
                                                                    guint                 point,
                                                                    gfloat               *press_x,
   TTER_KEY_Armenian_O 0x1000555
#define CLUTTER_KEY_Armenian_o 0x1000585
#define CLUTTER_KEY_Armenian_FE 0x1000556
#define CLUTTER_KEY_Armenian_fe 0x1000586
#define CLUTTER_KEY_Armenian_apostrophe 0x100055a
#define CLUTTER_KEY_Georgian_an 0x10010d0
#define CLUTTER_KEY_Georgian_ban 0x10010d1
#define CLUTTER_KEY_Georgian_gan 0x10010d2
#define CLUTTER_KEY_Georgian_don 0x10010d3
#define CLUTTER_KEY_Georgian_en 0x10010d4
#define CLUTTER_KEY_Georgian_vin 0x10010d5
#define CLUTTER_KEY_Georgian_zen 0x10010d6
#define CLUTTER_KEY_Georgian_tan 0x10010d7
#define CLUTTER_KEY_Georgian_in 0x10010d8
#define CLUTTER_KEY_Georgian_kan 0x10010d9
#define CLUTTER_KEY_Georgian_las 0x10010da
#define CLUTTER_KEY_Georgian_man 0x10010db
#define CLUTTER_KEY_Georgian_nar 0x10010dc
#define CLUTTER_KEY_Georgian_on 0x10010dd
#define CLUTTER_KEY_Georgian_par 0x10010de
#define CLUTTER_KEY_Georgian_zhar 0x10010df
#define CLUTTER_KEY_Georgian_rae 0x10010e0
#define CLUTTER_KEY_Georgian_san 0x10010e1
#define CLUTTER_KEY_Georgian_tar 0x10010e2
#defimaimuan 0xde3
#define CLUTTER_KEY_Thai_saraaimaimalai 0xde4
#define CLUTTER_KEY_Thai_lakkhangyao 0xde5
#define CLUTTER_KEY_Thai_maiyamok 0xde6
#define CLUTTER_KEY_Thai_maitaikhu 0xde7
#define CLUTTER_KEY_Thai_maiek 0xde8
#define CLUTTER_KEY_Thai_maitho 0xde9
#define CLUTTER_KEY_Thai_maitri 0xdea
#define CLUTTER_KEY_Thai_maichattawa 0xdeb
#define CLUTTER_KEY_Thai_thanthakhat 0xdec
#define CLUTTER_KEY_Thai_nikhahit 0xded
#define CLUTTER_KEY_Thai_leksun 0xdf0
#define CLUTTER_KEY_Thai_leknung 0xdf1
#define CLUTTER_KEY_Thai_leksong 0xdf2
#define CLUTTER_KEY_Thai_leksam 0xdf3
#define CLUTTER_KEY_Thai_leksi 0xdf4
#define CLUTTER_KEY_Thai_lekha 0xdf5
#define CLUTTER_KEY_Thai_lekhok 0xdf6
#define CLUTTER_KEY_Thai_lekchet 0xdf7
#define CLUTTER_KEY_Thai_lekpaet 0xdf8
#define CLUTTER_KEY_Thai_lekkao 0xdf9
#define CLUTTER_KEY_Hangul 0xff31
#define CLUTTER_KEY_Hangul_Start 0xff32
#define CLUTTER_KEY_Hangul_End 0xff33
#define CLUTTER_KEY_Hangul_Hanja 0xff34
#define CLUTTER_KEY_Hangul_Jamo 0xff35
#define CLUTTER_KEY_Hangul_R#define CLUTTER_KEY_Greek_finalsmallsigma 0x7f3
#define CLUTTER_KEY_Greek_tau 0x7f4
#define CLUTTER_KEY_Greek_upsilon 0x7f5
#define CLUTTER_KEY_Greek_phi 0x7f6
#define CLUTTER_KEY_Greek_chi 0x7f7
#define CLUTTER_KEY_Greek_psi 0x7f8
#define CLUTTER_KEY_Greek_omega 0x7f9
#define CLUTTER_KEY_Greek_switch 0xff7e
#define CLUTTER_KEY_leftradical 0x8a1
#define CLUTTER_KEY_topleftradical 0x8a2
#define CLUTTER_KEY_horizconnector 0x8a3
#define CLUTTER_KEY_topintegral 0x8a4
#define CLUTTER_KEY_botintegral 0x8a5
#define CLUTTER_KEY_vertconnector 0x8a6
#define CLUTTER_KEY_topleftsqbracket 0x8a7
#define CLUTTER_KEY_botleftsqbracket 0x8a8
#define CLUTTER_KEY_toprightsqbracket 0x8a9
#define CLUTTER_KEY_botrightsqbracket 0x8aa
#define CLUTTER_KEY_topleftparens 0x8ab
#define CLUTTER_KEY_botleftparens 0x8ac
#define CLUTTER_KEY_toprightparens 0x8ad
#define CLUTTER_KEY_botrightparens 0x8ae
#define CLUTTER_KEY_leftmiddlecurlybrace 0x8af
#define CLUTTER_KEY_rightmiddlecurlybrace 0x8b0
#define CLUTTER_KEY_topleftsummation 0x8b1
#defn 0x5ec
#define CLUTTER_KEY_Arabic_kasratan 0x5ed
#define CLUTTER_KEY_Arabic_fatha 0x5ee
#define CLUTTER_KEY_Arabic_damma 0x5ef
#define CLUTTER_KEY_Arabic_kasra 0x5f0
#define CLUTTER_KEY_Arabic_shadda 0x5f1
#define CLUTTER_KEY_Arabic_sukun 0x5f2
#define CLUTTER_KEY_Arabic_madda_above 0x1000653
#define CLUTTER_KEY_Arabic_hamza_above 0x1000654
#define CLUTTER_KEY_Arabic_hamza_below 0x1000655
#define CLUTTER_KEY_Arabic_jeh 0x1000698
#define CLUTTER_KEY_Arabic_veh 0x10006a4
#define CLUTTER_KEY_Arabic_keheh 0x10006a9
#define CLUTTER_KEY_Arabic_gaf 0x10006af
#define CLUTTER_KEY_Arabic_noon_ghunna 0x10006ba
#define CLUTTER_KEY_Arabic_heh_doachashmee 0x10006be
#define CLUTTER_KEY_Farsi_yeh 0x10006cc
#define CLUTTER_KEY_Arabic_farsi_yeh 0x10006cc
#define CLUTTER_KEY_Arabic_yeh_baree 0x10006d2
#define CLUTTER_KEY_Arabic_heh_goal 0x10006c1
#define CLUTTER_KEY_Arabic_switch 0xff7e
#define CLUTTER_KEY_Cyrillic_GHE_bar 0x1000492
#define CLUTTER_KEY_Cyrillic_ghe_bar 0x1000493
#define CLUTTER_KEY_Cyrillic_ZHE_descender 0x100LUTTER_KEY_registered 0x0ae
#define CLUTTER_KEY_macron 0x0af
#define CLUTTER_KEY_degree 0x0b0
#define CLUTTER_KEY_plusminus 0x0b1
#define CLUTTER_KEY_twosuperior 0x0b2
#define CLUTTER_KEY_threesuperior 0x0b3
#define CLUTTER_KEY_acute 0x0b4
#define CLUTTER_KEY_mu 0x0b5
#define CLUTTER_KEY_paragraph 0x0b6
#define CLUTTER_KEY_periodcentered 0x0b7
#define CLUTTER_KEY_cedilla 0x0b8
#define CLUTTER_KEY_onesuperior 0x0b9
#define CLUTTER_KEY_masculine 0x0ba
#define CLUTTER_KEY_guillemotright 0x0bb
#define CLUTTER_KEY_onequarter 0x0bc
#define CLUTTER_KEY_onehalf 0x0bd
#define CLUTTER_KEY_threequarters 0x0be
#define CLUTTER_KEY_questiondown 0x0bf
#define CLUTTER_KEY_Agrave 0x0c0
#define CLUTTER_KEY_Aacute 0x0c1
#define CLUTTER_KEY_Acircumflex 0x0c2
#define CLUTTER_KEY_Atilde 0x0c3
#define CLUTTER_KEY_Adiaeresis 0x0c4
#define CLUTTER_KEY_Aring 0x0c5
#define CLUTTER_KEY_AE 0x0c6
#define CLUTTER_KEY_Ccedilla 0x0c7
#define CLUTTER_KEY_Egrave 0x0c8
#define CLUTTER_KEY_Eacute 0x0c9
#define CLUTTER_KEY_Ecircumflex 0x0ca
#defir_Up 0xfe2e
#define CLUTTER_KEY_ISO_Fast_Cursor_Down 0xfe2f
#define CLUTTER_KEY_ISO_Continuous_Underline 0xfe30
#define CLUTTER_KEY_ISO_Discontinuous_Underline 0xfe31
#define CLUTTER_KEY_ISO_Emphasize 0xfe32
#define CLUTTER_KEY_ISO_Center_Object 0xfe33
#define CLUTTER_KEY_ISO_Enter 0xfe34
#define CLUTTER_KEY_dead_grave 0xfe50
#define CLUTTER_KEY_dead_acute 0xfe51
#define CLUTTER_KEY_dead_circumflex 0xfe52
#define CLUTTER_KEY_dead_tilde 0xfe53
#define CLUTTER_KEY_dead_perispomeni 0xfe53
#define CLUTTER_KEY_dead_macron 0xfe54
#define CLUTTER_KEY_dead_breve 0xfe55
#define CLUTTER_KEY_dead_abovedot 0xfe56
#define CLUTTER_KEY_dead_diaeresis 0xfe57
#define CLUTTER_KEY_dead_abovering 0xfe58
#define CLUTTER_KEY_dead_doubleacute 0xfe59
#define CLUTTER_KEY_dead_caron 0xfe5a
#define CLUTTER_KEY_dead_cedilla 0xfe5b
#define CLUTTER_KEY_dead_ogonek 0xfe5c
#define CLUTTER_KEY_dead_iota 0xfe5d
#define CLUTTER_KEY_dead_voiced_sound 0xfe5e
#define CLUTTER_KEY_dead_semivoiced_sound 0xfe5f
#define CLUTTER_KEY_dead_belowdot 0xfe6r         *source);

CLUTTER_EXPORT
void            clutter_shader_effect_set_uniform       (ClutterShaderEffect *effect,
                                                         const gchar         *name,
                                                         GType                gtype,
                                                         gsize                n_values,
                                                         ...);
CLUTTER_EXPORT
void            clutter_shader_effect_set_uniform_value (ClutterShaderEffect *effect,
                                                         const gchar         *name,
                                                         const GValue        *value);

CLUTTER_EXPORT
CoglShader*     clutter_shader_effect_get_shader        (ClutterShaderEffect *effect);
CLUTTER_EXPORT
CoglProgram*    clutter_shader_effect_get_program       (ClutterShaderEffect *effect);

G_END_DECLS
/* Clutter
 *
 * Copyright (C) 2006, 2007, 2008  OpenedHand Ltd
 * Copyright (C) 2009, 2010  lutter-offscreen-effect.h"

G_BEGIN_DECLS

#define CLUTTER_TYPE_DEFORM_EFFECT              (clutter_deform_effect_get_type ())


/**
 * ClutterTextureVertex:
 * @x: Model x-coordinate
 * @y: Model y-coordinate
 * @z: Model z-coordinate
 * @tx: Texture x-coordinate
 * @ty: Texture y-coordinate
 * @color: The color to use at this vertex. This is ignored if
 *   use_color is %FALSE when calling cogl_polygon()
 *
 * Used to specify vertex information when calling cogl_polygon()
 */
typedef struct _ClutterTextureVertex
{
  float x, y, z;
  float tx, ty;

  CoglColor color;
} ClutterTextureVertex;

#ifndef __GI_SCANNER__
G_STATIC_ASSERT (sizeof (ClutterTextureVertex) == 24);
#endif

CLUTTER_EXPORT
G_DECLARE_DERIVABLE_TYPE (ClutterDeformEffect,
                          clutter_deform_effect,
                          CLUTTER,
                          DEFORM_EFFECT,
                          ClutterOffscreenEffect)

/**
 * ClutterDeformEffectClass:
 * @deform_vertex: virtual function; sub-classes should override th                                                          ClutterActor              **child);
CLUTTER_EXPORT
void                            clutter_actor_iter_remove                       (ClutterActorIter           *iter);
CLUTTER_EXPORT
void                            clutter_actor_iter_destroy                      (ClutterActorIter           *iter);
CLUTTER_EXPORT
gboolean                        clutter_actor_iter_is_valid                     (const ClutterActorIter     *iter);

/* Transformations */
CLUTTER_EXPORT
gboolean                        clutter_actor_is_rotated                        (ClutterActor               *self);
CLUTTER_EXPORT
gboolean                        clutter_actor_is_scaled                         (ClutterActor               *self);
CLUTTER_EXPORT
void                            clutter_actor_set_pivot_point                   (ClutterActor               *self,
                                                                                 gfloat                      pivot_x,
    unset_color_state                 (ClutterActor               *self);

CLUTTER_EXPORT
ClutterColorState *             clutter_actor_get_color_state                   (ClutterActor               *self);

CLUTTER_EXPORT
void                            clutter_actor_get_content_box                   (ClutterActor               *self,
                                                                                 ClutterActorBox            *box);
CLUTTER_EXPORT
void                            clutter_actor_set_background_color              (ClutterActor               *self,
                                                                                 const CoglColor            *color);
CLUTTER_EXPORT
void                            clutter_actor_get_background_color              (ClutterActor               *self,
                                                                                 CoglColor                  *color);
CLUTTER_EXPORT
const ClutterPaintVolume *      clutter_actor_get_paint_volume        y);
CLUTTER_EXPORT
void                            clutter_actor_set_z_position                    (ClutterActor                *self,
                                                                                 gfloat                       z_position);
CLUTTER_EXPORT
gfloat                          clutter_actor_get_z_position                    (ClutterActor                *self);
CLUTTER_EXPORT
void                            clutter_actor_set_layout_manager                (ClutterActor                *self,
                                                                                 ClutterLayoutManager        *manager);
CLUTTER_EXPORT
ClutterLayoutManager *          clutter_actor_get_layout_manager                (ClutterActor                *self);
CLUTTER_EXPORT
void                            clutter_actor_set_x_align                       (ClutterActor                *self,
                                                                                 ClutterActorAlign            x_align       no_layout);
CLUTTER_EXPORT
gboolean                        clutter_actor_is_no_layout                      (ClutterActor               *actor);
CLUTTER_EXPORT
void                            clutter_actor_set_request_mode                  (ClutterActor                *self,
                                                                                 ClutterRequestMode           mode);
CLUTTER_EXPORT
ClutterRequestMode              clutter_actor_get_request_mode                  (ClutterActor                *self);
CLUTTER_EXPORT
void                            clutter_actor_get_preferred_width               (ClutterActor                *self,
                                                                                 gfloat                       for_height,
                                                                                 gfloat                      *min_width_p,
                                                                                 gfloat                      *natural the minimum
 *   and natural heights of an actor for a given width; it is used by
 *   clutter_actor_get_preferred_height()
 * @allocate: virtual function, used when setting the coordinates of an
 *   actor; it is used by clutter_actor_allocate(); when overriding this
 *   function without chaining up, clutter_actor_set_allocation() must be
 *   called and children must be allocated by the implementation, when
 *   chaining up though, those things will be done by the parent's
 *   implementation.
 * @apply_transform: virtual function, used when applying the transformations
 *   to an actor before painting it or when transforming coordinates or
 *   the allocation; if the transformation calculated by this function may
 *   have changed, the cached transformation must be invalidated by calling
 *   clutter_actor_invalidate_transform(); it must chain up to the parent's
 *   implementation
 * @parent_set: signal class handler for the [signal@Clutter.Actor::parent-set]
 * @destroy: signal class handler for [signa      *effect,
                                    ClutterPickContext      *pick_context);
};

CLUTTER_EXPORT
void    clutter_effect_queue_repaint    (ClutterEffect *effect);

/*
 * ClutterActor API
 */

CLUTTER_EXPORT
void           clutter_actor_add_effect            (ClutterActor  *self,
                                                    ClutterEffect *effect);
CLUTTER_EXPORT
void           clutter_actor_add_effect_with_name  (ClutterActor  *self,
                                                    const gchar   *name,
                                                    ClutterEffect *effect);
CLUTTER_EXPORT
void           clutter_actor_remove_effect         (ClutterActor  *self,
                                                    ClutterEffect *effect);
CLUTTER_EXPORT
void           clutter_actor_remove_effect_by_name (ClutterActor  *self,
                                                    const gchar   *name);
CLUTTER_EXPORT
GList *        clutter_actor_get_effects           (ClutterActor  *self);
CLUT
 * Author: Jonas Ã…dahl <jadahl@gmail.com>
 */

#pragma once

#include <glib-object.h>
#include <stdint.h>

#include "clutter/clutter-seat.h"

#define CLUTTER_TYPE_VIRTUAL_INPUT_DEVICE (clutter_virtual_input_device_get_type ())

#define CLUTTER_VIRTUAL_INPUT_DEVICE_MAX_TOUCH_SLOTS 32u

CLUTTER_EXPORT
G_DECLARE_DERIVABLE_TYPE (ClutterVirtualInputDevice,
                          clutter_virtual_input_device,
                          CLUTTER, VIRTUAL_INPUT_DEVICE,
                          GObject)

typedef enum _ClutterButtonState
{
  CLUTTER_BUTTON_STATE_RELEASED,
  CLUTTER_BUTTON_STATE_PRESSED
} ClutterButtonState;

typedef enum _ClutterKeyState
{
  CLUTTER_KEY_STATE_RELEASED,
  CLUTTER_KEY_STATE_PRESSED
} ClutterKeyState;

struct _ClutterVirtualInputDeviceClass
{
  GObjectClass parent_class;

  void (*notify_relative_motion) (ClutterVirtualInputDevice *virtual_device,
                                  uint64_t                   time_us,
                                  double                     dx,
    Emanuele Aina <emanuele.aina@collabora.com>
 *
 * Based on ClutterPanAction
 * Based on ClutterDragAction, ClutterSwipeAction, and MxKineticScrollView,
 * written by:
 *   Emmanuele Bassi <ebassi@linux.intel.com>
 *   Tomeu Vizoso <tomeu.vizoso@collabora.co.uk>
 *   Chris Lord <chris@linux.intel.com>
 */

#pragma once

#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
#error "Only <clutter/clutter.h> can be included directly."
#endif

#include "clutter/clutter-gesture-action.h"

G_BEGIN_DECLS

#define CLUTTER_TYPE_TAP_ACTION               (clutter_tap_action_get_type ())

CLUTTER_EXPORT
G_DECLARE_DERIVABLE_TYPE (ClutterTapAction,
                          clutter_tap_action,
                          CLUTTER,
                          TAP_ACTION,
                          ClutterGestureAction)

/**
 * ClutterTapActionClass:
 * @tap: class handler for the #ClutterTapAction::tap signal
 *
 * The #ClutterTapActionClass structure contains
 * only private data.
 */
struct _ClutterTapActionClass
{AT_UINT8 = 0,
  CLUTTER_ENCODING_REQUIRED_FORMAT_UINT10 = 1,
  CLUTTER_ENCODING_REQUIRED_FORMAT_FP16 = 2,
} ClutterEncodingRequiredFormat;

/**
 * ClutterStepMode:
 * @CLUTTER_STEP_MODE_START: The change in the value of a
 *   %CLUTTER_STEP progress mode should occur at the start of
 *   the transition
 * @CLUTTER_STEP_MODE_END: The change in the value of a
 *   %CLUTTER_STEP progress mode should occur at the end of
 *   the transition
 *
 * Change the value transition of a step function.
 *
 * See clutter_timeline_set_step_progress().
 */
typedef enum
{
  CLUTTER_STEP_MODE_START,
  CLUTTER_STEP_MODE_END
} ClutterStepMode;

/**
 * ClutterGestureTriggerEdge:
 * @CLUTTER_GESTURE_TRIGGER_EDGE_NONE: Tell #ClutterGestureAction that
 * the gesture must begin immediately and there's no drag limit that
 * will cause its cancellation;
 * @CLUTTER_GESTURE_TRIGGER_EDGE_AFTER: Tell #ClutterGestureAction that
 * it needs to wait until the drag threshold has been exceeded before
 * considering that the gesture has begun;
 UTTER_TOUCHPAD_HOLD,
  CLUTTER_PROXIMITY_IN,
  CLUTTER_PROXIMITY_OUT,
  CLUTTER_PAD_BUTTON_PRESS,
  CLUTTER_PAD_BUTTON_RELEASE,
  CLUTTER_PAD_STRIP,
  CLUTTER_PAD_RING,
  CLUTTER_DEVICE_ADDED,
  CLUTTER_DEVICE_REMOVED,
  CLUTTER_IM_COMMIT,
  CLUTTER_IM_DELETE,
  CLUTTER_IM_PREEDIT,

  CLUTTER_EVENT_LAST            /* helper */
} ClutterEventType;

/**
 * ClutterScrollDirection:
 * @CLUTTER_SCROLL_UP: Scroll up
 * @CLUTTER_SCROLL_DOWN: Scroll down
 * @CLUTTER_SCROLL_LEFT: Scroll left
 * @CLUTTER_SCROLL_RIGHT: Scroll right
 * @CLUTTER_SCROLL_SMOOTH: Precise scrolling delta (available in 1.10)
 *
 * Direction of a pointer scroll event.
 *
 * The %CLUTTER_SCROLL_SMOOTH value implies that the #ClutterScrollEvent
 * has precise scrolling delta information.
 */
typedef enum /*< prefix=CLUTTER_SCROLL >*/
{
  CLUTTER_SCROLL_UP,
  CLUTTER_SCROLL_DOWN,
  CLUTTER_SCROLL_LEFT,
  CLUTTER_SCROLL_RIGHT,
  CLUTTER_SCROLL_SMOOTH
} ClutterScrollDirection;

/**
 * ClutterInputDeviceCapabilities:
 * @CLUTTER_INPUT_CAPABILITY_NONEPE_GESTURE:
 *
 * Pointer accessibility timeout type.
 *
 */
typedef enum {
  CLUTTER_A11Y_TIMEOUT_TYPE_SECONDARY_CLICK,
  CLUTTER_A11Y_TIMEOUT_TYPE_DWELL,
  CLUTTER_A11Y_TIMEOUT_TYPE_GESTURE,
} ClutterPointerA11yTimeoutType;

/**
 * ClutterOffscreenRedirect:
 * @CLUTTER_OFFSCREEN_REDIRECT_AUTOMATIC_FOR_OPACITY: Only redirect
 *   the actor if it is semi-transparent and its has_overlaps()
 *   virtual returns %TRUE.
 * @CLUTTER_OFFSCREEN_REDIRECT_ALWAYS: Always redirect the actor to an
 *   offscreen buffer even if it is fully opaque.
 * @CLUTTER_OFFSCREEN_REDIRECT_ON_IDLE: Only redirect the actor if it is the
 *   most efficient thing to do based on its recent repaint behaviour. That
 *   means when its contents are changing less frequently than it's being used
 *   on stage.
 *
 * Possible flags to pass to clutter_actor_set_offscreen_redirect().
 */
typedef enum /*< prefix=CLUTTER_OFFSCREEN_REDIRECT >*/
{
  CLUTTER_OFFSCREEN_REDIRECT_AUTOMATIC_FOR_OPACITY = 1 << 0,
  CLUTTER_OFFSCREEN_REDIRECT_ALWAYS       the Y axis
 * @CLUTTER_Z_AXIS: Rotate around the Z axis
 *
 * Axis of a rotation.
 */
typedef enum /*< prefix=CLUTTER >*/
{
  CLUTTER_X_AXIS,
  CLUTTER_Y_AXIS,
  CLUTTER_Z_AXIS
} ClutterRotateAxis;

/**
 * ClutterRequestMode:
 * @CLUTTER_REQUEST_HEIGHT_FOR_WIDTH: Height for width requests
 * @CLUTTER_REQUEST_WIDTH_FOR_HEIGHT: Width for height requests
 * @CLUTTER_REQUEST_CONTENT_SIZE: Use the preferred size of the
 *   #ClutterContent, if it has any (available since 1.22)
 *
 * Specifies the type of requests for a #ClutterActor.
 */
typedef enum /*< prefix=CLUTTER_REQUEST >*/
{
  CLUTTER_REQUEST_HEIGHT_FOR_WIDTH,
  CLUTTER_REQUEST_WIDTH_FOR_HEIGHT,
  CLUTTER_REQUEST_CONTENT_SIZE
} ClutterRequestMode;

/**
 * ClutterAnimationMode:
 * @CLUTTER_CUSTOM_MODE: custom progress function
 * @CLUTTER_LINEAR: linear tweening
 * @CLUTTER_EASE_IN_QUAD: quadratic tweening
 * @CLUTTER_EASE_OUT_QUAD: quadratic tweening, inverse of
 *    %CLUTTER_EASE_IN_QUAD
 * @CLUTTER_EASE_IN_OUT_QUAD: quadratic tweening, combininig
 *                  clutter_constraint,
                          CLUTTER,
                          CONSTRAINT,
                          ClutterActorMeta)

/**
 * ClutterConstraintClass:
 * @update_allocation: virtual function used to update the allocation
 *   of the #ClutterActor using the #ClutterConstraint
 * @update_preferred_size: virtual function used to update the preferred
 *   size of the #ClutterActor using the #ClutterConstraint; optional,
 *   since 1.22
 *
 * The #ClutterConstraintClass structure contains
 * only private data
 */
struct _ClutterConstraintClass
{
  /*< private >*/
  ClutterActorMetaClass parent_class;

  /*< public >*/
  void (* update_allocation) (ClutterConstraint *constraint,
                              ClutterActor      *actor,
                              ClutterActorBox   *allocation);

  void (* update_preferred_size) (ClutterConstraint  *constraint,
                                  ClutterActor       *actor,
                                  ClutterOrientation  direction,xupper = CLUTTER_KEY_Aogonek;
      else if (symbol >= CLUTTER_KEY_lstroke && symbol <= CLUTTER_KEY_sacute)
        xupper -= (CLUTTER_KEY_lstroke - CLUTTER_KEY_Lstroke);
      else if (symbol >= CLUTTER_KEY_scaron && symbol <= CLUTTER_KEY_zacute)
        xupper -= (CLUTTER_KEY_scaron - CLUTTER_KEY_Scaron);
      else if (symbol >= CLUTTER_KEY_zcaron && symbol <= CLUTTER_KEY_zabovedot)
        xupper -= (CLUTTER_KEY_zcaron - CLUTTER_KEY_Zcaron);
      else if (symbol >= CLUTTER_KEY_Racute && symbol <= CLUTTER_KEY_Tcedilla)
        xlower += (CLUTTER_KEY_racute - CLUTTER_KEY_Racute);
      else if (symbol >= CLUTTER_KEY_racute && symbol <= CLUTTER_KEY_tcedilla)
        xupper -= (CLUTTER_KEY_racute - CLUTTER_KEY_Racute);
      break;

    case 2: /* Latin 3 */
      /* Assume the KeySym is a legal value (ignore discontinuities) */
      if (symbol >= CLUTTER_KEY_Hstroke && symbol <= CLUTTER_KEY_Hcircumflex)
        xlower += (CLUTTER_KEY_hstroke - CLUTTER_KEY_Hstroke);
      else if (symbol >= CLUTTER_KEY_Gbres_redraw_queued_on_view          (ClutterStage          *stage,
                                                                 ClutterStageView      *view);
CLUTTER_EXPORT
void clutter_stage_schedule_update (ClutterStage *stage);

CLUTTER_EXPORT
gboolean clutter_stage_get_capture_final_size (ClutterStage *stage,
                                               MtkRectangle *rect,
                                               int          *out_width,
                                               int          *out_height,
                                               float        *out_scale);

CLUTTER_EXPORT
void clutter_stage_paint_to_framebuffer (ClutterStage       *stage,
                                         CoglFramebuffer    *framebuffer,
                                         const MtkRectangle *rect,
                                         float               scale,
                                         ClutterPaintFlag    paint_flags);

CLUTTER_EXPORT
gboolean clutter_stage_paint_to_buffer           float        y);

  gboolean (* query_state) (ClutterSeat          *seat,
                            ClutterInputDevice   *device,
                            ClutterEventSequence *sequence,
                            graphene_point_t     *coords,
                            ClutterModifierType  *modifiers);

  ClutterGrabState (* grab) (ClutterSeat *seat,
                             uint32_t     time);
  void (* ungrab) (ClutterSeat *seat,
                   uint32_t     time);

  /* Virtual devices */
  ClutterVirtualInputDevice * (* create_virtual_device) (ClutterSeat            *seat,
                                                         ClutterInputDeviceType  device_type);
  ClutterVirtualDeviceType (* get_supported_virtual_device_types) (ClutterSeat *seat);
};

CLUTTER_EXPORT
ClutterContext * clutter_seat_get_context (ClutterSeat *seat);
CLUTTER_EXPORT
ClutterInputDevice * clutter_seat_get_pointer  (ClutterSeat *seat);
CLUTTER_EXPORT
ClutterInputDevice * clutter_seat_get_keyboard (Clutt (ClutterTimeline  *timeline,
                                                                                 graphene_point_t *c_1,
                                                                                 graphene_point_t *c_2);

CLUTTER_EXPORT
gint64                          clutter_timeline_get_duration_hint              (ClutterTimeline          *timeline);
CLUTTER_EXPORT
gint                            clutter_timeline_get_current_repeat             (ClutterTimeline          *timeline);

CLUTTER_EXPORT
ClutterFrameClock *             clutter_timeline_get_frame_clock                (ClutterTimeline           *timeline);

CLUTTER_EXPORT
void                            clutter_timeline_set_frame_clock                (ClutterTimeline           *timeline,
                                                                                 ClutterFrameClock         *frame_clock);

G_END_DECLS
/*
 * Clutter.
 *
 * An OpenGL based 'interactive canvas' library.
 *
 * Copyright (C) 2010  Intel Corporation.
 *    ClutterPaintContext *paint_context);

  void          (* attached)            (ClutterContent   *content,
                                         ClutterActor     *actor);
  void          (* detached)            (ClutterContent   *content,
                                         ClutterActor     *actor);

  void          (* invalidate)          (ClutterContent   *content);

  void          (* invalidate_size)     (ClutterContent   *content);
};

CLUTTER_EXPORT
gboolean        clutter_content_get_preferred_size      (ClutterContent *content,
                                                         gfloat         *width,
                                                         gfloat         *height);
CLUTTER_EXPORT
void            clutter_content_invalidate              (ClutterContent *content);

CLUTTER_EXPORT
void            clutter_content_invalidate_size         (ClutterContent *content);

G_END_DECLS
/*
 * Clutter.
 *
 * An OpenGL based 'interactive canvas' library.
 *
 * Copyright (C) 2008  Intel ttp://www.gnu.org/licenses/>.
 *
 * Author:
 *   Emmanuele Bassi <ebassi@linux.intel.com>
 */

#pragma once

#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
#error "Only <clutter/clutter.h> can be included directly."
#endif

#include "cogl/cogl.h"
#include "clutter/clutter-types.h"

G_BEGIN_DECLS

#define CLUTTER_TYPE_PAINT_NODE                 (clutter_paint_node_get_type ())
#define CLUTTER_PAINT_NODE(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_PAINT_NODE, ClutterPaintNode))
#define CLUTTER_IS_PAINT_NODE(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_PAINT_NODE))

typedef struct _ClutterPaintNodePrivate ClutterPaintNodePrivate;
typedef struct _ClutterPaintNodeClass   ClutterPaintNodeClass;

CLUTTER_EXPORT
GType clutter_paint_node_get_type (void) G_GNUC_CONST;

CLUTTER_EXPORT
ClutterPaintNode *      clutter_paint_node_ref                          (ClutterPaintNode      *node);
CLUTTER_EXPORT
void                    clutter_paint_node_unref    
G_BEGIN_DECLS

#define CLUTTER_TYPE_TEXT_BUFFER            (clutter_text_buffer_get_type ())

CLUTTER_EXPORT
G_DECLARE_DERIVABLE_TYPE (ClutterTextBuffer,
                          clutter_text_buffer,
                          CLUTTER,
                          TEXT_BUFFER,
                          GObject)

/**
 * CLUTTER_TEXT_BUFFER_MAX_SIZE:
 *
 * Maximum size of text buffer, in bytes.
 */
#define CLUTTER_TEXT_BUFFER_MAX_SIZE        G_MAXUSHORT

/**
 * ClutterTextBufferClass:
 * @inserted_text: default handler for the #ClutterTextBuffer::inserted-text signal
 * @deleted_text: default handler for the #ClutterTextBuffer::deleted-text signal
 * @get_text: virtual function
 * @get_length: virtual function
 * @insert_text: virtual function
 * @delete_text: virtual function
 *
 * The #ClutterTextBufferClass structure contains
 * only private data.
 */
struct _ClutterTextBufferClass
{
  /*< private >*/
  GObjectClass parent_class;

  /*< public >*/
  /* Signals */
  void         (*inserted_text)          (Cluttby Mutter to compute which windows should be mapped
 * @META_LATER_CHECK_FULLSCREEN: used by Mutter to see if there's a fullscreen window
 * @META_LATER_SYNC_STACK: used by Mutter to send it's idea of the stacking order to the server
 * @META_LATER_BEFORE_REDRAW: call before the stage is redrawn
 * @META_LATER_IDLE: call at a very low priority (can be blocked
 *    by running animations or redrawing applications)
 **/
typedef enum
{
  META_LATER_RESIZE,
  META_LATER_CALC_SHOWING,
  META_LATER_CHECK_FULLSCREEN,
  META_LATER_SYNC_STACK,
  META_LATER_BEFORE_REDRAW,
  META_LATER_IDLE
} MetaLaterType;

#define META_TYPE_LATERS (meta_laters_get_type ())
META_EXPORT
G_DECLARE_FINAL_TYPE (MetaLaters, meta_laters, META, LATERS, GObject)

META_EXPORT
unsigned int meta_laters_add (MetaLaters     *laters,
                              MetaLaterType   when,
                              GSourceFunc     func,
                              gpointer        user_data,
                              GDestroyNotify  notify);

MElags  flags);

META_EXPORT
gboolean meta_display_ungrab_accelerator (MetaDisplay *display,
                                          guint        action_id);

META_EXPORT
guint meta_display_get_keybinding_action (MetaDisplay  *display,
                                          unsigned int  keycode,
                                          unsigned long mask);

META_EXPORT
ClutterModifierType meta_display_get_compositor_modifiers (MetaDisplay *display);

META_EXPORT
GSList *meta_display_sort_windows_by_stacking (MetaDisplay *display,
                                               GSList      *windows);

META_EXPORT
void meta_display_clear_mouse_mode (MetaDisplay *display);

META_EXPORT
gboolean meta_display_is_pointer_emulating_sequence (MetaDisplay          *display,
                                                     ClutterEventSequence *sequence);

META_EXPORT
void    meta_display_request_pad_osd      (MetaDisplay        *display,
                                           ClutterInputDevice *pad,
     )
 * @META_TAB_SHOW_INSTANTLY: Show instantly (Alt-Esc mode)
 */
typedef enum
{
  META_TAB_SHOW_ICON,      /* Alt-Tab mode */
  META_TAB_SHOW_INSTANTLY  /* Alt-Esc mode */
} MetaTabShowType;

typedef enum
{
  META_PAD_FEATURE_RING,
  META_PAD_FEATURE_STRIP,
} MetaPadFeatureType;

typedef enum
{
  META_PAD_DIRECTION_UP = 1,
  META_PAD_DIRECTION_DOWN,
  META_PAD_DIRECTION_CW,
  META_PAD_DIRECTION_CCW,
} MetaPadDirection;

typedef struct _MetaDisplayClass MetaDisplayClass;

#define META_TYPE_DISPLAY              (meta_display_get_type ())
#define META_DISPLAY(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), META_TYPE_DISPLAY, MetaDisplay))
#define META_DISPLAY_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DISPLAY, MetaDisplayClass))
#define META_IS_DISPLAY(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), META_TYPE_DISPLAY))
#define META_IS_DISPLAY_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DISPLAY))
#define META_DISPLAY_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS (MetaWorkspaceManager,
                      meta_workspace_manager,
                      META, WORKSPACE_MANAGER,
                      GObject)

META_EXPORT
GList *meta_workspace_manager_get_workspaces (MetaWorkspaceManager *workspace_manager);

META_EXPORT
int meta_workspace_manager_get_n_workspaces (MetaWorkspaceManager *workspace_manager);

META_EXPORT
MetaWorkspace* meta_workspace_manager_get_workspace_by_index (MetaWorkspaceManager *workspace_manager,
                                                              int                   index);

META_EXPORT
void meta_workspace_manager_remove_workspace (MetaWorkspaceManager *workspace_manager,
                                              MetaWorkspace        *workspace,
                                              guint32               timestamp);

META_EXPORT
MetaWorkspace *meta_workspace_manager_append_new_workspace (MetaWorkspaceManager *workspace_manager,
                                                            gboolean              activate,
     = META_DIRECTION_LEFT,
  META_SIDE_RIGHT           = META_DIRECTION_RIGHT,
  META_SIDE_TOP             = META_DIRECTION_TOP,
  META_SIDE_BOTTOM          = META_DIRECTION_BOTTOM
} MetaSide;

/**
 * MetaButtonFunction:
 * @META_BUTTON_FUNCTION_MENU: Menu
 * @META_BUTTON_FUNCTION_MINIMIZE: Minimize
 * @META_BUTTON_FUNCTION_MAXIMIZE: Maximize
 * @META_BUTTON_FUNCTION_CLOSE: Close
 * @META_BUTTON_FUNCTION_LAST: Marks the end of the #MetaButtonFunction enumeration
 *
 * Function a window button can have.
 *
 * Note, you can't add stuff here without extending the theme format
 * to draw a new function and breaking all existing themes.
 */
typedef enum
{
  META_BUTTON_FUNCTION_MENU,
  META_BUTTON_FUNCTION_MINIMIZE,
  META_BUTTON_FUNCTION_MAXIMIZE,
  META_BUTTON_FUNCTION_CLOSE,
  META_BUTTON_FUNCTION_LAST
} MetaButtonFunction;

/**
 * MetaWindowMenuType:
 * @META_WINDOW_MENU_WM: the window manager menu
 * @META_WINDOW_MENU_APP: the (fallback) app menu
 *
 * Menu the compositor should display for a given window
 */
ty   MetaWindowActor *actor);

META_EXPORT
void
meta_plugin_size_change_completed (MetaPlugin      *plugin,
                                   MetaWindowActor *actor);

META_EXPORT
void
meta_plugin_map_completed (MetaPlugin      *plugin,
                           MetaWindowActor *actor);

META_EXPORT
void
meta_plugin_destroy_completed (MetaPlugin      *plugin,
                               MetaWindowActor *actor);

META_EXPORT
void
meta_plugin_complete_display_change (MetaPlugin *plugin,
                                     gboolean    ok);

META_EXPORT
MetaDisplay *meta_plugin_get_display (MetaPlugin *plugin);

void _meta_plugin_set_compositor (MetaPlugin *plugin, MetaCompositor *compositor);

/* XXX: Putting this in here so it's in the public header. */
META_EXPORT
void     meta_plugin_manager_set_plugin_type (GType gtype);
/*
 * shaped texture
 *
 * An actor to draw a texture clipped to a list of rectangles
 *
 * Authored By Neil Roberts  <neil@linux.intel.com>
 *
 * Copyright (C) 2008 Intel Corporation
 *                   MetaWindowActor    *actor);

  /**
   * MetaPluginClass::switch_workspace:
   * @from: origin workspace
   * @to: destination workspace
   * @direction: a #MetaMotionDirection
   *
   * Virtual function called when the window represented by @actor is destroyed.
   */
  void (*switch_workspace) (MetaPlugin         *plugin,
                            gint                from,
                            gint                to,
                            MetaMotionDirection direction);

  void (*show_tile_preview) (MetaPlugin      *plugin,
                             MetaWindow      *window,
                             MtkRectangle    *tile_rect,
                             int              tile_monitor_number);
  void (*hide_tile_preview) (MetaPlugin      *plugin);

  void (*show_window_menu)  (MetaPlugin         *plugin,
                             MetaWindow         *window,
                             MetaWindowMenuType  menu,
                             int                 x,
    A_TYPE_KEYBOARD_A11Y_FLAGS (meta_keyboard_a11y_flags_get_type())
/* enumerations from "meta-inhibit-shortcuts-dialog.h" */
META_EXPORT GType meta_inhibit_shortcuts_dialog_response_get_type (void) G_GNUC_CONST;
#define META_TYPE_INHIBIT_SHORTCUTS_DIALOG_RESPONSE (meta_inhibit_shortcuts_dialog_response_get_type())
/* enumerations from "meta-later.h" */
META_EXPORT GType meta_later_type_get_type (void) G_GNUC_CONST;
#define META_TYPE_LATER_TYPE (meta_later_type_get_type())
/* enumerations from "meta-monitor-manager.h" */
META_EXPORT GType meta_monitor_switch_config_type_get_type (void) G_GNUC_CONST;
#define META_TYPE_MONITOR_SWITCH_CONFIG_TYPE (meta_monitor_switch_config_type_get_type())
META_EXPORT GType meta_power_save_change_reason_get_type (void) G_GNUC_CONST;
#define META_TYPE_POWER_SAVE_CHANGE_REASON (meta_power_save_change_reason_get_type())
/* enumerations from "meta-multi-texture-format.h" */
META_EXPORT GType meta_multi_texture_format_get_type (void) G_GNUC_CONST;
#define META_TYPE_MULTI_TEXTURE_FORMAT      = 1 << 1,
  META_KEY_BINDING_IS_REVERSED  = 1 << 2,
  META_KEY_BINDING_NON_MASKABLE = 1 << 3,
  META_KEY_BINDING_IGNORE_AUTOREPEAT = 1 << 4,
  META_KEY_BINDING_NO_AUTO_GRAB = 1 << 5,
  META_KEY_BINDING_CUSTOM_TRIGGER = 1 << 6,
  META_KEY_BINDING_TRIGGER_RELEASE = 1 << 7,
} MetaKeyBindingFlags;

/**
 * MetaKeyHandlerFunc:
 * @display: a #MetaDisplay
 * @window: a #MetaWindow
 * @event: (type gpointer): a #ClutterKeyEvent
 * @binding: a #MetaKeyBinding
 * @user_data: data passed to the function
 *
 */
typedef void (* MetaKeyHandlerFunc) (MetaDisplay           *display,
                                     MetaWindow            *window,
                                     const ClutterKeyEvent *event,
                                     MetaKeyBinding        *binding,
                                     gpointer               user_data);

META_EXPORT
GType meta_key_binding_get_type    (void);

META_EXPORT
MetaKeyBindingAction meta_prefs_get_keybinding_action (const char *name);

META_EXPORT
char * meta_META_EXPORT
GDesktopTitlebarAction      meta_prefs_get_action_right_click_titlebar (void);

META_EXPORT
void meta_prefs_set_num_workspaces (int n_workspaces);

META_EXPORT
const char* meta_prefs_get_workspace_name    (int         i);

META_EXPORT
void        meta_prefs_change_workspace_name (int         i,
                                              const char *name);

META_EXPORT
const char* meta_prefs_get_cursor_theme      (void);

META_EXPORT
int         meta_prefs_get_cursor_size       (void);

META_EXPORT
gboolean    meta_prefs_get_compositing_manager (void);

META_EXPORT
gboolean    meta_prefs_get_force_fullscreen  (void);

META_EXPORT
void meta_prefs_set_force_fullscreen (gboolean whether);

META_EXPORT
gboolean meta_prefs_get_workspaces_only_on_primary (void);

META_EXPORT
int      meta_prefs_get_draggable_border_width (void);

META_EXPORT
int      meta_prefs_get_drag_threshold (void);

/**
 * MetaKeyBindingAction:
 * @META_KEYBINDING_ACTION_NONE: FILLME
 * @META_KEYBINDING_ACTION_WORKSPACE_1: FILLMd            *self,
                                   GFile                     *file1,
                                   GFile                     *file2,
                                   double                     blend_factor,
                                   GDesktopBackgroundStyle    style);
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */

#pragma once

#include "clutter/clutter.h"

#include "meta/common.h"

#define META_TYPE_BACKGROUND_GROUP (meta_background_group_get_type ())

META_EXPORT
G_DECLARE_DERIVABLE_TYPE (MetaBackgroundGroup,
                          meta_background_group,
                          META, BACKGROUND_GROUP,
                          ClutterActor)

struct _MetaBackgroundGroupClass
{
  ClutterActorClass parent_class;
};

META_EXPORT
ClutterActor *meta_background_group_new (void);
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */

/* Mutter preferences */

/*
 * Copyright (C) 2001 Havoc Pennington
 * Copyright (C) 2006 Elijah Newren
 *
 * ction_get_mimetypes        (MetaSelection        *selection,
                                              MetaSelectionType     selection_type);

META_EXPORT
void     meta_selection_transfer_async       (MetaSelection        *selection,
                                              MetaSelectionType     selection_type,
                                              const gchar          *mimetype,
                                              gssize                size,
                                              GOutputStream        *output,
                                              GCancellable         *cancellable,
                                              GAsyncReadyCallback   callback,
                                              gpointer              user_data);
META_EXPORT
gboolean meta_selection_transfer_finish      (MetaSelection        *selection,
                                              GAsyncResult         *result,
                                              GError              **_REDRAW.
 *
 * Note that its usually better to use meta_laters_add() rather
 * than calling g_idle_add() directly; this will make sure things
 * get run when added from a clutter event handler without
 * waiting for another repaint cycle.
 *
 * If something has a priority lower than the redraw priority
 * (such as a default priority idle), then it may be arbitrarily
 * delayed. This happens if the screen is updating rapidly: we
 * are spending all our time either redrawing or waiting for a
 * vblank-synced buffer swap. (When X is improved to allow
 * clutter to do the buffer-swap asynchronously, this will get
 * better.)
 */

/* G_PRIORITY_DEFAULT:
 *  events
 *  many timeouts
 */

/* GTK_PRIORITY_RESIZE:         (G_PRIORITY_HIGH_IDLE + 10) */
#define META_PRIORITY_RESIZE    (G_PRIORITY_HIGH_IDLE + 15)
/* GTK_PRIORITY_REDRAW:         (G_PRIORITY_HIGH_IDLE + 20) */

#define META_PRIORITY_BEFORE_REDRAW  (G_PRIORITY_HIGH_IDLE + 40)
/*  calc-showing idle
 *  update-icon idle
 */

/* CLUTTER_PRIORITY_REDRAW:     (et_type ())

META_EXPORT
GType meta_barrier_event_get_type (void) G_GNUC_CONST;

G_END_DECLS
/*
 * Copyright (C) 2019 Red Hat Inc.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
 *
 */

#pragma once

#include <glib-object.h>

#include "meta/common.h"
#include "meta/types.h"

#define META_TYPE_CONTEXT (meta_context_get_type ())
META_EXPORT
G_DECLARE_DERIVABLE_TYPE (MetaContext, meta_context, META, CONTEXT, GObject)

METAPORT
void meta_sound_player_play_from_file  (MetaSoundPlayer *player,
                                        GFile           *file,
                                        const char      *description,
                                        GCancellable    *cancellable);
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; c-basic-offset: 2; -*- */

#pragma once

#include <glib-object.h>

#include "meta/display.h"

G_BEGIN_DECLS

/**
 * MetaBarrierDirection:
 * @META_BARRIER_DIRECTION_POSITIVE_X: Positive direction in the X axis
 * @META_BARRIER_DIRECTION_POSITIVE_Y: Positive direction in the Y axis
 * @META_BARRIER_DIRECTION_NEGATIVE_X: Negative direction in the X axis
 * @META_BARRIER_DIRECTION_NEGATIVE_Y: Negative direction in the Y axis
 */

/* Keep in sync with XFixes */
typedef enum
{
  META_BARRIER_DIRECTION_POSITIVE_X = 1 << 0,
  META_BARRIER_DIRECTION_POSITIVE_Y = 1 << 1,
  META_BARRIER_DIRECTION_NEGATIVE_X = 1 << 2,
  META_BARRIER_DIRECTION_NEGATIVE_Y = 1 << 3,
} MetaBarrierDirection;

type                                   gint        space_index,
                                            gboolean    append);

META_EXPORT
void meta_window_change_workspace          (MetaWindow  *window,
                                            MetaWorkspace *workspace);

META_EXPORT
GObject *meta_window_get_compositor_private (MetaWindow *window);

META_EXPORT
void meta_window_set_compositor_private (MetaWindow *window, GObject *priv);

META_EXPORT
const char *meta_window_get_role (MetaWindow *window);

META_EXPORT
MetaStackLayer meta_window_get_layer (MetaWindow *window);

META_EXPORT
MetaWindow* meta_window_find_root_ancestor    (MetaWindow *window);

META_EXPORT
gboolean meta_window_is_ancestor_of_transient (MetaWindow            *window,
                                               MetaWindow            *transient);

typedef gboolean (*MetaWindowForeachFunc) (MetaWindow *window,
                                           void       *user_data);

META_EXPORT
void     meta_window_foreach_transient     * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 */

#pragma once

#if !defined(__MTK_H_INSIDE__) && !defined(MTK_COMPILATION)
#error "Only <mtk/mtk.h> can be included directly."
#endif

#define MTK_EXPORT __attribute__((visibility ("default"))) extern

/* MTK_EXPORT_TEST should be used to export symbols that are exported only
 * for testability purposes
 */
#define MTK_EXPORT_TEST MTK_EXPORT
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */

#pragma once

#include "clutter/clutter.h"

#define META_TYPE_WINDOW_GROUP (meta_window_group_get_type())

META_EXPORT
G_DECLARE_FINAL_TYPE (MetaWindowGroup,
                      meta_window_group,
                      META, WINDOW_GROUP,
                      ClutterActor)
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */

/*
 * Copyright (C) 2008 Iain Holmes
 *
 * This program is fre,
                                             graphene_matrix_t   *matrix);

MTK_EXPORT
const char * mtk_monitor_transform_to_string (MtkMonitorTransform transform);

MTK_EXPORT
MtkMonitorTransform mtk_monitor_transform_from_string (const char *name);
/*
 * Mtk
 *
 * A low-level base library.
 *
 * Copyright (C) 2023 Red Hat
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should hav