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 xparent = parent_private->xwindow;
107 parent_display = parent_private->xdisplay;
109 private = g_new (GdkWindowPrivate, 1);
110 window = (GdkWindow*) private;
112 private->parent = parent;
113 private->xdisplay = parent_display;
114 private->destroyed = FALSE;
115 private->resize_count = 0;
116 private->ref_count = 1;
117 xattributes_mask = 0;
119 if (attributes_mask & GDK_WA_X)
124 if (attributes_mask & GDK_WA_Y)
131 private->width = (attributes->width > 1) ? (attributes->width) : (1);
132 private->height = (attributes->height > 1) ? (attributes->height) : (1);
133 private->window_type = attributes->window_type;
134 private->extension_events = FALSE;
135 private->dnd_drag_data_type = None;
136 private->dnd_drag_data_typesavail =
137 private->dnd_drop_data_typesavail = NULL;
138 private->dnd_drop_enabled = private->dnd_drag_enabled =
139 private->dnd_drag_accepted = private->dnd_drag_datashow =
140 private->dnd_drop_data_numtypesavail =
141 private->dnd_drag_data_numtypesavail = 0;
142 private->dnd_drag_eventmask = private->dnd_drag_savedeventmask = 0;
144 private->filters = NULL;
146 window->user_data = NULL;
148 if (attributes_mask & GDK_WA_VISUAL)
149 visual = attributes->visual;
151 visual = gdk_visual_get_system ();
152 xvisual = ((GdkVisualPrivate*) visual)->xvisual;
154 xattributes.event_mask = StructureNotifyMask;
155 for (i = 0; i < nevent_masks; i++)
157 if (attributes->event_mask & (1 << (i + 1)))
158 xattributes.event_mask |= event_mask_table[i];
161 if (xattributes.event_mask)
162 xattributes_mask |= CWEventMask;
164 if(attributes_mask & GDK_WA_NOREDIR) {
165 xattributes.override_redirect =
166 (attributes->override_redirect == FALSE)?False:True;
167 xattributes_mask |= CWOverrideRedirect;
169 xattributes.override_redirect = False;
171 if (attributes->wclass == GDK_INPUT_OUTPUT)
174 depth = visual->depth;
176 if (attributes_mask & GDK_WA_COLORMAP)
177 colormap = attributes->colormap;
179 colormap = gdk_colormap_get_system ();
181 xattributes.background_pixel = BlackPixel (gdk_display, gdk_screen);
182 xattributes.border_pixel = BlackPixel (gdk_display, gdk_screen);
183 xattributes_mask |= CWBorderPixel | CWBackPixel;
185 switch (private->window_type)
187 case GDK_WINDOW_TOPLEVEL:
188 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
189 xattributes_mask |= CWColormap;
191 xparent = gdk_root_window;
194 case GDK_WINDOW_CHILD:
195 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
196 xattributes_mask |= CWColormap;
199 case GDK_WINDOW_DIALOG:
200 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
201 xattributes_mask |= CWColormap;
203 xparent = gdk_root_window;
206 case GDK_WINDOW_TEMP:
207 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
208 xattributes_mask |= CWColormap;
210 xparent = gdk_root_window;
212 xattributes.save_under = True;
213 xattributes.override_redirect = True;
214 xattributes.cursor = None;
215 xattributes_mask |= CWSaveUnder | CWOverrideRedirect;
217 case GDK_WINDOW_ROOT:
218 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
220 case GDK_WINDOW_PIXMAP:
221 g_error ("cannot make windows of type GDK_WINDOW_PIXMAP (use gdk_pixmap_new)");
232 private->xwindow = XCreateWindow (private->xdisplay, xparent,
233 x, y, private->width, private->height,
234 0, depth, class, xvisual,
235 xattributes_mask, &xattributes);
236 gdk_window_ref (window);
237 gdk_xid_table_insert (&private->xwindow, window);
239 switch (private->window_type)
241 case GDK_WINDOW_DIALOG:
242 XSetTransientForHint (private->xdisplay, private->xwindow, xparent);
243 case GDK_WINDOW_TOPLEVEL:
244 case GDK_WINDOW_TEMP:
245 XSetWMProtocols (private->xdisplay, private->xwindow, gdk_wm_window_protocols, 2);
247 case GDK_WINDOW_CHILD:
248 if ((attributes->wclass == GDK_INPUT_OUTPUT) &&
249 (colormap != gdk_colormap_get_system ()) &&
250 (colormap != gdk_window_get_colormap (gdk_window_get_toplevel (window))))
252 g_print ("adding colormap window\n");
253 gdk_window_add_colormap_windows (window);
260 size_hints.flags = PSize | PBaseSize;
261 size_hints.width = private->width;
262 size_hints.height = private->height;
263 size_hints.base_width = private->width;
264 size_hints.base_height = private->height;
266 wm_hints.flags = InputHint | StateHint | WindowGroupHint;
267 wm_hints.window_group = gdk_leader_window;
268 wm_hints.input = True;
269 wm_hints.initial_state = NormalState;
271 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
272 XSetWMHints (private->xdisplay, private->xwindow, &wm_hints);
274 if (attributes_mask & GDK_WA_TITLE)
275 title = attributes->title;
277 title = gdk_progname;
279 XmbSetWMProperties (private->xdisplay, private->xwindow,
284 if (attributes_mask & GDK_WA_WMCLASS)
286 class_hint = XAllocClassHint ();
287 class_hint->res_name = attributes->wmclass_name;
288 class_hint->res_class = attributes->wmclass_class;
289 XSetClassHint (private->xdisplay, private->xwindow, class_hint);
293 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
294 (attributes->cursor) :
301 gdk_window_foreign_new (guint32 anid)
304 GdkWindowPrivate *private;
305 XWindowAttributes attrs;
307 private = g_new (GdkWindowPrivate, 1);
308 window = (GdkWindow*) private;
310 XGetWindowAttributes (gdk_display, anid, &attrs);
312 private->parent = NULL;
313 private->xwindow = anid;
314 private->xdisplay = gdk_display;
315 private->x = attrs.x;
316 private->y = attrs.y;
317 private->width = attrs.width;
318 private->height = attrs.height;
319 private->resize_count = 0;
320 private->ref_count = 1;
321 if (anid == attrs.root)
322 private->window_type = GDK_WINDOW_ROOT;
324 private->window_type = GDK_WINDOW_TOPLEVEL;
325 /* the above is probably wrong, but it may not be worth the extra
326 X call to get it right */
328 private->destroyed = FALSE;
329 private->extension_events = 0;
330 private->filters = NULL;
332 window->user_data = NULL;
334 gdk_window_ref (window);
335 gdk_xid_table_insert (&private->xwindow, window);
340 /* Call this function when you want a window and all its children to
341 disappear. When xdestroy is true, a request to destroy the XWindow
342 is sent out. When it is false, it is assumed that the XWindow has
343 been or will be destroyed by destroying some ancestor of this
347 gdk_window_internal_destroy (GdkWindow *window, int xdestroy)
349 GdkWindowPrivate *private;
350 GdkWindowPrivate *temp_private;
351 GdkWindow *temp_window;
355 g_return_if_fail (window != NULL);
357 private = (GdkWindowPrivate*) window;
359 switch (private->window_type)
361 case GDK_WINDOW_TOPLEVEL:
362 case GDK_WINDOW_CHILD:
363 case GDK_WINDOW_DIALOG:
364 case GDK_WINDOW_TEMP:
365 if (!private->destroyed)
367 children = gdk_window_get_children (window);
372 temp_window = tmp->data;
375 temp_private = (GdkWindowPrivate*) temp_window;
377 gdk_window_internal_destroy (temp_window, FALSE);
380 g_list_free (children);
382 if(private->dnd_drag_data_numtypesavail > 0)
384 g_free (private->dnd_drag_data_typesavail);
385 private->dnd_drag_data_typesavail = NULL;
387 if(private->dnd_drop_data_numtypesavail > 0)
389 g_free (private->dnd_drop_data_typesavail);
390 private->dnd_drop_data_typesavail = NULL;
394 XDestroyWindow (private->xdisplay, private->xwindow);
395 private->destroyed = TRUE;
399 case GDK_WINDOW_ROOT:
400 g_error ("attempted to destroy root window");
403 case GDK_WINDOW_PIXMAP:
404 g_error ("called gdk_window_destroy on a pixmap (use gdk_pixmap_unref)");
409 /* Like internal_destroy, but also destroys the reference created by
413 gdk_window_destroy (GdkWindow *window)
415 gdk_window_internal_destroy (window, TRUE);
416 gdk_window_unref (window);
419 /* This function is called when the XWindow is really gone. */
422 gdk_window_destroy_notify (GdkWindow *window)
424 GdkWindowPrivate *private;
426 g_return_if_fail (window != NULL);
428 private = (GdkWindowPrivate*) window;
430 if (private->extension_events != 0)
431 gdk_input_window_destroy (window);
433 gdk_xid_table_remove (private->xwindow);
434 gdk_window_unref (window);
438 gdk_window_ref (GdkWindow *window)
440 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
441 g_return_val_if_fail (window != NULL, NULL);
443 private->ref_count += 1;
448 gdk_window_unref (GdkWindow *window)
450 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
451 g_return_if_fail (window != NULL);
453 private->ref_count -= 1;
454 if (private->ref_count == 0)
456 if (!private->destroyed)
457 g_warning ("losing last reference to undestroyed window\n");
463 gdk_window_show (GdkWindow *window)
465 GdkWindowPrivate *private;
467 g_return_if_fail (window != NULL);
469 private = (GdkWindowPrivate*) window;
470 if (!private->destroyed)
472 XRaiseWindow (private->xdisplay, private->xwindow);
473 XMapWindow (private->xdisplay, private->xwindow);
478 gdk_window_hide (GdkWindow *window)
480 GdkWindowPrivate *private;
482 g_return_if_fail (window != NULL);
484 private = (GdkWindowPrivate*) window;
485 if (!private->destroyed)
486 XUnmapWindow (private->xdisplay, private->xwindow);
490 gdk_window_withdraw (GdkWindow *window)
492 GdkWindowPrivate *private;
494 g_return_if_fail (window != NULL);
496 private = (GdkWindowPrivate*) window;
497 if (!private->destroyed)
498 XWithdrawWindow (private->xdisplay, private->xwindow, 0);
502 gdk_window_move (GdkWindow *window,
506 GdkWindowPrivate *private;
508 g_return_if_fail (window != NULL);
510 private = (GdkWindowPrivate*) window;
511 XMoveWindow (private->xdisplay, private->xwindow, x, y);
513 if (private->window_type == GDK_WINDOW_CHILD)
521 gdk_window_resize (GdkWindow *window,
525 GdkWindowPrivate *private;
527 g_return_if_fail (window != NULL);
534 private = (GdkWindowPrivate*) window;
536 if (!private->destroyed &&
537 ((private->resize_count > 0) ||
538 (private->width != (guint16) width) ||
539 (private->height != (guint16) height)))
541 XResizeWindow (private->xdisplay, private->xwindow, width, height);
542 private->resize_count += 1;
544 if (private->window_type == GDK_WINDOW_CHILD)
546 private->width = width;
547 private->height = height;
553 gdk_window_move_resize (GdkWindow *window,
559 GdkWindowPrivate *private;
561 g_return_if_fail (window != NULL);
568 private = (GdkWindowPrivate*) window;
569 XMoveResizeWindow (private->xdisplay, private->xwindow, x, y, width, height);
571 if (!private->destroyed &&
572 (private->window_type == GDK_WINDOW_CHILD))
576 private->width = width;
577 private->height = height;
582 gdk_window_reparent (GdkWindow *window,
583 GdkWindow *new_parent,
587 GdkWindowPrivate *window_private;
588 GdkWindowPrivate *parent_private;
590 g_return_if_fail (window != NULL);
593 new_parent = (GdkWindow*) &gdk_root_parent;
595 window_private = (GdkWindowPrivate*) window;
596 parent_private = (GdkWindowPrivate*) new_parent;
598 XReparentWindow (window_private->xdisplay,
599 window_private->xwindow,
600 parent_private->xwindow,
605 gdk_window_clear (GdkWindow *window)
607 GdkWindowPrivate *private;
609 g_return_if_fail (window != NULL);
611 private = (GdkWindowPrivate*) window;
613 XClearWindow (private->xdisplay, private->xwindow);
617 gdk_window_clear_area (GdkWindow *window,
623 GdkWindowPrivate *private;
625 g_return_if_fail (window != NULL);
627 private = (GdkWindowPrivate*) window;
629 if (!private->destroyed)
630 XClearArea (private->xdisplay, private->xwindow,
631 x, y, width, height, False);
635 gdk_window_clear_area_e (GdkWindow *window,
641 GdkWindowPrivate *private;
643 g_return_if_fail (window != NULL);
645 private = (GdkWindowPrivate*) window;
647 if (!private->destroyed)
648 XClearArea (private->xdisplay, private->xwindow,
649 x, y, width, height, True);
653 gdk_window_copy_area (GdkWindow *window,
657 GdkWindow *source_window,
663 GdkWindowPrivate *src_private;
664 GdkWindowPrivate *dest_private;
665 GdkGCPrivate *gc_private;
667 g_return_if_fail (window != NULL);
668 g_return_if_fail (gc != NULL);
670 if (source_window == NULL)
671 source_window = window;
673 src_private = (GdkWindowPrivate*) source_window;
674 dest_private = (GdkWindowPrivate*) window;
675 gc_private = (GdkGCPrivate*) gc;
677 if (!src_private->destroyed && !dest_private->destroyed)
679 XCopyArea (dest_private->xdisplay, src_private->xwindow, dest_private->xwindow,
688 gdk_window_raise (GdkWindow *window)
690 GdkWindowPrivate *private;
692 g_return_if_fail (window != NULL);
694 private = (GdkWindowPrivate*) window;
696 if (!private->destroyed)
697 XRaiseWindow (private->xdisplay, private->xwindow);
701 gdk_window_lower (GdkWindow *window)
703 GdkWindowPrivate *private;
705 g_return_if_fail (window != NULL);
707 private = (GdkWindowPrivate*) window;
709 if (!private->destroyed)
710 XLowerWindow (private->xdisplay, private->xwindow);
714 gdk_window_set_user_data (GdkWindow *window,
717 g_return_if_fail (window != NULL);
719 window->user_data = user_data;
723 gdk_window_set_hints (GdkWindow *window,
732 GdkWindowPrivate *private;
733 XSizeHints size_hints;
735 g_return_if_fail (window != NULL);
737 private = (GdkWindowPrivate*) window;
738 size_hints.flags = 0;
740 if (flags & GDK_HINT_POS)
742 size_hints.flags |= PPosition;
747 if (flags & GDK_HINT_MIN_SIZE)
749 size_hints.flags |= PMinSize;
750 size_hints.min_width = min_width;
751 size_hints.min_height = min_height;
754 if (flags & GDK_HINT_MAX_SIZE)
756 size_hints.flags |= PMaxSize;
757 size_hints.max_width = max_width;
758 size_hints.max_height = max_height;
762 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
766 gdk_window_set_title (GdkWindow *window,
769 GdkWindowPrivate *private;
771 g_return_if_fail (window != NULL);
773 private = (GdkWindowPrivate*) window;
774 XmbSetWMProperties (private->xdisplay, private->xwindow,
775 title, title, NULL, 0, NULL, NULL, NULL);
779 gdk_window_set_background (GdkWindow *window,
782 GdkWindowPrivate *private;
784 g_return_if_fail (window != NULL);
786 private = (GdkWindowPrivate*) window;
787 XSetWindowBackground (private->xdisplay, private->xwindow, color->pixel);
791 gdk_window_set_back_pixmap (GdkWindow *window,
793 gint parent_relative)
795 GdkWindowPrivate *window_private;
796 GdkPixmapPrivate *pixmap_private;
799 g_return_if_fail (window != NULL);
801 window_private = (GdkWindowPrivate*) window;
802 pixmap_private = (GdkPixmapPrivate*) pixmap;
805 xpixmap = pixmap_private->xwindow;
810 xpixmap = ParentRelative;
812 XSetWindowBackgroundPixmap (window_private->xdisplay, window_private->xwindow, xpixmap);
816 gdk_window_set_cursor (GdkWindow *window,
819 GdkWindowPrivate *window_private;
820 GdkCursorPrivate *cursor_private;
823 g_return_if_fail (window != NULL);
825 window_private = (GdkWindowPrivate*) window;
826 cursor_private = (GdkCursorPrivate*) cursor;
831 xcursor = cursor_private->xcursor;
833 XDefineCursor (window_private->xdisplay, window_private->xwindow, xcursor);
837 gdk_window_set_colormap (GdkWindow *window,
838 GdkColormap *colormap)
840 GdkWindowPrivate *window_private;
841 GdkColormapPrivate *colormap_private;
843 g_return_if_fail (window != NULL);
844 g_return_if_fail (colormap != NULL);
846 window_private = (GdkWindowPrivate*) window;
847 colormap_private = (GdkColormapPrivate*) colormap;
849 XSetWindowColormap (window_private->xdisplay,
850 window_private->xwindow,
851 colormap_private->xcolormap);
853 if (window_private->window_type != GDK_WINDOW_TOPLEVEL)
854 gdk_window_add_colormap_windows (window);
858 gdk_window_get_user_data (GdkWindow *window,
861 g_return_if_fail (window != NULL);
863 *data = window->user_data;
867 gdk_window_get_geometry (GdkWindow *window,
874 GdkWindowPrivate *window_private;
884 window = (GdkWindow*) &gdk_root_parent;
886 window_private = (GdkWindowPrivate*) window;
888 XGetGeometry (window_private->xdisplay, window_private->xwindow,
889 &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
904 gdk_window_get_position (GdkWindow *window,
908 GdkWindowPrivate *window_private;
910 g_return_if_fail (window != NULL);
912 window_private = (GdkWindowPrivate*) window;
915 *x = window_private->x;
917 *y = window_private->y;
921 gdk_window_get_size (GdkWindow *window,
925 GdkWindowPrivate *window_private;
927 g_return_if_fail (window != NULL);
929 window_private = (GdkWindowPrivate*) window;
932 *width = window_private->width;
934 *height = window_private->height;
939 gdk_window_get_visual (GdkWindow *window)
941 GdkWindowPrivate *window_private;
942 XWindowAttributes window_attributes;
944 g_return_val_if_fail (window != NULL, NULL);
946 window_private = (GdkWindowPrivate*) window;
947 while (window_private && (window_private->window_type == GDK_WINDOW_PIXMAP))
948 window_private = (GdkWindowPrivate*) window_private->parent;
952 XGetWindowAttributes (window_private->xdisplay,
953 window_private->xwindow,
956 return gdk_visual_lookup (window_attributes.visual);
963 gdk_window_get_colormap (GdkWindow *window)
965 GdkWindowPrivate *window_private;
966 XWindowAttributes window_attributes;
968 g_return_val_if_fail (window != NULL, NULL);
970 window_private = (GdkWindowPrivate*) window;
972 XGetWindowAttributes (window_private->xdisplay,
973 window_private->xwindow,
976 return gdk_colormap_lookup (window_attributes.colormap);
980 gdk_window_get_type (GdkWindow *window)
982 GdkWindowPrivate *window_private;
984 g_return_val_if_fail (window != NULL, (GdkWindowType) -1);
986 window_private = (GdkWindowPrivate*) window;
987 return window_private->window_type;
991 gdk_window_get_origin (GdkWindow *window,
995 GdkWindowPrivate *private;
1000 g_return_val_if_fail (window != NULL, 0);
1002 private = (GdkWindowPrivate*) window;
1004 return_val = XTranslateCoordinates (private->xdisplay,
1019 gdk_window_get_pointer (GdkWindow *window,
1022 GdkModifierType *mask)
1024 GdkWindowPrivate *private;
1025 GdkWindow *return_val;
1033 window = (GdkWindow*) &gdk_root_parent;
1035 private = (GdkWindowPrivate*) window;
1038 if (XQueryPointer (private->xdisplay, private->xwindow, &root, &child,
1039 &rootx, &rooty, &winx, &winy, &xmask))
1043 if (mask) *mask = xmask;
1046 return_val = gdk_window_lookup (child);
1053 gdk_window_get_parent (GdkWindow *window)
1055 g_return_val_if_fail (window != NULL, NULL);
1057 return ((GdkWindowPrivate*) window)->parent;
1061 gdk_window_get_toplevel (GdkWindow *window)
1063 GdkWindowPrivate *private;
1065 g_return_val_if_fail (window != NULL, NULL);
1067 private = (GdkWindowPrivate*) window;
1069 while (private->window_type == GDK_WINDOW_CHILD)
1071 window = ((GdkWindowPrivate*) window)->parent;
1072 private = (GdkWindowPrivate*) window;
1079 gdk_window_get_children (GdkWindow *window)
1081 GdkWindowPrivate *private;
1087 unsigned int nchildren;
1090 g_return_val_if_fail (window != NULL, NULL);
1092 private = (GdkWindowPrivate*) window;
1094 XQueryTree (private->xdisplay, private->xwindow,
1095 &root, &parent, &xchildren, &nchildren);
1101 for (i = 0; i < nchildren; i++)
1103 child = gdk_window_lookup (xchildren[i]);
1105 children = g_list_prepend (children, child);
1115 gdk_window_get_events (GdkWindow *window)
1117 XWindowAttributes attrs;
1118 GdkEventMask event_mask;
1121 XGetWindowAttributes (gdk_display, ((GdkWindowPrivate *)window)->xwindow,
1125 for (i = 0; i < nevent_masks; i++)
1127 if (attrs.your_event_mask & event_mask_table[i])
1128 event_mask |= 1 << (i + 1);
1135 gdk_window_set_events (GdkWindow *window,
1136 GdkEventMask event_mask)
1141 xevent_mask = StructureNotifyMask;
1142 for (i = 0; i < nevent_masks; i++)
1144 if (event_mask & (1 << (i + 1)))
1145 xevent_mask |= event_mask_table[i];
1148 XSelectInput (gdk_display, ((GdkWindowPrivate *)window)->xwindow,
1153 gdk_window_add_colormap_windows (GdkWindow *window)
1155 GdkWindow *toplevel;
1156 GdkWindowPrivate *toplevel_private;
1157 GdkWindowPrivate *window_private;
1158 Window *old_windows;
1159 Window *new_windows;
1162 g_return_if_fail (window != NULL);
1164 toplevel = gdk_window_get_toplevel (window);
1165 toplevel_private = (GdkWindowPrivate*) toplevel;
1166 window_private = (GdkWindowPrivate*) window;
1168 if (!XGetWMColormapWindows (toplevel_private->xdisplay,
1169 toplevel_private->xwindow,
1170 &old_windows, &count))
1176 for (i = 0; i < count; i++)
1177 if (old_windows[i] == window_private->xwindow)
1180 new_windows = g_new (Window, count + 1);
1182 for (i = 0; i < count; i++)
1183 new_windows[i] = old_windows[i];
1184 new_windows[count] = window_private->xwindow;
1186 XSetWMColormapWindows (toplevel_private->xdisplay,
1187 toplevel_private->xwindow,
1188 new_windows, count + 1);
1190 g_free (new_windows);
1192 XFree (old_windows);
1196 * This needs the X11 shape extension.
1197 * If not available, simply remove the call to
1198 * XShapeCombineMask. Shaped windows will look
1199 * ugly, but programs still work. Stefan Wille
1202 gdk_window_shape_combine_mask (GdkWindow *window,
1206 GdkWindowPrivate *window_private;
1207 GdkWindowPrivate *pixmap_private;
1209 g_return_if_fail (window != NULL);
1210 g_return_if_fail (mask != NULL);
1212 window_private = (GdkWindowPrivate*) window;
1213 pixmap_private = (GdkWindowPrivate*) mask;
1215 XShapeCombineMask (window_private->xdisplay,
1216 window_private->xwindow,
1219 (Pixmap)pixmap_private->xwindow,
1224 gdk_dnd_drag_addwindow (GdkWindow *window)
1226 GdkWindowPrivate *window_private;
1228 g_return_if_fail (window != NULL);
1230 window_private = (GdkWindowPrivate *) window;
1232 if (window_private->dnd_drag_enabled == 1 && gdk_dnd.drag_really == 0)
1234 gdk_dnd.drag_numwindows++;
1235 gdk_dnd.drag_startwindows = g_realloc (gdk_dnd.drag_startwindows,
1236 gdk_dnd.drag_numwindows
1237 * sizeof(GdkWindow *));
1238 gdk_dnd.drag_startwindows[gdk_dnd.drag_numwindows - 1] = window;
1239 window_private->dnd_drag_accepted = 0;
1242 g_warning ("dnd_really is 1 or drag is not enabled! can't addwindow\n");
1246 gdk_window_dnd_drag_set (GdkWindow *window,
1251 GdkWindowPrivate *window_private;
1254 g_return_if_fail (window != NULL);
1255 window_private = (GdkWindowPrivate *) window;
1257 window_private->dnd_drag_enabled = drag_enable ? 1 : 0;
1261 g_return_if_fail(typelist != NULL);
1263 if (window_private->dnd_drag_data_numtypesavail > 3)
1265 window_private->dnd_drag_data_numtypesavail = numtypes;
1267 window_private->dnd_drag_data_typesavail =
1268 g_realloc (window_private->dnd_drag_data_typesavail,
1269 (numtypes + 1) * sizeof (GdkAtom));
1271 for (i = 0; i < numtypes; i++)
1273 /* Allow blanket use of ALL to get anything... */
1274 if (strcmp (typelist[i], "ALL"))
1275 window_private->dnd_drag_data_typesavail[i] =
1276 gdk_atom_intern (typelist[i], FALSE);
1278 window_private->dnd_drag_data_typesavail[i] = None;
1282 * set our extended type list if we need to
1285 gdk_property_change(window, gdk_dnd.gdk_XdeTypelist,
1286 XA_PRIMARY, 32, GDK_PROP_MODE_REPLACE,
1287 (guchar *)(window_private->dnd_drag_data_typesavail
1288 + (sizeof(GdkAtom) * 3)),
1289 (numtypes - 3) * sizeof(GdkAtom));
1291 gdk_property_delete (window, gdk_dnd.gdk_XdeTypelist);
1295 free (window_private->dnd_drag_data_typesavail);
1296 window_private->dnd_drag_data_typesavail = NULL;
1297 window_private->dnd_drag_data_numtypesavail = 0;
1302 gdk_window_dnd_drop_set (GdkWindow *window,
1306 guint8 destructive_op)
1308 GdkWindowPrivate *window_private;
1311 g_return_if_fail (window != NULL);
1313 window_private = (GdkWindowPrivate *) window;
1315 window_private->dnd_drop_enabled = drop_enable ? 1 : 0;
1318 g_return_if_fail(typelist != NULL);
1320 window_private->dnd_drop_data_numtypesavail = numtypes;
1322 window_private->dnd_drop_data_typesavail =
1323 g_realloc (window_private->dnd_drop_data_typesavail,
1324 (numtypes + 1) * sizeof (GdkAtom));
1326 for (i = 0; i < numtypes; i++)
1327 window_private->dnd_drop_data_typesavail[i] =
1328 gdk_atom_intern (typelist[i], FALSE);
1330 window_private->dnd_drop_destructive_op = destructive_op;
1335 * This is used to reply to a GDK_DRAG_REQUEST event
1336 * (which may be generated by XdeRequest or a confirmed drop...
1339 gdk_window_dnd_data_set (GdkWindow *window,
1342 gulong data_numbytes)
1344 GdkWindowPrivate *window_private;
1346 GdkEventDropDataAvailable tmp_ev;
1349 g_return_if_fail (window != NULL);
1350 g_return_if_fail (event != NULL);
1351 g_return_if_fail (data != NULL);
1352 g_return_if_fail (data_numbytes > 0);
1353 g_return_if_fail (event->type == GDK_DRAG_REQUEST);
1355 g_free (event->dragrequest.data_type);
1356 event->dragrequest.data_type = NULL;
1358 window_private = (GdkWindowPrivate *) window;
1359 g_return_if_fail (window_private->dnd_drag_accepted != 0);
1361 /* We set the property on our window... */
1362 gdk_property_change (window, window_private->dnd_drag_data_type,
1363 XA_PRIMARY, 8, GDK_PROP_MODE_REPLACE, data,
1365 tmp = gdk_atom_name(window_private->dnd_drag_data_type);
1367 g_print("DnD type %s on window %ld\n", tmp, window_private->xwindow);
1372 * Then we send the event to tell the receiving window that the
1375 tmp_ev.u.allflags = 0;
1376 tmp_ev.u.flags.protocol_version = DND_PROTOCOL_VERSION;
1377 tmp_ev.u.flags.isdrop = event->dragrequest.isdrop;
1379 sev.xclient.type = ClientMessage;
1380 sev.xclient.format = 32;
1381 sev.xclient.window = event->dragrequest.requestor;
1382 sev.xclient.message_type = gdk_dnd.gdk_XdeDataAvailable;
1383 sev.xclient.data.l[0] = window_private->xwindow;
1384 sev.xclient.data.l[1] = tmp_ev.u.allflags;
1385 sev.xclient.data.l[2] = window_private->dnd_drag_data_type;
1387 if (event->dragrequest.isdrop)
1388 sev.xclient.data.l[3] = event->dragrequest.drop_coords.x +
1389 (event->dragrequest.drop_coords.y << 16);
1391 sev.xclient.data.l[3] = 0;
1393 sev.xclient.data.l[4] = 0;
1395 XSendEvent (gdk_display, event->dragrequest.requestor, False,
1400 gdk_window_add_filter (GdkWindow *window,
1401 GdkFilterFunc function,
1404 GdkWindowPrivate *private;
1406 GdkEventFilter *filter;
1408 private = (GdkWindowPrivate *)window;
1410 tmp_list = private->filters;
1413 filter = (GdkEventFilter *)tmp_list->data;
1414 if ((filter->function == function) && (filter->data == data))
1416 tmp_list = tmp_list->next;
1419 filter = g_new (GdkEventFilter, 1);
1420 filter->function = function;
1421 filter->data = data;
1423 private->filters = g_list_append (private->filters, filter);
1427 gdk_window_remove_filter (GdkWindow *window,
1428 GdkFilterFunc function,
1431 GdkWindowPrivate *private;
1433 GdkEventFilter *filter;
1435 private = (GdkWindowPrivate *)window;
1437 tmp_list = private->filters;
1440 filter = (GdkEventFilter *)tmp_list->data;
1441 tmp_list = tmp_list->next;
1443 if ((filter->function == function) && (filter->data == data))
1445 private->filters = g_list_remove_link (private->filters, tmp_list);
1446 g_list_free_1 (tmp_list);
1454 gdk_window_set_override_redirect(GdkWindow *window,
1455 gboolean override_redirect)
1457 XSetWindowAttributes attr;
1458 attr.override_redirect = (override_redirect == FALSE)?False:True;
1459 XChangeWindowAttributes(gdk_display,
1460 ((GdkWindowPrivate *)window)->xwindow,