gdkwindow.c

Go to the documentation of this file.
00001 /* GDK - The GIMP Drawing Kit
00002  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Library General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Library General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Library General Public
00015  * License along with this library; if not, write to the
00016  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00017  * Boston, MA 02111-1307, USA.
00018  */
00019 
00020 /*
00021  * Modified by the GTK+ Team and others 1997-1999.  See the AUTHORS
00022  * file for a list of people on the GTK+ Team.  See the ChangeLog
00023  * files for a list of changes.  These files are distributed with
00024  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
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  * gdk_window_is_visible:
00204  *     Check if the given window is mapped.
00205  *   arguments:
00206  *     window: 
00207  *   results:
00208  *     is the window mapped
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  * gdk_window_is_viewable:
00223  *     Check if the window and all ancestors of the window
00224  *     are mapped. (This is not necessarily "viewable" in
00225  *     the X sense, since we only check as far as we have
00226  *     GDK window parents, not to the root window)
00227  *   arguments:
00228  *     window:
00229  *   results:
00230  *     is the window viewable
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 }

Generated on Tue Jul 5 14:14:38 2011 for ROOT_528-00b_version by  doxygen 1.5.1