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;
326 private->colormap = gdk_colormap_get_system ();
328 xattributes.background_pixel = BlackPixel (gdk_display, gdk_screen);
329 xattributes.border_pixel = BlackPixel (gdk_display, gdk_screen);
330 xattributes_mask |= CWBorderPixel | CWBackPixel;
332 switch (private->window_type)
334 case GDK_WINDOW_TOPLEVEL:
335 xattributes.colormap = ((GdkColormapPrivate*) private->colormap)->xcolormap;
336 xattributes_mask |= CWColormap;
338 xparent = gdk_root_window;
341 case GDK_WINDOW_CHILD:
342 xattributes.colormap = ((GdkColormapPrivate*) private->colormap)->xcolormap;
343 xattributes_mask |= CWColormap;
346 case GDK_WINDOW_DIALOG:
347 xattributes.colormap = ((GdkColormapPrivate*) private->colormap)->xcolormap;
348 xattributes_mask |= CWColormap;
350 xparent = gdk_root_window;
353 case GDK_WINDOW_TEMP:
354 xattributes.colormap = ((GdkColormapPrivate*) private->colormap)->xcolormap;
355 xattributes_mask |= CWColormap;
357 xparent = gdk_root_window;
359 xattributes.save_under = True;
360 xattributes.override_redirect = True;
361 xattributes.cursor = None;
362 xattributes_mask |= CWSaveUnder | CWOverrideRedirect;
364 case GDK_WINDOW_ROOT:
365 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
367 case GDK_WINDOW_PIXMAP:
368 g_error ("cannot make windows of type GDK_WINDOW_PIXMAP (use gdk_pixmap_new)");
376 private->colormap = NULL;
379 private->xwindow = XCreateWindow (private->xdisplay, xparent,
380 x, y, private->width, private->height,
381 0, depth, class, xvisual,
382 xattributes_mask, &xattributes);
383 gdk_window_ref (window);
384 gdk_xid_table_insert (&private->xwindow, window);
386 if (private->colormap)
387 gdk_colormap_ref (private->colormap);
389 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
390 (attributes->cursor) :
393 switch (private->window_type)
395 case GDK_WINDOW_DIALOG:
396 XSetTransientForHint (private->xdisplay, private->xwindow, xparent);
397 case GDK_WINDOW_TOPLEVEL:
398 case GDK_WINDOW_TEMP:
399 XSetWMProtocols (private->xdisplay, private->xwindow, gdk_wm_window_protocols, 2);
401 case GDK_WINDOW_CHILD:
402 if ((attributes->wclass == GDK_INPUT_OUTPUT) &&
403 (private->colormap != gdk_colormap_get_system ()) &&
404 (private->colormap != gdk_window_get_colormap (gdk_window_get_toplevel (window))))
406 GDK_NOTE (MISC, g_message ("adding colormap window\n"));
407 gdk_window_add_colormap_windows (window);
416 size_hints.flags = PSize;
417 size_hints.width = private->width;
418 size_hints.height = private->height;
420 wm_hints.flags = InputHint | StateHint | WindowGroupHint;
421 wm_hints.window_group = gdk_leader_window;
422 wm_hints.input = True;
423 wm_hints.initial_state = NormalState;
425 /* FIXME: Is there any point in doing this? Do any WM's pay
426 * attention to PSize, and even if they do, is this the
429 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
431 XSetWMHints (private->xdisplay, private->xwindow, &wm_hints);
433 if (attributes_mask & GDK_WA_TITLE)
434 title = attributes->title;
436 title = g_get_prgname ();
438 XmbSetWMProperties (private->xdisplay, private->xwindow,
443 if (attributes_mask & GDK_WA_WMCLASS)
445 class_hint = XAllocClassHint ();
446 class_hint->res_name = attributes->wmclass_name;
447 class_hint->res_class = attributes->wmclass_class;
448 XSetClassHint (private->xdisplay, private->xwindow, class_hint);
457 gdk_window_foreign_new (guint32 anid)
460 GdkWindowPrivate *private;
461 GdkWindowPrivate *parent_private;
462 XWindowAttributes attrs;
464 Window *children = NULL;
467 if(!XGetWindowAttributes (gdk_display, anid, &attrs)) {
468 g_warning("XGetWindowAttributes failed on window ID %d\n", anid);
472 private = g_new (GdkWindowPrivate, 1);
473 window = (GdkWindow*) private;
475 /* FIXME: This is pretty expensive. Maybe the caller should supply
477 XQueryTree (gdk_display, anid, &root, &parent, &children, &nchildren);
481 private->parent = gdk_xid_table_lookup (parent);
483 parent_private = (GdkWindowPrivate *)private->parent;
486 parent_private->children = g_list_prepend (parent_private->children, window);
488 private->xwindow = anid;
489 private->xdisplay = gdk_display;
490 private->x = attrs.x;
491 private->y = attrs.y;
492 private->width = attrs.width;
493 private->height = attrs.height;
494 private->resize_count = 0;
495 private->ref_count = 1;
496 private->window_type = GDK_WINDOW_FOREIGN;
497 private->destroyed = FALSE;
498 private->extension_events = 0;
500 private->colormap = NULL;
502 private->filters = NULL;
503 private->children = NULL;
505 window->user_data = NULL;
507 gdk_window_ref (window);
508 gdk_xid_table_insert (&private->xwindow, window);
513 /* Call this function when you want a window and all its children to
514 disappear. When xdestroy is true, a request to destroy the XWindow
515 is sent out. When it is false, it is assumed that the XWindow has
516 been or will be destroyed by destroying some ancestor of this
520 gdk_window_internal_destroy (GdkWindow *window, gboolean xdestroy,
521 gboolean our_destroy)
523 GdkWindowPrivate *private;
524 GdkWindowPrivate *temp_private;
525 GdkWindow *temp_window;
529 g_return_if_fail (window != NULL);
531 private = (GdkWindowPrivate*) window;
533 switch (private->window_type)
535 case GDK_WINDOW_TOPLEVEL:
536 case GDK_WINDOW_CHILD:
537 case GDK_WINDOW_DIALOG:
538 case GDK_WINDOW_TEMP:
539 case GDK_WINDOW_FOREIGN:
540 if (!private->destroyed)
544 GdkWindowPrivate *parent_private = (GdkWindowPrivate *)private->parent;
545 if (parent_private->children)
546 parent_private->children = g_list_remove (parent_private->children, window);
549 if (private->window_type != GDK_WINDOW_FOREIGN)
551 children = tmp = private->children;
552 private->children = NULL;
556 temp_window = tmp->data;
559 temp_private = (GdkWindowPrivate*) temp_window;
561 gdk_window_internal_destroy (temp_window, FALSE,
565 g_list_free (children);
568 if (private->extension_events != 0)
569 gdk_input_window_destroy (window);
571 if (private->filters)
573 tmp = private->filters;
581 g_list_free (private->filters);
582 private->filters = NULL;
585 if (private->window_type == GDK_WINDOW_FOREIGN)
587 if (our_destroy && (private->parent != NULL))
589 /* It's somebody elses window, but in our heirarchy,
590 * so reparent it to the root window, and then send
591 * it a delete event, as if we were a WM
593 XClientMessageEvent xevent;
595 gdk_window_hide (window);
596 gdk_window_reparent (window, NULL, 0, 0);
598 xevent.type = ClientMessage;
599 xevent.window = private->xwindow;
600 xevent.message_type = gdk_wm_protocols;
602 xevent.data.l[0] = gdk_wm_delete_window;
603 xevent.data.l[1] = CurrentTime;
605 XSendEvent (private->xdisplay, private->xwindow,
606 False, 0, (XEvent *)&xevent);
610 XDestroyWindow (private->xdisplay, private->xwindow);
612 if (private->colormap)
613 gdk_colormap_unref (private->colormap);
615 private->destroyed = TRUE;
619 case GDK_WINDOW_ROOT:
620 g_error ("attempted to destroy root window");
623 case GDK_WINDOW_PIXMAP:
624 g_error ("called gdk_window_destroy on a pixmap (use gdk_pixmap_unref)");
629 /* Like internal_destroy, but also destroys the reference created by
633 gdk_window_destroy (GdkWindow *window)
635 gdk_window_internal_destroy (window, TRUE, TRUE);
636 gdk_window_unref (window);
639 /* This function is called when the XWindow is really gone. */
642 gdk_window_destroy_notify (GdkWindow *window)
644 GdkWindowPrivate *private;
646 g_return_if_fail (window != NULL);
648 private = (GdkWindowPrivate*) window;
650 if (!private->destroyed)
652 if (private->window_type == GDK_WINDOW_FOREIGN)
653 gdk_window_internal_destroy (window, FALSE, FALSE);
655 g_warning ("GdkWindow %#lx unexpectedly destroyed", private->xwindow);
658 gdk_xid_table_remove (private->xwindow);
659 gdk_window_unref (window);
663 gdk_window_ref (GdkWindow *window)
665 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
666 g_return_val_if_fail (window != NULL, NULL);
668 private->ref_count += 1;
673 gdk_window_unref (GdkWindow *window)
675 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
676 g_return_if_fail (window != NULL);
678 private->ref_count -= 1;
679 if (private->ref_count == 0)
681 if (!private->destroyed)
683 if (private->window_type == GDK_WINDOW_FOREIGN)
684 gdk_xid_table_remove (private->xwindow);
686 g_warning ("losing last reference to undestroyed window\n");
688 g_dataset_destroy (window);
694 gdk_window_show (GdkWindow *window)
696 GdkWindowPrivate *private;
698 g_return_if_fail (window != NULL);
700 private = (GdkWindowPrivate*) window;
701 if (!private->destroyed)
703 XRaiseWindow (private->xdisplay, private->xwindow);
704 XMapWindow (private->xdisplay, private->xwindow);
709 gdk_window_hide (GdkWindow *window)
711 GdkWindowPrivate *private;
713 g_return_if_fail (window != NULL);
715 private = (GdkWindowPrivate*) window;
716 if (!private->destroyed)
717 XUnmapWindow (private->xdisplay, private->xwindow);
721 gdk_window_withdraw (GdkWindow *window)
723 GdkWindowPrivate *private;
725 g_return_if_fail (window != NULL);
727 private = (GdkWindowPrivate*) window;
728 if (!private->destroyed)
729 XWithdrawWindow (private->xdisplay, private->xwindow, 0);
733 gdk_window_move (GdkWindow *window,
737 GdkWindowPrivate *private;
739 g_return_if_fail (window != NULL);
741 private = (GdkWindowPrivate*) window;
742 if (!private->destroyed)
744 XMoveWindow (private->xdisplay, private->xwindow, x, y);
746 if (private->window_type == GDK_WINDOW_CHILD)
755 gdk_window_resize (GdkWindow *window,
759 GdkWindowPrivate *private;
761 g_return_if_fail (window != NULL);
768 private = (GdkWindowPrivate*) window;
770 if (!private->destroyed &&
771 ((private->resize_count > 0) ||
772 (private->width != (guint16) width) ||
773 (private->height != (guint16) height)))
775 XResizeWindow (private->xdisplay, private->xwindow, width, height);
776 private->resize_count += 1;
778 if (private->window_type == GDK_WINDOW_CHILD)
780 private->width = width;
781 private->height = height;
787 gdk_window_move_resize (GdkWindow *window,
793 GdkWindowPrivate *private;
795 g_return_if_fail (window != NULL);
802 private = (GdkWindowPrivate*) window;
803 if (!private->destroyed)
805 XMoveResizeWindow (private->xdisplay, private->xwindow, x, y, width, height);
807 if (private->window_type == GDK_WINDOW_CHILD)
811 private->width = width;
812 private->height = height;
818 gdk_window_reparent (GdkWindow *window,
819 GdkWindow *new_parent,
823 GdkWindowPrivate *window_private;
824 GdkWindowPrivate *parent_private;
825 GdkWindowPrivate *old_parent_private;
827 g_return_if_fail (window != NULL);
830 new_parent = (GdkWindow*) &gdk_root_parent;
832 window_private = (GdkWindowPrivate*) window;
833 old_parent_private = (GdkWindowPrivate*)window_private->parent;
834 parent_private = (GdkWindowPrivate*) new_parent;
836 if (!window_private->destroyed && !parent_private->destroyed)
837 XReparentWindow (window_private->xdisplay,
838 window_private->xwindow,
839 parent_private->xwindow,
842 window_private->parent = new_parent;
844 if (old_parent_private)
845 old_parent_private->children = g_list_remove (old_parent_private->children, window);
846 parent_private->children = g_list_prepend (parent_private->children, window);
851 gdk_window_clear (GdkWindow *window)
853 GdkWindowPrivate *private;
855 g_return_if_fail (window != NULL);
857 private = (GdkWindowPrivate*) window;
859 if (!private->destroyed)
860 XClearWindow (private->xdisplay, private->xwindow);
864 gdk_window_clear_area (GdkWindow *window,
870 GdkWindowPrivate *private;
872 g_return_if_fail (window != NULL);
874 private = (GdkWindowPrivate*) window;
876 if (!private->destroyed)
877 XClearArea (private->xdisplay, private->xwindow,
878 x, y, width, height, False);
882 gdk_window_clear_area_e (GdkWindow *window,
888 GdkWindowPrivate *private;
890 g_return_if_fail (window != NULL);
892 private = (GdkWindowPrivate*) window;
894 if (!private->destroyed)
895 XClearArea (private->xdisplay, private->xwindow,
896 x, y, width, height, True);
900 gdk_window_copy_area (GdkWindow *window,
904 GdkWindow *source_window,
910 GdkWindowPrivate *src_private;
911 GdkWindowPrivate *dest_private;
912 GdkGCPrivate *gc_private;
914 g_return_if_fail (window != NULL);
915 g_return_if_fail (gc != NULL);
917 if (source_window == NULL)
918 source_window = window;
920 src_private = (GdkWindowPrivate*) source_window;
921 dest_private = (GdkWindowPrivate*) window;
922 gc_private = (GdkGCPrivate*) gc;
924 if (!src_private->destroyed && !dest_private->destroyed)
926 XCopyArea (dest_private->xdisplay, src_private->xwindow, dest_private->xwindow,
935 gdk_window_raise (GdkWindow *window)
937 GdkWindowPrivate *private;
939 g_return_if_fail (window != NULL);
941 private = (GdkWindowPrivate*) window;
943 if (!private->destroyed)
944 XRaiseWindow (private->xdisplay, private->xwindow);
948 gdk_window_lower (GdkWindow *window)
950 GdkWindowPrivate *private;
952 g_return_if_fail (window != NULL);
954 private = (GdkWindowPrivate*) window;
956 if (!private->destroyed)
957 XLowerWindow (private->xdisplay, private->xwindow);
961 gdk_window_set_user_data (GdkWindow *window,
964 g_return_if_fail (window != NULL);
966 window->user_data = user_data;
970 gdk_window_set_hints (GdkWindow *window,
979 GdkWindowPrivate *private;
980 XSizeHints size_hints;
982 g_return_if_fail (window != NULL);
984 private = (GdkWindowPrivate*) window;
985 if (private->destroyed)
988 size_hints.flags = 0;
990 if (flags & GDK_HINT_POS)
992 size_hints.flags |= PPosition;
997 if (flags & GDK_HINT_MIN_SIZE)
999 size_hints.flags |= PMinSize;
1000 size_hints.min_width = min_width;
1001 size_hints.min_height = min_height;
1004 if (flags & GDK_HINT_MAX_SIZE)
1006 size_hints.flags |= PMaxSize;
1007 size_hints.max_width = max_width;
1008 size_hints.max_height = max_height;
1012 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
1016 gdk_window_set_geometry_hints (GdkWindow *window,
1017 GdkGeometry *geometry,
1018 GdkWindowHints geom_mask)
1020 GdkWindowPrivate *private;
1021 XSizeHints size_hints;
1023 g_return_if_fail (window != NULL);
1025 private = (GdkWindowPrivate*) window;
1026 if (private->destroyed)
1029 size_hints.flags = 0;
1031 if (geom_mask & GDK_HINT_POS)
1032 size_hints.flags |= PPosition;
1034 if (geom_mask & GDK_HINT_MIN_SIZE)
1036 size_hints.flags |= PMinSize;
1037 size_hints.min_width = geometry->min_width;
1038 size_hints.min_height = geometry->min_height;
1041 if (geom_mask & GDK_HINT_MAX_SIZE)
1043 size_hints.flags |= PMaxSize;
1044 size_hints.max_width = geometry->max_width;
1045 size_hints.max_height = geometry->max_height;
1048 if (geom_mask & GDK_HINT_BASE_SIZE)
1050 size_hints.flags |= PBaseSize;
1051 size_hints.base_width = geometry->base_width;
1052 size_hints.base_height = geometry->base_height;
1055 if (geom_mask & GDK_HINT_RESIZE_INC)
1057 size_hints.flags |= PResizeInc;
1058 size_hints.width_inc = geometry->width_inc;
1059 size_hints.height_inc = geometry->height_inc;
1062 if (geom_mask & GDK_HINT_ASPECT)
1064 size_hints.flags |= PAspect;
1065 if (geometry->min_aspect <= 1)
1067 size_hints.min_aspect.x = G_MAXINT * geometry->min_aspect;
1068 size_hints.min_aspect.y = G_MAXINT;
1072 size_hints.min_aspect.x = G_MAXINT;
1073 size_hints.min_aspect.y = G_MAXINT / geometry->min_aspect;;
1075 if (geometry->max_aspect <= 1)
1077 size_hints.max_aspect.x = G_MAXINT * geometry->max_aspect;
1078 size_hints.max_aspect.y = G_MAXINT;
1082 size_hints.max_aspect.x = G_MAXINT;
1083 size_hints.max_aspect.y = G_MAXINT / geometry->max_aspect;;
1088 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
1092 gdk_window_set_title (GdkWindow *window,
1095 GdkWindowPrivate *private;
1097 g_return_if_fail (window != NULL);
1099 private = (GdkWindowPrivate*) window;
1100 if (!private->destroyed)
1101 XmbSetWMProperties (private->xdisplay, private->xwindow,
1102 title, title, NULL, 0, NULL, NULL, NULL);
1106 gdk_window_set_role (GdkWindow *window,
1109 GdkWindowPrivate *private;
1111 g_return_if_fail (window != NULL);
1113 private = (GdkWindowPrivate*) window;
1116 XChangeProperty (private->xdisplay, private->xwindow,
1117 gdk_atom_intern ("WM_WINDOW_ROLE", FALSE), XA_STRING,
1118 8, PropModeReplace, role, strlen(role));
1120 XDeleteProperty (private->xdisplay, private->xwindow,
1121 gdk_atom_intern ("WM_WINDOW_ROLE", FALSE));
1125 gdk_window_set_transient_for (GdkWindow *window,
1128 GdkWindowPrivate *private;
1129 GdkWindowPrivate *parent_private;
1131 g_return_if_fail (window != NULL);
1133 private = (GdkWindowPrivate*) window;
1134 parent_private = (GdkWindowPrivate*) parent;
1136 if (!private->destroyed && !parent_private->destroyed)
1137 XSetTransientForHint (private->xdisplay,
1138 private->xwindow, parent_private->xwindow);
1142 gdk_window_set_background (GdkWindow *window,
1145 GdkWindowPrivate *private;
1147 g_return_if_fail (window != NULL);
1149 private = (GdkWindowPrivate*) window;
1150 if (!private->destroyed)
1151 XSetWindowBackground (private->xdisplay, private->xwindow, color->pixel);
1155 gdk_window_set_back_pixmap (GdkWindow *window,
1157 gint parent_relative)
1159 GdkWindowPrivate *window_private;
1160 GdkPixmapPrivate *pixmap_private;
1163 g_return_if_fail (window != NULL);
1165 window_private = (GdkWindowPrivate*) window;
1166 pixmap_private = (GdkPixmapPrivate*) pixmap;
1169 xpixmap = pixmap_private->xwindow;
1173 if (parent_relative)
1174 xpixmap = ParentRelative;
1176 if (!window_private->destroyed)
1177 XSetWindowBackgroundPixmap (window_private->xdisplay, window_private->xwindow, xpixmap);
1181 gdk_window_set_cursor (GdkWindow *window,
1184 GdkWindowPrivate *window_private;
1185 GdkCursorPrivate *cursor_private;
1188 g_return_if_fail (window != NULL);
1190 window_private = (GdkWindowPrivate*) window;
1191 cursor_private = (GdkCursorPrivate*) cursor;
1196 xcursor = cursor_private->xcursor;
1198 if (!window_private->destroyed)
1199 XDefineCursor (window_private->xdisplay, window_private->xwindow, xcursor);
1203 gdk_window_set_colormap (GdkWindow *window,
1204 GdkColormap *colormap)
1206 GdkWindowPrivate *window_private;
1207 GdkColormapPrivate *colormap_private;
1209 g_return_if_fail (window != NULL);
1210 g_return_if_fail (colormap != NULL);
1212 window_private = (GdkWindowPrivate*) window;
1213 colormap_private = (GdkColormapPrivate*) colormap;
1215 if (!window_private->destroyed)
1217 XSetWindowColormap (window_private->xdisplay,
1218 window_private->xwindow,
1219 colormap_private->xcolormap);
1221 if (window_private->colormap)
1222 gdk_colormap_unref (window_private->colormap);
1223 window_private->colormap = colormap;
1224 gdk_colormap_ref (window_private->colormap);
1226 if (window_private->window_type != GDK_WINDOW_TOPLEVEL)
1227 gdk_window_add_colormap_windows (window);
1232 gdk_window_get_user_data (GdkWindow *window,
1235 g_return_if_fail (window != NULL);
1237 *data = window->user_data;
1241 gdk_window_get_geometry (GdkWindow *window,
1248 GdkWindowPrivate *window_private;
1254 guint tborder_width;
1258 window = (GdkWindow*) &gdk_root_parent;
1260 window_private = (GdkWindowPrivate*) window;
1262 if (!window_private->destroyed)
1264 XGetGeometry (window_private->xdisplay, window_private->xwindow,
1265 &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
1281 gdk_window_get_position (GdkWindow *window,
1285 GdkWindowPrivate *window_private;
1287 g_return_if_fail (window != NULL);
1289 window_private = (GdkWindowPrivate*) window;
1292 *x = window_private->x;
1294 *y = window_private->y;
1298 gdk_window_get_size (GdkWindow *window,
1302 GdkWindowPrivate *window_private;
1304 g_return_if_fail (window != NULL);
1306 window_private = (GdkWindowPrivate*) window;
1309 *width = window_private->width;
1311 *height = window_private->height;
1315 gdk_window_get_visual (GdkWindow *window)
1317 GdkWindowPrivate *window_private;
1318 XWindowAttributes window_attributes;
1320 g_return_val_if_fail (window != NULL, NULL);
1322 window_private = (GdkWindowPrivate*) window;
1323 /* Huh? ->parent is never set for a pixmap. We should just return
1326 while (window_private && (window_private->window_type == GDK_WINDOW_PIXMAP))
1327 window_private = (GdkWindowPrivate*) window_private->parent;
1329 if (window_private && !window_private->destroyed)
1331 if (window_private->colormap == NULL)
1333 XGetWindowAttributes (window_private->xdisplay,
1334 window_private->xwindow,
1335 &window_attributes);
1336 return gdk_visual_lookup (window_attributes.visual);
1339 return ((GdkColormapPrivate *)window_private->colormap)->visual;
1346 gdk_window_get_colormap (GdkWindow *window)
1348 GdkWindowPrivate *window_private;
1349 XWindowAttributes window_attributes;
1351 g_return_val_if_fail (window != NULL, NULL);
1352 window_private = (GdkWindowPrivate*) window;
1354 g_return_val_if_fail (window_private->window_type != GDK_WINDOW_PIXMAP, NULL);
1355 if (!window_private->destroyed)
1357 if (window_private->colormap == NULL)
1359 XGetWindowAttributes (window_private->xdisplay,
1360 window_private->xwindow,
1361 &window_attributes);
1362 return gdk_colormap_lookup (window_attributes.colormap);
1365 return window_private->colormap;
1372 gdk_window_get_type (GdkWindow *window)
1374 GdkWindowPrivate *window_private;
1376 g_return_val_if_fail (window != NULL, (GdkWindowType) -1);
1378 window_private = (GdkWindowPrivate*) window;
1379 return window_private->window_type;
1383 gdk_window_get_origin (GdkWindow *window,
1387 GdkWindowPrivate *private;
1393 g_return_val_if_fail (window != NULL, 0);
1395 private = (GdkWindowPrivate*) window;
1397 if (!private->destroyed)
1399 return_val = XTranslateCoordinates (private->xdisplay,
1418 gdk_window_get_deskrelative_origin (GdkWindow *window,
1422 GdkWindowPrivate *private;
1423 gboolean return_val = FALSE;
1424 gint num_children, format_return;
1425 Window win, *child, parent, root;
1429 static Atom atom = 0;
1430 gulong number_return, bytes_after_return;
1431 guchar *data_return;
1433 g_return_val_if_fail (window != NULL, 0);
1435 private = (GdkWindowPrivate*) window;
1437 if (!private->destroyed)
1440 atom = XInternAtom(private->xdisplay, "ENLIGHTENMENT_DESKTOP", False);
1441 win = private->xwindow;
1443 while (XQueryTree(private->xdisplay, win, &root, &parent,
1444 &child, (unsigned int *)&num_children))
1446 if ((child) && (num_children > 0))
1458 XGetWindowProperty(private->xdisplay, win, atom, 0, 0,
1459 False, XA_CARDINAL, &type_return, &format_return,
1460 &number_return, &bytes_after_return, &data_return);
1461 if (type_return == XA_CARDINAL)
1468 return_val = XTranslateCoordinates (private->xdisplay,
1484 gdk_window_get_root_origin (GdkWindow *window,
1488 GdkWindowPrivate *private;
1493 unsigned int nchildren;
1495 g_return_if_fail (window != NULL);
1497 private = (GdkWindowPrivate*) window;
1502 if (private->destroyed)
1505 while (private->parent && ((GdkWindowPrivate*) private->parent)->parent)
1506 private = (GdkWindowPrivate*) private->parent;
1507 if (private->destroyed)
1510 xparent = private->xwindow;
1514 if (!XQueryTree (private->xdisplay, xwindow,
1516 &children, &nchildren))
1522 while (xparent != root);
1524 if (xparent == root)
1526 unsigned int ww, wh, wb, wd;
1529 if (XGetGeometry (private->xdisplay, xwindow, &root, &wx, &wy, &ww, &wh, &wb, &wd))
1540 gdk_window_get_pointer (GdkWindow *window,
1543 GdkModifierType *mask)
1545 GdkWindowPrivate *private;
1546 GdkWindow *return_val;
1552 unsigned int xmask = 0;
1555 window = (GdkWindow*) &gdk_root_parent;
1557 private = (GdkWindowPrivate*) window;
1560 if (!private->destroyed &&
1561 XQueryPointer (private->xdisplay, private->xwindow, &root, &child,
1562 &rootx, &rooty, &winx, &winy, &xmask))
1565 return_val = gdk_window_lookup (child);
1579 gdk_window_at_pointer (gint *win_x,
1582 GdkWindowPrivate *private;
1586 Window xwindow_last = 0;
1587 int rootx = -1, rooty = -1;
1591 private = &gdk_root_parent;
1593 xwindow = private->xwindow;
1595 XGrabServer (private->xdisplay);
1598 xwindow_last = xwindow;
1599 XQueryPointer (private->xdisplay,
1606 XUngrabServer (private->xdisplay);
1608 window = gdk_window_lookup (xwindow_last);
1611 *win_x = window ? winx : -1;
1613 *win_y = window ? winy : -1;
1619 gdk_window_get_parent (GdkWindow *window)
1621 g_return_val_if_fail (window != NULL, NULL);
1623 return ((GdkWindowPrivate*) window)->parent;
1627 gdk_window_get_toplevel (GdkWindow *window)
1629 GdkWindowPrivate *private;
1631 g_return_val_if_fail (window != NULL, NULL);
1633 private = (GdkWindowPrivate*) window;
1635 while (private->window_type == GDK_WINDOW_CHILD)
1637 window = ((GdkWindowPrivate*) window)->parent;
1638 private = (GdkWindowPrivate*) window;
1645 gdk_window_get_children (GdkWindow *window)
1647 GdkWindowPrivate *private;
1653 unsigned int nchildren;
1656 g_return_val_if_fail (window != NULL, NULL);
1658 private = (GdkWindowPrivate*) window;
1659 if (private->destroyed)
1662 XQueryTree (private->xdisplay, private->xwindow,
1663 &root, &parent, &xchildren, &nchildren);
1669 for (i = 0; i < nchildren; i++)
1671 child = gdk_window_lookup (xchildren[i]);
1673 children = g_list_prepend (children, child);
1684 gdk_window_get_events (GdkWindow *window)
1686 GdkWindowPrivate *private;
1687 XWindowAttributes attrs;
1688 GdkEventMask event_mask;
1691 g_return_val_if_fail (window != NULL, 0);
1693 private = (GdkWindowPrivate*) window;
1694 if (private->destroyed)
1697 XGetWindowAttributes (gdk_display, private->xwindow,
1701 for (i = 0; i < nevent_masks; i++)
1703 if (attrs.your_event_mask & event_mask_table[i])
1704 event_mask |= 1 << (i + 1);
1711 gdk_window_set_events (GdkWindow *window,
1712 GdkEventMask event_mask)
1714 GdkWindowPrivate *private;
1718 g_return_if_fail (window != NULL);
1720 private = (GdkWindowPrivate*) window;
1721 if (private->destroyed)
1724 xevent_mask = StructureNotifyMask;
1725 for (i = 0; i < nevent_masks; i++)
1727 if (event_mask & (1 << (i + 1)))
1728 xevent_mask |= event_mask_table[i];
1731 XSelectInput (gdk_display, private->xwindow,
1736 gdk_window_add_colormap_windows (GdkWindow *window)
1738 GdkWindow *toplevel;
1739 GdkWindowPrivate *toplevel_private;
1740 GdkWindowPrivate *window_private;
1741 Window *old_windows;
1742 Window *new_windows;
1745 g_return_if_fail (window != NULL);
1747 toplevel = gdk_window_get_toplevel (window);
1748 toplevel_private = (GdkWindowPrivate*) toplevel;
1749 window_private = (GdkWindowPrivate*) window;
1750 if (window_private->destroyed)
1754 if (!XGetWMColormapWindows (toplevel_private->xdisplay,
1755 toplevel_private->xwindow,
1756 &old_windows, &count))
1761 for (i = 0; i < count; i++)
1762 if (old_windows[i] == window_private->xwindow)
1764 XFree (old_windows);
1768 new_windows = g_new (Window, count + 1);
1770 for (i = 0; i < count; i++)
1771 new_windows[i] = old_windows[i];
1772 new_windows[count] = window_private->xwindow;
1774 XSetWMColormapWindows (toplevel_private->xdisplay,
1775 toplevel_private->xwindow,
1776 new_windows, count + 1);
1778 g_free (new_windows);
1780 XFree (old_windows);
1784 gdk_window_have_shape_ext (void)
1786 enum { UNKNOWN, NO, YES };
1787 static gint have_shape = UNKNOWN;
1789 if (have_shape == UNKNOWN)
1792 if (XQueryExtension(gdk_display, "SHAPE", &ignore, &ignore, &ignore))
1798 return (have_shape == YES);
1802 * This needs the X11 shape extension.
1803 * If not available, shaped windows will look
1804 * ugly, but programs still work. Stefan Wille
1807 gdk_window_shape_combine_mask (GdkWindow *window,
1811 GdkWindowPrivate *window_private;
1814 g_return_if_fail (window != NULL);
1816 #ifdef HAVE_SHAPE_EXT
1817 window_private = (GdkWindowPrivate*) window;
1818 if (window_private->destroyed)
1821 if (gdk_window_have_shape_ext())
1825 GdkWindowPrivate *pixmap_private;
1827 pixmap_private = (GdkWindowPrivate*) mask;
1828 pixmap = (Pixmap) pixmap_private->xwindow;
1837 XShapeCombineMask (window_private->xdisplay,
1838 window_private->xwindow,
1844 #endif /* HAVE_SHAPE_EXT */
1848 gdk_window_add_filter (GdkWindow *window,
1849 GdkFilterFunc function,
1852 GdkWindowPrivate *private;
1854 GdkEventFilter *filter;
1856 private = (GdkWindowPrivate*) window;
1857 if (private && private->destroyed)
1861 tmp_list = private->filters;
1863 tmp_list = gdk_default_filters;
1867 filter = (GdkEventFilter *)tmp_list->data;
1868 if ((filter->function == function) && (filter->data == data))
1870 tmp_list = tmp_list->next;
1873 filter = g_new (GdkEventFilter, 1);
1874 filter->function = function;
1875 filter->data = data;
1878 private->filters = g_list_append (private->filters, filter);
1880 gdk_default_filters = g_list_append (gdk_default_filters, filter);
1884 gdk_window_remove_filter (GdkWindow *window,
1885 GdkFilterFunc function,
1888 GdkWindowPrivate *private;
1889 GList *tmp_list, *node;
1890 GdkEventFilter *filter;
1892 private = (GdkWindowPrivate*) window;
1895 tmp_list = private->filters;
1897 tmp_list = gdk_default_filters;
1901 filter = (GdkEventFilter *)tmp_list->data;
1903 tmp_list = tmp_list->next;
1905 if ((filter->function == function) && (filter->data == data))
1908 private->filters = g_list_remove_link (private->filters, node);
1910 gdk_default_filters = g_list_remove_link (gdk_default_filters, tmp_list);
1911 g_list_free_1 (node);
1920 gdk_window_set_override_redirect(GdkWindow *window,
1921 gboolean override_redirect)
1923 GdkWindowPrivate *private;
1924 XSetWindowAttributes attr;
1926 g_return_if_fail (window != NULL);
1927 private = (GdkWindowPrivate*) window;
1928 if (private->destroyed)
1931 attr.override_redirect = (override_redirect == FALSE)?False:True;
1932 XChangeWindowAttributes(gdk_display,
1933 ((GdkWindowPrivate *)window)->xwindow,
1939 gdk_window_set_icon (GdkWindow *window,
1940 GdkWindow *icon_window,
1945 GdkWindowPrivate *window_private;
1946 GdkWindowPrivate *private;
1948 g_return_if_fail (window != NULL);
1949 window_private = (GdkWindowPrivate*) window;
1950 if (window_private->destroyed)
1955 if (icon_window != NULL)
1957 private = (GdkWindowPrivate *)icon_window;
1958 wm_hints.flags |= IconWindowHint;
1959 wm_hints.icon_window = private->xwindow;
1964 private = (GdkWindowPrivate *)pixmap;
1965 wm_hints.flags |= IconPixmapHint;
1966 wm_hints.icon_pixmap = private->xwindow;
1971 private = (GdkWindowPrivate *)mask;
1972 wm_hints.flags |= IconMaskHint;
1973 wm_hints.icon_mask = private->xwindow;
1976 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1980 gdk_window_set_icon_name (GdkWindow *window,
1983 GdkWindowPrivate *window_private;
1984 XTextProperty property;
1987 g_return_if_fail (window != NULL);
1988 window_private = (GdkWindowPrivate*) window;
1989 if (window_private->destroyed)
1991 res = XmbTextListToTextProperty (window_private->xdisplay,
1992 &name, 1, XStdICCTextStyle,
1996 g_warning("Error converting icon name to text property: %d\n", res);
2000 XSetWMIconName (window_private->xdisplay, window_private->xwindow,
2004 XFree (property.value);
2008 gdk_window_set_group (GdkWindow *window,
2012 GdkWindowPrivate *window_private;
2013 GdkWindowPrivate *private;
2015 g_return_if_fail (window != NULL);
2016 g_return_if_fail (leader != NULL);
2017 window_private = (GdkWindowPrivate*) window;
2018 if (window_private->destroyed)
2021 private = (GdkWindowPrivate *)leader;
2022 wm_hints.flags = WindowGroupHint;
2023 wm_hints.window_group = private->xwindow;
2025 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
2029 gdk_window_set_mwm_hints (GdkWindow *window,
2030 MotifWmHints *new_hints)
2032 static Atom hints_atom = None;
2033 MotifWmHints *hints;
2039 GdkWindowPrivate *window_private;
2041 g_return_if_fail (window != NULL);
2042 window_private = (GdkWindowPrivate*) window;
2043 if (window_private->destroyed)
2047 hints_atom = XInternAtom (window_private->xdisplay,
2048 _XA_MOTIF_WM_HINTS, FALSE);
2050 XGetWindowProperty (window_private->xdisplay, window_private->xwindow,
2051 hints_atom, 0, sizeof(MotifWmHints)/4,
2052 False, AnyPropertyType, &type, &format, &nitems,
2053 &bytes_after, (guchar **)&hints);
2059 if (new_hints->flags & MWM_HINTS_FUNCTIONS)
2061 hints->flags |= MWM_HINTS_FUNCTIONS;
2062 hints->functions = new_hints->functions;
2064 if (new_hints->flags & MWM_HINTS_DECORATIONS)
2066 hints->flags |= MWM_HINTS_DECORATIONS;
2067 hints->decorations = new_hints->decorations;
2071 XChangeProperty (window_private->xdisplay, window_private->xwindow,
2072 hints_atom, hints_atom, 32, PropModeReplace,
2073 (guchar *)hints, sizeof(MotifWmHints)/4);
2075 if (hints != new_hints)
2080 gdk_window_set_decorations (GdkWindow *window,
2081 GdkWMDecoration decorations)
2085 hints.flags = MWM_HINTS_DECORATIONS;
2086 hints.decorations = decorations;
2088 gdk_window_set_mwm_hints (window, &hints);
2092 gdk_window_set_functions (GdkWindow *window,
2093 GdkWMFunction functions)
2097 hints.flags = MWM_HINTS_FUNCTIONS;
2098 hints.functions = functions;
2100 gdk_window_set_mwm_hints (window, &hints);
2104 gdk_window_get_toplevels (void)
2106 GList *new_list = NULL;
2109 tmp_list = gdk_root_parent.children;
2112 new_list = g_list_prepend (new_list, tmp_list->data);
2113 tmp_list = tmp_list->next;
2120 * propagate the shapes from all child windows of a GDK window to the parent
2121 * window. Shamelessly ripped from Enlightenment's code
2130 struct _gdk_span *next;
2134 gdk_add_to_span(struct _gdk_span **s, int x, int xx)
2136 struct _gdk_span *ptr1, *ptr2, *noo, *ss;
2143 /* scan the spans for this line */
2146 /* -- -> new span */
2147 /* == -> existing span */
2148 /* ## -> spans intersect */
2149 /* if we are in the middle of spanning the span into the line */
2152 /* case: ---- ==== */
2153 if (xx < ptr1->start - 1)
2155 /* ends before next span - extend to here */
2159 /* case: ----##=== */
2160 else if (xx <= ptr1->end)
2162 /* crosses into next span - delete next span and append */
2163 ss->end = ptr1->end;
2164 ss->next = ptr1->next;
2168 /* case: ---###--- */
2171 /* overlaps next span - delete and keep checking */
2172 ss->next = ptr1->next;
2177 /* otherwise havent started spanning it in yet */
2180 /* case: ---- ==== */
2181 if (xx < ptr1->start - 1)
2183 /* insert span here in list */
2184 noo = g_malloc(sizeof(struct _gdk_span));
2198 /* case: ----##=== */
2199 else if ((x < ptr1->start) && (xx <= ptr1->end))
2201 /* expand this span to the left point of the new one */
2205 /* case: ===###=== */
2206 else if ((x >= ptr1->start) && (xx <= ptr1->end))
2208 /* throw the span away */
2211 /* case: ---###--- */
2212 else if ((x < ptr1->start) && (xx > ptr1->end))
2219 /* case: ===##---- */
2220 else if ((x >= ptr1->start) && (x <= ptr1->end + 1) && (xx > ptr1->end))
2226 /* case: ==== ---- */
2227 /* case handled by next loop iteration - first case */
2232 /* it started in the middle but spans beyond your current list */
2238 /* it does not start inside a span or in the middle, so add it to the end */
2239 noo = g_malloc(sizeof(struct _gdk_span));
2247 noo->next = ptr2->next;
2260 gdk_add_rectangles (Display *disp, Window win, struct _gdk_span **spans,
2261 gint basew, gint baseh, gint x, gint y)
2264 gint x1, y1, x2, y2;
2268 rl = XShapeGetRectangles(disp, win, ShapeBounding, &rn, &ord);
2271 /* go through all clip rects in this window's shape */
2272 for (k = 0; k < rn; k++)
2274 /* for each clip rect, add it to each line's spans */
2276 x2 = x + rl[k].x + (rl[k].width - 1);
2278 y2 = y + rl[k].y + (rl[k].height - 1);
2287 for (a = y1; a <= y2; a++)
2290 gdk_add_to_span(&spans[a], x1, x2);
2298 gdk_propagate_shapes(Display *disp, Window win, gboolean merge)
2300 Window rt, par, *list = NULL;
2301 gint i, j, num = 0, num_rects = 0;
2305 XRectangle *rects = NULL;
2306 struct _gdk_span **spans = NULL, *ptr1, *ptr2, *ptr3;
2307 XWindowAttributes xatt;
2309 XGetGeometry(disp, win, &rt, &x, &y, &w, &h, &d, &d);
2314 spans = g_malloc(sizeof(struct _gdk_span *) * h);
2316 for (i = 0; i < h; i++)
2318 XQueryTree(disp, win, &rt, &par, &list, (unsigned int *)&num);
2321 /* go through all child windows and create/insert spans */
2322 for (i = 0; i < num; i++)
2324 if (XGetWindowAttributes(disp, list[i], &xatt) && (xatt.map_state != IsUnmapped))
2325 if (XGetGeometry(disp, list[i], &rt, &x, &y, &w, &h, &d, &d))
2326 gdk_add_rectangles (disp, list[i], spans, basew, baseh, x, y);
2329 gdk_add_rectangles (disp, win, spans, basew, baseh, x, y);
2331 /* go through the spans list and build a list of rects */
2332 rects = g_malloc(sizeof(XRectangle) * 256);
2334 for (i = 0; i < baseh; i++)
2337 /* go through the line for all spans */
2340 rects[num_rects].x = ptr1->start;
2341 rects[num_rects].y = i;
2342 rects[num_rects].width = ptr1->end - ptr1->start + 1;
2343 rects[num_rects].height = 1;
2345 /* if there are more lines */
2347 /* while contigous rects (same start/end coords) exist */
2348 while ((contig) && (j < baseh))
2350 /* search next line for spans matching this one */
2356 /* if we have an exact span match set contig */
2357 if ((ptr2->start == ptr1->start) &&
2358 (ptr2->end == ptr1->end))
2361 /* remove the span - not needed */
2364 ptr3->next = ptr2->next;
2370 spans[j] = ptr2->next;
2376 /* gone past the span point no point looking */
2377 else if (ptr2->start < ptr1->start)
2385 /* if a contiguous span was found increase the rect h */
2388 rects[num_rects].height++;
2392 /* up the rect count */
2394 /* every 256 new rects increase the rect array */
2395 if ((num_rects % 256) == 0)
2396 rects = g_realloc(rects, sizeof(XRectangle) * (num_rects + 256));
2400 /* set the rects as the shape mask */
2403 XShapeCombineRectangles(disp, win, ShapeBounding, 0, 0, rects, num_rects,
2404 ShapeSet, YXSorted);
2409 /* free up all the spans we made */
2410 for (i = 0; i < baseh; i++)
2424 gdk_window_set_child_shapes (GdkWindow *window)
2426 GdkWindowPrivate *private;
2428 g_return_if_fail (window != NULL);
2430 #ifdef HAVE_SHAPE_EXT
2431 private = (GdkWindowPrivate*) window;
2432 if (private->destroyed)
2435 if (gdk_window_have_shape_ext())
2436 gdk_propagate_shapes (private->xdisplay, private->xwindow, FALSE);
2441 gdk_window_merge_child_shapes (GdkWindow *window)
2443 GdkWindowPrivate *private;
2445 g_return_if_fail (window != NULL);
2447 #ifdef HAVE_SHAPE_EXT
2448 private = (GdkWindowPrivate*) window;
2449 if (private->destroyed)
2452 if (gdk_window_have_shape_ext())
2453 gdk_propagate_shapes (private->xdisplay, private->xwindow, TRUE);
2458 gdk_drawable_set_data (GdkDrawable *drawable,
2461 GDestroyNotify destroy_func)
2463 g_dataset_set_data_full (drawable, key, data, destroy_func);