00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "gdkwindow.h"
00028 #include "gdkprivate.h"
00029
00030 GdkWindow *_gdk_window_alloc(void)
00031 {
00032 GdkWindowPrivate *private = g_new(GdkWindowPrivate, 1);
00033 GdkWindow *window = (GdkWindow *) private;
00034
00035 window->user_data = NULL;
00036
00037 private->drawable.ref_count = 1;
00038 private->drawable.destroyed = FALSE;
00039 private->drawable.klass = NULL;
00040 private->drawable.klass_data = NULL;
00041 private->drawable.window_type = GDK_WINDOW_CHILD;
00042
00043 private->drawable.width = 1;
00044 private->drawable.height = 1;
00045
00046 private->drawable.colormap = NULL;
00047
00048 private->parent = NULL;
00049 private->x = 0;
00050 private->y = 0;
00051 private->resize_count = 0;
00052
00053 private->mapped = FALSE;
00054 private->guffaw_gravity = FALSE;
00055 private->extension_events = FALSE;
00056
00057 private->filters = NULL;
00058 private->children = NULL;
00059
00060 return window;
00061 }
00062
00063 void gdk_window_set_user_data(GdkWindow * window, gpointer user_data)
00064 {
00065 g_return_if_fail(window != NULL);
00066
00067 window->user_data = user_data;
00068 }
00069
00070 void gdk_window_get_user_data(GdkWindow * window, gpointer * data)
00071 {
00072 g_return_if_fail(window != NULL);
00073
00074 *data = window->user_data;
00075 }
00076
00077 void gdk_window_get_position(GdkWindow * window, gint * x, gint * y)
00078 {
00079 GdkWindowPrivate *window_private;
00080
00081 g_return_if_fail(window != NULL);
00082 g_return_if_fail(GDK_IS_WINDOW(window));
00083
00084 window_private = (GdkWindowPrivate *) window;
00085
00086 if (x)
00087 *x = window_private->x;
00088 if (y)
00089 *y = window_private->y;
00090 }
00091
00092 GdkWindow *gdk_window_get_parent(GdkWindow * window)
00093 {
00094 g_return_val_if_fail(window != NULL, NULL);
00095 g_return_val_if_fail(GDK_IS_WINDOW(window), NULL);
00096
00097 return ((GdkWindowPrivate *) window)->parent;
00098 }
00099
00100 GdkWindow *gdk_window_get_toplevel(GdkWindow * window)
00101 {
00102 GdkWindowPrivate *private;
00103
00104 g_return_val_if_fail(window != NULL, NULL);
00105 g_return_val_if_fail(GDK_IS_WINDOW(window), NULL);
00106
00107 private = (GdkWindowPrivate *) window;
00108 while (GDK_DRAWABLE_TYPE(private) == GDK_WINDOW_CHILD)
00109 private = (GdkWindowPrivate *) private->parent;
00110
00111 return (GdkWindow *) window;
00112 }
00113
00114 void
00115 gdk_window_add_filter(GdkWindow * window,
00116 GdkFilterFunc function, gpointer data)
00117 {
00118 GdkWindowPrivate *private;
00119 GList *tmp_list;
00120 GdkEventFilter *filter;
00121
00122 g_return_if_fail(window != NULL);
00123 g_return_if_fail(GDK_IS_WINDOW(window));
00124
00125 private = (GdkWindowPrivate *) window;
00126 if (private && GDK_DRAWABLE_DESTROYED(window))
00127 return;
00128
00129 if (private)
00130 tmp_list = private->filters;
00131 else
00132 tmp_list = gdk_default_filters;
00133
00134 while (tmp_list) {
00135 filter = (GdkEventFilter *) tmp_list->data;
00136 if ((filter->function == function) && (filter->data == data))
00137 return;
00138 tmp_list = tmp_list->next;
00139 }
00140
00141 filter = g_new(GdkEventFilter, 1);
00142 filter->function = function;
00143 filter->data = data;
00144
00145 if (private)
00146 private->filters = g_list_append(private->filters, filter);
00147 else
00148 gdk_default_filters = g_list_append(gdk_default_filters, filter);
00149 }
00150
00151 void
00152 gdk_window_remove_filter(GdkWindow * window,
00153 GdkFilterFunc function, gpointer data)
00154 {
00155 GdkWindowPrivate *private;
00156 GList *tmp_list, *node;
00157 GdkEventFilter *filter;
00158
00159 g_return_if_fail(window != NULL);
00160 g_return_if_fail(GDK_IS_WINDOW(window));
00161
00162 private = (GdkWindowPrivate *) window;
00163
00164 if (private)
00165 tmp_list = private->filters;
00166 else
00167 tmp_list = gdk_default_filters;
00168
00169 while (tmp_list) {
00170 filter = (GdkEventFilter *) tmp_list->data;
00171 node = tmp_list;
00172 tmp_list = tmp_list->next;
00173
00174 if ((filter->function == function) && (filter->data == data)) {
00175 if (private)
00176 private->filters = g_list_remove_link(private->filters, node);
00177 else
00178 gdk_default_filters =
00179 g_list_remove_link(gdk_default_filters, node);
00180 g_list_free_1(node);
00181 g_free(filter);
00182
00183 return;
00184 }
00185 }
00186 }
00187
00188 GList *gdk_window_get_toplevels(void)
00189 {
00190 GList *new_list = NULL;
00191 GList *tmp_list;
00192
00193 tmp_list = ((GdkWindowPrivate *) gdk_parent_root)->children;
00194 while (tmp_list) {
00195 new_list = g_list_prepend(new_list, tmp_list->data);
00196 tmp_list = tmp_list->next;
00197 }
00198
00199 return new_list;
00200 }
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211 gboolean gdk_window_is_visible(GdkWindow * window)
00212 {
00213 GdkWindowPrivate *private = (GdkWindowPrivate *) window;
00214
00215 g_return_val_if_fail(window != NULL, FALSE);
00216 g_return_val_if_fail(GDK_IS_WINDOW(window), FALSE);
00217
00218 return private->mapped;
00219 }
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233 gboolean gdk_window_is_viewable(GdkWindow * window)
00234 {
00235 GdkWindowPrivate *private = (GdkWindowPrivate *) window;
00236
00237 g_return_val_if_fail(window != NULL, FALSE);
00238 g_return_val_if_fail(GDK_IS_WINDOW(window), FALSE);
00239
00240 while (private &&
00241 (private != (GdkWindowPrivate *) gdk_parent_root) &&
00242 (private->drawable.window_type != GDK_WINDOW_FOREIGN)) {
00243 if (!private->mapped)
00244 return FALSE;
00245
00246 private = (GdkWindowPrivate *) private->parent;
00247 }
00248
00249 return TRUE;
00250 }