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->dnd_drag_data_numtypesavail > 0)
387 g_free (private->dnd_drag_data_typesavail);
388 private->dnd_drag_data_typesavail = NULL;
390 if(private->dnd_drop_data_numtypesavail > 0)
392 g_free (private->dnd_drop_data_typesavail);
393 private->dnd_drop_data_typesavail = NULL;
397 XDestroyWindow (private->xdisplay, private->xwindow);
398 private->destroyed = TRUE;
402 case GDK_WINDOW_ROOT:
403 g_error ("attempted to destroy root window");
406 case GDK_WINDOW_PIXMAP:
407 g_error ("called gdk_window_destroy on a pixmap (use gdk_pixmap_unref)");
412 /* Like internal_destroy, but also destroys the reference created by
416 gdk_window_destroy (GdkWindow *window)
418 gdk_window_internal_destroy (window, TRUE);
419 gdk_window_unref (window);
422 /* This function is called when the XWindow is really gone. */
425 gdk_window_destroy_notify (GdkWindow *window)
427 GdkWindowPrivate *private;
429 g_return_if_fail (window != NULL);
431 private = (GdkWindowPrivate*) window;
433 if (private->extension_events != 0)
434 gdk_input_window_destroy (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;
962 gdk_window_get_visual (GdkWindow *window)
964 GdkWindowPrivate *window_private;
965 XWindowAttributes window_attributes;
967 g_return_val_if_fail (window != NULL, NULL);
969 window_private = (GdkWindowPrivate*) window;
970 while (window_private && (window_private->window_type == GDK_WINDOW_PIXMAP))
971 window_private = (GdkWindowPrivate*) window_private->parent;
973 if (window_private && !window_private->destroyed)
975 XGetWindowAttributes (window_private->xdisplay,
976 window_private->xwindow,
979 return gdk_visual_lookup (window_attributes.visual);
986 gdk_window_get_colormap (GdkWindow *window)
988 GdkWindowPrivate *window_private;
989 XWindowAttributes window_attributes;
991 g_return_val_if_fail (window != NULL, NULL);
993 window_private = (GdkWindowPrivate*) window;
995 if (!window_private->destroyed)
997 XGetWindowAttributes (window_private->xdisplay,
998 window_private->xwindow,
1001 return gdk_colormap_lookup (window_attributes.colormap);
1008 gdk_window_get_type (GdkWindow *window)
1010 GdkWindowPrivate *window_private;
1012 g_return_val_if_fail (window != NULL, (GdkWindowType) -1);
1014 window_private = (GdkWindowPrivate*) window;
1015 return window_private->window_type;
1019 gdk_window_get_origin (GdkWindow *window,
1023 GdkWindowPrivate *private;
1028 g_return_val_if_fail (window != NULL, 0);
1030 private = (GdkWindowPrivate*) window;
1032 if (!private->destroyed)
1034 return_val = XTranslateCoordinates (private->xdisplay,
1052 gdk_window_get_pointer (GdkWindow *window,
1055 GdkModifierType *mask)
1057 GdkWindowPrivate *private;
1058 GdkWindow *return_val;
1066 window = (GdkWindow*) &gdk_root_parent;
1068 private = (GdkWindowPrivate*) window;
1071 if (!private->destroyed &&
1072 XQueryPointer (private->xdisplay, private->xwindow, &root, &child,
1073 &rootx, &rooty, &winx, &winy, &xmask))
1077 if (mask) *mask = xmask;
1080 return_val = gdk_window_lookup (child);
1087 gdk_window_get_parent (GdkWindow *window)
1089 g_return_val_if_fail (window != NULL, NULL);
1091 return ((GdkWindowPrivate*) window)->parent;
1095 gdk_window_get_toplevel (GdkWindow *window)
1097 GdkWindowPrivate *private;
1099 g_return_val_if_fail (window != NULL, NULL);
1101 private = (GdkWindowPrivate*) window;
1103 while (private->window_type == GDK_WINDOW_CHILD)
1105 window = ((GdkWindowPrivate*) window)->parent;
1106 private = (GdkWindowPrivate*) window;
1113 gdk_window_get_children (GdkWindow *window)
1115 GdkWindowPrivate *private;
1121 unsigned int nchildren;
1124 g_return_val_if_fail (window != NULL, NULL);
1126 private = (GdkWindowPrivate*) window;
1127 if (private->destroyed)
1130 XQueryTree (private->xdisplay, private->xwindow,
1131 &root, &parent, &xchildren, &nchildren);
1137 for (i = 0; i < nchildren; i++)
1139 child = gdk_window_lookup (xchildren[i]);
1141 children = g_list_prepend (children, child);
1151 gdk_window_get_events (GdkWindow *window)
1153 GdkWindowPrivate *private;
1154 XWindowAttributes attrs;
1155 GdkEventMask event_mask;
1158 g_return_val_if_fail (window != NULL, 0);
1160 private = (GdkWindowPrivate*) window;
1161 if (private->destroyed)
1164 XGetWindowAttributes (gdk_display, private->xwindow,
1168 for (i = 0; i < nevent_masks; i++)
1170 if (attrs.your_event_mask & event_mask_table[i])
1171 event_mask |= 1 << (i + 1);
1178 gdk_window_set_events (GdkWindow *window,
1179 GdkEventMask event_mask)
1181 GdkWindowPrivate *private;
1185 g_return_if_fail (window != NULL);
1187 private = (GdkWindowPrivate*) window;
1188 if (private->destroyed)
1191 xevent_mask = StructureNotifyMask;
1192 for (i = 0; i < nevent_masks; i++)
1194 if (event_mask & (1 << (i + 1)))
1195 xevent_mask |= event_mask_table[i];
1198 XSelectInput (gdk_display, private->xwindow,
1203 gdk_window_add_colormap_windows (GdkWindow *window)
1205 GdkWindow *toplevel;
1206 GdkWindowPrivate *toplevel_private;
1207 GdkWindowPrivate *window_private;
1208 Window *old_windows;
1209 Window *new_windows;
1212 g_return_if_fail (window != NULL);
1214 toplevel = gdk_window_get_toplevel (window);
1215 toplevel_private = (GdkWindowPrivate*) toplevel;
1216 window_private = (GdkWindowPrivate*) window;
1217 if (window_private->destroyed)
1220 if (!XGetWMColormapWindows (toplevel_private->xdisplay,
1221 toplevel_private->xwindow,
1222 &old_windows, &count))
1228 for (i = 0; i < count; i++)
1229 if (old_windows[i] == window_private->xwindow)
1232 new_windows = g_new (Window, count + 1);
1234 for (i = 0; i < count; i++)
1235 new_windows[i] = old_windows[i];
1236 new_windows[count] = window_private->xwindow;
1238 XSetWMColormapWindows (toplevel_private->xdisplay,
1239 toplevel_private->xwindow,
1240 new_windows, count + 1);
1242 g_free (new_windows);
1244 XFree (old_windows);
1248 * This needs the X11 shape extension.
1249 * If not available, simply remove the call to
1250 * XShapeCombineMask. Shaped windows will look
1251 * ugly, but programs still work. Stefan Wille
1254 gdk_window_shape_combine_mask (GdkWindow *window,
1258 GdkWindowPrivate *window_private;
1259 GdkWindowPrivate *pixmap_private;
1261 g_return_if_fail (window != NULL);
1262 g_return_if_fail (mask != NULL);
1264 window_private = (GdkWindowPrivate*) window;
1265 pixmap_private = (GdkWindowPrivate*) mask;
1266 if (window_private->destroyed)
1269 XShapeCombineMask (window_private->xdisplay,
1270 window_private->xwindow,
1273 (Pixmap)pixmap_private->xwindow,
1278 gdk_dnd_drag_addwindow (GdkWindow *window)
1280 GdkWindowPrivate *window_private;
1282 g_return_if_fail (window != NULL);
1284 window_private = (GdkWindowPrivate *) window;
1285 if (window_private->destroyed)
1288 if (window_private->dnd_drag_enabled == 1 && gdk_dnd.drag_really == 0)
1290 gdk_dnd.drag_numwindows++;
1291 gdk_dnd.drag_startwindows = g_realloc (gdk_dnd.drag_startwindows,
1292 gdk_dnd.drag_numwindows
1293 * sizeof(GdkWindow *));
1294 gdk_dnd.drag_startwindows[gdk_dnd.drag_numwindows - 1] = window;
1295 window_private->dnd_drag_accepted = 0;
1298 g_warning ("dnd_really is 1 or drag is not enabled! can't addwindow\n");
1302 gdk_window_dnd_drag_set (GdkWindow *window,
1307 GdkWindowPrivate *window_private;
1310 g_return_if_fail (window != NULL);
1311 window_private = (GdkWindowPrivate *) window;
1312 if (window_private->destroyed)
1315 window_private->dnd_drag_enabled = drag_enable ? 1 : 0;
1319 g_return_if_fail(typelist != NULL);
1321 if (window_private->dnd_drag_data_numtypesavail > 3)
1323 window_private->dnd_drag_data_numtypesavail = numtypes;
1325 window_private->dnd_drag_data_typesavail =
1326 g_realloc (window_private->dnd_drag_data_typesavail,
1327 (numtypes + 1) * sizeof (GdkAtom));
1329 for (i = 0; i < numtypes; i++)
1331 /* Allow blanket use of ALL to get anything... */
1332 if (strcmp (typelist[i], "ALL"))
1333 window_private->dnd_drag_data_typesavail[i] =
1334 gdk_atom_intern (typelist[i], FALSE);
1336 window_private->dnd_drag_data_typesavail[i] = None;
1340 * set our extended type list if we need to
1343 gdk_property_change(window, gdk_dnd.gdk_XdeTypelist,
1344 XA_PRIMARY, 32, GDK_PROP_MODE_REPLACE,
1345 (guchar *)(window_private->dnd_drag_data_typesavail
1346 + (sizeof(GdkAtom) * 3)),
1347 (numtypes - 3) * sizeof(GdkAtom));
1349 gdk_property_delete (window, gdk_dnd.gdk_XdeTypelist);
1353 free (window_private->dnd_drag_data_typesavail);
1354 window_private->dnd_drag_data_typesavail = NULL;
1355 window_private->dnd_drag_data_numtypesavail = 0;
1360 gdk_window_dnd_drop_set (GdkWindow *window,
1364 guint8 destructive_op)
1366 GdkWindowPrivate *window_private;
1369 g_return_if_fail (window != NULL);
1370 window_private = (GdkWindowPrivate *) window;
1371 if (window_private->destroyed)
1374 window_private->dnd_drop_enabled = drop_enable ? 1 : 0;
1377 g_return_if_fail(typelist != NULL);
1379 window_private->dnd_drop_data_numtypesavail = numtypes;
1381 window_private->dnd_drop_data_typesavail =
1382 g_realloc (window_private->dnd_drop_data_typesavail,
1383 (numtypes + 1) * sizeof (GdkAtom));
1385 for (i = 0; i < numtypes; i++)
1386 window_private->dnd_drop_data_typesavail[i] =
1387 gdk_atom_intern (typelist[i], FALSE);
1389 window_private->dnd_drop_destructive_op = destructive_op;
1394 * This is used to reply to a GDK_DRAG_REQUEST event
1395 * (which may be generated by XdeRequest or a confirmed drop...
1398 gdk_window_dnd_data_set (GdkWindow *window,
1401 gulong data_numbytes)
1403 GdkWindowPrivate *window_private;
1405 GdkEventDropDataAvailable tmp_ev;
1408 g_return_if_fail (window != NULL);
1409 g_return_if_fail (event != NULL);
1410 g_return_if_fail (data != NULL);
1411 g_return_if_fail (data_numbytes > 0);
1412 g_return_if_fail (event->type == GDK_DRAG_REQUEST);
1414 g_free (event->dragrequest.data_type);
1415 event->dragrequest.data_type = NULL;
1417 window_private = (GdkWindowPrivate *) window;
1418 g_return_if_fail (window_private->dnd_drag_accepted != 0);
1419 if (window_private->destroyed)
1422 /* We set the property on our window... */
1423 gdk_property_change (window, window_private->dnd_drag_data_type,
1424 XA_PRIMARY, 8, GDK_PROP_MODE_REPLACE, data,
1426 tmp = gdk_atom_name(window_private->dnd_drag_data_type);
1428 g_print("DnD type %s on window %ld\n", tmp, window_private->xwindow);
1433 * Then we send the event to tell the receiving window that the
1436 tmp_ev.u.allflags = 0;
1437 tmp_ev.u.flags.protocol_version = DND_PROTOCOL_VERSION;
1438 tmp_ev.u.flags.isdrop = event->dragrequest.isdrop;
1440 sev.xclient.type = ClientMessage;
1441 sev.xclient.format = 32;
1442 sev.xclient.window = event->dragrequest.requestor;
1443 sev.xclient.message_type = gdk_dnd.gdk_XdeDataAvailable;
1444 sev.xclient.data.l[0] = window_private->xwindow;
1445 sev.xclient.data.l[1] = tmp_ev.u.allflags;
1446 sev.xclient.data.l[2] = window_private->dnd_drag_data_type;
1448 if (event->dragrequest.isdrop)
1449 sev.xclient.data.l[3] = event->dragrequest.drop_coords.x +
1450 (event->dragrequest.drop_coords.y << 16);
1452 sev.xclient.data.l[3] = 0;
1454 sev.xclient.data.l[4] = 0;
1456 XSendEvent (gdk_display, event->dragrequest.requestor, False,
1461 gdk_window_add_filter (GdkWindow *window,
1462 GdkFilterFunc function,
1465 GdkWindowPrivate *private;
1467 GdkEventFilter *filter;
1469 g_return_if_fail (window != NULL);
1471 private = (GdkWindowPrivate*) window;
1472 if (private->destroyed)
1475 tmp_list = private->filters;
1478 filter = (GdkEventFilter *)tmp_list->data;
1479 if ((filter->function == function) && (filter->data == data))
1481 tmp_list = tmp_list->next;
1484 filter = g_new (GdkEventFilter, 1);
1485 filter->function = function;
1486 filter->data = data;
1488 private->filters = g_list_append (private->filters, filter);
1492 gdk_window_remove_filter (GdkWindow *window,
1493 GdkFilterFunc function,
1496 GdkWindowPrivate *private;
1498 GdkEventFilter *filter;
1500 g_return_if_fail (window != NULL);
1501 private = (GdkWindowPrivate*) window;
1503 tmp_list = private->filters;
1506 filter = (GdkEventFilter *)tmp_list->data;
1507 tmp_list = tmp_list->next;
1509 if ((filter->function == function) && (filter->data == data))
1511 private->filters = g_list_remove_link (private->filters, tmp_list);
1512 g_list_free_1 (tmp_list);
1521 gdk_window_set_override_redirect(GdkWindow *window,
1522 gboolean override_redirect)
1524 GdkWindowPrivate *private;
1525 XSetWindowAttributes attr;
1527 g_return_if_fail (window != NULL);
1528 private = (GdkWindowPrivate*) window;
1529 if (private->destroyed)
1532 attr.override_redirect = (override_redirect == FALSE)?False:True;
1533 XChangeWindowAttributes(gdk_display,
1534 ((GdkWindowPrivate *)window)->xwindow,