]> Pileus Git - ~andy/gtk/blob - gdk/gdkinternals.h
3042bcb9d4c1204543c5b76c37c171456dc23619
[~andy/gtk] / gdk / gdkinternals.h
1 /* GDK - The GIMP Drawing Kit
2  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 /*
21  * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
22  * file for a list of people on the GTK+ Team.  See the ChangeLog
23  * files for a list of changes.  These files are distributed with
24  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
25  */
26
27 /* Uninstalled header defining types and functions internal to GDK */
28
29 #ifndef __GDK_INTERNALS_H__
30 #define __GDK_INTERNALS_H__
31
32 #include <gio/gio.h>
33 #include "gdkwindowimpl.h"
34 #include "gdkdisplay.h"
35 #include "gdkprivate.h"
36
37 G_BEGIN_DECLS
38
39 /**********************
40  * General Facilities * 
41  **********************/
42
43 /* Debugging support */
44
45 typedef struct _GdkColorInfo           GdkColorInfo;
46 typedef struct _GdkEventFilter         GdkEventFilter;
47 typedef struct _GdkClientFilter        GdkClientFilter;
48
49 typedef enum {
50   GDK_COLOR_WRITEABLE = 1 << 0
51 } GdkColorInfoFlags;
52
53 struct _GdkColorInfo
54 {
55   GdkColorInfoFlags flags;
56   guint ref_count;
57 };
58
59 typedef enum {
60   GDK_EVENT_FILTER_REMOVED = 1 << 0
61 } GdkEventFilterFlags;
62
63 struct _GdkEventFilter {
64   GdkFilterFunc function;
65   gpointer data;
66   GdkEventFilterFlags flags;
67   guint ref_count;
68 };
69
70 struct _GdkClientFilter {
71   GdkAtom       type;
72   GdkFilterFunc function;
73   gpointer      data;
74 };
75
76 typedef enum {
77   GDK_DEBUG_MISC          = 1 <<  0,
78   GDK_DEBUG_EVENTS        = 1 <<  1,
79   GDK_DEBUG_DND           = 1 <<  2,
80   GDK_DEBUG_XIM           = 1 <<  3,
81   GDK_DEBUG_NOGRABS       = 1 <<  4,
82   GDK_DEBUG_INPUT         = 1 <<  5,
83   GDK_DEBUG_CURSOR        = 1 <<  6,
84   GDK_DEBUG_MULTIHEAD     = 1 <<  7,
85   GDK_DEBUG_XINERAMA      = 1 <<  8,
86   GDK_DEBUG_DRAW          = 1 <<  9,
87   GDK_DEBUG_EVENTLOOP     = 1 << 10
88 } GdkDebugFlag;
89
90 typedef enum {
91   GDK_RENDERING_MODE_SIMILAR = 0,
92   GDK_RENDERING_MODE_IMAGE,
93   GDK_RENDERING_MODE_RECORDING
94 } GdkRenderingMode;
95
96 extern GList            *_gdk_default_filters;
97 extern GdkWindow        *_gdk_parent_root;
98
99 extern guint _gdk_debug_flags;
100 extern GdkRenderingMode    _gdk_rendering_mode;
101
102 #ifdef G_ENABLE_DEBUG
103
104 #define GDK_NOTE(type,action)                G_STMT_START { \
105     if (_gdk_debug_flags & GDK_DEBUG_##type)                \
106        { action; };                          } G_STMT_END
107
108 #else /* !G_ENABLE_DEBUG */
109
110 #define GDK_NOTE(type,action)
111
112 #endif /* G_ENABLE_DEBUG */
113
114 /* Arg parsing */
115
116 typedef enum 
117 {
118   GDK_ARG_STRING,
119   GDK_ARG_INT,
120   GDK_ARG_BOOL,
121   GDK_ARG_NOBOOL,
122   GDK_ARG_CALLBACK
123 } GdkArgType;
124
125 typedef struct _GdkArgContext GdkArgContext;
126 typedef struct _GdkArgDesc GdkArgDesc;
127
128 typedef void (*GdkArgFunc) (const char *name, const char *arg, gpointer data);
129
130 struct _GdkArgContext
131 {
132   GPtrArray *tables;
133   gpointer cb_data;
134 };
135
136 struct _GdkArgDesc
137 {
138   const char *name;
139   GdkArgType type;
140   gpointer location;
141   GdkArgFunc callback;
142 };
143
144 /* Event handling */
145
146 typedef struct _GdkEventPrivate GdkEventPrivate;
147
148 typedef enum
149 {
150   /* Following flag is set for events on the event queue during
151    * translation and cleared afterwards.
152    */
153   GDK_EVENT_PENDING = 1 << 0
154 } GdkEventFlags;
155
156 struct _GdkEventPrivate
157 {
158   GdkEvent   event;
159   guint      flags;
160   GdkScreen *screen;
161   gpointer   windowing_data;
162   GdkDevice *device;
163   GdkDevice *source_device;
164 };
165
166 typedef struct _GdkWindowPaint GdkWindowPaint;
167
168 struct _GdkWindow
169 {
170   GObject parent_instance;
171
172   GdkWindowImpl *impl; /* window-system-specific delegate object */
173
174   GdkWindow *parent;
175   GdkVisual *visual;
176
177   gpointer user_data;
178
179   gint x;
180   gint y;
181
182   GdkEventMask event_mask;
183   gint extension_events;
184
185   GList *filters;
186   GList *children;
187
188   cairo_pattern_t *background;
189
190   GSList *paint_stack;
191
192   cairo_region_t *update_area;
193   guint update_freeze_count;
194
195   guint8 window_type;
196   guint8 depth;
197   guint8 resize_count;
198
199   gint8 toplevel_window_type;
200
201   GdkWindowState state;
202
203   guint guffaw_gravity : 1;
204   guint input_only : 1;
205   guint modal_hint : 1;
206   guint composited : 1;
207   guint has_alpha_background : 1;
208
209   guint destroyed : 2;
210
211   guint accept_focus : 1;
212   guint focus_on_map : 1;
213   guint shaped : 1;
214   guint support_multidevice : 1;
215   guint synthesize_crossing_event_queued : 1;
216   guint effective_visibility : 2;
217   guint visibility : 2; /* The visibility wrt the toplevel (i.e. based on clip_region) */
218   guint native_visibility : 2; /* the native visibility of a impl windows */
219   guint viewable : 1; /* mapped and all parents mapped */
220   guint applied_shape : 1;
221
222   /* The GdkWindow that has the impl, ref:ed if another window.
223    * This ref is required to keep the wrapper of the impl window alive
224    * for as long as any GdkWindow references the impl. */
225   GdkWindow *impl_window;
226
227   guint update_and_descendants_freeze_count;
228
229   gint abs_x, abs_y; /* Absolute offset in impl */
230   gint width, height;
231
232   /* The clip region is the part of the window, in window coordinates
233      that is fully or partially (i.e. semi transparently) visible in
234      the window hierarchy from the toplevel and down */
235   cairo_region_t *clip_region;
236   /* This is the clip region, with additionally all the opaque
237      child windows removed */
238   cairo_region_t *clip_region_with_children;
239   /* The layered region is the subset of clip_region that
240      is covered by non-opaque sibling or ancestor sibling window. */
241   cairo_region_t *layered_region;
242
243   GdkCursor *cursor;
244   GHashTable *device_cursor;
245
246   GdkWindowPaint *implicit_paint;
247
248   GList *outstanding_moves;
249
250   cairo_region_t *shape;
251   cairo_region_t *input_shape;
252
253   cairo_surface_t *cairo_surface;
254
255   GList *devices_inside;
256   GHashTable *device_events;
257
258   GHashTable *source_event_masks;
259   gulong device_added_handler_id;
260   gulong device_changed_handler_id;
261
262   guint num_offscreen_children;
263 };
264
265 #define GDK_WINDOW_TYPE(d) (((GDK_WINDOW (d)))->window_type)
266 #define GDK_WINDOW_DESTROYED(d) (GDK_WINDOW (d)->destroyed)
267
268 extern gchar     *_gdk_display_name;
269 extern gint       _gdk_screen_number;
270 extern gchar     *_gdk_display_arg_name;
271 extern gboolean   _gdk_disable_multidevice;
272
273 GdkEvent* _gdk_event_unqueue (GdkDisplay *display);
274
275 void _gdk_event_filter_unref        (GdkWindow      *window,
276                                      GdkEventFilter *filter);
277
278 void   _gdk_event_emit               (GdkEvent   *event);
279 GList* _gdk_event_queue_find_first   (GdkDisplay *display);
280 void   _gdk_event_queue_remove_link  (GdkDisplay *display,
281                                       GList      *node);
282 GList* _gdk_event_queue_prepend      (GdkDisplay *display,
283                                       GdkEvent   *event);
284 GList* _gdk_event_queue_append       (GdkDisplay *display,
285                                       GdkEvent   *event);
286 GList* _gdk_event_queue_insert_after (GdkDisplay *display,
287                                       GdkEvent   *after_event,
288                                       GdkEvent   *event);
289 GList* _gdk_event_queue_insert_before(GdkDisplay *display,
290                                       GdkEvent   *after_event,
291                                       GdkEvent   *event);
292 void   _gdk_event_button_generate    (GdkDisplay *display,
293                                       GdkEvent   *event);
294
295 void _gdk_windowing_event_data_copy (const GdkEvent *src,
296                                      GdkEvent       *dst);
297 void _gdk_windowing_event_data_free (GdkEvent       *event);
298
299 void gdk_synthesize_window_state (GdkWindow     *window,
300                                   GdkWindowState unset_flags,
301                                   GdkWindowState set_flags);
302
303 gboolean _gdk_cairo_surface_extents (cairo_surface_t *surface,
304                                      GdkRectangle *extents);
305
306 /*************************************
307  * Interfaces used by windowing code *
308  *************************************/
309
310 cairo_surface_t *
311            _gdk_window_ref_cairo_surface (GdkWindow *window);
312
313 void       _gdk_window_destroy           (GdkWindow      *window,
314                                           gboolean        foreign_destroy);
315 void       _gdk_window_clear_update_area (GdkWindow      *window);
316 void       _gdk_window_update_size       (GdkWindow      *window);
317 gboolean   _gdk_window_update_viewable   (GdkWindow      *window);
318
319 void       _gdk_window_process_updates_recurse (GdkWindow *window,
320                                                 cairo_region_t *expose_region);
321
322 void       _gdk_screen_close             (GdkScreen      *screen);
323
324 /*****************************************
325  * Interfaces provided by windowing code *
326  *****************************************/
327
328 /* Font/string functions implemented in module-specific code */
329
330 void _gdk_cursor_destroy (GdkCursor *cursor);
331
332 extern const GOptionEntry _gdk_windowing_args[];
333 gchar *_gdk_windowing_substitute_screen_number (const gchar *display_name,
334                                                 gint         screen_number);
335
336 void _gdk_windowing_got_event                (GdkDisplay       *display,
337                                               GList            *event_link,
338                                               GdkEvent         *event,
339                                               gulong            serial);
340
341 #define GDK_WINDOW_IS_MAPPED(window) (((window)->state & GDK_WINDOW_STATE_WITHDRAWN) == 0)
342
343 #define GDK_TYPE_PAINTABLE            (_gdk_paintable_get_type ())
344 #define GDK_PAINTABLE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GDK_TYPE_PAINTABLE, GdkPaintable))
345 #define GDK_IS_PAINTABLE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GDK_TYPE_PAINTABLE))
346 #define GDK_PAINTABLE_GET_IFACE(obj)  (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GDK_TYPE_PAINTABLE, GdkPaintableIface))
347
348 typedef struct _GdkPaintable        GdkPaintable;
349 typedef struct _GdkPaintableIface   GdkPaintableIface;
350
351 struct _GdkPaintableIface
352 {
353   GTypeInterface g_iface;
354   
355   void (* begin_paint_region)       (GdkPaintable    *paintable,
356                                      GdkWindow       *window,
357                                      const cairo_region_t *region);
358   void (* end_paint)                (GdkPaintable    *paintable);
359 };
360
361 GType _gdk_paintable_get_type (void) G_GNUC_CONST;
362
363 void _gdk_window_invalidate_for_expose (GdkWindow       *window,
364                                         cairo_region_t       *region);
365
366 GdkWindow * _gdk_window_find_child_at (GdkWindow *window,
367                                        int x, int y);
368 GdkWindow * _gdk_window_find_descendant_at (GdkWindow *toplevel,
369                                             double x, double y,
370                                             double *found_x,
371                                             double *found_y);
372
373 void _gdk_window_add_damage (GdkWindow *toplevel,
374                              cairo_region_t *damaged_region);
375
376 GdkEvent * _gdk_make_event (GdkWindow    *window,
377                             GdkEventType  type,
378                             GdkEvent     *event_in_queue,
379                             gboolean      before_event);
380 gboolean _gdk_window_event_parent_of (GdkWindow *parent,
381                                       GdkWindow *child);
382
383 void _gdk_synthesize_crossing_events (GdkDisplay                 *display,
384                                       GdkWindow                  *src,
385                                       GdkWindow                  *dest,
386                                       GdkDevice                  *device,
387                                       GdkDevice                  *source_device,
388                                       GdkCrossingMode             mode,
389                                       gint                        toplevel_x,
390                                       gint                        toplevel_y,
391                                       GdkModifierType             mask,
392                                       guint32                     time_,
393                                       GdkEvent                   *event_in_queue,
394                                       gulong                      serial,
395                                       gboolean                    non_linear);
396 void _gdk_display_set_window_under_pointer (GdkDisplay *display,
397                                             GdkDevice  *device,
398                                             GdkWindow  *window);
399
400
401 void _gdk_synthesize_crossing_events_for_geometry_change (GdkWindow *changed_window);
402
403 gboolean    _gdk_window_has_impl (GdkWindow *window);
404 GdkWindow * _gdk_window_get_impl_window (GdkWindow *window);
405
406 /*****************************
407  * offscreen window routines *
408  *****************************/
409 GType gdk_offscreen_window_get_type (void);
410 void       _gdk_offscreen_window_new                 (GdkWindow     *window,
411                                                       GdkWindowAttr *attributes,
412                                                       gint           attributes_mask);
413 cairo_surface_t * _gdk_offscreen_window_create_surface (GdkWindow *window,
414                                                         gint       width,
415                                                         gint       height);
416
417
418 G_END_DECLS
419
420 #endif /* __GDK_INTERNALS_H__ */