/* GDK - The GIMP Drawing Kit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * 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 have received a copy of the GNU Lesser General Public * License along with this library. If not, see . */ /* * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog * files for a list of changes. These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ /* Uninstalled header defining types and functions internal to GDK */ #ifndef __GDK_INTERNALS_H__ #define __GDK_INTERNALS_H__ #include #include "gdkdisplay.h" #include "gdkeventsprivate.h" #include "gdksurfaceprivate.h" #include "gdkenumtypes.h" #include "gdkdragprivate.h" #include "gdkkeysprivate.h" G_BEGIN_DECLS /********************** * General Facilities * **********************/ /* Debugging support */ typedef enum { GDK_DEBUG_MISC = 1 << 0, GDK_DEBUG_EVENTS = 1 << 1, GDK_DEBUG_DND = 1 << 2, GDK_DEBUG_INPUT = 1 << 3, GDK_DEBUG_EVENTLOOP = 1 << 4, GDK_DEBUG_FRAMES = 1 << 5, GDK_DEBUG_SETTINGS = 1 << 6, GDK_DEBUG_OPENGL = 1 << 7, GDK_DEBUG_VULKAN = 1 << 8, GDK_DEBUG_SELECTION = 1 << 9, GDK_DEBUG_CLIPBOARD = 1 << 10, /* flags below are influencing behavior */ GDK_DEBUG_NOGRABS = 1 << 11, GDK_DEBUG_GL_DISABLE = 1 << 12, GDK_DEBUG_GL_SOFTWARE = 1 << 13, GDK_DEBUG_GL_TEXTURE_RECT = 1 << 14, GDK_DEBUG_GL_LEGACY = 1 << 15, GDK_DEBUG_GL_GLES = 1 << 16, GDK_DEBUG_GL_DEBUG = 1 << 17, GDK_DEBUG_VULKAN_DISABLE = 1 << 18, GDK_DEBUG_VULKAN_VALIDATE = 1 << 19, GDK_DEBUG_DEFAULT_SETTINGS= 1 << 20 } GdkDebugFlags; extern guint _gdk_debug_flags; GdkDebugFlags gdk_display_get_debug_flags (GdkDisplay *display); void gdk_display_set_debug_flags (GdkDisplay *display, GdkDebugFlags flags); #ifdef G_ENABLE_DEBUG #define GDK_DISPLAY_DEBUG_CHECK(display,type) \ G_UNLIKELY (gdk_display_get_debug_flags (display) & GDK_DEBUG_##type) #define GDK_DISPLAY_NOTE(display,type,action) G_STMT_START { \ if (GDK_DISPLAY_DEBUG_CHECK (display,type)) \ { action; }; } G_STMT_END #else /* !G_ENABLE_DEBUG */ #define GDK_DISPLAY_DEBUG_CHECK(display,type) 0 #define GDK_DISPLAY_NOTE(display,type,action) #endif /* G_ENABLE_DEBUG */ #define GDK_DEBUG_CHECK(type) GDK_DISPLAY_DEBUG_CHECK (NULL,type) #define GDK_NOTE(type,action) GDK_DISPLAY_NOTE (NULL,type,action) /* Event handling */ typedef enum { /* Following flag is set for events on the event queue during * translation and cleared afterwards. */ GDK_EVENT_PENDING = 1 << 0, /* When we are ready to draw a frame, we pause event delivery, * mark all events in the queue with this flag, and deliver * only those events until we finish the frame. */ GDK_EVENT_FLUSHED = 1 << 2 } GdkEventFlags; typedef struct _GdkSurfacePaint GdkSurfacePaint; #define GDK_SURFACE_TYPE(d) ((((GdkSurface *)(d)))->surface_type) #define GDK_SURFACE_DESTROYED(d) (((GdkSurface *)(d))->destroyed) GdkEvent* _gdk_event_unqueue (GdkDisplay *display); void _gdk_event_emit (GdkEvent *event); GList* _gdk_event_queue_find_first (GdkDisplay *display); void _gdk_event_queue_remove_link (GdkDisplay *display, GList *node); GList* _gdk_event_queue_append (GdkDisplay *display, GdkEvent *event); void _gdk_event_queue_handle_motion_compression (GdkDisplay *display); void _gdk_event_queue_flush (GdkDisplay *display); gboolean _gdk_cairo_surface_extents (cairo_surface_t *surface, GdkRectangle *extents); typedef struct { float x1, y1, x2, y2; float u1, v1, u2, v2; } GdkTexturedQuad; void gdk_gl_texture_quads (GdkGLContext *paint_context, guint texture_target, int n_quads, GdkTexturedQuad *quads, gboolean flip_colors); void gdk_cairo_surface_paint_pixbuf (cairo_surface_t *surface, const GdkPixbuf *pixbuf); cairo_region_t *gdk_cairo_region_from_clip (cairo_t *cr); /************************************* * Interfaces used by windowing code * *************************************/ void _gdk_surface_destroy (GdkSurface *surface, gboolean foreign_destroy); void gdk_surface_invalidate_rect (GdkSurface *surface, const GdkRectangle *rect); void gdk_surface_invalidate_region (GdkSurface *surface, const cairo_region_t *region); void _gdk_surface_clear_update_area (GdkSurface *surface); void _gdk_surface_update_size (GdkSurface *surface); GdkGLContext * gdk_surface_get_paint_gl_context (GdkSurface *surface, GError **error); void gdk_surface_get_unscaled_size (GdkSurface *surface, int *unscaled_width, int *unscaled_height); gboolean gdk_surface_handle_event (GdkEvent *event); GdkSeat * gdk_surface_get_seat_from_event (GdkSurface *surface, GdkEvent *event); void gdk_surface_enter_monitor (GdkSurface *surface, GdkMonitor *monitor); void gdk_surface_leave_monitor (GdkSurface *surface, GdkMonitor *monitor); /***************************************** * Interfaces provided by windowing code * *****************************************/ void _gdk_windowing_got_event (GdkDisplay *display, GList *event_link, GdkEvent *event, gulong serial); #define GDK_SURFACE_IS_MAPPED(surface) (((surface)->state & GDK_SURFACE_STATE_WITHDRAWN) == 0) void _gdk_synthesize_crossing_events (GdkDisplay *display, GdkSurface *src, GdkSurface *dest, GdkDevice *device, GdkDevice *source_device, GdkCrossingMode mode, gdouble toplevel_x, gdouble toplevel_y, GdkModifierType mask, guint32 time_, GdkEvent *event_in_queue, gulong serial, gboolean non_linear); void _gdk_display_set_surface_under_pointer (GdkDisplay *display, GdkDevice *device, GdkSurface *surface); void gdk_surface_destroy_notify (GdkSurface *surface); void gdk_synthesize_surface_state (GdkSurface *surface, GdkSurfaceState unset_flags, GdkSurfaceState set_flags); /** * GdkGrabStatus: * @GDK_GRAB_SUCCESS: the resource was successfully grabbed. * @GDK_GRAB_ALREADY_GRABBED: the resource is actively grabbed by another client. * @GDK_GRAB_INVALID_TIME: the resource was grabbed more recently than the * specified time. * @GDK_GRAB_NOT_VIEWABLE: the grab surface or the @confine_to surface are not * viewable. * @GDK_GRAB_FROZEN: the resource is frozen by an active grab of another client. * @GDK_GRAB_FAILED: the grab failed for some other reason * * Returned by gdk_device_grab() to indicate success or the reason for the * failure of the grab attempt. */ typedef enum { GDK_GRAB_SUCCESS = 0, GDK_GRAB_ALREADY_GRABBED = 1, GDK_GRAB_INVALID_TIME = 2, GDK_GRAB_NOT_VIEWABLE = 3, GDK_GRAB_FROZEN = 4, GDK_GRAB_FAILED = 5 } GdkGrabStatus; /** * GdkGrabOwnership: * @GDK_OWNERSHIP_NONE: All other devices’ events are allowed. * @GDK_OWNERSHIP_SURFACE: Other devices’ events are blocked for the grab surface. * @GDK_OWNERSHIP_APPLICATION: Other devices’ events are blocked for the whole application. * * Defines how device grabs interact with other devices. */ typedef enum { GDK_OWNERSHIP_NONE, GDK_OWNERSHIP_SURFACE, GDK_OWNERSHIP_APPLICATION } GdkGrabOwnership; typedef enum { GDK_EXPOSURE_MASK = 1 << 1, GDK_POINTER_MOTION_MASK = 1 << 2, GDK_BUTTON_MOTION_MASK = 1 << 4, GDK_BUTTON1_MOTION_MASK = 1 << 5, GDK_BUTTON2_MOTION_MASK = 1 << 6, GDK_BUTTON3_MOTION_MASK = 1 << 7, GDK_BUTTON_PRESS_MASK = 1 << 8, GDK_BUTTON_RELEASE_MASK = 1 << 9, GDK_KEY_PRESS_MASK = 1 << 10, GDK_KEY_RELEASE_MASK = 1 << 11, GDK_ENTER_NOTIFY_MASK = 1 << 12, GDK_LEAVE_NOTIFY_MASK = 1 << 13, GDK_FOCUS_CHANGE_MASK = 1 << 14, GDK_STRUCTURE_MASK = 1 << 15, GDK_PROPERTY_CHANGE_MASK = 1 << 16, GDK_PROXIMITY_IN_MASK = 1 << 18, GDK_PROXIMITY_OUT_MASK = 1 << 19, GDK_SUBSTRUCTURE_MASK = 1 << 20, GDK_SCROLL_MASK = 1 << 21, GDK_TOUCH_MASK = 1 << 22, GDK_SMOOTH_SCROLL_MASK = 1 << 23, GDK_TOUCHPAD_GESTURE_MASK = 1 << 24, GDK_TABLET_PAD_MASK = 1 << 25, GDK_ALL_EVENTS_MASK = 0x3FFFFFE } GdkEventMask; GdkGrabStatus gdk_device_grab (GdkDevice *device, GdkSurface *surface, GdkGrabOwnership grab_ownership, gboolean owner_events, GdkEventMask event_mask, GdkCursor *cursor, guint32 time_); void gdk_device_ungrab (GdkDevice *device, guint32 time_); void gdk_device_get_position (GdkDevice *device, double *x, double *y); void gdk_surface_get_root_coords (GdkSurface *surface, gint x, gint y, gint *root_x, gint *root_y); void gdk_surface_get_origin (GdkSurface *surface, gint *x, gint *y); void gdk_surface_get_geometry (GdkSurface *surface, gint *x, gint *y, gint *width, gint *height); GdkGLContext *gdk_surface_get_shared_data_gl_context (GdkSurface *surface); typedef enum { GDK_HINT_POS = 1 << 0, GDK_HINT_MIN_SIZE = 1 << 1, GDK_HINT_MAX_SIZE = 1 << 2, GDK_HINT_BASE_SIZE = 1 << 3, GDK_HINT_ASPECT = 1 << 4, GDK_HINT_RESIZE_INC = 1 << 5, GDK_HINT_WIN_GRAVITY = 1 << 6, GDK_HINT_USER_POS = 1 << 7, GDK_HINT_USER_SIZE = 1 << 8 } GdkSurfaceHints; typedef enum { GDK_SURFACE_TYPE_HINT_NORMAL, GDK_SURFACE_TYPE_HINT_DIALOG, GDK_SURFACE_TYPE_HINT_MENU, /* Torn off menu */ GDK_SURFACE_TYPE_HINT_TOOLBAR, GDK_SURFACE_TYPE_HINT_SPLASHSCREEN, GDK_SURFACE_TYPE_HINT_UTILITY, GDK_SURFACE_TYPE_HINT_DOCK, GDK_SURFACE_TYPE_HINT_DESKTOP, GDK_SURFACE_TYPE_HINT_DROPDOWN_MENU, /* A drop down menu (from a menubar) */ GDK_SURFACE_TYPE_HINT_POPUP_MENU, /* A popup menu (from right-click) */ GDK_SURFACE_TYPE_HINT_TOOLTIP, GDK_SURFACE_TYPE_HINT_NOTIFICATION, GDK_SURFACE_TYPE_HINT_COMBO, GDK_SURFACE_TYPE_HINT_DND } GdkSurfaceTypeHint; typedef struct _GdkGeometry GdkGeometry; struct _GdkGeometry { gint min_width; gint min_height; gint max_width; gint max_height; gint base_width; gint base_height; gint width_inc; gint height_inc; gdouble min_aspect; gdouble max_aspect; GdkGravity win_gravity; }; GDK_AVAILABLE_IN_ALL void gdk_surface_constrain_size (GdkGeometry *geometry, GdkSurfaceHints flags, gint width, gint height, gint *new_width, gint *new_height); /* * GdkSeatGrabPrepareFunc: * @seat: the #GdkSeat being grabbed * @surface: the #GdkSurface being grabbed * @user_data: user data passed in gdk_seat_grab() * * Type of the callback used to set up @surface so it can be * grabbed. A typical action would be ensuring the surface is * visible, although there's room for other initialization * actions. */ typedef void (* GdkSeatGrabPrepareFunc) (GdkSeat *seat, GdkSurface *surface, gpointer user_data); GdkGrabStatus gdk_seat_grab (GdkSeat *seat, GdkSurface *surface, GdkSeatCapabilities capabilities, gboolean owner_events, GdkCursor *cursor, GdkEvent *event, GdkSeatGrabPrepareFunc prepare_func, gpointer prepare_func_data); void gdk_seat_ungrab (GdkSeat *seat); GdkSurface * gdk_surface_new_temp (GdkDisplay *display, const GdkRectangle *position); GdkKeymap * gdk_display_get_keymap (GdkDisplay *display); void gdk_surface_begin_resize_drag (GdkSurface *surface, GdkSurfaceEdge edge, GdkDevice *device, gint button, gint x, gint y, guint32 timestamp); void gdk_surface_begin_move_drag (GdkSurface *surface, GdkDevice *device, gint button, gint x, gint y, guint32 timestamp); G_END_DECLS #endif /* __GDK_INTERNALS_H__ */