]> Pileus Git - ~andy/gtk/blob - gdk/gdkwindow.h
Merge from stable:
[~andy/gtk] / gdk / gdkwindow.h
1 #ifndef __GDK_WINDOW_H__
2 #define __GDK_WINDOW_H__
3
4 #include <gdk/gdkdrawable.h>
5 #include <gdk/gdktypes.h>
6 #include <gdk/gdkevents.h>
7
8 #ifdef __cplusplus
9 extern "C" {
10 #endif /* __cplusplus */
11
12 typedef struct _GdkGeometry           GdkGeometry;
13 typedef struct _GdkWindowAttr         GdkWindowAttr;
14 typedef struct _GdkPointerHooks       GdkPointerHooks;
15
16 /* Classes of windows.
17  *   InputOutput: Almost every window should be of this type. Such windows
18  *                receive events and are also displayed on screen.
19  *   InputOnly: Used only in special circumstances when events need to be
20  *              stolen from another window or windows. Input only windows
21  *              have no visible output, so they are handy for placing over
22  *              top of a group of windows in order to grab the events (or
23  *              filter the events) from those windows.
24  */
25 typedef enum
26 {
27   GDK_INPUT_OUTPUT,
28   GDK_INPUT_ONLY
29 } GdkWindowClass;
30
31 /* Types of windows.
32  *   Root: There is only 1 root window and it is initialized
33  *         at startup. Creating a window of type GDK_WINDOW_ROOT
34  *         is an error.
35  *   Toplevel: Windows which interact with the window manager.
36  *   Child: Windows which are children of some other type of window.
37  *          (Any other type of window). Most windows are child windows.
38  *   Dialog: A special kind of toplevel window which interacts with
39  *           the window manager slightly differently than a regular
40  *           toplevel window. Dialog windows should be used for any
41  *           transient window.
42  *   Foreign: A window that actually belongs to another application
43  */
44 typedef enum
45 {
46   GDK_WINDOW_ROOT,
47   GDK_WINDOW_TOPLEVEL,
48   GDK_WINDOW_CHILD,
49   GDK_WINDOW_DIALOG,
50   GDK_WINDOW_TEMP,
51   GDK_WINDOW_FOREIGN
52 } GdkWindowType;
53
54 /* Window attribute mask values.
55  *   GDK_WA_TITLE: The "title" field is valid.
56  *   GDK_WA_X: The "x" field is valid.
57  *   GDK_WA_Y: The "y" field is valid.
58  *   GDK_WA_CURSOR: The "cursor" field is valid.
59  *   GDK_WA_COLORMAP: The "colormap" field is valid.
60  *   GDK_WA_VISUAL: The "visual" field is valid.
61  */
62 typedef enum
63 {
64   GDK_WA_TITLE    = 1 << 1,
65   GDK_WA_X        = 1 << 2,
66   GDK_WA_Y        = 1 << 3,
67   GDK_WA_CURSOR   = 1 << 4,
68   GDK_WA_COLORMAP = 1 << 5,
69   GDK_WA_VISUAL   = 1 << 6,
70   GDK_WA_WMCLASS  = 1 << 7,
71   GDK_WA_NOREDIR  = 1 << 8
72 } GdkWindowAttributesType;
73
74 /* Size restriction enumeration.
75  */
76 typedef enum
77 {
78   GDK_HINT_POS         = 1 << 0,
79   GDK_HINT_MIN_SIZE    = 1 << 1,
80   GDK_HINT_MAX_SIZE    = 1 << 2,
81   GDK_HINT_BASE_SIZE   = 1 << 3,
82   GDK_HINT_ASPECT      = 1 << 4,
83   GDK_HINT_RESIZE_INC  = 1 << 5,
84   GDK_HINT_WIN_GRAVITY = 1 << 6,
85   GDK_HINT_USER_POS    = 1 << 7,
86   GDK_HINT_USER_SIZE   = 1 << 8
87 } GdkWindowHints;
88
89
90 /* Window type hints.
91  * These are hints for the window manager that indicate
92  * what type of function the window has. The window manager
93  * can use this when determining decoration and behaviour
94  * of the window. The hint must be set before mapping the
95  * window.
96  *
97  *   Normal: Normal toplevel window
98  *   Dialog: Dialog window
99  *   Menu: Window used to implement a menu.
100  *   Toolbar: Window used to implement toolbars.
101  */
102 typedef enum
103 {
104   GDK_WINDOW_TYPE_HINT_NORMAL,
105   GDK_WINDOW_TYPE_HINT_DIALOG,
106   GDK_WINDOW_TYPE_HINT_MENU,
107   GDK_WINDOW_TYPE_HINT_TOOLBAR,
108   GDK_WINDOW_TYPE_HINT_SPLASHSCREEN,
109   GDK_WINDOW_TYPE_HINT_UTILITY,
110   GDK_WINDOW_TYPE_HINT_DOCK,
111   GDK_WINDOW_TYPE_HINT_DESKTOP
112 } GdkWindowTypeHint;
113
114
115 /* The next two enumeration values current match the
116  * Motif constants. If this is changed, the implementation
117  * of gdk_window_set_decorations/gdk_window_set_functions
118  * will need to change as well.
119  */
120 typedef enum
121 {
122   GDK_DECOR_ALL         = 1 << 0,
123   GDK_DECOR_BORDER      = 1 << 1,
124   GDK_DECOR_RESIZEH     = 1 << 2,
125   GDK_DECOR_TITLE       = 1 << 3,
126   GDK_DECOR_MENU        = 1 << 4,
127   GDK_DECOR_MINIMIZE    = 1 << 5,
128   GDK_DECOR_MAXIMIZE    = 1 << 6
129 } GdkWMDecoration;
130
131 typedef enum
132 {
133   GDK_FUNC_ALL          = 1 << 0,
134   GDK_FUNC_RESIZE       = 1 << 1,
135   GDK_FUNC_MOVE         = 1 << 2,
136   GDK_FUNC_MINIMIZE     = 1 << 3,
137   GDK_FUNC_MAXIMIZE     = 1 << 4,
138   GDK_FUNC_CLOSE        = 1 << 5
139 } GdkWMFunction;
140
141 /* Currently, these are the same values numerically as in the
142  * X protocol. If you change that, gdkwindow-x11.c/gdk_window_set_geometry_hints()
143  * will need fixing.
144  */
145 typedef enum
146 {
147   GDK_GRAVITY_NORTH_WEST = 1,
148   GDK_GRAVITY_NORTH,
149   GDK_GRAVITY_NORTH_EAST,
150   GDK_GRAVITY_WEST,
151   GDK_GRAVITY_CENTER,
152   GDK_GRAVITY_EAST,
153   GDK_GRAVITY_SOUTH_WEST,
154   GDK_GRAVITY_SOUTH,
155   GDK_GRAVITY_SOUTH_EAST,
156   GDK_GRAVITY_STATIC
157 } GdkGravity;
158
159
160 typedef enum
161 {
162   GDK_WINDOW_EDGE_NORTH_WEST,
163   GDK_WINDOW_EDGE_NORTH,
164   GDK_WINDOW_EDGE_NORTH_EAST,
165   GDK_WINDOW_EDGE_WEST,
166   GDK_WINDOW_EDGE_EAST,
167   GDK_WINDOW_EDGE_SOUTH_WEST,
168   GDK_WINDOW_EDGE_SOUTH,
169   GDK_WINDOW_EDGE_SOUTH_EAST  
170 } GdkWindowEdge;
171
172 struct _GdkWindowAttr
173 {
174   gchar *title;
175   gint event_mask;
176   gint x, y;
177   gint width;
178   gint height;
179   GdkWindowClass wclass;
180   GdkVisual *visual;
181   GdkColormap *colormap;
182   GdkWindowType window_type;
183   GdkCursor *cursor;
184   gchar *wmclass_name;
185   gchar *wmclass_class;
186   gboolean override_redirect;
187 };
188
189 struct _GdkGeometry
190 {
191   gint min_width;
192   gint min_height;
193   gint max_width;
194   gint max_height;
195   gint base_width;
196   gint base_height;
197   gint width_inc;
198   gint height_inc;
199   gdouble min_aspect;
200   gdouble max_aspect;
201   GdkGravity win_gravity;
202 };
203
204 struct _GdkPointerHooks 
205 {
206   GdkWindow* (*get_pointer)       (GdkWindow       *window,
207                                    gint            *x,
208                                    gint            *y,
209                                    GdkModifierType *mask);
210   GdkWindow* (*window_at_pointer) (GdkScreen       *screen, /* unused */
211                                    gint            *win_x,
212                                    gint            *win_y);
213 };
214
215 typedef struct _GdkWindowObject GdkWindowObject;
216 typedef struct _GdkWindowObjectClass GdkWindowObjectClass;
217
218 #define GDK_TYPE_WINDOW              (gdk_window_object_get_type ())
219 #define GDK_WINDOW(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_WINDOW, GdkWindow))
220 #define GDK_WINDOW_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_WINDOW, GdkWindowObjectClass))
221 #define GDK_IS_WINDOW(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_WINDOW))
222 #define GDK_IS_WINDOW_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_WINDOW))
223 #define GDK_WINDOW_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_WINDOW, GdkWindowObjectClass))
224 #define GDK_WINDOW_OBJECT(object)    ((GdkWindowObject *) GDK_WINDOW (object))
225
226 struct _GdkWindowObject
227 {
228   GdkDrawable parent_instance;
229
230   GdkDrawable *impl; /* window-system-specific delegate object */  
231   
232   GdkWindowObject *parent;
233
234   gpointer user_data;
235
236   gint x;
237   gint y;
238   
239   gint extension_events;
240
241   GList *filters;
242   GList *children;
243
244   GdkColor bg_color;
245   GdkPixmap *bg_pixmap;
246   
247   GSList *paint_stack;
248   
249   GdkRegion *update_area;
250   guint update_freeze_count;
251   
252   guint8 window_type;
253   guint8 depth;
254   guint8 resize_count;
255
256   GdkWindowState state;
257   
258   guint guffaw_gravity : 1;
259   guint input_only : 1;
260   guint modal_hint : 1;
261   
262   guint destroyed : 2;
263   
264   GdkEventMask event_mask;
265 };
266
267 struct _GdkWindowObjectClass
268 {
269   GdkDrawableClass parent_class;
270 };
271
272 /* Windows
273  */
274 GType         gdk_window_object_get_type       (void) G_GNUC_CONST;
275 GdkWindow*    gdk_window_new                   (GdkWindow     *parent,
276                                                 GdkWindowAttr *attributes,
277                                                 gint           attributes_mask);
278 void          gdk_window_destroy               (GdkWindow     *window);
279 GdkWindowType gdk_window_get_window_type       (GdkWindow     *window);
280 GdkWindow*    gdk_window_at_pointer            (gint          *win_x,
281                                                 gint          *win_y);
282 void          gdk_window_show                  (GdkWindow     *window);
283 void          gdk_window_hide                  (GdkWindow     *window);
284 void          gdk_window_withdraw              (GdkWindow     *window);
285 void          gdk_window_show_unraised         (GdkWindow     *window);
286 void          gdk_window_move                  (GdkWindow     *window,
287                                                 gint           x,
288                                                 gint           y);
289 void          gdk_window_resize                (GdkWindow     *window,
290                                                 gint           width,
291                                                 gint           height);
292 void          gdk_window_move_resize           (GdkWindow     *window,
293                                                 gint           x,
294                                                 gint           y,
295                                                 gint           width,
296                                                 gint           height);
297 void          gdk_window_reparent              (GdkWindow     *window,
298                                                 GdkWindow     *new_parent,
299                                                 gint           x,
300                                                 gint           y);
301 void          gdk_window_clear                 (GdkWindow     *window);
302 void          gdk_window_clear_area            (GdkWindow     *window,
303                                                 gint           x,
304                                                 gint           y,
305                                                 gint           width,
306                                                 gint           height);
307 void          gdk_window_clear_area_e          (GdkWindow     *window,
308                                                 gint           x,
309                                                 gint           y,
310                                                 gint           width,
311                                                 gint           height);
312 void          gdk_window_raise                 (GdkWindow     *window);
313 void          gdk_window_lower                 (GdkWindow     *window);
314 void          gdk_window_focus                 (GdkWindow     *window,
315                                                 guint32        timestamp);
316 void          gdk_window_set_user_data         (GdkWindow     *window,
317                                                 gpointer       user_data);
318 void          gdk_window_set_override_redirect (GdkWindow     *window,
319                                                 gboolean       override_redirect);
320 void          gdk_window_add_filter            (GdkWindow     *window,
321                                                 GdkFilterFunc  function,
322                                                 gpointer       data);
323 void          gdk_window_remove_filter         (GdkWindow     *window,
324                                                 GdkFilterFunc  function,
325                                                 gpointer       data);
326 void          gdk_window_scroll                (GdkWindow *window,
327                                                 gint       dx,
328                                                 gint       dy);
329
330 /* 
331  * This allows for making shaped (partially transparent) windows
332  * - cool feature, needed for Drag and Drag for example.
333  *  The shape_mask can be the mask
334  *  from gdk_pixmap_create_from_xpm.   Stefan Wille
335  */
336 void gdk_window_shape_combine_mask  (GdkWindow      *window,
337                                      GdkBitmap      *mask,
338                                      gint            x,
339                                      gint            y);
340 void gdk_window_shape_combine_region (GdkWindow     *window,
341                                       GdkRegion     *shape_region,
342                                       gint           offset_x,
343                                       gint           offset_y);
344
345 /*
346  * This routine allows you to quickly take the shapes of all the child windows
347  * of a window and use their shapes as the shape mask for this window - useful
348  * for container windows that dont want to look like a big box
349  * 
350  * - Raster
351  */
352 void gdk_window_set_child_shapes (GdkWindow *window);
353
354 /*
355  * This routine allows you to merge (ie ADD) child shapes to your
356  * own window's shape keeping its current shape and ADDING the child
357  * shapes to it.
358  * 
359  * - Raster
360  */
361 void gdk_window_merge_child_shapes (GdkWindow *window);
362
363 /*
364  * Check if a window has been shown, and whether all its
365  * parents up to a toplevel have been shown, respectively.
366  * Note that a window that is_viewable below is not necessarily
367  * viewable in the X sense.
368  */
369 gboolean gdk_window_is_visible     (GdkWindow *window);
370 gboolean gdk_window_is_viewable    (GdkWindow *window);
371
372 GdkWindowState gdk_window_get_state (GdkWindow *window);
373
374 /* Set static bit gravity on the parent, and static
375  * window gravity on all children.
376  */
377 gboolean gdk_window_set_static_gravities (GdkWindow *window,
378                                           gboolean   use_static);   
379
380 /* Functions to create/lookup windows from their native equivalents */ 
381 #ifndef GDK_MULTIHEAD_SAFE
382 GdkWindow*    gdk_window_foreign_new (GdkNativeWindow anid);
383 GdkWindow*    gdk_window_lookup      (GdkNativeWindow anid);
384 #endif
385 GdkWindow    *gdk_window_foreign_new_for_display (GdkDisplay      *display,
386                                                   GdkNativeWindow  anid);
387 GdkWindow*    gdk_window_lookup_for_display (GdkDisplay      *display,
388                                              GdkNativeWindow  anid);
389
390
391 /* GdkWindow */
392
393 #ifndef GDK_DISABLE_DEPRECATED
394 void          gdk_window_set_hints       (GdkWindow       *window,
395                                           gint             x,
396                                           gint             y,
397                                           gint             min_width,
398                                           gint             min_height,
399                                           gint             max_width,
400                                           gint             max_height,
401                                           gint             flags);
402 #endif
403 void          gdk_window_set_type_hint    (GdkWindow       *window,
404                                            GdkWindowTypeHint hint);
405 void          gdk_window_set_modal_hint   (GdkWindow       *window,
406                                            gboolean         modal);
407
408 void gdk_window_set_skip_taskbar_hint (GdkWindow *window,
409                                        gboolean   skips_taskbar);
410 void gdk_window_set_skip_pager_hint   (GdkWindow *window,
411                                        gboolean   skips_pager);
412
413 void          gdk_window_set_geometry_hints (GdkWindow        *window,
414                                              GdkGeometry      *geometry,
415                                              GdkWindowHints    geom_mask);
416 void          gdk_set_sm_client_id         (const gchar *sm_client_id);
417
418 void          gdk_window_begin_paint_rect   (GdkWindow    *window,
419                                              GdkRectangle *rectangle);
420 void          gdk_window_begin_paint_region (GdkWindow    *window,
421                                              GdkRegion    *region);
422 void          gdk_window_end_paint          (GdkWindow    *window);
423
424 void          gdk_window_set_title         (GdkWindow     *window,
425                                             const gchar   *title);
426 void          gdk_window_set_role          (GdkWindow       *window,
427                                             const gchar     *role);
428 void          gdk_window_set_transient_for (GdkWindow       *window, 
429                                             GdkWindow       *parent);
430 void          gdk_window_set_background  (GdkWindow       *window,
431                                           GdkColor        *color);
432 void          gdk_window_set_back_pixmap (GdkWindow       *window,
433                                           GdkPixmap       *pixmap,
434                                           gboolean         parent_relative);
435 void          gdk_window_set_cursor      (GdkWindow       *window,
436                                           GdkCursor       *cursor);
437 void          gdk_window_get_user_data   (GdkWindow       *window,
438                                           gpointer        *data);
439 void          gdk_window_get_geometry    (GdkWindow       *window,
440                                           gint            *x,
441                                           gint            *y,
442                                           gint            *width,
443                                           gint            *height,
444                                           gint            *depth);
445 void          gdk_window_get_position    (GdkWindow       *window,
446                                           gint            *x,
447                                           gint            *y);
448 gint          gdk_window_get_origin      (GdkWindow       *window,
449                                           gint            *x,
450                                           gint            *y);
451
452 #if !defined (GDK_DISABLE_DEPRECATED) || defined (GTK_COMPILATION)
453 /* Used by gtk_handle_box_button_changed () */
454 gboolean      gdk_window_get_deskrelative_origin (GdkWindow       *window,
455                                           gint            *x,
456                                           gint            *y);
457 #endif
458
459 void          gdk_window_get_root_origin (GdkWindow       *window,
460                                           gint            *x,
461                                           gint            *y);
462 void          gdk_window_get_frame_extents (GdkWindow     *window,
463                                             GdkRectangle  *rect);
464 GdkWindow*    gdk_window_get_pointer     (GdkWindow       *window,
465                                           gint            *x,
466                                           gint            *y,
467                                           GdkModifierType *mask);
468 GdkWindow *   gdk_window_get_parent      (GdkWindow       *window);
469 GdkWindow *   gdk_window_get_toplevel    (GdkWindow       *window);
470
471 GList *       gdk_window_get_children    (GdkWindow       *window);
472 GList *       gdk_window_peek_children   (GdkWindow       *window);
473 GdkEventMask  gdk_window_get_events      (GdkWindow       *window);
474 void          gdk_window_set_events      (GdkWindow       *window,
475                                           GdkEventMask     event_mask);
476
477 void          gdk_window_set_icon_list   (GdkWindow       *window,
478                                           GList           *pixbufs);
479 void          gdk_window_set_icon        (GdkWindow       *window, 
480                                           GdkWindow       *icon_window,
481                                           GdkPixmap       *pixmap,
482                                           GdkBitmap       *mask);
483 void          gdk_window_set_icon_name   (GdkWindow       *window, 
484                                           const gchar     *name);
485 void          gdk_window_set_group       (GdkWindow       *window, 
486                                           GdkWindow       *leader);
487 void          gdk_window_set_decorations (GdkWindow       *window,
488                                           GdkWMDecoration  decorations);
489 gboolean      gdk_window_get_decorations (GdkWindow       *window,
490                                           GdkWMDecoration *decorations);
491 void          gdk_window_set_functions   (GdkWindow       *window,
492                                           GdkWMFunction    functions);
493 #ifndef GDK_MULTIHEAD_SAFE
494 GList *       gdk_window_get_toplevels   (void);
495 #endif
496
497 void          gdk_window_iconify         (GdkWindow       *window);
498 void          gdk_window_deiconify       (GdkWindow       *window);
499 void          gdk_window_stick           (GdkWindow       *window);
500 void          gdk_window_unstick         (GdkWindow       *window);
501 void          gdk_window_maximize        (GdkWindow       *window);
502 void          gdk_window_unmaximize      (GdkWindow       *window);
503 void          gdk_window_fullscreen      (GdkWindow       *window);
504 void          gdk_window_unfullscreen    (GdkWindow       *window);
505
506 void          gdk_window_register_dnd    (GdkWindow       *window);
507
508 void gdk_window_begin_resize_drag (GdkWindow     *window,
509                                    GdkWindowEdge  edge,
510                                    gint           button,
511                                    gint           root_x,
512                                    gint           root_y,
513                                    guint32        timestamp);
514 void gdk_window_begin_move_drag   (GdkWindow     *window,
515                                    gint           button,
516                                    gint           root_x,
517                                    gint           root_y,
518                                    guint32        timestamp);
519
520 /* Interface for dirty-region queueing */
521 void       gdk_window_invalidate_rect           (GdkWindow    *window,
522                                                  GdkRectangle *rect,
523                                                  gboolean      invalidate_children);
524 void       gdk_window_invalidate_region         (GdkWindow    *window,
525                                                  GdkRegion    *region,
526                                                  gboolean      invalidate_children);
527 void       gdk_window_invalidate_maybe_recurse  (GdkWindow *window,
528                                                  GdkRegion *region,
529                                                  gboolean (*child_func) (GdkWindow *, gpointer),
530                                                  gpointer   user_data);
531 GdkRegion *gdk_window_get_update_area     (GdkWindow    *window);
532
533 void       gdk_window_freeze_updates      (GdkWindow    *window);
534 void       gdk_window_thaw_updates        (GdkWindow    *window);
535
536 void       gdk_window_process_all_updates (void);
537 void       gdk_window_process_updates     (GdkWindow    *window,
538                                            gboolean      update_children);
539
540 /* Enable/disable flicker, so you can tell if your code is inefficient. */
541 void       gdk_window_set_debug_updates   (gboolean      setting);
542
543 void       gdk_window_constrain_size      (GdkGeometry  *geometry,
544                                            guint         flags,
545                                            gint          width,
546                                            gint          height,
547                                            gint         *new_width,
548                                            gint         *new_height);
549
550 void gdk_window_get_internal_paint_info (GdkWindow    *window,
551                                          GdkDrawable **real_drawable,
552                                          gint         *x_offset,
553                                          gint         *y_offset);
554
555 #ifndef GDK_MULTIHEAD_SAFE
556 GdkPointerHooks *gdk_set_pointer_hooks (const GdkPointerHooks *new_hooks);   
557 #endif /* GDK_MULTIHEAD_SAFE */
558
559 GdkWindow *gdk_get_default_root_window (void);
560
561 #ifndef GDK_DISABLE_DEPRECATED
562 #define GDK_ROOT_PARENT()             (gdk_get_default_root_window ())
563 #define gdk_window_get_size            gdk_drawable_get_size
564 #define gdk_window_get_type            gdk_window_get_window_type
565 #define gdk_window_get_colormap        gdk_drawable_get_colormap
566 #define gdk_window_set_colormap        gdk_drawable_set_colormap
567 #define gdk_window_get_visual          gdk_drawable_get_visual
568 #define gdk_window_ref                 gdk_drawable_ref
569 #define gdk_window_unref               gdk_drawable_unref
570
571 #define gdk_window_copy_area(drawable,gc,x,y,source_drawable,source_x,source_y,width,height) \
572    gdk_draw_pixmap(drawable,gc,source_drawable,source_x,source_y,x,y,width,height)
573 #endif /* GDK_DISABLE_DEPRECATED */
574
575 #ifdef __cplusplus
576 }
577 #endif /* __cplusplus */
578
579 #endif /* __GDK_WINDOW_H__ */