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.
20 #include <X11/Xutil.h>
21 #include <X11/Xatom.h>
22 #include <X11/extensions/shape.h>
23 #include <netinet/in.h>
25 #include "../config.h"
27 #include "gdkprivate.h"
32 int nevent_masks = 17;
33 int event_mask_table[19] =
37 PointerMotionHintMask,
42 ButtonPressMask | OwnerGrabButtonMask,
43 ButtonReleaseMask | OwnerGrabButtonMask,
57 /* internal function created for and used by gdk_window_xid_at_coords */
59 gdk_window_xid_at(Window base, gint bx, gint by, gint x, gint y,
60 GList *excludes, gboolean excl_child)
63 GdkWindowPrivate *private;
66 Window child=0,parent_win=0,root_win=0;
67 int num,i,ww,wh,wb,wd;
70 window=(GdkWindow*)&gdk_root_parent;
71 private=(GdkWindowPrivate*)window;
72 disp=private->xdisplay;
73 if (!XGetGeometry(disp,base,&root_win,&wx,&wy,&ww,&wh,&wb,&wd))
76 if (!((x>=wx)&&(y>=wy)&&(x<(wx+ww))&&(y<(wy+wh))))
78 if (!XQueryTree(disp,base,&root_win,&parent_win,&list,&num))
84 if ((!excl_child)||(!g_list_find(excludes,(gpointer *)list[i])))
86 if ((child=gdk_window_xid_at(list[i],wx,wy,x,y,excludes,excl_child))!=0)
100 * The following fucntion by The Rasterman <raster@redhat.com>
101 * This function returns the X Window ID in which the x y location is in
102 * (x and y being relative to the root window), excluding any windows listed
103 * in the GList excludes (this is a list of X Window ID's - gpointer being
106 * This is primarily designed for internal gdk use - for DND for example
107 * when using a shaped icon window as the drag object - you exclude the
108 * X Window ID of the "icon" (perhaps more if excludes may be needed) and
109 * You can get back an X Window ID as to what X Window ID is infact under
110 * those X,Y co-ordinates.
113 gdk_window_xid_at_coords(gint x, gint y, GList *excludes, gboolean excl_child)
116 GdkWindowPrivate *private;
119 Window root,child=0,parent_win=0,root_win=0;
124 window=(GdkWindow*)&gdk_root_parent;
125 private=(GdkWindowPrivate*)window;
126 disp=private->xdisplay;
127 root=private->xwindow;
129 num=g_list_length(excludes);
130 if (!XQueryTree(disp,root,&root_win,&parent_win,&list,&num))
137 XWindowAttributes xwa;
139 XGetWindowAttributes (disp, list [i], &xwa);
141 if (xwa.map_state != IsViewable)
144 if (excl_child && g_list_find(excludes,(gpointer *)list[i]))
147 if ((child = gdk_window_xid_at (list[i], 0, 0, x, y, excludes, excl_child)) == 0)
152 if (!g_list_find(excludes,(gpointer *)child))
175 XWindowAttributes xattributes;
178 unsigned int border_width;
182 XGetGeometry (gdk_display, gdk_root_window, &gdk_root_window,
183 &x, &y, &width, &height, &border_width, &depth);
184 XGetWindowAttributes (gdk_display, gdk_root_window, &xattributes);
186 gdk_root_parent.xdisplay = gdk_display;
187 gdk_root_parent.xwindow = gdk_root_window;
188 gdk_root_parent.window_type = GDK_WINDOW_ROOT;
189 gdk_root_parent.window.user_data = NULL;
190 gdk_root_parent.width = width;
191 gdk_root_parent.height = height;
195 gdk_window_new (GdkWindow *parent,
196 GdkWindowAttr *attributes,
197 gint attributes_mask)
200 GdkWindowPrivate *private;
201 GdkWindowPrivate *parent_private;
203 GdkColormap *colormap;
204 Display *parent_display;
207 XSetWindowAttributes xattributes;
208 long xattributes_mask;
209 XSizeHints size_hints;
211 XClassHint *class_hint;
217 g_return_val_if_fail (attributes != NULL, NULL);
220 parent = (GdkWindow*) &gdk_root_parent;
222 parent_private = (GdkWindowPrivate*) parent;
223 if (parent_private->destroyed)
226 xparent = parent_private->xwindow;
227 parent_display = parent_private->xdisplay;
229 private = g_new (GdkWindowPrivate, 1);
230 window = (GdkWindow*) private;
232 private->parent = parent;
233 private->xdisplay = parent_display;
234 private->destroyed = FALSE;
235 private->resize_count = 0;
236 private->ref_count = 1;
237 xattributes_mask = 0;
239 if (attributes_mask & GDK_WA_X)
244 if (attributes_mask & GDK_WA_Y)
251 private->width = (attributes->width > 1) ? (attributes->width) : (1);
252 private->height = (attributes->height > 1) ? (attributes->height) : (1);
253 private->window_type = attributes->window_type;
254 private->extension_events = FALSE;
255 private->dnd_drag_data_type = None;
256 private->dnd_drag_data_typesavail =
257 private->dnd_drop_data_typesavail = NULL;
258 private->dnd_drop_enabled = private->dnd_drag_enabled =
259 private->dnd_drag_accepted = private->dnd_drag_datashow =
260 private->dnd_drop_data_numtypesavail =
261 private->dnd_drag_data_numtypesavail = 0;
262 private->dnd_drag_eventmask = private->dnd_drag_savedeventmask = 0;
264 private->filters = NULL;
266 window->user_data = NULL;
268 if (attributes_mask & GDK_WA_VISUAL)
269 visual = attributes->visual;
271 visual = gdk_visual_get_system ();
272 xvisual = ((GdkVisualPrivate*) visual)->xvisual;
274 xattributes.event_mask = StructureNotifyMask;
275 for (i = 0; i < nevent_masks; i++)
277 if (attributes->event_mask & (1 << (i + 1)))
278 xattributes.event_mask |= event_mask_table[i];
281 if (xattributes.event_mask)
282 xattributes_mask |= CWEventMask;
284 if(attributes_mask & GDK_WA_NOREDIR) {
285 xattributes.override_redirect =
286 (attributes->override_redirect == FALSE)?False:True;
287 xattributes_mask |= CWOverrideRedirect;
289 xattributes.override_redirect = False;
291 if (attributes->wclass == GDK_INPUT_OUTPUT)
294 depth = visual->depth;
296 if (attributes_mask & GDK_WA_COLORMAP)
297 colormap = attributes->colormap;
299 colormap = gdk_colormap_get_system ();
301 xattributes.background_pixel = BlackPixel (gdk_display, gdk_screen);
302 xattributes.border_pixel = BlackPixel (gdk_display, gdk_screen);
303 xattributes_mask |= CWBorderPixel | CWBackPixel;
305 switch (private->window_type)
307 case GDK_WINDOW_TOPLEVEL:
308 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
309 xattributes_mask |= CWColormap;
311 xparent = gdk_root_window;
314 case GDK_WINDOW_CHILD:
315 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
316 xattributes_mask |= CWColormap;
319 case GDK_WINDOW_DIALOG:
320 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
321 xattributes_mask |= CWColormap;
323 xparent = gdk_root_window;
326 case GDK_WINDOW_TEMP:
327 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
328 xattributes_mask |= CWColormap;
330 xparent = gdk_root_window;
332 xattributes.save_under = True;
333 xattributes.override_redirect = True;
334 xattributes.cursor = None;
335 xattributes_mask |= CWSaveUnder | CWOverrideRedirect;
337 case GDK_WINDOW_ROOT:
338 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
340 case GDK_WINDOW_PIXMAP:
341 g_error ("cannot make windows of type GDK_WINDOW_PIXMAP (use gdk_pixmap_new)");
352 private->xwindow = XCreateWindow (private->xdisplay, xparent,
353 x, y, private->width, private->height,
354 0, depth, class, xvisual,
355 xattributes_mask, &xattributes);
356 gdk_window_ref (window);
357 gdk_xid_table_insert (&private->xwindow, window);
359 switch (private->window_type)
361 case GDK_WINDOW_DIALOG:
362 XSetTransientForHint (private->xdisplay, private->xwindow, xparent);
363 case GDK_WINDOW_TOPLEVEL:
364 case GDK_WINDOW_TEMP:
365 XSetWMProtocols (private->xdisplay, private->xwindow, gdk_wm_window_protocols, 2);
367 case GDK_WINDOW_CHILD:
368 if ((attributes->wclass == GDK_INPUT_OUTPUT) &&
369 (colormap != gdk_colormap_get_system ()) &&
370 (colormap != gdk_window_get_colormap (gdk_window_get_toplevel (window))))
372 g_print ("adding colormap window\n");
373 gdk_window_add_colormap_windows (window);
380 size_hints.flags = PSize | PBaseSize;
381 size_hints.width = private->width;
382 size_hints.height = private->height;
383 size_hints.base_width = private->width;
384 size_hints.base_height = private->height;
386 wm_hints.flags = InputHint | StateHint | WindowGroupHint;
387 wm_hints.window_group = gdk_leader_window;
388 wm_hints.input = True;
389 wm_hints.initial_state = NormalState;
391 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
392 XSetWMHints (private->xdisplay, private->xwindow, &wm_hints);
394 if (attributes_mask & GDK_WA_TITLE)
395 title = attributes->title;
397 title = gdk_progname;
399 XmbSetWMProperties (private->xdisplay, private->xwindow,
404 if (attributes_mask & GDK_WA_WMCLASS)
406 class_hint = XAllocClassHint ();
407 class_hint->res_name = attributes->wmclass_name;
408 class_hint->res_class = attributes->wmclass_class;
409 XSetClassHint (private->xdisplay, private->xwindow, class_hint);
413 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
414 (attributes->cursor) :
421 gdk_window_foreign_new (guint32 anid)
424 GdkWindowPrivate *private;
425 XWindowAttributes attrs;
430 private = g_new (GdkWindowPrivate, 1);
431 window = (GdkWindow*) private;
433 XGetWindowAttributes (gdk_display, anid, &attrs);
435 /* FIXME: This is pretty expensive. Maybe the caller should supply
437 XQueryTree (gdk_display, anid, &root, &parent, &children, &nchildren);
439 private->parent = gdk_xid_table_lookup (parent);
441 private->xwindow = anid;
442 private->xdisplay = gdk_display;
443 private->x = attrs.x;
444 private->y = attrs.y;
445 private->width = attrs.width;
446 private->height = attrs.height;
447 private->resize_count = 0;
448 private->ref_count = 1;
449 private->window_type = GDK_WINDOW_FOREIGN;
450 private->destroyed = FALSE;
451 private->extension_events = 0;
454 private->dnd_drag_data_type = None;
455 private->dnd_drag_data_typesavail =
456 private->dnd_drop_data_typesavail = NULL;
457 private->dnd_drop_enabled = private->dnd_drag_enabled =
458 private->dnd_drag_accepted = private->dnd_drag_datashow =
459 private->dnd_drop_data_numtypesavail =
460 private->dnd_drag_data_numtypesavail = 0;
461 private->dnd_drag_eventmask = private->dnd_drag_savedeventmask = 0;
463 private->filters = NULL;
465 window->user_data = NULL;
467 gdk_window_ref (window);
468 gdk_xid_table_insert (&private->xwindow, window);
473 /* Call this function when you want a window and all its children to
474 disappear. When xdestroy is true, a request to destroy the XWindow
475 is sent out. When it is false, it is assumed that the XWindow has
476 been or will be destroyed by destroying some ancestor of this
480 gdk_window_internal_destroy (GdkWindow *window, gboolean xdestroy,
481 gboolean our_destroy)
483 GdkWindowPrivate *private;
484 GdkWindowPrivate *temp_private;
485 GdkWindow *temp_window;
489 g_return_if_fail (window != NULL);
491 private = (GdkWindowPrivate*) window;
493 switch (private->window_type)
495 case GDK_WINDOW_TOPLEVEL:
496 case GDK_WINDOW_CHILD:
497 case GDK_WINDOW_DIALOG:
498 case GDK_WINDOW_TEMP:
499 case GDK_WINDOW_FOREIGN:
500 if (!private->destroyed)
502 if (private->window_type != GDK_WINDOW_FOREIGN)
504 children = gdk_window_get_children (window);
509 temp_window = tmp->data;
512 temp_private = (GdkWindowPrivate*) temp_window;
514 gdk_window_internal_destroy (temp_window, FALSE,
518 g_list_free (children);
521 if (private->extension_events != 0)
522 gdk_input_window_destroy (window);
524 if(private->dnd_drag_data_numtypesavail > 0)
526 g_free (private->dnd_drag_data_typesavail);
527 private->dnd_drag_data_typesavail = NULL;
529 if(private->dnd_drop_data_numtypesavail > 0)
531 g_free (private->dnd_drop_data_typesavail);
532 private->dnd_drop_data_typesavail = NULL;
535 if (private->filters)
537 tmp = private->filters;
545 g_list_free (private->filters);
546 private->filters = NULL;
549 if (private->window_type == GDK_WINDOW_FOREIGN)
551 if (our_destroy && (private->parent != NULL))
553 /* It's somebody elses window, but in our heirarchy,
554 * so reparent it to the root window, and then send
555 * it a delete event, as if we were a WM
557 XClientMessageEvent xevent;
559 gdk_window_hide (window);
560 gdk_window_reparent (window, NULL, 0, 0);
562 xevent.type = ClientMessage;
563 xevent.window = private->xwindow;
564 xevent.message_type = gdk_wm_protocols;
566 xevent.data.l[0] = gdk_wm_delete_window;
567 xevent.data.l[1] = CurrentTime;
569 XSendEvent (private->xdisplay, private->xwindow,
570 False, 0, (XEvent *)&xevent);
574 XDestroyWindow (private->xdisplay, private->xwindow);
576 private->destroyed = TRUE;
580 case GDK_WINDOW_ROOT:
581 g_error ("attempted to destroy root window");
584 case GDK_WINDOW_PIXMAP:
585 g_error ("called gdk_window_destroy on a pixmap (use gdk_pixmap_unref)");
590 /* Like internal_destroy, but also destroys the reference created by
594 gdk_window_destroy (GdkWindow *window)
596 gdk_window_internal_destroy (window, TRUE, TRUE);
597 gdk_window_unref (window);
600 /* This function is called when the XWindow is really gone. */
603 gdk_window_destroy_notify (GdkWindow *window)
605 GdkWindowPrivate *private;
607 g_return_if_fail (window != NULL);
609 private = (GdkWindowPrivate*) window;
611 if (!private->destroyed)
613 if (private->window_type == GDK_WINDOW_FOREIGN)
614 gdk_window_internal_destroy (window, FALSE, FALSE);
616 g_warning ("GdkWindow %#lx unexpectedly destroyed", private->xwindow);
619 gdk_xid_table_remove (private->xwindow);
620 gdk_window_unref (window);
624 gdk_window_ref (GdkWindow *window)
626 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
627 g_return_val_if_fail (window != NULL, NULL);
629 private->ref_count += 1;
634 gdk_window_unref (GdkWindow *window)
636 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
637 g_return_if_fail (window != NULL);
639 private->ref_count -= 1;
640 if (private->ref_count == 0)
642 if (!private->destroyed)
643 g_warning ("losing last reference to undestroyed window\n");
649 gdk_window_show (GdkWindow *window)
651 GdkWindowPrivate *private;
653 g_return_if_fail (window != NULL);
655 private = (GdkWindowPrivate*) window;
656 if (!private->destroyed)
658 XRaiseWindow (private->xdisplay, private->xwindow);
659 XMapWindow (private->xdisplay, private->xwindow);
664 gdk_window_hide (GdkWindow *window)
666 GdkWindowPrivate *private;
668 g_return_if_fail (window != NULL);
670 private = (GdkWindowPrivate*) window;
671 if (!private->destroyed)
672 XUnmapWindow (private->xdisplay, private->xwindow);
676 gdk_window_withdraw (GdkWindow *window)
678 GdkWindowPrivate *private;
680 g_return_if_fail (window != NULL);
682 private = (GdkWindowPrivate*) window;
683 if (!private->destroyed)
684 XWithdrawWindow (private->xdisplay, private->xwindow, 0);
688 gdk_window_move (GdkWindow *window,
692 GdkWindowPrivate *private;
694 g_return_if_fail (window != NULL);
696 private = (GdkWindowPrivate*) window;
697 if (!private->destroyed)
699 XMoveWindow (private->xdisplay, private->xwindow, x, y);
701 if (private->window_type == GDK_WINDOW_CHILD)
710 gdk_window_resize (GdkWindow *window,
714 GdkWindowPrivate *private;
716 g_return_if_fail (window != NULL);
723 private = (GdkWindowPrivate*) window;
725 if (!private->destroyed &&
726 ((private->resize_count > 0) ||
727 (private->width != (guint16) width) ||
728 (private->height != (guint16) height)))
730 XResizeWindow (private->xdisplay, private->xwindow, width, height);
731 private->resize_count += 1;
733 if (private->window_type == GDK_WINDOW_CHILD)
735 private->width = width;
736 private->height = height;
742 gdk_window_move_resize (GdkWindow *window,
748 GdkWindowPrivate *private;
750 g_return_if_fail (window != NULL);
757 private = (GdkWindowPrivate*) window;
758 if (!private->destroyed)
760 XMoveResizeWindow (private->xdisplay, private->xwindow, x, y, width, height);
762 if (private->window_type == GDK_WINDOW_CHILD)
766 private->width = width;
767 private->height = height;
773 gdk_window_reparent (GdkWindow *window,
774 GdkWindow *new_parent,
778 GdkWindowPrivate *window_private;
779 GdkWindowPrivate *parent_private;
781 g_return_if_fail (window != NULL);
784 new_parent = (GdkWindow*) &gdk_root_parent;
786 window_private = (GdkWindowPrivate*) window;
787 parent_private = (GdkWindowPrivate*) new_parent;
789 if (!window_private->destroyed && !parent_private->destroyed)
790 XReparentWindow (window_private->xdisplay,
791 window_private->xwindow,
792 parent_private->xwindow,
797 gdk_window_clear (GdkWindow *window)
799 GdkWindowPrivate *private;
801 g_return_if_fail (window != NULL);
803 private = (GdkWindowPrivate*) window;
805 if (!private->destroyed)
806 XClearWindow (private->xdisplay, private->xwindow);
810 gdk_window_clear_area (GdkWindow *window,
816 GdkWindowPrivate *private;
818 g_return_if_fail (window != NULL);
820 private = (GdkWindowPrivate*) window;
822 if (!private->destroyed)
823 XClearArea (private->xdisplay, private->xwindow,
824 x, y, width, height, False);
828 gdk_window_clear_area_e (GdkWindow *window,
834 GdkWindowPrivate *private;
836 g_return_if_fail (window != NULL);
838 private = (GdkWindowPrivate*) window;
840 if (!private->destroyed)
841 XClearArea (private->xdisplay, private->xwindow,
842 x, y, width, height, True);
846 gdk_window_copy_area (GdkWindow *window,
850 GdkWindow *source_window,
856 GdkWindowPrivate *src_private;
857 GdkWindowPrivate *dest_private;
858 GdkGCPrivate *gc_private;
860 g_return_if_fail (window != NULL);
861 g_return_if_fail (gc != NULL);
863 if (source_window == NULL)
864 source_window = window;
866 src_private = (GdkWindowPrivate*) source_window;
867 dest_private = (GdkWindowPrivate*) window;
868 gc_private = (GdkGCPrivate*) gc;
870 if (!src_private->destroyed && !dest_private->destroyed)
872 XCopyArea (dest_private->xdisplay, src_private->xwindow, dest_private->xwindow,
881 gdk_window_raise (GdkWindow *window)
883 GdkWindowPrivate *private;
885 g_return_if_fail (window != NULL);
887 private = (GdkWindowPrivate*) window;
889 if (!private->destroyed)
890 XRaiseWindow (private->xdisplay, private->xwindow);
894 gdk_window_lower (GdkWindow *window)
896 GdkWindowPrivate *private;
898 g_return_if_fail (window != NULL);
900 private = (GdkWindowPrivate*) window;
902 if (!private->destroyed)
903 XLowerWindow (private->xdisplay, private->xwindow);
907 gdk_window_set_user_data (GdkWindow *window,
910 g_return_if_fail (window != NULL);
912 window->user_data = user_data;
916 gdk_window_set_hints (GdkWindow *window,
925 GdkWindowPrivate *private;
926 XSizeHints size_hints;
928 g_return_if_fail (window != NULL);
930 private = (GdkWindowPrivate*) window;
931 if (private->destroyed)
934 size_hints.flags = 0;
936 if (flags & GDK_HINT_POS)
938 size_hints.flags |= PPosition;
943 if (flags & GDK_HINT_MIN_SIZE)
945 size_hints.flags |= PMinSize;
946 size_hints.min_width = min_width;
947 size_hints.min_height = min_height;
950 if (flags & GDK_HINT_MAX_SIZE)
952 size_hints.flags |= PMaxSize;
953 size_hints.max_width = max_width;
954 size_hints.max_height = max_height;
958 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
962 gdk_window_set_title (GdkWindow *window,
965 GdkWindowPrivate *private;
967 g_return_if_fail (window != NULL);
969 private = (GdkWindowPrivate*) window;
970 if (!private->destroyed)
971 XmbSetWMProperties (private->xdisplay, private->xwindow,
972 title, title, NULL, 0, NULL, NULL, NULL);
976 gdk_window_set_background (GdkWindow *window,
979 GdkWindowPrivate *private;
981 g_return_if_fail (window != NULL);
983 private = (GdkWindowPrivate*) window;
984 if (!private->destroyed)
985 XSetWindowBackground (private->xdisplay, private->xwindow, color->pixel);
989 gdk_window_set_back_pixmap (GdkWindow *window,
991 gint parent_relative)
993 GdkWindowPrivate *window_private;
994 GdkPixmapPrivate *pixmap_private;
997 g_return_if_fail (window != NULL);
999 window_private = (GdkWindowPrivate*) window;
1000 pixmap_private = (GdkPixmapPrivate*) pixmap;
1003 xpixmap = pixmap_private->xwindow;
1007 if (parent_relative)
1008 xpixmap = ParentRelative;
1010 if (!window_private->destroyed)
1011 XSetWindowBackgroundPixmap (window_private->xdisplay, window_private->xwindow, xpixmap);
1015 gdk_window_set_cursor (GdkWindow *window,
1018 GdkWindowPrivate *window_private;
1019 GdkCursorPrivate *cursor_private;
1022 g_return_if_fail (window != NULL);
1024 window_private = (GdkWindowPrivate*) window;
1025 cursor_private = (GdkCursorPrivate*) cursor;
1030 xcursor = cursor_private->xcursor;
1032 if (!window_private->destroyed)
1033 XDefineCursor (window_private->xdisplay, window_private->xwindow, xcursor);
1037 gdk_window_set_colormap (GdkWindow *window,
1038 GdkColormap *colormap)
1040 GdkWindowPrivate *window_private;
1041 GdkColormapPrivate *colormap_private;
1043 g_return_if_fail (window != NULL);
1044 g_return_if_fail (colormap != NULL);
1046 window_private = (GdkWindowPrivate*) window;
1047 colormap_private = (GdkColormapPrivate*) colormap;
1049 if (!window_private->destroyed)
1051 XSetWindowColormap (window_private->xdisplay,
1052 window_private->xwindow,
1053 colormap_private->xcolormap);
1055 if (window_private->window_type != GDK_WINDOW_TOPLEVEL)
1056 gdk_window_add_colormap_windows (window);
1061 gdk_window_get_user_data (GdkWindow *window,
1064 g_return_if_fail (window != NULL);
1066 *data = window->user_data;
1070 gdk_window_get_geometry (GdkWindow *window,
1077 GdkWindowPrivate *window_private;
1083 guint tborder_width;
1087 window = (GdkWindow*) &gdk_root_parent;
1089 window_private = (GdkWindowPrivate*) window;
1091 if (!window_private->destroyed)
1093 XGetGeometry (window_private->xdisplay, window_private->xwindow,
1094 &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
1110 gdk_window_get_position (GdkWindow *window,
1114 GdkWindowPrivate *window_private;
1116 g_return_if_fail (window != NULL);
1118 window_private = (GdkWindowPrivate*) window;
1121 *x = window_private->x;
1123 *y = window_private->y;
1127 gdk_window_get_size (GdkWindow *window,
1131 GdkWindowPrivate *window_private;
1133 g_return_if_fail (window != NULL);
1135 window_private = (GdkWindowPrivate*) window;
1138 *width = window_private->width;
1140 *height = window_private->height;
1144 gdk_window_get_visual (GdkWindow *window)
1146 GdkWindowPrivate *window_private;
1147 XWindowAttributes window_attributes;
1149 g_return_val_if_fail (window != NULL, NULL);
1151 window_private = (GdkWindowPrivate*) window;
1152 while (window_private && (window_private->window_type == GDK_WINDOW_PIXMAP))
1153 window_private = (GdkWindowPrivate*) window_private->parent;
1155 if (window_private && !window_private->destroyed)
1157 XGetWindowAttributes (window_private->xdisplay,
1158 window_private->xwindow,
1159 &window_attributes);
1161 return gdk_visual_lookup (window_attributes.visual);
1168 gdk_window_get_colormap (GdkWindow *window)
1170 GdkWindowPrivate *window_private;
1171 XWindowAttributes window_attributes;
1173 g_return_val_if_fail (window != NULL, NULL);
1175 window_private = (GdkWindowPrivate*) window;
1177 if (!window_private->destroyed)
1179 XGetWindowAttributes (window_private->xdisplay,
1180 window_private->xwindow,
1181 &window_attributes);
1183 return gdk_colormap_lookup (window_attributes.colormap);
1190 gdk_window_get_type (GdkWindow *window)
1192 GdkWindowPrivate *window_private;
1194 g_return_val_if_fail (window != NULL, (GdkWindowType) -1);
1196 window_private = (GdkWindowPrivate*) window;
1197 return window_private->window_type;
1201 gdk_window_get_origin (GdkWindow *window,
1205 GdkWindowPrivate *private;
1210 g_return_val_if_fail (window != NULL, 0);
1212 private = (GdkWindowPrivate*) window;
1214 if (!private->destroyed)
1216 return_val = XTranslateCoordinates (private->xdisplay,
1234 gdk_window_get_pointer (GdkWindow *window,
1237 GdkModifierType *mask)
1239 GdkWindowPrivate *private;
1240 GdkWindow *return_val;
1248 window = (GdkWindow*) &gdk_root_parent;
1250 private = (GdkWindowPrivate*) window;
1253 if (!private->destroyed &&
1254 XQueryPointer (private->xdisplay, private->xwindow, &root, &child,
1255 &rootx, &rooty, &winx, &winy, &xmask))
1259 if (mask) *mask = xmask;
1262 return_val = gdk_window_lookup (child);
1269 gdk_window_get_parent (GdkWindow *window)
1271 g_return_val_if_fail (window != NULL, NULL);
1273 return ((GdkWindowPrivate*) window)->parent;
1277 gdk_window_get_toplevel (GdkWindow *window)
1279 GdkWindowPrivate *private;
1281 g_return_val_if_fail (window != NULL, NULL);
1283 private = (GdkWindowPrivate*) window;
1285 while (private->window_type == GDK_WINDOW_CHILD)
1287 window = ((GdkWindowPrivate*) window)->parent;
1288 private = (GdkWindowPrivate*) window;
1295 gdk_window_get_children (GdkWindow *window)
1297 GdkWindowPrivate *private;
1303 unsigned int nchildren;
1306 g_return_val_if_fail (window != NULL, NULL);
1308 private = (GdkWindowPrivate*) window;
1309 if (private->destroyed)
1312 XQueryTree (private->xdisplay, private->xwindow,
1313 &root, &parent, &xchildren, &nchildren);
1319 for (i = 0; i < nchildren; i++)
1321 child = gdk_window_lookup (xchildren[i]);
1323 children = g_list_prepend (children, child);
1333 gdk_window_get_events (GdkWindow *window)
1335 GdkWindowPrivate *private;
1336 XWindowAttributes attrs;
1337 GdkEventMask event_mask;
1340 g_return_val_if_fail (window != NULL, 0);
1342 private = (GdkWindowPrivate*) window;
1343 if (private->destroyed)
1346 XGetWindowAttributes (gdk_display, private->xwindow,
1350 for (i = 0; i < nevent_masks; i++)
1352 if (attrs.your_event_mask & event_mask_table[i])
1353 event_mask |= 1 << (i + 1);
1360 gdk_window_set_events (GdkWindow *window,
1361 GdkEventMask event_mask)
1363 GdkWindowPrivate *private;
1367 g_return_if_fail (window != NULL);
1369 private = (GdkWindowPrivate*) window;
1370 if (private->destroyed)
1373 xevent_mask = StructureNotifyMask;
1374 for (i = 0; i < nevent_masks; i++)
1376 if (event_mask & (1 << (i + 1)))
1377 xevent_mask |= event_mask_table[i];
1380 XSelectInput (gdk_display, private->xwindow,
1385 gdk_window_add_colormap_windows (GdkWindow *window)
1387 GdkWindow *toplevel;
1388 GdkWindowPrivate *toplevel_private;
1389 GdkWindowPrivate *window_private;
1390 Window *old_windows;
1391 Window *new_windows;
1394 g_return_if_fail (window != NULL);
1396 toplevel = gdk_window_get_toplevel (window);
1397 toplevel_private = (GdkWindowPrivate*) toplevel;
1398 window_private = (GdkWindowPrivate*) window;
1399 if (window_private->destroyed)
1402 if (!XGetWMColormapWindows (toplevel_private->xdisplay,
1403 toplevel_private->xwindow,
1404 &old_windows, &count))
1410 for (i = 0; i < count; i++)
1411 if (old_windows[i] == window_private->xwindow)
1414 new_windows = g_new (Window, count + 1);
1416 for (i = 0; i < count; i++)
1417 new_windows[i] = old_windows[i];
1418 new_windows[count] = window_private->xwindow;
1420 XSetWMColormapWindows (toplevel_private->xdisplay,
1421 toplevel_private->xwindow,
1422 new_windows, count + 1);
1424 g_free (new_windows);
1426 XFree (old_windows);
1430 * This needs the X11 shape extension.
1431 * If not available, simply remove the call to
1432 * XShapeCombineMask. Shaped windows will look
1433 * ugly, but programs still work. Stefan Wille
1436 gdk_window_shape_combine_mask (GdkWindow *window,
1440 GdkWindowPrivate *window_private;
1443 g_return_if_fail (window != NULL);
1445 /* This is needed, according to raster */
1446 gdk_window_set_override_redirect(window, TRUE);
1448 window_private = (GdkWindowPrivate*) window;
1449 if (window_private->destroyed)
1454 GdkWindowPrivate *pixmap_private;
1456 pixmap_private = (GdkWindowPrivate*) mask;
1457 pixmap = (Pixmap) pixmap_private->xwindow;
1466 XShapeCombineMask (window_private->xdisplay,
1467 window_private->xwindow,
1475 gdk_dnd_drag_addwindow (GdkWindow *window)
1477 GdkWindowPrivate *window_private;
1479 g_return_if_fail (window != NULL);
1481 window_private = (GdkWindowPrivate *) window;
1482 if (window_private->destroyed)
1485 if (window_private->dnd_drag_enabled == 1 && gdk_dnd.drag_really == 0)
1487 gdk_dnd.drag_numwindows++;
1488 gdk_dnd.drag_startwindows = g_realloc (gdk_dnd.drag_startwindows,
1489 gdk_dnd.drag_numwindows
1490 * sizeof(GdkWindow *));
1491 gdk_dnd.drag_startwindows[gdk_dnd.drag_numwindows - 1] = window;
1492 window_private->dnd_drag_accepted = 0;
1495 g_warning ("dnd_really is 1 or drag is not enabled! can't addwindow\n");
1499 gdk_window_dnd_drag_set (GdkWindow *window,
1504 GdkWindowPrivate *window_private;
1507 g_return_if_fail (window != NULL);
1508 window_private = (GdkWindowPrivate *) window;
1509 if (window_private->destroyed)
1512 window_private->dnd_drag_enabled = drag_enable ? 1 : 0;
1516 g_return_if_fail(typelist != NULL);
1518 if (window_private->dnd_drag_data_numtypesavail > 3)
1520 window_private->dnd_drag_data_numtypesavail = numtypes;
1522 window_private->dnd_drag_data_typesavail =
1523 g_realloc (window_private->dnd_drag_data_typesavail,
1524 (numtypes + 1) * sizeof (GdkAtom));
1526 for (i = 0; i < numtypes; i++)
1528 /* Allow blanket use of ALL to get anything... */
1529 if (strcmp (typelist[i], "ALL"))
1530 window_private->dnd_drag_data_typesavail[i] =
1531 gdk_atom_intern (typelist[i], FALSE);
1533 window_private->dnd_drag_data_typesavail[i] = None;
1537 * set our extended type list if we need to
1540 gdk_property_change(window, gdk_dnd.gdk_XdeTypelist,
1541 XA_PRIMARY, 32, GDK_PROP_MODE_REPLACE,
1542 (guchar *)(window_private->dnd_drag_data_typesavail
1543 + (sizeof(GdkAtom) * 3)),
1544 (numtypes - 3) * sizeof(GdkAtom));
1546 gdk_property_delete (window, gdk_dnd.gdk_XdeTypelist);
1550 g_free (window_private->dnd_drag_data_typesavail);
1551 window_private->dnd_drag_data_typesavail = NULL;
1552 window_private->dnd_drag_data_numtypesavail = 0;
1557 gdk_window_dnd_drop_set (GdkWindow *window,
1561 guint8 destructive_op)
1563 GdkWindowPrivate *window_private;
1566 g_return_if_fail (window != NULL);
1567 window_private = (GdkWindowPrivate *) window;
1568 if (window_private->destroyed)
1571 window_private->dnd_drop_enabled = drop_enable ? 1 : 0;
1574 g_return_if_fail(typelist != NULL);
1576 window_private->dnd_drop_data_numtypesavail = numtypes;
1578 window_private->dnd_drop_data_typesavail =
1579 g_realloc (window_private->dnd_drop_data_typesavail,
1580 (numtypes + 1) * sizeof (GdkAtom));
1582 for (i = 0; i < numtypes; i++)
1583 window_private->dnd_drop_data_typesavail[i] =
1584 gdk_atom_intern (typelist[i], FALSE);
1586 window_private->dnd_drop_destructive_op = destructive_op;
1591 * This is used to reply to a GDK_DRAG_REQUEST event
1592 * (which may be generated by XdeRequest or a confirmed drop...
1595 gdk_window_dnd_data_set (GdkWindow *window,
1598 gulong data_numbytes)
1600 GdkWindowPrivate *window_private;
1602 GdkEventDropDataAvailable tmp_ev;
1605 g_return_if_fail (window != NULL);
1606 g_return_if_fail (event != NULL);
1607 g_return_if_fail (data != NULL);
1608 g_return_if_fail (data_numbytes > 0);
1609 g_return_if_fail (event->type == GDK_DRAG_REQUEST);
1611 window_private = (GdkWindowPrivate *) window;
1612 g_return_if_fail (window_private->dnd_drag_accepted != 0);
1613 if (window_private->destroyed)
1616 /* We set the property on our window... */
1617 gdk_property_change (window, window_private->dnd_drag_data_type,
1618 XA_PRIMARY, 8, GDK_PROP_MODE_REPLACE, data,
1620 tmp = gdk_atom_name(window_private->dnd_drag_data_type);
1622 g_print("DnD type %s on window %ld\n", tmp, window_private->xwindow);
1627 * Then we send the event to tell the receiving window that the
1630 tmp_ev.u.allflags = 0;
1631 tmp_ev.u.flags.protocol_version = DND_PROTOCOL_VERSION;
1632 tmp_ev.u.flags.isdrop = event->dragrequest.isdrop;
1634 sev.xclient.type = ClientMessage;
1635 sev.xclient.format = 32;
1636 sev.xclient.window = event->dragrequest.requestor;
1637 sev.xclient.message_type = gdk_dnd.gdk_XdeDataAvailable;
1638 sev.xclient.data.l[0] = window_private->xwindow;
1639 sev.xclient.data.l[1] = tmp_ev.u.allflags;
1640 sev.xclient.data.l[2] = window_private->dnd_drag_data_type;
1642 if (event->dragrequest.isdrop)
1643 sev.xclient.data.l[3] = event->dragrequest.drop_coords.x +
1644 (event->dragrequest.drop_coords.y << 16);
1646 sev.xclient.data.l[3] = 0;
1648 sev.xclient.data.l[4] = event->dragrequest.timestamp;
1650 if (!gdk_send_xevent (event->dragrequest.requestor, False,
1651 StructureNotifyMask, &sev))
1652 GDK_NOTE (DND, g_print("Sending XdeDataAvailable to %#x failed\n",
1653 event->dragrequest.requestor));
1658 gdk_window_add_filter (GdkWindow *window,
1659 GdkFilterFunc function,
1662 GdkWindowPrivate *private;
1664 GdkEventFilter *filter;
1666 private = (GdkWindowPrivate*) window;
1667 if (private && private->destroyed)
1671 tmp_list = private->filters;
1673 tmp_list = gdk_default_filters;
1677 filter = (GdkEventFilter *)tmp_list->data;
1678 if ((filter->function == function) && (filter->data == data))
1680 tmp_list = tmp_list->next;
1683 filter = g_new (GdkEventFilter, 1);
1684 filter->function = function;
1685 filter->data = data;
1688 private->filters = g_list_append (private->filters, filter);
1690 gdk_default_filters = g_list_append (gdk_default_filters, filter);
1694 gdk_window_remove_filter (GdkWindow *window,
1695 GdkFilterFunc function,
1698 GdkWindowPrivate *private;
1700 GdkEventFilter *filter;
1702 private = (GdkWindowPrivate*) window;
1705 tmp_list = private->filters;
1707 tmp_list = gdk_default_filters;
1711 filter = (GdkEventFilter *)tmp_list->data;
1712 tmp_list = tmp_list->next;
1714 if ((filter->function == function) && (filter->data == data))
1717 private->filters = g_list_remove_link (private->filters, tmp_list);
1719 gdk_default_filters = g_list_remove_link (gdk_default_filters, tmp_list);
1720 g_list_free_1 (tmp_list);
1729 gdk_window_set_override_redirect(GdkWindow *window,
1730 gboolean override_redirect)
1732 GdkWindowPrivate *private;
1733 XSetWindowAttributes attr;
1735 g_return_if_fail (window != NULL);
1736 private = (GdkWindowPrivate*) window;
1737 if (private->destroyed)
1740 attr.override_redirect = (override_redirect == FALSE)?False:True;
1741 XChangeWindowAttributes(gdk_display,
1742 ((GdkWindowPrivate *)window)->xwindow,
1748 gdk_window_set_icon (GdkWindow *window,
1749 GdkWindow *icon_window,
1754 GdkWindowPrivate *window_private;
1755 GdkWindowPrivate *private;
1757 g_return_if_fail (window != NULL);
1758 window_private = (GdkWindowPrivate*) window;
1759 if (window_private->destroyed)
1764 if (icon_window != NULL)
1766 private = (GdkWindowPrivate *)icon_window;
1767 wm_hints.flags |= IconWindowHint;
1768 wm_hints.icon_window = private->xwindow;
1773 private = (GdkWindowPrivate *)pixmap;
1774 wm_hints.flags |= IconPixmapHint;
1775 wm_hints.icon_pixmap = private->xwindow;
1780 private = (GdkWindowPrivate *)mask;
1781 wm_hints.flags |= IconMaskHint;
1782 wm_hints.icon_mask = private->xwindow;
1785 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1789 gdk_window_set_icon_name (GdkWindow *window,
1792 GdkWindowPrivate *window_private;
1793 XTextProperty property;
1796 g_return_if_fail (window != NULL);
1797 window_private = (GdkWindowPrivate*) window;
1798 if (window_private->destroyed)
1800 res = XmbTextListToTextProperty (window_private->xdisplay,
1801 &name, 1, XStdICCTextStyle,
1805 g_warning("Error converting icon name to text property: %d\n", res);
1809 XSetWMIconName (window_private->xdisplay, window_private->xwindow,
1812 XFree(property.value);
1816 gdk_window_set_group (GdkWindow *window,
1820 GdkWindowPrivate *window_private;
1821 GdkWindowPrivate *private;
1823 g_return_if_fail (window != NULL);
1824 g_return_if_fail (leader != NULL);
1825 window_private = (GdkWindowPrivate*) window;
1826 if (window_private->destroyed)
1829 private = (GdkWindowPrivate *)leader;
1830 wm_hints.flags = WindowGroupHint;
1831 wm_hints.window_group = private->xwindow;
1833 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1837 gdk_window_set_mwm_hints (GdkWindow *window,
1838 MotifWmHints *new_hints)
1840 static Atom hints_atom = None;
1841 MotifWmHints *hints;
1847 GdkWindowPrivate *window_private;
1849 g_return_if_fail (window != NULL);
1850 window_private = (GdkWindowPrivate*) window;
1851 if (window_private->destroyed)
1855 hints_atom = XInternAtom (window_private->xdisplay,
1856 _XA_MOTIF_WM_HINTS, FALSE);
1858 XGetWindowProperty (window_private->xdisplay, window_private->xwindow,
1859 hints_atom, 0, sizeof(MotifWmHints)/4,
1860 False, AnyPropertyType, &type, &format, &nitems,
1861 &bytes_after, (guchar **)&hints);
1867 if (new_hints->flags & MWM_HINTS_FUNCTIONS)
1869 hints->flags |= MWM_HINTS_FUNCTIONS;
1870 hints->functions = new_hints->functions;
1872 if (new_hints->flags & MWM_HINTS_DECORATIONS)
1874 hints->flags |= MWM_HINTS_DECORATIONS;
1875 hints->decorations = new_hints->decorations;
1879 XChangeProperty (window_private->xdisplay, window_private->xwindow,
1880 hints_atom, hints_atom, 32, PropModeReplace,
1881 (guchar *)hints, sizeof(MotifWmHints)/4);
1883 if (hints != new_hints)
1888 gdk_window_set_decorations (GdkWindow *window,
1889 GdkWMDecoration decorations)
1893 hints.flags = MWM_HINTS_DECORATIONS;
1894 hints.decorations = decorations;
1896 gdk_window_set_mwm_hints (window, &hints);
1900 gdk_window_set_functions (GdkWindow *window,
1901 GdkWMFunction functions)
1905 hints.flags = MWM_HINTS_FUNCTIONS;
1906 hints.functions = functions;
1908 gdk_window_set_mwm_hints (window, &hints);