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,
59 GList *excludes, gboolean excl_child)
62 GdkWindowPrivate *private;
65 Window child=0,parent_win=0,root_win=0;
66 unsigned int num,i,ww,wh,wb,wd;
69 window=(GdkWindow*)&gdk_root_parent;
70 private=(GdkWindowPrivate*)window;
71 disp=private->xdisplay;
72 if (!XGetGeometry(disp,base,&root_win,&wx,&wy,&ww,&wh,&wb,&wd))
75 if (!((x>=wx)&&(y>=wy)&&(x<(wx+ww))&&(y<(wy+wh))))
77 if (!XQueryTree(disp,base,&root_win,&parent_win,&list,&num))
83 if ((!excl_child)||(!g_list_find(excludes,(gpointer *)list[i])))
85 if ((child=gdk_window_xid_at(list[i],wx,wy,x,y,excludes,excl_child))!=0)
99 * The following fucntion by The Rasterman <raster@redhat.com>
100 * This function returns the X Window ID in which the x y location is in
101 * (x and y being relative to the root window), excluding any windows listed
102 * in the GList excludes (this is a list of X Window ID's - gpointer being
105 * This is primarily designed for internal gdk use - for DND for example
106 * when using a shaped icon window as the drag object - you exclude the
107 * X Window ID of the "icon" (perhaps more if excludes may be needed) and
108 * You can get back an X Window ID as to what X Window ID is infact under
109 * those X,Y co-ordinates.
112 gdk_window_xid_at_coords(gint x, gint y, GList *excludes, gboolean excl_child)
115 GdkWindowPrivate *private;
118 Window root,child=0,parent_win=0,root_win=0;
122 window=(GdkWindow*)&gdk_root_parent;
123 private=(GdkWindowPrivate*)window;
124 disp=private->xdisplay;
125 root=private->xwindow;
127 num=g_list_length(excludes);
128 if (!XQueryTree(disp,root,&root_win,&parent_win,&list,&num))
134 if ((!excl_child)||(!g_list_find(excludes,(gpointer *)list[i])))
136 if ((child=gdk_window_xid_at(list[i],0,0,x,y,excludes,excl_child))!=0)
140 if (!g_list_find(excludes,(gpointer *)child))
166 XWindowAttributes xattributes;
169 unsigned int border_width;
173 XGetGeometry (gdk_display, gdk_root_window, &gdk_root_window,
174 &x, &y, &width, &height, &border_width, &depth);
175 XGetWindowAttributes (gdk_display, gdk_root_window, &xattributes);
177 gdk_root_parent.xdisplay = gdk_display;
178 gdk_root_parent.xwindow = gdk_root_window;
179 gdk_root_parent.window_type = GDK_WINDOW_ROOT;
180 gdk_root_parent.window.user_data = NULL;
181 gdk_root_parent.width = width;
182 gdk_root_parent.height = height;
186 gdk_window_new (GdkWindow *parent,
187 GdkWindowAttr *attributes,
188 gint attributes_mask)
191 GdkWindowPrivate *private;
192 GdkWindowPrivate *parent_private;
194 GdkColormap *colormap;
195 Display *parent_display;
198 XSetWindowAttributes xattributes;
199 long xattributes_mask;
200 XSizeHints size_hints;
202 XClassHint *class_hint;
208 g_return_val_if_fail (attributes != NULL, NULL);
211 parent = (GdkWindow*) &gdk_root_parent;
213 parent_private = (GdkWindowPrivate*) parent;
214 if (parent_private->destroyed)
217 xparent = parent_private->xwindow;
218 parent_display = parent_private->xdisplay;
220 private = g_new (GdkWindowPrivate, 1);
221 window = (GdkWindow*) private;
223 private->parent = parent;
224 private->xdisplay = parent_display;
225 private->destroyed = FALSE;
226 private->resize_count = 0;
227 private->ref_count = 1;
228 xattributes_mask = 0;
230 if (attributes_mask & GDK_WA_X)
235 if (attributes_mask & GDK_WA_Y)
242 private->width = (attributes->width > 1) ? (attributes->width) : (1);
243 private->height = (attributes->height > 1) ? (attributes->height) : (1);
244 private->window_type = attributes->window_type;
245 private->extension_events = FALSE;
246 private->dnd_drag_data_type = None;
247 private->dnd_drag_data_typesavail =
248 private->dnd_drop_data_typesavail = NULL;
249 private->dnd_drop_enabled = private->dnd_drag_enabled =
250 private->dnd_drag_accepted = private->dnd_drag_datashow =
251 private->dnd_drop_data_numtypesavail =
252 private->dnd_drag_data_numtypesavail = 0;
253 private->dnd_drag_eventmask = private->dnd_drag_savedeventmask = 0;
255 private->filters = NULL;
257 window->user_data = NULL;
259 if (attributes_mask & GDK_WA_VISUAL)
260 visual = attributes->visual;
262 visual = gdk_visual_get_system ();
263 xvisual = ((GdkVisualPrivate*) visual)->xvisual;
265 xattributes.event_mask = StructureNotifyMask;
266 for (i = 0; i < nevent_masks; i++)
268 if (attributes->event_mask & (1 << (i + 1)))
269 xattributes.event_mask |= event_mask_table[i];
272 if (xattributes.event_mask)
273 xattributes_mask |= CWEventMask;
275 if(attributes_mask & GDK_WA_NOREDIR) {
276 xattributes.override_redirect =
277 (attributes->override_redirect == FALSE)?False:True;
278 xattributes_mask |= CWOverrideRedirect;
280 xattributes.override_redirect = False;
282 if (attributes->wclass == GDK_INPUT_OUTPUT)
285 depth = visual->depth;
287 if (attributes_mask & GDK_WA_COLORMAP)
288 colormap = attributes->colormap;
290 colormap = gdk_colormap_get_system ();
292 xattributes.background_pixel = BlackPixel (gdk_display, gdk_screen);
293 xattributes.border_pixel = BlackPixel (gdk_display, gdk_screen);
294 xattributes_mask |= CWBorderPixel | CWBackPixel;
296 switch (private->window_type)
298 case GDK_WINDOW_TOPLEVEL:
299 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
300 xattributes_mask |= CWColormap;
302 xparent = gdk_root_window;
305 case GDK_WINDOW_CHILD:
306 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
307 xattributes_mask |= CWColormap;
310 case GDK_WINDOW_DIALOG:
311 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
312 xattributes_mask |= CWColormap;
314 xparent = gdk_root_window;
317 case GDK_WINDOW_TEMP:
318 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
319 xattributes_mask |= CWColormap;
321 xparent = gdk_root_window;
323 xattributes.save_under = True;
324 xattributes.override_redirect = True;
325 xattributes.cursor = None;
326 xattributes_mask |= CWSaveUnder | CWOverrideRedirect;
328 case GDK_WINDOW_ROOT:
329 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
331 case GDK_WINDOW_PIXMAP:
332 g_error ("cannot make windows of type GDK_WINDOW_PIXMAP (use gdk_pixmap_new)");
343 private->xwindow = XCreateWindow (private->xdisplay, xparent,
344 x, y, private->width, private->height,
345 0, depth, class, xvisual,
346 xattributes_mask, &xattributes);
347 gdk_window_ref (window);
348 gdk_xid_table_insert (&private->xwindow, window);
350 switch (private->window_type)
352 case GDK_WINDOW_DIALOG:
353 XSetTransientForHint (private->xdisplay, private->xwindow, xparent);
354 case GDK_WINDOW_TOPLEVEL:
355 case GDK_WINDOW_TEMP:
356 XSetWMProtocols (private->xdisplay, private->xwindow, gdk_wm_window_protocols, 2);
358 case GDK_WINDOW_CHILD:
359 if ((attributes->wclass == GDK_INPUT_OUTPUT) &&
360 (colormap != gdk_colormap_get_system ()) &&
361 (colormap != gdk_window_get_colormap (gdk_window_get_toplevel (window))))
363 g_print ("adding colormap window\n");
364 gdk_window_add_colormap_windows (window);
371 size_hints.flags = PSize | PBaseSize;
372 size_hints.width = private->width;
373 size_hints.height = private->height;
374 size_hints.base_width = private->width;
375 size_hints.base_height = private->height;
377 wm_hints.flags = InputHint | StateHint | WindowGroupHint;
378 wm_hints.window_group = gdk_leader_window;
379 wm_hints.input = True;
380 wm_hints.initial_state = NormalState;
382 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
383 XSetWMHints (private->xdisplay, private->xwindow, &wm_hints);
385 if (attributes_mask & GDK_WA_TITLE)
386 title = attributes->title;
388 title = gdk_progname;
390 XmbSetWMProperties (private->xdisplay, private->xwindow,
395 if (attributes_mask & GDK_WA_WMCLASS)
397 class_hint = XAllocClassHint ();
398 class_hint->res_name = attributes->wmclass_name;
399 class_hint->res_class = attributes->wmclass_class;
400 XSetClassHint (private->xdisplay, private->xwindow, class_hint);
404 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
405 (attributes->cursor) :
412 gdk_window_foreign_new (guint32 anid)
415 GdkWindowPrivate *private;
416 XWindowAttributes attrs;
418 private = g_new (GdkWindowPrivate, 1);
419 window = (GdkWindow*) private;
421 XGetWindowAttributes (gdk_display, anid, &attrs);
423 private->parent = NULL;
424 private->xwindow = anid;
425 private->xdisplay = gdk_display;
426 private->x = attrs.x;
427 private->y = attrs.y;
428 private->width = attrs.width;
429 private->height = attrs.height;
430 private->resize_count = 0;
431 private->ref_count = 1;
432 if (anid == attrs.root)
433 private->window_type = GDK_WINDOW_ROOT;
435 private->window_type = GDK_WINDOW_TOPLEVEL;
436 /* the above is probably wrong, but it may not be worth the extra
437 X call to get it right */
439 private->destroyed = FALSE;
440 private->extension_events = 0;
441 private->filters = NULL;
443 window->user_data = NULL;
445 gdk_window_ref (window);
446 gdk_xid_table_insert (&private->xwindow, window);
451 /* Call this function when you want a window and all its children to
452 disappear. When xdestroy is true, a request to destroy the XWindow
453 is sent out. When it is false, it is assumed that the XWindow has
454 been or will be destroyed by destroying some ancestor of this
458 gdk_window_internal_destroy (GdkWindow *window, int xdestroy)
460 GdkWindowPrivate *private;
461 GdkWindowPrivate *temp_private;
462 GdkWindow *temp_window;
466 g_return_if_fail (window != NULL);
468 private = (GdkWindowPrivate*) window;
470 switch (private->window_type)
472 case GDK_WINDOW_TOPLEVEL:
473 case GDK_WINDOW_CHILD:
474 case GDK_WINDOW_DIALOG:
475 case GDK_WINDOW_TEMP:
476 if (!private->destroyed)
478 children = gdk_window_get_children (window);
483 temp_window = tmp->data;
486 temp_private = (GdkWindowPrivate*) temp_window;
488 gdk_window_internal_destroy (temp_window, FALSE);
491 g_list_free (children);
493 if (private->extension_events != 0)
494 gdk_input_window_destroy (window);
496 if(private->dnd_drag_data_numtypesavail > 0)
498 g_free (private->dnd_drag_data_typesavail);
499 private->dnd_drag_data_typesavail = NULL;
501 if(private->dnd_drop_data_numtypesavail > 0)
503 g_free (private->dnd_drop_data_typesavail);
504 private->dnd_drop_data_typesavail = NULL;
508 XDestroyWindow (private->xdisplay, private->xwindow);
509 private->destroyed = TRUE;
513 case GDK_WINDOW_ROOT:
514 g_error ("attempted to destroy root window");
517 case GDK_WINDOW_PIXMAP:
518 g_error ("called gdk_window_destroy on a pixmap (use gdk_pixmap_unref)");
523 /* Like internal_destroy, but also destroys the reference created by
527 gdk_window_destroy (GdkWindow *window)
529 gdk_window_internal_destroy (window, TRUE);
530 gdk_window_unref (window);
533 /* This function is called when the XWindow is really gone. */
536 gdk_window_destroy_notify (GdkWindow *window)
538 GdkWindowPrivate *private;
540 g_return_if_fail (window != NULL);
542 private = (GdkWindowPrivate*) window;
544 gdk_xid_table_remove (private->xwindow);
545 gdk_window_unref (window);
549 gdk_window_ref (GdkWindow *window)
551 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
552 g_return_val_if_fail (window != NULL, NULL);
554 private->ref_count += 1;
559 gdk_window_unref (GdkWindow *window)
561 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
562 g_return_if_fail (window != NULL);
564 private->ref_count -= 1;
565 if (private->ref_count == 0)
567 if (!private->destroyed)
568 g_warning ("losing last reference to undestroyed window\n");
574 gdk_window_show (GdkWindow *window)
576 GdkWindowPrivate *private;
578 g_return_if_fail (window != NULL);
580 private = (GdkWindowPrivate*) window;
581 if (!private->destroyed)
583 XRaiseWindow (private->xdisplay, private->xwindow);
584 XMapWindow (private->xdisplay, private->xwindow);
589 gdk_window_hide (GdkWindow *window)
591 GdkWindowPrivate *private;
593 g_return_if_fail (window != NULL);
595 private = (GdkWindowPrivate*) window;
596 if (!private->destroyed)
597 XUnmapWindow (private->xdisplay, private->xwindow);
601 gdk_window_withdraw (GdkWindow *window)
603 GdkWindowPrivate *private;
605 g_return_if_fail (window != NULL);
607 private = (GdkWindowPrivate*) window;
608 if (!private->destroyed)
609 XWithdrawWindow (private->xdisplay, private->xwindow, 0);
613 gdk_window_move (GdkWindow *window,
617 GdkWindowPrivate *private;
619 g_return_if_fail (window != NULL);
621 private = (GdkWindowPrivate*) window;
622 if (!private->destroyed)
624 XMoveWindow (private->xdisplay, private->xwindow, x, y);
626 if (private->window_type == GDK_WINDOW_CHILD)
635 gdk_window_resize (GdkWindow *window,
639 GdkWindowPrivate *private;
641 g_return_if_fail (window != NULL);
648 private = (GdkWindowPrivate*) window;
650 if (!private->destroyed &&
651 ((private->resize_count > 0) ||
652 (private->width != (guint16) width) ||
653 (private->height != (guint16) height)))
655 XResizeWindow (private->xdisplay, private->xwindow, width, height);
656 private->resize_count += 1;
658 if (private->window_type == GDK_WINDOW_CHILD)
660 private->width = width;
661 private->height = height;
667 gdk_window_move_resize (GdkWindow *window,
673 GdkWindowPrivate *private;
675 g_return_if_fail (window != NULL);
682 private = (GdkWindowPrivate*) window;
683 if (!private->destroyed)
685 XMoveResizeWindow (private->xdisplay, private->xwindow, x, y, width, height);
687 if (private->window_type == GDK_WINDOW_CHILD)
691 private->width = width;
692 private->height = height;
698 gdk_window_reparent (GdkWindow *window,
699 GdkWindow *new_parent,
703 GdkWindowPrivate *window_private;
704 GdkWindowPrivate *parent_private;
706 g_return_if_fail (window != NULL);
709 new_parent = (GdkWindow*) &gdk_root_parent;
711 window_private = (GdkWindowPrivate*) window;
712 parent_private = (GdkWindowPrivate*) new_parent;
714 if (!window_private->destroyed && !parent_private->destroyed)
715 XReparentWindow (window_private->xdisplay,
716 window_private->xwindow,
717 parent_private->xwindow,
722 gdk_window_clear (GdkWindow *window)
724 GdkWindowPrivate *private;
726 g_return_if_fail (window != NULL);
728 private = (GdkWindowPrivate*) window;
730 if (!private->destroyed)
731 XClearWindow (private->xdisplay, private->xwindow);
735 gdk_window_clear_area (GdkWindow *window,
741 GdkWindowPrivate *private;
743 g_return_if_fail (window != NULL);
745 private = (GdkWindowPrivate*) window;
747 if (!private->destroyed)
748 XClearArea (private->xdisplay, private->xwindow,
749 x, y, width, height, False);
753 gdk_window_clear_area_e (GdkWindow *window,
759 GdkWindowPrivate *private;
761 g_return_if_fail (window != NULL);
763 private = (GdkWindowPrivate*) window;
765 if (!private->destroyed)
766 XClearArea (private->xdisplay, private->xwindow,
767 x, y, width, height, True);
771 gdk_window_copy_area (GdkWindow *window,
775 GdkWindow *source_window,
781 GdkWindowPrivate *src_private;
782 GdkWindowPrivate *dest_private;
783 GdkGCPrivate *gc_private;
785 g_return_if_fail (window != NULL);
786 g_return_if_fail (gc != NULL);
788 if (source_window == NULL)
789 source_window = window;
791 src_private = (GdkWindowPrivate*) source_window;
792 dest_private = (GdkWindowPrivate*) window;
793 gc_private = (GdkGCPrivate*) gc;
795 if (!src_private->destroyed && !dest_private->destroyed)
797 XCopyArea (dest_private->xdisplay, src_private->xwindow, dest_private->xwindow,
806 gdk_window_raise (GdkWindow *window)
808 GdkWindowPrivate *private;
810 g_return_if_fail (window != NULL);
812 private = (GdkWindowPrivate*) window;
814 if (!private->destroyed)
815 XRaiseWindow (private->xdisplay, private->xwindow);
819 gdk_window_lower (GdkWindow *window)
821 GdkWindowPrivate *private;
823 g_return_if_fail (window != NULL);
825 private = (GdkWindowPrivate*) window;
827 if (!private->destroyed)
828 XLowerWindow (private->xdisplay, private->xwindow);
832 gdk_window_set_user_data (GdkWindow *window,
835 g_return_if_fail (window != NULL);
837 window->user_data = user_data;
841 gdk_window_set_hints (GdkWindow *window,
850 GdkWindowPrivate *private;
851 XSizeHints size_hints;
853 g_return_if_fail (window != NULL);
855 private = (GdkWindowPrivate*) window;
856 if (private->destroyed)
859 size_hints.flags = 0;
861 if (flags & GDK_HINT_POS)
863 size_hints.flags |= PPosition;
868 if (flags & GDK_HINT_MIN_SIZE)
870 size_hints.flags |= PMinSize;
871 size_hints.min_width = min_width;
872 size_hints.min_height = min_height;
875 if (flags & GDK_HINT_MAX_SIZE)
877 size_hints.flags |= PMaxSize;
878 size_hints.max_width = max_width;
879 size_hints.max_height = max_height;
883 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
887 gdk_window_set_title (GdkWindow *window,
890 GdkWindowPrivate *private;
892 g_return_if_fail (window != NULL);
894 private = (GdkWindowPrivate*) window;
895 if (!private->destroyed)
896 XmbSetWMProperties (private->xdisplay, private->xwindow,
897 title, title, NULL, 0, NULL, NULL, NULL);
901 gdk_window_set_background (GdkWindow *window,
904 GdkWindowPrivate *private;
906 g_return_if_fail (window != NULL);
908 private = (GdkWindowPrivate*) window;
909 if (!private->destroyed)
910 XSetWindowBackground (private->xdisplay, private->xwindow, color->pixel);
914 gdk_window_set_back_pixmap (GdkWindow *window,
916 gint parent_relative)
918 GdkWindowPrivate *window_private;
919 GdkPixmapPrivate *pixmap_private;
922 g_return_if_fail (window != NULL);
924 window_private = (GdkWindowPrivate*) window;
925 pixmap_private = (GdkPixmapPrivate*) pixmap;
928 xpixmap = pixmap_private->xwindow;
933 xpixmap = ParentRelative;
935 if (!window_private->destroyed)
936 XSetWindowBackgroundPixmap (window_private->xdisplay, window_private->xwindow, xpixmap);
940 gdk_window_set_cursor (GdkWindow *window,
943 GdkWindowPrivate *window_private;
944 GdkCursorPrivate *cursor_private;
947 g_return_if_fail (window != NULL);
949 window_private = (GdkWindowPrivate*) window;
950 cursor_private = (GdkCursorPrivate*) cursor;
955 xcursor = cursor_private->xcursor;
957 if (!window_private->destroyed)
958 XDefineCursor (window_private->xdisplay, window_private->xwindow, xcursor);
962 gdk_window_set_colormap (GdkWindow *window,
963 GdkColormap *colormap)
965 GdkWindowPrivate *window_private;
966 GdkColormapPrivate *colormap_private;
968 g_return_if_fail (window != NULL);
969 g_return_if_fail (colormap != NULL);
971 window_private = (GdkWindowPrivate*) window;
972 colormap_private = (GdkColormapPrivate*) colormap;
974 if (!window_private->destroyed)
976 XSetWindowColormap (window_private->xdisplay,
977 window_private->xwindow,
978 colormap_private->xcolormap);
980 if (window_private->window_type != GDK_WINDOW_TOPLEVEL)
981 gdk_window_add_colormap_windows (window);
986 gdk_window_get_user_data (GdkWindow *window,
989 g_return_if_fail (window != NULL);
991 *data = window->user_data;
995 gdk_window_get_geometry (GdkWindow *window,
1002 GdkWindowPrivate *window_private;
1008 guint tborder_width;
1012 window = (GdkWindow*) &gdk_root_parent;
1014 window_private = (GdkWindowPrivate*) window;
1016 if (!window_private->destroyed)
1018 XGetGeometry (window_private->xdisplay, window_private->xwindow,
1019 &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
1035 gdk_window_get_position (GdkWindow *window,
1039 GdkWindowPrivate *window_private;
1041 g_return_if_fail (window != NULL);
1043 window_private = (GdkWindowPrivate*) window;
1046 *x = window_private->x;
1048 *y = window_private->y;
1052 gdk_window_get_size (GdkWindow *window,
1056 GdkWindowPrivate *window_private;
1058 g_return_if_fail (window != NULL);
1060 window_private = (GdkWindowPrivate*) window;
1063 *width = window_private->width;
1065 *height = window_private->height;
1069 gdk_window_get_visual (GdkWindow *window)
1071 GdkWindowPrivate *window_private;
1072 XWindowAttributes window_attributes;
1074 g_return_val_if_fail (window != NULL, NULL);
1076 window_private = (GdkWindowPrivate*) window;
1077 while (window_private && (window_private->window_type == GDK_WINDOW_PIXMAP))
1078 window_private = (GdkWindowPrivate*) window_private->parent;
1080 if (window_private && !window_private->destroyed)
1082 XGetWindowAttributes (window_private->xdisplay,
1083 window_private->xwindow,
1084 &window_attributes);
1086 return gdk_visual_lookup (window_attributes.visual);
1093 gdk_window_get_colormap (GdkWindow *window)
1095 GdkWindowPrivate *window_private;
1096 XWindowAttributes window_attributes;
1098 g_return_val_if_fail (window != NULL, NULL);
1100 window_private = (GdkWindowPrivate*) window;
1102 if (!window_private->destroyed)
1104 XGetWindowAttributes (window_private->xdisplay,
1105 window_private->xwindow,
1106 &window_attributes);
1108 return gdk_colormap_lookup (window_attributes.colormap);
1115 gdk_window_get_type (GdkWindow *window)
1117 GdkWindowPrivate *window_private;
1119 g_return_val_if_fail (window != NULL, (GdkWindowType) -1);
1121 window_private = (GdkWindowPrivate*) window;
1122 return window_private->window_type;
1126 gdk_window_get_origin (GdkWindow *window,
1130 GdkWindowPrivate *private;
1135 g_return_val_if_fail (window != NULL, 0);
1137 private = (GdkWindowPrivate*) window;
1139 if (!private->destroyed)
1141 return_val = XTranslateCoordinates (private->xdisplay,
1159 gdk_window_get_pointer (GdkWindow *window,
1162 GdkModifierType *mask)
1164 GdkWindowPrivate *private;
1165 GdkWindow *return_val;
1173 window = (GdkWindow*) &gdk_root_parent;
1175 private = (GdkWindowPrivate*) window;
1178 if (!private->destroyed &&
1179 XQueryPointer (private->xdisplay, private->xwindow, &root, &child,
1180 &rootx, &rooty, &winx, &winy, &xmask))
1184 if (mask) *mask = xmask;
1187 return_val = gdk_window_lookup (child);
1194 gdk_window_get_parent (GdkWindow *window)
1196 g_return_val_if_fail (window != NULL, NULL);
1198 return ((GdkWindowPrivate*) window)->parent;
1202 gdk_window_get_toplevel (GdkWindow *window)
1204 GdkWindowPrivate *private;
1206 g_return_val_if_fail (window != NULL, NULL);
1208 private = (GdkWindowPrivate*) window;
1210 while (private->window_type == GDK_WINDOW_CHILD)
1212 window = ((GdkWindowPrivate*) window)->parent;
1213 private = (GdkWindowPrivate*) window;
1220 gdk_window_get_children (GdkWindow *window)
1222 GdkWindowPrivate *private;
1228 unsigned int nchildren;
1231 g_return_val_if_fail (window != NULL, NULL);
1233 private = (GdkWindowPrivate*) window;
1234 if (private->destroyed)
1237 XQueryTree (private->xdisplay, private->xwindow,
1238 &root, &parent, &xchildren, &nchildren);
1244 for (i = 0; i < nchildren; i++)
1246 child = gdk_window_lookup (xchildren[i]);
1248 children = g_list_prepend (children, child);
1258 gdk_window_get_events (GdkWindow *window)
1260 GdkWindowPrivate *private;
1261 XWindowAttributes attrs;
1262 GdkEventMask event_mask;
1265 g_return_val_if_fail (window != NULL, 0);
1267 private = (GdkWindowPrivate*) window;
1268 if (private->destroyed)
1271 XGetWindowAttributes (gdk_display, private->xwindow,
1275 for (i = 0; i < nevent_masks; i++)
1277 if (attrs.your_event_mask & event_mask_table[i])
1278 event_mask |= 1 << (i + 1);
1285 gdk_window_set_events (GdkWindow *window,
1286 GdkEventMask event_mask)
1288 GdkWindowPrivate *private;
1292 g_return_if_fail (window != NULL);
1294 private = (GdkWindowPrivate*) window;
1295 if (private->destroyed)
1298 xevent_mask = StructureNotifyMask;
1299 for (i = 0; i < nevent_masks; i++)
1301 if (event_mask & (1 << (i + 1)))
1302 xevent_mask |= event_mask_table[i];
1305 XSelectInput (gdk_display, private->xwindow,
1310 gdk_window_add_colormap_windows (GdkWindow *window)
1312 GdkWindow *toplevel;
1313 GdkWindowPrivate *toplevel_private;
1314 GdkWindowPrivate *window_private;
1315 Window *old_windows;
1316 Window *new_windows;
1319 g_return_if_fail (window != NULL);
1321 toplevel = gdk_window_get_toplevel (window);
1322 toplevel_private = (GdkWindowPrivate*) toplevel;
1323 window_private = (GdkWindowPrivate*) window;
1324 if (window_private->destroyed)
1327 if (!XGetWMColormapWindows (toplevel_private->xdisplay,
1328 toplevel_private->xwindow,
1329 &old_windows, &count))
1335 for (i = 0; i < count; i++)
1336 if (old_windows[i] == window_private->xwindow)
1339 new_windows = g_new (Window, count + 1);
1341 for (i = 0; i < count; i++)
1342 new_windows[i] = old_windows[i];
1343 new_windows[count] = window_private->xwindow;
1345 XSetWMColormapWindows (toplevel_private->xdisplay,
1346 toplevel_private->xwindow,
1347 new_windows, count + 1);
1349 g_free (new_windows);
1351 XFree (old_windows);
1355 * This needs the X11 shape extension.
1356 * If not available, simply remove the call to
1357 * XShapeCombineMask. Shaped windows will look
1358 * ugly, but programs still work. Stefan Wille
1361 gdk_window_shape_combine_mask (GdkWindow *window,
1365 GdkWindowPrivate *window_private;
1368 g_return_if_fail (window != NULL);
1370 window_private = (GdkWindowPrivate*) window;
1371 if (window_private->destroyed)
1376 GdkWindowPrivate *pixmap_private;
1378 pixmap_private = (GdkWindowPrivate*) mask;
1379 pixmap = (Pixmap) pixmap_private->xwindow;
1388 XShapeCombineMask (window_private->xdisplay,
1389 window_private->xwindow,
1397 gdk_dnd_drag_addwindow (GdkWindow *window)
1399 GdkWindowPrivate *window_private;
1401 g_return_if_fail (window != NULL);
1403 window_private = (GdkWindowPrivate *) window;
1404 if (window_private->destroyed)
1407 if (window_private->dnd_drag_enabled == 1 && gdk_dnd.drag_really == 0)
1409 gdk_dnd.drag_numwindows++;
1410 gdk_dnd.drag_startwindows = g_realloc (gdk_dnd.drag_startwindows,
1411 gdk_dnd.drag_numwindows
1412 * sizeof(GdkWindow *));
1413 gdk_dnd.drag_startwindows[gdk_dnd.drag_numwindows - 1] = window;
1414 window_private->dnd_drag_accepted = 0;
1417 g_warning ("dnd_really is 1 or drag is not enabled! can't addwindow\n");
1421 gdk_window_dnd_drag_set (GdkWindow *window,
1426 GdkWindowPrivate *window_private;
1429 g_return_if_fail (window != NULL);
1430 window_private = (GdkWindowPrivate *) window;
1431 if (window_private->destroyed)
1434 window_private->dnd_drag_enabled = drag_enable ? 1 : 0;
1438 g_return_if_fail(typelist != NULL);
1440 if (window_private->dnd_drag_data_numtypesavail > 3)
1442 window_private->dnd_drag_data_numtypesavail = numtypes;
1444 window_private->dnd_drag_data_typesavail =
1445 g_realloc (window_private->dnd_drag_data_typesavail,
1446 (numtypes + 1) * sizeof (GdkAtom));
1448 for (i = 0; i < numtypes; i++)
1450 /* Allow blanket use of ALL to get anything... */
1451 if (strcmp (typelist[i], "ALL"))
1452 window_private->dnd_drag_data_typesavail[i] =
1453 gdk_atom_intern (typelist[i], FALSE);
1455 window_private->dnd_drag_data_typesavail[i] = None;
1459 * set our extended type list if we need to
1462 gdk_property_change(window, gdk_dnd.gdk_XdeTypelist,
1463 XA_PRIMARY, 32, GDK_PROP_MODE_REPLACE,
1464 (guchar *)(window_private->dnd_drag_data_typesavail
1465 + (sizeof(GdkAtom) * 3)),
1466 (numtypes - 3) * sizeof(GdkAtom));
1468 gdk_property_delete (window, gdk_dnd.gdk_XdeTypelist);
1472 g_free (window_private->dnd_drag_data_typesavail);
1473 window_private->dnd_drag_data_typesavail = NULL;
1474 window_private->dnd_drag_data_numtypesavail = 0;
1479 gdk_window_dnd_drop_set (GdkWindow *window,
1483 guint8 destructive_op)
1485 GdkWindowPrivate *window_private;
1488 g_return_if_fail (window != NULL);
1489 window_private = (GdkWindowPrivate *) window;
1490 if (window_private->destroyed)
1493 window_private->dnd_drop_enabled = drop_enable ? 1 : 0;
1496 g_return_if_fail(typelist != NULL);
1498 window_private->dnd_drop_data_numtypesavail = numtypes;
1500 window_private->dnd_drop_data_typesavail =
1501 g_realloc (window_private->dnd_drop_data_typesavail,
1502 (numtypes + 1) * sizeof (GdkAtom));
1504 for (i = 0; i < numtypes; i++)
1505 window_private->dnd_drop_data_typesavail[i] =
1506 gdk_atom_intern (typelist[i], FALSE);
1508 window_private->dnd_drop_destructive_op = destructive_op;
1513 * This is used to reply to a GDK_DRAG_REQUEST event
1514 * (which may be generated by XdeRequest or a confirmed drop...
1517 gdk_window_dnd_data_set (GdkWindow *window,
1520 gulong data_numbytes)
1522 GdkWindowPrivate *window_private;
1524 GdkEventDropDataAvailable tmp_ev;
1527 g_return_if_fail (window != NULL);
1528 g_return_if_fail (event != NULL);
1529 g_return_if_fail (data != NULL);
1530 g_return_if_fail (data_numbytes > 0);
1531 g_return_if_fail (event->type == GDK_DRAG_REQUEST);
1533 window_private = (GdkWindowPrivate *) window;
1534 g_return_if_fail (window_private->dnd_drag_accepted != 0);
1535 if (window_private->destroyed)
1538 /* We set the property on our window... */
1539 gdk_property_change (window, window_private->dnd_drag_data_type,
1540 XA_PRIMARY, 8, GDK_PROP_MODE_REPLACE, data,
1542 tmp = gdk_atom_name(window_private->dnd_drag_data_type);
1544 g_print("DnD type %s on window %ld\n", tmp, window_private->xwindow);
1549 * Then we send the event to tell the receiving window that the
1552 tmp_ev.u.allflags = 0;
1553 tmp_ev.u.flags.protocol_version = DND_PROTOCOL_VERSION;
1554 tmp_ev.u.flags.isdrop = event->dragrequest.isdrop;
1556 sev.xclient.type = ClientMessage;
1557 sev.xclient.format = 32;
1558 sev.xclient.window = event->dragrequest.requestor;
1559 sev.xclient.message_type = gdk_dnd.gdk_XdeDataAvailable;
1560 sev.xclient.data.l[0] = window_private->xwindow;
1561 sev.xclient.data.l[1] = tmp_ev.u.allflags;
1562 sev.xclient.data.l[2] = window_private->dnd_drag_data_type;
1564 if (event->dragrequest.isdrop)
1565 sev.xclient.data.l[3] = event->dragrequest.drop_coords.x +
1566 (event->dragrequest.drop_coords.y << 16);
1568 sev.xclient.data.l[3] = 0;
1570 sev.xclient.data.l[4] = event->dragrequest.timestamp;
1572 if (!gdk_send_xevent (event->dragrequest.requestor, False,
1574 GDK_NOTE (DND, g_print("Sending XdeDataAvailable to %#x failed\n",
1575 event->dragrequest.requestor));
1580 gdk_window_add_filter (GdkWindow *window,
1581 GdkFilterFunc function,
1584 GdkWindowPrivate *private;
1586 GdkEventFilter *filter;
1588 private = (GdkWindowPrivate*) window;
1589 if (private && private->destroyed)
1593 tmp_list = private->filters;
1595 tmp_list = gdk_default_filters;
1599 filter = (GdkEventFilter *)tmp_list->data;
1600 if ((filter->function == function) && (filter->data == data))
1602 tmp_list = tmp_list->next;
1605 filter = g_new (GdkEventFilter, 1);
1606 filter->function = function;
1607 filter->data = data;
1610 private->filters = g_list_append (private->filters, filter);
1612 gdk_default_filters = g_list_append (gdk_default_filters, filter);
1616 gdk_window_remove_filter (GdkWindow *window,
1617 GdkFilterFunc function,
1620 GdkWindowPrivate *private;
1622 GdkEventFilter *filter;
1624 private = (GdkWindowPrivate*) window;
1627 tmp_list = private->filters;
1629 tmp_list = gdk_default_filters;
1633 filter = (GdkEventFilter *)tmp_list->data;
1634 tmp_list = tmp_list->next;
1636 if ((filter->function == function) && (filter->data == data))
1639 private->filters = g_list_remove_link (private->filters, tmp_list);
1641 gdk_default_filters = g_list_remove_link (gdk_default_filters, tmp_list);
1642 g_list_free_1 (tmp_list);
1651 gdk_window_set_override_redirect(GdkWindow *window,
1652 gboolean override_redirect)
1654 GdkWindowPrivate *private;
1655 XSetWindowAttributes attr;
1657 g_return_if_fail (window != NULL);
1658 private = (GdkWindowPrivate*) window;
1659 if (private->destroyed)
1662 attr.override_redirect = (override_redirect == FALSE)?False:True;
1663 XChangeWindowAttributes(gdk_display,
1664 ((GdkWindowPrivate *)window)->xwindow,
1670 gdk_window_set_icon (GdkWindow *window,
1671 GdkWindow *icon_window,
1676 GdkWindowPrivate *window_private;
1677 GdkWindowPrivate *private;
1679 g_return_if_fail (window != NULL);
1680 window_private = (GdkWindowPrivate*) window;
1681 if (window_private->destroyed)
1686 if (icon_window != NULL)
1688 private = (GdkWindowPrivate *)icon_window;
1689 wm_hints.flags |= IconWindowHint;
1690 wm_hints.icon_window = private->xwindow;
1695 private = (GdkWindowPrivate *)pixmap;
1696 wm_hints.flags |= IconPixmapHint;
1697 wm_hints.icon_pixmap = private->xwindow;
1702 private = (GdkWindowPrivate *)mask;
1703 wm_hints.flags |= IconMaskHint;
1704 wm_hints.icon_mask = private->xwindow;
1707 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1711 gdk_window_set_icon_name (GdkWindow *window,
1714 GdkWindowPrivate *window_private;
1715 XTextProperty property;
1718 g_return_if_fail (window != NULL);
1719 window_private = (GdkWindowPrivate*) window;
1720 if (window_private->destroyed)
1722 res = XmbTextListToTextProperty (window_private->xdisplay,
1723 &name, 1, XStdICCTextStyle,
1727 g_warning("Error converting icon name to text property: %d\n", res);
1731 XSetWMIconName (window_private->xdisplay, window_private->xwindow,
1734 XFree(property.value);
1738 gdk_window_set_group (GdkWindow *window,
1742 GdkWindowPrivate *window_private;
1743 GdkWindowPrivate *private;
1745 g_return_if_fail (window != NULL);
1746 g_return_if_fail (leader != NULL);
1747 window_private = (GdkWindowPrivate*) window;
1748 if (window_private->destroyed)
1751 private = (GdkWindowPrivate *)leader;
1752 wm_hints.flags |= WindowGroupHint;
1753 wm_hints.window_group = private->xwindow;
1755 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1759 gdk_window_set_mwm_hints (GdkWindow *window,
1760 MotifWmHints *new_hints)
1762 static Atom hints_atom = None;
1763 MotifWmHints *hints;
1769 GdkWindowPrivate *window_private;
1771 g_return_if_fail (window != NULL);
1772 window_private = (GdkWindowPrivate*) window;
1773 if (window_private->destroyed)
1777 hints_atom = XInternAtom (window_private->xdisplay,
1778 _XA_MOTIF_WM_HINTS, FALSE);
1780 XGetWindowProperty (window_private->xdisplay, window_private->xwindow,
1781 hints_atom, 0, sizeof(MotifWmHints)/4,
1782 False, AnyPropertyType, &type, &format, &nitems,
1783 &bytes_after, (guchar **)&hints);
1789 if (new_hints->flags & MWM_HINTS_FUNCTIONS)
1791 hints->flags |= MWM_HINTS_FUNCTIONS;
1792 hints->functions = new_hints->functions;
1794 if (new_hints->flags & MWM_HINTS_DECORATIONS)
1796 hints->flags |= MWM_HINTS_DECORATIONS;
1797 hints->decorations = new_hints->decorations;
1801 XChangeProperty (window_private->xdisplay, window_private->xwindow,
1802 hints_atom, hints_atom, 32, PropModeReplace,
1803 (guchar *)hints, sizeof(MotifWmHints)/4);
1805 if (hints != new_hints)
1810 gdk_window_set_decorations (GdkWindow *window,
1811 GdkWMDecoration decorations)
1815 hints.flags = MWM_HINTS_DECORATIONS;
1816 hints.decorations = decorations;
1818 gdk_window_set_mwm_hints (window, &hints);
1822 gdk_window_set_functions (GdkWindow *window,
1823 GdkWMFunction functions)
1827 hints.flags = MWM_HINTS_FUNCTIONS;
1828 hints.functions = functions;
1830 gdk_window_set_mwm_hints (window, &hints);