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))
82 if ((child=gdk_window_xid_at(list[i],wx,wy,x,y))!=0)
84 printf("-> %x\n",child);
96 * The following fucntion by The Rasterman <raster@redhat.com>
97 * This function returns the X Window ID in which the x y location is in
98 * (x and y being relative to the root window), excluding any windows listed
99 * in the GList excludes (this is a list of X Window ID's - gpointer being
102 * This is primarily designed for internal gdk use - for DND for example
103 * when using a shaped icon window as the drag object - you exclude the
104 * X Window ID of the "icon" (perhaps more if excludes may be needed) and
105 * You can get back an X Window ID as to what X Window ID is infact under
106 * those X,Y co-ordinates.
109 gdk_window_xid_at_coords(gint x, gint y, GList *excludes)
112 GdkWindowPrivate *private;
115 Window root,child=0,parent_win=0,root_win=0;
119 window=(GdkWindow*)&gdk_root_parent;
120 private=(GdkWindowPrivate*)window;
121 disp=private->xdisplay;
122 root=private->xwindow;
124 num=g_list_length(excludes);
125 printf("coords %i %i\n",x,y);
128 gl=g_list_nth(excludes,i);
129 printf("excludes %x\n",gl->data);
131 if (!XQueryTree(disp,root,&root_win,&parent_win,&list,&num))
133 printf("Mouse in %x\n",root);
140 if ((child=gdk_window_xid_at(list[i],0,0,x,y))!=0)
142 printf("%x\n",child);
145 if (!g_list_find(excludes,(gpointer)child))
149 printf("Mouse in %x\n",child);
157 printf("Mouse in %x\n",child);
166 printf("Mouse in %x\n",root);
173 XWindowAttributes xattributes;
176 unsigned int border_width;
180 XGetGeometry (gdk_display, gdk_root_window, &gdk_root_window,
181 &x, &y, &width, &height, &border_width, &depth);
182 XGetWindowAttributes (gdk_display, gdk_root_window, &xattributes);
184 gdk_root_parent.xdisplay = gdk_display;
185 gdk_root_parent.xwindow = gdk_root_window;
186 gdk_root_parent.window_type = GDK_WINDOW_ROOT;
187 gdk_root_parent.window.user_data = NULL;
188 gdk_root_parent.width = width;
189 gdk_root_parent.height = height;
193 gdk_window_new (GdkWindow *parent,
194 GdkWindowAttr *attributes,
195 gint attributes_mask)
198 GdkWindowPrivate *private;
199 GdkWindowPrivate *parent_private;
201 GdkColormap *colormap;
202 Display *parent_display;
205 XSetWindowAttributes xattributes;
206 long xattributes_mask;
207 XSizeHints size_hints;
209 XClassHint *class_hint;
215 g_return_val_if_fail (attributes != NULL, NULL);
218 parent = (GdkWindow*) &gdk_root_parent;
220 parent_private = (GdkWindowPrivate*) parent;
221 if (parent_private->destroyed)
224 xparent = parent_private->xwindow;
225 parent_display = parent_private->xdisplay;
227 private = g_new (GdkWindowPrivate, 1);
228 window = (GdkWindow*) private;
230 private->parent = parent;
231 private->xdisplay = parent_display;
232 private->destroyed = FALSE;
233 private->resize_count = 0;
234 private->ref_count = 1;
235 xattributes_mask = 0;
237 if (attributes_mask & GDK_WA_X)
242 if (attributes_mask & GDK_WA_Y)
249 private->width = (attributes->width > 1) ? (attributes->width) : (1);
250 private->height = (attributes->height > 1) ? (attributes->height) : (1);
251 private->window_type = attributes->window_type;
252 private->extension_events = FALSE;
253 private->dnd_drag_data_type = None;
254 private->dnd_drag_data_typesavail =
255 private->dnd_drop_data_typesavail = NULL;
256 private->dnd_drop_enabled = private->dnd_drag_enabled =
257 private->dnd_drag_accepted = private->dnd_drag_datashow =
258 private->dnd_drop_data_numtypesavail =
259 private->dnd_drag_data_numtypesavail = 0;
260 private->dnd_drag_eventmask = private->dnd_drag_savedeventmask = 0;
262 private->filters = NULL;
264 window->user_data = NULL;
266 if (attributes_mask & GDK_WA_VISUAL)
267 visual = attributes->visual;
269 visual = gdk_visual_get_system ();
270 xvisual = ((GdkVisualPrivate*) visual)->xvisual;
272 xattributes.event_mask = StructureNotifyMask;
273 for (i = 0; i < nevent_masks; i++)
275 if (attributes->event_mask & (1 << (i + 1)))
276 xattributes.event_mask |= event_mask_table[i];
279 if (xattributes.event_mask)
280 xattributes_mask |= CWEventMask;
282 if(attributes_mask & GDK_WA_NOREDIR) {
283 xattributes.override_redirect =
284 (attributes->override_redirect == FALSE)?False:True;
285 xattributes_mask |= CWOverrideRedirect;
287 xattributes.override_redirect = False;
289 if (attributes->wclass == GDK_INPUT_OUTPUT)
292 depth = visual->depth;
294 if (attributes_mask & GDK_WA_COLORMAP)
295 colormap = attributes->colormap;
297 colormap = gdk_colormap_get_system ();
299 xattributes.background_pixel = BlackPixel (gdk_display, gdk_screen);
300 xattributes.border_pixel = BlackPixel (gdk_display, gdk_screen);
301 xattributes_mask |= CWBorderPixel | CWBackPixel;
303 switch (private->window_type)
305 case GDK_WINDOW_TOPLEVEL:
306 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
307 xattributes_mask |= CWColormap;
309 xparent = gdk_root_window;
312 case GDK_WINDOW_CHILD:
313 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
314 xattributes_mask |= CWColormap;
317 case GDK_WINDOW_DIALOG:
318 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
319 xattributes_mask |= CWColormap;
321 xparent = gdk_root_window;
324 case GDK_WINDOW_TEMP:
325 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
326 xattributes_mask |= CWColormap;
328 xparent = gdk_root_window;
330 xattributes.save_under = True;
331 xattributes.override_redirect = True;
332 xattributes.cursor = None;
333 xattributes_mask |= CWSaveUnder | CWOverrideRedirect;
335 case GDK_WINDOW_ROOT:
336 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
338 case GDK_WINDOW_PIXMAP:
339 g_error ("cannot make windows of type GDK_WINDOW_PIXMAP (use gdk_pixmap_new)");
350 private->xwindow = XCreateWindow (private->xdisplay, xparent,
351 x, y, private->width, private->height,
352 0, depth, class, xvisual,
353 xattributes_mask, &xattributes);
354 gdk_window_ref (window);
355 gdk_xid_table_insert (&private->xwindow, window);
357 switch (private->window_type)
359 case GDK_WINDOW_DIALOG:
360 XSetTransientForHint (private->xdisplay, private->xwindow, xparent);
361 case GDK_WINDOW_TOPLEVEL:
362 case GDK_WINDOW_TEMP:
363 XSetWMProtocols (private->xdisplay, private->xwindow, gdk_wm_window_protocols, 2);
365 case GDK_WINDOW_CHILD:
366 if ((attributes->wclass == GDK_INPUT_OUTPUT) &&
367 (colormap != gdk_colormap_get_system ()) &&
368 (colormap != gdk_window_get_colormap (gdk_window_get_toplevel (window))))
370 g_print ("adding colormap window\n");
371 gdk_window_add_colormap_windows (window);
378 size_hints.flags = PSize | PBaseSize;
379 size_hints.width = private->width;
380 size_hints.height = private->height;
381 size_hints.base_width = private->width;
382 size_hints.base_height = private->height;
384 wm_hints.flags = InputHint | StateHint | WindowGroupHint;
385 wm_hints.window_group = gdk_leader_window;
386 wm_hints.input = True;
387 wm_hints.initial_state = NormalState;
389 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
390 XSetWMHints (private->xdisplay, private->xwindow, &wm_hints);
392 if (attributes_mask & GDK_WA_TITLE)
393 title = attributes->title;
395 title = gdk_progname;
397 XmbSetWMProperties (private->xdisplay, private->xwindow,
402 if (attributes_mask & GDK_WA_WMCLASS)
404 class_hint = XAllocClassHint ();
405 class_hint->res_name = attributes->wmclass_name;
406 class_hint->res_class = attributes->wmclass_class;
407 XSetClassHint (private->xdisplay, private->xwindow, class_hint);
411 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
412 (attributes->cursor) :
419 gdk_window_foreign_new (guint32 anid)
422 GdkWindowPrivate *private;
423 XWindowAttributes attrs;
425 private = g_new (GdkWindowPrivate, 1);
426 window = (GdkWindow*) private;
428 XGetWindowAttributes (gdk_display, anid, &attrs);
430 private->parent = NULL;
431 private->xwindow = anid;
432 private->xdisplay = gdk_display;
433 private->x = attrs.x;
434 private->y = attrs.y;
435 private->width = attrs.width;
436 private->height = attrs.height;
437 private->resize_count = 0;
438 private->ref_count = 1;
439 if (anid == attrs.root)
440 private->window_type = GDK_WINDOW_ROOT;
442 private->window_type = GDK_WINDOW_TOPLEVEL;
443 /* the above is probably wrong, but it may not be worth the extra
444 X call to get it right */
446 private->destroyed = FALSE;
447 private->extension_events = 0;
448 private->filters = NULL;
450 window->user_data = NULL;
452 gdk_window_ref (window);
453 gdk_xid_table_insert (&private->xwindow, window);
458 /* Call this function when you want a window and all its children to
459 disappear. When xdestroy is true, a request to destroy the XWindow
460 is sent out. When it is false, it is assumed that the XWindow has
461 been or will be destroyed by destroying some ancestor of this
465 gdk_window_internal_destroy (GdkWindow *window, int xdestroy)
467 GdkWindowPrivate *private;
468 GdkWindowPrivate *temp_private;
469 GdkWindow *temp_window;
473 g_return_if_fail (window != NULL);
475 private = (GdkWindowPrivate*) window;
477 switch (private->window_type)
479 case GDK_WINDOW_TOPLEVEL:
480 case GDK_WINDOW_CHILD:
481 case GDK_WINDOW_DIALOG:
482 case GDK_WINDOW_TEMP:
483 if (!private->destroyed)
485 children = gdk_window_get_children (window);
490 temp_window = tmp->data;
493 temp_private = (GdkWindowPrivate*) temp_window;
495 gdk_window_internal_destroy (temp_window, FALSE);
498 g_list_free (children);
500 if (private->extension_events != 0)
501 gdk_input_window_destroy (window);
503 if(private->dnd_drag_data_numtypesavail > 0)
505 g_free (private->dnd_drag_data_typesavail);
506 private->dnd_drag_data_typesavail = NULL;
508 if(private->dnd_drop_data_numtypesavail > 0)
510 g_free (private->dnd_drop_data_typesavail);
511 private->dnd_drop_data_typesavail = NULL;
515 XDestroyWindow (private->xdisplay, private->xwindow);
516 private->destroyed = TRUE;
520 case GDK_WINDOW_ROOT:
521 g_error ("attempted to destroy root window");
524 case GDK_WINDOW_PIXMAP:
525 g_error ("called gdk_window_destroy on a pixmap (use gdk_pixmap_unref)");
530 /* Like internal_destroy, but also destroys the reference created by
534 gdk_window_destroy (GdkWindow *window)
536 gdk_window_internal_destroy (window, TRUE);
537 gdk_window_unref (window);
540 /* This function is called when the XWindow is really gone. */
543 gdk_window_destroy_notify (GdkWindow *window)
545 GdkWindowPrivate *private;
547 g_return_if_fail (window != NULL);
549 private = (GdkWindowPrivate*) window;
551 gdk_xid_table_remove (private->xwindow);
552 gdk_window_unref (window);
556 gdk_window_ref (GdkWindow *window)
558 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
559 g_return_val_if_fail (window != NULL, NULL);
561 private->ref_count += 1;
566 gdk_window_unref (GdkWindow *window)
568 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
569 g_return_if_fail (window != NULL);
571 private->ref_count -= 1;
572 if (private->ref_count == 0)
574 if (!private->destroyed)
575 g_warning ("losing last reference to undestroyed window\n");
581 gdk_window_show (GdkWindow *window)
583 GdkWindowPrivate *private;
585 g_return_if_fail (window != NULL);
587 private = (GdkWindowPrivate*) window;
588 if (!private->destroyed)
590 XRaiseWindow (private->xdisplay, private->xwindow);
591 XMapWindow (private->xdisplay, private->xwindow);
596 gdk_window_hide (GdkWindow *window)
598 GdkWindowPrivate *private;
600 g_return_if_fail (window != NULL);
602 private = (GdkWindowPrivate*) window;
603 if (!private->destroyed)
604 XUnmapWindow (private->xdisplay, private->xwindow);
608 gdk_window_withdraw (GdkWindow *window)
610 GdkWindowPrivate *private;
612 g_return_if_fail (window != NULL);
614 private = (GdkWindowPrivate*) window;
615 if (!private->destroyed)
616 XWithdrawWindow (private->xdisplay, private->xwindow, 0);
620 gdk_window_move (GdkWindow *window,
624 GdkWindowPrivate *private;
626 g_return_if_fail (window != NULL);
628 private = (GdkWindowPrivate*) window;
629 if (!private->destroyed)
631 XMoveWindow (private->xdisplay, private->xwindow, x, y);
633 if (private->window_type == GDK_WINDOW_CHILD)
642 gdk_window_resize (GdkWindow *window,
646 GdkWindowPrivate *private;
648 g_return_if_fail (window != NULL);
655 private = (GdkWindowPrivate*) window;
657 if (!private->destroyed &&
658 ((private->resize_count > 0) ||
659 (private->width != (guint16) width) ||
660 (private->height != (guint16) height)))
662 XResizeWindow (private->xdisplay, private->xwindow, width, height);
663 private->resize_count += 1;
665 if (private->window_type == GDK_WINDOW_CHILD)
667 private->width = width;
668 private->height = height;
674 gdk_window_move_resize (GdkWindow *window,
680 GdkWindowPrivate *private;
682 g_return_if_fail (window != NULL);
689 private = (GdkWindowPrivate*) window;
690 if (!private->destroyed)
692 XMoveResizeWindow (private->xdisplay, private->xwindow, x, y, width, height);
694 if (private->window_type == GDK_WINDOW_CHILD)
698 private->width = width;
699 private->height = height;
705 gdk_window_reparent (GdkWindow *window,
706 GdkWindow *new_parent,
710 GdkWindowPrivate *window_private;
711 GdkWindowPrivate *parent_private;
713 g_return_if_fail (window != NULL);
716 new_parent = (GdkWindow*) &gdk_root_parent;
718 window_private = (GdkWindowPrivate*) window;
719 parent_private = (GdkWindowPrivate*) new_parent;
721 if (!window_private->destroyed && !parent_private->destroyed)
722 XReparentWindow (window_private->xdisplay,
723 window_private->xwindow,
724 parent_private->xwindow,
729 gdk_window_clear (GdkWindow *window)
731 GdkWindowPrivate *private;
733 g_return_if_fail (window != NULL);
735 private = (GdkWindowPrivate*) window;
737 if (!private->destroyed)
738 XClearWindow (private->xdisplay, private->xwindow);
742 gdk_window_clear_area (GdkWindow *window,
748 GdkWindowPrivate *private;
750 g_return_if_fail (window != NULL);
752 private = (GdkWindowPrivate*) window;
754 if (!private->destroyed)
755 XClearArea (private->xdisplay, private->xwindow,
756 x, y, width, height, False);
760 gdk_window_clear_area_e (GdkWindow *window,
766 GdkWindowPrivate *private;
768 g_return_if_fail (window != NULL);
770 private = (GdkWindowPrivate*) window;
772 if (!private->destroyed)
773 XClearArea (private->xdisplay, private->xwindow,
774 x, y, width, height, True);
778 gdk_window_copy_area (GdkWindow *window,
782 GdkWindow *source_window,
788 GdkWindowPrivate *src_private;
789 GdkWindowPrivate *dest_private;
790 GdkGCPrivate *gc_private;
792 g_return_if_fail (window != NULL);
793 g_return_if_fail (gc != NULL);
795 if (source_window == NULL)
796 source_window = window;
798 src_private = (GdkWindowPrivate*) source_window;
799 dest_private = (GdkWindowPrivate*) window;
800 gc_private = (GdkGCPrivate*) gc;
802 if (!src_private->destroyed && !dest_private->destroyed)
804 XCopyArea (dest_private->xdisplay, src_private->xwindow, dest_private->xwindow,
813 gdk_window_raise (GdkWindow *window)
815 GdkWindowPrivate *private;
817 g_return_if_fail (window != NULL);
819 private = (GdkWindowPrivate*) window;
821 if (!private->destroyed)
822 XRaiseWindow (private->xdisplay, private->xwindow);
826 gdk_window_lower (GdkWindow *window)
828 GdkWindowPrivate *private;
830 g_return_if_fail (window != NULL);
832 private = (GdkWindowPrivate*) window;
834 if (!private->destroyed)
835 XLowerWindow (private->xdisplay, private->xwindow);
839 gdk_window_set_user_data (GdkWindow *window,
842 g_return_if_fail (window != NULL);
844 window->user_data = user_data;
848 gdk_window_set_hints (GdkWindow *window,
857 GdkWindowPrivate *private;
858 XSizeHints size_hints;
860 g_return_if_fail (window != NULL);
862 private = (GdkWindowPrivate*) window;
863 if (private->destroyed)
866 size_hints.flags = 0;
868 if (flags & GDK_HINT_POS)
870 size_hints.flags |= PPosition;
875 if (flags & GDK_HINT_MIN_SIZE)
877 size_hints.flags |= PMinSize;
878 size_hints.min_width = min_width;
879 size_hints.min_height = min_height;
882 if (flags & GDK_HINT_MAX_SIZE)
884 size_hints.flags |= PMaxSize;
885 size_hints.max_width = max_width;
886 size_hints.max_height = max_height;
890 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
894 gdk_window_set_title (GdkWindow *window,
897 GdkWindowPrivate *private;
899 g_return_if_fail (window != NULL);
901 private = (GdkWindowPrivate*) window;
902 if (!private->destroyed)
903 XmbSetWMProperties (private->xdisplay, private->xwindow,
904 title, title, NULL, 0, NULL, NULL, NULL);
908 gdk_window_set_background (GdkWindow *window,
911 GdkWindowPrivate *private;
913 g_return_if_fail (window != NULL);
915 private = (GdkWindowPrivate*) window;
916 if (!private->destroyed)
917 XSetWindowBackground (private->xdisplay, private->xwindow, color->pixel);
921 gdk_window_set_back_pixmap (GdkWindow *window,
923 gint parent_relative)
925 GdkWindowPrivate *window_private;
926 GdkPixmapPrivate *pixmap_private;
929 g_return_if_fail (window != NULL);
931 window_private = (GdkWindowPrivate*) window;
932 pixmap_private = (GdkPixmapPrivate*) pixmap;
935 xpixmap = pixmap_private->xwindow;
940 xpixmap = ParentRelative;
942 if (!window_private->destroyed)
943 XSetWindowBackgroundPixmap (window_private->xdisplay, window_private->xwindow, xpixmap);
947 gdk_window_set_cursor (GdkWindow *window,
950 GdkWindowPrivate *window_private;
951 GdkCursorPrivate *cursor_private;
954 g_return_if_fail (window != NULL);
956 window_private = (GdkWindowPrivate*) window;
957 cursor_private = (GdkCursorPrivate*) cursor;
962 xcursor = cursor_private->xcursor;
964 if (!window_private->destroyed)
965 XDefineCursor (window_private->xdisplay, window_private->xwindow, xcursor);
969 gdk_window_set_colormap (GdkWindow *window,
970 GdkColormap *colormap)
972 GdkWindowPrivate *window_private;
973 GdkColormapPrivate *colormap_private;
975 g_return_if_fail (window != NULL);
976 g_return_if_fail (colormap != NULL);
978 window_private = (GdkWindowPrivate*) window;
979 colormap_private = (GdkColormapPrivate*) colormap;
981 if (!window_private->destroyed)
983 XSetWindowColormap (window_private->xdisplay,
984 window_private->xwindow,
985 colormap_private->xcolormap);
987 if (window_private->window_type != GDK_WINDOW_TOPLEVEL)
988 gdk_window_add_colormap_windows (window);
993 gdk_window_get_user_data (GdkWindow *window,
996 g_return_if_fail (window != NULL);
998 *data = window->user_data;
1002 gdk_window_get_geometry (GdkWindow *window,
1009 GdkWindowPrivate *window_private;
1015 guint tborder_width;
1019 window = (GdkWindow*) &gdk_root_parent;
1021 window_private = (GdkWindowPrivate*) window;
1023 if (!window_private->destroyed)
1025 XGetGeometry (window_private->xdisplay, window_private->xwindow,
1026 &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
1042 gdk_window_get_position (GdkWindow *window,
1046 GdkWindowPrivate *window_private;
1048 g_return_if_fail (window != NULL);
1050 window_private = (GdkWindowPrivate*) window;
1053 *x = window_private->x;
1055 *y = window_private->y;
1059 gdk_window_get_size (GdkWindow *window,
1063 GdkWindowPrivate *window_private;
1065 g_return_if_fail (window != NULL);
1067 window_private = (GdkWindowPrivate*) window;
1070 *width = window_private->width;
1072 *height = window_private->height;
1076 gdk_window_get_visual (GdkWindow *window)
1078 GdkWindowPrivate *window_private;
1079 XWindowAttributes window_attributes;
1081 g_return_val_if_fail (window != NULL, NULL);
1083 window_private = (GdkWindowPrivate*) window;
1084 while (window_private && (window_private->window_type == GDK_WINDOW_PIXMAP))
1085 window_private = (GdkWindowPrivate*) window_private->parent;
1087 if (window_private && !window_private->destroyed)
1089 XGetWindowAttributes (window_private->xdisplay,
1090 window_private->xwindow,
1091 &window_attributes);
1093 return gdk_visual_lookup (window_attributes.visual);
1100 gdk_window_get_colormap (GdkWindow *window)
1102 GdkWindowPrivate *window_private;
1103 XWindowAttributes window_attributes;
1105 g_return_val_if_fail (window != NULL, NULL);
1107 window_private = (GdkWindowPrivate*) window;
1109 if (!window_private->destroyed)
1111 XGetWindowAttributes (window_private->xdisplay,
1112 window_private->xwindow,
1113 &window_attributes);
1115 return gdk_colormap_lookup (window_attributes.colormap);
1122 gdk_window_get_type (GdkWindow *window)
1124 GdkWindowPrivate *window_private;
1126 g_return_val_if_fail (window != NULL, (GdkWindowType) -1);
1128 window_private = (GdkWindowPrivate*) window;
1129 return window_private->window_type;
1133 gdk_window_get_origin (GdkWindow *window,
1137 GdkWindowPrivate *private;
1142 g_return_val_if_fail (window != NULL, 0);
1144 private = (GdkWindowPrivate*) window;
1146 if (!private->destroyed)
1148 return_val = XTranslateCoordinates (private->xdisplay,
1166 gdk_window_get_pointer (GdkWindow *window,
1169 GdkModifierType *mask)
1171 GdkWindowPrivate *private;
1172 GdkWindow *return_val;
1180 window = (GdkWindow*) &gdk_root_parent;
1182 private = (GdkWindowPrivate*) window;
1185 if (!private->destroyed &&
1186 XQueryPointer (private->xdisplay, private->xwindow, &root, &child,
1187 &rootx, &rooty, &winx, &winy, &xmask))
1191 if (mask) *mask = xmask;
1194 return_val = gdk_window_lookup (child);
1201 gdk_window_get_parent (GdkWindow *window)
1203 g_return_val_if_fail (window != NULL, NULL);
1205 return ((GdkWindowPrivate*) window)->parent;
1209 gdk_window_get_toplevel (GdkWindow *window)
1211 GdkWindowPrivate *private;
1213 g_return_val_if_fail (window != NULL, NULL);
1215 private = (GdkWindowPrivate*) window;
1217 while (private->window_type == GDK_WINDOW_CHILD)
1219 window = ((GdkWindowPrivate*) window)->parent;
1220 private = (GdkWindowPrivate*) window;
1227 gdk_window_get_children (GdkWindow *window)
1229 GdkWindowPrivate *private;
1235 unsigned int nchildren;
1238 g_return_val_if_fail (window != NULL, NULL);
1240 private = (GdkWindowPrivate*) window;
1241 if (private->destroyed)
1244 XQueryTree (private->xdisplay, private->xwindow,
1245 &root, &parent, &xchildren, &nchildren);
1251 for (i = 0; i < nchildren; i++)
1253 child = gdk_window_lookup (xchildren[i]);
1255 children = g_list_prepend (children, child);
1265 gdk_window_get_events (GdkWindow *window)
1267 GdkWindowPrivate *private;
1268 XWindowAttributes attrs;
1269 GdkEventMask event_mask;
1272 g_return_val_if_fail (window != NULL, 0);
1274 private = (GdkWindowPrivate*) window;
1275 if (private->destroyed)
1278 XGetWindowAttributes (gdk_display, private->xwindow,
1282 for (i = 0; i < nevent_masks; i++)
1284 if (attrs.your_event_mask & event_mask_table[i])
1285 event_mask |= 1 << (i + 1);
1292 gdk_window_set_events (GdkWindow *window,
1293 GdkEventMask event_mask)
1295 GdkWindowPrivate *private;
1299 g_return_if_fail (window != NULL);
1301 private = (GdkWindowPrivate*) window;
1302 if (private->destroyed)
1305 xevent_mask = StructureNotifyMask;
1306 for (i = 0; i < nevent_masks; i++)
1308 if (event_mask & (1 << (i + 1)))
1309 xevent_mask |= event_mask_table[i];
1312 XSelectInput (gdk_display, private->xwindow,
1317 gdk_window_add_colormap_windows (GdkWindow *window)
1319 GdkWindow *toplevel;
1320 GdkWindowPrivate *toplevel_private;
1321 GdkWindowPrivate *window_private;
1322 Window *old_windows;
1323 Window *new_windows;
1326 g_return_if_fail (window != NULL);
1328 toplevel = gdk_window_get_toplevel (window);
1329 toplevel_private = (GdkWindowPrivate*) toplevel;
1330 window_private = (GdkWindowPrivate*) window;
1331 if (window_private->destroyed)
1334 if (!XGetWMColormapWindows (toplevel_private->xdisplay,
1335 toplevel_private->xwindow,
1336 &old_windows, &count))
1342 for (i = 0; i < count; i++)
1343 if (old_windows[i] == window_private->xwindow)
1346 new_windows = g_new (Window, count + 1);
1348 for (i = 0; i < count; i++)
1349 new_windows[i] = old_windows[i];
1350 new_windows[count] = window_private->xwindow;
1352 XSetWMColormapWindows (toplevel_private->xdisplay,
1353 toplevel_private->xwindow,
1354 new_windows, count + 1);
1356 g_free (new_windows);
1358 XFree (old_windows);
1362 * This needs the X11 shape extension.
1363 * If not available, simply remove the call to
1364 * XShapeCombineMask. Shaped windows will look
1365 * ugly, but programs still work. Stefan Wille
1368 gdk_window_shape_combine_mask (GdkWindow *window,
1372 GdkWindowPrivate *window_private;
1375 g_return_if_fail (window != NULL);
1377 window_private = (GdkWindowPrivate*) window;
1378 if (window_private->destroyed)
1383 GdkWindowPrivate *pixmap_private;
1385 pixmap_private = (GdkWindowPrivate*) mask;
1386 pixmap = (Pixmap) pixmap_private->xwindow;
1395 XShapeCombineMask (window_private->xdisplay,
1396 window_private->xwindow,
1404 gdk_dnd_drag_addwindow (GdkWindow *window)
1406 GdkWindowPrivate *window_private;
1408 g_return_if_fail (window != NULL);
1410 window_private = (GdkWindowPrivate *) window;
1411 if (window_private->destroyed)
1414 if (window_private->dnd_drag_enabled == 1 && gdk_dnd.drag_really == 0)
1416 gdk_dnd.drag_numwindows++;
1417 gdk_dnd.drag_startwindows = g_realloc (gdk_dnd.drag_startwindows,
1418 gdk_dnd.drag_numwindows
1419 * sizeof(GdkWindow *));
1420 gdk_dnd.drag_startwindows[gdk_dnd.drag_numwindows - 1] = window;
1421 window_private->dnd_drag_accepted = 0;
1424 g_warning ("dnd_really is 1 or drag is not enabled! can't addwindow\n");
1428 gdk_window_dnd_drag_set (GdkWindow *window,
1433 GdkWindowPrivate *window_private;
1436 g_return_if_fail (window != NULL);
1437 window_private = (GdkWindowPrivate *) window;
1438 if (window_private->destroyed)
1441 window_private->dnd_drag_enabled = drag_enable ? 1 : 0;
1445 g_return_if_fail(typelist != NULL);
1447 if (window_private->dnd_drag_data_numtypesavail > 3)
1449 window_private->dnd_drag_data_numtypesavail = numtypes;
1451 window_private->dnd_drag_data_typesavail =
1452 g_realloc (window_private->dnd_drag_data_typesavail,
1453 (numtypes + 1) * sizeof (GdkAtom));
1455 for (i = 0; i < numtypes; i++)
1457 /* Allow blanket use of ALL to get anything... */
1458 if (strcmp (typelist[i], "ALL"))
1459 window_private->dnd_drag_data_typesavail[i] =
1460 gdk_atom_intern (typelist[i], FALSE);
1462 window_private->dnd_drag_data_typesavail[i] = None;
1466 * set our extended type list if we need to
1469 gdk_property_change(window, gdk_dnd.gdk_XdeTypelist,
1470 XA_PRIMARY, 32, GDK_PROP_MODE_REPLACE,
1471 (guchar *)(window_private->dnd_drag_data_typesavail
1472 + (sizeof(GdkAtom) * 3)),
1473 (numtypes - 3) * sizeof(GdkAtom));
1475 gdk_property_delete (window, gdk_dnd.gdk_XdeTypelist);
1479 g_free (window_private->dnd_drag_data_typesavail);
1480 window_private->dnd_drag_data_typesavail = NULL;
1481 window_private->dnd_drag_data_numtypesavail = 0;
1486 gdk_window_dnd_drop_set (GdkWindow *window,
1490 guint8 destructive_op)
1492 GdkWindowPrivate *window_private;
1495 g_return_if_fail (window != NULL);
1496 window_private = (GdkWindowPrivate *) window;
1497 if (window_private->destroyed)
1500 window_private->dnd_drop_enabled = drop_enable ? 1 : 0;
1503 g_return_if_fail(typelist != NULL);
1505 window_private->dnd_drop_data_numtypesavail = numtypes;
1507 window_private->dnd_drop_data_typesavail =
1508 g_realloc (window_private->dnd_drop_data_typesavail,
1509 (numtypes + 1) * sizeof (GdkAtom));
1511 for (i = 0; i < numtypes; i++)
1512 window_private->dnd_drop_data_typesavail[i] =
1513 gdk_atom_intern (typelist[i], FALSE);
1515 window_private->dnd_drop_destructive_op = destructive_op;
1520 * This is used to reply to a GDK_DRAG_REQUEST event
1521 * (which may be generated by XdeRequest or a confirmed drop...
1524 gdk_window_dnd_data_set (GdkWindow *window,
1527 gulong data_numbytes)
1529 GdkWindowPrivate *window_private;
1531 GdkEventDropDataAvailable tmp_ev;
1534 g_return_if_fail (window != NULL);
1535 g_return_if_fail (event != NULL);
1536 g_return_if_fail (data != NULL);
1537 g_return_if_fail (data_numbytes > 0);
1538 g_return_if_fail (event->type == GDK_DRAG_REQUEST);
1540 window_private = (GdkWindowPrivate *) window;
1541 g_return_if_fail (window_private->dnd_drag_accepted != 0);
1542 if (window_private->destroyed)
1545 /* We set the property on our window... */
1546 gdk_property_change (window, window_private->dnd_drag_data_type,
1547 XA_PRIMARY, 8, GDK_PROP_MODE_REPLACE, data,
1549 tmp = gdk_atom_name(window_private->dnd_drag_data_type);
1551 g_print("DnD type %s on window %ld\n", tmp, window_private->xwindow);
1556 * Then we send the event to tell the receiving window that the
1559 tmp_ev.u.allflags = 0;
1560 tmp_ev.u.flags.protocol_version = DND_PROTOCOL_VERSION;
1561 tmp_ev.u.flags.isdrop = event->dragrequest.isdrop;
1563 sev.xclient.type = ClientMessage;
1564 sev.xclient.format = 32;
1565 sev.xclient.window = event->dragrequest.requestor;
1566 sev.xclient.message_type = gdk_dnd.gdk_XdeDataAvailable;
1567 sev.xclient.data.l[0] = window_private->xwindow;
1568 sev.xclient.data.l[1] = tmp_ev.u.allflags;
1569 sev.xclient.data.l[2] = window_private->dnd_drag_data_type;
1571 if (event->dragrequest.isdrop)
1572 sev.xclient.data.l[3] = event->dragrequest.drop_coords.x +
1573 (event->dragrequest.drop_coords.y << 16);
1575 sev.xclient.data.l[3] = 0;
1577 sev.xclient.data.l[4] = event->dragrequest.timestamp;
1579 if (!gdk_send_xevent (event->dragrequest.requestor, False,
1581 GDK_NOTE (DND, g_print("Sending XdeDataAvailable to %#x failed\n",
1582 event->dragrequest.requestor));
1587 gdk_window_add_filter (GdkWindow *window,
1588 GdkFilterFunc function,
1591 GdkWindowPrivate *private;
1593 GdkEventFilter *filter;
1595 private = (GdkWindowPrivate*) window;
1596 if (private && private->destroyed)
1600 tmp_list = private->filters;
1602 tmp_list = gdk_default_filters;
1606 filter = (GdkEventFilter *)tmp_list->data;
1607 if ((filter->function == function) && (filter->data == data))
1609 tmp_list = tmp_list->next;
1612 filter = g_new (GdkEventFilter, 1);
1613 filter->function = function;
1614 filter->data = data;
1617 private->filters = g_list_append (private->filters, filter);
1619 gdk_default_filters = g_list_append (gdk_default_filters, filter);
1623 gdk_window_remove_filter (GdkWindow *window,
1624 GdkFilterFunc function,
1627 GdkWindowPrivate *private;
1629 GdkEventFilter *filter;
1631 private = (GdkWindowPrivate*) window;
1634 tmp_list = private->filters;
1636 tmp_list = gdk_default_filters;
1640 filter = (GdkEventFilter *)tmp_list->data;
1641 tmp_list = tmp_list->next;
1643 if ((filter->function == function) && (filter->data == data))
1646 private->filters = g_list_remove_link (private->filters, tmp_list);
1648 gdk_default_filters = g_list_remove_link (gdk_default_filters, tmp_list);
1649 g_list_free_1 (tmp_list);
1658 gdk_window_set_override_redirect(GdkWindow *window,
1659 gboolean override_redirect)
1661 GdkWindowPrivate *private;
1662 XSetWindowAttributes attr;
1664 g_return_if_fail (window != NULL);
1665 private = (GdkWindowPrivate*) window;
1666 if (private->destroyed)
1669 attr.override_redirect = (override_redirect == FALSE)?False:True;
1670 XChangeWindowAttributes(gdk_display,
1671 ((GdkWindowPrivate *)window)->xwindow,
1677 gdk_window_set_icon (GdkWindow *window,
1678 GdkWindow *icon_window,
1683 GdkWindowPrivate *window_private;
1684 GdkWindowPrivate *private;
1686 g_return_if_fail (window != NULL);
1687 window_private = (GdkWindowPrivate*) window;
1688 if (window_private->destroyed)
1693 if (icon_window != NULL)
1695 private = (GdkWindowPrivate *)icon_window;
1696 wm_hints.flags |= IconWindowHint;
1697 wm_hints.icon_window = private->xwindow;
1702 private = (GdkWindowPrivate *)pixmap;
1703 wm_hints.flags |= IconPixmapHint;
1704 wm_hints.icon_pixmap = private->xwindow;
1709 private = (GdkWindowPrivate *)mask;
1710 wm_hints.flags |= IconMaskHint;
1711 wm_hints.icon_mask = private->xwindow;
1714 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1718 gdk_window_set_icon_name (GdkWindow *window,
1721 GdkWindowPrivate *window_private;
1722 XTextProperty property;
1725 g_return_if_fail (window != NULL);
1726 window_private = (GdkWindowPrivate*) window;
1727 if (window_private->destroyed)
1729 res = XmbTextListToTextProperty (window_private->xdisplay,
1730 &name, 1, XStdICCTextStyle,
1734 g_warning("Error converting icon name to text property: %d\n", res);
1738 XSetWMIconName (window_private->xdisplay, window_private->xwindow,
1741 XFree(property.value);
1745 gdk_window_set_group (GdkWindow *window,
1749 GdkWindowPrivate *window_private;
1750 GdkWindowPrivate *private;
1752 g_return_if_fail (window != NULL);
1753 g_return_if_fail (leader != NULL);
1754 window_private = (GdkWindowPrivate*) window;
1755 if (window_private->destroyed)
1758 private = (GdkWindowPrivate *)leader;
1759 wm_hints.flags |= WindowGroupHint;
1760 wm_hints.window_group = private->xwindow;
1762 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1766 gdk_window_set_mwm_hints (GdkWindow *window,
1767 MotifWmHints *new_hints)
1769 static Atom hints_atom = None;
1770 MotifWmHints *hints;
1776 GdkWindowPrivate *window_private;
1778 g_return_if_fail (window != NULL);
1779 window_private = (GdkWindowPrivate*) window;
1780 if (window_private->destroyed)
1784 hints_atom = XInternAtom (window_private->xdisplay,
1785 _XA_MOTIF_WM_HINTS, FALSE);
1787 XGetWindowProperty (window_private->xdisplay, window_private->xwindow,
1788 hints_atom, 0, sizeof(MotifWmHints)/4,
1789 False, AnyPropertyType, &type, &format, &nitems,
1790 &bytes_after, (guchar **)&hints);
1796 if (new_hints->flags & MWM_HINTS_FUNCTIONS)
1798 hints->flags |= MWM_HINTS_FUNCTIONS;
1799 hints->functions = new_hints->functions;
1801 if (new_hints->flags & MWM_HINTS_DECORATIONS)
1803 hints->flags |= MWM_HINTS_DECORATIONS;
1804 hints->decorations = new_hints->decorations;
1808 XChangeProperty (window_private->xdisplay, window_private->xwindow,
1809 hints_atom, hints_atom, 32, PropModeReplace,
1810 (guchar *)hints, sizeof(MotifWmHints)/4);
1812 if (hints != new_hints)
1817 gdk_window_set_decorations (GdkWindow *window,
1818 GdkWMDecoration decorations)
1822 hints.flags = MWM_HINTS_DECORATIONS;
1823 hints.decorations = decorations;
1825 gdk_window_set_mwm_hints (window, &hints);
1829 gdk_window_set_functions (GdkWindow *window,
1830 GdkWMFunction functions)
1834 hints.flags = MWM_HINTS_FUNCTIONS;
1835 hints.functions = functions;
1837 gdk_window_set_mwm_hints (window, &hints);