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 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;
123 window=(GdkWindow*)&gdk_root_parent;
124 private=(GdkWindowPrivate*)window;
125 disp=private->xdisplay;
126 root=private->xwindow;
128 num=g_list_length(excludes);
129 if (!XQueryTree(disp,root,&root_win,&parent_win,&list,&num))
136 XWindowAttributes xwa;
138 XGetWindowAttributes (disp, list [i], &xwa);
140 if (xwa.map_state != IsViewable)
143 if (excl_child && g_list_find(excludes,(gpointer *)list[i]))
146 if ((child = gdk_window_xid_at (list[i], 0, 0, x, y, excludes, excl_child)) == 0)
151 if (!g_list_find(excludes,(gpointer *)child))
174 XWindowAttributes xattributes;
177 unsigned int border_width;
181 XGetGeometry (gdk_display, gdk_root_window, &gdk_root_window,
182 &x, &y, &width, &height, &border_width, &depth);
183 XGetWindowAttributes (gdk_display, gdk_root_window, &xattributes);
185 gdk_root_parent.xdisplay = gdk_display;
186 gdk_root_parent.xwindow = gdk_root_window;
187 gdk_root_parent.window_type = GDK_WINDOW_ROOT;
188 gdk_root_parent.window.user_data = NULL;
189 gdk_root_parent.width = width;
190 gdk_root_parent.height = height;
194 gdk_window_new (GdkWindow *parent,
195 GdkWindowAttr *attributes,
196 gint attributes_mask)
199 GdkWindowPrivate *private;
200 GdkWindowPrivate *parent_private;
202 GdkColormap *colormap;
203 Display *parent_display;
206 XSetWindowAttributes xattributes;
207 long xattributes_mask;
208 XSizeHints size_hints;
210 XClassHint *class_hint;
216 g_return_val_if_fail (attributes != NULL, NULL);
219 parent = (GdkWindow*) &gdk_root_parent;
221 parent_private = (GdkWindowPrivate*) parent;
222 if (parent_private->destroyed)
225 xparent = parent_private->xwindow;
226 parent_display = parent_private->xdisplay;
228 private = g_new (GdkWindowPrivate, 1);
229 window = (GdkWindow*) private;
231 private->parent = parent;
232 private->xdisplay = parent_display;
233 private->destroyed = FALSE;
234 private->resize_count = 0;
235 private->ref_count = 1;
236 xattributes_mask = 0;
238 if (attributes_mask & GDK_WA_X)
243 if (attributes_mask & GDK_WA_Y)
250 private->width = (attributes->width > 1) ? (attributes->width) : (1);
251 private->height = (attributes->height > 1) ? (attributes->height) : (1);
252 private->window_type = attributes->window_type;
253 private->extension_events = FALSE;
254 private->dnd_drag_data_type = None;
255 private->dnd_drag_data_typesavail =
256 private->dnd_drop_data_typesavail = NULL;
257 private->dnd_drop_enabled = private->dnd_drag_enabled =
258 private->dnd_drag_accepted = private->dnd_drag_datashow =
259 private->dnd_drop_data_numtypesavail =
260 private->dnd_drag_data_numtypesavail = 0;
261 private->dnd_drag_eventmask = private->dnd_drag_savedeventmask = 0;
263 private->filters = NULL;
265 window->user_data = NULL;
267 if (attributes_mask & GDK_WA_VISUAL)
268 visual = attributes->visual;
270 visual = gdk_visual_get_system ();
271 xvisual = ((GdkVisualPrivate*) visual)->xvisual;
273 xattributes.event_mask = StructureNotifyMask;
274 for (i = 0; i < nevent_masks; i++)
276 if (attributes->event_mask & (1 << (i + 1)))
277 xattributes.event_mask |= event_mask_table[i];
280 if (xattributes.event_mask)
281 xattributes_mask |= CWEventMask;
283 if(attributes_mask & GDK_WA_NOREDIR) {
284 xattributes.override_redirect =
285 (attributes->override_redirect == FALSE)?False:True;
286 xattributes_mask |= CWOverrideRedirect;
288 xattributes.override_redirect = False;
290 if (attributes->wclass == GDK_INPUT_OUTPUT)
293 depth = visual->depth;
295 if (attributes_mask & GDK_WA_COLORMAP)
296 colormap = attributes->colormap;
298 colormap = gdk_colormap_get_system ();
300 xattributes.background_pixel = BlackPixel (gdk_display, gdk_screen);
301 xattributes.border_pixel = BlackPixel (gdk_display, gdk_screen);
302 xattributes_mask |= CWBorderPixel | CWBackPixel;
304 switch (private->window_type)
306 case GDK_WINDOW_TOPLEVEL:
307 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
308 xattributes_mask |= CWColormap;
310 xparent = gdk_root_window;
313 case GDK_WINDOW_CHILD:
314 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
315 xattributes_mask |= CWColormap;
318 case GDK_WINDOW_DIALOG:
319 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
320 xattributes_mask |= CWColormap;
322 xparent = gdk_root_window;
325 case GDK_WINDOW_TEMP:
326 xattributes.colormap = ((GdkColormapPrivate*) colormap)->xcolormap;
327 xattributes_mask |= CWColormap;
329 xparent = gdk_root_window;
331 xattributes.save_under = True;
332 xattributes.override_redirect = True;
333 xattributes.cursor = None;
334 xattributes_mask |= CWSaveUnder | CWOverrideRedirect;
336 case GDK_WINDOW_ROOT:
337 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
339 case GDK_WINDOW_PIXMAP:
340 g_error ("cannot make windows of type GDK_WINDOW_PIXMAP (use gdk_pixmap_new)");
351 private->xwindow = XCreateWindow (private->xdisplay, xparent,
352 x, y, private->width, private->height,
353 0, depth, class, xvisual,
354 xattributes_mask, &xattributes);
355 gdk_window_ref (window);
356 gdk_xid_table_insert (&private->xwindow, window);
358 switch (private->window_type)
360 case GDK_WINDOW_DIALOG:
361 XSetTransientForHint (private->xdisplay, private->xwindow, xparent);
362 case GDK_WINDOW_TOPLEVEL:
363 case GDK_WINDOW_TEMP:
364 XSetWMProtocols (private->xdisplay, private->xwindow, gdk_wm_window_protocols, 2);
366 case GDK_WINDOW_CHILD:
367 if ((attributes->wclass == GDK_INPUT_OUTPUT) &&
368 (colormap != gdk_colormap_get_system ()) &&
369 (colormap != gdk_window_get_colormap (gdk_window_get_toplevel (window))))
371 g_print ("adding colormap window\n");
372 gdk_window_add_colormap_windows (window);
379 size_hints.flags = PSize | PBaseSize;
380 size_hints.width = private->width;
381 size_hints.height = private->height;
382 size_hints.base_width = private->width;
383 size_hints.base_height = private->height;
385 wm_hints.flags = InputHint | StateHint | WindowGroupHint;
386 wm_hints.window_group = gdk_leader_window;
387 wm_hints.input = True;
388 wm_hints.initial_state = NormalState;
390 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
391 XSetWMHints (private->xdisplay, private->xwindow, &wm_hints);
393 if (attributes_mask & GDK_WA_TITLE)
394 title = attributes->title;
396 title = gdk_progname;
398 XmbSetWMProperties (private->xdisplay, private->xwindow,
403 if (attributes_mask & GDK_WA_WMCLASS)
405 class_hint = XAllocClassHint ();
406 class_hint->res_name = attributes->wmclass_name;
407 class_hint->res_class = attributes->wmclass_class;
408 XSetClassHint (private->xdisplay, private->xwindow, class_hint);
412 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
413 (attributes->cursor) :
420 gdk_window_foreign_new (guint32 anid)
423 GdkWindowPrivate *private;
424 XWindowAttributes attrs;
429 private = g_new (GdkWindowPrivate, 1);
430 window = (GdkWindow*) private;
432 XGetWindowAttributes (gdk_display, anid, &attrs);
434 /* FIXME: This is pretty expensive. Maybe the caller should supply
436 XQueryTree (gdk_display, anid, &root, &parent, &children, &nchildren);
438 private->parent = gdk_xid_table_lookup (parent);
440 private->xwindow = anid;
441 private->xdisplay = gdk_display;
442 private->x = attrs.x;
443 private->y = attrs.y;
444 private->width = attrs.width;
445 private->height = attrs.height;
446 private->resize_count = 0;
447 private->ref_count = 1;
448 private->window_type = GDK_WINDOW_FOREIGN;
449 private->destroyed = FALSE;
450 private->extension_events = 0;
453 private->dnd_drag_data_type = None;
454 private->dnd_drag_data_typesavail =
455 private->dnd_drop_data_typesavail = NULL;
456 private->dnd_drop_enabled = private->dnd_drag_enabled =
457 private->dnd_drag_accepted = private->dnd_drag_datashow =
458 private->dnd_drop_data_numtypesavail =
459 private->dnd_drag_data_numtypesavail = 0;
460 private->dnd_drag_eventmask = private->dnd_drag_savedeventmask = 0;
462 private->filters = NULL;
464 window->user_data = NULL;
466 gdk_window_ref (window);
467 gdk_xid_table_insert (&private->xwindow, window);
472 /* Call this function when you want a window and all its children to
473 disappear. When xdestroy is true, a request to destroy the XWindow
474 is sent out. When it is false, it is assumed that the XWindow has
475 been or will be destroyed by destroying some ancestor of this
479 gdk_window_internal_destroy (GdkWindow *window, gboolean xdestroy,
480 gboolean our_destroy)
482 GdkWindowPrivate *private;
483 GdkWindowPrivate *temp_private;
484 GdkWindow *temp_window;
488 g_return_if_fail (window != NULL);
490 private = (GdkWindowPrivate*) window;
492 switch (private->window_type)
494 case GDK_WINDOW_TOPLEVEL:
495 case GDK_WINDOW_CHILD:
496 case GDK_WINDOW_DIALOG:
497 case GDK_WINDOW_TEMP:
498 case GDK_WINDOW_FOREIGN:
499 if (!private->destroyed)
501 if (private->window_type != GDK_WINDOW_FOREIGN)
503 children = gdk_window_get_children (window);
508 temp_window = tmp->data;
511 temp_private = (GdkWindowPrivate*) temp_window;
513 gdk_window_internal_destroy (temp_window, FALSE,
517 g_list_free (children);
520 if (private->extension_events != 0)
521 gdk_input_window_destroy (window);
523 if(private->dnd_drag_data_numtypesavail > 0)
525 g_free (private->dnd_drag_data_typesavail);
526 private->dnd_drag_data_typesavail = NULL;
528 if(private->dnd_drop_data_numtypesavail > 0)
530 g_free (private->dnd_drop_data_typesavail);
531 private->dnd_drop_data_typesavail = NULL;
534 if (private->filters)
536 tmp = private->filters;
544 g_list_free (private->filters);
545 private->filters = NULL;
548 if (private->window_type == GDK_WINDOW_FOREIGN)
550 if (our_destroy && (private->parent != NULL))
552 /* It's somebody elses window, but in our heirarchy,
553 * so reparent it to the root window, and then send
554 * it a delete event, as if we were a WM
556 XClientMessageEvent xevent;
558 gdk_window_hide (window);
559 gdk_window_reparent (window, NULL, 0, 0);
561 xevent.type = ClientMessage;
562 xevent.window = private->xwindow;
563 xevent.message_type = gdk_wm_protocols;
565 xevent.data.l[0] = gdk_wm_delete_window;
566 xevent.data.l[1] = CurrentTime;
568 XSendEvent (private->xdisplay, private->xwindow,
569 False, 0, (XEvent *)&xevent);
573 XDestroyWindow (private->xdisplay, private->xwindow);
575 private->destroyed = TRUE;
579 case GDK_WINDOW_ROOT:
580 g_error ("attempted to destroy root window");
583 case GDK_WINDOW_PIXMAP:
584 g_error ("called gdk_window_destroy on a pixmap (use gdk_pixmap_unref)");
589 /* Like internal_destroy, but also destroys the reference created by
593 gdk_window_destroy (GdkWindow *window)
595 gdk_window_internal_destroy (window, TRUE, TRUE);
596 gdk_window_unref (window);
599 /* This function is called when the XWindow is really gone. */
602 gdk_window_destroy_notify (GdkWindow *window)
604 GdkWindowPrivate *private;
606 g_return_if_fail (window != NULL);
608 private = (GdkWindowPrivate*) window;
610 if (!private->destroyed)
612 if (private->window_type == GDK_WINDOW_FOREIGN)
613 gdk_window_internal_destroy (window, FALSE, FALSE);
615 g_warning ("GdkWindow %#lx unexpectedly destroyed", private->xwindow);
618 gdk_xid_table_remove (private->xwindow);
619 gdk_window_unref (window);
623 gdk_window_ref (GdkWindow *window)
625 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
626 g_return_val_if_fail (window != NULL, NULL);
628 private->ref_count += 1;
633 gdk_window_unref (GdkWindow *window)
635 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
636 g_return_if_fail (window != NULL);
638 private->ref_count -= 1;
639 if (private->ref_count == 0)
641 if (!private->destroyed)
642 g_warning ("losing last reference to undestroyed window\n");
648 gdk_window_show (GdkWindow *window)
650 GdkWindowPrivate *private;
652 g_return_if_fail (window != NULL);
654 private = (GdkWindowPrivate*) window;
655 if (!private->destroyed)
657 XRaiseWindow (private->xdisplay, private->xwindow);
658 XMapWindow (private->xdisplay, private->xwindow);
663 gdk_window_hide (GdkWindow *window)
665 GdkWindowPrivate *private;
667 g_return_if_fail (window != NULL);
669 private = (GdkWindowPrivate*) window;
670 if (!private->destroyed)
671 XUnmapWindow (private->xdisplay, private->xwindow);
675 gdk_window_withdraw (GdkWindow *window)
677 GdkWindowPrivate *private;
679 g_return_if_fail (window != NULL);
681 private = (GdkWindowPrivate*) window;
682 if (!private->destroyed)
683 XWithdrawWindow (private->xdisplay, private->xwindow, 0);
687 gdk_window_move (GdkWindow *window,
691 GdkWindowPrivate *private;
693 g_return_if_fail (window != NULL);
695 private = (GdkWindowPrivate*) window;
696 if (!private->destroyed)
698 XMoveWindow (private->xdisplay, private->xwindow, x, y);
700 if (private->window_type == GDK_WINDOW_CHILD)
709 gdk_window_resize (GdkWindow *window,
713 GdkWindowPrivate *private;
715 g_return_if_fail (window != NULL);
722 private = (GdkWindowPrivate*) window;
724 if (!private->destroyed &&
725 ((private->resize_count > 0) ||
726 (private->width != (guint16) width) ||
727 (private->height != (guint16) height)))
729 XResizeWindow (private->xdisplay, private->xwindow, width, height);
730 private->resize_count += 1;
732 if (private->window_type == GDK_WINDOW_CHILD)
734 private->width = width;
735 private->height = height;
741 gdk_window_move_resize (GdkWindow *window,
747 GdkWindowPrivate *private;
749 g_return_if_fail (window != NULL);
756 private = (GdkWindowPrivate*) window;
757 if (!private->destroyed)
759 XMoveResizeWindow (private->xdisplay, private->xwindow, x, y, width, height);
761 if (private->window_type == GDK_WINDOW_CHILD)
765 private->width = width;
766 private->height = height;
772 gdk_window_reparent (GdkWindow *window,
773 GdkWindow *new_parent,
777 GdkWindowPrivate *window_private;
778 GdkWindowPrivate *parent_private;
780 g_return_if_fail (window != NULL);
783 new_parent = (GdkWindow*) &gdk_root_parent;
785 window_private = (GdkWindowPrivate*) window;
786 parent_private = (GdkWindowPrivate*) new_parent;
788 if (!window_private->destroyed && !parent_private->destroyed)
789 XReparentWindow (window_private->xdisplay,
790 window_private->xwindow,
791 parent_private->xwindow,
796 gdk_window_clear (GdkWindow *window)
798 GdkWindowPrivate *private;
800 g_return_if_fail (window != NULL);
802 private = (GdkWindowPrivate*) window;
804 if (!private->destroyed)
805 XClearWindow (private->xdisplay, private->xwindow);
809 gdk_window_clear_area (GdkWindow *window,
815 GdkWindowPrivate *private;
817 g_return_if_fail (window != NULL);
819 private = (GdkWindowPrivate*) window;
821 if (!private->destroyed)
822 XClearArea (private->xdisplay, private->xwindow,
823 x, y, width, height, False);
827 gdk_window_clear_area_e (GdkWindow *window,
833 GdkWindowPrivate *private;
835 g_return_if_fail (window != NULL);
837 private = (GdkWindowPrivate*) window;
839 if (!private->destroyed)
840 XClearArea (private->xdisplay, private->xwindow,
841 x, y, width, height, True);
845 gdk_window_copy_area (GdkWindow *window,
849 GdkWindow *source_window,
855 GdkWindowPrivate *src_private;
856 GdkWindowPrivate *dest_private;
857 GdkGCPrivate *gc_private;
859 g_return_if_fail (window != NULL);
860 g_return_if_fail (gc != NULL);
862 if (source_window == NULL)
863 source_window = window;
865 src_private = (GdkWindowPrivate*) source_window;
866 dest_private = (GdkWindowPrivate*) window;
867 gc_private = (GdkGCPrivate*) gc;
869 if (!src_private->destroyed && !dest_private->destroyed)
871 XCopyArea (dest_private->xdisplay, src_private->xwindow, dest_private->xwindow,
880 gdk_window_raise (GdkWindow *window)
882 GdkWindowPrivate *private;
884 g_return_if_fail (window != NULL);
886 private = (GdkWindowPrivate*) window;
888 if (!private->destroyed)
889 XRaiseWindow (private->xdisplay, private->xwindow);
893 gdk_window_lower (GdkWindow *window)
895 GdkWindowPrivate *private;
897 g_return_if_fail (window != NULL);
899 private = (GdkWindowPrivate*) window;
901 if (!private->destroyed)
902 XLowerWindow (private->xdisplay, private->xwindow);
906 gdk_window_set_user_data (GdkWindow *window,
909 g_return_if_fail (window != NULL);
911 window->user_data = user_data;
915 gdk_window_set_hints (GdkWindow *window,
924 GdkWindowPrivate *private;
925 XSizeHints size_hints;
927 g_return_if_fail (window != NULL);
929 private = (GdkWindowPrivate*) window;
930 if (private->destroyed)
933 size_hints.flags = 0;
935 if (flags & GDK_HINT_POS)
937 size_hints.flags |= PPosition;
942 if (flags & GDK_HINT_MIN_SIZE)
944 size_hints.flags |= PMinSize;
945 size_hints.min_width = min_width;
946 size_hints.min_height = min_height;
949 if (flags & GDK_HINT_MAX_SIZE)
951 size_hints.flags |= PMaxSize;
952 size_hints.max_width = max_width;
953 size_hints.max_height = max_height;
957 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
961 gdk_window_set_title (GdkWindow *window,
964 GdkWindowPrivate *private;
966 g_return_if_fail (window != NULL);
968 private = (GdkWindowPrivate*) window;
969 if (!private->destroyed)
970 XmbSetWMProperties (private->xdisplay, private->xwindow,
971 title, title, NULL, 0, NULL, NULL, NULL);
975 gdk_window_set_background (GdkWindow *window,
978 GdkWindowPrivate *private;
980 g_return_if_fail (window != NULL);
982 private = (GdkWindowPrivate*) window;
983 if (!private->destroyed)
984 XSetWindowBackground (private->xdisplay, private->xwindow, color->pixel);
988 gdk_window_set_back_pixmap (GdkWindow *window,
990 gint parent_relative)
992 GdkWindowPrivate *window_private;
993 GdkPixmapPrivate *pixmap_private;
996 g_return_if_fail (window != NULL);
998 window_private = (GdkWindowPrivate*) window;
999 pixmap_private = (GdkPixmapPrivate*) pixmap;
1002 xpixmap = pixmap_private->xwindow;
1006 if (parent_relative)
1007 xpixmap = ParentRelative;
1009 if (!window_private->destroyed)
1010 XSetWindowBackgroundPixmap (window_private->xdisplay, window_private->xwindow, xpixmap);
1014 gdk_window_set_cursor (GdkWindow *window,
1017 GdkWindowPrivate *window_private;
1018 GdkCursorPrivate *cursor_private;
1021 g_return_if_fail (window != NULL);
1023 window_private = (GdkWindowPrivate*) window;
1024 cursor_private = (GdkCursorPrivate*) cursor;
1029 xcursor = cursor_private->xcursor;
1031 if (!window_private->destroyed)
1032 XDefineCursor (window_private->xdisplay, window_private->xwindow, xcursor);
1036 gdk_window_set_colormap (GdkWindow *window,
1037 GdkColormap *colormap)
1039 GdkWindowPrivate *window_private;
1040 GdkColormapPrivate *colormap_private;
1042 g_return_if_fail (window != NULL);
1043 g_return_if_fail (colormap != NULL);
1045 window_private = (GdkWindowPrivate*) window;
1046 colormap_private = (GdkColormapPrivate*) colormap;
1048 if (!window_private->destroyed)
1050 XSetWindowColormap (window_private->xdisplay,
1051 window_private->xwindow,
1052 colormap_private->xcolormap);
1054 if (window_private->window_type != GDK_WINDOW_TOPLEVEL)
1055 gdk_window_add_colormap_windows (window);
1060 gdk_window_get_user_data (GdkWindow *window,
1063 g_return_if_fail (window != NULL);
1065 *data = window->user_data;
1069 gdk_window_get_geometry (GdkWindow *window,
1076 GdkWindowPrivate *window_private;
1082 guint tborder_width;
1086 window = (GdkWindow*) &gdk_root_parent;
1088 window_private = (GdkWindowPrivate*) window;
1090 if (!window_private->destroyed)
1092 XGetGeometry (window_private->xdisplay, window_private->xwindow,
1093 &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
1109 gdk_window_get_position (GdkWindow *window,
1113 GdkWindowPrivate *window_private;
1115 g_return_if_fail (window != NULL);
1117 window_private = (GdkWindowPrivate*) window;
1120 *x = window_private->x;
1122 *y = window_private->y;
1126 gdk_window_get_size (GdkWindow *window,
1130 GdkWindowPrivate *window_private;
1132 g_return_if_fail (window != NULL);
1134 window_private = (GdkWindowPrivate*) window;
1137 *width = window_private->width;
1139 *height = window_private->height;
1143 gdk_window_get_visual (GdkWindow *window)
1145 GdkWindowPrivate *window_private;
1146 XWindowAttributes window_attributes;
1148 g_return_val_if_fail (window != NULL, NULL);
1150 window_private = (GdkWindowPrivate*) window;
1151 while (window_private && (window_private->window_type == GDK_WINDOW_PIXMAP))
1152 window_private = (GdkWindowPrivate*) window_private->parent;
1154 if (window_private && !window_private->destroyed)
1156 XGetWindowAttributes (window_private->xdisplay,
1157 window_private->xwindow,
1158 &window_attributes);
1160 return gdk_visual_lookup (window_attributes.visual);
1167 gdk_window_get_colormap (GdkWindow *window)
1169 GdkWindowPrivate *window_private;
1170 XWindowAttributes window_attributes;
1172 g_return_val_if_fail (window != NULL, NULL);
1174 window_private = (GdkWindowPrivate*) window;
1176 if (!window_private->destroyed)
1178 XGetWindowAttributes (window_private->xdisplay,
1179 window_private->xwindow,
1180 &window_attributes);
1182 return gdk_colormap_lookup (window_attributes.colormap);
1189 gdk_window_get_type (GdkWindow *window)
1191 GdkWindowPrivate *window_private;
1193 g_return_val_if_fail (window != NULL, (GdkWindowType) -1);
1195 window_private = (GdkWindowPrivate*) window;
1196 return window_private->window_type;
1200 gdk_window_get_origin (GdkWindow *window,
1204 GdkWindowPrivate *private;
1209 g_return_val_if_fail (window != NULL, 0);
1211 private = (GdkWindowPrivate*) window;
1213 if (!private->destroyed)
1215 return_val = XTranslateCoordinates (private->xdisplay,
1233 gdk_window_get_pointer (GdkWindow *window,
1236 GdkModifierType *mask)
1238 GdkWindowPrivate *private;
1239 GdkWindow *return_val;
1247 window = (GdkWindow*) &gdk_root_parent;
1249 private = (GdkWindowPrivate*) window;
1252 if (!private->destroyed &&
1253 XQueryPointer (private->xdisplay, private->xwindow, &root, &child,
1254 &rootx, &rooty, &winx, &winy, &xmask))
1258 if (mask) *mask = xmask;
1261 return_val = gdk_window_lookup (child);
1268 gdk_window_get_parent (GdkWindow *window)
1270 g_return_val_if_fail (window != NULL, NULL);
1272 return ((GdkWindowPrivate*) window)->parent;
1276 gdk_window_get_toplevel (GdkWindow *window)
1278 GdkWindowPrivate *private;
1280 g_return_val_if_fail (window != NULL, NULL);
1282 private = (GdkWindowPrivate*) window;
1284 while (private->window_type == GDK_WINDOW_CHILD)
1286 window = ((GdkWindowPrivate*) window)->parent;
1287 private = (GdkWindowPrivate*) window;
1294 gdk_window_get_children (GdkWindow *window)
1296 GdkWindowPrivate *private;
1302 unsigned int nchildren;
1305 g_return_val_if_fail (window != NULL, NULL);
1307 private = (GdkWindowPrivate*) window;
1308 if (private->destroyed)
1311 XQueryTree (private->xdisplay, private->xwindow,
1312 &root, &parent, &xchildren, &nchildren);
1318 for (i = 0; i < nchildren; i++)
1320 child = gdk_window_lookup (xchildren[i]);
1322 children = g_list_prepend (children, child);
1332 gdk_window_get_events (GdkWindow *window)
1334 GdkWindowPrivate *private;
1335 XWindowAttributes attrs;
1336 GdkEventMask event_mask;
1339 g_return_val_if_fail (window != NULL, 0);
1341 private = (GdkWindowPrivate*) window;
1342 if (private->destroyed)
1345 XGetWindowAttributes (gdk_display, private->xwindow,
1349 for (i = 0; i < nevent_masks; i++)
1351 if (attrs.your_event_mask & event_mask_table[i])
1352 event_mask |= 1 << (i + 1);
1359 gdk_window_set_events (GdkWindow *window,
1360 GdkEventMask event_mask)
1362 GdkWindowPrivate *private;
1366 g_return_if_fail (window != NULL);
1368 private = (GdkWindowPrivate*) window;
1369 if (private->destroyed)
1372 xevent_mask = StructureNotifyMask;
1373 for (i = 0; i < nevent_masks; i++)
1375 if (event_mask & (1 << (i + 1)))
1376 xevent_mask |= event_mask_table[i];
1379 XSelectInput (gdk_display, private->xwindow,
1384 gdk_window_add_colormap_windows (GdkWindow *window)
1386 GdkWindow *toplevel;
1387 GdkWindowPrivate *toplevel_private;
1388 GdkWindowPrivate *window_private;
1389 Window *old_windows;
1390 Window *new_windows;
1393 g_return_if_fail (window != NULL);
1395 toplevel = gdk_window_get_toplevel (window);
1396 toplevel_private = (GdkWindowPrivate*) toplevel;
1397 window_private = (GdkWindowPrivate*) window;
1398 if (window_private->destroyed)
1401 if (!XGetWMColormapWindows (toplevel_private->xdisplay,
1402 toplevel_private->xwindow,
1403 &old_windows, &count))
1409 for (i = 0; i < count; i++)
1410 if (old_windows[i] == window_private->xwindow)
1413 new_windows = g_new (Window, count + 1);
1415 for (i = 0; i < count; i++)
1416 new_windows[i] = old_windows[i];
1417 new_windows[count] = window_private->xwindow;
1419 XSetWMColormapWindows (toplevel_private->xdisplay,
1420 toplevel_private->xwindow,
1421 new_windows, count + 1);
1423 g_free (new_windows);
1425 XFree (old_windows);
1429 * This needs the X11 shape extension.
1430 * If not available, simply remove the call to
1431 * XShapeCombineMask. Shaped windows will look
1432 * ugly, but programs still work. Stefan Wille
1435 gdk_window_shape_combine_mask (GdkWindow *window,
1439 GdkWindowPrivate *window_private;
1442 g_return_if_fail (window != NULL);
1444 /* This is needed, according to raster */
1445 gdk_window_set_override_redirect(window, TRUE);
1447 window_private = (GdkWindowPrivate*) window;
1448 if (window_private->destroyed)
1453 GdkWindowPrivate *pixmap_private;
1455 pixmap_private = (GdkWindowPrivate*) mask;
1456 pixmap = (Pixmap) pixmap_private->xwindow;
1465 XShapeCombineMask (window_private->xdisplay,
1466 window_private->xwindow,
1474 gdk_dnd_drag_addwindow (GdkWindow *window)
1476 GdkWindowPrivate *window_private;
1478 g_return_if_fail (window != NULL);
1480 window_private = (GdkWindowPrivate *) window;
1481 if (window_private->destroyed)
1484 if (window_private->dnd_drag_enabled == 1 && gdk_dnd.drag_really == 0)
1486 gdk_dnd.drag_numwindows++;
1487 gdk_dnd.drag_startwindows = g_realloc (gdk_dnd.drag_startwindows,
1488 gdk_dnd.drag_numwindows
1489 * sizeof(GdkWindow *));
1490 gdk_dnd.drag_startwindows[gdk_dnd.drag_numwindows - 1] = window;
1491 window_private->dnd_drag_accepted = 0;
1494 g_warning ("dnd_really is 1 or drag is not enabled! can't addwindow\n");
1498 gdk_window_dnd_drag_set (GdkWindow *window,
1503 GdkWindowPrivate *window_private;
1506 g_return_if_fail (window != NULL);
1507 window_private = (GdkWindowPrivate *) window;
1508 if (window_private->destroyed)
1511 window_private->dnd_drag_enabled = drag_enable ? 1 : 0;
1515 g_return_if_fail(typelist != NULL);
1517 if (window_private->dnd_drag_data_numtypesavail > 3)
1519 window_private->dnd_drag_data_numtypesavail = numtypes;
1521 window_private->dnd_drag_data_typesavail =
1522 g_realloc (window_private->dnd_drag_data_typesavail,
1523 (numtypes + 1) * sizeof (GdkAtom));
1525 for (i = 0; i < numtypes; i++)
1527 /* Allow blanket use of ALL to get anything... */
1528 if (strcmp (typelist[i], "ALL"))
1529 window_private->dnd_drag_data_typesavail[i] =
1530 gdk_atom_intern (typelist[i], FALSE);
1532 window_private->dnd_drag_data_typesavail[i] = None;
1536 * set our extended type list if we need to
1539 gdk_property_change(window, gdk_dnd.gdk_XdeTypelist,
1540 XA_PRIMARY, 32, GDK_PROP_MODE_REPLACE,
1541 (guchar *)(window_private->dnd_drag_data_typesavail
1542 + (sizeof(GdkAtom) * 3)),
1543 (numtypes - 3) * sizeof(GdkAtom));
1545 gdk_property_delete (window, gdk_dnd.gdk_XdeTypelist);
1549 g_free (window_private->dnd_drag_data_typesavail);
1550 window_private->dnd_drag_data_typesavail = NULL;
1551 window_private->dnd_drag_data_numtypesavail = 0;
1556 gdk_window_dnd_drop_set (GdkWindow *window,
1560 guint8 destructive_op)
1562 GdkWindowPrivate *window_private;
1565 g_return_if_fail (window != NULL);
1566 window_private = (GdkWindowPrivate *) window;
1567 if (window_private->destroyed)
1570 window_private->dnd_drop_enabled = drop_enable ? 1 : 0;
1573 g_return_if_fail(typelist != NULL);
1575 window_private->dnd_drop_data_numtypesavail = numtypes;
1577 window_private->dnd_drop_data_typesavail =
1578 g_realloc (window_private->dnd_drop_data_typesavail,
1579 (numtypes + 1) * sizeof (GdkAtom));
1581 for (i = 0; i < numtypes; i++)
1582 window_private->dnd_drop_data_typesavail[i] =
1583 gdk_atom_intern (typelist[i], FALSE);
1585 window_private->dnd_drop_destructive_op = destructive_op;
1590 * This is used to reply to a GDK_DRAG_REQUEST event
1591 * (which may be generated by XdeRequest or a confirmed drop...
1594 gdk_window_dnd_data_set (GdkWindow *window,
1597 gulong data_numbytes)
1599 GdkWindowPrivate *window_private;
1601 GdkEventDropDataAvailable tmp_ev;
1604 g_return_if_fail (window != NULL);
1605 g_return_if_fail (event != NULL);
1606 g_return_if_fail (data != NULL);
1607 g_return_if_fail (data_numbytes > 0);
1608 g_return_if_fail (event->type == GDK_DRAG_REQUEST);
1610 window_private = (GdkWindowPrivate *) window;
1611 g_return_if_fail (window_private->dnd_drag_accepted != 0);
1612 if (window_private->destroyed)
1615 /* We set the property on our window... */
1616 gdk_property_change (window, window_private->dnd_drag_data_type,
1617 XA_PRIMARY, 8, GDK_PROP_MODE_REPLACE, data,
1619 tmp = gdk_atom_name(window_private->dnd_drag_data_type);
1621 g_print("DnD type %s on window %ld\n", tmp, window_private->xwindow);
1626 * Then we send the event to tell the receiving window that the
1629 tmp_ev.u.allflags = 0;
1630 tmp_ev.u.flags.protocol_version = DND_PROTOCOL_VERSION;
1631 tmp_ev.u.flags.isdrop = event->dragrequest.isdrop;
1633 sev.xclient.type = ClientMessage;
1634 sev.xclient.format = 32;
1635 sev.xclient.window = event->dragrequest.requestor;
1636 sev.xclient.message_type = gdk_dnd.gdk_XdeDataAvailable;
1637 sev.xclient.data.l[0] = window_private->xwindow;
1638 sev.xclient.data.l[1] = tmp_ev.u.allflags;
1639 sev.xclient.data.l[2] = window_private->dnd_drag_data_type;
1641 if (event->dragrequest.isdrop)
1642 sev.xclient.data.l[3] = event->dragrequest.drop_coords.x +
1643 (event->dragrequest.drop_coords.y << 16);
1645 sev.xclient.data.l[3] = 0;
1647 sev.xclient.data.l[4] = event->dragrequest.timestamp;
1649 if (!gdk_send_xevent (event->dragrequest.requestor, False,
1651 GDK_NOTE (DND, g_print("Sending XdeDataAvailable to %#x failed\n",
1652 event->dragrequest.requestor));
1657 gdk_window_add_filter (GdkWindow *window,
1658 GdkFilterFunc function,
1661 GdkWindowPrivate *private;
1663 GdkEventFilter *filter;
1665 private = (GdkWindowPrivate*) window;
1666 if (private && private->destroyed)
1670 tmp_list = private->filters;
1672 tmp_list = gdk_default_filters;
1676 filter = (GdkEventFilter *)tmp_list->data;
1677 if ((filter->function == function) && (filter->data == data))
1679 tmp_list = tmp_list->next;
1682 filter = g_new (GdkEventFilter, 1);
1683 filter->function = function;
1684 filter->data = data;
1687 private->filters = g_list_append (private->filters, filter);
1689 gdk_default_filters = g_list_append (gdk_default_filters, filter);
1693 gdk_window_remove_filter (GdkWindow *window,
1694 GdkFilterFunc function,
1697 GdkWindowPrivate *private;
1699 GdkEventFilter *filter;
1701 private = (GdkWindowPrivate*) window;
1704 tmp_list = private->filters;
1706 tmp_list = gdk_default_filters;
1710 filter = (GdkEventFilter *)tmp_list->data;
1711 tmp_list = tmp_list->next;
1713 if ((filter->function == function) && (filter->data == data))
1716 private->filters = g_list_remove_link (private->filters, tmp_list);
1718 gdk_default_filters = g_list_remove_link (gdk_default_filters, tmp_list);
1719 g_list_free_1 (tmp_list);
1728 gdk_window_set_override_redirect(GdkWindow *window,
1729 gboolean override_redirect)
1731 GdkWindowPrivate *private;
1732 XSetWindowAttributes attr;
1734 g_return_if_fail (window != NULL);
1735 private = (GdkWindowPrivate*) window;
1736 if (private->destroyed)
1739 attr.override_redirect = (override_redirect == FALSE)?False:True;
1740 XChangeWindowAttributes(gdk_display,
1741 ((GdkWindowPrivate *)window)->xwindow,
1747 gdk_window_set_icon (GdkWindow *window,
1748 GdkWindow *icon_window,
1753 GdkWindowPrivate *window_private;
1754 GdkWindowPrivate *private;
1756 g_return_if_fail (window != NULL);
1757 window_private = (GdkWindowPrivate*) window;
1758 if (window_private->destroyed)
1763 if (icon_window != NULL)
1765 private = (GdkWindowPrivate *)icon_window;
1766 wm_hints.flags |= IconWindowHint;
1767 wm_hints.icon_window = private->xwindow;
1772 private = (GdkWindowPrivate *)pixmap;
1773 wm_hints.flags |= IconPixmapHint;
1774 wm_hints.icon_pixmap = private->xwindow;
1779 private = (GdkWindowPrivate *)mask;
1780 wm_hints.flags |= IconMaskHint;
1781 wm_hints.icon_mask = private->xwindow;
1784 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1788 gdk_window_set_icon_name (GdkWindow *window,
1791 GdkWindowPrivate *window_private;
1792 XTextProperty property;
1795 g_return_if_fail (window != NULL);
1796 window_private = (GdkWindowPrivate*) window;
1797 if (window_private->destroyed)
1799 res = XmbTextListToTextProperty (window_private->xdisplay,
1800 &name, 1, XStdICCTextStyle,
1804 g_warning("Error converting icon name to text property: %d\n", res);
1808 XSetWMIconName (window_private->xdisplay, window_private->xwindow,
1811 XFree(property.value);
1815 gdk_window_set_group (GdkWindow *window,
1819 GdkWindowPrivate *window_private;
1820 GdkWindowPrivate *private;
1822 g_return_if_fail (window != NULL);
1823 g_return_if_fail (leader != NULL);
1824 window_private = (GdkWindowPrivate*) window;
1825 if (window_private->destroyed)
1828 private = (GdkWindowPrivate *)leader;
1829 wm_hints.flags = WindowGroupHint;
1830 wm_hints.window_group = private->xwindow;
1832 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1836 gdk_window_set_mwm_hints (GdkWindow *window,
1837 MotifWmHints *new_hints)
1839 static Atom hints_atom = None;
1840 MotifWmHints *hints;
1846 GdkWindowPrivate *window_private;
1848 g_return_if_fail (window != NULL);
1849 window_private = (GdkWindowPrivate*) window;
1850 if (window_private->destroyed)
1854 hints_atom = XInternAtom (window_private->xdisplay,
1855 _XA_MOTIF_WM_HINTS, FALSE);
1857 XGetWindowProperty (window_private->xdisplay, window_private->xwindow,
1858 hints_atom, 0, sizeof(MotifWmHints)/4,
1859 False, AnyPropertyType, &type, &format, &nitems,
1860 &bytes_after, (guchar **)&hints);
1866 if (new_hints->flags & MWM_HINTS_FUNCTIONS)
1868 hints->flags |= MWM_HINTS_FUNCTIONS;
1869 hints->functions = new_hints->functions;
1871 if (new_hints->flags & MWM_HINTS_DECORATIONS)
1873 hints->flags |= MWM_HINTS_DECORATIONS;
1874 hints->decorations = new_hints->decorations;
1878 XChangeProperty (window_private->xdisplay, window_private->xwindow,
1879 hints_atom, hints_atom, 32, PropModeReplace,
1880 (guchar *)hints, sizeof(MotifWmHints)/4);
1882 if (hints != new_hints)
1887 gdk_window_set_decorations (GdkWindow *window,
1888 GdkWMDecoration decorations)
1892 hints.flags = MWM_HINTS_DECORATIONS;
1893 hints.decorations = decorations;
1895 gdk_window_set_mwm_hints (window, &hints);
1899 gdk_window_set_functions (GdkWindow *window,
1900 GdkWMFunction functions)
1904 hints.flags = MWM_HINTS_FUNCTIONS;
1905 hints.functions = functions;
1907 gdk_window_set_mwm_hints (window, &hints);