X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gdk%2Fx11%2Fgdkwindow-x11.c;h=56e8cdfb81c01f71f3c0388c69860f12b4f1d420;hb=2e99e7713dc73ea5b7a000ab03b4d64176b9ad40;hp=efbd713144839046787d03a44e19044f876dee3f;hpb=621beb8aaf93c8cfe234723d7001e114ac5a8345;p=~andy%2Fgtk diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index efbd71314..56e8cdfb8 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -26,14 +26,25 @@ #include "gdkinput.h" #include "gdkprivate.h" #include "MwmUtil.h" -#include -#include + +#if HAVE_CONFIG_H +# include +# if STDC_HEADERS +# include +# include +# include +# endif +#else +# include +# include +#endif + #ifdef HAVE_SHAPE_EXT #include #endif -const int event_mask_table[20] = +const int gdk_event_mask_table[20] = { ExposureMask, PointerMotionMask, @@ -56,7 +67,7 @@ const int event_mask_table[20] = 0, /* PROXIMTY_OUT */ SubstructureNotifyMask }; -const int nevent_masks = sizeof(event_mask_table)/sizeof(int); +const int gdk_nevent_masks = sizeof(gdk_event_mask_table)/sizeof(int); static gboolean gdk_window_have_shape_ext (void); @@ -266,6 +277,7 @@ gdk_window_new (GdkWindow *parent, private->xdisplay = parent_display; private->destroyed = FALSE; + private->mapped = FALSE; private->resize_count = 0; private->ref_count = 1; xattributes_mask = 0; @@ -299,10 +311,10 @@ gdk_window_new (GdkWindow *parent, xvisual = ((GdkVisualPrivate*) visual)->xvisual; xattributes.event_mask = StructureNotifyMask; - for (i = 0; i < nevent_masks; i++) + for (i = 0; i < gdk_nevent_masks; i++) { if (attributes->event_mask & (1 << (i + 1))) - xattributes.event_mask |= event_mask_table[i]; + xattributes.event_mask |= gdk_event_mask_table[i]; } if (xattributes.event_mask) @@ -323,7 +335,12 @@ gdk_window_new (GdkWindow *parent, if (attributes_mask & GDK_WA_COLORMAP) private->colormap = attributes->colormap; else - private->colormap = gdk_colormap_get_system (); + { + if ((((GdkVisualPrivate*)gdk_visual_get_system())->xvisual) == xvisual) + private->colormap = gdk_colormap_get_system (); + else + private->colormap = gdk_colormap_new (visual, False); + } xattributes.background_pixel = BlackPixel (gdk_display, gdk_screen); xattributes.border_pixel = BlackPixel (gdk_display, gdk_screen); @@ -495,6 +512,7 @@ gdk_window_foreign_new (guint32 anid) private->ref_count = 1; private->window_type = GDK_WINDOW_FOREIGN; private->destroyed = FALSE; + private->mapped = (attrs.map_state != IsUnmapped); private->extension_events = 0; private->colormap = NULL; @@ -700,6 +718,7 @@ gdk_window_show (GdkWindow *window) private = (GdkWindowPrivate*) window; if (!private->destroyed) { + private->mapped = TRUE; XRaiseWindow (private->xdisplay, private->xwindow); XMapWindow (private->xdisplay, private->xwindow); } @@ -714,7 +733,10 @@ gdk_window_hide (GdkWindow *window) private = (GdkWindowPrivate*) window; if (!private->destroyed) - XUnmapWindow (private->xdisplay, private->xwindow); + { + private->mapped = FALSE; + XUnmapWindow (private->xdisplay, private->xwindow); + } } void @@ -1698,9 +1720,9 @@ gdk_window_get_events (GdkWindow *window) &attrs); event_mask = 0; - for (i = 0; i < nevent_masks; i++) + for (i = 0; i < gdk_nevent_masks; i++) { - if (attrs.your_event_mask & event_mask_table[i]) + if (attrs.your_event_mask & gdk_event_mask_table[i]) event_mask |= 1 << (i + 1); } @@ -1722,10 +1744,10 @@ gdk_window_set_events (GdkWindow *window, return; xevent_mask = StructureNotifyMask; - for (i = 0; i < nevent_masks; i++) + for (i = 0; i < gdk_nevent_masks; i++) { if (event_mask & (1 << (i + 1))) - xevent_mask |= event_mask_table[i]; + xevent_mask |= gdk_event_mask_table[i]; } XSelectInput (gdk_display, private->xwindow, @@ -2454,6 +2476,55 @@ gdk_window_merge_child_shapes (GdkWindow *window) #endif } +/************************************************************* + * gdk_window_is_visible: + * Check if the given window is mapped. + * arguments: + * window: + * results: + * is the window mapped + *************************************************************/ + +gboolean +gdk_window_is_visible (GdkWindow *window) +{ + GdkWindowPrivate *private = (GdkWindowPrivate *)window; + + g_return_val_if_fail (window != NULL, FALSE); + + return private->mapped; +} + +/************************************************************* + * gdk_window_is_viewable: + * Check if the window and all ancestors of the window + * are mapped. (This is not necessarily "viewable" in + * the X sense, since we only check as far as we have + * GDK window parents, not to the root window) + * arguments: + * window: + * results: + * is the window viewable + *************************************************************/ + +gboolean +gdk_window_is_viewable (GdkWindow *window) +{ + GdkWindowPrivate *private = (GdkWindowPrivate *)window; + + g_return_val_if_fail (window != NULL, FALSE); + + while (private && (private != &gdk_root_parent)) + { + if (!private->mapped) + return FALSE; + + private = (GdkWindowPrivate *)private->parent; + } + + return TRUE; +} + void gdk_drawable_set_data (GdkDrawable *drawable, const gchar *key, @@ -2463,3 +2534,4 @@ gdk_drawable_set_data (GdkDrawable *drawable, g_dataset_set_data_full (drawable, key, data, destroy_func); } +