1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
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.
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.
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.
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/.
27 #if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
28 #error "Only <gdk/gdk.h> can be included directly."
31 #ifndef __GDK_WINDOW_H__
32 #define __GDK_WINDOW_H__
34 #include <gdk/gdkdrawable.h>
35 #include <gdk/gdktypes.h>
36 #include <gdk/gdkevents.h>
40 typedef struct _GdkGeometry GdkGeometry;
41 typedef struct _GdkWindowAttr GdkWindowAttr;
42 typedef struct _GdkPointerHooks GdkPointerHooks;
43 typedef struct _GdkWindowRedirect GdkWindowRedirect;
45 /* Classes of windows.
46 * InputOutput: Almost every window should be of this type. Such windows
47 * receive events and are also displayed on screen.
48 * InputOnly: Used only in special circumstances when events need to be
49 * stolen from another window or windows. Input only windows
50 * have no visible output, so they are handy for placing over
51 * top of a group of windows in order to grab the events (or
52 * filter the events) from those windows.
61 * Root: There is only 1 root window and it is initialized
62 * at startup. Creating a window of type GDK_WINDOW_ROOT
64 * Toplevel: Windows which interact with the window manager.
65 * Child: Windows which are children of some other type of window.
66 * (Any other type of window). Most windows are child windows.
67 * Dialog: A special kind of toplevel window which interacts with
68 * the window manager slightly differently than a regular
69 * toplevel window. Dialog windows should be used for any
71 * Foreign: A window that actually belongs to another application
84 /* Window attribute mask values.
85 * GDK_WA_TITLE: The "title" field is valid.
86 * GDK_WA_X: The "x" field is valid.
87 * GDK_WA_Y: The "y" field is valid.
88 * GDK_WA_CURSOR: The "cursor" field is valid.
89 * GDK_WA_COLORMAP: The "colormap" field is valid.
90 * GDK_WA_VISUAL: The "visual" field is valid.
94 GDK_WA_TITLE = 1 << 1,
97 GDK_WA_CURSOR = 1 << 4,
98 GDK_WA_COLORMAP = 1 << 5,
99 GDK_WA_VISUAL = 1 << 6,
100 GDK_WA_WMCLASS = 1 << 7,
101 GDK_WA_NOREDIR = 1 << 8,
102 GDK_WA_TYPE_HINT = 1 << 9
103 } GdkWindowAttributesType;
105 /* Size restriction enumeration.
109 GDK_HINT_POS = 1 << 0,
110 GDK_HINT_MIN_SIZE = 1 << 1,
111 GDK_HINT_MAX_SIZE = 1 << 2,
112 GDK_HINT_BASE_SIZE = 1 << 3,
113 GDK_HINT_ASPECT = 1 << 4,
114 GDK_HINT_RESIZE_INC = 1 << 5,
115 GDK_HINT_WIN_GRAVITY = 1 << 6,
116 GDK_HINT_USER_POS = 1 << 7,
117 GDK_HINT_USER_SIZE = 1 << 8
121 /* Window type hints.
122 * These are hints for the window manager that indicate
123 * what type of function the window has. The window manager
124 * can use this when determining decoration and behaviour
125 * of the window. The hint must be set before mapping the
128 * Normal: Normal toplevel window
129 * Dialog: Dialog window
130 * Menu: Window used to implement a menu.
131 * Toolbar: Window used to implement toolbars.
135 GDK_WINDOW_TYPE_HINT_NORMAL,
136 GDK_WINDOW_TYPE_HINT_DIALOG,
137 GDK_WINDOW_TYPE_HINT_MENU, /* Torn off menu */
138 GDK_WINDOW_TYPE_HINT_TOOLBAR,
139 GDK_WINDOW_TYPE_HINT_SPLASHSCREEN,
140 GDK_WINDOW_TYPE_HINT_UTILITY,
141 GDK_WINDOW_TYPE_HINT_DOCK,
142 GDK_WINDOW_TYPE_HINT_DESKTOP,
143 GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU, /* A drop down menu (from a menubar) */
144 GDK_WINDOW_TYPE_HINT_POPUP_MENU, /* A popup menu (from right-click) */
145 GDK_WINDOW_TYPE_HINT_TOOLTIP,
146 GDK_WINDOW_TYPE_HINT_NOTIFICATION,
147 GDK_WINDOW_TYPE_HINT_COMBO,
148 GDK_WINDOW_TYPE_HINT_DND
151 /* The next two enumeration values current match the
152 * Motif constants. If this is changed, the implementation
153 * of gdk_window_set_decorations/gdk_window_set_functions
154 * will need to change as well.
158 GDK_DECOR_ALL = 1 << 0,
159 GDK_DECOR_BORDER = 1 << 1,
160 GDK_DECOR_RESIZEH = 1 << 2,
161 GDK_DECOR_TITLE = 1 << 3,
162 GDK_DECOR_MENU = 1 << 4,
163 GDK_DECOR_MINIMIZE = 1 << 5,
164 GDK_DECOR_MAXIMIZE = 1 << 6
169 GDK_FUNC_ALL = 1 << 0,
170 GDK_FUNC_RESIZE = 1 << 1,
171 GDK_FUNC_MOVE = 1 << 2,
172 GDK_FUNC_MINIMIZE = 1 << 3,
173 GDK_FUNC_MAXIMIZE = 1 << 4,
174 GDK_FUNC_CLOSE = 1 << 5
177 /* Currently, these are the same values numerically as in the
178 * X protocol. If you change that, gdkwindow-x11.c/gdk_window_set_geometry_hints()
183 GDK_GRAVITY_NORTH_WEST = 1,
185 GDK_GRAVITY_NORTH_EAST,
189 GDK_GRAVITY_SOUTH_WEST,
191 GDK_GRAVITY_SOUTH_EAST,
198 GDK_WINDOW_EDGE_NORTH_WEST,
199 GDK_WINDOW_EDGE_NORTH,
200 GDK_WINDOW_EDGE_NORTH_EAST,
201 GDK_WINDOW_EDGE_WEST,
202 GDK_WINDOW_EDGE_EAST,
203 GDK_WINDOW_EDGE_SOUTH_WEST,
204 GDK_WINDOW_EDGE_SOUTH,
205 GDK_WINDOW_EDGE_SOUTH_EAST
208 struct _GdkWindowAttr
215 GdkWindowClass wclass;
217 GdkColormap *colormap;
218 GdkWindowType window_type;
221 gchar *wmclass_class;
222 gboolean override_redirect;
223 GdkWindowTypeHint type_hint;
238 GdkGravity win_gravity;
241 struct _GdkPointerHooks
243 GdkWindow* (*get_pointer) (GdkWindow *window,
246 GdkModifierType *mask);
247 GdkWindow* (*window_at_pointer) (GdkScreen *screen, /* unused */
252 typedef struct _GdkWindowObject GdkWindowObject;
253 typedef struct _GdkWindowObjectClass GdkWindowObjectClass;
255 #define GDK_TYPE_WINDOW (gdk_window_object_get_type ())
256 #define GDK_WINDOW(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_WINDOW, GdkWindow))
257 #define GDK_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_WINDOW, GdkWindowObjectClass))
258 #define GDK_IS_WINDOW(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_WINDOW))
259 #define GDK_IS_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_WINDOW))
260 #define GDK_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_WINDOW, GdkWindowObjectClass))
261 #define GDK_WINDOW_OBJECT(object) ((GdkWindowObject *) GDK_WINDOW (object))
263 #ifndef GDK_COMPILATION
264 /* We used to export all of GdkWindowObject, but we don't want to keep doing so.
265 However, there are various parts of it accessed by macros and other code,
266 so we keep the old exported version public, but in reality it is larger. */
268 /**** DON'T CHANGE THIS STRUCT, the real version is in gdkinternals.h ****/
269 struct _GdkWindowObject
271 GdkDrawable parent_instance;
273 GdkDrawable *impl; /* window-system-specific delegate object */
275 GdkWindowObject *parent;
282 gint extension_events;
288 GdkPixmap *bg_pixmap;
292 GdkRegion *update_area;
293 guint update_freeze_count;
299 GdkWindowState state;
301 guint guffaw_gravity : 1;
302 guint input_only : 1;
303 guint modal_hint : 1;
304 guint composited : 1;
308 guint accept_focus : 1;
309 guint focus_on_map : 1;
312 GdkEventMask event_mask;
314 guint update_and_descendants_freeze_count;
316 GdkWindowRedirect *redirect;
320 struct _GdkWindowObjectClass
322 GdkDrawableClass parent_class;
327 GType gdk_window_object_get_type (void) G_GNUC_CONST;
328 GdkWindow* gdk_window_new (GdkWindow *parent,
329 GdkWindowAttr *attributes,
330 gint attributes_mask);
331 void gdk_window_destroy (GdkWindow *window);
332 GdkWindowType gdk_window_get_window_type (GdkWindow *window);
333 GdkWindow* gdk_window_at_pointer (gint *win_x,
335 void gdk_window_show (GdkWindow *window);
336 void gdk_window_hide (GdkWindow *window);
337 void gdk_window_withdraw (GdkWindow *window);
338 void gdk_window_show_unraised (GdkWindow *window);
339 void gdk_window_move (GdkWindow *window,
342 void gdk_window_resize (GdkWindow *window,
345 void gdk_window_move_resize (GdkWindow *window,
350 void gdk_window_reparent (GdkWindow *window,
351 GdkWindow *new_parent,
354 void gdk_window_clear (GdkWindow *window);
355 void gdk_window_clear_area (GdkWindow *window,
360 void gdk_window_clear_area_e (GdkWindow *window,
365 void gdk_window_raise (GdkWindow *window);
366 void gdk_window_lower (GdkWindow *window);
367 void gdk_window_focus (GdkWindow *window,
369 void gdk_window_set_user_data (GdkWindow *window,
371 void gdk_window_set_override_redirect (GdkWindow *window,
372 gboolean override_redirect);
373 void gdk_window_set_accept_focus (GdkWindow *window,
374 gboolean accept_focus);
375 void gdk_window_set_focus_on_map (GdkWindow *window,
376 gboolean focus_on_map);
377 void gdk_window_add_filter (GdkWindow *window,
378 GdkFilterFunc function,
380 void gdk_window_remove_filter (GdkWindow *window,
381 GdkFilterFunc function,
383 void gdk_window_scroll (GdkWindow *window,
386 void gdk_window_move_region (GdkWindow *window,
387 const GdkRegion *region,
390 gboolean gdk_window_ensure_native (GdkWindow *window);
393 * This allows for making shaped (partially transparent) windows
394 * - cool feature, needed for Drag and Drag for example.
395 * The shape_mask can be the mask
396 * from gdk_pixmap_create_from_xpm. Stefan Wille
398 void gdk_window_shape_combine_mask (GdkWindow *window,
402 void gdk_window_shape_combine_region (GdkWindow *window,
403 const GdkRegion *shape_region,
408 * This routine allows you to quickly take the shapes of all the child windows
409 * of a window and use their shapes as the shape mask for this window - useful
410 * for container windows that dont want to look like a big box
414 void gdk_window_set_child_shapes (GdkWindow *window);
416 void gdk_window_set_composited (GdkWindow *window,
417 gboolean composited);
420 * This routine allows you to merge (ie ADD) child shapes to your
421 * own window's shape keeping its current shape and ADDING the child
426 void gdk_window_merge_child_shapes (GdkWindow *window);
428 void gdk_window_input_shape_combine_mask (GdkWindow *window,
432 void gdk_window_input_shape_combine_region (GdkWindow *window,
433 const GdkRegion *shape_region,
436 void gdk_window_set_child_input_shapes (GdkWindow *window);
437 void gdk_window_merge_child_input_shapes (GdkWindow *window);
441 * Check if a window has been shown, and whether all its
442 * parents up to a toplevel have been shown, respectively.
443 * Note that a window that is_viewable below is not necessarily
444 * viewable in the X sense.
446 gboolean gdk_window_is_visible (GdkWindow *window);
447 gboolean gdk_window_is_viewable (GdkWindow *window);
449 GdkWindowState gdk_window_get_state (GdkWindow *window);
451 /* Set static bit gravity on the parent, and static
452 * window gravity on all children.
454 gboolean gdk_window_set_static_gravities (GdkWindow *window,
455 gboolean use_static);
457 /* Functions to create/lookup windows from their native equivalents */
458 #ifndef GDK_MULTIHEAD_SAFE
459 GdkWindow* gdk_window_foreign_new (GdkNativeWindow anid);
460 GdkWindow* gdk_window_lookup (GdkNativeWindow anid);
462 GdkWindow *gdk_window_foreign_new_for_display (GdkDisplay *display,
463 GdkNativeWindow anid);
464 GdkWindow* gdk_window_lookup_for_display (GdkDisplay *display,
465 GdkNativeWindow anid);
470 #ifndef GDK_DISABLE_DEPRECATED
471 void gdk_window_set_hints (GdkWindow *window,
480 void gdk_window_set_type_hint (GdkWindow *window,
481 GdkWindowTypeHint hint);
482 GdkWindowTypeHint gdk_window_get_type_hint (GdkWindow *window);
484 void gdk_window_set_modal_hint (GdkWindow *window,
487 void gdk_window_set_skip_taskbar_hint (GdkWindow *window,
488 gboolean skips_taskbar);
489 void gdk_window_set_skip_pager_hint (GdkWindow *window,
490 gboolean skips_pager);
491 void gdk_window_set_urgency_hint (GdkWindow *window,
494 void gdk_window_set_geometry_hints (GdkWindow *window,
495 const GdkGeometry *geometry,
496 GdkWindowHints geom_mask);
497 void gdk_set_sm_client_id (const gchar *sm_client_id);
499 void gdk_window_begin_paint_rect (GdkWindow *window,
500 const GdkRectangle *rectangle);
501 void gdk_window_begin_paint_region (GdkWindow *window,
502 const GdkRegion *region);
503 void gdk_window_end_paint (GdkWindow *window);
505 void gdk_window_set_title (GdkWindow *window,
507 void gdk_window_set_role (GdkWindow *window,
509 void gdk_window_set_startup_id (GdkWindow *window,
510 const gchar *startup_id);
511 void gdk_window_set_transient_for (GdkWindow *window,
513 void gdk_window_set_background (GdkWindow *window,
514 const GdkColor *color);
515 void gdk_window_set_back_pixmap (GdkWindow *window,
517 gboolean parent_relative);
518 void gdk_window_set_cursor (GdkWindow *window,
520 void gdk_window_get_user_data (GdkWindow *window,
522 void gdk_window_get_geometry (GdkWindow *window,
528 void gdk_window_get_position (GdkWindow *window,
531 gint gdk_window_get_origin (GdkWindow *window,
534 gint gdk_window_get_root_coords (GdkWindow *window,
540 #if !defined (GDK_DISABLE_DEPRECATED) || defined (GTK_COMPILATION)
541 /* Used by gtk_handle_box_button_changed () */
542 gboolean gdk_window_get_deskrelative_origin (GdkWindow *window,
547 void gdk_window_get_root_origin (GdkWindow *window,
550 void gdk_window_get_frame_extents (GdkWindow *window,
552 GdkWindow* gdk_window_get_pointer (GdkWindow *window,
555 GdkModifierType *mask);
556 GdkWindow * gdk_window_get_parent (GdkWindow *window);
557 GdkWindow * gdk_window_get_toplevel (GdkWindow *window);
559 GList * gdk_window_get_children (GdkWindow *window);
560 GList * gdk_window_peek_children (GdkWindow *window);
561 GdkEventMask gdk_window_get_events (GdkWindow *window);
562 void gdk_window_set_events (GdkWindow *window,
563 GdkEventMask event_mask);
565 void gdk_window_set_icon_list (GdkWindow *window,
567 void gdk_window_set_icon (GdkWindow *window,
568 GdkWindow *icon_window,
571 void gdk_window_set_icon_name (GdkWindow *window,
573 void gdk_window_set_group (GdkWindow *window,
575 GdkWindow* gdk_window_get_group (GdkWindow *window);
576 void gdk_window_set_decorations (GdkWindow *window,
577 GdkWMDecoration decorations);
578 gboolean gdk_window_get_decorations (GdkWindow *window,
579 GdkWMDecoration *decorations);
580 void gdk_window_set_functions (GdkWindow *window,
581 GdkWMFunction functions);
582 #if !defined(GDK_MULTIHEAD_SAFE) && !defined(GDK_DISABLE_DEPRECATED)
583 GList * gdk_window_get_toplevels (void);
586 void gdk_window_beep (GdkWindow *window);
587 void gdk_window_iconify (GdkWindow *window);
588 void gdk_window_deiconify (GdkWindow *window);
589 void gdk_window_stick (GdkWindow *window);
590 void gdk_window_unstick (GdkWindow *window);
591 void gdk_window_maximize (GdkWindow *window);
592 void gdk_window_unmaximize (GdkWindow *window);
593 void gdk_window_fullscreen (GdkWindow *window);
594 void gdk_window_unfullscreen (GdkWindow *window);
595 void gdk_window_set_keep_above (GdkWindow *window,
597 void gdk_window_set_keep_below (GdkWindow *window,
599 void gdk_window_set_opacity (GdkWindow *window,
601 void gdk_window_register_dnd (GdkWindow *window);
603 void gdk_window_begin_resize_drag (GdkWindow *window,
609 void gdk_window_begin_move_drag (GdkWindow *window,
615 /* Interface for dirty-region queueing */
616 void gdk_window_invalidate_rect (GdkWindow *window,
617 const GdkRectangle *rect,
618 gboolean invalidate_children);
619 void gdk_window_invalidate_region (GdkWindow *window,
620 const GdkRegion *region,
621 gboolean invalidate_children);
622 void gdk_window_invalidate_maybe_recurse (GdkWindow *window,
623 const GdkRegion *region,
624 gboolean (*child_func) (GdkWindow *, gpointer),
626 GdkRegion *gdk_window_get_update_area (GdkWindow *window);
628 void gdk_window_freeze_updates (GdkWindow *window);
629 void gdk_window_thaw_updates (GdkWindow *window);
631 void gdk_window_freeze_toplevel_updates_libgtk_only (GdkWindow *window);
632 void gdk_window_thaw_toplevel_updates_libgtk_only (GdkWindow *window);
634 void gdk_window_process_all_updates (void);
635 void gdk_window_process_updates (GdkWindow *window,
636 gboolean update_children);
638 /* Enable/disable flicker, so you can tell if your code is inefficient. */
639 void gdk_window_set_debug_updates (gboolean setting);
641 void gdk_window_constrain_size (GdkGeometry *geometry,
648 void gdk_window_get_internal_paint_info (GdkWindow *window,
649 GdkDrawable **real_drawable,
653 void gdk_window_enable_synchronized_configure (GdkWindow *window);
654 void gdk_window_configure_finished (GdkWindow *window);
656 #ifndef GDK_MULTIHEAD_SAFE
657 GdkPointerHooks *gdk_set_pointer_hooks (const GdkPointerHooks *new_hooks);
658 #endif /* GDK_MULTIHEAD_SAFE */
660 GdkWindow *gdk_get_default_root_window (void);
662 /* Offscreen redirection */
663 GdkPixmap *gdk_window_get_offscreen_pixmap (GdkWindow *window);
664 void gdk_window_set_has_offscreen_children (GdkWindow *window,
665 gboolean has_offscreen_children);
666 gboolean gdk_window_get_has_offscreen_children (GdkWindow *window);
667 void gdk_window_offscreen_children_changed (GdkWindow *window);
669 void gdk_window_redirect_to_drawable (GdkWindow *window,
670 GdkDrawable *drawable,
677 void gdk_window_remove_redirection (GdkWindow *window);
679 #ifndef GDK_DISABLE_DEPRECATED
680 #define GDK_ROOT_PARENT() (gdk_get_default_root_window ())
681 #define gdk_window_get_size gdk_drawable_get_size
682 #define gdk_window_get_type gdk_window_get_window_type
683 #define gdk_window_get_colormap gdk_drawable_get_colormap
684 #define gdk_window_set_colormap gdk_drawable_set_colormap
685 #define gdk_window_get_visual gdk_drawable_get_visual
686 #define gdk_window_ref gdk_drawable_ref
687 #define gdk_window_unref gdk_drawable_unref
689 #define gdk_window_copy_area(drawable,gc,x,y,source_drawable,source_x,source_y,width,height) \
690 gdk_draw_pixmap(drawable,gc,source_drawable,source_x,source_y,x,y,width,height)
691 #endif /* GDK_DISABLE_DEPRECATED */
695 #endif /* __GDK_WINDOW_H__ */