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,
56 /* internal function created for and used by gdk_window_xid_at_coords */
58 gdk_window_xid_at(Window base, gint bx, gint by, gint x, gint y)
61 GdkWindowPrivate *private;
64 Window child=0,parent_win=0,root_win=0;
65 unsigned int num,i,ww,wh,wb,wd;
68 window=(GdkWindow*)&gdk_root_parent;
69 private=(GdkWindowPrivate*)window;
70 disp=private->xdisplay;
71 if (!XGetGeometry(disp,base,&root_win,&wx,&wy,&ww,&wh,&wb,&wd))
74 if (!((x>=wx)&&(y>=wy)&&(x<(wx+ww))&&(y<(wy+wh))))
76 if (!XQueryTree(disp,base,&root_win,&parent_win,&list,&num))
80 for (i=num-1;i>=0;i--)
82 if ((child=gdk_window_xid_at(list[i],wx,wy,x,y))!=0)
93 * The following fucntion by The Rasterman <raster@redhat.com>
94 * This function returns the X Window ID in which the x y location is in
95 * (x and y being relative to the root window), excluding any windows listed
96 * in the GList excludes (this is a list of X Window ID's - gpointer being
99 * This is primarily designed for internal gdk use - for DND for example
100 * when using a shaped icon window as the drag object - you exclude the
101 * X Window ID of the "icon" (perhaps more if excludes may be needed) and
102 * You can get back an X Window ID as to what X Window ID is infact under
103 * those X,Y co-ordinates.
106 gdk_window_xid_at_coords(gint x, gint y, GList *excludes)
109 GdkWindowPrivate *private;
112 Window root,child=0,parent_win=0,root_win=0;
115 window=(GdkWindow*)&gdk_root_parent;
116 private=(GdkWindowPrivate*)window;
117 disp=private->xdisplay;
118 root=private->xwindow;
119 if (!XQueryTree(disp,root,&root_win,&parent_win,&list,&num))
123 for (i=num-1;i>=0;i--)
125 if ((child=gdk_window_xid_at(list[i],0,0,x,y))!=0)
129 if (!g_list_find(excludes,(gpointer)child))
149 XWindowAttributes xattributes;
152 unsigned int border_width;
156 XGetGeometry (gdk_display, gdk_root_window, &gdk_root_window,
157 &x, &y, &width, &height, &border_width, &depth);
158 XGetWindowAttributes (gdk_display, gdk_root_window, &xattributes);
160 gdk_root_parent.xdisplay = gdk_display;
161 gdk_root_parent.xwindow = gdk_root_window;
162 gdk_root_parent.window_type = GDK_WINDOW_ROOT;
163 gdk_root_parent.window.user_data = NULL;
164 gdk_root_parent.width = width;
165 gdk_root_parent.height = height;
169 gdk_window_new (GdkWindow *parent,
170 GdkWindowAttr *attributes,
171 gint attributes_mask)
174 GdkWindowPrivate *private;
175 GdkWindowPrivate *parent_private;
177 GdkColormap *colormap;
178 Display *parent_display;
181 XSetWindowAttributes xattributes;
182 long xattributes_mask;
183 XSizeHints size_hints;
185 XClassHint *class_hint;
191 g_return_val_if_fail (attributes != NULL, NULL);
194 parent = (GdkWindow*) &gdk_root_parent;
196 parent_private = (GdkWindowPrivate*) parent;
197 if (parent_private->destroyed)
200 xparent = parent_private->xwindow;
201 parent_display = parent_private->xdisplay;
203 private = g_new (GdkWindowPrivate, 1);
204 window = (GdkWindow*) private;
206 private->parent = parent;
207 private->xdisplay = parent_display;
208 private->destroyed = FALSE;
209 private->resize_count = 0;
210 private->ref_count = 1;
211 xattributes_mask = 0;
213 if (attributes_mask & GDK_WA_X)
218 if (attributes_mask & GDK_WA_Y)
225 private->width = (attributes->width > 1) ? (attributes->width) : (1);
226 private->height = (attributes->height > 1) ? (attributes->height) : (1);
227 private->window_type = attributes->window_type;
228 private->extension_events = FALSE;
229 private->dnd_drag_data_type = None;
230 private->dnd_drag_data_typesavail =
231 private->dnd_drop_data_typesavail = NULL;
232 private->dnd_drop_enabled = private->dnd_drag_enabled =
233 private->dnd_drag_accepted = private->dnd_drag_datashow =
234 private->dnd_drop_data_numtypesavail =
235 private->dnd_drag_data_numtypesavail = 0;
236 private->dnd_drag_eventmask = private->dnd_drag_savedeventmask = 0;
238 private->filters = NULL;
240 window->user_data = NULL;
242 if (attributes_mask & GDK_WA_VISUAL)
243 visual = attributes->visual;
245 visual = gdk_visual_get_system ();
246 xvisual = ((GdkVisualPrivate*) visual)->xvisual;
248 xattributes.event_mask = StructureNotifyMask;
249 for (i = 0; i < nevent_masks; i++)
251 if (attributes->event_mask & (1 << (i + 1)))
252 xattributes.event_mask |= event_mask_table[i];
255 if (xattributes.event_mask)
256 xattributes_mask |= CWEventMask;
258 if(attributes_mask & GDK_WA_NOREDIR) {
259 xattributes.override_redirect =
260 (attributes->override_redirect == FALSE)?False:True;
261 xattributes_mask |= CWOverrideRedirect;
263 xattributes.override_redirect = False;
265 if (attributes->wclass == GDK_INPUT_OUTPUT)
268 depth = visual->depth;
270 if (attributes_mask & GDK_WA_COLORMAP)
271 colormap = attributes->colormap;
273 colormap = gdk_colormap_get_system ();
275 xattributes.background_pixel = BlackPixel (gdk_display, gdk_screen);
276 xattributes.border_pixel = BlackPixel (gdk_display, gdk_screen);
277 xattributes_mask |= CWBorderPixel | CWBackPixel;
279 switch (private->window_type)
281 case GDK_WINDOW_TOPLEVEL:
282 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
283 xattributes_mask |= CWColormap;
285 xparent = gdk_root_window;
288 case GDK_WINDOW_CHILD:
289 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
290 xattributes_mask |= CWColormap;
293 case GDK_WINDOW_DIALOG:
294 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
295 xattributes_mask |= CWColormap;
297 xparent = gdk_root_window;
300 case GDK_WINDOW_TEMP:
301 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
302 xattributes_mask |= CWColormap;
304 xparent = gdk_root_window;
306 xattributes.save_under = True;
307 xattributes.override_redirect = True;
308 xattributes.cursor = None;
309 xattributes_mask |= CWSaveUnder | CWOverrideRedirect;
311 case GDK_WINDOW_ROOT:
312 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
314 case GDK_WINDOW_PIXMAP:
315 g_error ("cannot make windows of type GDK_WINDOW_PIXMAP (use gdk_pixmap_new)");
326 private->xwindow = XCreateWindow (private->xdisplay, xparent,
327 x, y, private->width, private->height,
328 0, depth, class, xvisual,
329 xattributes_mask, &xattributes);
330 gdk_window_ref (window);
331 gdk_xid_table_insert (&private->xwindow, window);
333 switch (private->window_type)
335 case GDK_WINDOW_DIALOG:
336 XSetTransientForHint (private->xdisplay, private->xwindow, xparent);
337 case GDK_WINDOW_TOPLEVEL:
338 case GDK_WINDOW_TEMP:
339 XSetWMProtocols (private->xdisplay, private->xwindow, gdk_wm_window_protocols, 2);
341 case GDK_WINDOW_CHILD:
342 if ((attributes->wclass == GDK_INPUT_OUTPUT) &&
343 (colormap != gdk_colormap_get_system ()) &&
344 (colormap != gdk_window_get_colormap (gdk_window_get_toplevel (window))))
346 g_print ("adding colormap window\n");
347 gdk_window_add_colormap_windows (window);
354 size_hints.flags = PSize | PBaseSize;
355 size_hints.width = private->width;
356 size_hints.height = private->height;
357 size_hints.base_width = private->width;
358 size_hints.base_height = private->height;
360 wm_hints.flags = InputHint | StateHint | WindowGroupHint;
361 wm_hints.window_group = gdk_leader_window;
362 wm_hints.input = True;
363 wm_hints.initial_state = NormalState;
365 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
366 XSetWMHints (private->xdisplay, private->xwindow, &wm_hints);
368 if (attributes_mask & GDK_WA_TITLE)
369 title = attributes->title;
371 title = gdk_progname;
373 XmbSetWMProperties (private->xdisplay, private->xwindow,
378 if (attributes_mask & GDK_WA_WMCLASS)
380 class_hint = XAllocClassHint ();
381 class_hint->res_name = attributes->wmclass_name;
382 class_hint->res_class = attributes->wmclass_class;
383 XSetClassHint (private->xdisplay, private->xwindow, class_hint);
387 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
388 (attributes->cursor) :
395 gdk_window_foreign_new (guint32 anid)
398 GdkWindowPrivate *private;
399 XWindowAttributes attrs;
401 private = g_new (GdkWindowPrivate, 1);
402 window = (GdkWindow*) private;
404 XGetWindowAttributes (gdk_display, anid, &attrs);
406 private->parent = NULL;
407 private->xwindow = anid;
408 private->xdisplay = gdk_display;
409 private->x = attrs.x;
410 private->y = attrs.y;
411 private->width = attrs.width;
412 private->height = attrs.height;
413 private->resize_count = 0;
414 private->ref_count = 1;
415 if (anid == attrs.root)
416 private->window_type = GDK_WINDOW_ROOT;
418 private->window_type = GDK_WINDOW_TOPLEVEL;
419 /* the above is probably wrong, but it may not be worth the extra
420 X call to get it right */
422 private->destroyed = FALSE;
423 private->extension_events = 0;
424 private->filters = NULL;
426 window->user_data = NULL;
428 gdk_window_ref (window);
429 gdk_xid_table_insert (&private->xwindow, window);
434 /* Call this function when you want a window and all its children to
435 disappear. When xdestroy is true, a request to destroy the XWindow
436 is sent out. When it is false, it is assumed that the XWindow has
437 been or will be destroyed by destroying some ancestor of this
441 gdk_window_internal_destroy (GdkWindow *window, int xdestroy)
443 GdkWindowPrivate *private;
444 GdkWindowPrivate *temp_private;
445 GdkWindow *temp_window;
449 g_return_if_fail (window != NULL);
451 private = (GdkWindowPrivate*) window;
453 switch (private->window_type)
455 case GDK_WINDOW_TOPLEVEL:
456 case GDK_WINDOW_CHILD:
457 case GDK_WINDOW_DIALOG:
458 case GDK_WINDOW_TEMP:
459 if (!private->destroyed)
461 children = gdk_window_get_children (window);
466 temp_window = tmp->data;
469 temp_private = (GdkWindowPrivate*) temp_window;
471 gdk_window_internal_destroy (temp_window, FALSE);
474 g_list_free (children);
476 if (private->extension_events != 0)
477 gdk_input_window_destroy (window);
479 if(private->dnd_drag_data_numtypesavail > 0)
481 g_free (private->dnd_drag_data_typesavail);
482 private->dnd_drag_data_typesavail = NULL;
484 if(private->dnd_drop_data_numtypesavail > 0)
486 g_free (private->dnd_drop_data_typesavail);
487 private->dnd_drop_data_typesavail = NULL;
491 XDestroyWindow (private->xdisplay, private->xwindow);
492 private->destroyed = TRUE;
496 case GDK_WINDOW_ROOT:
497 g_error ("attempted to destroy root window");
500 case GDK_WINDOW_PIXMAP:
501 g_error ("called gdk_window_destroy on a pixmap (use gdk_pixmap_unref)");
506 /* Like internal_destroy, but also destroys the reference created by
510 gdk_window_destroy (GdkWindow *window)
512 gdk_window_internal_destroy (window, TRUE);
513 gdk_window_unref (window);
516 /* This function is called when the XWindow is really gone. */
519 gdk_window_destroy_notify (GdkWindow *window)
521 GdkWindowPrivate *private;
523 g_return_if_fail (window != NULL);
525 private = (GdkWindowPrivate*) window;
527 gdk_xid_table_remove (private->xwindow);
528 gdk_window_unref (window);
532 gdk_window_ref (GdkWindow *window)
534 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
535 g_return_val_if_fail (window != NULL, NULL);
537 private->ref_count += 1;
542 gdk_window_unref (GdkWindow *window)
544 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
545 g_return_if_fail (window != NULL);
547 private->ref_count -= 1;
548 if (private->ref_count == 0)
550 if (!private->destroyed)
551 g_warning ("losing last reference to undestroyed window\n");
557 gdk_window_show (GdkWindow *window)
559 GdkWindowPrivate *private;
561 g_return_if_fail (window != NULL);
563 private = (GdkWindowPrivate*) window;
564 if (!private->destroyed)
566 XRaiseWindow (private->xdisplay, private->xwindow);
567 XMapWindow (private->xdisplay, private->xwindow);
572 gdk_window_hide (GdkWindow *window)
574 GdkWindowPrivate *private;
576 g_return_if_fail (window != NULL);
578 private = (GdkWindowPrivate*) window;
579 if (!private->destroyed)
580 XUnmapWindow (private->xdisplay, private->xwindow);
584 gdk_window_withdraw (GdkWindow *window)
586 GdkWindowPrivate *private;
588 g_return_if_fail (window != NULL);
590 private = (GdkWindowPrivate*) window;
591 if (!private->destroyed)
592 XWithdrawWindow (private->xdisplay, private->xwindow, 0);
596 gdk_window_move (GdkWindow *window,
600 GdkWindowPrivate *private;
602 g_return_if_fail (window != NULL);
604 private = (GdkWindowPrivate*) window;
605 if (!private->destroyed)
607 XMoveWindow (private->xdisplay, private->xwindow, x, y);
609 if (private->window_type == GDK_WINDOW_CHILD)
618 gdk_window_resize (GdkWindow *window,
622 GdkWindowPrivate *private;
624 g_return_if_fail (window != NULL);
631 private = (GdkWindowPrivate*) window;
633 if (!private->destroyed &&
634 ((private->resize_count > 0) ||
635 (private->width != (guint16) width) ||
636 (private->height != (guint16) height)))
638 XResizeWindow (private->xdisplay, private->xwindow, width, height);
639 private->resize_count += 1;
641 if (private->window_type == GDK_WINDOW_CHILD)
643 private->width = width;
644 private->height = height;
650 gdk_window_move_resize (GdkWindow *window,
656 GdkWindowPrivate *private;
658 g_return_if_fail (window != NULL);
665 private = (GdkWindowPrivate*) window;
666 if (!private->destroyed)
668 XMoveResizeWindow (private->xdisplay, private->xwindow, x, y, width, height);
670 if (private->window_type == GDK_WINDOW_CHILD)
674 private->width = width;
675 private->height = height;
681 gdk_window_reparent (GdkWindow *window,
682 GdkWindow *new_parent,
686 GdkWindowPrivate *window_private;
687 GdkWindowPrivate *parent_private;
689 g_return_if_fail (window != NULL);
692 new_parent = (GdkWindow*) &gdk_root_parent;
694 window_private = (GdkWindowPrivate*) window;
695 parent_private = (GdkWindowPrivate*) new_parent;
697 if (!window_private->destroyed && !parent_private->destroyed)
698 XReparentWindow (window_private->xdisplay,
699 window_private->xwindow,
700 parent_private->xwindow,
705 gdk_window_clear (GdkWindow *window)
707 GdkWindowPrivate *private;
709 g_return_if_fail (window != NULL);
711 private = (GdkWindowPrivate*) window;
713 if (!private->destroyed)
714 XClearWindow (private->xdisplay, private->xwindow);
718 gdk_window_clear_area (GdkWindow *window,
724 GdkWindowPrivate *private;
726 g_return_if_fail (window != NULL);
728 private = (GdkWindowPrivate*) window;
730 if (!private->destroyed)
731 XClearArea (private->xdisplay, private->xwindow,
732 x, y, width, height, False);
736 gdk_window_clear_area_e (GdkWindow *window,
742 GdkWindowPrivate *private;
744 g_return_if_fail (window != NULL);
746 private = (GdkWindowPrivate*) window;
748 if (!private->destroyed)
749 XClearArea (private->xdisplay, private->xwindow,
750 x, y, width, height, True);
754 gdk_window_copy_area (GdkWindow *window,
758 GdkWindow *source_window,
764 GdkWindowPrivate *src_private;
765 GdkWindowPrivate *dest_private;
766 GdkGCPrivate *gc_private;
768 g_return_if_fail (window != NULL);
769 g_return_if_fail (gc != NULL);
771 if (source_window == NULL)
772 source_window = window;
774 src_private = (GdkWindowPrivate*) source_window;
775 dest_private = (GdkWindowPrivate*) window;
776 gc_private = (GdkGCPrivate*) gc;
778 if (!src_private->destroyed && !dest_private->destroyed)
780 XCopyArea (dest_private->xdisplay, src_private->xwindow, dest_private->xwindow,
789 gdk_window_raise (GdkWindow *window)
791 GdkWindowPrivate *private;
793 g_return_if_fail (window != NULL);
795 private = (GdkWindowPrivate*) window;
797 if (!private->destroyed)
798 XRaiseWindow (private->xdisplay, private->xwindow);
802 gdk_window_lower (GdkWindow *window)
804 GdkWindowPrivate *private;
806 g_return_if_fail (window != NULL);
808 private = (GdkWindowPrivate*) window;
810 if (!private->destroyed)
811 XLowerWindow (private->xdisplay, private->xwindow);
815 gdk_window_set_user_data (GdkWindow *window,
818 g_return_if_fail (window != NULL);
820 window->user_data = user_data;
824 gdk_window_set_hints (GdkWindow *window,
833 GdkWindowPrivate *private;
834 XSizeHints size_hints;
836 g_return_if_fail (window != NULL);
838 private = (GdkWindowPrivate*) window;
839 if (private->destroyed)
842 size_hints.flags = 0;
844 if (flags & GDK_HINT_POS)
846 size_hints.flags |= PPosition;
851 if (flags & GDK_HINT_MIN_SIZE)
853 size_hints.flags |= PMinSize;
854 size_hints.min_width = min_width;
855 size_hints.min_height = min_height;
858 if (flags & GDK_HINT_MAX_SIZE)
860 size_hints.flags |= PMaxSize;
861 size_hints.max_width = max_width;
862 size_hints.max_height = max_height;
866 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
870 gdk_window_set_title (GdkWindow *window,
873 GdkWindowPrivate *private;
875 g_return_if_fail (window != NULL);
877 private = (GdkWindowPrivate*) window;
878 if (!private->destroyed)
879 XmbSetWMProperties (private->xdisplay, private->xwindow,
880 title, title, NULL, 0, NULL, NULL, NULL);
884 gdk_window_set_background (GdkWindow *window,
887 GdkWindowPrivate *private;
889 g_return_if_fail (window != NULL);
891 private = (GdkWindowPrivate*) window;
892 if (!private->destroyed)
893 XSetWindowBackground (private->xdisplay, private->xwindow, color->pixel);
897 gdk_window_set_back_pixmap (GdkWindow *window,
899 gint parent_relative)
901 GdkWindowPrivate *window_private;
902 GdkPixmapPrivate *pixmap_private;
905 g_return_if_fail (window != NULL);
907 window_private = (GdkWindowPrivate*) window;
908 pixmap_private = (GdkPixmapPrivate*) pixmap;
911 xpixmap = pixmap_private->xwindow;
916 xpixmap = ParentRelative;
918 if (!window_private->destroyed)
919 XSetWindowBackgroundPixmap (window_private->xdisplay, window_private->xwindow, xpixmap);
923 gdk_window_set_cursor (GdkWindow *window,
926 GdkWindowPrivate *window_private;
927 GdkCursorPrivate *cursor_private;
930 g_return_if_fail (window != NULL);
932 window_private = (GdkWindowPrivate*) window;
933 cursor_private = (GdkCursorPrivate*) cursor;
938 xcursor = cursor_private->xcursor;
940 if (!window_private->destroyed)
941 XDefineCursor (window_private->xdisplay, window_private->xwindow, xcursor);
945 gdk_window_set_colormap (GdkWindow *window,
946 GdkColormap *colormap)
948 GdkWindowPrivate *window_private;
949 GdkColormapPrivate *colormap_private;
951 g_return_if_fail (window != NULL);
952 g_return_if_fail (colormap != NULL);
954 window_private = (GdkWindowPrivate*) window;
955 colormap_private = (GdkColormapPrivate*) colormap;
957 if (!window_private->destroyed)
959 XSetWindowColormap (window_private->xdisplay,
960 window_private->xwindow,
961 colormap_private->xcolormap);
963 if (window_private->window_type != GDK_WINDOW_TOPLEVEL)
964 gdk_window_add_colormap_windows (window);
969 gdk_window_get_user_data (GdkWindow *window,
972 g_return_if_fail (window != NULL);
974 *data = window->user_data;
978 gdk_window_get_geometry (GdkWindow *window,
985 GdkWindowPrivate *window_private;
995 window = (GdkWindow*) &gdk_root_parent;
997 window_private = (GdkWindowPrivate*) window;
999 if (!window_private->destroyed)
1001 XGetGeometry (window_private->xdisplay, window_private->xwindow,
1002 &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
1018 gdk_window_get_position (GdkWindow *window,
1022 GdkWindowPrivate *window_private;
1024 g_return_if_fail (window != NULL);
1026 window_private = (GdkWindowPrivate*) window;
1029 *x = window_private->x;
1031 *y = window_private->y;
1035 gdk_window_get_size (GdkWindow *window,
1039 GdkWindowPrivate *window_private;
1041 g_return_if_fail (window != NULL);
1043 window_private = (GdkWindowPrivate*) window;
1046 *width = window_private->width;
1048 *height = window_private->height;
1052 gdk_window_get_visual (GdkWindow *window)
1054 GdkWindowPrivate *window_private;
1055 XWindowAttributes window_attributes;
1057 g_return_val_if_fail (window != NULL, NULL);
1059 window_private = (GdkWindowPrivate*) window;
1060 while (window_private && (window_private->window_type == GDK_WINDOW_PIXMAP))
1061 window_private = (GdkWindowPrivate*) window_private->parent;
1063 if (window_private && !window_private->destroyed)
1065 XGetWindowAttributes (window_private->xdisplay,
1066 window_private->xwindow,
1067 &window_attributes);
1069 return gdk_visual_lookup (window_attributes.visual);
1076 gdk_window_get_colormap (GdkWindow *window)
1078 GdkWindowPrivate *window_private;
1079 XWindowAttributes window_attributes;
1081 g_return_val_if_fail (window != NULL, NULL);
1083 window_private = (GdkWindowPrivate*) window;
1085 if (!window_private->destroyed)
1087 XGetWindowAttributes (window_private->xdisplay,
1088 window_private->xwindow,
1089 &window_attributes);
1091 return gdk_colormap_lookup (window_attributes.colormap);
1098 gdk_window_get_type (GdkWindow *window)
1100 GdkWindowPrivate *window_private;
1102 g_return_val_if_fail (window != NULL, (GdkWindowType) -1);
1104 window_private = (GdkWindowPrivate*) window;
1105 return window_private->window_type;
1109 gdk_window_get_origin (GdkWindow *window,
1113 GdkWindowPrivate *private;
1118 g_return_val_if_fail (window != NULL, 0);
1120 private = (GdkWindowPrivate*) window;
1122 if (!private->destroyed)
1124 return_val = XTranslateCoordinates (private->xdisplay,
1142 gdk_window_get_pointer (GdkWindow *window,
1145 GdkModifierType *mask)
1147 GdkWindowPrivate *private;
1148 GdkWindow *return_val;
1156 window = (GdkWindow*) &gdk_root_parent;
1158 private = (GdkWindowPrivate*) window;
1161 if (!private->destroyed &&
1162 XQueryPointer (private->xdisplay, private->xwindow, &root, &child,
1163 &rootx, &rooty, &winx, &winy, &xmask))
1167 if (mask) *mask = xmask;
1170 return_val = gdk_window_lookup (child);
1177 gdk_window_get_parent (GdkWindow *window)
1179 g_return_val_if_fail (window != NULL, NULL);
1181 return ((GdkWindowPrivate*) window)->parent;
1185 gdk_window_get_toplevel (GdkWindow *window)
1187 GdkWindowPrivate *private;
1189 g_return_val_if_fail (window != NULL, NULL);
1191 private = (GdkWindowPrivate*) window;
1193 while (private->window_type == GDK_WINDOW_CHILD)
1195 window = ((GdkWindowPrivate*) window)->parent;
1196 private = (GdkWindowPrivate*) window;
1203 gdk_window_get_children (GdkWindow *window)
1205 GdkWindowPrivate *private;
1211 unsigned int nchildren;
1214 g_return_val_if_fail (window != NULL, NULL);
1216 private = (GdkWindowPrivate*) window;
1217 if (private->destroyed)
1220 XQueryTree (private->xdisplay, private->xwindow,
1221 &root, &parent, &xchildren, &nchildren);
1227 for (i = 0; i < nchildren; i++)
1229 child = gdk_window_lookup (xchildren[i]);
1231 children = g_list_prepend (children, child);
1241 gdk_window_get_events (GdkWindow *window)
1243 GdkWindowPrivate *private;
1244 XWindowAttributes attrs;
1245 GdkEventMask event_mask;
1248 g_return_val_if_fail (window != NULL, 0);
1250 private = (GdkWindowPrivate*) window;
1251 if (private->destroyed)
1254 XGetWindowAttributes (gdk_display, private->xwindow,
1258 for (i = 0; i < nevent_masks; i++)
1260 if (attrs.your_event_mask & event_mask_table[i])
1261 event_mask |= 1 << (i + 1);
1268 gdk_window_set_events (GdkWindow *window,
1269 GdkEventMask event_mask)
1271 GdkWindowPrivate *private;
1275 g_return_if_fail (window != NULL);
1277 private = (GdkWindowPrivate*) window;
1278 if (private->destroyed)
1281 xevent_mask = StructureNotifyMask;
1282 for (i = 0; i < nevent_masks; i++)
1284 if (event_mask & (1 << (i + 1)))
1285 xevent_mask |= event_mask_table[i];
1288 XSelectInput (gdk_display, private->xwindow,
1293 gdk_window_add_colormap_windows (GdkWindow *window)
1295 GdkWindow *toplevel;
1296 GdkWindowPrivate *toplevel_private;
1297 GdkWindowPrivate *window_private;
1298 Window *old_windows;
1299 Window *new_windows;
1302 g_return_if_fail (window != NULL);
1304 toplevel = gdk_window_get_toplevel (window);
1305 toplevel_private = (GdkWindowPrivate*) toplevel;
1306 window_private = (GdkWindowPrivate*) window;
1307 if (window_private->destroyed)
1310 if (!XGetWMColormapWindows (toplevel_private->xdisplay,
1311 toplevel_private->xwindow,
1312 &old_windows, &count))
1318 for (i = 0; i < count; i++)
1319 if (old_windows[i] == window_private->xwindow)
1322 new_windows = g_new (Window, count + 1);
1324 for (i = 0; i < count; i++)
1325 new_windows[i] = old_windows[i];
1326 new_windows[count] = window_private->xwindow;
1328 XSetWMColormapWindows (toplevel_private->xdisplay,
1329 toplevel_private->xwindow,
1330 new_windows, count + 1);
1332 g_free (new_windows);
1334 XFree (old_windows);
1338 * This needs the X11 shape extension.
1339 * If not available, simply remove the call to
1340 * XShapeCombineMask. Shaped windows will look
1341 * ugly, but programs still work. Stefan Wille
1344 gdk_window_shape_combine_mask (GdkWindow *window,
1348 GdkWindowPrivate *window_private;
1351 g_return_if_fail (window != NULL);
1353 window_private = (GdkWindowPrivate*) window;
1354 if (window_private->destroyed)
1359 GdkWindowPrivate *pixmap_private;
1361 pixmap_private = (GdkWindowPrivate*) mask;
1362 pixmap = (Pixmap) pixmap_private->xwindow;
1371 XShapeCombineMask (window_private->xdisplay,
1372 window_private->xwindow,
1380 gdk_dnd_drag_addwindow (GdkWindow *window)
1382 GdkWindowPrivate *window_private;
1384 g_return_if_fail (window != NULL);
1386 window_private = (GdkWindowPrivate *) window;
1387 if (window_private->destroyed)
1390 if (window_private->dnd_drag_enabled == 1 && gdk_dnd.drag_really == 0)
1392 gdk_dnd.drag_numwindows++;
1393 gdk_dnd.drag_startwindows = g_realloc (gdk_dnd.drag_startwindows,
1394 gdk_dnd.drag_numwindows
1395 * sizeof(GdkWindow *));
1396 gdk_dnd.drag_startwindows[gdk_dnd.drag_numwindows - 1] = window;
1397 window_private->dnd_drag_accepted = 0;
1400 g_warning ("dnd_really is 1 or drag is not enabled! can't addwindow\n");
1404 gdk_window_dnd_drag_set (GdkWindow *window,
1409 GdkWindowPrivate *window_private;
1412 g_return_if_fail (window != NULL);
1413 window_private = (GdkWindowPrivate *) window;
1414 if (window_private->destroyed)
1417 window_private->dnd_drag_enabled = drag_enable ? 1 : 0;
1421 g_return_if_fail(typelist != NULL);
1423 if (window_private->dnd_drag_data_numtypesavail > 3)
1425 window_private->dnd_drag_data_numtypesavail = numtypes;
1427 window_private->dnd_drag_data_typesavail =
1428 g_realloc (window_private->dnd_drag_data_typesavail,
1429 (numtypes + 1) * sizeof (GdkAtom));
1431 for (i = 0; i < numtypes; i++)
1433 /* Allow blanket use of ALL to get anything... */
1434 if (strcmp (typelist[i], "ALL"))
1435 window_private->dnd_drag_data_typesavail[i] =
1436 gdk_atom_intern (typelist[i], FALSE);
1438 window_private->dnd_drag_data_typesavail[i] = None;
1442 * set our extended type list if we need to
1445 gdk_property_change(window, gdk_dnd.gdk_XdeTypelist,
1446 XA_PRIMARY, 32, GDK_PROP_MODE_REPLACE,
1447 (guchar *)(window_private->dnd_drag_data_typesavail
1448 + (sizeof(GdkAtom) * 3)),
1449 (numtypes - 3) * sizeof(GdkAtom));
1451 gdk_property_delete (window, gdk_dnd.gdk_XdeTypelist);
1455 g_free (window_private->dnd_drag_data_typesavail);
1456 window_private->dnd_drag_data_typesavail = NULL;
1457 window_private->dnd_drag_data_numtypesavail = 0;
1462 gdk_window_dnd_drop_set (GdkWindow *window,
1466 guint8 destructive_op)
1468 GdkWindowPrivate *window_private;
1471 g_return_if_fail (window != NULL);
1472 window_private = (GdkWindowPrivate *) window;
1473 if (window_private->destroyed)
1476 window_private->dnd_drop_enabled = drop_enable ? 1 : 0;
1479 g_return_if_fail(typelist != NULL);
1481 window_private->dnd_drop_data_numtypesavail = numtypes;
1483 window_private->dnd_drop_data_typesavail =
1484 g_realloc (window_private->dnd_drop_data_typesavail,
1485 (numtypes + 1) * sizeof (GdkAtom));
1487 for (i = 0; i < numtypes; i++)
1488 window_private->dnd_drop_data_typesavail[i] =
1489 gdk_atom_intern (typelist[i], FALSE);
1491 window_private->dnd_drop_destructive_op = destructive_op;
1496 * This is used to reply to a GDK_DRAG_REQUEST event
1497 * (which may be generated by XdeRequest or a confirmed drop...
1500 gdk_window_dnd_data_set (GdkWindow *window,
1503 gulong data_numbytes)
1505 GdkWindowPrivate *window_private;
1507 GdkEventDropDataAvailable tmp_ev;
1510 g_return_if_fail (window != NULL);
1511 g_return_if_fail (event != NULL);
1512 g_return_if_fail (data != NULL);
1513 g_return_if_fail (data_numbytes > 0);
1514 g_return_if_fail (event->type == GDK_DRAG_REQUEST);
1516 window_private = (GdkWindowPrivate *) window;
1517 g_return_if_fail (window_private->dnd_drag_accepted != 0);
1518 if (window_private->destroyed)
1521 /* We set the property on our window... */
1522 gdk_property_change (window, window_private->dnd_drag_data_type,
1523 XA_PRIMARY, 8, GDK_PROP_MODE_REPLACE, data,
1525 tmp = gdk_atom_name(window_private->dnd_drag_data_type);
1527 g_print("DnD type %s on window %ld\n", tmp, window_private->xwindow);
1532 * Then we send the event to tell the receiving window that the
1535 tmp_ev.u.allflags = 0;
1536 tmp_ev.u.flags.protocol_version = DND_PROTOCOL_VERSION;
1537 tmp_ev.u.flags.isdrop = event->dragrequest.isdrop;
1539 sev.xclient.type = ClientMessage;
1540 sev.xclient.format = 32;
1541 sev.xclient.window = event->dragrequest.requestor;
1542 sev.xclient.message_type = gdk_dnd.gdk_XdeDataAvailable;
1543 sev.xclient.data.l[0] = window_private->xwindow;
1544 sev.xclient.data.l[1] = tmp_ev.u.allflags;
1545 sev.xclient.data.l[2] = window_private->dnd_drag_data_type;
1547 if (event->dragrequest.isdrop)
1548 sev.xclient.data.l[3] = event->dragrequest.drop_coords.x +
1549 (event->dragrequest.drop_coords.y << 16);
1551 sev.xclient.data.l[3] = 0;
1553 sev.xclient.data.l[4] = 0;
1555 XSendEvent (gdk_display, event->dragrequest.requestor, False,
1560 gdk_window_add_filter (GdkWindow *window,
1561 GdkFilterFunc function,
1564 GdkWindowPrivate *private;
1566 GdkEventFilter *filter;
1568 private = (GdkWindowPrivate*) window;
1569 if (private && private->destroyed)
1573 tmp_list = private->filters;
1575 tmp_list = gdk_default_filters;
1579 filter = (GdkEventFilter *)tmp_list->data;
1580 if ((filter->function == function) && (filter->data == data))
1582 tmp_list = tmp_list->next;
1585 filter = g_new (GdkEventFilter, 1);
1586 filter->function = function;
1587 filter->data = data;
1590 private->filters = g_list_append (private->filters, filter);
1592 gdk_default_filters = g_list_append (gdk_default_filters, filter);
1596 gdk_window_remove_filter (GdkWindow *window,
1597 GdkFilterFunc function,
1600 GdkWindowPrivate *private;
1602 GdkEventFilter *filter;
1604 private = (GdkWindowPrivate*) window;
1607 tmp_list = private->filters;
1609 tmp_list = gdk_default_filters;
1613 filter = (GdkEventFilter *)tmp_list->data;
1614 tmp_list = tmp_list->next;
1616 if ((filter->function == function) && (filter->data == data))
1619 private->filters = g_list_remove_link (private->filters, tmp_list);
1621 gdk_default_filters = g_list_remove_link (gdk_default_filters, tmp_list);
1622 g_list_free_1 (tmp_list);
1631 gdk_window_set_override_redirect(GdkWindow *window,
1632 gboolean override_redirect)
1634 GdkWindowPrivate *private;
1635 XSetWindowAttributes attr;
1637 g_return_if_fail (window != NULL);
1638 private = (GdkWindowPrivate*) window;
1639 if (private->destroyed)
1642 attr.override_redirect = (override_redirect == FALSE)?False:True;
1643 XChangeWindowAttributes(gdk_display,
1644 ((GdkWindowPrivate *)window)->xwindow,
1650 gdk_window_set_icon (GdkWindow *window,
1651 GdkWindow *icon_window,
1656 GdkWindowPrivate *window_private;
1657 GdkWindowPrivate *private;
1659 g_return_if_fail (window != NULL);
1660 window_private = (GdkWindowPrivate*) window;
1661 if (window_private->destroyed)
1666 if (icon_window != NULL)
1668 private = (GdkWindowPrivate *)icon_window;
1669 wm_hints.flags |= IconWindowHint;
1670 wm_hints.icon_window = private->xwindow;
1675 private = (GdkWindowPrivate *)pixmap;
1676 wm_hints.flags |= IconPixmapHint;
1677 wm_hints.icon_pixmap = private->xwindow;
1682 private = (GdkWindowPrivate *)mask;
1683 wm_hints.flags |= IconMaskHint;
1684 wm_hints.icon_mask = private->xwindow;
1687 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1691 gdk_window_set_icon_name (GdkWindow *window,
1694 GdkWindowPrivate *window_private;
1695 XTextProperty property;
1698 g_return_if_fail (window != NULL);
1699 window_private = (GdkWindowPrivate*) window;
1700 if (window_private->destroyed)
1702 res = XmbTextListToTextProperty (window_private->xdisplay,
1703 &name, 1, XStdICCTextStyle,
1707 g_warning("Error converting icon name to text property: %d\n", res);
1711 XSetWMIconName (window_private->xdisplay, window_private->xwindow,
1714 XFree(property.value);
1718 gdk_window_set_group (GdkWindow *window,
1722 GdkWindowPrivate *window_private;
1723 GdkWindowPrivate *private;
1725 g_return_if_fail (window != NULL);
1726 g_return_if_fail (leader != NULL);
1727 window_private = (GdkWindowPrivate*) window;
1728 if (window_private->destroyed)
1731 private = (GdkWindowPrivate *)leader;
1732 wm_hints.flags |= WindowGroupHint;
1733 wm_hints.window_group = private->xwindow;
1735 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1739 gdk_window_set_mwm_hints (GdkWindow *window,
1740 MotifWmHints *new_hints)
1742 static Atom hints_atom = None;
1743 MotifWmHints *hints;
1749 GdkWindowPrivate *window_private;
1751 g_return_if_fail (window != NULL);
1752 window_private = (GdkWindowPrivate*) window;
1753 if (window_private->destroyed)
1757 hints_atom = XInternAtom (window_private->xdisplay,
1758 _XA_MOTIF_WM_HINTS, FALSE);
1760 XGetWindowProperty (window_private->xdisplay, window_private->xwindow,
1761 hints_atom, 0, sizeof(MotifWmHints)/4,
1762 False, AnyPropertyType, &type, &format, &nitems,
1763 &bytes_after, (guchar **)&hints);
1769 if (new_hints->flags & MWM_HINTS_FUNCTIONS)
1771 hints->flags |= MWM_HINTS_FUNCTIONS;
1772 hints->functions = new_hints->functions;
1774 if (new_hints->flags & MWM_HINTS_DECORATIONS)
1776 hints->flags |= MWM_HINTS_DECORATIONS;
1777 hints->decorations = new_hints->decorations;
1781 XChangeProperty (window_private->xdisplay, window_private->xwindow,
1782 hints_atom, hints_atom, 32, PropModeReplace,
1783 (guchar *)hints, sizeof(MotifWmHints)/4);
1785 if (hints != new_hints)
1790 gdk_window_set_decorations (GdkWindow *window,
1791 GdkWMDecoration decorations)
1795 hints.flags = MWM_HINTS_DECORATIONS;
1796 hints.decorations = decorations;
1798 gdk_window_set_mwm_hints (window, &hints);
1802 gdk_window_set_functions (GdkWindow *window,
1803 GdkWMFunction functions)
1807 hints.flags = MWM_HINTS_FUNCTIONS;
1808 hints.functions = functions;
1810 gdk_window_set_mwm_hints (window, &hints);