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 Library 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 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library 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-1999. 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 #include "gdkwindow.h"
28 #include "gdkprivate.h"
31 _gdk_window_alloc (void)
33 GdkWindowPrivate *private = g_new (GdkWindowPrivate, 1);
34 GdkWindow *window = (GdkWindow*) private;
36 window->user_data = NULL;
38 private->drawable.ref_count = 1;
39 private->drawable.destroyed = FALSE;
40 private->drawable.klass = NULL;
41 private->drawable.klass_data = NULL;
42 private->drawable.window_type = GDK_WINDOW_CHILD;
44 private->drawable.width = 1;
45 private->drawable.height = 1;
47 private->drawable.colormap = NULL;
49 private->parent = NULL;
52 private->resize_count = 0;
54 private->mapped = FALSE;
55 private->guffaw_gravity = FALSE;
56 private->extension_events = FALSE;
58 private->filters = NULL;
59 private->children = NULL;
65 gdk_window_set_user_data (GdkWindow *window,
68 g_return_if_fail (window != NULL);
70 window->user_data = user_data;
74 gdk_window_get_user_data (GdkWindow *window,
77 g_return_if_fail (window != NULL);
79 *data = window->user_data;
83 gdk_window_get_position (GdkWindow *window,
87 GdkWindowPrivate *window_private;
89 g_return_if_fail (window != NULL);
90 g_return_if_fail (GDK_IS_WINDOW (window));
92 window_private = (GdkWindowPrivate*) window;
95 *x = window_private->x;
97 *y = window_private->y;
101 gdk_window_get_parent (GdkWindow *window)
103 g_return_val_if_fail (window != NULL, NULL);
104 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
106 return ((GdkWindowPrivate*) window)->parent;
110 gdk_window_get_toplevel (GdkWindow *window)
112 GdkWindowPrivate *private;
114 g_return_val_if_fail (window != NULL, NULL);
115 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
117 private = (GdkWindowPrivate *)window;
118 while (GDK_DRAWABLE_TYPE (private) == GDK_WINDOW_CHILD)
119 private = (GdkWindowPrivate *)private->parent;
121 return (GdkWindow *)window;
125 gdk_window_add_filter (GdkWindow *window,
126 GdkFilterFunc function,
129 GdkWindowPrivate *private;
131 GdkEventFilter *filter;
133 g_return_if_fail (window != NULL);
134 g_return_if_fail (GDK_IS_WINDOW (window));
136 private = (GdkWindowPrivate*) window;
137 if (private && GDK_DRAWABLE_DESTROYED (window))
141 tmp_list = private->filters;
143 tmp_list = gdk_default_filters;
147 filter = (GdkEventFilter *)tmp_list->data;
148 if ((filter->function == function) && (filter->data == data))
150 tmp_list = tmp_list->next;
153 filter = g_new (GdkEventFilter, 1);
154 filter->function = function;
158 private->filters = g_list_append (private->filters, filter);
160 gdk_default_filters = g_list_append (gdk_default_filters, filter);
164 gdk_window_remove_filter (GdkWindow *window,
165 GdkFilterFunc function,
168 GdkWindowPrivate *private;
169 GList *tmp_list, *node;
170 GdkEventFilter *filter;
172 g_return_if_fail (window != NULL);
173 g_return_if_fail (GDK_IS_WINDOW (window));
175 private = (GdkWindowPrivate*) window;
178 tmp_list = private->filters;
180 tmp_list = gdk_default_filters;
184 filter = (GdkEventFilter *)tmp_list->data;
186 tmp_list = tmp_list->next;
188 if ((filter->function == function) && (filter->data == data))
191 private->filters = g_list_remove_link (private->filters, node);
193 gdk_default_filters = g_list_remove_link (gdk_default_filters, node);
194 g_list_free_1 (node);
203 gdk_window_get_toplevels (void)
205 GList *new_list = NULL;
208 tmp_list = ((GdkWindowPrivate *)gdk_parent_root)->children;
211 new_list = g_list_prepend (new_list, tmp_list->data);
212 tmp_list = tmp_list->next;
218 /*************************************************************
219 * gdk_window_is_visible:
220 * Check if the given window is mapped.
224 * is the window mapped
225 *************************************************************/
228 gdk_window_is_visible (GdkWindow *window)
230 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
232 g_return_val_if_fail (window != NULL, FALSE);
233 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
235 return private->mapped;
238 /*************************************************************
239 * gdk_window_is_viewable:
240 * Check if the window and all ancestors of the window
241 * are mapped. (This is not necessarily "viewable" in
242 * the X sense, since we only check as far as we have
243 * GDK window parents, not to the root window)
247 * is the window viewable
248 *************************************************************/
251 gdk_window_is_viewable (GdkWindow *window)
253 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
255 g_return_val_if_fail (window != NULL, FALSE);
256 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
259 (private != (GdkWindowPrivate *)gdk_parent_root) &&
260 (private->drawable.window_type != GDK_WINDOW_FOREIGN))
262 if (!private->mapped)
265 private = (GdkWindowPrivate *)private->parent;