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;
76 gdk_window_new (GdkWindow *parent,
77 GdkWindowAttr *attributes,
81 GdkWindowPrivate *private;
82 GdkWindowPrivate *parent_private;
84 GdkColormap *colormap;
85 Display *parent_display;
88 XSetWindowAttributes xattributes;
89 long xattributes_mask;
90 XSizeHints size_hints;
92 XClassHint *class_hint;
98 g_return_val_if_fail (attributes != NULL, NULL);
101 parent = (GdkWindow*) &gdk_root_parent;
103 parent_private = (GdkWindowPrivate*) parent;
104 xparent = parent_private->xwindow;
105 parent_display = parent_private->xdisplay;
107 private = g_new (GdkWindowPrivate, 1);
108 window = (GdkWindow*) private;
110 private->parent = parent;
111 private->xdisplay = parent_display;
112 private->destroyed = FALSE;
113 private->resize_count = 0;
114 private->ref_count = 1;
115 xattributes_mask = 0;
117 if (attributes_mask & GDK_WA_X)
122 if (attributes_mask & GDK_WA_Y)
129 private->width = (attributes->width > 1) ? (attributes->width) : (1);
130 private->height = (attributes->height > 1) ? (attributes->height) : (1);
131 private->window_type = attributes->window_type;
132 private->extension_events = FALSE;
133 private->dnd_drag_data_type = None;
134 private->dnd_drag_data_typesavail =
135 private->dnd_drop_data_typesavail = NULL;
136 private->dnd_drop_enabled = private->dnd_drag_enabled =
137 private->dnd_drag_accepted = private->dnd_drag_datashow =
138 private->dnd_drop_data_numtypesavail =
139 private->dnd_drag_data_numtypesavail = 0;
140 private->dnd_drag_eventmask = private->dnd_drag_savedeventmask = 0;
142 private->filters = NULL;
144 window->user_data = NULL;
146 if (attributes_mask & GDK_WA_VISUAL)
147 visual = attributes->visual;
149 visual = gdk_visual_get_system ();
150 xvisual = ((GdkVisualPrivate*) visual)->xvisual;
152 xattributes.event_mask = StructureNotifyMask;
153 for (i = 0; i < nevent_masks; i++)
155 if (attributes->event_mask & (1 << (i + 1)))
156 xattributes.event_mask |= event_mask_table[i];
159 if (xattributes.event_mask)
160 xattributes_mask |= CWEventMask;
162 if(attributes_mask & GDK_WA_NOREDIR) {
163 xattributes.override_redirect =
164 (attributes->override_redirect == FALSE)?False:True;
165 xattributes_mask |= CWOverrideRedirect;
167 xattributes.override_redirect = False;
169 if (attributes->wclass == GDK_INPUT_OUTPUT)
172 depth = visual->depth;
174 if (attributes_mask & GDK_WA_COLORMAP)
175 colormap = attributes->colormap;
177 colormap = gdk_colormap_get_system ();
179 xattributes.background_pixel = BlackPixel (gdk_display, gdk_screen);
180 xattributes.border_pixel = BlackPixel (gdk_display, gdk_screen);
181 xattributes_mask |= CWBorderPixel | CWBackPixel;
183 switch (private->window_type)
185 case GDK_WINDOW_TOPLEVEL:
186 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
187 xattributes_mask |= CWColormap;
189 xparent = gdk_root_window;
192 case GDK_WINDOW_CHILD:
193 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
194 xattributes_mask |= CWColormap;
197 case GDK_WINDOW_DIALOG:
198 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
199 xattributes_mask |= CWColormap;
201 xparent = gdk_root_window;
204 case GDK_WINDOW_TEMP:
205 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
206 xattributes_mask |= CWColormap;
208 xparent = gdk_root_window;
210 xattributes.save_under = True;
211 xattributes.override_redirect = True;
212 xattributes.cursor = None;
213 xattributes_mask |= CWSaveUnder | CWOverrideRedirect;
215 case GDK_WINDOW_ROOT:
216 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
218 case GDK_WINDOW_PIXMAP:
219 g_error ("cannot make windows of type GDK_WINDOW_PIXMAP (use gdk_pixmap_new)");
230 private->xwindow = XCreateWindow (private->xdisplay, xparent,
231 x, y, private->width, private->height,
232 0, depth, class, xvisual,
233 xattributes_mask, &xattributes);
234 gdk_window_ref (window);
235 gdk_xid_table_insert (&private->xwindow, window);
237 switch (private->window_type)
239 case GDK_WINDOW_DIALOG:
240 XSetTransientForHint (private->xdisplay, private->xwindow, xparent);
241 case GDK_WINDOW_TOPLEVEL:
242 case GDK_WINDOW_TEMP:
243 XSetWMProtocols (private->xdisplay, private->xwindow, gdk_wm_window_protocols, 2);
245 case GDK_WINDOW_CHILD:
246 if ((attributes->wclass == GDK_INPUT_OUTPUT) &&
247 (colormap != gdk_colormap_get_system ()) &&
248 (colormap != gdk_window_get_colormap (gdk_window_get_toplevel (window))))
250 g_print ("adding colormap window\n");
251 gdk_window_add_colormap_windows (window);
258 size_hints.flags = PSize | PBaseSize;
259 size_hints.width = private->width;
260 size_hints.height = private->height;
261 size_hints.base_width = private->width;
262 size_hints.base_height = private->height;
264 wm_hints.flags = InputHint | StateHint | WindowGroupHint;
265 wm_hints.window_group = gdk_leader_window;
266 wm_hints.input = True;
267 wm_hints.initial_state = NormalState;
269 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
270 XSetWMHints (private->xdisplay, private->xwindow, &wm_hints);
272 if (attributes_mask & GDK_WA_TITLE)
273 title = attributes->title;
275 title = gdk_progname;
277 XmbSetWMProperties (private->xdisplay, private->xwindow,
282 if (attributes_mask & GDK_WA_WMCLASS)
284 class_hint = XAllocClassHint ();
285 class_hint->res_name = attributes->wmclass_name;
286 class_hint->res_class = attributes->wmclass_class;
287 XSetClassHint (private->xdisplay, private->xwindow, class_hint);
291 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
292 (attributes->cursor) :
299 gdk_window_foreign_new (guint32 anid)
302 GdkWindowPrivate *private;
303 XWindowAttributes attrs;
305 private = g_new (GdkWindowPrivate, 1);
306 window = (GdkWindow*) private;
308 XGetWindowAttributes (gdk_display, anid, &attrs);
310 private->parent = NULL;
311 private->xwindow = anid;
312 private->xdisplay = gdk_display;
313 private->x = attrs.x;
314 private->y = attrs.y;
315 private->width = attrs.width;
316 private->height = attrs.height;
317 private->resize_count = 0;
318 private->ref_count = 1;
319 if (anid == attrs.root)
320 private->window_type = GDK_WINDOW_ROOT;
322 private->window_type = GDK_WINDOW_TOPLEVEL;
323 /* the above is probably wrong, but it may not be worth the extra
324 X call to get it right */
326 private->destroyed = FALSE;
327 private->extension_events = 0;
328 private->filters = NULL;
330 window->user_data = NULL;
332 gdk_window_ref (window);
333 gdk_xid_table_insert (&private->xwindow, window);
338 /* Call this function when you want a window and all its children to
339 disappear. When xdestroy is true, a request to destroy the XWindow
340 is sent out. When it is false, it is assumed that the XWindow has
341 been or will be destroyed by destroying some ancestor of this
345 gdk_window_internal_destroy (GdkWindow *window, int xdestroy)
347 GdkWindowPrivate *private;
348 GdkWindowPrivate *temp_private;
349 GdkWindow *temp_window;
353 g_return_if_fail (window != NULL);
355 private = (GdkWindowPrivate*) window;
357 switch (private->window_type)
359 case GDK_WINDOW_TOPLEVEL:
360 case GDK_WINDOW_CHILD:
361 case GDK_WINDOW_DIALOG:
362 case GDK_WINDOW_TEMP:
363 if (!private->destroyed)
365 children = gdk_window_get_children (window);
370 temp_window = tmp->data;
373 temp_private = (GdkWindowPrivate*) temp_window;
375 gdk_window_internal_destroy (temp_window, FALSE);
378 g_list_free (children);
380 if(private->dnd_drag_data_numtypesavail > 0)
382 g_free (private->dnd_drag_data_typesavail);
383 private->dnd_drag_data_typesavail = NULL;
385 if(private->dnd_drop_data_numtypesavail > 0)
387 g_free (private->dnd_drop_data_typesavail);
388 private->dnd_drop_data_typesavail = NULL;
392 XDestroyWindow (private->xdisplay, private->xwindow);
393 private->destroyed = TRUE;
397 case GDK_WINDOW_ROOT:
398 g_error ("attempted to destroy root window");
401 case GDK_WINDOW_PIXMAP:
402 g_error ("called gdk_window_destroy on a pixmap (use gdk_pixmap_unref)");
407 /* Like internal_destroy, but also destroys the reference created by
411 gdk_window_destroy (GdkWindow *window)
413 gdk_window_internal_destroy (window, TRUE);
414 gdk_window_unref (window);
417 /* This function is called when the XWindow is really gone. */
420 gdk_window_destroy_notify (GdkWindow *window)
422 GdkWindowPrivate *private;
424 g_return_if_fail (window != NULL);
426 private = (GdkWindowPrivate*) window;
428 if (private->extension_events != 0)
429 gdk_input_window_destroy (window);
431 gdk_xid_table_remove (private->xwindow);
432 gdk_window_unref (window);
436 gdk_window_ref (GdkWindow *window)
438 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
439 g_return_val_if_fail (window != NULL, NULL);
441 private->ref_count += 1;
446 gdk_window_unref (GdkWindow *window)
448 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
449 g_return_if_fail (window != NULL);
451 private->ref_count -= 1;
452 if (private->ref_count == 0)
454 if (!private->destroyed)
455 g_warning ("losing last reference to undestroyed window\n");
461 gdk_window_show (GdkWindow *window)
463 GdkWindowPrivate *private;
465 g_return_if_fail (window != NULL);
467 private = (GdkWindowPrivate*) window;
468 if (!private->destroyed)
470 XRaiseWindow (private->xdisplay, private->xwindow);
471 XMapWindow (private->xdisplay, private->xwindow);
476 gdk_window_hide (GdkWindow *window)
478 GdkWindowPrivate *private;
480 g_return_if_fail (window != NULL);
482 private = (GdkWindowPrivate*) window;
483 if (!private->destroyed)
484 XUnmapWindow (private->xdisplay, private->xwindow);
488 gdk_window_withdraw (GdkWindow *window)
490 GdkWindowPrivate *private;
492 g_return_if_fail (window != NULL);
494 private = (GdkWindowPrivate*) window;
495 if (!private->destroyed)
496 XWithdrawWindow (private->xdisplay, private->xwindow, 0);
500 gdk_window_move (GdkWindow *window,
504 GdkWindowPrivate *private;
506 g_return_if_fail (window != NULL);
508 private = (GdkWindowPrivate*) window;
509 XMoveWindow (private->xdisplay, private->xwindow, x, y);
511 if (private->window_type == GDK_WINDOW_CHILD)
519 gdk_window_resize (GdkWindow *window,
523 GdkWindowPrivate *private;
525 g_return_if_fail (window != NULL);
532 private = (GdkWindowPrivate*) window;
534 if (!private->destroyed &&
535 ((private->resize_count > 0) ||
536 (private->width != (guint16) width) ||
537 (private->height != (guint16) height)))
539 XResizeWindow (private->xdisplay, private->xwindow, width, height);
540 private->resize_count += 1;
542 if (private->window_type == GDK_WINDOW_CHILD)
544 private->width = width;
545 private->height = height;
551 gdk_window_move_resize (GdkWindow *window,
557 GdkWindowPrivate *private;
559 g_return_if_fail (window != NULL);
566 private = (GdkWindowPrivate*) window;
567 XMoveResizeWindow (private->xdisplay, private->xwindow, x, y, width, height);
569 if (!private->destroyed &&
570 (private->window_type == GDK_WINDOW_CHILD))
574 private->width = width;
575 private->height = height;
580 gdk_window_reparent (GdkWindow *window,
581 GdkWindow *new_parent,
585 GdkWindowPrivate *window_private;
586 GdkWindowPrivate *parent_private;
588 g_return_if_fail (window != NULL);
591 new_parent = (GdkWindow*) &gdk_root_parent;
593 window_private = (GdkWindowPrivate*) window;
594 parent_private = (GdkWindowPrivate*) new_parent;
596 XReparentWindow (window_private->xdisplay,
597 window_private->xwindow,
598 parent_private->xwindow,
603 gdk_window_clear (GdkWindow *window)
605 GdkWindowPrivate *private;
607 g_return_if_fail (window != NULL);
609 private = (GdkWindowPrivate*) window;
611 XClearWindow (private->xdisplay, private->xwindow);
615 gdk_window_clear_area (GdkWindow *window,
621 GdkWindowPrivate *private;
623 g_return_if_fail (window != NULL);
625 private = (GdkWindowPrivate*) window;
627 if (!private->destroyed)
628 XClearArea (private->xdisplay, private->xwindow,
629 x, y, width, height, False);
633 gdk_window_clear_area_e (GdkWindow *window,
639 GdkWindowPrivate *private;
641 g_return_if_fail (window != NULL);
643 private = (GdkWindowPrivate*) window;
645 if (!private->destroyed)
646 XClearArea (private->xdisplay, private->xwindow,
647 x, y, width, height, True);
651 gdk_window_copy_area (GdkWindow *window,
655 GdkWindow *source_window,
661 GdkWindowPrivate *src_private;
662 GdkWindowPrivate *dest_private;
663 GdkGCPrivate *gc_private;
665 g_return_if_fail (window != NULL);
666 g_return_if_fail (gc != NULL);
668 if (source_window == NULL)
669 source_window = window;
671 src_private = (GdkWindowPrivate*) source_window;
672 dest_private = (GdkWindowPrivate*) window;
673 gc_private = (GdkGCPrivate*) gc;
675 if (!src_private->destroyed && !dest_private->destroyed)
677 XCopyArea (dest_private->xdisplay, src_private->xwindow, dest_private->xwindow,
686 gdk_window_raise (GdkWindow *window)
688 GdkWindowPrivate *private;
690 g_return_if_fail (window != NULL);
692 private = (GdkWindowPrivate*) window;
694 if (!private->destroyed)
695 XRaiseWindow (private->xdisplay, private->xwindow);
699 gdk_window_lower (GdkWindow *window)
701 GdkWindowPrivate *private;
703 g_return_if_fail (window != NULL);
705 private = (GdkWindowPrivate*) window;
707 if (!private->destroyed)
708 XLowerWindow (private->xdisplay, private->xwindow);
712 gdk_window_set_user_data (GdkWindow *window,
715 g_return_if_fail (window != NULL);
717 window->user_data = user_data;
721 gdk_window_set_hints (GdkWindow *window,
730 GdkWindowPrivate *private;
731 XSizeHints size_hints;
733 g_return_if_fail (window != NULL);
735 private = (GdkWindowPrivate*) window;
736 size_hints.flags = 0;
738 if (flags & GDK_HINT_POS)
740 size_hints.flags |= PPosition;
745 if (flags & GDK_HINT_MIN_SIZE)
747 size_hints.flags |= PMinSize;
748 size_hints.min_width = min_width;
749 size_hints.min_height = min_height;
752 if (flags & GDK_HINT_MAX_SIZE)
754 size_hints.flags |= PMaxSize;
755 size_hints.max_width = max_width;
756 size_hints.max_height = max_height;
760 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
764 gdk_window_set_title (GdkWindow *window,
767 GdkWindowPrivate *private;
769 g_return_if_fail (window != NULL);
771 private = (GdkWindowPrivate*) window;
772 XmbSetWMProperties (private->xdisplay, private->xwindow,
773 title, title, NULL, 0, NULL, NULL, NULL);
777 gdk_window_set_background (GdkWindow *window,
780 GdkWindowPrivate *private;
782 g_return_if_fail (window != NULL);
784 private = (GdkWindowPrivate*) window;
785 XSetWindowBackground (private->xdisplay, private->xwindow, color->pixel);
789 gdk_window_set_back_pixmap (GdkWindow *window,
791 gint parent_relative)
793 GdkWindowPrivate *window_private;
794 GdkPixmapPrivate *pixmap_private;
797 g_return_if_fail (window != NULL);
799 window_private = (GdkWindowPrivate*) window;
800 pixmap_private = (GdkPixmapPrivate*) pixmap;
803 xpixmap = pixmap_private->xwindow;
808 xpixmap = ParentRelative;
810 XSetWindowBackgroundPixmap (window_private->xdisplay, window_private->xwindow, xpixmap);
814 gdk_window_set_cursor (GdkWindow *window,
817 GdkWindowPrivate *window_private;
818 GdkCursorPrivate *cursor_private;
821 g_return_if_fail (window != NULL);
823 window_private = (GdkWindowPrivate*) window;
824 cursor_private = (GdkCursorPrivate*) cursor;
829 xcursor = cursor_private->xcursor;
831 XDefineCursor (window_private->xdisplay, window_private->xwindow, xcursor);
835 gdk_window_set_colormap (GdkWindow *window,
836 GdkColormap *colormap)
838 GdkWindowPrivate *window_private;
839 GdkColormapPrivate *colormap_private;
841 g_return_if_fail (window != NULL);
842 g_return_if_fail (colormap != NULL);
844 window_private = (GdkWindowPrivate*) window;
845 colormap_private = (GdkColormapPrivate*) colormap;
847 XSetWindowColormap (window_private->xdisplay,
848 window_private->xwindow,
849 colormap_private->xcolormap);
851 if (window_private->window_type != GDK_WINDOW_TOPLEVEL)
852 gdk_window_add_colormap_windows (window);
856 gdk_window_get_user_data (GdkWindow *window,
859 g_return_if_fail (window != NULL);
861 *data = window->user_data;
865 gdk_window_get_geometry (GdkWindow *window,
872 GdkWindowPrivate *window_private;
882 window = (GdkWindow*) &gdk_root_parent;
884 window_private = (GdkWindowPrivate*) window;
886 XGetGeometry (window_private->xdisplay, window_private->xwindow,
887 &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
902 gdk_window_get_position (GdkWindow *window,
906 GdkWindowPrivate *window_private;
908 g_return_if_fail (window != NULL);
910 window_private = (GdkWindowPrivate*) window;
913 *x = window_private->x;
915 *y = window_private->y;
919 gdk_window_get_size (GdkWindow *window,
923 GdkWindowPrivate *window_private;
925 g_return_if_fail (window != NULL);
927 window_private = (GdkWindowPrivate*) window;
930 *width = window_private->width;
932 *height = window_private->height;
937 gdk_window_get_visual (GdkWindow *window)
939 GdkWindowPrivate *window_private;
940 XWindowAttributes window_attributes;
942 g_return_val_if_fail (window != NULL, NULL);
944 window_private = (GdkWindowPrivate*) window;
945 while (window_private && (window_private->window_type == GDK_WINDOW_PIXMAP))
946 window_private = (GdkWindowPrivate*) window_private->parent;
950 XGetWindowAttributes (window_private->xdisplay,
951 window_private->xwindow,
954 return gdk_visual_lookup (window_attributes.visual);
961 gdk_window_get_colormap (GdkWindow *window)
963 GdkWindowPrivate *window_private;
964 XWindowAttributes window_attributes;
966 g_return_val_if_fail (window != NULL, NULL);
968 window_private = (GdkWindowPrivate*) window;
970 XGetWindowAttributes (window_private->xdisplay,
971 window_private->xwindow,
974 return gdk_colormap_lookup (window_attributes.colormap);
978 gdk_window_get_type (GdkWindow *window)
980 GdkWindowPrivate *window_private;
982 g_return_val_if_fail (window != NULL, (GdkWindowType) -1);
984 window_private = (GdkWindowPrivate*) window;
985 return window_private->window_type;
989 gdk_window_get_origin (GdkWindow *window,
993 GdkWindowPrivate *private;
998 g_return_val_if_fail (window != NULL, 0);
1000 private = (GdkWindowPrivate*) window;
1002 return_val = XTranslateCoordinates (private->xdisplay,
1017 gdk_window_get_pointer (GdkWindow *window,
1020 GdkModifierType *mask)
1022 GdkWindowPrivate *private;
1023 GdkWindow *return_val;
1031 window = (GdkWindow*) &gdk_root_parent;
1033 private = (GdkWindowPrivate*) window;
1036 if (XQueryPointer (private->xdisplay, private->xwindow, &root, &child,
1037 &rootx, &rooty, &winx, &winy, &xmask))
1041 if (mask) *mask = xmask;
1044 return_val = gdk_window_lookup (child);
1051 gdk_window_get_parent (GdkWindow *window)
1053 g_return_val_if_fail (window != NULL, NULL);
1055 return ((GdkWindowPrivate*) window)->parent;
1059 gdk_window_get_toplevel (GdkWindow *window)
1061 GdkWindowPrivate *private;
1063 g_return_val_if_fail (window != NULL, NULL);
1065 private = (GdkWindowPrivate*) window;
1067 while (private->window_type == GDK_WINDOW_CHILD)
1069 window = ((GdkWindowPrivate*) window)->parent;
1070 private = (GdkWindowPrivate*) window;
1077 gdk_window_get_children (GdkWindow *window)
1079 GdkWindowPrivate *private;
1085 unsigned int nchildren;
1088 g_return_val_if_fail (window != NULL, NULL);
1090 private = (GdkWindowPrivate*) window;
1092 XQueryTree (private->xdisplay, private->xwindow,
1093 &root, &parent, &xchildren, &nchildren);
1099 for (i = 0; i < nchildren; i++)
1101 child = gdk_window_lookup (xchildren[i]);
1103 children = g_list_prepend (children, child);
1113 gdk_window_get_events (GdkWindow *window)
1115 XWindowAttributes attrs;
1116 GdkEventMask event_mask;
1119 XGetWindowAttributes (gdk_display, ((GdkWindowPrivate *)window)->xwindow,
1123 for (i = 0; i < nevent_masks; i++)
1125 if (attrs.your_event_mask & event_mask_table[i])
1126 event_mask |= 1 << (i + 1);
1133 gdk_window_set_events (GdkWindow *window,
1134 GdkEventMask event_mask)
1139 xevent_mask = StructureNotifyMask;
1140 for (i = 0; i < nevent_masks; i++)
1142 if (event_mask & (1 << (i + 1)))
1143 xevent_mask |= event_mask_table[i];
1146 XSelectInput (gdk_display, ((GdkWindowPrivate *)window)->xwindow,
1151 gdk_window_add_colormap_windows (GdkWindow *window)
1153 GdkWindow *toplevel;
1154 GdkWindowPrivate *toplevel_private;
1155 GdkWindowPrivate *window_private;
1156 Window *old_windows;
1157 Window *new_windows;
1160 g_return_if_fail (window != NULL);
1162 toplevel = gdk_window_get_toplevel (window);
1163 toplevel_private = (GdkWindowPrivate*) toplevel;
1164 window_private = (GdkWindowPrivate*) window;
1166 if (!XGetWMColormapWindows (toplevel_private->xdisplay,
1167 toplevel_private->xwindow,
1168 &old_windows, &count))
1174 for (i = 0; i < count; i++)
1175 if (old_windows[i] == window_private->xwindow)
1178 new_windows = g_new (Window, count + 1);
1180 for (i = 0; i < count; i++)
1181 new_windows[i] = old_windows[i];
1182 new_windows[count] = window_private->xwindow;
1184 XSetWMColormapWindows (toplevel_private->xdisplay,
1185 toplevel_private->xwindow,
1186 new_windows, count + 1);
1188 g_free (new_windows);
1190 XFree (old_windows);
1194 * This needs the X11 shape extension.
1195 * If not available, simply remove the call to
1196 * XShapeCombineMask. Shaped windows will look
1197 * ugly, but programs still work. Stefan Wille
1200 gdk_window_shape_combine_mask (GdkWindow *window,
1204 GdkWindowPrivate *window_private;
1205 GdkWindowPrivate *pixmap_private;
1207 g_return_if_fail (window != NULL);
1208 g_return_if_fail (mask != NULL);
1210 window_private = (GdkWindowPrivate*) window;
1211 pixmap_private = (GdkWindowPrivate*) mask;
1213 XShapeCombineMask (window_private->xdisplay,
1214 window_private->xwindow,
1217 (Pixmap)pixmap_private->xwindow,
1222 gdk_dnd_drag_addwindow (GdkWindow *window)
1224 GdkWindowPrivate *window_private;
1226 g_return_if_fail (window != NULL);
1228 window_private = (GdkWindowPrivate *) window;
1230 if (window_private->dnd_drag_enabled == 1 && gdk_dnd.drag_really == 0)
1232 gdk_dnd.drag_numwindows++;
1233 gdk_dnd.drag_startwindows = g_realloc (gdk_dnd.drag_startwindows,
1234 gdk_dnd.drag_numwindows
1235 * sizeof(GdkWindow *));
1236 gdk_dnd.drag_startwindows[gdk_dnd.drag_numwindows - 1] = window;
1237 window_private->dnd_drag_accepted = 0;
1240 g_warning ("dnd_really is 1 or drag is not enabled! can't addwindow\n");
1244 gdk_window_dnd_drag_set (GdkWindow *window,
1249 GdkWindowPrivate *window_private;
1252 g_return_if_fail (window != NULL);
1253 window_private = (GdkWindowPrivate *) window;
1255 window_private->dnd_drag_enabled = drag_enable ? 1 : 0;
1259 g_return_if_fail(typelist != NULL);
1261 if (window_private->dnd_drag_data_numtypesavail > 3)
1263 window_private->dnd_drag_data_numtypesavail = numtypes;
1265 window_private->dnd_drag_data_typesavail =
1266 g_realloc (window_private->dnd_drag_data_typesavail,
1267 (numtypes + 1) * sizeof (GdkAtom));
1269 for (i = 0; i < numtypes; i++)
1271 /* Allow blanket use of ALL to get anything... */
1272 if (strcmp (typelist[i], "ALL"))
1273 window_private->dnd_drag_data_typesavail[i] =
1274 gdk_atom_intern (typelist[i], FALSE);
1276 window_private->dnd_drag_data_typesavail[i] = None;
1280 * set our extended type list if we need to
1283 gdk_property_change(window, gdk_dnd.gdk_XdeTypelist,
1284 XA_PRIMARY, 32, GDK_PROP_MODE_REPLACE,
1285 (guchar *)(window_private->dnd_drag_data_typesavail
1286 + (sizeof(GdkAtom) * 3)),
1287 (numtypes - 3) * sizeof(GdkAtom));
1289 gdk_property_delete (window, gdk_dnd.gdk_XdeTypelist);
1293 free (window_private->dnd_drag_data_typesavail);
1294 window_private->dnd_drag_data_typesavail = NULL;
1295 window_private->dnd_drag_data_numtypesavail = 0;
1300 gdk_window_dnd_drop_set (GdkWindow *window,
1304 guint8 destructive_op)
1306 GdkWindowPrivate *window_private;
1309 g_return_if_fail (window != NULL);
1311 window_private = (GdkWindowPrivate *) window;
1313 window_private->dnd_drop_enabled = drop_enable ? 1 : 0;
1316 g_return_if_fail(typelist != NULL);
1318 window_private->dnd_drop_data_numtypesavail = numtypes;
1320 window_private->dnd_drop_data_typesavail =
1321 g_realloc (window_private->dnd_drop_data_typesavail,
1322 (numtypes + 1) * sizeof (GdkAtom));
1324 for (i = 0; i < numtypes; i++)
1325 window_private->dnd_drop_data_typesavail[i] =
1326 gdk_atom_intern (typelist[i], FALSE);
1328 window_private->dnd_drop_destructive_op = destructive_op;
1333 * This is used to reply to a GDK_DRAG_REQUEST event
1334 * (which may be generated by XdeRequest or a confirmed drop...
1337 gdk_window_dnd_data_set (GdkWindow *window,
1340 gulong data_numbytes)
1342 GdkWindowPrivate *window_private;
1344 GdkEventDropDataAvailable tmp_ev;
1347 g_return_if_fail (window != NULL);
1348 g_return_if_fail (event != NULL);
1349 g_return_if_fail (data != NULL);
1350 g_return_if_fail (data_numbytes > 0);
1351 g_return_if_fail (event->type == GDK_DRAG_REQUEST);
1353 g_free (event->dragrequest.data_type);
1354 event->dragrequest.data_type = NULL;
1356 window_private = (GdkWindowPrivate *) window;
1357 g_return_if_fail (window_private->dnd_drag_accepted != 0);
1359 /* We set the property on our window... */
1360 gdk_property_change (window, window_private->dnd_drag_data_type,
1361 XA_PRIMARY, 8, GDK_PROP_MODE_REPLACE, data,
1363 tmp = gdk_atom_name(window_private->dnd_drag_data_type);
1365 g_print("DnD type %s on window %ld\n", tmp, window_private->xwindow);
1370 * Then we send the event to tell the receiving window that the
1373 tmp_ev.u.allflags = 0;
1374 tmp_ev.u.flags.protocol_version = DND_PROTOCOL_VERSION;
1375 tmp_ev.u.flags.isdrop = event->dragrequest.isdrop;
1377 sev.xclient.type = ClientMessage;
1378 sev.xclient.format = 32;
1379 sev.xclient.window = event->dragrequest.requestor;
1380 sev.xclient.message_type = gdk_dnd.gdk_XdeDataAvailable;
1381 sev.xclient.data.l[0] = window_private->xwindow;
1382 sev.xclient.data.l[1] = tmp_ev.u.allflags;
1383 sev.xclient.data.l[2] = window_private->dnd_drag_data_type;
1385 if (event->dragrequest.isdrop)
1386 sev.xclient.data.l[3] = event->dragrequest.drop_coords.x +
1387 (event->dragrequest.drop_coords.y << 16);
1389 sev.xclient.data.l[3] = 0;
1391 sev.xclient.data.l[4] = 0;
1393 XSendEvent (gdk_display, event->dragrequest.requestor, False,
1398 gdk_window_add_filter (GdkWindow *window,
1399 GdkFilterFunc function,
1402 GdkWindowPrivate *private;
1404 GdkEventFilter *filter;
1406 private = (GdkWindowPrivate *)window;
1408 tmp_list = private->filters;
1411 filter = (GdkEventFilter *)tmp_list->data;
1412 if ((filter->function == function) && (filter->data == data))
1414 tmp_list = tmp_list->next;
1417 filter = g_new (GdkEventFilter, 1);
1418 filter->function = function;
1419 filter->data = data;
1421 private->filters = g_list_append (private->filters, filter);
1425 gdk_window_remove_filter (GdkWindow *window,
1426 GdkFilterFunc function,
1429 GdkWindowPrivate *private;
1431 GdkEventFilter *filter;
1433 private = (GdkWindowPrivate *)window;
1435 tmp_list = private->filters;
1438 filter = (GdkEventFilter *)tmp_list->data;
1439 tmp_list = tmp_list->next;
1441 if ((filter->function == function) && (filter->data == data))
1443 private->filters = g_list_remove_link (private->filters, tmp_list);
1444 g_list_free_1 (tmp_list);
1452 gdk_window_set_override_redirect(GdkWindow *window,
1453 gboolean override_redirect)
1455 XSetWindowAttributes attr;
1456 attr.override_redirect = (override_redirect == FALSE)?False:True;
1457 XChangeWindowAttributes(gdk_display,
1458 ((GdkWindowPrivate *)window)->xwindow,