1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the Free
16 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 #include <X11/Xutil.h>
20 #include <X11/Xatom.h>
21 #include <X11/extensions/shape.h>
22 #include <netinet/in.h>
24 #include "../config.h"
26 #include "gdkprivate.h"
31 int nevent_masks = 17;
32 int event_mask_table[19] =
36 PointerMotionHintMask,
41 ButtonPressMask | OwnerGrabButtonMask,
42 ButtonReleaseMask | OwnerGrabButtonMask,
56 /* internal function created for and used by gdk_window_xid_at_coords */
58 gdk_window_xid_at(Window base, gint bx, gint by, gint x, gint y)
61 GdkWindowPrivate *private;
64 Window child=0,parent_win=0,root_win=0;
65 unsigned int num,i,ww,wh,wb,wd;
68 window=(GdkWindow*)&gdk_root_parent;
69 private=(GdkWindowPrivate*)window;
70 disp=private->xdisplay;
71 if (!XGetGeometry(disp,base,&root_win,&wx,&wy,&ww,&wh,&wb,&wd))
74 if (!((x>=wx)&&(y>=wy)&&(x<(wx+ww))&&(y<(wy+wh))))
76 if (!XQueryTree(disp,base,&root_win,&parent_win,&list,&num))
80 for (i=num-1;i>=0;i--)
82 if ((child=gdk_window_xid_at(list[i],wx,wy,x,y))!=0)
93 * The following fucntion by The Rasterman <raster@redhat.com>
94 * This function returns the X Window ID in which the x y location is in
95 * (x and y being relative to the root window), excluding any windows listed
96 * in the GList excludes (this is a list of X Window ID's - gpointer being
99 * This is primarily designed for internal gdk use - for DND for example
100 * when using a shaped icon window as the drag object - you exclude the
101 * X Window ID of the "icon" (perhaps more if excludes may be needed) and
102 * You can get back an X Window ID as to what X Window ID is infact under
103 * those X,Y co-ordinates.
106 gdk_window_xid_at_coords(gint x, gint y, GList *excludes)
109 GdkWindowPrivate *private;
112 Window root,child=0,parent_win=0,root_win=0;
115 window=(GdkWindow*)&gdk_root_parent;
116 private=(GdkWindowPrivate*)window;
117 disp=private->xdisplay;
118 root=private->xwindow;
119 if (!XQueryTree(disp,root,&root_win,&parent_win,&list,&num))
123 for (i=num-1;i>=0;i--)
125 if ((child=gdk_window_xid_at(list[i],0,0,x,y))!=0)
129 if (!g_list_find(excludes,(gpointer)child))
149 XWindowAttributes xattributes;
152 unsigned int border_width;
156 XGetGeometry (gdk_display, gdk_root_window, &gdk_root_window,
157 &x, &y, &width, &height, &border_width, &depth);
158 XGetWindowAttributes (gdk_display, gdk_root_window, &xattributes);
160 gdk_root_parent.xdisplay = gdk_display;
161 gdk_root_parent.xwindow = gdk_root_window;
162 gdk_root_parent.window_type = GDK_WINDOW_ROOT;
163 gdk_root_parent.window.user_data = NULL;
164 gdk_root_parent.width = width;
165 gdk_root_parent.height = height;
169 gdk_window_new (GdkWindow *parent,
170 GdkWindowAttr *attributes,
171 gint attributes_mask)
174 GdkWindowPrivate *private;
175 GdkWindowPrivate *parent_private;
177 GdkColormap *colormap;
178 Display *parent_display;
181 XSetWindowAttributes xattributes;
182 long xattributes_mask;
183 XSizeHints size_hints;
185 XClassHint *class_hint;
191 g_return_val_if_fail (attributes != NULL, NULL);
194 parent = (GdkWindow*) &gdk_root_parent;
196 parent_private = (GdkWindowPrivate*) parent;
197 if (parent_private->destroyed)
200 xparent = parent_private->xwindow;
201 parent_display = parent_private->xdisplay;
203 private = g_new (GdkWindowPrivate, 1);
204 window = (GdkWindow*) private;
206 private->parent = parent;
207 private->xdisplay = parent_display;
208 private->destroyed = FALSE;
209 private->resize_count = 0;
210 private->ref_count = 1;
211 xattributes_mask = 0;
213 if (attributes_mask & GDK_WA_X)
218 if (attributes_mask & GDK_WA_Y)
225 private->width = (attributes->width > 1) ? (attributes->width) : (1);
226 private->height = (attributes->height > 1) ? (attributes->height) : (1);
227 private->window_type = attributes->window_type;
228 private->extension_events = FALSE;
229 private->dnd_drag_data_type = None;
230 private->dnd_drag_data_typesavail =
231 private->dnd_drop_data_typesavail = NULL;
232 private->dnd_drop_enabled = private->dnd_drag_enabled =
233 private->dnd_drag_accepted = private->dnd_drag_datashow =
234 private->dnd_drop_data_numtypesavail =
235 private->dnd_drag_data_numtypesavail = 0;
236 private->dnd_drag_eventmask = private->dnd_drag_savedeventmask = 0;
238 private->filters = NULL;
240 window->user_data = NULL;
242 if (attributes_mask & GDK_WA_VISUAL)
243 visual = attributes->visual;
245 visual = gdk_visual_get_system ();
246 xvisual = ((GdkVisualPrivate*) visual)->xvisual;
248 xattributes.event_mask = StructureNotifyMask;
249 for (i = 0; i < nevent_masks; i++)
251 if (attributes->event_mask & (1 << (i + 1)))
252 xattributes.event_mask |= event_mask_table[i];
255 if (xattributes.event_mask)
256 xattributes_mask |= CWEventMask;
258 if(attributes_mask & GDK_WA_NOREDIR) {
259 xattributes.override_redirect =
260 (attributes->override_redirect == FALSE)?False:True;
261 xattributes_mask |= CWOverrideRedirect;
263 xattributes.override_redirect = False;
265 if (attributes->wclass == GDK_INPUT_OUTPUT)
268 depth = visual->depth;
270 if (attributes_mask & GDK_WA_COLORMAP)
271 colormap = attributes->colormap;
273 colormap = gdk_colormap_get_system ();
275 xattributes.background_pixel = BlackPixel (gdk_display, gdk_screen);
276 xattributes.border_pixel = BlackPixel (gdk_display, gdk_screen);
277 xattributes_mask |= CWBorderPixel | CWBackPixel;
279 switch (private->window_type)
281 case GDK_WINDOW_TOPLEVEL:
282 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
283 xattributes_mask |= CWColormap;
285 xparent = gdk_root_window;
288 case GDK_WINDOW_CHILD:
289 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
290 xattributes_mask |= CWColormap;
293 case GDK_WINDOW_DIALOG:
294 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
295 xattributes_mask |= CWColormap;
297 xparent = gdk_root_window;
300 case GDK_WINDOW_TEMP:
301 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
302 xattributes_mask |= CWColormap;
304 xparent = gdk_root_window;
306 xattributes.save_under = True;
307 xattributes.override_redirect = True;
308 xattributes.cursor = None;
309 xattributes_mask |= CWSaveUnder | CWOverrideRedirect;
311 case GDK_WINDOW_ROOT:
312 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
314 case GDK_WINDOW_PIXMAP:
315 g_error ("cannot make windows of type GDK_WINDOW_PIXMAP (use gdk_pixmap_new)");
326 private->xwindow = XCreateWindow (private->xdisplay, xparent,
327 x, y, private->width, private->height,
328 0, depth, class, xvisual,
329 xattributes_mask, &xattributes);
330 gdk_window_ref (window);
331 gdk_xid_table_insert (&private->xwindow, window);
333 switch (private->window_type)
335 case GDK_WINDOW_DIALOG:
336 XSetTransientForHint (private->xdisplay, private->xwindow, xparent);
337 case GDK_WINDOW_TOPLEVEL:
338 case GDK_WINDOW_TEMP:
339 XSetWMProtocols (private->xdisplay, private->xwindow, gdk_wm_window_protocols, 2);
341 case GDK_WINDOW_CHILD:
342 if ((attributes->wclass == GDK_INPUT_OUTPUT) &&
343 (colormap != gdk_colormap_get_system ()) &&
344 (colormap != gdk_window_get_colormap (gdk_window_get_toplevel (window))))
346 g_print ("adding colormap window\n");
347 gdk_window_add_colormap_windows (window);
354 size_hints.flags = PSize | PBaseSize;
355 size_hints.width = private->width;
356 size_hints.height = private->height;
357 size_hints.base_width = private->width;
358 size_hints.base_height = private->height;
360 wm_hints.flags = InputHint | StateHint | WindowGroupHint;
361 wm_hints.window_group = gdk_leader_window;
362 wm_hints.input = True;
363 wm_hints.initial_state = NormalState;
365 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
366 XSetWMHints (private->xdisplay, private->xwindow, &wm_hints);
368 if (attributes_mask & GDK_WA_TITLE)
369 title = attributes->title;
371 title = gdk_progname;
373 XmbSetWMProperties (private->xdisplay, private->xwindow,
378 if (attributes_mask & GDK_WA_WMCLASS)
380 class_hint = XAllocClassHint ();
381 class_hint->res_name = attributes->wmclass_name;
382 class_hint->res_class = attributes->wmclass_class;
383 XSetClassHint (private->xdisplay, private->xwindow, class_hint);
387 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
388 (attributes->cursor) :
395 gdk_window_foreign_new (guint32 anid)
398 GdkWindowPrivate *private;
399 XWindowAttributes attrs;
401 private = g_new (GdkWindowPrivate, 1);
402 window = (GdkWindow*) private;
404 XGetWindowAttributes (gdk_display, anid, &attrs);
406 private->parent = NULL;
407 private->xwindow = anid;
408 private->xdisplay = gdk_display;
409 private->x = attrs.x;
410 private->y = attrs.y;
411 private->width = attrs.width;
412 private->height = attrs.height;
413 private->resize_count = 0;
414 private->ref_count = 1;
415 if (anid == attrs.root)
416 private->window_type = GDK_WINDOW_ROOT;
418 private->window_type = GDK_WINDOW_TOPLEVEL;
419 /* the above is probably wrong, but it may not be worth the extra
420 X call to get it right */
422 private->destroyed = FALSE;
423 private->extension_events = 0;
424 private->filters = NULL;
426 window->user_data = NULL;
428 gdk_window_ref (window);
429 gdk_xid_table_insert (&private->xwindow, window);
434 /* Call this function when you want a window and all its children to
435 disappear. When xdestroy is true, a request to destroy the XWindow
436 is sent out. When it is false, it is assumed that the XWindow has
437 been or will be destroyed by destroying some ancestor of this
441 gdk_window_internal_destroy (GdkWindow *window, int xdestroy)
443 GdkWindowPrivate *private;
444 GdkWindowPrivate *temp_private;
445 GdkWindow *temp_window;
449 g_return_if_fail (window != NULL);
451 private = (GdkWindowPrivate*) window;
453 switch (private->window_type)
455 case GDK_WINDOW_TOPLEVEL:
456 case GDK_WINDOW_CHILD:
457 case GDK_WINDOW_DIALOG:
458 case GDK_WINDOW_TEMP:
459 if (!private->destroyed)
461 children = gdk_window_get_children (window);
466 temp_window = tmp->data;
469 temp_private = (GdkWindowPrivate*) temp_window;
471 gdk_window_internal_destroy (temp_window, FALSE);
474 g_list_free (children);
476 if (private->extension_events != 0)
477 gdk_input_window_destroy (window);
479 if(private->dnd_drag_data_numtypesavail > 0)
481 g_free (private->dnd_drag_data_typesavail);
482 private->dnd_drag_data_typesavail = NULL;
484 if(private->dnd_drop_data_numtypesavail > 0)
486 g_free (private->dnd_drop_data_typesavail);
487 private->dnd_drop_data_typesavail = NULL;
491 XDestroyWindow (private->xdisplay, private->xwindow);
492 private->destroyed = TRUE;
496 case GDK_WINDOW_ROOT:
497 g_error ("attempted to destroy root window");
500 case GDK_WINDOW_PIXMAP:
501 g_error ("called gdk_window_destroy on a pixmap (use gdk_pixmap_unref)");
506 /* Like internal_destroy, but also destroys the reference created by
510 gdk_window_destroy (GdkWindow *window)
512 gdk_window_internal_destroy (window, TRUE);
513 gdk_window_unref (window);
516 /* This function is called when the XWindow is really gone. */
519 gdk_window_destroy_notify (GdkWindow *window)
521 GdkWindowPrivate *private;
523 g_return_if_fail (window != NULL);
525 private = (GdkWindowPrivate*) window;
527 gdk_xid_table_remove (private->xwindow);
528 gdk_window_unref (window);
532 gdk_window_ref (GdkWindow *window)
534 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
535 g_return_val_if_fail (window != NULL, NULL);
537 private->ref_count += 1;
542 gdk_window_unref (GdkWindow *window)
544 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
545 g_return_if_fail (window != NULL);
547 private->ref_count -= 1;
548 if (private->ref_count == 0)
550 if (!private->destroyed)
551 g_warning ("losing last reference to undestroyed window\n");
557 gdk_window_show (GdkWindow *window)
559 GdkWindowPrivate *private;
561 g_return_if_fail (window != NULL);
563 private = (GdkWindowPrivate*) window;
564 if (!private->destroyed)
566 XRaiseWindow (private->xdisplay, private->xwindow);
567 XMapWindow (private->xdisplay, private->xwindow);
572 gdk_window_hide (GdkWindow *window)
574 GdkWindowPrivate *private;
576 g_return_if_fail (window != NULL);
578 private = (GdkWindowPrivate*) window;
579 if (!private->destroyed)
580 XUnmapWindow (private->xdisplay, private->xwindow);
584 gdk_window_withdraw (GdkWindow *window)
586 GdkWindowPrivate *private;
588 g_return_if_fail (window != NULL);
590 private = (GdkWindowPrivate*) window;
591 if (!private->destroyed)
592 XWithdrawWindow (private->xdisplay, private->xwindow, 0);
596 gdk_window_move (GdkWindow *window,
600 GdkWindowPrivate *private;
602 g_return_if_fail (window != NULL);
604 private = (GdkWindowPrivate*) window;
605 if (!private->destroyed)
607 XMoveWindow (private->xdisplay, private->xwindow, x, y);
609 if (private->window_type == GDK_WINDOW_CHILD)
618 gdk_window_resize (GdkWindow *window,
622 GdkWindowPrivate *private;
624 g_return_if_fail (window != NULL);
631 private = (GdkWindowPrivate*) window;
633 if (!private->destroyed &&
634 ((private->resize_count > 0) ||
635 (private->width != (guint16) width) ||
636 (private->height != (guint16) height)))
638 XResizeWindow (private->xdisplay, private->xwindow, width, height);
639 private->resize_count += 1;
641 if (private->window_type == GDK_WINDOW_CHILD)
643 private->width = width;
644 private->height = height;
650 gdk_window_move_resize (GdkWindow *window,
656 GdkWindowPrivate *private;
658 g_return_if_fail (window != NULL);
665 private = (GdkWindowPrivate*) window;
666 if (!private->destroyed)
668 XMoveResizeWindow (private->xdisplay, private->xwindow, x, y, width, height);
670 if (private->window_type == GDK_WINDOW_CHILD)
674 private->width = width;
675 private->height = height;
681 gdk_window_reparent (GdkWindow *window,
682 GdkWindow *new_parent,
686 GdkWindowPrivate *window_private;
687 GdkWindowPrivate *parent_private;
689 g_return_if_fail (window != NULL);
692 new_parent = (GdkWindow*) &gdk_root_parent;
694 window_private = (GdkWindowPrivate*) window;
695 parent_private = (GdkWindowPrivate*) new_parent;
697 if (!window_private->destroyed && !parent_private->destroyed)
698 XReparentWindow (window_private->xdisplay,
699 window_private->xwindow,
700 parent_private->xwindow,
705 gdk_window_clear (GdkWindow *window)
707 GdkWindowPrivate *private;
709 g_return_if_fail (window != NULL);
711 private = (GdkWindowPrivate*) window;
713 if (!private->destroyed)
714 XClearWindow (private->xdisplay, private->xwindow);
718 gdk_window_clear_area (GdkWindow *window,
724 GdkWindowPrivate *private;
726 g_return_if_fail (window != NULL);
728 private = (GdkWindowPrivate*) window;
730 if (!private->destroyed)
731 XClearArea (private->xdisplay, private->xwindow,
732 x, y, width, height, False);
736 gdk_window_clear_area_e (GdkWindow *window,
742 GdkWindowPrivate *private;
744 g_return_if_fail (window != NULL);
746 private = (GdkWindowPrivate*) window;
748 if (!private->destroyed)
749 XClearArea (private->xdisplay, private->xwindow,
750 x, y, width, height, True);
754 gdk_window_copy_area (GdkWindow *window,
758 GdkWindow *source_window,
764 GdkWindowPrivate *src_private;
765 GdkWindowPrivate *dest_private;
766 GdkGCPrivate *gc_private;
769 g_return_if_fail (window != NULL);
771 g_return_if_fail (gc != NULL);
774 if (source_window == NULL)
775 source_window = window;
778 src_private = (GdkWindowPrivate*) source_window;
779 dest_private = (GdkWindowPrivate*) window;
780 gc_private = (GdkGCPrivate*) gc;
783 if (!src_private->destroyed && !dest_private->destroyed)
785 XCopyArea (dest_private->xdisplay, src_private->xwindow, dest_private->xwindow,
796 gdk_window_raise (GdkWindow *window)
798 GdkWindowPrivate *private;
800 g_return_if_fail (window != NULL);
802 private = (GdkWindowPrivate*) window;
804 if (!private->destroyed)
805 XRaiseWindow (private->xdisplay, private->xwindow);
809 gdk_window_lower (GdkWindow *window)
811 GdkWindowPrivate *private;
813 g_return_if_fail (window != NULL);
815 private = (GdkWindowPrivate*) window;
817 if (!private->destroyed)
818 XLowerWindow (private->xdisplay, private->xwindow);
822 gdk_window_set_user_data (GdkWindow *window,
825 g_return_if_fail (window != NULL);
827 window->user_data = user_data;
831 gdk_window_set_hints (GdkWindow *window,
840 GdkWindowPrivate *private;
841 XSizeHints size_hints;
843 g_return_if_fail (window != NULL);
845 private = (GdkWindowPrivate*) window;
846 if (private->destroyed)
849 size_hints.flags = 0;
851 if (flags & GDK_HINT_POS)
853 size_hints.flags |= PPosition;
858 if (flags & GDK_HINT_MIN_SIZE)
860 size_hints.flags |= PMinSize;
861 size_hints.min_width = min_width;
862 size_hints.min_height = min_height;
865 if (flags & GDK_HINT_MAX_SIZE)
867 size_hints.flags |= PMaxSize;
868 size_hints.max_width = max_width;
869 size_hints.max_height = max_height;
873 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
877 gdk_window_set_title (GdkWindow *window,
880 GdkWindowPrivate *private;
882 g_return_if_fail (window != NULL);
884 private = (GdkWindowPrivate*) window;
885 if (!private->destroyed)
886 XmbSetWMProperties (private->xdisplay, private->xwindow,
887 title, title, NULL, 0, NULL, NULL, NULL);
891 gdk_window_set_background (GdkWindow *window,
894 GdkWindowPrivate *private;
896 g_return_if_fail (window != NULL);
898 private = (GdkWindowPrivate*) window;
899 if (!private->destroyed)
900 XSetWindowBackground (private->xdisplay, private->xwindow, color->pixel);
904 gdk_window_set_back_pixmap (GdkWindow *window,
906 gint parent_relative)
908 GdkWindowPrivate *window_private;
909 GdkPixmapPrivate *pixmap_private;
912 g_return_if_fail (window != NULL);
914 window_private = (GdkWindowPrivate*) window;
915 pixmap_private = (GdkPixmapPrivate*) pixmap;
918 xpixmap = pixmap_private->xwindow;
923 xpixmap = ParentRelative;
925 if (!window_private->destroyed)
926 XSetWindowBackgroundPixmap (window_private->xdisplay, window_private->xwindow, xpixmap);
930 gdk_window_set_cursor (GdkWindow *window,
933 GdkWindowPrivate *window_private;
934 GdkCursorPrivate *cursor_private;
937 g_return_if_fail (window != NULL);
939 window_private = (GdkWindowPrivate*) window;
940 cursor_private = (GdkCursorPrivate*) cursor;
945 xcursor = cursor_private->xcursor;
947 if (!window_private->destroyed)
948 XDefineCursor (window_private->xdisplay, window_private->xwindow, xcursor);
952 gdk_window_set_colormap (GdkWindow *window,
953 GdkColormap *colormap)
955 GdkWindowPrivate *window_private;
956 GdkColormapPrivate *colormap_private;
958 g_return_if_fail (window != NULL);
959 g_return_if_fail (colormap != NULL);
961 window_private = (GdkWindowPrivate*) window;
962 colormap_private = (GdkColormapPrivate*) colormap;
964 if (!window_private->destroyed)
966 XSetWindowColormap (window_private->xdisplay,
967 window_private->xwindow,
968 colormap_private->xcolormap);
970 if (window_private->window_type != GDK_WINDOW_TOPLEVEL)
971 gdk_window_add_colormap_windows (window);
976 gdk_window_get_user_data (GdkWindow *window,
979 g_return_if_fail (window != NULL);
981 *data = window->user_data;
985 gdk_window_get_geometry (GdkWindow *window,
992 GdkWindowPrivate *window_private;
1002 window = (GdkWindow*) &gdk_root_parent;
1004 window_private = (GdkWindowPrivate*) window;
1006 if (!window_private->destroyed)
1008 XGetGeometry (window_private->xdisplay, window_private->xwindow,
1009 &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
1025 gdk_window_get_position (GdkWindow *window,
1029 GdkWindowPrivate *window_private;
1031 g_return_if_fail (window != NULL);
1033 window_private = (GdkWindowPrivate*) window;
1036 *x = window_private->x;
1038 *y = window_private->y;
1042 gdk_window_get_size (GdkWindow *window,
1046 GdkWindowPrivate *window_private;
1048 g_return_if_fail (window != NULL);
1050 window_private = (GdkWindowPrivate*) window;
1053 *width = window_private->width;
1055 *height = window_private->height;
1059 gdk_window_get_visual (GdkWindow *window)
1061 GdkWindowPrivate *window_private;
1062 XWindowAttributes window_attributes;
1064 g_return_val_if_fail (window != NULL, NULL);
1066 window_private = (GdkWindowPrivate*) window;
1067 while (window_private && (window_private->window_type == GDK_WINDOW_PIXMAP))
1068 window_private = (GdkWindowPrivate*) window_private->parent;
1070 if (window_private && !window_private->destroyed)
1072 XGetWindowAttributes (window_private->xdisplay,
1073 window_private->xwindow,
1074 &window_attributes);
1076 return gdk_visual_lookup (window_attributes.visual);
1083 gdk_window_get_colormap (GdkWindow *window)
1085 GdkWindowPrivate *window_private;
1086 XWindowAttributes window_attributes;
1088 g_return_val_if_fail (window != NULL, NULL);
1090 window_private = (GdkWindowPrivate*) window;
1092 if (!window_private->destroyed)
1094 XGetWindowAttributes (window_private->xdisplay,
1095 window_private->xwindow,
1096 &window_attributes);
1098 return gdk_colormap_lookup (window_attributes.colormap);
1105 gdk_window_get_type (GdkWindow *window)
1107 GdkWindowPrivate *window_private;
1109 g_return_val_if_fail (window != NULL, (GdkWindowType) -1);
1111 window_private = (GdkWindowPrivate*) window;
1112 return window_private->window_type;
1116 gdk_window_get_origin (GdkWindow *window,
1120 GdkWindowPrivate *private;
1125 g_return_val_if_fail (window != NULL, 0);
1127 private = (GdkWindowPrivate*) window;
1129 if (!private->destroyed)
1131 return_val = XTranslateCoordinates (private->xdisplay,
1149 gdk_window_get_pointer (GdkWindow *window,
1152 GdkModifierType *mask)
1154 GdkWindowPrivate *private;
1155 GdkWindow *return_val;
1163 window = (GdkWindow*) &gdk_root_parent;
1165 private = (GdkWindowPrivate*) window;
1168 if (!private->destroyed &&
1169 XQueryPointer (private->xdisplay, private->xwindow, &root, &child,
1170 &rootx, &rooty, &winx, &winy, &xmask))
1174 if (mask) *mask = xmask;
1177 return_val = gdk_window_lookup (child);
1184 gdk_window_get_parent (GdkWindow *window)
1186 g_return_val_if_fail (window != NULL, NULL);
1188 return ((GdkWindowPrivate*) window)->parent;
1192 gdk_window_get_toplevel (GdkWindow *window)
1194 GdkWindowPrivate *private;
1196 g_return_val_if_fail (window != NULL, NULL);
1198 private = (GdkWindowPrivate*) window;
1200 while (private->window_type == GDK_WINDOW_CHILD)
1202 window = ((GdkWindowPrivate*) window)->parent;
1203 private = (GdkWindowPrivate*) window;
1210 gdk_window_get_children (GdkWindow *window)
1212 GdkWindowPrivate *private;
1218 unsigned int nchildren;
1221 g_return_val_if_fail (window != NULL, NULL);
1223 private = (GdkWindowPrivate*) window;
1224 if (private->destroyed)
1227 XQueryTree (private->xdisplay, private->xwindow,
1228 &root, &parent, &xchildren, &nchildren);
1234 for (i = 0; i < nchildren; i++)
1236 child = gdk_window_lookup (xchildren[i]);
1238 children = g_list_prepend (children, child);
1248 gdk_window_get_events (GdkWindow *window)
1250 GdkWindowPrivate *private;
1251 XWindowAttributes attrs;
1252 GdkEventMask event_mask;
1255 g_return_val_if_fail (window != NULL, 0);
1257 private = (GdkWindowPrivate*) window;
1258 if (private->destroyed)
1261 XGetWindowAttributes (gdk_display, private->xwindow,
1265 for (i = 0; i < nevent_masks; i++)
1267 if (attrs.your_event_mask & event_mask_table[i])
1268 event_mask |= 1 << (i + 1);
1275 gdk_window_set_events (GdkWindow *window,
1276 GdkEventMask event_mask)
1278 GdkWindowPrivate *private;
1282 g_return_if_fail (window != NULL);
1284 private = (GdkWindowPrivate*) window;
1285 if (private->destroyed)
1288 xevent_mask = StructureNotifyMask;
1289 for (i = 0; i < nevent_masks; i++)
1291 if (event_mask & (1 << (i + 1)))
1292 xevent_mask |= event_mask_table[i];
1295 XSelectInput (gdk_display, private->xwindow,
1300 gdk_window_add_colormap_windows (GdkWindow *window)
1302 GdkWindow *toplevel;
1303 GdkWindowPrivate *toplevel_private;
1304 GdkWindowPrivate *window_private;
1305 Window *old_windows;
1306 Window *new_windows;
1309 g_return_if_fail (window != NULL);
1311 toplevel = gdk_window_get_toplevel (window);
1312 toplevel_private = (GdkWindowPrivate*) toplevel;
1313 window_private = (GdkWindowPrivate*) window;
1314 if (window_private->destroyed)
1317 if (!XGetWMColormapWindows (toplevel_private->xdisplay,
1318 toplevel_private->xwindow,
1319 &old_windows, &count))
1325 for (i = 0; i < count; i++)
1326 if (old_windows[i] == window_private->xwindow)
1329 new_windows = g_new (Window, count + 1);
1331 for (i = 0; i < count; i++)
1332 new_windows[i] = old_windows[i];
1333 new_windows[count] = window_private->xwindow;
1335 XSetWMColormapWindows (toplevel_private->xdisplay,
1336 toplevel_private->xwindow,
1337 new_windows, count + 1);
1339 g_free (new_windows);
1341 XFree (old_windows);
1345 * This needs the X11 shape extension.
1346 * If not available, simply remove the call to
1347 * XShapeCombineMask. Shaped windows will look
1348 * ugly, but programs still work. Stefan Wille
1351 gdk_window_shape_combine_mask (GdkWindow *window,
1355 GdkWindowPrivate *window_private;
1358 g_return_if_fail (window != NULL);
1360 window_private = (GdkWindowPrivate*) window;
1361 if (window_private->destroyed)
1366 GdkWindowPrivate *pixmap_private;
1368 pixmap_private = (GdkWindowPrivate*) mask;
1369 pixmap = (Pixmap) pixmap_private->xwindow;
1378 XShapeCombineMask (window_private->xdisplay,
1379 window_private->xwindow,
1387 gdk_dnd_drag_addwindow (GdkWindow *window)
1389 GdkWindowPrivate *window_private;
1391 g_return_if_fail (window != NULL);
1393 window_private = (GdkWindowPrivate *) window;
1394 if (window_private->destroyed)
1397 if (window_private->dnd_drag_enabled == 1 && gdk_dnd.drag_really == 0)
1399 gdk_dnd.drag_numwindows++;
1400 gdk_dnd.drag_startwindows = g_realloc (gdk_dnd.drag_startwindows,
1401 gdk_dnd.drag_numwindows
1402 * sizeof(GdkWindow *));
1403 gdk_dnd.drag_startwindows[gdk_dnd.drag_numwindows - 1] = window;
1404 window_private->dnd_drag_accepted = 0;
1407 g_warning ("dnd_really is 1 or drag is not enabled! can't addwindow\n");
1411 gdk_window_dnd_drag_set (GdkWindow *window,
1416 GdkWindowPrivate *window_private;
1419 g_return_if_fail (window != NULL);
1420 window_private = (GdkWindowPrivate *) window;
1421 if (window_private->destroyed)
1424 window_private->dnd_drag_enabled = drag_enable ? 1 : 0;
1428 g_return_if_fail(typelist != NULL);
1430 if (window_private->dnd_drag_data_numtypesavail > 3)
1432 window_private->dnd_drag_data_numtypesavail = numtypes;
1434 window_private->dnd_drag_data_typesavail =
1435 g_realloc (window_private->dnd_drag_data_typesavail,
1436 (numtypes + 1) * sizeof (GdkAtom));
1438 for (i = 0; i < numtypes; i++)
1440 /* Allow blanket use of ALL to get anything... */
1441 if (strcmp (typelist[i], "ALL"))
1442 window_private->dnd_drag_data_typesavail[i] =
1443 gdk_atom_intern (typelist[i], FALSE);
1445 window_private->dnd_drag_data_typesavail[i] = None;
1449 * set our extended type list if we need to
1452 gdk_property_change(window, gdk_dnd.gdk_XdeTypelist,
1453 XA_PRIMARY, 32, GDK_PROP_MODE_REPLACE,
1454 (guchar *)(window_private->dnd_drag_data_typesavail
1455 + (sizeof(GdkAtom) * 3)),
1456 (numtypes - 3) * sizeof(GdkAtom));
1458 gdk_property_delete (window, gdk_dnd.gdk_XdeTypelist);
1462 g_free (window_private->dnd_drag_data_typesavail);
1463 window_private->dnd_drag_data_typesavail = NULL;
1464 window_private->dnd_drag_data_numtypesavail = 0;
1469 gdk_window_dnd_drop_set (GdkWindow *window,
1473 guint8 destructive_op)
1475 GdkWindowPrivate *window_private;
1478 g_return_if_fail (window != NULL);
1479 window_private = (GdkWindowPrivate *) window;
1480 if (window_private->destroyed)
1483 window_private->dnd_drop_enabled = drop_enable ? 1 : 0;
1486 g_return_if_fail(typelist != NULL);
1488 window_private->dnd_drop_data_numtypesavail = numtypes;
1490 window_private->dnd_drop_data_typesavail =
1491 g_realloc (window_private->dnd_drop_data_typesavail,
1492 (numtypes + 1) * sizeof (GdkAtom));
1494 for (i = 0; i < numtypes; i++)
1495 window_private->dnd_drop_data_typesavail[i] =
1496 gdk_atom_intern (typelist[i], FALSE);
1498 window_private->dnd_drop_destructive_op = destructive_op;
1503 * This is used to reply to a GDK_DRAG_REQUEST event
1504 * (which may be generated by XdeRequest or a confirmed drop...
1507 gdk_window_dnd_data_set (GdkWindow *window,
1510 gulong data_numbytes)
1512 GdkWindowPrivate *window_private;
1514 GdkEventDropDataAvailable tmp_ev;
1517 g_return_if_fail (window != NULL);
1518 g_return_if_fail (event != NULL);
1519 g_return_if_fail (data != NULL);
1520 g_return_if_fail (data_numbytes > 0);
1521 g_return_if_fail (event->type == GDK_DRAG_REQUEST);
1523 window_private = (GdkWindowPrivate *) window;
1524 g_return_if_fail (window_private->dnd_drag_accepted != 0);
1525 if (window_private->destroyed)
1528 /* We set the property on our window... */
1529 gdk_property_change (window, window_private->dnd_drag_data_type,
1530 XA_PRIMARY, 8, GDK_PROP_MODE_REPLACE, data,
1532 tmp = gdk_atom_name(window_private->dnd_drag_data_type);
1534 g_print("DnD type %s on window %ld\n", tmp, window_private->xwindow);
1539 * Then we send the event to tell the receiving window that the
1542 tmp_ev.u.allflags = 0;
1543 tmp_ev.u.flags.protocol_version = DND_PROTOCOL_VERSION;
1544 tmp_ev.u.flags.isdrop = event->dragrequest.isdrop;
1546 sev.xclient.type = ClientMessage;
1547 sev.xclient.format = 32;
1548 sev.xclient.window = event->dragrequest.requestor;
1549 sev.xclient.message_type = gdk_dnd.gdk_XdeDataAvailable;
1550 sev.xclient.data.l[0] = window_private->xwindow;
1551 sev.xclient.data.l[1] = tmp_ev.u.allflags;
1552 sev.xclient.data.l[2] = window_private->dnd_drag_data_type;
1554 if (event->dragrequest.isdrop)
1555 sev.xclient.data.l[3] = event->dragrequest.drop_coords.x +
1556 (event->dragrequest.drop_coords.y << 16);
1558 sev.xclient.data.l[3] = 0;
1560 sev.xclient.data.l[4] = 0;
1562 XSendEvent (gdk_display, event->dragrequest.requestor, False,
1567 gdk_window_add_filter (GdkWindow *window,
1568 GdkFilterFunc function,
1571 GdkWindowPrivate *private;
1573 GdkEventFilter *filter;
1575 private = (GdkWindowPrivate*) window;
1576 if (private && private->destroyed)
1580 tmp_list = private->filters;
1582 tmp_list = gdk_default_filters;
1586 filter = (GdkEventFilter *)tmp_list->data;
1587 if ((filter->function == function) && (filter->data == data))
1589 tmp_list = tmp_list->next;
1592 filter = g_new (GdkEventFilter, 1);
1593 filter->function = function;
1594 filter->data = data;
1597 private->filters = g_list_append (private->filters, filter);
1599 gdk_default_filters = g_list_append (gdk_default_filters, filter);
1603 gdk_window_remove_filter (GdkWindow *window,
1604 GdkFilterFunc function,
1607 GdkWindowPrivate *private;
1609 GdkEventFilter *filter;
1611 private = (GdkWindowPrivate*) window;
1614 tmp_list = private->filters;
1616 tmp_list = gdk_default_filters;
1620 filter = (GdkEventFilter *)tmp_list->data;
1621 tmp_list = tmp_list->next;
1623 if ((filter->function == function) && (filter->data == data))
1626 private->filters = g_list_remove_link (private->filters, tmp_list);
1628 gdk_default_filters = g_list_remove_link (gdk_default_filters, tmp_list);
1629 g_list_free_1 (tmp_list);
1638 gdk_window_set_override_redirect(GdkWindow *window,
1639 gboolean override_redirect)
1641 GdkWindowPrivate *private;
1642 XSetWindowAttributes attr;
1644 g_return_if_fail (window != NULL);
1645 private = (GdkWindowPrivate*) window;
1646 if (private->destroyed)
1649 attr.override_redirect = (override_redirect == FALSE)?False:True;
1650 XChangeWindowAttributes(gdk_display,
1651 ((GdkWindowPrivate *)window)->xwindow,
1657 gdk_window_set_icon (GdkWindow *window,
1658 GdkWindow *icon_window,
1663 GdkWindowPrivate *window_private;
1664 GdkWindowPrivate *private;
1666 g_return_if_fail (window != NULL);
1667 window_private = (GdkWindowPrivate*) window;
1668 if (window_private->destroyed)
1673 if (icon_window != NULL)
1675 private = (GdkWindowPrivate *)icon_window;
1676 wm_hints.flags |= IconWindowHint;
1677 wm_hints.icon_window = private->xwindow;
1682 private = (GdkWindowPrivate *)pixmap;
1683 wm_hints.flags |= IconPixmapHint;
1684 wm_hints.icon_pixmap = private->xwindow;
1689 private = (GdkWindowPrivate *)mask;
1690 wm_hints.flags |= IconMaskHint;
1691 wm_hints.icon_mask = private->xwindow;
1694 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1698 gdk_window_set_icon_name (GdkWindow *window,
1701 GdkWindowPrivate *window_private;
1702 XTextProperty property;
1705 g_return_if_fail (window != NULL);
1706 window_private = (GdkWindowPrivate*) window;
1707 if (window_private->destroyed)
1709 res = XmbTextListToTextProperty (window_private->xdisplay,
1710 &name, 1, XStdICCTextStyle,
1714 g_warning("Error converting icon name to text property: %d\n", res);
1718 XSetWMIconName (window_private->xdisplay, window_private->xwindow,
1721 XFree(property.value);
1725 gdk_window_set_group (GdkWindow *window,
1729 GdkWindowPrivate *window_private;
1730 GdkWindowPrivate *private;
1732 g_return_if_fail (window != NULL);
1733 g_return_if_fail (leader != NULL);
1734 window_private = (GdkWindowPrivate*) window;
1735 if (window_private->destroyed)
1738 private = (GdkWindowPrivate *)leader;
1739 wm_hints.flags |= WindowGroupHint;
1740 wm_hints.window_group = private->xwindow;
1742 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1746 gdk_window_set_mwm_hints (GdkWindow *window,
1747 MotifWmHints *new_hints)
1749 static Atom hints_atom = None;
1750 MotifWmHints *hints;
1756 GdkWindowPrivate *window_private;
1758 g_return_if_fail (window != NULL);
1759 window_private = (GdkWindowPrivate*) window;
1760 if (window_private->destroyed)
1764 hints_atom = XInternAtom (window_private->xdisplay,
1765 _XA_MOTIF_WM_HINTS, FALSE);
1767 XGetWindowProperty (window_private->xdisplay, window_private->xwindow,
1768 hints_atom, 0, sizeof(MotifWmHints)/4,
1769 False, AnyPropertyType, &type, &format, &nitems,
1770 &bytes_after, (guchar **)&hints);
1776 if (new_hints->flags & MWM_HINTS_FUNCTIONS)
1778 hints->flags |= MWM_HINTS_FUNCTIONS;
1779 hints->functions = new_hints->functions;
1781 if (new_hints->flags & MWM_HINTS_DECORATIONS)
1783 hints->flags |= MWM_HINTS_DECORATIONS;
1784 hints->decorations = new_hints->decorations;
1788 XChangeProperty (window_private->xdisplay, window_private->xwindow,
1789 hints_atom, hints_atom, 32, PropModeReplace,
1790 (guchar *)hints, sizeof(MotifWmHints)/4);
1792 if (hints != new_hints)
1797 gdk_window_set_decorations (GdkWindow *window,
1798 GdkWMDecoration decorations)
1802 hints.flags = MWM_HINTS_DECORATIONS;
1803 hints.decorations = decorations;
1805 gdk_window_set_mwm_hints (window, &hints);
1809 gdk_window_set_functions (GdkWindow *window,
1810 GdkWMFunction functions)
1814 hints.flags = MWM_HINTS_FUNCTIONS;
1815 hints.functions = functions;
1817 gdk_window_set_mwm_hints (window, &hints);