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 #include <X11/Xutil.h>
22 #include <X11/Xatom.h>
23 #include <netinet/in.h>
27 #include "gdkprivate.h"
33 #include <X11/extensions/shape.h>
36 const int event_mask_table[20] =
40 PointerMotionHintMask,
45 ButtonPressMask | OwnerGrabButtonMask,
46 ButtonReleaseMask | OwnerGrabButtonMask,
57 SubstructureNotifyMask
59 const int nevent_masks = sizeof(event_mask_table)/sizeof(int);
61 static gboolean gdk_window_have_shape_ext (void);
63 /* internal function created for and used by gdk_window_xid_at_coords */
65 gdk_window_xid_at (Window base,
74 GdkWindowPrivate *private;
77 Window child = 0, parent_win = 0, root_win = 0;
79 unsigned int ww, wh, wb, wd, num;
82 window = (GdkWindow*) &gdk_root_parent;
83 private = (GdkWindowPrivate*) window;
84 disp = private->xdisplay;
85 if (!XGetGeometry (disp, base, &root_win, &wx, &wy, &ww, &wh, &wb, &wd))
92 (x < (int) (wx + ww)) &&
93 (y < (int) (wy + wh))))
96 if (!XQueryTree (disp, base, &root_win, &parent_win, &list, &num))
101 for (i = num - 1; ; i--)
103 if ((!excl_child) || (!g_list_find (excludes, (gpointer *) list[i])))
105 if ((child = gdk_window_xid_at (list[i], wx, wy, x, y, excludes, excl_child)) != 0)
120 * The following fucntion by The Rasterman <raster@redhat.com>
121 * This function returns the X Window ID in which the x y location is in
122 * (x and y being relative to the root window), excluding any windows listed
123 * in the GList excludes (this is a list of X Window ID's - gpointer being
126 * This is primarily designed for internal gdk use - for DND for example
127 * when using a shaped icon window as the drag object - you exclude the
128 * X Window ID of the "icon" (perhaps more if excludes may be needed) and
129 * You can get back an X Window ID as to what X Window ID is infact under
130 * those X,Y co-ordinates.
133 gdk_window_xid_at_coords (gint x,
139 GdkWindowPrivate *private;
142 Window root, child = 0, parent_win = 0, root_win = 0;
146 window = (GdkWindow*) &gdk_root_parent;
147 private = (GdkWindowPrivate*) window;
148 disp = private->xdisplay;
149 root = private->xwindow;
150 num = g_list_length (excludes);
153 if (!XQueryTree (disp, root, &root_win, &parent_win, &list, &num))
163 XWindowAttributes xwa;
165 XGetWindowAttributes (disp, list [i], &xwa);
167 if (xwa.map_state != IsViewable)
170 if (excl_child && g_list_find (excludes, (gpointer *) list[i]))
173 if ((child = gdk_window_xid_at (list[i], 0, 0, x, y, excludes, excl_child)) == 0)
178 if (!g_list_find (excludes, (gpointer *) child))
181 XUngrabServer (disp);
188 XUngrabServer (disp);
194 XUngrabServer (disp);
199 gdk_window_init (void)
201 XWindowAttributes xattributes;
204 unsigned int border_width;
208 XGetGeometry (gdk_display, gdk_root_window, &gdk_root_window,
209 &x, &y, &width, &height, &border_width, &depth);
210 XGetWindowAttributes (gdk_display, gdk_root_window, &xattributes);
212 gdk_root_parent.xwindow = gdk_root_window;
213 gdk_root_parent.xdisplay = gdk_display;
214 gdk_root_parent.window_type = GDK_WINDOW_ROOT;
215 gdk_root_parent.window.user_data = NULL;
216 gdk_root_parent.width = width;
217 gdk_root_parent.height = height;
218 gdk_root_parent.children = NULL;
219 gdk_root_parent.colormap = NULL;
220 gdk_root_parent.ref_count = 1;
222 gdk_xid_table_insert (&gdk_root_window, &gdk_root_parent);
226 gdk_window_new (GdkWindow *parent,
227 GdkWindowAttr *attributes,
228 gint attributes_mask)
231 GdkWindowPrivate *private;
232 GdkWindowPrivate *parent_private;
234 Display *parent_display;
237 XSetWindowAttributes xattributes;
238 long xattributes_mask;
239 XSizeHints size_hints;
241 XClassHint *class_hint;
247 g_return_val_if_fail (attributes != NULL, NULL);
250 parent = (GdkWindow*) &gdk_root_parent;
252 parent_private = (GdkWindowPrivate*) parent;
253 if (parent_private->destroyed)
256 xparent = parent_private->xwindow;
257 parent_display = parent_private->xdisplay;
259 private = g_new (GdkWindowPrivate, 1);
260 window = (GdkWindow*) private;
262 private->parent = parent;
265 parent_private->children = g_list_prepend (parent_private->children, window);
267 private->xdisplay = parent_display;
268 private->destroyed = FALSE;
269 private->resize_count = 0;
270 private->ref_count = 1;
271 xattributes_mask = 0;
273 if (attributes_mask & GDK_WA_X)
278 if (attributes_mask & GDK_WA_Y)
285 private->width = (attributes->width > 1) ? (attributes->width) : (1);
286 private->height = (attributes->height > 1) ? (attributes->height) : (1);
287 private->window_type = attributes->window_type;
288 private->extension_events = FALSE;
290 private->filters = NULL;
291 private->children = NULL;
293 window->user_data = NULL;
295 if (attributes_mask & GDK_WA_VISUAL)
296 visual = attributes->visual;
298 visual = gdk_visual_get_system ();
299 xvisual = ((GdkVisualPrivate*) visual)->xvisual;
301 xattributes.event_mask = StructureNotifyMask;
302 for (i = 0; i < nevent_masks; i++)
304 if (attributes->event_mask & (1 << (i + 1)))
305 xattributes.event_mask |= event_mask_table[i];
308 if (xattributes.event_mask)
309 xattributes_mask |= CWEventMask;
311 if(attributes_mask & GDK_WA_NOREDIR) {
312 xattributes.override_redirect =
313 (attributes->override_redirect == FALSE)?False:True;
314 xattributes_mask |= CWOverrideRedirect;
316 xattributes.override_redirect = False;
318 if (attributes->wclass == GDK_INPUT_OUTPUT)
321 depth = visual->depth;
323 if (attributes_mask & GDK_WA_COLORMAP)
324 private->colormap = attributes->colormap;
327 if ((((GdkVisualPrivate*)gdk_visual_get_system())->xvisual) == xvisual)
328 private->colormap = gdk_colormap_get_system ();
330 private->colormap = gdk_colormap_new (visual, False);
333 xattributes.background_pixel = BlackPixel (gdk_display, gdk_screen);
334 xattributes.border_pixel = BlackPixel (gdk_display, gdk_screen);
335 xattributes_mask |= CWBorderPixel | CWBackPixel;
337 switch (private->window_type)
339 case GDK_WINDOW_TOPLEVEL:
340 xattributes.colormap = ((GdkColormapPrivate*) private->colormap)->xcolormap;
341 xattributes_mask |= CWColormap;
343 xparent = gdk_root_window;
346 case GDK_WINDOW_CHILD:
347 xattributes.colormap = ((GdkColormapPrivate*) private->colormap)->xcolormap;
348 xattributes_mask |= CWColormap;
351 case GDK_WINDOW_DIALOG:
352 xattributes.colormap = ((GdkColormapPrivate*) private->colormap)->xcolormap;
353 xattributes_mask |= CWColormap;
355 xparent = gdk_root_window;
358 case GDK_WINDOW_TEMP:
359 xattributes.colormap = ((GdkColormapPrivate*) private->colormap)->xcolormap;
360 xattributes_mask |= CWColormap;
362 xparent = gdk_root_window;
364 xattributes.save_under = True;
365 xattributes.override_redirect = True;
366 xattributes.cursor = None;
367 xattributes_mask |= CWSaveUnder | CWOverrideRedirect;
369 case GDK_WINDOW_ROOT:
370 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
372 case GDK_WINDOW_PIXMAP:
373 g_error ("cannot make windows of type GDK_WINDOW_PIXMAP (use gdk_pixmap_new)");
381 private->colormap = NULL;
384 private->xwindow = XCreateWindow (private->xdisplay, xparent,
385 x, y, private->width, private->height,
386 0, depth, class, xvisual,
387 xattributes_mask, &xattributes);
388 gdk_window_ref (window);
389 gdk_xid_table_insert (&private->xwindow, window);
391 if (private->colormap)
392 gdk_colormap_ref (private->colormap);
394 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
395 (attributes->cursor) :
398 switch (private->window_type)
400 case GDK_WINDOW_DIALOG:
401 XSetTransientForHint (private->xdisplay, private->xwindow, xparent);
402 case GDK_WINDOW_TOPLEVEL:
403 case GDK_WINDOW_TEMP:
404 XSetWMProtocols (private->xdisplay, private->xwindow, gdk_wm_window_protocols, 2);
406 case GDK_WINDOW_CHILD:
407 if ((attributes->wclass == GDK_INPUT_OUTPUT) &&
408 (private->colormap != gdk_colormap_get_system ()) &&
409 (private->colormap != gdk_window_get_colormap (gdk_window_get_toplevel (window))))
411 GDK_NOTE (MISC, g_message ("adding colormap window\n"));
412 gdk_window_add_colormap_windows (window);
421 size_hints.flags = PSize;
422 size_hints.width = private->width;
423 size_hints.height = private->height;
425 wm_hints.flags = InputHint | StateHint | WindowGroupHint;
426 wm_hints.window_group = gdk_leader_window;
427 wm_hints.input = True;
428 wm_hints.initial_state = NormalState;
430 /* FIXME: Is there any point in doing this? Do any WM's pay
431 * attention to PSize, and even if they do, is this the
434 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
436 XSetWMHints (private->xdisplay, private->xwindow, &wm_hints);
438 if (attributes_mask & GDK_WA_TITLE)
439 title = attributes->title;
441 title = g_get_prgname ();
443 XmbSetWMProperties (private->xdisplay, private->xwindow,
448 if (attributes_mask & GDK_WA_WMCLASS)
450 class_hint = XAllocClassHint ();
451 class_hint->res_name = attributes->wmclass_name;
452 class_hint->res_class = attributes->wmclass_class;
453 XSetClassHint (private->xdisplay, private->xwindow, class_hint);
462 gdk_window_foreign_new (guint32 anid)
465 GdkWindowPrivate *private;
466 GdkWindowPrivate *parent_private;
467 XWindowAttributes attrs;
469 Window *children = NULL;
472 if(!XGetWindowAttributes (gdk_display, anid, &attrs)) {
473 g_warning("XGetWindowAttributes failed on window ID %d\n", anid);
477 private = g_new (GdkWindowPrivate, 1);
478 window = (GdkWindow*) private;
480 /* FIXME: This is pretty expensive. Maybe the caller should supply
482 XQueryTree (gdk_display, anid, &root, &parent, &children, &nchildren);
486 private->parent = gdk_xid_table_lookup (parent);
488 parent_private = (GdkWindowPrivate *)private->parent;
491 parent_private->children = g_list_prepend (parent_private->children, window);
493 private->xwindow = anid;
494 private->xdisplay = gdk_display;
495 private->x = attrs.x;
496 private->y = attrs.y;
497 private->width = attrs.width;
498 private->height = attrs.height;
499 private->resize_count = 0;
500 private->ref_count = 1;
501 private->window_type = GDK_WINDOW_FOREIGN;
502 private->destroyed = FALSE;
503 private->extension_events = 0;
505 private->colormap = NULL;
507 private->filters = NULL;
508 private->children = NULL;
510 window->user_data = NULL;
512 gdk_window_ref (window);
513 gdk_xid_table_insert (&private->xwindow, window);
518 /* Call this function when you want a window and all its children to
519 disappear. When xdestroy is true, a request to destroy the XWindow
520 is sent out. When it is false, it is assumed that the XWindow has
521 been or will be destroyed by destroying some ancestor of this
525 gdk_window_internal_destroy (GdkWindow *window, gboolean xdestroy,
526 gboolean our_destroy)
528 GdkWindowPrivate *private;
529 GdkWindowPrivate *temp_private;
530 GdkWindow *temp_window;
534 g_return_if_fail (window != NULL);
536 private = (GdkWindowPrivate*) window;
538 switch (private->window_type)
540 case GDK_WINDOW_TOPLEVEL:
541 case GDK_WINDOW_CHILD:
542 case GDK_WINDOW_DIALOG:
543 case GDK_WINDOW_TEMP:
544 case GDK_WINDOW_FOREIGN:
545 if (!private->destroyed)
549 GdkWindowPrivate *parent_private = (GdkWindowPrivate *)private->parent;
550 if (parent_private->children)
551 parent_private->children = g_list_remove (parent_private->children, window);
554 if (private->window_type != GDK_WINDOW_FOREIGN)
556 children = tmp = private->children;
557 private->children = NULL;
561 temp_window = tmp->data;
564 temp_private = (GdkWindowPrivate*) temp_window;
566 gdk_window_internal_destroy (temp_window, FALSE,
570 g_list_free (children);
573 if (private->extension_events != 0)
574 gdk_input_window_destroy (window);
576 if (private->filters)
578 tmp = private->filters;
586 g_list_free (private->filters);
587 private->filters = NULL;
590 if (private->window_type == GDK_WINDOW_FOREIGN)
592 if (our_destroy && (private->parent != NULL))
594 /* It's somebody elses window, but in our heirarchy,
595 * so reparent it to the root window, and then send
596 * it a delete event, as if we were a WM
598 XClientMessageEvent xevent;
600 gdk_window_hide (window);
601 gdk_window_reparent (window, NULL, 0, 0);
603 xevent.type = ClientMessage;
604 xevent.window = private->xwindow;
605 xevent.message_type = gdk_wm_protocols;
607 xevent.data.l[0] = gdk_wm_delete_window;
608 xevent.data.l[1] = CurrentTime;
610 XSendEvent (private->xdisplay, private->xwindow,
611 False, 0, (XEvent *)&xevent);
615 XDestroyWindow (private->xdisplay, private->xwindow);
617 if (private->colormap)
618 gdk_colormap_unref (private->colormap);
620 private->destroyed = TRUE;
624 case GDK_WINDOW_ROOT:
625 g_error ("attempted to destroy root window");
628 case GDK_WINDOW_PIXMAP:
629 g_error ("called gdk_window_destroy on a pixmap (use gdk_pixmap_unref)");
634 /* Like internal_destroy, but also destroys the reference created by
638 gdk_window_destroy (GdkWindow *window)
640 gdk_window_internal_destroy (window, TRUE, TRUE);
641 gdk_window_unref (window);
644 /* This function is called when the XWindow is really gone. */
647 gdk_window_destroy_notify (GdkWindow *window)
649 GdkWindowPrivate *private;
651 g_return_if_fail (window != NULL);
653 private = (GdkWindowPrivate*) window;
655 if (!private->destroyed)
657 if (private->window_type == GDK_WINDOW_FOREIGN)
658 gdk_window_internal_destroy (window, FALSE, FALSE);
660 g_warning ("GdkWindow %#lx unexpectedly destroyed", private->xwindow);
663 gdk_xid_table_remove (private->xwindow);
664 gdk_window_unref (window);
668 gdk_window_ref (GdkWindow *window)
670 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
671 g_return_val_if_fail (window != NULL, NULL);
673 private->ref_count += 1;
678 gdk_window_unref (GdkWindow *window)
680 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
681 g_return_if_fail (window != NULL);
683 private->ref_count -= 1;
684 if (private->ref_count == 0)
686 if (!private->destroyed)
688 if (private->window_type == GDK_WINDOW_FOREIGN)
689 gdk_xid_table_remove (private->xwindow);
691 g_warning ("losing last reference to undestroyed window\n");
693 g_dataset_destroy (window);
699 gdk_window_show (GdkWindow *window)
701 GdkWindowPrivate *private;
703 g_return_if_fail (window != NULL);
705 private = (GdkWindowPrivate*) window;
706 if (!private->destroyed)
708 XRaiseWindow (private->xdisplay, private->xwindow);
709 XMapWindow (private->xdisplay, private->xwindow);
714 gdk_window_hide (GdkWindow *window)
716 GdkWindowPrivate *private;
718 g_return_if_fail (window != NULL);
720 private = (GdkWindowPrivate*) window;
721 if (!private->destroyed)
722 XUnmapWindow (private->xdisplay, private->xwindow);
726 gdk_window_withdraw (GdkWindow *window)
728 GdkWindowPrivate *private;
730 g_return_if_fail (window != NULL);
732 private = (GdkWindowPrivate*) window;
733 if (!private->destroyed)
734 XWithdrawWindow (private->xdisplay, private->xwindow, 0);
738 gdk_window_move (GdkWindow *window,
742 GdkWindowPrivate *private;
744 g_return_if_fail (window != NULL);
746 private = (GdkWindowPrivate*) window;
747 if (!private->destroyed)
749 XMoveWindow (private->xdisplay, private->xwindow, x, y);
751 if (private->window_type == GDK_WINDOW_CHILD)
760 gdk_window_resize (GdkWindow *window,
764 GdkWindowPrivate *private;
766 g_return_if_fail (window != NULL);
773 private = (GdkWindowPrivate*) window;
775 if (!private->destroyed &&
776 ((private->resize_count > 0) ||
777 (private->width != (guint16) width) ||
778 (private->height != (guint16) height)))
780 XResizeWindow (private->xdisplay, private->xwindow, width, height);
781 private->resize_count += 1;
783 if (private->window_type == GDK_WINDOW_CHILD)
785 private->width = width;
786 private->height = height;
792 gdk_window_move_resize (GdkWindow *window,
798 GdkWindowPrivate *private;
800 g_return_if_fail (window != NULL);
807 private = (GdkWindowPrivate*) window;
808 if (!private->destroyed)
810 XMoveResizeWindow (private->xdisplay, private->xwindow, x, y, width, height);
812 if (private->window_type == GDK_WINDOW_CHILD)
816 private->width = width;
817 private->height = height;
823 gdk_window_reparent (GdkWindow *window,
824 GdkWindow *new_parent,
828 GdkWindowPrivate *window_private;
829 GdkWindowPrivate *parent_private;
830 GdkWindowPrivate *old_parent_private;
832 g_return_if_fail (window != NULL);
835 new_parent = (GdkWindow*) &gdk_root_parent;
837 window_private = (GdkWindowPrivate*) window;
838 old_parent_private = (GdkWindowPrivate*)window_private->parent;
839 parent_private = (GdkWindowPrivate*) new_parent;
841 if (!window_private->destroyed && !parent_private->destroyed)
842 XReparentWindow (window_private->xdisplay,
843 window_private->xwindow,
844 parent_private->xwindow,
847 window_private->parent = new_parent;
849 if (old_parent_private)
850 old_parent_private->children = g_list_remove (old_parent_private->children, window);
851 parent_private->children = g_list_prepend (parent_private->children, window);
856 gdk_window_clear (GdkWindow *window)
858 GdkWindowPrivate *private;
860 g_return_if_fail (window != NULL);
862 private = (GdkWindowPrivate*) window;
864 if (!private->destroyed)
865 XClearWindow (private->xdisplay, private->xwindow);
869 gdk_window_clear_area (GdkWindow *window,
875 GdkWindowPrivate *private;
877 g_return_if_fail (window != NULL);
879 private = (GdkWindowPrivate*) window;
881 if (!private->destroyed)
882 XClearArea (private->xdisplay, private->xwindow,
883 x, y, width, height, False);
887 gdk_window_clear_area_e (GdkWindow *window,
893 GdkWindowPrivate *private;
895 g_return_if_fail (window != NULL);
897 private = (GdkWindowPrivate*) window;
899 if (!private->destroyed)
900 XClearArea (private->xdisplay, private->xwindow,
901 x, y, width, height, True);
905 gdk_window_copy_area (GdkWindow *window,
909 GdkWindow *source_window,
915 GdkWindowPrivate *src_private;
916 GdkWindowPrivate *dest_private;
917 GdkGCPrivate *gc_private;
919 g_return_if_fail (window != NULL);
920 g_return_if_fail (gc != NULL);
922 if (source_window == NULL)
923 source_window = window;
925 src_private = (GdkWindowPrivate*) source_window;
926 dest_private = (GdkWindowPrivate*) window;
927 gc_private = (GdkGCPrivate*) gc;
929 if (!src_private->destroyed && !dest_private->destroyed)
931 XCopyArea (dest_private->xdisplay, src_private->xwindow, dest_private->xwindow,
940 gdk_window_raise (GdkWindow *window)
942 GdkWindowPrivate *private;
944 g_return_if_fail (window != NULL);
946 private = (GdkWindowPrivate*) window;
948 if (!private->destroyed)
949 XRaiseWindow (private->xdisplay, private->xwindow);
953 gdk_window_lower (GdkWindow *window)
955 GdkWindowPrivate *private;
957 g_return_if_fail (window != NULL);
959 private = (GdkWindowPrivate*) window;
961 if (!private->destroyed)
962 XLowerWindow (private->xdisplay, private->xwindow);
966 gdk_window_set_user_data (GdkWindow *window,
969 g_return_if_fail (window != NULL);
971 window->user_data = user_data;
975 gdk_window_set_hints (GdkWindow *window,
984 GdkWindowPrivate *private;
985 XSizeHints size_hints;
987 g_return_if_fail (window != NULL);
989 private = (GdkWindowPrivate*) window;
990 if (private->destroyed)
993 size_hints.flags = 0;
995 if (flags & GDK_HINT_POS)
997 size_hints.flags |= PPosition;
1002 if (flags & GDK_HINT_MIN_SIZE)
1004 size_hints.flags |= PMinSize;
1005 size_hints.min_width = min_width;
1006 size_hints.min_height = min_height;
1009 if (flags & GDK_HINT_MAX_SIZE)
1011 size_hints.flags |= PMaxSize;
1012 size_hints.max_width = max_width;
1013 size_hints.max_height = max_height;
1017 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
1021 gdk_window_set_geometry_hints (GdkWindow *window,
1022 GdkGeometry *geometry,
1023 GdkWindowHints geom_mask)
1025 GdkWindowPrivate *private;
1026 XSizeHints size_hints;
1028 g_return_if_fail (window != NULL);
1030 private = (GdkWindowPrivate*) window;
1031 if (private->destroyed)
1034 size_hints.flags = 0;
1036 if (geom_mask & GDK_HINT_POS)
1037 size_hints.flags |= PPosition;
1039 if (geom_mask & GDK_HINT_MIN_SIZE)
1041 size_hints.flags |= PMinSize;
1042 size_hints.min_width = geometry->min_width;
1043 size_hints.min_height = geometry->min_height;
1046 if (geom_mask & GDK_HINT_MAX_SIZE)
1048 size_hints.flags |= PMaxSize;
1049 size_hints.max_width = geometry->max_width;
1050 size_hints.max_height = geometry->max_height;
1053 if (geom_mask & GDK_HINT_BASE_SIZE)
1055 size_hints.flags |= PBaseSize;
1056 size_hints.base_width = geometry->base_width;
1057 size_hints.base_height = geometry->base_height;
1060 if (geom_mask & GDK_HINT_RESIZE_INC)
1062 size_hints.flags |= PResizeInc;
1063 size_hints.width_inc = geometry->width_inc;
1064 size_hints.height_inc = geometry->height_inc;
1067 if (geom_mask & GDK_HINT_ASPECT)
1069 size_hints.flags |= PAspect;
1070 if (geometry->min_aspect <= 1)
1072 size_hints.min_aspect.x = G_MAXINT * geometry->min_aspect;
1073 size_hints.min_aspect.y = G_MAXINT;
1077 size_hints.min_aspect.x = G_MAXINT;
1078 size_hints.min_aspect.y = G_MAXINT / geometry->min_aspect;;
1080 if (geometry->max_aspect <= 1)
1082 size_hints.max_aspect.x = G_MAXINT * geometry->max_aspect;
1083 size_hints.max_aspect.y = G_MAXINT;
1087 size_hints.max_aspect.x = G_MAXINT;
1088 size_hints.max_aspect.y = G_MAXINT / geometry->max_aspect;;
1093 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
1097 gdk_window_set_title (GdkWindow *window,
1100 GdkWindowPrivate *private;
1102 g_return_if_fail (window != NULL);
1104 private = (GdkWindowPrivate*) window;
1105 if (!private->destroyed)
1106 XmbSetWMProperties (private->xdisplay, private->xwindow,
1107 title, title, NULL, 0, NULL, NULL, NULL);
1111 gdk_window_set_role (GdkWindow *window,
1114 GdkWindowPrivate *private;
1116 g_return_if_fail (window != NULL);
1118 private = (GdkWindowPrivate*) window;
1121 XChangeProperty (private->xdisplay, private->xwindow,
1122 gdk_atom_intern ("WM_WINDOW_ROLE", FALSE), XA_STRING,
1123 8, PropModeReplace, role, strlen(role));
1125 XDeleteProperty (private->xdisplay, private->xwindow,
1126 gdk_atom_intern ("WM_WINDOW_ROLE", FALSE));
1130 gdk_window_set_transient_for (GdkWindow *window,
1133 GdkWindowPrivate *private;
1134 GdkWindowPrivate *parent_private;
1136 g_return_if_fail (window != NULL);
1138 private = (GdkWindowPrivate*) window;
1139 parent_private = (GdkWindowPrivate*) parent;
1141 if (!private->destroyed && !parent_private->destroyed)
1142 XSetTransientForHint (private->xdisplay,
1143 private->xwindow, parent_private->xwindow);
1147 gdk_window_set_background (GdkWindow *window,
1150 GdkWindowPrivate *private;
1152 g_return_if_fail (window != NULL);
1154 private = (GdkWindowPrivate*) window;
1155 if (!private->destroyed)
1156 XSetWindowBackground (private->xdisplay, private->xwindow, color->pixel);
1160 gdk_window_set_back_pixmap (GdkWindow *window,
1162 gint parent_relative)
1164 GdkWindowPrivate *window_private;
1165 GdkPixmapPrivate *pixmap_private;
1168 g_return_if_fail (window != NULL);
1170 window_private = (GdkWindowPrivate*) window;
1171 pixmap_private = (GdkPixmapPrivate*) pixmap;
1174 xpixmap = pixmap_private->xwindow;
1178 if (parent_relative)
1179 xpixmap = ParentRelative;
1181 if (!window_private->destroyed)
1182 XSetWindowBackgroundPixmap (window_private->xdisplay, window_private->xwindow, xpixmap);
1186 gdk_window_set_cursor (GdkWindow *window,
1189 GdkWindowPrivate *window_private;
1190 GdkCursorPrivate *cursor_private;
1193 g_return_if_fail (window != NULL);
1195 window_private = (GdkWindowPrivate*) window;
1196 cursor_private = (GdkCursorPrivate*) cursor;
1201 xcursor = cursor_private->xcursor;
1203 if (!window_private->destroyed)
1204 XDefineCursor (window_private->xdisplay, window_private->xwindow, xcursor);
1208 gdk_window_set_colormap (GdkWindow *window,
1209 GdkColormap *colormap)
1211 GdkWindowPrivate *window_private;
1212 GdkColormapPrivate *colormap_private;
1214 g_return_if_fail (window != NULL);
1215 g_return_if_fail (colormap != NULL);
1217 window_private = (GdkWindowPrivate*) window;
1218 colormap_private = (GdkColormapPrivate*) colormap;
1220 if (!window_private->destroyed)
1222 XSetWindowColormap (window_private->xdisplay,
1223 window_private->xwindow,
1224 colormap_private->xcolormap);
1226 if (window_private->colormap)
1227 gdk_colormap_unref (window_private->colormap);
1228 window_private->colormap = colormap;
1229 gdk_colormap_ref (window_private->colormap);
1231 if (window_private->window_type != GDK_WINDOW_TOPLEVEL)
1232 gdk_window_add_colormap_windows (window);
1237 gdk_window_get_user_data (GdkWindow *window,
1240 g_return_if_fail (window != NULL);
1242 *data = window->user_data;
1246 gdk_window_get_geometry (GdkWindow *window,
1253 GdkWindowPrivate *window_private;
1259 guint tborder_width;
1263 window = (GdkWindow*) &gdk_root_parent;
1265 window_private = (GdkWindowPrivate*) window;
1267 if (!window_private->destroyed)
1269 XGetGeometry (window_private->xdisplay, window_private->xwindow,
1270 &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
1286 gdk_window_get_position (GdkWindow *window,
1290 GdkWindowPrivate *window_private;
1292 g_return_if_fail (window != NULL);
1294 window_private = (GdkWindowPrivate*) window;
1297 *x = window_private->x;
1299 *y = window_private->y;
1303 gdk_window_get_size (GdkWindow *window,
1307 GdkWindowPrivate *window_private;
1309 g_return_if_fail (window != NULL);
1311 window_private = (GdkWindowPrivate*) window;
1314 *width = window_private->width;
1316 *height = window_private->height;
1320 gdk_window_get_visual (GdkWindow *window)
1322 GdkWindowPrivate *window_private;
1323 XWindowAttributes window_attributes;
1325 g_return_val_if_fail (window != NULL, NULL);
1327 window_private = (GdkWindowPrivate*) window;
1328 /* Huh? ->parent is never set for a pixmap. We should just return
1331 while (window_private && (window_private->window_type == GDK_WINDOW_PIXMAP))
1332 window_private = (GdkWindowPrivate*) window_private->parent;
1334 if (window_private && !window_private->destroyed)
1336 if (window_private->colormap == NULL)
1338 XGetWindowAttributes (window_private->xdisplay,
1339 window_private->xwindow,
1340 &window_attributes);
1341 return gdk_visual_lookup (window_attributes.visual);
1344 return ((GdkColormapPrivate *)window_private->colormap)->visual;
1351 gdk_window_get_colormap (GdkWindow *window)
1353 GdkWindowPrivate *window_private;
1354 XWindowAttributes window_attributes;
1356 g_return_val_if_fail (window != NULL, NULL);
1357 window_private = (GdkWindowPrivate*) window;
1359 g_return_val_if_fail (window_private->window_type != GDK_WINDOW_PIXMAP, NULL);
1360 if (!window_private->destroyed)
1362 if (window_private->colormap == NULL)
1364 XGetWindowAttributes (window_private->xdisplay,
1365 window_private->xwindow,
1366 &window_attributes);
1367 return gdk_colormap_lookup (window_attributes.colormap);
1370 return window_private->colormap;
1377 gdk_window_get_type (GdkWindow *window)
1379 GdkWindowPrivate *window_private;
1381 g_return_val_if_fail (window != NULL, (GdkWindowType) -1);
1383 window_private = (GdkWindowPrivate*) window;
1384 return window_private->window_type;
1388 gdk_window_get_origin (GdkWindow *window,
1392 GdkWindowPrivate *private;
1398 g_return_val_if_fail (window != NULL, 0);
1400 private = (GdkWindowPrivate*) window;
1402 if (!private->destroyed)
1404 return_val = XTranslateCoordinates (private->xdisplay,
1423 gdk_window_get_deskrelative_origin (GdkWindow *window,
1427 GdkWindowPrivate *private;
1428 gboolean return_val = FALSE;
1429 gint num_children, format_return;
1430 Window win, *child, parent, root;
1434 static Atom atom = 0;
1435 gulong number_return, bytes_after_return;
1436 guchar *data_return;
1438 g_return_val_if_fail (window != NULL, 0);
1440 private = (GdkWindowPrivate*) window;
1442 if (!private->destroyed)
1445 atom = XInternAtom(private->xdisplay, "ENLIGHTENMENT_DESKTOP", False);
1446 win = private->xwindow;
1448 while (XQueryTree(private->xdisplay, win, &root, &parent,
1449 &child, (unsigned int *)&num_children))
1451 if ((child) && (num_children > 0))
1463 XGetWindowProperty(private->xdisplay, win, atom, 0, 0,
1464 False, XA_CARDINAL, &type_return, &format_return,
1465 &number_return, &bytes_after_return, &data_return);
1466 if (type_return == XA_CARDINAL)
1473 return_val = XTranslateCoordinates (private->xdisplay,
1489 gdk_window_get_root_origin (GdkWindow *window,
1493 GdkWindowPrivate *private;
1498 unsigned int nchildren;
1500 g_return_if_fail (window != NULL);
1502 private = (GdkWindowPrivate*) window;
1507 if (private->destroyed)
1510 while (private->parent && ((GdkWindowPrivate*) private->parent)->parent)
1511 private = (GdkWindowPrivate*) private->parent;
1512 if (private->destroyed)
1515 xparent = private->xwindow;
1519 if (!XQueryTree (private->xdisplay, xwindow,
1521 &children, &nchildren))
1527 while (xparent != root);
1529 if (xparent == root)
1531 unsigned int ww, wh, wb, wd;
1534 if (XGetGeometry (private->xdisplay, xwindow, &root, &wx, &wy, &ww, &wh, &wb, &wd))
1545 gdk_window_get_pointer (GdkWindow *window,
1548 GdkModifierType *mask)
1550 GdkWindowPrivate *private;
1551 GdkWindow *return_val;
1557 unsigned int xmask = 0;
1560 window = (GdkWindow*) &gdk_root_parent;
1562 private = (GdkWindowPrivate*) window;
1565 if (!private->destroyed &&
1566 XQueryPointer (private->xdisplay, private->xwindow, &root, &child,
1567 &rootx, &rooty, &winx, &winy, &xmask))
1570 return_val = gdk_window_lookup (child);
1584 gdk_window_at_pointer (gint *win_x,
1587 GdkWindowPrivate *private;
1591 Window xwindow_last = 0;
1592 int rootx = -1, rooty = -1;
1596 private = &gdk_root_parent;
1598 xwindow = private->xwindow;
1600 XGrabServer (private->xdisplay);
1603 xwindow_last = xwindow;
1604 XQueryPointer (private->xdisplay,
1611 XUngrabServer (private->xdisplay);
1613 window = gdk_window_lookup (xwindow_last);
1616 *win_x = window ? winx : -1;
1618 *win_y = window ? winy : -1;
1624 gdk_window_get_parent (GdkWindow *window)
1626 g_return_val_if_fail (window != NULL, NULL);
1628 return ((GdkWindowPrivate*) window)->parent;
1632 gdk_window_get_toplevel (GdkWindow *window)
1634 GdkWindowPrivate *private;
1636 g_return_val_if_fail (window != NULL, NULL);
1638 private = (GdkWindowPrivate*) window;
1640 while (private->window_type == GDK_WINDOW_CHILD)
1642 window = ((GdkWindowPrivate*) window)->parent;
1643 private = (GdkWindowPrivate*) window;
1650 gdk_window_get_children (GdkWindow *window)
1652 GdkWindowPrivate *private;
1658 unsigned int nchildren;
1661 g_return_val_if_fail (window != NULL, NULL);
1663 private = (GdkWindowPrivate*) window;
1664 if (private->destroyed)
1667 XQueryTree (private->xdisplay, private->xwindow,
1668 &root, &parent, &xchildren, &nchildren);
1674 for (i = 0; i < nchildren; i++)
1676 child = gdk_window_lookup (xchildren[i]);
1678 children = g_list_prepend (children, child);
1689 gdk_window_get_events (GdkWindow *window)
1691 GdkWindowPrivate *private;
1692 XWindowAttributes attrs;
1693 GdkEventMask event_mask;
1696 g_return_val_if_fail (window != NULL, 0);
1698 private = (GdkWindowPrivate*) window;
1699 if (private->destroyed)
1702 XGetWindowAttributes (gdk_display, private->xwindow,
1706 for (i = 0; i < nevent_masks; i++)
1708 if (attrs.your_event_mask & event_mask_table[i])
1709 event_mask |= 1 << (i + 1);
1716 gdk_window_set_events (GdkWindow *window,
1717 GdkEventMask event_mask)
1719 GdkWindowPrivate *private;
1723 g_return_if_fail (window != NULL);
1725 private = (GdkWindowPrivate*) window;
1726 if (private->destroyed)
1729 xevent_mask = StructureNotifyMask;
1730 for (i = 0; i < nevent_masks; i++)
1732 if (event_mask & (1 << (i + 1)))
1733 xevent_mask |= event_mask_table[i];
1736 XSelectInput (gdk_display, private->xwindow,
1741 gdk_window_add_colormap_windows (GdkWindow *window)
1743 GdkWindow *toplevel;
1744 GdkWindowPrivate *toplevel_private;
1745 GdkWindowPrivate *window_private;
1746 Window *old_windows;
1747 Window *new_windows;
1750 g_return_if_fail (window != NULL);
1752 toplevel = gdk_window_get_toplevel (window);
1753 toplevel_private = (GdkWindowPrivate*) toplevel;
1754 window_private = (GdkWindowPrivate*) window;
1755 if (window_private->destroyed)
1759 if (!XGetWMColormapWindows (toplevel_private->xdisplay,
1760 toplevel_private->xwindow,
1761 &old_windows, &count))
1766 for (i = 0; i < count; i++)
1767 if (old_windows[i] == window_private->xwindow)
1769 XFree (old_windows);
1773 new_windows = g_new (Window, count + 1);
1775 for (i = 0; i < count; i++)
1776 new_windows[i] = old_windows[i];
1777 new_windows[count] = window_private->xwindow;
1779 XSetWMColormapWindows (toplevel_private->xdisplay,
1780 toplevel_private->xwindow,
1781 new_windows, count + 1);
1783 g_free (new_windows);
1785 XFree (old_windows);
1789 gdk_window_have_shape_ext (void)
1791 enum { UNKNOWN, NO, YES };
1792 static gint have_shape = UNKNOWN;
1794 if (have_shape == UNKNOWN)
1797 if (XQueryExtension(gdk_display, "SHAPE", &ignore, &ignore, &ignore))
1803 return (have_shape == YES);
1807 * This needs the X11 shape extension.
1808 * If not available, shaped windows will look
1809 * ugly, but programs still work. Stefan Wille
1812 gdk_window_shape_combine_mask (GdkWindow *window,
1816 GdkWindowPrivate *window_private;
1819 g_return_if_fail (window != NULL);
1821 #ifdef HAVE_SHAPE_EXT
1822 window_private = (GdkWindowPrivate*) window;
1823 if (window_private->destroyed)
1826 if (gdk_window_have_shape_ext())
1830 GdkWindowPrivate *pixmap_private;
1832 pixmap_private = (GdkWindowPrivate*) mask;
1833 pixmap = (Pixmap) pixmap_private->xwindow;
1842 XShapeCombineMask (window_private->xdisplay,
1843 window_private->xwindow,
1849 #endif /* HAVE_SHAPE_EXT */
1853 gdk_window_add_filter (GdkWindow *window,
1854 GdkFilterFunc function,
1857 GdkWindowPrivate *private;
1859 GdkEventFilter *filter;
1861 private = (GdkWindowPrivate*) window;
1862 if (private && private->destroyed)
1866 tmp_list = private->filters;
1868 tmp_list = gdk_default_filters;
1872 filter = (GdkEventFilter *)tmp_list->data;
1873 if ((filter->function == function) && (filter->data == data))
1875 tmp_list = tmp_list->next;
1878 filter = g_new (GdkEventFilter, 1);
1879 filter->function = function;
1880 filter->data = data;
1883 private->filters = g_list_append (private->filters, filter);
1885 gdk_default_filters = g_list_append (gdk_default_filters, filter);
1889 gdk_window_remove_filter (GdkWindow *window,
1890 GdkFilterFunc function,
1893 GdkWindowPrivate *private;
1894 GList *tmp_list, *node;
1895 GdkEventFilter *filter;
1897 private = (GdkWindowPrivate*) window;
1900 tmp_list = private->filters;
1902 tmp_list = gdk_default_filters;
1906 filter = (GdkEventFilter *)tmp_list->data;
1908 tmp_list = tmp_list->next;
1910 if ((filter->function == function) && (filter->data == data))
1913 private->filters = g_list_remove_link (private->filters, node);
1915 gdk_default_filters = g_list_remove_link (gdk_default_filters, tmp_list);
1916 g_list_free_1 (node);
1925 gdk_window_set_override_redirect(GdkWindow *window,
1926 gboolean override_redirect)
1928 GdkWindowPrivate *private;
1929 XSetWindowAttributes attr;
1931 g_return_if_fail (window != NULL);
1932 private = (GdkWindowPrivate*) window;
1933 if (private->destroyed)
1936 attr.override_redirect = (override_redirect == FALSE)?False:True;
1937 XChangeWindowAttributes(gdk_display,
1938 ((GdkWindowPrivate *)window)->xwindow,
1944 gdk_window_set_icon (GdkWindow *window,
1945 GdkWindow *icon_window,
1950 GdkWindowPrivate *window_private;
1951 GdkWindowPrivate *private;
1953 g_return_if_fail (window != NULL);
1954 window_private = (GdkWindowPrivate*) window;
1955 if (window_private->destroyed)
1960 if (icon_window != NULL)
1962 private = (GdkWindowPrivate *)icon_window;
1963 wm_hints.flags |= IconWindowHint;
1964 wm_hints.icon_window = private->xwindow;
1969 private = (GdkWindowPrivate *)pixmap;
1970 wm_hints.flags |= IconPixmapHint;
1971 wm_hints.icon_pixmap = private->xwindow;
1976 private = (GdkWindowPrivate *)mask;
1977 wm_hints.flags |= IconMaskHint;
1978 wm_hints.icon_mask = private->xwindow;
1981 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1985 gdk_window_set_icon_name (GdkWindow *window,
1988 GdkWindowPrivate *window_private;
1989 XTextProperty property;
1992 g_return_if_fail (window != NULL);
1993 window_private = (GdkWindowPrivate*) window;
1994 if (window_private->destroyed)
1996 res = XmbTextListToTextProperty (window_private->xdisplay,
1997 &name, 1, XStdICCTextStyle,
2001 g_warning("Error converting icon name to text property: %d\n", res);
2005 XSetWMIconName (window_private->xdisplay, window_private->xwindow,
2009 XFree (property.value);
2013 gdk_window_set_group (GdkWindow *window,
2017 GdkWindowPrivate *window_private;
2018 GdkWindowPrivate *private;
2020 g_return_if_fail (window != NULL);
2021 g_return_if_fail (leader != NULL);
2022 window_private = (GdkWindowPrivate*) window;
2023 if (window_private->destroyed)
2026 private = (GdkWindowPrivate *)leader;
2027 wm_hints.flags = WindowGroupHint;
2028 wm_hints.window_group = private->xwindow;
2030 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
2034 gdk_window_set_mwm_hints (GdkWindow *window,
2035 MotifWmHints *new_hints)
2037 static Atom hints_atom = None;
2038 MotifWmHints *hints;
2044 GdkWindowPrivate *window_private;
2046 g_return_if_fail (window != NULL);
2047 window_private = (GdkWindowPrivate*) window;
2048 if (window_private->destroyed)
2052 hints_atom = XInternAtom (window_private->xdisplay,
2053 _XA_MOTIF_WM_HINTS, FALSE);
2055 XGetWindowProperty (window_private->xdisplay, window_private->xwindow,
2056 hints_atom, 0, sizeof(MotifWmHints)/4,
2057 False, AnyPropertyType, &type, &format, &nitems,
2058 &bytes_after, (guchar **)&hints);
2064 if (new_hints->flags & MWM_HINTS_FUNCTIONS)
2066 hints->flags |= MWM_HINTS_FUNCTIONS;
2067 hints->functions = new_hints->functions;
2069 if (new_hints->flags & MWM_HINTS_DECORATIONS)
2071 hints->flags |= MWM_HINTS_DECORATIONS;
2072 hints->decorations = new_hints->decorations;
2076 XChangeProperty (window_private->xdisplay, window_private->xwindow,
2077 hints_atom, hints_atom, 32, PropModeReplace,
2078 (guchar *)hints, sizeof(MotifWmHints)/4);
2080 if (hints != new_hints)
2085 gdk_window_set_decorations (GdkWindow *window,
2086 GdkWMDecoration decorations)
2090 hints.flags = MWM_HINTS_DECORATIONS;
2091 hints.decorations = decorations;
2093 gdk_window_set_mwm_hints (window, &hints);
2097 gdk_window_set_functions (GdkWindow *window,
2098 GdkWMFunction functions)
2102 hints.flags = MWM_HINTS_FUNCTIONS;
2103 hints.functions = functions;
2105 gdk_window_set_mwm_hints (window, &hints);
2109 gdk_window_get_toplevels (void)
2111 GList *new_list = NULL;
2114 tmp_list = gdk_root_parent.children;
2117 new_list = g_list_prepend (new_list, tmp_list->data);
2118 tmp_list = tmp_list->next;
2125 * propagate the shapes from all child windows of a GDK window to the parent
2126 * window. Shamelessly ripped from Enlightenment's code
2135 struct _gdk_span *next;
2139 gdk_add_to_span(struct _gdk_span **s, int x, int xx)
2141 struct _gdk_span *ptr1, *ptr2, *noo, *ss;
2148 /* scan the spans for this line */
2151 /* -- -> new span */
2152 /* == -> existing span */
2153 /* ## -> spans intersect */
2154 /* if we are in the middle of spanning the span into the line */
2157 /* case: ---- ==== */
2158 if (xx < ptr1->start - 1)
2160 /* ends before next span - extend to here */
2164 /* case: ----##=== */
2165 else if (xx <= ptr1->end)
2167 /* crosses into next span - delete next span and append */
2168 ss->end = ptr1->end;
2169 ss->next = ptr1->next;
2173 /* case: ---###--- */
2176 /* overlaps next span - delete and keep checking */
2177 ss->next = ptr1->next;
2182 /* otherwise havent started spanning it in yet */
2185 /* case: ---- ==== */
2186 if (xx < ptr1->start - 1)
2188 /* insert span here in list */
2189 noo = g_malloc(sizeof(struct _gdk_span));
2203 /* case: ----##=== */
2204 else if ((x < ptr1->start) && (xx <= ptr1->end))
2206 /* expand this span to the left point of the new one */
2210 /* case: ===###=== */
2211 else if ((x >= ptr1->start) && (xx <= ptr1->end))
2213 /* throw the span away */
2216 /* case: ---###--- */
2217 else if ((x < ptr1->start) && (xx > ptr1->end))
2224 /* case: ===##---- */
2225 else if ((x >= ptr1->start) && (x <= ptr1->end + 1) && (xx > ptr1->end))
2231 /* case: ==== ---- */
2232 /* case handled by next loop iteration - first case */
2237 /* it started in the middle but spans beyond your current list */
2243 /* it does not start inside a span or in the middle, so add it to the end */
2244 noo = g_malloc(sizeof(struct _gdk_span));
2252 noo->next = ptr2->next;
2265 gdk_add_rectangles (Display *disp, Window win, struct _gdk_span **spans,
2266 gint basew, gint baseh, gint x, gint y)
2269 gint x1, y1, x2, y2;
2273 rl = XShapeGetRectangles(disp, win, ShapeBounding, &rn, &ord);
2276 /* go through all clip rects in this window's shape */
2277 for (k = 0; k < rn; k++)
2279 /* for each clip rect, add it to each line's spans */
2281 x2 = x + rl[k].x + (rl[k].width - 1);
2283 y2 = y + rl[k].y + (rl[k].height - 1);
2292 for (a = y1; a <= y2; a++)
2295 gdk_add_to_span(&spans[a], x1, x2);
2303 gdk_propagate_shapes(Display *disp, Window win, gboolean merge)
2305 Window rt, par, *list = NULL;
2306 gint i, j, num = 0, num_rects = 0;
2310 XRectangle *rects = NULL;
2311 struct _gdk_span **spans = NULL, *ptr1, *ptr2, *ptr3;
2312 XWindowAttributes xatt;
2314 XGetGeometry(disp, win, &rt, &x, &y, &w, &h, &d, &d);
2319 spans = g_malloc(sizeof(struct _gdk_span *) * h);
2321 for (i = 0; i < h; i++)
2323 XQueryTree(disp, win, &rt, &par, &list, (unsigned int *)&num);
2326 /* go through all child windows and create/insert spans */
2327 for (i = 0; i < num; i++)
2329 if (XGetWindowAttributes(disp, list[i], &xatt) && (xatt.map_state != IsUnmapped))
2330 if (XGetGeometry(disp, list[i], &rt, &x, &y, &w, &h, &d, &d))
2331 gdk_add_rectangles (disp, list[i], spans, basew, baseh, x, y);
2334 gdk_add_rectangles (disp, win, spans, basew, baseh, x, y);
2336 /* go through the spans list and build a list of rects */
2337 rects = g_malloc(sizeof(XRectangle) * 256);
2339 for (i = 0; i < baseh; i++)
2342 /* go through the line for all spans */
2345 rects[num_rects].x = ptr1->start;
2346 rects[num_rects].y = i;
2347 rects[num_rects].width = ptr1->end - ptr1->start + 1;
2348 rects[num_rects].height = 1;
2350 /* if there are more lines */
2352 /* while contigous rects (same start/end coords) exist */
2353 while ((contig) && (j < baseh))
2355 /* search next line for spans matching this one */
2361 /* if we have an exact span match set contig */
2362 if ((ptr2->start == ptr1->start) &&
2363 (ptr2->end == ptr1->end))
2366 /* remove the span - not needed */
2369 ptr3->next = ptr2->next;
2375 spans[j] = ptr2->next;
2381 /* gone past the span point no point looking */
2382 else if (ptr2->start < ptr1->start)
2390 /* if a contiguous span was found increase the rect h */
2393 rects[num_rects].height++;
2397 /* up the rect count */
2399 /* every 256 new rects increase the rect array */
2400 if ((num_rects % 256) == 0)
2401 rects = g_realloc(rects, sizeof(XRectangle) * (num_rects + 256));
2405 /* set the rects as the shape mask */
2408 XShapeCombineRectangles(disp, win, ShapeBounding, 0, 0, rects, num_rects,
2409 ShapeSet, YXSorted);
2414 /* free up all the spans we made */
2415 for (i = 0; i < baseh; i++)
2429 gdk_window_set_child_shapes (GdkWindow *window)
2431 GdkWindowPrivate *private;
2433 g_return_if_fail (window != NULL);
2435 #ifdef HAVE_SHAPE_EXT
2436 private = (GdkWindowPrivate*) window;
2437 if (private->destroyed)
2440 if (gdk_window_have_shape_ext())
2441 gdk_propagate_shapes (private->xdisplay, private->xwindow, FALSE);
2446 gdk_window_merge_child_shapes (GdkWindow *window)
2448 GdkWindowPrivate *private;
2450 g_return_if_fail (window != NULL);
2452 #ifdef HAVE_SHAPE_EXT
2453 private = (GdkWindowPrivate*) window;
2454 if (private->destroyed)
2457 if (gdk_window_have_shape_ext())
2458 gdk_propagate_shapes (private->xdisplay, private->xwindow, TRUE);
2463 gdk_drawable_set_data (GdkDrawable *drawable,
2466 GDestroyNotify destroy_func)
2468 g_dataset_set_data_full (drawable, key, data, destroy_func);