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"
31 int nevent_masks = 17;
32 int event_mask_table[19] =
36 PointerMotionHintMask,
41 ButtonPressMask | OwnerGrabButtonMask,
42 ButtonReleaseMask | OwnerGrabButtonMask,
59 XWindowAttributes xattributes;
62 unsigned int border_width;
66 XGetGeometry (gdk_display, gdk_root_window, &gdk_root_window,
67 &x, &y, &width, &height, &border_width, &depth);
68 XGetWindowAttributes (gdk_display, gdk_root_window, &xattributes);
70 gdk_root_parent.xdisplay = gdk_display;
71 gdk_root_parent.xwindow = gdk_root_window;
72 gdk_root_parent.window_type = GDK_WINDOW_ROOT;
73 gdk_root_parent.window.user_data = NULL;
74 gdk_root_parent.width = width;
75 gdk_root_parent.height = height;
79 gdk_window_new (GdkWindow *parent,
80 GdkWindowAttr *attributes,
84 GdkWindowPrivate *private;
85 GdkWindowPrivate *parent_private;
87 GdkColormap *colormap;
88 Display *parent_display;
91 XSetWindowAttributes xattributes;
92 long xattributes_mask;
93 XSizeHints size_hints;
95 XClassHint *class_hint;
101 g_return_val_if_fail (attributes != NULL, NULL);
104 parent = (GdkWindow*) &gdk_root_parent;
106 parent_private = (GdkWindowPrivate*) parent;
107 if (parent_private->destroyed)
110 xparent = parent_private->xwindow;
111 parent_display = parent_private->xdisplay;
113 private = g_new (GdkWindowPrivate, 1);
114 window = (GdkWindow*) private;
116 private->parent = parent;
117 private->xdisplay = parent_display;
118 private->destroyed = FALSE;
119 private->resize_count = 0;
120 private->ref_count = 1;
121 xattributes_mask = 0;
123 if (attributes_mask & GDK_WA_X)
128 if (attributes_mask & GDK_WA_Y)
135 private->width = (attributes->width > 1) ? (attributes->width) : (1);
136 private->height = (attributes->height > 1) ? (attributes->height) : (1);
137 private->window_type = attributes->window_type;
138 private->extension_events = FALSE;
139 private->dnd_drag_data_type = None;
140 private->dnd_drag_data_typesavail =
141 private->dnd_drop_data_typesavail = NULL;
142 private->dnd_drop_enabled = private->dnd_drag_enabled =
143 private->dnd_drag_accepted = private->dnd_drag_datashow =
144 private->dnd_drop_data_numtypesavail =
145 private->dnd_drag_data_numtypesavail = 0;
146 private->dnd_drag_eventmask = private->dnd_drag_savedeventmask = 0;
148 private->filters = NULL;
150 window->user_data = NULL;
152 if (attributes_mask & GDK_WA_VISUAL)
153 visual = attributes->visual;
155 visual = gdk_visual_get_system ();
156 xvisual = ((GdkVisualPrivate*) visual)->xvisual;
158 xattributes.event_mask = StructureNotifyMask;
159 for (i = 0; i < nevent_masks; i++)
161 if (attributes->event_mask & (1 << (i + 1)))
162 xattributes.event_mask |= event_mask_table[i];
165 if (xattributes.event_mask)
166 xattributes_mask |= CWEventMask;
168 if(attributes_mask & GDK_WA_NOREDIR) {
169 xattributes.override_redirect =
170 (attributes->override_redirect == FALSE)?False:True;
171 xattributes_mask |= CWOverrideRedirect;
173 xattributes.override_redirect = False;
175 if (attributes->wclass == GDK_INPUT_OUTPUT)
178 depth = visual->depth;
180 if (attributes_mask & GDK_WA_COLORMAP)
181 colormap = attributes->colormap;
183 colormap = gdk_colormap_get_system ();
185 xattributes.background_pixel = BlackPixel (gdk_display, gdk_screen);
186 xattributes.border_pixel = BlackPixel (gdk_display, gdk_screen);
187 xattributes_mask |= CWBorderPixel | CWBackPixel;
189 switch (private->window_type)
191 case GDK_WINDOW_TOPLEVEL:
192 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
193 xattributes_mask |= CWColormap;
195 xparent = gdk_root_window;
198 case GDK_WINDOW_CHILD:
199 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
200 xattributes_mask |= CWColormap;
203 case GDK_WINDOW_DIALOG:
204 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
205 xattributes_mask |= CWColormap;
207 xparent = gdk_root_window;
210 case GDK_WINDOW_TEMP:
211 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
212 xattributes_mask |= CWColormap;
214 xparent = gdk_root_window;
216 xattributes.save_under = True;
217 xattributes.override_redirect = True;
218 xattributes.cursor = None;
219 xattributes_mask |= CWSaveUnder | CWOverrideRedirect;
221 case GDK_WINDOW_ROOT:
222 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
224 case GDK_WINDOW_PIXMAP:
225 g_error ("cannot make windows of type GDK_WINDOW_PIXMAP (use gdk_pixmap_new)");
236 private->xwindow = XCreateWindow (private->xdisplay, xparent,
237 x, y, private->width, private->height,
238 0, depth, class, xvisual,
239 xattributes_mask, &xattributes);
240 gdk_window_ref (window);
241 gdk_xid_table_insert (&private->xwindow, window);
243 switch (private->window_type)
245 case GDK_WINDOW_DIALOG:
246 XSetTransientForHint (private->xdisplay, private->xwindow, xparent);
247 case GDK_WINDOW_TOPLEVEL:
248 case GDK_WINDOW_TEMP:
249 XSetWMProtocols (private->xdisplay, private->xwindow, gdk_wm_window_protocols, 2);
251 case GDK_WINDOW_CHILD:
252 if ((attributes->wclass == GDK_INPUT_OUTPUT) &&
253 (colormap != gdk_colormap_get_system ()) &&
254 (colormap != gdk_window_get_colormap (gdk_window_get_toplevel (window))))
256 g_print ("adding colormap window\n");
257 gdk_window_add_colormap_windows (window);
264 size_hints.flags = PSize | PBaseSize;
265 size_hints.width = private->width;
266 size_hints.height = private->height;
267 size_hints.base_width = private->width;
268 size_hints.base_height = private->height;
270 wm_hints.flags = InputHint | StateHint | WindowGroupHint;
271 wm_hints.window_group = gdk_leader_window;
272 wm_hints.input = True;
273 wm_hints.initial_state = NormalState;
275 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
276 XSetWMHints (private->xdisplay, private->xwindow, &wm_hints);
278 if (attributes_mask & GDK_WA_TITLE)
279 title = attributes->title;
281 title = gdk_progname;
283 XmbSetWMProperties (private->xdisplay, private->xwindow,
288 if (attributes_mask & GDK_WA_WMCLASS)
290 class_hint = XAllocClassHint ();
291 class_hint->res_name = attributes->wmclass_name;
292 class_hint->res_class = attributes->wmclass_class;
293 XSetClassHint (private->xdisplay, private->xwindow, class_hint);
297 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
298 (attributes->cursor) :
305 gdk_window_foreign_new (guint32 anid)
308 GdkWindowPrivate *private;
309 XWindowAttributes attrs;
311 private = g_new (GdkWindowPrivate, 1);
312 window = (GdkWindow*) private;
314 XGetWindowAttributes (gdk_display, anid, &attrs);
316 private->parent = NULL;
317 private->xwindow = anid;
318 private->xdisplay = gdk_display;
319 private->x = attrs.x;
320 private->y = attrs.y;
321 private->width = attrs.width;
322 private->height = attrs.height;
323 private->resize_count = 0;
324 private->ref_count = 1;
325 if (anid == attrs.root)
326 private->window_type = GDK_WINDOW_ROOT;
328 private->window_type = GDK_WINDOW_TOPLEVEL;
329 /* the above is probably wrong, but it may not be worth the extra
330 X call to get it right */
332 private->destroyed = FALSE;
333 private->extension_events = 0;
334 private->filters = NULL;
336 window->user_data = NULL;
338 gdk_window_ref (window);
339 gdk_xid_table_insert (&private->xwindow, window);
344 /* Call this function when you want a window and all its children to
345 disappear. When xdestroy is true, a request to destroy the XWindow
346 is sent out. When it is false, it is assumed that the XWindow has
347 been or will be destroyed by destroying some ancestor of this
351 gdk_window_internal_destroy (GdkWindow *window, int xdestroy)
353 GdkWindowPrivate *private;
354 GdkWindowPrivate *temp_private;
355 GdkWindow *temp_window;
359 g_return_if_fail (window != NULL);
361 private = (GdkWindowPrivate*) window;
363 switch (private->window_type)
365 case GDK_WINDOW_TOPLEVEL:
366 case GDK_WINDOW_CHILD:
367 case GDK_WINDOW_DIALOG:
368 case GDK_WINDOW_TEMP:
369 if (!private->destroyed)
371 children = gdk_window_get_children (window);
376 temp_window = tmp->data;
379 temp_private = (GdkWindowPrivate*) temp_window;
381 gdk_window_internal_destroy (temp_window, FALSE);
384 g_list_free (children);
386 if (private->extension_events != 0)
387 gdk_input_window_destroy (window);
389 if(private->dnd_drag_data_numtypesavail > 0)
391 g_free (private->dnd_drag_data_typesavail);
392 private->dnd_drag_data_typesavail = NULL;
394 if(private->dnd_drop_data_numtypesavail > 0)
396 g_free (private->dnd_drop_data_typesavail);
397 private->dnd_drop_data_typesavail = NULL;
401 XDestroyWindow (private->xdisplay, private->xwindow);
402 private->destroyed = TRUE;
406 case GDK_WINDOW_ROOT:
407 g_error ("attempted to destroy root window");
410 case GDK_WINDOW_PIXMAP:
411 g_error ("called gdk_window_destroy on a pixmap (use gdk_pixmap_unref)");
416 /* Like internal_destroy, but also destroys the reference created by
420 gdk_window_destroy (GdkWindow *window)
422 gdk_window_internal_destroy (window, TRUE);
423 gdk_window_unref (window);
426 /* This function is called when the XWindow is really gone. */
429 gdk_window_destroy_notify (GdkWindow *window)
431 GdkWindowPrivate *private;
433 g_return_if_fail (window != NULL);
435 private = (GdkWindowPrivate*) window;
437 gdk_xid_table_remove (private->xwindow);
438 gdk_window_unref (window);
442 gdk_window_ref (GdkWindow *window)
444 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
445 g_return_val_if_fail (window != NULL, NULL);
447 private->ref_count += 1;
452 gdk_window_unref (GdkWindow *window)
454 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
455 g_return_if_fail (window != NULL);
457 private->ref_count -= 1;
458 if (private->ref_count == 0)
460 if (!private->destroyed)
461 g_warning ("losing last reference to undestroyed window\n");
467 gdk_window_show (GdkWindow *window)
469 GdkWindowPrivate *private;
471 g_return_if_fail (window != NULL);
473 private = (GdkWindowPrivate*) window;
474 if (!private->destroyed)
476 XRaiseWindow (private->xdisplay, private->xwindow);
477 XMapWindow (private->xdisplay, private->xwindow);
482 gdk_window_hide (GdkWindow *window)
484 GdkWindowPrivate *private;
486 g_return_if_fail (window != NULL);
488 private = (GdkWindowPrivate*) window;
489 if (!private->destroyed)
490 XUnmapWindow (private->xdisplay, private->xwindow);
494 gdk_window_withdraw (GdkWindow *window)
496 GdkWindowPrivate *private;
498 g_return_if_fail (window != NULL);
500 private = (GdkWindowPrivate*) window;
501 if (!private->destroyed)
502 XWithdrawWindow (private->xdisplay, private->xwindow, 0);
506 gdk_window_move (GdkWindow *window,
510 GdkWindowPrivate *private;
512 g_return_if_fail (window != NULL);
514 private = (GdkWindowPrivate*) window;
515 if (!private->destroyed)
517 XMoveWindow (private->xdisplay, private->xwindow, x, y);
519 if (private->window_type == GDK_WINDOW_CHILD)
528 gdk_window_resize (GdkWindow *window,
532 GdkWindowPrivate *private;
534 g_return_if_fail (window != NULL);
541 private = (GdkWindowPrivate*) window;
543 if (!private->destroyed &&
544 ((private->resize_count > 0) ||
545 (private->width != (guint16) width) ||
546 (private->height != (guint16) height)))
548 XResizeWindow (private->xdisplay, private->xwindow, width, height);
549 private->resize_count += 1;
551 if (private->window_type == GDK_WINDOW_CHILD)
553 private->width = width;
554 private->height = height;
560 gdk_window_move_resize (GdkWindow *window,
566 GdkWindowPrivate *private;
568 g_return_if_fail (window != NULL);
575 private = (GdkWindowPrivate*) window;
576 if (!private->destroyed)
578 XMoveResizeWindow (private->xdisplay, private->xwindow, x, y, width, height);
580 if (private->window_type == GDK_WINDOW_CHILD)
584 private->width = width;
585 private->height = height;
591 gdk_window_reparent (GdkWindow *window,
592 GdkWindow *new_parent,
596 GdkWindowPrivate *window_private;
597 GdkWindowPrivate *parent_private;
599 g_return_if_fail (window != NULL);
602 new_parent = (GdkWindow*) &gdk_root_parent;
604 window_private = (GdkWindowPrivate*) window;
605 parent_private = (GdkWindowPrivate*) new_parent;
607 if (!window_private->destroyed && !parent_private->destroyed)
608 XReparentWindow (window_private->xdisplay,
609 window_private->xwindow,
610 parent_private->xwindow,
615 gdk_window_clear (GdkWindow *window)
617 GdkWindowPrivate *private;
619 g_return_if_fail (window != NULL);
621 private = (GdkWindowPrivate*) window;
623 if (!private->destroyed)
624 XClearWindow (private->xdisplay, private->xwindow);
628 gdk_window_clear_area (GdkWindow *window,
634 GdkWindowPrivate *private;
636 g_return_if_fail (window != NULL);
638 private = (GdkWindowPrivate*) window;
640 if (!private->destroyed)
641 XClearArea (private->xdisplay, private->xwindow,
642 x, y, width, height, False);
646 gdk_window_clear_area_e (GdkWindow *window,
652 GdkWindowPrivate *private;
654 g_return_if_fail (window != NULL);
656 private = (GdkWindowPrivate*) window;
658 if (!private->destroyed)
659 XClearArea (private->xdisplay, private->xwindow,
660 x, y, width, height, True);
664 gdk_window_copy_area (GdkWindow *window,
668 GdkWindow *source_window,
674 GdkWindowPrivate *src_private;
675 GdkWindowPrivate *dest_private;
676 GdkGCPrivate *gc_private;
678 g_return_if_fail (window != NULL);
679 g_return_if_fail (gc != NULL);
681 if (source_window == NULL)
682 source_window = window;
684 src_private = (GdkWindowPrivate*) source_window;
685 dest_private = (GdkWindowPrivate*) window;
686 gc_private = (GdkGCPrivate*) gc;
688 if (!src_private->destroyed && !dest_private->destroyed)
690 XCopyArea (dest_private->xdisplay, src_private->xwindow, dest_private->xwindow,
699 gdk_window_raise (GdkWindow *window)
701 GdkWindowPrivate *private;
703 g_return_if_fail (window != NULL);
705 private = (GdkWindowPrivate*) window;
707 if (!private->destroyed)
708 XRaiseWindow (private->xdisplay, private->xwindow);
712 gdk_window_lower (GdkWindow *window)
714 GdkWindowPrivate *private;
716 g_return_if_fail (window != NULL);
718 private = (GdkWindowPrivate*) window;
720 if (!private->destroyed)
721 XLowerWindow (private->xdisplay, private->xwindow);
725 gdk_window_set_user_data (GdkWindow *window,
728 g_return_if_fail (window != NULL);
730 window->user_data = user_data;
734 gdk_window_set_hints (GdkWindow *window,
743 GdkWindowPrivate *private;
744 XSizeHints size_hints;
746 g_return_if_fail (window != NULL);
748 private = (GdkWindowPrivate*) window;
749 if (private->destroyed)
752 size_hints.flags = 0;
754 if (flags & GDK_HINT_POS)
756 size_hints.flags |= PPosition;
761 if (flags & GDK_HINT_MIN_SIZE)
763 size_hints.flags |= PMinSize;
764 size_hints.min_width = min_width;
765 size_hints.min_height = min_height;
768 if (flags & GDK_HINT_MAX_SIZE)
770 size_hints.flags |= PMaxSize;
771 size_hints.max_width = max_width;
772 size_hints.max_height = max_height;
776 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
780 gdk_window_set_title (GdkWindow *window,
783 GdkWindowPrivate *private;
785 g_return_if_fail (window != NULL);
787 private = (GdkWindowPrivate*) window;
788 if (!private->destroyed)
789 XmbSetWMProperties (private->xdisplay, private->xwindow,
790 title, title, NULL, 0, NULL, NULL, NULL);
794 gdk_window_set_background (GdkWindow *window,
797 GdkWindowPrivate *private;
799 g_return_if_fail (window != NULL);
801 private = (GdkWindowPrivate*) window;
802 if (!private->destroyed)
803 XSetWindowBackground (private->xdisplay, private->xwindow, color->pixel);
807 gdk_window_set_back_pixmap (GdkWindow *window,
809 gint parent_relative)
811 GdkWindowPrivate *window_private;
812 GdkPixmapPrivate *pixmap_private;
815 g_return_if_fail (window != NULL);
817 window_private = (GdkWindowPrivate*) window;
818 pixmap_private = (GdkPixmapPrivate*) pixmap;
821 xpixmap = pixmap_private->xwindow;
826 xpixmap = ParentRelative;
828 if (!window_private->destroyed)
829 XSetWindowBackgroundPixmap (window_private->xdisplay, window_private->xwindow, xpixmap);
833 gdk_window_set_cursor (GdkWindow *window,
836 GdkWindowPrivate *window_private;
837 GdkCursorPrivate *cursor_private;
840 g_return_if_fail (window != NULL);
842 window_private = (GdkWindowPrivate*) window;
843 cursor_private = (GdkCursorPrivate*) cursor;
848 xcursor = cursor_private->xcursor;
850 if (!window_private->destroyed)
851 XDefineCursor (window_private->xdisplay, window_private->xwindow, xcursor);
855 gdk_window_set_colormap (GdkWindow *window,
856 GdkColormap *colormap)
858 GdkWindowPrivate *window_private;
859 GdkColormapPrivate *colormap_private;
861 g_return_if_fail (window != NULL);
862 g_return_if_fail (colormap != NULL);
864 window_private = (GdkWindowPrivate*) window;
865 colormap_private = (GdkColormapPrivate*) colormap;
867 if (!window_private->destroyed)
869 XSetWindowColormap (window_private->xdisplay,
870 window_private->xwindow,
871 colormap_private->xcolormap);
873 if (window_private->window_type != GDK_WINDOW_TOPLEVEL)
874 gdk_window_add_colormap_windows (window);
879 gdk_window_get_user_data (GdkWindow *window,
882 g_return_if_fail (window != NULL);
884 *data = window->user_data;
888 gdk_window_get_geometry (GdkWindow *window,
895 GdkWindowPrivate *window_private;
905 window = (GdkWindow*) &gdk_root_parent;
907 window_private = (GdkWindowPrivate*) window;
909 if (!window_private->destroyed)
911 XGetGeometry (window_private->xdisplay, window_private->xwindow,
912 &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
928 gdk_window_get_position (GdkWindow *window,
932 GdkWindowPrivate *window_private;
934 g_return_if_fail (window != NULL);
936 window_private = (GdkWindowPrivate*) window;
939 *x = window_private->x;
941 *y = window_private->y;
945 gdk_window_get_size (GdkWindow *window,
949 GdkWindowPrivate *window_private;
951 g_return_if_fail (window != NULL);
953 window_private = (GdkWindowPrivate*) window;
956 *width = window_private->width;
958 *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;
1261 g_return_if_fail (window != NULL);
1263 window_private = (GdkWindowPrivate*) window;
1264 if (window_private->destroyed)
1269 GdkWindowPrivate *pixmap_private;
1271 pixmap_private = (GdkWindowPrivate*) mask;
1272 pixmap = (Pixmap) pixmap_private->xwindow;
1281 XShapeCombineMask (window_private->xdisplay,
1282 window_private->xwindow,
1290 gdk_dnd_drag_addwindow (GdkWindow *window)
1292 GdkWindowPrivate *window_private;
1294 g_return_if_fail (window != NULL);
1296 window_private = (GdkWindowPrivate *) window;
1297 if (window_private->destroyed)
1300 if (window_private->dnd_drag_enabled == 1 && gdk_dnd.drag_really == 0)
1302 gdk_dnd.drag_numwindows++;
1303 gdk_dnd.drag_startwindows = g_realloc (gdk_dnd.drag_startwindows,
1304 gdk_dnd.drag_numwindows
1305 * sizeof(GdkWindow *));
1306 gdk_dnd.drag_startwindows[gdk_dnd.drag_numwindows - 1] = window;
1307 window_private->dnd_drag_accepted = 0;
1310 g_warning ("dnd_really is 1 or drag is not enabled! can't addwindow\n");
1314 gdk_window_dnd_drag_set (GdkWindow *window,
1319 GdkWindowPrivate *window_private;
1322 g_return_if_fail (window != NULL);
1323 window_private = (GdkWindowPrivate *) window;
1324 if (window_private->destroyed)
1327 window_private->dnd_drag_enabled = drag_enable ? 1 : 0;
1331 g_return_if_fail(typelist != NULL);
1333 if (window_private->dnd_drag_data_numtypesavail > 3)
1335 window_private->dnd_drag_data_numtypesavail = numtypes;
1337 window_private->dnd_drag_data_typesavail =
1338 g_realloc (window_private->dnd_drag_data_typesavail,
1339 (numtypes + 1) * sizeof (GdkAtom));
1341 for (i = 0; i < numtypes; i++)
1343 /* Allow blanket use of ALL to get anything... */
1344 if (strcmp (typelist[i], "ALL"))
1345 window_private->dnd_drag_data_typesavail[i] =
1346 gdk_atom_intern (typelist[i], FALSE);
1348 window_private->dnd_drag_data_typesavail[i] = None;
1352 * set our extended type list if we need to
1355 gdk_property_change(window, gdk_dnd.gdk_XdeTypelist,
1356 XA_PRIMARY, 32, GDK_PROP_MODE_REPLACE,
1357 (guchar *)(window_private->dnd_drag_data_typesavail
1358 + (sizeof(GdkAtom) * 3)),
1359 (numtypes - 3) * sizeof(GdkAtom));
1361 gdk_property_delete (window, gdk_dnd.gdk_XdeTypelist);
1365 g_free (window_private->dnd_drag_data_typesavail);
1366 window_private->dnd_drag_data_typesavail = NULL;
1367 window_private->dnd_drag_data_numtypesavail = 0;
1372 gdk_window_dnd_drop_set (GdkWindow *window,
1376 guint8 destructive_op)
1378 GdkWindowPrivate *window_private;
1381 g_return_if_fail (window != NULL);
1382 window_private = (GdkWindowPrivate *) window;
1383 if (window_private->destroyed)
1386 window_private->dnd_drop_enabled = drop_enable ? 1 : 0;
1389 g_return_if_fail(typelist != NULL);
1391 window_private->dnd_drop_data_numtypesavail = numtypes;
1393 window_private->dnd_drop_data_typesavail =
1394 g_realloc (window_private->dnd_drop_data_typesavail,
1395 (numtypes + 1) * sizeof (GdkAtom));
1397 for (i = 0; i < numtypes; i++)
1398 window_private->dnd_drop_data_typesavail[i] =
1399 gdk_atom_intern (typelist[i], FALSE);
1401 window_private->dnd_drop_destructive_op = destructive_op;
1406 * This is used to reply to a GDK_DRAG_REQUEST event
1407 * (which may be generated by XdeRequest or a confirmed drop...
1410 gdk_window_dnd_data_set (GdkWindow *window,
1413 gulong data_numbytes)
1415 GdkWindowPrivate *window_private;
1417 GdkEventDropDataAvailable tmp_ev;
1420 g_return_if_fail (window != NULL);
1421 g_return_if_fail (event != NULL);
1422 g_return_if_fail (data != NULL);
1423 g_return_if_fail (data_numbytes > 0);
1424 g_return_if_fail (event->type == GDK_DRAG_REQUEST);
1426 window_private = (GdkWindowPrivate *) window;
1427 g_return_if_fail (window_private->dnd_drag_accepted != 0);
1428 if (window_private->destroyed)
1431 /* We set the property on our window... */
1432 gdk_property_change (window, window_private->dnd_drag_data_type,
1433 XA_PRIMARY, 8, GDK_PROP_MODE_REPLACE, data,
1435 tmp = gdk_atom_name(window_private->dnd_drag_data_type);
1437 g_print("DnD type %s on window %ld\n", tmp, window_private->xwindow);
1442 * Then we send the event to tell the receiving window that the
1445 tmp_ev.u.allflags = 0;
1446 tmp_ev.u.flags.protocol_version = DND_PROTOCOL_VERSION;
1447 tmp_ev.u.flags.isdrop = event->dragrequest.isdrop;
1449 sev.xclient.type = ClientMessage;
1450 sev.xclient.format = 32;
1451 sev.xclient.window = event->dragrequest.requestor;
1452 sev.xclient.message_type = gdk_dnd.gdk_XdeDataAvailable;
1453 sev.xclient.data.l[0] = window_private->xwindow;
1454 sev.xclient.data.l[1] = tmp_ev.u.allflags;
1455 sev.xclient.data.l[2] = window_private->dnd_drag_data_type;
1457 if (event->dragrequest.isdrop)
1458 sev.xclient.data.l[3] = event->dragrequest.drop_coords.x +
1459 (event->dragrequest.drop_coords.y << 16);
1461 sev.xclient.data.l[3] = 0;
1463 sev.xclient.data.l[4] = 0;
1465 XSendEvent (gdk_display, event->dragrequest.requestor, False,
1470 gdk_window_add_filter (GdkWindow *window,
1471 GdkFilterFunc function,
1474 GdkWindowPrivate *private;
1476 GdkEventFilter *filter;
1478 private = (GdkWindowPrivate*) window;
1479 if (private && private->destroyed)
1483 tmp_list = private->filters;
1485 tmp_list = default_filters;
1489 filter = (GdkEventFilter *)tmp_list->data;
1490 if ((filter->function == function) && (filter->data == data))
1492 tmp_list = tmp_list->next;
1495 filter = g_new (GdkEventFilter, 1);
1496 filter->function = function;
1497 filter->data = data;
1500 private->filters = g_list_append (private->filters, filter);
1502 default_filters = g_list_append (default_filters, filter);
1506 gdk_window_remove_filter (GdkWindow *window,
1507 GdkFilterFunc function,
1510 GdkWindowPrivate *private;
1512 GdkEventFilter *filter;
1514 private = (GdkWindowPrivate*) window;
1517 tmp_list = private->filters;
1519 tmp_list = default_filters;
1523 filter = (GdkEventFilter *)tmp_list->data;
1524 tmp_list = tmp_list->next;
1526 if ((filter->function == function) && (filter->data == data))
1529 private->filters = g_list_remove_link (private->filters, tmp_list);
1531 default_filters = g_list_remove_link (default_filters, tmp_list);
1532 g_list_free_1 (tmp_list);
1541 gdk_window_set_override_redirect(GdkWindow *window,
1542 gboolean override_redirect)
1544 GdkWindowPrivate *private;
1545 XSetWindowAttributes attr;
1547 g_return_if_fail (window != NULL);
1548 private = (GdkWindowPrivate*) window;
1549 if (private->destroyed)
1552 attr.override_redirect = (override_redirect == FALSE)?False:True;
1553 XChangeWindowAttributes(gdk_display,
1554 ((GdkWindowPrivate *)window)->xwindow,
1560 gdk_window_set_icon (GdkWindow *window,
1561 GdkWindow *icon_window,
1566 GdkWindowPrivate *window_private;
1567 GdkWindowPrivate *private;
1569 g_return_if_fail (window != NULL);
1570 window_private = (GdkWindowPrivate*) window;
1571 if (window_private->destroyed)
1576 if (icon_window != NULL)
1578 private = (GdkWindowPrivate *)icon_window;
1579 wm_hints.flags |= IconWindowHint;
1580 wm_hints.icon_window = private->xwindow;
1585 private = (GdkWindowPrivate *)pixmap;
1586 wm_hints.flags |= IconPixmapHint;
1587 wm_hints.icon_pixmap = private->xwindow;
1592 private = (GdkWindowPrivate *)mask;
1593 wm_hints.flags |= IconMaskHint;
1594 wm_hints.icon_mask = private->xwindow;
1597 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1601 gdk_window_set_icon_name (GdkWindow *window,
1604 GdkWindowPrivate *window_private;
1605 XTextProperty property;
1608 g_return_if_fail (window != NULL);
1609 window_private = (GdkWindowPrivate*) window;
1610 if (window_private->destroyed)
1612 res = XmbTextListToTextProperty (window_private->xdisplay,
1613 &name, 1, XStdICCTextStyle,
1617 g_warning("Error converting icon name to text property: %d\n", res);
1621 XSetWMIconName (window_private->xdisplay, window_private->xwindow,
1624 XFree(property.value);
1628 gdk_window_set_group (GdkWindow *window,
1632 GdkWindowPrivate *window_private;
1633 GdkWindowPrivate *private;
1635 g_return_if_fail (window != NULL);
1636 g_return_if_fail (leader != NULL);
1637 window_private = (GdkWindowPrivate*) window;
1638 if (window_private->destroyed)
1641 private = (GdkWindowPrivate *)leader;
1642 wm_hints.flags |= WindowGroupHint;
1643 wm_hints.window_group = private->xwindow;
1645 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1649 gdk_window_set_mwm_hints (GdkWindow *window,
1650 MotifWmHints *new_hints)
1652 static Atom hints_atom = None;
1653 MotifWmHints *hints;
1659 GdkWindowPrivate *window_private;
1661 g_return_if_fail (window != NULL);
1662 window_private = (GdkWindowPrivate*) window;
1663 if (window_private->destroyed)
1667 hints_atom = XInternAtom (window_private->xdisplay,
1668 _XA_MOTIF_WM_HINTS, FALSE);
1670 XGetWindowProperty (window_private->xdisplay, window_private->xwindow,
1671 hints_atom, 0, sizeof(MotifWmHints)/4,
1672 False, AnyPropertyType, &type, &format, &nitems,
1673 &bytes_after, (guchar **)&hints);
1679 if (new_hints->flags & MWM_HINTS_FUNCTIONS)
1681 hints->flags |= MWM_HINTS_FUNCTIONS;
1682 hints->functions = new_hints->functions;
1684 if (new_hints->flags & MWM_HINTS_DECORATIONS)
1686 hints->flags |= MWM_HINTS_DECORATIONS;
1687 hints->decorations = new_hints->decorations;
1691 XChangeProperty (window_private->xdisplay, window_private->xwindow,
1692 hints_atom, hints_atom, 32, PropModeReplace,
1693 (guchar *)hints, sizeof(MotifWmHints)/4);
1695 if (hints != new_hints)
1700 gdk_window_set_decorations (GdkWindow *window,
1701 GdkWMDecoration decorations)
1705 hints.flags = MWM_HINTS_DECORATIONS;
1706 hints.decorations = decorations;
1708 gdk_window_set_mwm_hints (window, &hints);
1712 gdk_window_set_functions (GdkWindow *window,
1713 GdkWMFunction functions)
1717 hints.flags = MWM_HINTS_FUNCTIONS;
1718 hints.functions = functions;
1720 gdk_window_set_mwm_hints (window, &hints);