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 Free
16 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 #include <X11/Xutil.h>
20 #include <X11/Xatom.h>
21 #include <X11/extensions/shape.h>
22 #include <netinet/in.h>
24 #include "../config.h"
26 #include "gdkprivate.h"
30 int nevent_masks = 17;
31 int event_mask_table[19] =
35 PointerMotionHintMask,
40 ButtonPressMask | OwnerGrabButtonMask,
41 ButtonReleaseMask | OwnerGrabButtonMask,
58 XWindowAttributes xattributes;
61 unsigned int border_width;
65 XGetGeometry (gdk_display, gdk_root_window, &gdk_root_window,
66 &x, &y, &width, &height, &border_width, &depth);
67 XGetWindowAttributes (gdk_display, gdk_root_window, &xattributes);
69 gdk_root_parent.xdisplay = gdk_display;
70 gdk_root_parent.xwindow = gdk_root_window;
71 gdk_root_parent.window_type = GDK_WINDOW_ROOT;
72 gdk_root_parent.window.user_data = NULL;
73 gdk_root_parent.width = width;
74 gdk_root_parent.height = height;
78 gdk_window_new (GdkWindow *parent,
79 GdkWindowAttr *attributes,
83 GdkWindowPrivate *private;
84 GdkWindowPrivate *parent_private;
86 GdkColormap *colormap;
87 Display *parent_display;
90 XSetWindowAttributes xattributes;
91 long xattributes_mask;
92 XSizeHints size_hints;
94 XClassHint *class_hint;
100 g_return_val_if_fail (attributes != NULL, NULL);
103 parent = (GdkWindow*) &gdk_root_parent;
105 parent_private = (GdkWindowPrivate*) parent;
106 if (parent_private->destroyed)
109 xparent = parent_private->xwindow;
110 parent_display = parent_private->xdisplay;
112 private = g_new (GdkWindowPrivate, 1);
113 window = (GdkWindow*) private;
115 private->parent = parent;
116 private->xdisplay = parent_display;
117 private->destroyed = FALSE;
118 private->resize_count = 0;
119 private->ref_count = 1;
120 xattributes_mask = 0;
122 if (attributes_mask & GDK_WA_X)
127 if (attributes_mask & GDK_WA_Y)
134 private->width = (attributes->width > 1) ? (attributes->width) : (1);
135 private->height = (attributes->height > 1) ? (attributes->height) : (1);
136 private->window_type = attributes->window_type;
137 private->extension_events = FALSE;
138 private->dnd_drag_data_type = None;
139 private->dnd_drag_data_typesavail =
140 private->dnd_drop_data_typesavail = NULL;
141 private->dnd_drop_enabled = private->dnd_drag_enabled =
142 private->dnd_drag_accepted = private->dnd_drag_datashow =
143 private->dnd_drop_data_numtypesavail =
144 private->dnd_drag_data_numtypesavail = 0;
145 private->dnd_drag_eventmask = private->dnd_drag_savedeventmask = 0;
147 private->filters = NULL;
149 window->user_data = NULL;
151 if (attributes_mask & GDK_WA_VISUAL)
152 visual = attributes->visual;
154 visual = gdk_visual_get_system ();
155 xvisual = ((GdkVisualPrivate*) visual)->xvisual;
157 xattributes.event_mask = StructureNotifyMask;
158 for (i = 0; i < nevent_masks; i++)
160 if (attributes->event_mask & (1 << (i + 1)))
161 xattributes.event_mask |= event_mask_table[i];
164 if (xattributes.event_mask)
165 xattributes_mask |= CWEventMask;
167 if(attributes_mask & GDK_WA_NOREDIR) {
168 xattributes.override_redirect =
169 (attributes->override_redirect == FALSE)?False:True;
170 xattributes_mask |= CWOverrideRedirect;
172 xattributes.override_redirect = False;
174 if (attributes->wclass == GDK_INPUT_OUTPUT)
177 depth = visual->depth;
179 if (attributes_mask & GDK_WA_COLORMAP)
180 colormap = attributes->colormap;
182 colormap = gdk_colormap_get_system ();
184 xattributes.background_pixel = BlackPixel (gdk_display, gdk_screen);
185 xattributes.border_pixel = BlackPixel (gdk_display, gdk_screen);
186 xattributes_mask |= CWBorderPixel | CWBackPixel;
188 switch (private->window_type)
190 case GDK_WINDOW_TOPLEVEL:
191 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
192 xattributes_mask |= CWColormap;
194 xparent = gdk_root_window;
197 case GDK_WINDOW_CHILD:
198 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
199 xattributes_mask |= CWColormap;
202 case GDK_WINDOW_DIALOG:
203 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
204 xattributes_mask |= CWColormap;
206 xparent = gdk_root_window;
209 case GDK_WINDOW_TEMP:
210 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
211 xattributes_mask |= CWColormap;
213 xparent = gdk_root_window;
215 xattributes.save_under = True;
216 xattributes.override_redirect = True;
217 xattributes.cursor = None;
218 xattributes_mask |= CWSaveUnder | CWOverrideRedirect;
220 case GDK_WINDOW_ROOT:
221 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
223 case GDK_WINDOW_PIXMAP:
224 g_error ("cannot make windows of type GDK_WINDOW_PIXMAP (use gdk_pixmap_new)");
235 private->xwindow = XCreateWindow (private->xdisplay, xparent,
236 x, y, private->width, private->height,
237 0, depth, class, xvisual,
238 xattributes_mask, &xattributes);
239 gdk_window_ref (window);
240 gdk_xid_table_insert (&private->xwindow, window);
242 switch (private->window_type)
244 case GDK_WINDOW_DIALOG:
245 XSetTransientForHint (private->xdisplay, private->xwindow, xparent);
246 case GDK_WINDOW_TOPLEVEL:
247 case GDK_WINDOW_TEMP:
248 XSetWMProtocols (private->xdisplay, private->xwindow, gdk_wm_window_protocols, 2);
250 case GDK_WINDOW_CHILD:
251 if ((attributes->wclass == GDK_INPUT_OUTPUT) &&
252 (colormap != gdk_colormap_get_system ()) &&
253 (colormap != gdk_window_get_colormap (gdk_window_get_toplevel (window))))
255 g_print ("adding colormap window\n");
256 gdk_window_add_colormap_windows (window);
263 size_hints.flags = PSize | PBaseSize;
264 size_hints.width = private->width;
265 size_hints.height = private->height;
266 size_hints.base_width = private->width;
267 size_hints.base_height = private->height;
269 wm_hints.flags = InputHint | StateHint | WindowGroupHint;
270 wm_hints.window_group = gdk_leader_window;
271 wm_hints.input = True;
272 wm_hints.initial_state = NormalState;
274 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
275 XSetWMHints (private->xdisplay, private->xwindow, &wm_hints);
277 if (attributes_mask & GDK_WA_TITLE)
278 title = attributes->title;
280 title = gdk_progname;
282 XmbSetWMProperties (private->xdisplay, private->xwindow,
287 if (attributes_mask & GDK_WA_WMCLASS)
289 class_hint = XAllocClassHint ();
290 class_hint->res_name = attributes->wmclass_name;
291 class_hint->res_class = attributes->wmclass_class;
292 XSetClassHint (private->xdisplay, private->xwindow, class_hint);
296 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
297 (attributes->cursor) :
304 gdk_window_foreign_new (guint32 anid)
307 GdkWindowPrivate *private;
308 XWindowAttributes attrs;
310 private = g_new (GdkWindowPrivate, 1);
311 window = (GdkWindow*) private;
313 XGetWindowAttributes (gdk_display, anid, &attrs);
315 private->parent = NULL;
316 private->xwindow = anid;
317 private->xdisplay = gdk_display;
318 private->x = attrs.x;
319 private->y = attrs.y;
320 private->width = attrs.width;
321 private->height = attrs.height;
322 private->resize_count = 0;
323 private->ref_count = 1;
324 if (anid == attrs.root)
325 private->window_type = GDK_WINDOW_ROOT;
327 private->window_type = GDK_WINDOW_TOPLEVEL;
328 /* the above is probably wrong, but it may not be worth the extra
329 X call to get it right */
331 private->destroyed = FALSE;
332 private->extension_events = 0;
333 private->filters = NULL;
335 window->user_data = NULL;
337 gdk_window_ref (window);
338 gdk_xid_table_insert (&private->xwindow, window);
343 /* Call this function when you want a window and all its children to
344 disappear. When xdestroy is true, a request to destroy the XWindow
345 is sent out. When it is false, it is assumed that the XWindow has
346 been or will be destroyed by destroying some ancestor of this
350 gdk_window_internal_destroy (GdkWindow *window, int xdestroy)
352 GdkWindowPrivate *private;
353 GdkWindowPrivate *temp_private;
354 GdkWindow *temp_window;
358 g_return_if_fail (window != NULL);
360 private = (GdkWindowPrivate*) window;
362 switch (private->window_type)
364 case GDK_WINDOW_TOPLEVEL:
365 case GDK_WINDOW_CHILD:
366 case GDK_WINDOW_DIALOG:
367 case GDK_WINDOW_TEMP:
368 if (!private->destroyed)
370 children = gdk_window_get_children (window);
375 temp_window = tmp->data;
378 temp_private = (GdkWindowPrivate*) temp_window;
380 gdk_window_internal_destroy (temp_window, FALSE);
383 g_list_free (children);
385 if (private->extension_events != 0)
386 gdk_input_window_destroy (window);
388 if(private->dnd_drag_data_numtypesavail > 0)
390 g_free (private->dnd_drag_data_typesavail);
391 private->dnd_drag_data_typesavail = NULL;
393 if(private->dnd_drop_data_numtypesavail > 0)
395 g_free (private->dnd_drop_data_typesavail);
396 private->dnd_drop_data_typesavail = NULL;
400 XDestroyWindow (private->xdisplay, private->xwindow);
401 private->destroyed = TRUE;
405 case GDK_WINDOW_ROOT:
406 g_error ("attempted to destroy root window");
409 case GDK_WINDOW_PIXMAP:
410 g_error ("called gdk_window_destroy on a pixmap (use gdk_pixmap_unref)");
415 /* Like internal_destroy, but also destroys the reference created by
419 gdk_window_destroy (GdkWindow *window)
421 gdk_window_internal_destroy (window, TRUE);
422 gdk_window_unref (window);
425 /* This function is called when the XWindow is really gone. */
428 gdk_window_destroy_notify (GdkWindow *window)
430 GdkWindowPrivate *private;
432 g_return_if_fail (window != NULL);
434 private = (GdkWindowPrivate*) window;
436 gdk_xid_table_remove (private->xwindow);
437 gdk_window_unref (window);
441 gdk_window_ref (GdkWindow *window)
443 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
444 g_return_val_if_fail (window != NULL, NULL);
446 private->ref_count += 1;
451 gdk_window_unref (GdkWindow *window)
453 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
454 g_return_if_fail (window != NULL);
456 private->ref_count -= 1;
457 if (private->ref_count == 0)
459 if (!private->destroyed)
460 g_warning ("losing last reference to undestroyed window\n");
466 gdk_window_show (GdkWindow *window)
468 GdkWindowPrivate *private;
470 g_return_if_fail (window != NULL);
472 private = (GdkWindowPrivate*) window;
473 if (!private->destroyed)
475 XRaiseWindow (private->xdisplay, private->xwindow);
476 XMapWindow (private->xdisplay, private->xwindow);
481 gdk_window_hide (GdkWindow *window)
483 GdkWindowPrivate *private;
485 g_return_if_fail (window != NULL);
487 private = (GdkWindowPrivate*) window;
488 if (!private->destroyed)
489 XUnmapWindow (private->xdisplay, private->xwindow);
493 gdk_window_withdraw (GdkWindow *window)
495 GdkWindowPrivate *private;
497 g_return_if_fail (window != NULL);
499 private = (GdkWindowPrivate*) window;
500 if (!private->destroyed)
501 XWithdrawWindow (private->xdisplay, private->xwindow, 0);
505 gdk_window_move (GdkWindow *window,
509 GdkWindowPrivate *private;
511 g_return_if_fail (window != NULL);
513 private = (GdkWindowPrivate*) window;
514 if (!private->destroyed)
516 XMoveWindow (private->xdisplay, private->xwindow, x, y);
518 if (private->window_type == GDK_WINDOW_CHILD)
527 gdk_window_resize (GdkWindow *window,
531 GdkWindowPrivate *private;
533 g_return_if_fail (window != NULL);
540 private = (GdkWindowPrivate*) window;
542 if (!private->destroyed &&
543 ((private->resize_count > 0) ||
544 (private->width != (guint16) width) ||
545 (private->height != (guint16) height)))
547 XResizeWindow (private->xdisplay, private->xwindow, width, height);
548 private->resize_count += 1;
550 if (private->window_type == GDK_WINDOW_CHILD)
552 private->width = width;
553 private->height = height;
559 gdk_window_move_resize (GdkWindow *window,
565 GdkWindowPrivate *private;
567 g_return_if_fail (window != NULL);
574 private = (GdkWindowPrivate*) window;
575 if (!private->destroyed)
577 XMoveResizeWindow (private->xdisplay, private->xwindow, x, y, width, height);
579 if (private->window_type == GDK_WINDOW_CHILD)
583 private->width = width;
584 private->height = height;
590 gdk_window_reparent (GdkWindow *window,
591 GdkWindow *new_parent,
595 GdkWindowPrivate *window_private;
596 GdkWindowPrivate *parent_private;
598 g_return_if_fail (window != NULL);
601 new_parent = (GdkWindow*) &gdk_root_parent;
603 window_private = (GdkWindowPrivate*) window;
604 parent_private = (GdkWindowPrivate*) new_parent;
606 if (!window_private->destroyed && !parent_private->destroyed)
607 XReparentWindow (window_private->xdisplay,
608 window_private->xwindow,
609 parent_private->xwindow,
614 gdk_window_clear (GdkWindow *window)
616 GdkWindowPrivate *private;
618 g_return_if_fail (window != NULL);
620 private = (GdkWindowPrivate*) window;
622 if (!private->destroyed)
623 XClearWindow (private->xdisplay, private->xwindow);
627 gdk_window_clear_area (GdkWindow *window,
633 GdkWindowPrivate *private;
635 g_return_if_fail (window != NULL);
637 private = (GdkWindowPrivate*) window;
639 if (!private->destroyed)
640 XClearArea (private->xdisplay, private->xwindow,
641 x, y, width, height, False);
645 gdk_window_clear_area_e (GdkWindow *window,
651 GdkWindowPrivate *private;
653 g_return_if_fail (window != NULL);
655 private = (GdkWindowPrivate*) window;
657 if (!private->destroyed)
658 XClearArea (private->xdisplay, private->xwindow,
659 x, y, width, height, True);
663 gdk_window_copy_area (GdkWindow *window,
667 GdkWindow *source_window,
673 GdkWindowPrivate *src_private;
674 GdkWindowPrivate *dest_private;
675 GdkGCPrivate *gc_private;
677 g_return_if_fail (window != NULL);
678 g_return_if_fail (gc != NULL);
680 if (source_window == NULL)
681 source_window = window;
683 src_private = (GdkWindowPrivate*) source_window;
684 dest_private = (GdkWindowPrivate*) window;
685 gc_private = (GdkGCPrivate*) gc;
687 if (!src_private->destroyed && !dest_private->destroyed)
689 XCopyArea (dest_private->xdisplay, src_private->xwindow, dest_private->xwindow,
698 gdk_window_raise (GdkWindow *window)
700 GdkWindowPrivate *private;
702 g_return_if_fail (window != NULL);
704 private = (GdkWindowPrivate*) window;
706 if (!private->destroyed)
707 XRaiseWindow (private->xdisplay, private->xwindow);
711 gdk_window_lower (GdkWindow *window)
713 GdkWindowPrivate *private;
715 g_return_if_fail (window != NULL);
717 private = (GdkWindowPrivate*) window;
719 if (!private->destroyed)
720 XLowerWindow (private->xdisplay, private->xwindow);
724 gdk_window_set_user_data (GdkWindow *window,
727 g_return_if_fail (window != NULL);
729 window->user_data = user_data;
733 gdk_window_set_hints (GdkWindow *window,
742 GdkWindowPrivate *private;
743 XSizeHints size_hints;
745 g_return_if_fail (window != NULL);
747 private = (GdkWindowPrivate*) window;
748 if (private->destroyed)
751 size_hints.flags = 0;
753 if (flags & GDK_HINT_POS)
755 size_hints.flags |= PPosition;
760 if (flags & GDK_HINT_MIN_SIZE)
762 size_hints.flags |= PMinSize;
763 size_hints.min_width = min_width;
764 size_hints.min_height = min_height;
767 if (flags & GDK_HINT_MAX_SIZE)
769 size_hints.flags |= PMaxSize;
770 size_hints.max_width = max_width;
771 size_hints.max_height = max_height;
775 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
779 gdk_window_set_title (GdkWindow *window,
782 GdkWindowPrivate *private;
784 g_return_if_fail (window != NULL);
786 private = (GdkWindowPrivate*) window;
787 if (!private->destroyed)
788 XmbSetWMProperties (private->xdisplay, private->xwindow,
789 title, title, NULL, 0, NULL, NULL, NULL);
793 gdk_window_set_background (GdkWindow *window,
796 GdkWindowPrivate *private;
798 g_return_if_fail (window != NULL);
800 private = (GdkWindowPrivate*) window;
801 if (!private->destroyed)
802 XSetWindowBackground (private->xdisplay, private->xwindow, color->pixel);
806 gdk_window_set_back_pixmap (GdkWindow *window,
808 gint parent_relative)
810 GdkWindowPrivate *window_private;
811 GdkPixmapPrivate *pixmap_private;
814 g_return_if_fail (window != NULL);
816 window_private = (GdkWindowPrivate*) window;
817 pixmap_private = (GdkPixmapPrivate*) pixmap;
820 xpixmap = pixmap_private->xwindow;
825 xpixmap = ParentRelative;
827 if (!window_private->destroyed)
828 XSetWindowBackgroundPixmap (window_private->xdisplay, window_private->xwindow, xpixmap);
832 gdk_window_set_cursor (GdkWindow *window,
835 GdkWindowPrivate *window_private;
836 GdkCursorPrivate *cursor_private;
839 g_return_if_fail (window != NULL);
841 window_private = (GdkWindowPrivate*) window;
842 cursor_private = (GdkCursorPrivate*) cursor;
847 xcursor = cursor_private->xcursor;
849 if (!window_private->destroyed)
850 XDefineCursor (window_private->xdisplay, window_private->xwindow, xcursor);
854 gdk_window_set_colormap (GdkWindow *window,
855 GdkColormap *colormap)
857 GdkWindowPrivate *window_private;
858 GdkColormapPrivate *colormap_private;
860 g_return_if_fail (window != NULL);
861 g_return_if_fail (colormap != NULL);
863 window_private = (GdkWindowPrivate*) window;
864 colormap_private = (GdkColormapPrivate*) colormap;
866 if (!window_private->destroyed)
868 XSetWindowColormap (window_private->xdisplay,
869 window_private->xwindow,
870 colormap_private->xcolormap);
872 if (window_private->window_type != GDK_WINDOW_TOPLEVEL)
873 gdk_window_add_colormap_windows (window);
878 gdk_window_get_user_data (GdkWindow *window,
881 g_return_if_fail (window != NULL);
883 *data = window->user_data;
887 gdk_window_get_geometry (GdkWindow *window,
894 GdkWindowPrivate *window_private;
904 window = (GdkWindow*) &gdk_root_parent;
906 window_private = (GdkWindowPrivate*) window;
908 if (!window_private->destroyed)
910 XGetGeometry (window_private->xdisplay, window_private->xwindow,
911 &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
927 gdk_window_get_position (GdkWindow *window,
931 GdkWindowPrivate *window_private;
933 g_return_if_fail (window != NULL);
935 window_private = (GdkWindowPrivate*) window;
938 *x = window_private->x;
940 *y = window_private->y;
944 gdk_window_get_size (GdkWindow *window,
948 GdkWindowPrivate *window_private;
950 g_return_if_fail (window != NULL);
952 window_private = (GdkWindowPrivate*) window;
955 *width = window_private->width;
957 *height = window_private->height;
961 gdk_window_get_visual (GdkWindow *window)
963 GdkWindowPrivate *window_private;
964 XWindowAttributes window_attributes;
966 g_return_val_if_fail (window != NULL, NULL);
968 window_private = (GdkWindowPrivate*) window;
969 while (window_private && (window_private->window_type == GDK_WINDOW_PIXMAP))
970 window_private = (GdkWindowPrivate*) window_private->parent;
972 if (window_private && !window_private->destroyed)
974 XGetWindowAttributes (window_private->xdisplay,
975 window_private->xwindow,
978 return gdk_visual_lookup (window_attributes.visual);
985 gdk_window_get_colormap (GdkWindow *window)
987 GdkWindowPrivate *window_private;
988 XWindowAttributes window_attributes;
990 g_return_val_if_fail (window != NULL, NULL);
992 window_private = (GdkWindowPrivate*) window;
994 if (!window_private->destroyed)
996 XGetWindowAttributes (window_private->xdisplay,
997 window_private->xwindow,
1000 return gdk_colormap_lookup (window_attributes.colormap);
1007 gdk_window_get_type (GdkWindow *window)
1009 GdkWindowPrivate *window_private;
1011 g_return_val_if_fail (window != NULL, (GdkWindowType) -1);
1013 window_private = (GdkWindowPrivate*) window;
1014 return window_private->window_type;
1018 gdk_window_get_origin (GdkWindow *window,
1022 GdkWindowPrivate *private;
1027 g_return_val_if_fail (window != NULL, 0);
1029 private = (GdkWindowPrivate*) window;
1031 if (!private->destroyed)
1033 return_val = XTranslateCoordinates (private->xdisplay,
1051 gdk_window_get_pointer (GdkWindow *window,
1054 GdkModifierType *mask)
1056 GdkWindowPrivate *private;
1057 GdkWindow *return_val;
1065 window = (GdkWindow*) &gdk_root_parent;
1067 private = (GdkWindowPrivate*) window;
1070 if (!private->destroyed &&
1071 XQueryPointer (private->xdisplay, private->xwindow, &root, &child,
1072 &rootx, &rooty, &winx, &winy, &xmask))
1076 if (mask) *mask = xmask;
1079 return_val = gdk_window_lookup (child);
1086 gdk_window_get_parent (GdkWindow *window)
1088 g_return_val_if_fail (window != NULL, NULL);
1090 return ((GdkWindowPrivate*) window)->parent;
1094 gdk_window_get_toplevel (GdkWindow *window)
1096 GdkWindowPrivate *private;
1098 g_return_val_if_fail (window != NULL, NULL);
1100 private = (GdkWindowPrivate*) window;
1102 while (private->window_type == GDK_WINDOW_CHILD)
1104 window = ((GdkWindowPrivate*) window)->parent;
1105 private = (GdkWindowPrivate*) window;
1112 gdk_window_get_children (GdkWindow *window)
1114 GdkWindowPrivate *private;
1120 unsigned int nchildren;
1123 g_return_val_if_fail (window != NULL, NULL);
1125 private = (GdkWindowPrivate*) window;
1126 if (private->destroyed)
1129 XQueryTree (private->xdisplay, private->xwindow,
1130 &root, &parent, &xchildren, &nchildren);
1136 for (i = 0; i < nchildren; i++)
1138 child = gdk_window_lookup (xchildren[i]);
1140 children = g_list_prepend (children, child);
1150 gdk_window_get_events (GdkWindow *window)
1152 GdkWindowPrivate *private;
1153 XWindowAttributes attrs;
1154 GdkEventMask event_mask;
1157 g_return_val_if_fail (window != NULL, 0);
1159 private = (GdkWindowPrivate*) window;
1160 if (private->destroyed)
1163 XGetWindowAttributes (gdk_display, private->xwindow,
1167 for (i = 0; i < nevent_masks; i++)
1169 if (attrs.your_event_mask & event_mask_table[i])
1170 event_mask |= 1 << (i + 1);
1177 gdk_window_set_events (GdkWindow *window,
1178 GdkEventMask event_mask)
1180 GdkWindowPrivate *private;
1184 g_return_if_fail (window != NULL);
1186 private = (GdkWindowPrivate*) window;
1187 if (private->destroyed)
1190 xevent_mask = StructureNotifyMask;
1191 for (i = 0; i < nevent_masks; i++)
1193 if (event_mask & (1 << (i + 1)))
1194 xevent_mask |= event_mask_table[i];
1197 XSelectInput (gdk_display, private->xwindow,
1202 gdk_window_add_colormap_windows (GdkWindow *window)
1204 GdkWindow *toplevel;
1205 GdkWindowPrivate *toplevel_private;
1206 GdkWindowPrivate *window_private;
1207 Window *old_windows;
1208 Window *new_windows;
1211 g_return_if_fail (window != NULL);
1213 toplevel = gdk_window_get_toplevel (window);
1214 toplevel_private = (GdkWindowPrivate*) toplevel;
1215 window_private = (GdkWindowPrivate*) window;
1216 if (window_private->destroyed)
1219 if (!XGetWMColormapWindows (toplevel_private->xdisplay,
1220 toplevel_private->xwindow,
1221 &old_windows, &count))
1227 for (i = 0; i < count; i++)
1228 if (old_windows[i] == window_private->xwindow)
1231 new_windows = g_new (Window, count + 1);
1233 for (i = 0; i < count; i++)
1234 new_windows[i] = old_windows[i];
1235 new_windows[count] = window_private->xwindow;
1237 XSetWMColormapWindows (toplevel_private->xdisplay,
1238 toplevel_private->xwindow,
1239 new_windows, count + 1);
1241 g_free (new_windows);
1243 XFree (old_windows);
1247 * This needs the X11 shape extension.
1248 * If not available, simply remove the call to
1249 * XShapeCombineMask. Shaped windows will look
1250 * ugly, but programs still work. Stefan Wille
1253 gdk_window_shape_combine_mask (GdkWindow *window,
1257 GdkWindowPrivate *window_private;
1260 g_return_if_fail (window != NULL);
1262 window_private = (GdkWindowPrivate*) window;
1263 if (window_private->destroyed)
1268 GdkWindowPrivate *pixmap_private;
1270 pixmap_private = (GdkWindowPrivate*) mask;
1271 pixmap = (Pixmap) pixmap_private->xwindow;
1280 XShapeCombineMask (window_private->xdisplay,
1281 window_private->xwindow,
1289 gdk_dnd_drag_addwindow (GdkWindow *window)
1291 GdkWindowPrivate *window_private;
1293 g_return_if_fail (window != NULL);
1295 window_private = (GdkWindowPrivate *) window;
1296 if (window_private->destroyed)
1299 if (window_private->dnd_drag_enabled == 1 && gdk_dnd.drag_really == 0)
1301 gdk_dnd.drag_numwindows++;
1302 gdk_dnd.drag_startwindows = g_realloc (gdk_dnd.drag_startwindows,
1303 gdk_dnd.drag_numwindows
1304 * sizeof(GdkWindow *));
1305 gdk_dnd.drag_startwindows[gdk_dnd.drag_numwindows - 1] = window;
1306 window_private->dnd_drag_accepted = 0;
1309 g_warning ("dnd_really is 1 or drag is not enabled! can't addwindow\n");
1313 gdk_window_dnd_drag_set (GdkWindow *window,
1318 GdkWindowPrivate *window_private;
1321 g_return_if_fail (window != NULL);
1322 window_private = (GdkWindowPrivate *) window;
1323 if (window_private->destroyed)
1326 window_private->dnd_drag_enabled = drag_enable ? 1 : 0;
1330 g_return_if_fail(typelist != NULL);
1332 if (window_private->dnd_drag_data_numtypesavail > 3)
1334 window_private->dnd_drag_data_numtypesavail = numtypes;
1336 window_private->dnd_drag_data_typesavail =
1337 g_realloc (window_private->dnd_drag_data_typesavail,
1338 (numtypes + 1) * sizeof (GdkAtom));
1340 for (i = 0; i < numtypes; i++)
1342 /* Allow blanket use of ALL to get anything... */
1343 if (strcmp (typelist[i], "ALL"))
1344 window_private->dnd_drag_data_typesavail[i] =
1345 gdk_atom_intern (typelist[i], FALSE);
1347 window_private->dnd_drag_data_typesavail[i] = None;
1351 * set our extended type list if we need to
1354 gdk_property_change(window, gdk_dnd.gdk_XdeTypelist,
1355 XA_PRIMARY, 32, GDK_PROP_MODE_REPLACE,
1356 (guchar *)(window_private->dnd_drag_data_typesavail
1357 + (sizeof(GdkAtom) * 3)),
1358 (numtypes - 3) * sizeof(GdkAtom));
1360 gdk_property_delete (window, gdk_dnd.gdk_XdeTypelist);
1364 g_free (window_private->dnd_drag_data_typesavail);
1365 window_private->dnd_drag_data_typesavail = NULL;
1366 window_private->dnd_drag_data_numtypesavail = 0;
1371 gdk_window_dnd_drop_set (GdkWindow *window,
1375 guint8 destructive_op)
1377 GdkWindowPrivate *window_private;
1380 g_return_if_fail (window != NULL);
1381 window_private = (GdkWindowPrivate *) window;
1382 if (window_private->destroyed)
1385 window_private->dnd_drop_enabled = drop_enable ? 1 : 0;
1388 g_return_if_fail(typelist != NULL);
1390 window_private->dnd_drop_data_numtypesavail = numtypes;
1392 window_private->dnd_drop_data_typesavail =
1393 g_realloc (window_private->dnd_drop_data_typesavail,
1394 (numtypes + 1) * sizeof (GdkAtom));
1396 for (i = 0; i < numtypes; i++)
1397 window_private->dnd_drop_data_typesavail[i] =
1398 gdk_atom_intern (typelist[i], FALSE);
1400 window_private->dnd_drop_destructive_op = destructive_op;
1405 * This is used to reply to a GDK_DRAG_REQUEST event
1406 * (which may be generated by XdeRequest or a confirmed drop...
1409 gdk_window_dnd_data_set (GdkWindow *window,
1412 gulong data_numbytes)
1414 GdkWindowPrivate *window_private;
1416 GdkEventDropDataAvailable tmp_ev;
1419 g_return_if_fail (window != NULL);
1420 g_return_if_fail (event != NULL);
1421 g_return_if_fail (data != NULL);
1422 g_return_if_fail (data_numbytes > 0);
1423 g_return_if_fail (event->type == GDK_DRAG_REQUEST);
1425 window_private = (GdkWindowPrivate *) window;
1426 g_return_if_fail (window_private->dnd_drag_accepted != 0);
1427 if (window_private->destroyed)
1430 /* We set the property on our window... */
1431 gdk_property_change (window, window_private->dnd_drag_data_type,
1432 XA_PRIMARY, 8, GDK_PROP_MODE_REPLACE, data,
1434 tmp = gdk_atom_name(window_private->dnd_drag_data_type);
1436 g_print("DnD type %s on window %ld\n", tmp, window_private->xwindow);
1441 * Then we send the event to tell the receiving window that the
1444 tmp_ev.u.allflags = 0;
1445 tmp_ev.u.flags.protocol_version = DND_PROTOCOL_VERSION;
1446 tmp_ev.u.flags.isdrop = event->dragrequest.isdrop;
1448 sev.xclient.type = ClientMessage;
1449 sev.xclient.format = 32;
1450 sev.xclient.window = event->dragrequest.requestor;
1451 sev.xclient.message_type = gdk_dnd.gdk_XdeDataAvailable;
1452 sev.xclient.data.l[0] = window_private->xwindow;
1453 sev.xclient.data.l[1] = tmp_ev.u.allflags;
1454 sev.xclient.data.l[2] = window_private->dnd_drag_data_type;
1456 if (event->dragrequest.isdrop)
1457 sev.xclient.data.l[3] = event->dragrequest.drop_coords.x +
1458 (event->dragrequest.drop_coords.y << 16);
1460 sev.xclient.data.l[3] = 0;
1462 sev.xclient.data.l[4] = 0;
1464 XSendEvent (gdk_display, event->dragrequest.requestor, False,
1469 gdk_window_add_filter (GdkWindow *window,
1470 GdkFilterFunc function,
1473 GdkWindowPrivate *private;
1475 GdkEventFilter *filter;
1477 g_return_if_fail (window != NULL);
1479 private = (GdkWindowPrivate*) window;
1480 if (private->destroyed)
1483 tmp_list = private->filters;
1486 filter = (GdkEventFilter *)tmp_list->data;
1487 if ((filter->function == function) && (filter->data == data))
1489 tmp_list = tmp_list->next;
1492 filter = g_new (GdkEventFilter, 1);
1493 filter->function = function;
1494 filter->data = data;
1496 private->filters = g_list_append (private->filters, filter);
1500 gdk_window_remove_filter (GdkWindow *window,
1501 GdkFilterFunc function,
1504 GdkWindowPrivate *private;
1506 GdkEventFilter *filter;
1508 g_return_if_fail (window != NULL);
1509 private = (GdkWindowPrivate*) window;
1511 tmp_list = private->filters;
1514 filter = (GdkEventFilter *)tmp_list->data;
1515 tmp_list = tmp_list->next;
1517 if ((filter->function == function) && (filter->data == data))
1519 private->filters = g_list_remove_link (private->filters, tmp_list);
1520 g_list_free_1 (tmp_list);
1529 gdk_window_set_override_redirect(GdkWindow *window,
1530 gboolean override_redirect)
1532 GdkWindowPrivate *private;
1533 XSetWindowAttributes attr;
1535 g_return_if_fail (window != NULL);
1536 private = (GdkWindowPrivate*) window;
1537 if (private->destroyed)
1540 attr.override_redirect = (override_redirect == FALSE)?False:True;
1541 XChangeWindowAttributes(gdk_display,
1542 ((GdkWindowPrivate *)window)->xwindow,