]> Pileus Git - ~andy/gtk/blob - gdk/gdkwindow.c
1e1a947ebd15d3f414ebb1622b4ededf120913c6
[~andy/gtk] / gdk / gdkwindow.c
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 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.
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  * Library General Public License for more details.
13  *
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.
18  */
19
20 /*
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/. 
25  */
26
27 #include "gdkwindow.h"
28 #include "gdkprivate.h"
29
30 GdkWindow *
31 _gdk_window_alloc (void)
32 {
33   GdkWindowPrivate *private = g_new (GdkWindowPrivate, 1);
34   GdkWindow *window = (GdkWindow*) private;
35   
36   window->user_data = NULL;
37
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;
43
44   private->drawable.width = 1;
45   private->drawable.height = 1;
46
47   private->drawable.colormap = NULL;
48
49   private->parent = NULL;
50   private->x = 0;
51   private->y = 0;
52   private->resize_count = 0;
53
54   private->mapped = FALSE;
55   private->guffaw_gravity = FALSE;
56   private->extension_events = FALSE;
57   
58   private->filters = NULL;
59   private->children = NULL;
60
61   return window;
62 }
63
64 void
65 gdk_window_set_user_data (GdkWindow *window,
66                           gpointer   user_data)
67 {
68   g_return_if_fail (window != NULL);
69   
70   window->user_data = user_data;
71 }
72
73 void
74 gdk_window_get_user_data (GdkWindow *window,
75                           gpointer  *data)
76 {
77   g_return_if_fail (window != NULL);
78   
79   *data = window->user_data;
80 }
81
82 void
83 gdk_window_get_position (GdkWindow *window,
84                          gint      *x,
85                          gint      *y)
86 {
87   GdkWindowPrivate *window_private;
88   
89   g_return_if_fail (window != NULL);
90   g_return_if_fail (GDK_IS_WINDOW (window));
91   
92   window_private = (GdkWindowPrivate*) window;
93   
94   if (x)
95     *x = window_private->x;
96   if (y)
97     *y = window_private->y;
98 }
99
100 GdkWindow*
101 gdk_window_get_parent (GdkWindow *window)
102 {
103   g_return_val_if_fail (window != NULL, NULL);
104   g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
105   
106   return ((GdkWindowPrivate*) window)->parent;
107 }
108
109 GdkWindow*
110 gdk_window_get_toplevel (GdkWindow *window)
111 {
112   GdkWindowPrivate *private;
113   
114   g_return_val_if_fail (window != NULL, NULL);
115   g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
116
117   private = (GdkWindowPrivate *)window;
118   while (GDK_DRAWABLE_TYPE (private) == GDK_WINDOW_CHILD)
119     private = (GdkWindowPrivate *)private->parent;
120   
121   return (GdkWindow *)window;
122 }
123
124 void          
125 gdk_window_add_filter (GdkWindow     *window,
126                        GdkFilterFunc  function,
127                        gpointer       data)
128 {
129   GdkWindowPrivate *private;
130   GList *tmp_list;
131   GdkEventFilter *filter;
132   
133   g_return_if_fail (window != NULL);
134   g_return_if_fail (GDK_IS_WINDOW (window));
135
136   private = (GdkWindowPrivate*) window;
137   if (private && GDK_DRAWABLE_DESTROYED (window))
138     return;
139   
140   if (private)
141     tmp_list = private->filters;
142   else
143     tmp_list = gdk_default_filters;
144   
145   while (tmp_list)
146     {
147       filter = (GdkEventFilter *)tmp_list->data;
148       if ((filter->function == function) && (filter->data == data))
149         return;
150       tmp_list = tmp_list->next;
151     }
152   
153   filter = g_new (GdkEventFilter, 1);
154   filter->function = function;
155   filter->data = data;
156   
157   if (private)
158     private->filters = g_list_append (private->filters, filter);
159   else
160     gdk_default_filters = g_list_append (gdk_default_filters, filter);
161 }
162
163 void
164 gdk_window_remove_filter (GdkWindow     *window,
165                           GdkFilterFunc  function,
166                           gpointer       data)
167 {
168   GdkWindowPrivate *private;
169   GList *tmp_list, *node;
170   GdkEventFilter *filter;
171   
172   g_return_if_fail (window != NULL);
173   g_return_if_fail (GDK_IS_WINDOW (window));
174
175   private = (GdkWindowPrivate*) window;
176   
177   if (private)
178     tmp_list = private->filters;
179   else
180     tmp_list = gdk_default_filters;
181   
182   while (tmp_list)
183     {
184       filter = (GdkEventFilter *)tmp_list->data;
185       node = tmp_list;
186       tmp_list = tmp_list->next;
187       
188       if ((filter->function == function) && (filter->data == data))
189         {
190           if (private)
191             private->filters = g_list_remove_link (private->filters, node);
192           else
193             gdk_default_filters = g_list_remove_link (gdk_default_filters, node);
194           g_list_free_1 (node);
195           g_free (filter);
196           
197           return;
198         }
199     }
200 }
201
202 GList *
203 gdk_window_get_toplevels (void)
204 {
205   GList *new_list = NULL;
206   GList *tmp_list;
207   
208   tmp_list = ((GdkWindowPrivate *)gdk_parent_root)->children;
209   while (tmp_list)
210     {
211       new_list = g_list_prepend (new_list, tmp_list->data);
212       tmp_list = tmp_list->next;
213     }
214   
215   return new_list;
216 }
217
218 /*************************************************************
219  * gdk_window_is_visible:
220  *     Check if the given window is mapped.
221  *   arguments:
222  *     window: 
223  *   results:
224  *     is the window mapped
225  *************************************************************/
226
227 gboolean 
228 gdk_window_is_visible (GdkWindow *window)
229 {
230   GdkWindowPrivate *private = (GdkWindowPrivate *)window;
231   
232   g_return_val_if_fail (window != NULL, FALSE);
233   g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
234   
235   return private->mapped;
236 }
237
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)
244  *   arguments:
245  *     window:
246  *   results:
247  *     is the window viewable
248  *************************************************************/
249
250 gboolean 
251 gdk_window_is_viewable (GdkWindow *window)
252 {
253   GdkWindowPrivate *private = (GdkWindowPrivate *)window;
254   
255   g_return_val_if_fail (window != NULL, FALSE);
256   g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
257   
258   while (private && 
259          (private != (GdkWindowPrivate *)gdk_parent_root) &&
260          (private->drawable.window_type != GDK_WINDOW_FOREIGN))
261     {
262       if (!private->mapped)
263         return FALSE;
264       
265       private = (GdkWindowPrivate *)private->parent;
266     }
267   
268   return TRUE;
269 }
270