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;
421 private = g_new (GdkWindowPrivate, 1);
422 window = (GdkWindow*) private;
424 XGetWindowAttributes (gdk_display, anid, &attrs);
426 /* FIXME: This is pretty expensive. Maybe the caller should supply
428 XQueryTree (gdk_display, anid, &root, &parent, &children, &nchildren);
430 private->parent = gdk_xid_table_lookup (parent);
432 private->xwindow = anid;
433 private->xdisplay = gdk_display;
434 private->x = attrs.x;
435 private->y = attrs.y;
436 private->width = attrs.width;
437 private->height = attrs.height;
438 private->resize_count = 0;
439 private->ref_count = 1;
440 private->window_type = GDK_WINDOW_FOREIGN;
441 private->destroyed = FALSE;
442 private->extension_events = 0;
445 private->dnd_drag_data_type = None;
446 private->dnd_drag_data_typesavail =
447 private->dnd_drop_data_typesavail = NULL;
448 private->dnd_drop_enabled = private->dnd_drag_enabled =
449 private->dnd_drag_accepted = private->dnd_drag_datashow =
450 private->dnd_drop_data_numtypesavail =
451 private->dnd_drag_data_numtypesavail = 0;
452 private->dnd_drag_eventmask = private->dnd_drag_savedeventmask = 0;
454 private->filters = NULL;
456 window->user_data = NULL;
458 gdk_window_ref (window);
459 gdk_xid_table_insert (&private->xwindow, window);
464 /* Call this function when you want a window and all its children to
465 disappear. When xdestroy is true, a request to destroy the XWindow
466 is sent out. When it is false, it is assumed that the XWindow has
467 been or will be destroyed by destroying some ancestor of this
471 gdk_window_internal_destroy (GdkWindow *window, gboolean xdestroy,
472 gboolean our_destroy)
474 GdkWindowPrivate *private;
475 GdkWindowPrivate *temp_private;
476 GdkWindow *temp_window;
480 g_return_if_fail (window != NULL);
482 private = (GdkWindowPrivate*) window;
484 switch (private->window_type)
486 case GDK_WINDOW_TOPLEVEL:
487 case GDK_WINDOW_CHILD:
488 case GDK_WINDOW_DIALOG:
489 case GDK_WINDOW_TEMP:
490 case GDK_WINDOW_FOREIGN:
491 if (!private->destroyed)
493 if (private->window_type != GDK_WINDOW_FOREIGN)
495 children = gdk_window_get_children (window);
500 temp_window = tmp->data;
503 temp_private = (GdkWindowPrivate*) temp_window;
505 gdk_window_internal_destroy (temp_window, FALSE,
509 g_list_free (children);
512 if (private->extension_events != 0)
513 gdk_input_window_destroy (window);
515 if(private->dnd_drag_data_numtypesavail > 0)
517 g_free (private->dnd_drag_data_typesavail);
518 private->dnd_drag_data_typesavail = NULL;
520 if(private->dnd_drop_data_numtypesavail > 0)
522 g_free (private->dnd_drop_data_typesavail);
523 private->dnd_drop_data_typesavail = NULL;
526 if (private->filters)
528 tmp = private->filters;
536 g_list_free (private->filters);
537 private->filters = NULL;
540 if (private->window_type == GDK_WINDOW_FOREIGN)
542 if (our_destroy && (private->parent != NULL))
544 /* It's somebody elses window, but in our heirarchy,
545 * so reparent it to the root window, and then send
546 * it a delete event, as if we were a WM
548 XClientMessageEvent xevent;
550 gdk_window_hide (window);
551 gdk_window_reparent (window, NULL, 0, 0);
553 xevent.type = ClientMessage;
554 xevent.window = private->xwindow;
555 xevent.message_type = gdk_wm_protocols;
557 xevent.data.l[0] = gdk_wm_delete_window;
558 xevent.data.l[1] = CurrentTime;
560 XSendEvent (private->xdisplay, private->xwindow,
561 False, 0, (XEvent *)&xevent);
565 XDestroyWindow (private->xdisplay, private->xwindow);
567 private->destroyed = TRUE;
571 case GDK_WINDOW_ROOT:
572 g_error ("attempted to destroy root window");
575 case GDK_WINDOW_PIXMAP:
576 g_error ("called gdk_window_destroy on a pixmap (use gdk_pixmap_unref)");
581 /* Like internal_destroy, but also destroys the reference created by
585 gdk_window_destroy (GdkWindow *window)
587 gdk_window_internal_destroy (window, TRUE, TRUE);
588 gdk_window_unref (window);
591 /* This function is called when the XWindow is really gone. */
594 gdk_window_destroy_notify (GdkWindow *window)
596 GdkWindowPrivate *private;
598 g_return_if_fail (window != NULL);
600 private = (GdkWindowPrivate*) window;
602 if (!private->destroyed)
604 if (private->window_type == GDK_WINDOW_FOREIGN)
605 gdk_window_internal_destroy (window, FALSE, FALSE);
607 g_warning ("Window %#lx unexpectedly destroyed", private->xwindow);
610 gdk_xid_table_remove (private->xwindow);
611 gdk_window_unref (window);
615 gdk_window_ref (GdkWindow *window)
617 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
618 g_return_val_if_fail (window != NULL, NULL);
620 private->ref_count += 1;
625 gdk_window_unref (GdkWindow *window)
627 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
628 g_return_if_fail (window != NULL);
630 private->ref_count -= 1;
631 if (private->ref_count == 0)
633 if (!private->destroyed)
634 g_warning ("losing last reference to undestroyed window\n");
640 gdk_window_show (GdkWindow *window)
642 GdkWindowPrivate *private;
644 g_return_if_fail (window != NULL);
646 private = (GdkWindowPrivate*) window;
647 if (!private->destroyed)
649 XRaiseWindow (private->xdisplay, private->xwindow);
650 XMapWindow (private->xdisplay, private->xwindow);
655 gdk_window_hide (GdkWindow *window)
657 GdkWindowPrivate *private;
659 g_return_if_fail (window != NULL);
661 private = (GdkWindowPrivate*) window;
662 if (!private->destroyed)
663 XUnmapWindow (private->xdisplay, private->xwindow);
667 gdk_window_withdraw (GdkWindow *window)
669 GdkWindowPrivate *private;
671 g_return_if_fail (window != NULL);
673 private = (GdkWindowPrivate*) window;
674 if (!private->destroyed)
675 XWithdrawWindow (private->xdisplay, private->xwindow, 0);
679 gdk_window_move (GdkWindow *window,
683 GdkWindowPrivate *private;
685 g_return_if_fail (window != NULL);
687 private = (GdkWindowPrivate*) window;
688 if (!private->destroyed)
690 XMoveWindow (private->xdisplay, private->xwindow, x, y);
692 if (private->window_type == GDK_WINDOW_CHILD)
701 gdk_window_resize (GdkWindow *window,
705 GdkWindowPrivate *private;
707 g_return_if_fail (window != NULL);
714 private = (GdkWindowPrivate*) window;
716 if (!private->destroyed &&
717 ((private->resize_count > 0) ||
718 (private->width != (guint16) width) ||
719 (private->height != (guint16) height)))
721 XResizeWindow (private->xdisplay, private->xwindow, width, height);
722 private->resize_count += 1;
724 if (private->window_type == GDK_WINDOW_CHILD)
726 private->width = width;
727 private->height = height;
733 gdk_window_move_resize (GdkWindow *window,
739 GdkWindowPrivate *private;
741 g_return_if_fail (window != NULL);
748 private = (GdkWindowPrivate*) window;
749 if (!private->destroyed)
751 XMoveResizeWindow (private->xdisplay, private->xwindow, x, y, width, height);
753 if (private->window_type == GDK_WINDOW_CHILD)
757 private->width = width;
758 private->height = height;
764 gdk_window_reparent (GdkWindow *window,
765 GdkWindow *new_parent,
769 GdkWindowPrivate *window_private;
770 GdkWindowPrivate *parent_private;
772 g_return_if_fail (window != NULL);
775 new_parent = (GdkWindow*) &gdk_root_parent;
777 window_private = (GdkWindowPrivate*) window;
778 parent_private = (GdkWindowPrivate*) new_parent;
780 if (!window_private->destroyed && !parent_private->destroyed)
781 XReparentWindow (window_private->xdisplay,
782 window_private->xwindow,
783 parent_private->xwindow,
788 gdk_window_clear (GdkWindow *window)
790 GdkWindowPrivate *private;
792 g_return_if_fail (window != NULL);
794 private = (GdkWindowPrivate*) window;
796 if (!private->destroyed)
797 XClearWindow (private->xdisplay, private->xwindow);
801 gdk_window_clear_area (GdkWindow *window,
807 GdkWindowPrivate *private;
809 g_return_if_fail (window != NULL);
811 private = (GdkWindowPrivate*) window;
813 if (!private->destroyed)
814 XClearArea (private->xdisplay, private->xwindow,
815 x, y, width, height, False);
819 gdk_window_clear_area_e (GdkWindow *window,
825 GdkWindowPrivate *private;
827 g_return_if_fail (window != NULL);
829 private = (GdkWindowPrivate*) window;
831 if (!private->destroyed)
832 XClearArea (private->xdisplay, private->xwindow,
833 x, y, width, height, True);
837 gdk_window_copy_area (GdkWindow *window,
841 GdkWindow *source_window,
847 GdkWindowPrivate *src_private;
848 GdkWindowPrivate *dest_private;
849 GdkGCPrivate *gc_private;
851 g_return_if_fail (window != NULL);
852 g_return_if_fail (gc != NULL);
854 if (source_window == NULL)
855 source_window = window;
857 src_private = (GdkWindowPrivate*) source_window;
858 dest_private = (GdkWindowPrivate*) window;
859 gc_private = (GdkGCPrivate*) gc;
861 if (!src_private->destroyed && !dest_private->destroyed)
863 XCopyArea (dest_private->xdisplay, src_private->xwindow, dest_private->xwindow,
872 gdk_window_raise (GdkWindow *window)
874 GdkWindowPrivate *private;
876 g_return_if_fail (window != NULL);
878 private = (GdkWindowPrivate*) window;
880 if (!private->destroyed)
881 XRaiseWindow (private->xdisplay, private->xwindow);
885 gdk_window_lower (GdkWindow *window)
887 GdkWindowPrivate *private;
889 g_return_if_fail (window != NULL);
891 private = (GdkWindowPrivate*) window;
893 if (!private->destroyed)
894 XLowerWindow (private->xdisplay, private->xwindow);
898 gdk_window_set_user_data (GdkWindow *window,
901 g_return_if_fail (window != NULL);
903 window->user_data = user_data;
907 gdk_window_set_hints (GdkWindow *window,
916 GdkWindowPrivate *private;
917 XSizeHints size_hints;
919 g_return_if_fail (window != NULL);
921 private = (GdkWindowPrivate*) window;
922 if (private->destroyed)
925 size_hints.flags = 0;
927 if (flags & GDK_HINT_POS)
929 size_hints.flags |= PPosition;
934 if (flags & GDK_HINT_MIN_SIZE)
936 size_hints.flags |= PMinSize;
937 size_hints.min_width = min_width;
938 size_hints.min_height = min_height;
941 if (flags & GDK_HINT_MAX_SIZE)
943 size_hints.flags |= PMaxSize;
944 size_hints.max_width = max_width;
945 size_hints.max_height = max_height;
949 XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
953 gdk_window_set_title (GdkWindow *window,
956 GdkWindowPrivate *private;
958 g_return_if_fail (window != NULL);
960 private = (GdkWindowPrivate*) window;
961 if (!private->destroyed)
962 XmbSetWMProperties (private->xdisplay, private->xwindow,
963 title, title, NULL, 0, NULL, NULL, NULL);
967 gdk_window_set_background (GdkWindow *window,
970 GdkWindowPrivate *private;
972 g_return_if_fail (window != NULL);
974 private = (GdkWindowPrivate*) window;
975 if (!private->destroyed)
976 XSetWindowBackground (private->xdisplay, private->xwindow, color->pixel);
980 gdk_window_set_back_pixmap (GdkWindow *window,
982 gint parent_relative)
984 GdkWindowPrivate *window_private;
985 GdkPixmapPrivate *pixmap_private;
988 g_return_if_fail (window != NULL);
990 window_private = (GdkWindowPrivate*) window;
991 pixmap_private = (GdkPixmapPrivate*) pixmap;
994 xpixmap = pixmap_private->xwindow;
999 xpixmap = ParentRelative;
1001 if (!window_private->destroyed)
1002 XSetWindowBackgroundPixmap (window_private->xdisplay, window_private->xwindow, xpixmap);
1006 gdk_window_set_cursor (GdkWindow *window,
1009 GdkWindowPrivate *window_private;
1010 GdkCursorPrivate *cursor_private;
1013 g_return_if_fail (window != NULL);
1015 window_private = (GdkWindowPrivate*) window;
1016 cursor_private = (GdkCursorPrivate*) cursor;
1021 xcursor = cursor_private->xcursor;
1023 if (!window_private->destroyed)
1024 XDefineCursor (window_private->xdisplay, window_private->xwindow, xcursor);
1028 gdk_window_set_colormap (GdkWindow *window,
1029 GdkColormap *colormap)
1031 GdkWindowPrivate *window_private;
1032 GdkColormapPrivate *colormap_private;
1034 g_return_if_fail (window != NULL);
1035 g_return_if_fail (colormap != NULL);
1037 window_private = (GdkWindowPrivate*) window;
1038 colormap_private = (GdkColormapPrivate*) colormap;
1040 if (!window_private->destroyed)
1042 XSetWindowColormap (window_private->xdisplay,
1043 window_private->xwindow,
1044 colormap_private->xcolormap);
1046 if (window_private->window_type != GDK_WINDOW_TOPLEVEL)
1047 gdk_window_add_colormap_windows (window);
1052 gdk_window_get_user_data (GdkWindow *window,
1055 g_return_if_fail (window != NULL);
1057 *data = window->user_data;
1061 gdk_window_get_geometry (GdkWindow *window,
1068 GdkWindowPrivate *window_private;
1074 guint tborder_width;
1078 window = (GdkWindow*) &gdk_root_parent;
1080 window_private = (GdkWindowPrivate*) window;
1082 if (!window_private->destroyed)
1084 XGetGeometry (window_private->xdisplay, window_private->xwindow,
1085 &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
1101 gdk_window_get_position (GdkWindow *window,
1105 GdkWindowPrivate *window_private;
1107 g_return_if_fail (window != NULL);
1109 window_private = (GdkWindowPrivate*) window;
1112 *x = window_private->x;
1114 *y = window_private->y;
1118 gdk_window_get_size (GdkWindow *window,
1122 GdkWindowPrivate *window_private;
1124 g_return_if_fail (window != NULL);
1126 window_private = (GdkWindowPrivate*) window;
1129 *width = window_private->width;
1131 *height = window_private->height;
1135 gdk_window_get_visual (GdkWindow *window)
1137 GdkWindowPrivate *window_private;
1138 XWindowAttributes window_attributes;
1140 g_return_val_if_fail (window != NULL, NULL);
1142 window_private = (GdkWindowPrivate*) window;
1143 while (window_private && (window_private->window_type == GDK_WINDOW_PIXMAP))
1144 window_private = (GdkWindowPrivate*) window_private->parent;
1146 if (window_private && !window_private->destroyed)
1148 XGetWindowAttributes (window_private->xdisplay,
1149 window_private->xwindow,
1150 &window_attributes);
1152 return gdk_visual_lookup (window_attributes.visual);
1159 gdk_window_get_colormap (GdkWindow *window)
1161 GdkWindowPrivate *window_private;
1162 XWindowAttributes window_attributes;
1164 g_return_val_if_fail (window != NULL, NULL);
1166 window_private = (GdkWindowPrivate*) window;
1168 if (!window_private->destroyed)
1170 XGetWindowAttributes (window_private->xdisplay,
1171 window_private->xwindow,
1172 &window_attributes);
1174 return gdk_colormap_lookup (window_attributes.colormap);
1181 gdk_window_get_type (GdkWindow *window)
1183 GdkWindowPrivate *window_private;
1185 g_return_val_if_fail (window != NULL, (GdkWindowType) -1);
1187 window_private = (GdkWindowPrivate*) window;
1188 return window_private->window_type;
1192 gdk_window_get_origin (GdkWindow *window,
1196 GdkWindowPrivate *private;
1201 g_return_val_if_fail (window != NULL, 0);
1203 private = (GdkWindowPrivate*) window;
1205 if (!private->destroyed)
1207 return_val = XTranslateCoordinates (private->xdisplay,
1225 gdk_window_get_pointer (GdkWindow *window,
1228 GdkModifierType *mask)
1230 GdkWindowPrivate *private;
1231 GdkWindow *return_val;
1239 window = (GdkWindow*) &gdk_root_parent;
1241 private = (GdkWindowPrivate*) window;
1244 if (!private->destroyed &&
1245 XQueryPointer (private->xdisplay, private->xwindow, &root, &child,
1246 &rootx, &rooty, &winx, &winy, &xmask))
1250 if (mask) *mask = xmask;
1253 return_val = gdk_window_lookup (child);
1260 gdk_window_get_parent (GdkWindow *window)
1262 g_return_val_if_fail (window != NULL, NULL);
1264 return ((GdkWindowPrivate*) window)->parent;
1268 gdk_window_get_toplevel (GdkWindow *window)
1270 GdkWindowPrivate *private;
1272 g_return_val_if_fail (window != NULL, NULL);
1274 private = (GdkWindowPrivate*) window;
1276 while (private->window_type == GDK_WINDOW_CHILD)
1278 window = ((GdkWindowPrivate*) window)->parent;
1279 private = (GdkWindowPrivate*) window;
1286 gdk_window_get_children (GdkWindow *window)
1288 GdkWindowPrivate *private;
1294 unsigned int nchildren;
1297 g_return_val_if_fail (window != NULL, NULL);
1299 private = (GdkWindowPrivate*) window;
1300 if (private->destroyed)
1303 XQueryTree (private->xdisplay, private->xwindow,
1304 &root, &parent, &xchildren, &nchildren);
1310 for (i = 0; i < nchildren; i++)
1312 child = gdk_window_lookup (xchildren[i]);
1314 children = g_list_prepend (children, child);
1324 gdk_window_get_events (GdkWindow *window)
1326 GdkWindowPrivate *private;
1327 XWindowAttributes attrs;
1328 GdkEventMask event_mask;
1331 g_return_val_if_fail (window != NULL, 0);
1333 private = (GdkWindowPrivate*) window;
1334 if (private->destroyed)
1337 XGetWindowAttributes (gdk_display, private->xwindow,
1341 for (i = 0; i < nevent_masks; i++)
1343 if (attrs.your_event_mask & event_mask_table[i])
1344 event_mask |= 1 << (i + 1);
1351 gdk_window_set_events (GdkWindow *window,
1352 GdkEventMask event_mask)
1354 GdkWindowPrivate *private;
1358 g_return_if_fail (window != NULL);
1360 private = (GdkWindowPrivate*) window;
1361 if (private->destroyed)
1364 xevent_mask = StructureNotifyMask;
1365 for (i = 0; i < nevent_masks; i++)
1367 if (event_mask & (1 << (i + 1)))
1368 xevent_mask |= event_mask_table[i];
1371 XSelectInput (gdk_display, private->xwindow,
1376 gdk_window_add_colormap_windows (GdkWindow *window)
1378 GdkWindow *toplevel;
1379 GdkWindowPrivate *toplevel_private;
1380 GdkWindowPrivate *window_private;
1381 Window *old_windows;
1382 Window *new_windows;
1385 g_return_if_fail (window != NULL);
1387 toplevel = gdk_window_get_toplevel (window);
1388 toplevel_private = (GdkWindowPrivate*) toplevel;
1389 window_private = (GdkWindowPrivate*) window;
1390 if (window_private->destroyed)
1393 if (!XGetWMColormapWindows (toplevel_private->xdisplay,
1394 toplevel_private->xwindow,
1395 &old_windows, &count))
1401 for (i = 0; i < count; i++)
1402 if (old_windows[i] == window_private->xwindow)
1405 new_windows = g_new (Window, count + 1);
1407 for (i = 0; i < count; i++)
1408 new_windows[i] = old_windows[i];
1409 new_windows[count] = window_private->xwindow;
1411 XSetWMColormapWindows (toplevel_private->xdisplay,
1412 toplevel_private->xwindow,
1413 new_windows, count + 1);
1415 g_free (new_windows);
1417 XFree (old_windows);
1421 * This needs the X11 shape extension.
1422 * If not available, simply remove the call to
1423 * XShapeCombineMask. Shaped windows will look
1424 * ugly, but programs still work. Stefan Wille
1427 gdk_window_shape_combine_mask (GdkWindow *window,
1431 GdkWindowPrivate *window_private;
1434 g_return_if_fail (window != NULL);
1436 /* This is needed, according to raster */
1437 gdk_window_set_override_redirect(window, TRUE);
1439 window_private = (GdkWindowPrivate*) window;
1440 if (window_private->destroyed)
1445 GdkWindowPrivate *pixmap_private;
1447 pixmap_private = (GdkWindowPrivate*) mask;
1448 pixmap = (Pixmap) pixmap_private->xwindow;
1457 XShapeCombineMask (window_private->xdisplay,
1458 window_private->xwindow,
1466 gdk_dnd_drag_addwindow (GdkWindow *window)
1468 GdkWindowPrivate *window_private;
1470 g_return_if_fail (window != NULL);
1472 window_private = (GdkWindowPrivate *) window;
1473 if (window_private->destroyed)
1476 if (window_private->dnd_drag_enabled == 1 && gdk_dnd.drag_really == 0)
1478 gdk_dnd.drag_numwindows++;
1479 gdk_dnd.drag_startwindows = g_realloc (gdk_dnd.drag_startwindows,
1480 gdk_dnd.drag_numwindows
1481 * sizeof(GdkWindow *));
1482 gdk_dnd.drag_startwindows[gdk_dnd.drag_numwindows - 1] = window;
1483 window_private->dnd_drag_accepted = 0;
1486 g_warning ("dnd_really is 1 or drag is not enabled! can't addwindow\n");
1490 gdk_window_dnd_drag_set (GdkWindow *window,
1495 GdkWindowPrivate *window_private;
1498 g_return_if_fail (window != NULL);
1499 window_private = (GdkWindowPrivate *) window;
1500 if (window_private->destroyed)
1503 window_private->dnd_drag_enabled = drag_enable ? 1 : 0;
1507 g_return_if_fail(typelist != NULL);
1509 if (window_private->dnd_drag_data_numtypesavail > 3)
1511 window_private->dnd_drag_data_numtypesavail = numtypes;
1513 window_private->dnd_drag_data_typesavail =
1514 g_realloc (window_private->dnd_drag_data_typesavail,
1515 (numtypes + 1) * sizeof (GdkAtom));
1517 for (i = 0; i < numtypes; i++)
1519 /* Allow blanket use of ALL to get anything... */
1520 if (strcmp (typelist[i], "ALL"))
1521 window_private->dnd_drag_data_typesavail[i] =
1522 gdk_atom_intern (typelist[i], FALSE);
1524 window_private->dnd_drag_data_typesavail[i] = None;
1528 * set our extended type list if we need to
1531 gdk_property_change(window, gdk_dnd.gdk_XdeTypelist,
1532 XA_PRIMARY, 32, GDK_PROP_MODE_REPLACE,
1533 (guchar *)(window_private->dnd_drag_data_typesavail
1534 + (sizeof(GdkAtom) * 3)),
1535 (numtypes - 3) * sizeof(GdkAtom));
1537 gdk_property_delete (window, gdk_dnd.gdk_XdeTypelist);
1541 g_free (window_private->dnd_drag_data_typesavail);
1542 window_private->dnd_drag_data_typesavail = NULL;
1543 window_private->dnd_drag_data_numtypesavail = 0;
1548 gdk_window_dnd_drop_set (GdkWindow *window,
1552 guint8 destructive_op)
1554 GdkWindowPrivate *window_private;
1557 g_return_if_fail (window != NULL);
1558 window_private = (GdkWindowPrivate *) window;
1559 if (window_private->destroyed)
1562 window_private->dnd_drop_enabled = drop_enable ? 1 : 0;
1565 g_return_if_fail(typelist != NULL);
1567 window_private->dnd_drop_data_numtypesavail = numtypes;
1569 window_private->dnd_drop_data_typesavail =
1570 g_realloc (window_private->dnd_drop_data_typesavail,
1571 (numtypes + 1) * sizeof (GdkAtom));
1573 for (i = 0; i < numtypes; i++)
1574 window_private->dnd_drop_data_typesavail[i] =
1575 gdk_atom_intern (typelist[i], FALSE);
1577 window_private->dnd_drop_destructive_op = destructive_op;
1582 * This is used to reply to a GDK_DRAG_REQUEST event
1583 * (which may be generated by XdeRequest or a confirmed drop...
1586 gdk_window_dnd_data_set (GdkWindow *window,
1589 gulong data_numbytes)
1591 GdkWindowPrivate *window_private;
1593 GdkEventDropDataAvailable tmp_ev;
1596 g_return_if_fail (window != NULL);
1597 g_return_if_fail (event != NULL);
1598 g_return_if_fail (data != NULL);
1599 g_return_if_fail (data_numbytes > 0);
1600 g_return_if_fail (event->type == GDK_DRAG_REQUEST);
1602 window_private = (GdkWindowPrivate *) window;
1603 g_return_if_fail (window_private->dnd_drag_accepted != 0);
1604 if (window_private->destroyed)
1607 /* We set the property on our window... */
1608 gdk_property_change (window, window_private->dnd_drag_data_type,
1609 XA_PRIMARY, 8, GDK_PROP_MODE_REPLACE, data,
1611 tmp = gdk_atom_name(window_private->dnd_drag_data_type);
1613 g_print("DnD type %s on window %ld\n", tmp, window_private->xwindow);
1618 * Then we send the event to tell the receiving window that the
1621 tmp_ev.u.allflags = 0;
1622 tmp_ev.u.flags.protocol_version = DND_PROTOCOL_VERSION;
1623 tmp_ev.u.flags.isdrop = event->dragrequest.isdrop;
1625 sev.xclient.type = ClientMessage;
1626 sev.xclient.format = 32;
1627 sev.xclient.window = event->dragrequest.requestor;
1628 sev.xclient.message_type = gdk_dnd.gdk_XdeDataAvailable;
1629 sev.xclient.data.l[0] = window_private->xwindow;
1630 sev.xclient.data.l[1] = tmp_ev.u.allflags;
1631 sev.xclient.data.l[2] = window_private->dnd_drag_data_type;
1633 if (event->dragrequest.isdrop)
1634 sev.xclient.data.l[3] = event->dragrequest.drop_coords.x +
1635 (event->dragrequest.drop_coords.y << 16);
1637 sev.xclient.data.l[3] = 0;
1639 sev.xclient.data.l[4] = event->dragrequest.timestamp;
1641 if (!gdk_send_xevent (event->dragrequest.requestor, False,
1643 GDK_NOTE (DND, g_print("Sending XdeDataAvailable to %#x failed\n",
1644 event->dragrequest.requestor));
1649 gdk_window_add_filter (GdkWindow *window,
1650 GdkFilterFunc function,
1653 GdkWindowPrivate *private;
1655 GdkEventFilter *filter;
1657 private = (GdkWindowPrivate*) window;
1658 if (private && private->destroyed)
1662 tmp_list = private->filters;
1664 tmp_list = gdk_default_filters;
1668 filter = (GdkEventFilter *)tmp_list->data;
1669 if ((filter->function == function) && (filter->data == data))
1671 tmp_list = tmp_list->next;
1674 filter = g_new (GdkEventFilter, 1);
1675 filter->function = function;
1676 filter->data = data;
1679 private->filters = g_list_append (private->filters, filter);
1681 gdk_default_filters = g_list_append (gdk_default_filters, filter);
1685 gdk_window_remove_filter (GdkWindow *window,
1686 GdkFilterFunc function,
1689 GdkWindowPrivate *private;
1691 GdkEventFilter *filter;
1693 private = (GdkWindowPrivate*) window;
1696 tmp_list = private->filters;
1698 tmp_list = gdk_default_filters;
1702 filter = (GdkEventFilter *)tmp_list->data;
1703 tmp_list = tmp_list->next;
1705 if ((filter->function == function) && (filter->data == data))
1708 private->filters = g_list_remove_link (private->filters, tmp_list);
1710 gdk_default_filters = g_list_remove_link (gdk_default_filters, tmp_list);
1711 g_list_free_1 (tmp_list);
1720 gdk_window_set_override_redirect(GdkWindow *window,
1721 gboolean override_redirect)
1723 GdkWindowPrivate *private;
1724 XSetWindowAttributes attr;
1726 g_return_if_fail (window != NULL);
1727 private = (GdkWindowPrivate*) window;
1728 if (private->destroyed)
1731 attr.override_redirect = (override_redirect == FALSE)?False:True;
1732 XChangeWindowAttributes(gdk_display,
1733 ((GdkWindowPrivate *)window)->xwindow,
1739 gdk_window_set_icon (GdkWindow *window,
1740 GdkWindow *icon_window,
1745 GdkWindowPrivate *window_private;
1746 GdkWindowPrivate *private;
1748 g_return_if_fail (window != NULL);
1749 window_private = (GdkWindowPrivate*) window;
1750 if (window_private->destroyed)
1755 if (icon_window != NULL)
1757 private = (GdkWindowPrivate *)icon_window;
1758 wm_hints.flags |= IconWindowHint;
1759 wm_hints.icon_window = private->xwindow;
1764 private = (GdkWindowPrivate *)pixmap;
1765 wm_hints.flags |= IconPixmapHint;
1766 wm_hints.icon_pixmap = private->xwindow;
1771 private = (GdkWindowPrivate *)mask;
1772 wm_hints.flags |= IconMaskHint;
1773 wm_hints.icon_mask = private->xwindow;
1776 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1780 gdk_window_set_icon_name (GdkWindow *window,
1783 GdkWindowPrivate *window_private;
1784 XTextProperty property;
1787 g_return_if_fail (window != NULL);
1788 window_private = (GdkWindowPrivate*) window;
1789 if (window_private->destroyed)
1791 res = XmbTextListToTextProperty (window_private->xdisplay,
1792 &name, 1, XStdICCTextStyle,
1796 g_warning("Error converting icon name to text property: %d\n", res);
1800 XSetWMIconName (window_private->xdisplay, window_private->xwindow,
1803 XFree(property.value);
1807 gdk_window_set_group (GdkWindow *window,
1811 GdkWindowPrivate *window_private;
1812 GdkWindowPrivate *private;
1814 g_return_if_fail (window != NULL);
1815 g_return_if_fail (leader != NULL);
1816 window_private = (GdkWindowPrivate*) window;
1817 if (window_private->destroyed)
1820 private = (GdkWindowPrivate *)leader;
1821 wm_hints.flags |= WindowGroupHint;
1822 wm_hints.window_group = private->xwindow;
1824 XSetWMHints (window_private->xdisplay, window_private->xwindow, &wm_hints);
1828 gdk_window_set_mwm_hints (GdkWindow *window,
1829 MotifWmHints *new_hints)
1831 static Atom hints_atom = None;
1832 MotifWmHints *hints;
1838 GdkWindowPrivate *window_private;
1840 g_return_if_fail (window != NULL);
1841 window_private = (GdkWindowPrivate*) window;
1842 if (window_private->destroyed)
1846 hints_atom = XInternAtom (window_private->xdisplay,
1847 _XA_MOTIF_WM_HINTS, FALSE);
1849 XGetWindowProperty (window_private->xdisplay, window_private->xwindow,
1850 hints_atom, 0, sizeof(MotifWmHints)/4,
1851 False, AnyPropertyType, &type, &format, &nitems,
1852 &bytes_after, (guchar **)&hints);
1858 if (new_hints->flags & MWM_HINTS_FUNCTIONS)
1860 hints->flags |= MWM_HINTS_FUNCTIONS;
1861 hints->functions = new_hints->functions;
1863 if (new_hints->flags & MWM_HINTS_DECORATIONS)
1865 hints->flags |= MWM_HINTS_DECORATIONS;
1866 hints->decorations = new_hints->decorations;
1870 XChangeProperty (window_private->xdisplay, window_private->xwindow,
1871 hints_atom, hints_atom, 32, PropModeReplace,
1872 (guchar *)hints, sizeof(MotifWmHints)/4);
1874 if (hints != new_hints)
1879 gdk_window_set_decorations (GdkWindow *window,
1880 GdkWMDecoration decorations)
1884 hints.flags = MWM_HINTS_DECORATIONS;
1885 hints.decorations = decorations;
1887 gdk_window_set_mwm_hints (window, &hints);
1891 gdk_window_set_functions (GdkWindow *window,
1892 GdkWMFunction functions)
1896 hints.flags = MWM_HINTS_FUNCTIONS;
1897 hints.functions = functions;
1899 gdk_window_set_mwm_hints (window, &hints);