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 Lesser 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 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
30 #include "gdkwindow.h"
31 #include "gdkinputprivate.h"
32 #include "gdkprivate-fb.h"
33 #include "gdkinternals.h"
37 /* Global variables: */
38 static GdkWindow *gdk_fb_window_containing_pointer = NULL;
39 static GdkWindow *gdk_fb_focused_window = NULL;
40 static gpointer parent_class = NULL;
42 static void recompute_drawable (GdkDrawable *drawable);
43 static void gdk_fb_window_raise (GdkWindow *window);
44 static GdkRegion* gdk_window_fb_get_visible_region (GdkDrawable *drawable);
48 GdkWindowChildChanged changed;
49 GdkWindowChildGetPos get_pos;
51 } GdkWindowChildHandlerData;
54 g_free_2nd (gpointer a, gpointer b, gpointer data)
60 gdk_window_impl_fb_finalize (GObject *object)
62 GdkWindowFBData *fbd = GDK_WINDOW_FBDATA (object);
64 if (GDK_WINDOW_IS_MAPPED (fbd->drawable_data.wrapper))
65 gdk_window_hide (fbd->drawable_data.wrapper);
68 gdk_cursor_unref (fbd->cursor);
72 g_hash_table_foreach (fbd->properties, g_free_2nd, NULL);
73 g_hash_table_destroy (fbd->properties);
76 G_OBJECT_CLASS (parent_class)->finalize (object);
80 gdk_window_impl_fb_class_init (GdkWindowFBClass *klass)
82 GObjectClass *object_class = G_OBJECT_CLASS (klass);
83 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
85 parent_class = g_type_class_peek_parent (klass);
87 object_class->finalize = gdk_window_impl_fb_finalize;
89 /* Visible and clip regions are the same */
90 drawable_class->get_clip_region = gdk_window_fb_get_visible_region;
91 drawable_class->get_visible_region = gdk_window_fb_get_visible_region;
95 gdk_window_impl_fb_init (GdkWindowFBData *impl)
97 impl->drawable_data.depth = gdk_display->modeinfo.bits_per_pixel;
98 impl->drawable_data.colormap = gdk_colormap_get_system ();
103 _gdk_window_impl_get_type (void)
105 static GType object_type = 0;
109 static const GTypeInfo object_info =
111 sizeof (GdkWindowFBClass),
112 (GBaseInitFunc) NULL,
113 (GBaseFinalizeFunc) NULL,
114 (GClassInitFunc) gdk_window_impl_fb_class_init,
115 NULL, /* class_finalize */
116 NULL, /* class_data */
117 sizeof (GdkWindowFBData),
119 (GInstanceInitFunc) gdk_window_impl_fb_init,
122 object_type = g_type_register_static (gdk_drawable_impl_fb_get_type(),
132 _gdk_windowing_window_init (void)
137 GdkWindowObject *private;
139 attr.width = gdk_screen_width ();
140 attr.height = gdk_screen_height ();
141 attr.window_type = GDK_WINDOW_ROOT;
143 attr.event_mask = GDK_EXPOSURE_MASK;
144 attr.wclass = GDK_INPUT_OUTPUT;
145 _gdk_parent_root = gdk_window_new (NULL, &attr, GDK_WA_CURSOR);
146 private = (GdkWindowObject *)_gdk_parent_root;
150 GDK_DRAWABLE_IMPL_FBDATA (_gdk_parent_root)->lim_x = attr.width;
151 GDK_DRAWABLE_IMPL_FBDATA (_gdk_parent_root)->lim_y = attr.height;
153 _gdk_fb_screen_gc = gdk_gc_new (_gdk_parent_root);
155 gdk_fb_drawable_clear (_gdk_parent_root);
157 /* Must be done after root is created, since gdk_cursor_new()
158 * references _gdk_parent_root.
160 cursor = gdk_cursor_new (GDK_LEFT_PTR);
161 gdk_window_set_cursor (_gdk_parent_root, cursor);
165 gdk_window_new (GdkWindow *parent,
166 GdkWindowAttr *attributes,
167 gint attributes_mask)
170 GdkWindowObject *private;
171 GdkWindowObject *parent_private;
173 GdkWindowFBData *impl;
177 g_return_val_if_fail (attributes != NULL, NULL);
180 (attributes->window_type != GDK_WINDOW_CHILD &&
181 attributes->window_type != GDK_WINDOW_TEMP))
182 parent = _gdk_parent_root;
184 parent_private = (GdkWindowObject*) parent;
186 window = (GdkWindow *)g_object_new (GDK_TYPE_WINDOW, NULL);
187 private = (GdkWindowObject *)window;
189 private->parent = parent_private;
191 private->accept_focus = TRUE;
192 private->focus_on_map = TRUE;
194 if (attributes_mask & GDK_WA_X)
199 if (attributes_mask & GDK_WA_Y)
204 gdk_window_set_events (window, attributes->event_mask);
206 if (attributes_mask & GDK_WA_VISUAL)
207 visual = attributes->visual;
209 visual = gdk_visual_get_system ();
211 impl = (GdkWindowFBData *)private->impl;
212 impl->drawable_data.wrapper = window;
215 impl->drawable_data.width = (attributes->width > 1) ? (attributes->width) : (1);
216 impl->drawable_data.height = (attributes->height > 1) ? (attributes->height) : (1);
217 private->window_type = impl->drawable_data.window_type = attributes->window_type;
218 impl->drawable_data.mem = gdk_display->fb_mem;
219 impl->drawable_data.rowstride = gdk_display->fb_stride;
220 gdk_window_move_resize (window, x, y,
221 impl->drawable_data.width, impl->drawable_data.height);
223 if (attributes->wclass == GDK_INPUT_OUTPUT)
225 depth = visual->depth;
227 private->input_only = FALSE;
228 private->depth = impl->drawable_data.depth;
230 if ((attributes_mask & GDK_WA_COLORMAP) &&
231 attributes->colormap)
232 impl->drawable_data.colormap = attributes->colormap;
234 impl->drawable_data.colormap = gdk_colormap_get_system ();
236 switch (impl->drawable_data.window_type)
238 case GDK_WINDOW_TOPLEVEL:
239 case GDK_WINDOW_CHILD:
240 case GDK_WINDOW_DIALOG:
241 case GDK_WINDOW_TEMP:
245 case GDK_WINDOW_ROOT:
246 if (_gdk_parent_root)
247 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
249 case GDK_DRAWABLE_PIXMAP:
250 g_error ("cannot make windows of type GDK_DRAWABLE_PIXMAP (use gdk_pixmap_new)");
257 private->input_only = TRUE;
258 impl->drawable_data.colormap = NULL;
261 if (impl->drawable_data.colormap)
262 gdk_colormap_ref (impl->drawable_data.colormap);
264 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
265 (attributes->cursor) :
269 parent_private->children = g_list_prepend (parent_private->children, window);
274 /* This function is called when the XWindow is really gone. */
276 _gdk_windowing_window_destroy (GdkWindow *window,
278 gboolean foreign_destroy)
280 GdkWindowObject *private;
283 private = (GdkWindowObject*) window;
285 _gdk_selection_window_destroyed (window);
289 r.width = GDK_DRAWABLE_IMPL_FBDATA (window)->width;
290 r.height = GDK_DRAWABLE_IMPL_FBDATA (window)->height;
291 /* Clear the root window, as it might be visible under
292 the destroyed window */
293 gdk_window_clear_area (_gdk_parent_root,
298 /* Invalidate the rect */
299 gdk_window_invalidate_rect ((GdkWindow *)private->parent, &r, TRUE);
303 all_parents_shown (GdkWindowObject *private)
305 while (GDK_WINDOW_IS_MAPPED (private))
308 private = (GdkWindowObject *)private->parent;
317 send_map_events (GdkWindowObject *private, gboolean is_map)
320 GdkWindow *parent = (GdkWindow *)private->parent;
321 GdkWindow *event_win;
325 if (!GDK_WINDOW_IS_MAPPED (private))
330 event_win = gdk_fb_other_event_window ((GdkWindow *)private, GDK_MAP);
332 gdk_event_make (event_win, GDK_MAP, TRUE);
334 if (private->input_only)
338 parent = (GdkWindow *)private;
340 if (((GDK_DRAWABLE_IMPL_FBDATA (private)->abs_x > GDK_DRAWABLE_IMPL_FBDATA (parent)->lim_x) ||
341 (GDK_DRAWABLE_IMPL_FBDATA (private)->abs_y > GDK_DRAWABLE_IMPL_FBDATA (parent)->lim_y) ||
342 (GDK_DRAWABLE_IMPL_FBDATA (private)->lim_x < GDK_DRAWABLE_IMPL_FBDATA (parent)->llim_x) ||
343 (GDK_DRAWABLE_IMPL_FBDATA (private)->lim_y < GDK_DRAWABLE_IMPL_FBDATA (parent)->llim_y)))
347 gdk_window_clear ((GdkWindow *)private);
349 for (l = private->children; l; l = l->next)
350 send_map_events (l->data, is_map);
353 /* Cut & paste versions of the stuff in gdkwindow.c, with the addition of clearing the newly exposed region. */
355 gdk_window_invalidate_region_clear(GdkWindow *window,
359 GdkWindowObject *private = GDK_WINDOW_P (window);
361 if (private->input_only || !GDK_WINDOW_IS_MAPPED (private))
364 if (private->bg_pixmap != GDK_NO_BG)
365 for (i = 0; i < region->numRects; i++)
366 gdk_window_clear_area (window,
369 region->rects[i].x2 - region->rects[i].x1,
370 region->rects[i].y2 - region->rects[i].y1);
372 gdk_window_invalidate_region (window, region, FALSE);
376 GdkRectangle child_rect;
377 GdkRegion *child_region;
379 tmp_list = private->children;
382 GdkWindowObject *child = tmp_list->data;
383 tmp_list = tmp_list->next;
385 if (!child->input_only)
389 gdk_drawable_get_size (GDK_DRAWABLE (child),
392 child_rect.x = child->x;
393 child_rect.y = child->y;
394 child_rect.width = width;
395 child_rect.height = height;
397 child_region = gdk_region_rectangle (&child_rect);
398 gdk_region_intersect (child_region, region);
400 if (!gdk_region_empty (child_region))
402 gdk_region_offset (child_region, - child_rect.x, - child_rect.y);
403 gdk_window_invalidate_region_clear ((GdkWindow *)child, child_region);
406 gdk_region_destroy (child_region);
413 gdk_window_invalidate_rect_clear (GdkWindow *window,
416 GdkWindowObject *private = GDK_WINDOW_P (window);
418 if (private->input_only || !GDK_WINDOW_IS_MAPPED (private))
421 if (GDK_WINDOW_P (window)->bg_pixmap != GDK_NO_BG)
422 gdk_window_clear_area (window, rect->x, rect->y, rect->width, rect->height);
423 gdk_window_invalidate_rect (window, rect, FALSE);
427 GdkRectangle child_rect, new_rect;
429 tmp_list = private->children;
432 GdkWindowObject *child = tmp_list->data;
433 tmp_list = tmp_list->next;
435 if (!child->input_only)
439 width = GDK_DRAWABLE_IMPL_FBDATA (child)->width;
440 height = GDK_DRAWABLE_IMPL_FBDATA (child)->height;
442 child_rect.x = child->x;
443 child_rect.y = child->y;
444 child_rect.width = width;
445 child_rect.height = height;
447 if (gdk_rectangle_intersect (rect, &child_rect, &new_rect))
449 new_rect.x -= child_rect.x;
450 new_rect.y -= child_rect.y;
452 gdk_window_invalidate_rect_clear ((GdkWindow *)child, &new_rect);
460 gdk_fb_redraw_all (void)
464 r.width = GDK_DRAWABLE_IMPL_FBDATA (_gdk_parent_root)->width;
465 r.height = GDK_DRAWABLE_IMPL_FBDATA (_gdk_parent_root)->height;
466 gdk_window_invalidate_rect_clear (_gdk_parent_root, &r);
467 gdk_window_process_all_updates ();
471 /* Focus follows pointer */
473 gdk_fb_window_find_toplevel (GdkWindow *window)
475 GdkWindowObject *priv = (GdkWindowObject *)window;
476 while (priv != (GdkWindowObject *)_gdk_parent_root)
478 if ((priv->parent == (GdkWindowObject *)_gdk_parent_root) && GDK_WINDOW_IS_MAPPED (priv))
479 return (GdkWindow *)priv;
483 return _gdk_parent_root;
487 gdk_fb_window_find_focus (void)
489 if (_gdk_fb_keyboard_grab_window)
490 return _gdk_fb_keyboard_grab_window;
492 if (!gdk_fb_focused_window)
493 gdk_fb_focused_window = gdk_window_ref (_gdk_parent_root);
495 return gdk_fb_focused_window;
500 gdk_fb_change_focus (GdkWindow *new_focus_window)
502 GdkEventFocus *event;
503 GdkWindow *old_win, *new_win;
504 GdkWindow *event_win;
506 /* No focus changes while the pointer is grabbed */
507 if (_gdk_fb_pointer_grab_window)
510 old_win = gdk_fb_focused_window;
511 new_win = gdk_fb_window_find_toplevel (new_focus_window);
513 if (old_win != new_win)
517 event_win = gdk_fb_keyboard_event_window (old_win, GDK_FOCUS_CHANGE);
520 event = (GdkEventFocus *)gdk_event_make (event_win, GDK_FOCUS_CHANGE, TRUE);
524 event_win = gdk_fb_keyboard_event_window (new_win, GDK_FOCUS_CHANGE);
527 event = (GdkEventFocus *)gdk_event_make (event_win, GDK_FOCUS_CHANGE, TRUE);
531 if (gdk_fb_focused_window)
532 gdk_window_unref (gdk_fb_focused_window);
533 gdk_fb_focused_window = gdk_window_ref (new_win);
538 gdk_fb_find_common_ancestor (GdkWindow *win1,
541 GdkWindowObject *tmp;
542 GList *path1 = NULL, *path2 = NULL;
543 GList *list1, *list2;
545 tmp = GDK_WINDOW_OBJECT (win1);
548 path1 = g_list_prepend(path1, tmp);
552 tmp = GDK_WINDOW_OBJECT (win2);
555 path2 = g_list_prepend(path2, tmp);
562 while (list1 && list2 && (list1->data == list2->data))
564 tmp = (GdkWindowObject *)list1->data;
565 list1 = g_list_next (list1);
566 list2 = g_list_next (list2);
570 return GDK_WINDOW (tmp);
574 gdk_fb_window_send_crossing_events (GdkWindow *src,
576 GdkCrossingMode mode)
579 GdkWindow *win, *last, *next;
581 gint x, y, x_int, y_int;
582 GdkModifierType my_mask;
587 GdkWindow *event_win;
589 if ((mode == GDK_CROSSING_NORMAL) &&
590 (dest == gdk_fb_window_containing_pointer))
593 if (gdk_fb_window_containing_pointer == NULL)
594 gdk_fb_window_containing_pointer = gdk_window_ref (_gdk_parent_root);
599 a = gdk_fb_window_containing_pointer;
605 /* gdk_fb_window_containing_pointer might have been destroyed.
606 * The refcount we hold on it should keep it, but it's parents
609 if (GDK_WINDOW_DESTROYED (a))
610 a = _gdk_parent_root;
612 gdk_fb_mouse_get_info (&x, &y, &my_mask);
614 c = gdk_fb_find_common_ancestor (a, b);
616 non_linear = (c != a) && (c != b);
618 event_win = gdk_fb_pointer_event_window (a, GDK_LEAVE_NOTIFY);
621 event = gdk_event_make (event_win, GDK_LEAVE_NOTIFY, TRUE);
622 event->crossing.subwindow = NULL;
623 gdk_window_get_root_origin (a, &x_int, &y_int);
624 event->crossing.x = x - x_int;
625 event->crossing.y = y - y_int;
626 event->crossing.x_root = x;
627 event->crossing.y_root = y;
628 event->crossing.mode = mode;
630 event->crossing.detail = GDK_NOTIFY_NONLINEAR;
632 event->crossing.detail = GDK_NOTIFY_INFERIOR;
634 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
635 event->crossing.focus = FALSE;
636 event->crossing.state = my_mask;
639 /* Traverse up from a to (excluding) c */
643 win = GDK_WINDOW (GDK_WINDOW_OBJECT (a)->parent);
646 event_win = gdk_fb_pointer_event_window (win, GDK_LEAVE_NOTIFY);
649 event = gdk_event_make (event_win, GDK_LEAVE_NOTIFY, TRUE);
650 event->crossing.subwindow = gdk_window_ref (last);
651 gdk_window_get_root_origin (win, &x_int, &y_int);
652 event->crossing.x = x - x_int;
653 event->crossing.y = y - y_int;
654 event->crossing.x_root = x;
655 event->crossing.y_root = y;
656 event->crossing.mode = mode;
658 event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
660 event->crossing.detail = GDK_NOTIFY_VIRTUAL;
661 event->crossing.focus = FALSE;
662 event->crossing.state = my_mask;
665 win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent);
669 /* Traverse down from c to b */
673 win = GDK_WINDOW( GDK_WINDOW_OBJECT (b)->parent);
676 path = g_list_prepend (path, win);
677 win = GDK_WINDOW( GDK_WINDOW_OBJECT (win)->parent);
683 win = (GdkWindow *)list->data;
684 list = g_list_next (list);
686 next = (GdkWindow *)list->data;
690 event_win = gdk_fb_pointer_event_window (win, GDK_ENTER_NOTIFY);
693 event = gdk_event_make (event_win, GDK_ENTER_NOTIFY, TRUE);
694 event->crossing.subwindow = gdk_window_ref (next);
695 gdk_window_get_root_origin (win, &x_int, &y_int);
696 event->crossing.x = x - x_int;
697 event->crossing.y = y - y_int;
698 event->crossing.x_root = x;
699 event->crossing.y_root = y;
700 event->crossing.mode = mode;
702 event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
704 event->crossing.detail = GDK_NOTIFY_VIRTUAL;
705 event->crossing.focus = FALSE;
706 event->crossing.state = my_mask;
712 event_win = gdk_fb_pointer_event_window (b, GDK_ENTER_NOTIFY);
715 event = gdk_event_make (event_win, GDK_ENTER_NOTIFY, TRUE);
716 event->crossing.subwindow = NULL;
717 gdk_window_get_root_origin (b, &x_int, &y_int);
718 event->crossing.x = x - x_int;
719 event->crossing.y = y - y_int;
720 event->crossing.x_root = x;
721 event->crossing.y_root = y;
722 event->crossing.mode = mode;
724 event->crossing.detail = GDK_NOTIFY_NONLINEAR;
726 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
728 event->crossing.detail = GDK_NOTIFY_INFERIOR;
729 event->crossing.focus = FALSE;
730 event->crossing.state = my_mask;
733 if (mode != GDK_CROSSING_GRAB)
735 gdk_fb_change_focus (b);
736 if (b != gdk_fb_window_containing_pointer)
738 gdk_window_unref (gdk_fb_window_containing_pointer);
739 gdk_fb_window_containing_pointer = gdk_window_ref (b);
745 show_window_internal (GdkWindow *window,
748 GdkWindowObject *private;
751 g_return_if_fail (window != NULL);
753 private = (GdkWindowObject*) window;
755 if (!private->destroyed && !GDK_WINDOW_IS_MAPPED (private))
760 gdk_fb_window_raise (window);
762 if (all_parents_shown ((GdkWindowObject *)private->parent))
766 recompute_drawable ((GdkDrawable *)window);
768 send_map_events (private, TRUE);
770 mousewin = gdk_window_at_pointer (NULL, NULL);
771 gdk_fb_window_send_crossing_events (NULL,
773 GDK_CROSSING_NORMAL);
775 if (private->input_only)
778 rect.x = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_x;
779 rect.y = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_y;
780 rect.width = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_x - rect.x;
781 rect.height = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_y - rect.y;
782 gdk_window_invalidate_rect (_gdk_parent_root, &rect, TRUE);
788 gdk_window_show_unraised (GdkWindow *window)
790 g_return_if_fail (window != NULL);
792 show_window_internal (window, FALSE);
796 gdk_window_show (GdkWindow *window)
798 g_return_if_fail (window != NULL);
800 show_window_internal (window, TRUE);
804 gdk_window_hide (GdkWindow *window)
806 GdkWindowObject *private;
808 GdkWindow *event_win;
810 g_return_if_fail (window != NULL);
812 private = (GdkWindowObject*) window;
814 if (!private->destroyed && GDK_WINDOW_IS_MAPPED (private))
820 event_win = gdk_fb_other_event_window (window, GDK_UNMAP);
822 event = gdk_event_make (event_win, GDK_UNMAP, TRUE);
824 r.x = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_x;
825 r.y = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_y;
826 r.width = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_x - r.x;
827 r.height = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_y - r.y;
829 private->state = GDK_WINDOW_STATE_WITHDRAWN;
831 mousewin = gdk_window_at_pointer (NULL, NULL);
832 gdk_fb_window_send_crossing_events (NULL,
834 GDK_CROSSING_NORMAL);
836 do_hide = gdk_fb_cursor_need_hide (&r);
839 gdk_fb_cursor_hide ();
840 if (window == _gdk_fb_pointer_grab_window)
841 gdk_pointer_ungrab (GDK_CURRENT_TIME);
842 if (window == _gdk_fb_keyboard_grab_window)
843 gdk_keyboard_ungrab (GDK_CURRENT_TIME);
845 /* Clear the root window, as it might be visible under
847 gdk_window_clear_area (_gdk_parent_root,
852 /* Invalidate the rect */
853 gdk_window_invalidate_rect (_gdk_parent_root, &r, TRUE);
856 gdk_fb_cursor_unhide ();
861 gdk_window_withdraw (GdkWindow *window)
863 gdk_window_hide (window);
867 gdk_window_move (GdkWindow *window,
871 GdkWindowObject *private = (GdkWindowObject *)window;
873 g_return_if_fail (window != NULL);
874 g_return_if_fail (GDK_IS_WINDOW (window));
876 gdk_window_move_resize (window, x, y,
877 GDK_DRAWABLE_IMPL_FBDATA (private)->width,
878 GDK_DRAWABLE_IMPL_FBDATA (private)->height);
882 gdk_window_resize (GdkWindow *window,
886 GdkWindowObject *private;
889 g_return_if_fail (window != NULL);
890 g_return_if_fail (GDK_IS_WINDOW (window));
892 private = (GdkWindowObject*) window;
902 if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD))
904 GdkWindowChildHandlerData *data;
906 data = g_object_get_data (G_OBJECT (private->parent), "gdk-window-child-handler");
909 (*data->get_pos) (window, &x, &y, data->user_data);
912 gdk_window_move_resize (window, x, y, width, height);
916 recompute_abs_positions(GdkDrawable *drawable,
917 gint parent_x, gint parent_y,
918 gint parent_llim_x, gint parent_llim_y,
919 gint parent_lim_x, gint parent_lim_y)
923 if (GDK_IS_WINDOW (drawable))
925 GdkWindowObject *private = GDK_WINDOW_P (drawable);
928 if (!GDK_WINDOW_IS_MAPPED (private))
932 GDK_DRAWABLE_IMPL_FBDATA (private)->abs_x = parent_x + private->x;
933 GDK_DRAWABLE_IMPL_FBDATA (private)->abs_y = parent_y + private->y;
934 x = MAX (parent_llim_x, GDK_DRAWABLE_IMPL_FBDATA (private)->abs_x);
935 x = MIN (x, parent_lim_x);
936 GDK_DRAWABLE_IMPL_FBDATA (private)->llim_x = x;
937 y = MAX (parent_llim_y, GDK_DRAWABLE_IMPL_FBDATA (private)->abs_y);
938 y = MIN (y, parent_lim_y);
939 GDK_DRAWABLE_IMPL_FBDATA (private)->llim_y = y;
940 x = MIN (parent_lim_x,
941 GDK_DRAWABLE_IMPL_FBDATA (private)->abs_x + GDK_DRAWABLE_IMPL_FBDATA (private)->width);
942 x = MAX (x, GDK_DRAWABLE_IMPL_FBDATA (private)->llim_x);
943 GDK_DRAWABLE_IMPL_FBDATA (private)->lim_x = x;
944 y = MIN (parent_lim_y,
945 GDK_DRAWABLE_IMPL_FBDATA (private)->abs_y + GDK_DRAWABLE_IMPL_FBDATA (private)->height);
946 y = MAX (y, GDK_DRAWABLE_IMPL_FBDATA (private)->llim_y);
947 GDK_DRAWABLE_IMPL_FBDATA (private)->lim_y = y;
949 g_assert (GDK_DRAWABLE_IMPL_FBDATA (private)->llim_x <= GDK_DRAWABLE_IMPL_FBDATA (private)->lim_x);
950 g_assert (GDK_DRAWABLE_IMPL_FBDATA (private)->llim_y <= GDK_DRAWABLE_IMPL_FBDATA (private)->lim_y);
952 for (l = private->children; l; l = l->next)
953 recompute_abs_positions (l->data,
954 GDK_DRAWABLE_IMPL_FBDATA (private)->abs_x,
955 GDK_DRAWABLE_IMPL_FBDATA (private)->abs_y,
956 GDK_DRAWABLE_IMPL_FBDATA (private)->llim_x,
957 GDK_DRAWABLE_IMPL_FBDATA (private)->llim_y,
958 GDK_DRAWABLE_IMPL_FBDATA (private)->lim_x,
959 GDK_DRAWABLE_IMPL_FBDATA (private)->lim_y);
963 GDK_DRAWABLE_IMPL_FBDATA (drawable)->abs_x = 0;
964 GDK_DRAWABLE_IMPL_FBDATA (drawable)->abs_y = 0;
965 GDK_DRAWABLE_IMPL_FBDATA (drawable)->llim_x = 0;
966 GDK_DRAWABLE_IMPL_FBDATA (drawable)->llim_y = 0;
967 GDK_DRAWABLE_IMPL_FBDATA (drawable)->lim_x = GDK_DRAWABLE_IMPL_FBDATA (drawable)->width;
968 GDK_DRAWABLE_IMPL_FBDATA (drawable)->lim_y = GDK_DRAWABLE_IMPL_FBDATA (drawable)->height;
973 recompute_rowstride(GdkDrawable *drawable)
976 GdkWindowObject *private;
978 g_return_if_fail (GDK_IS_WINDOW (drawable));
980 private = GDK_WINDOW_P (drawable);
982 GDK_DRAWABLE_IMPL_FBDATA (private)->rowstride = gdk_display->fb_stride;
983 for (l = private->children; l; l = l->next)
984 recompute_rowstride (l->data);
988 gdk_fb_recompute_all (void)
990 GDK_DRAWABLE_IMPL_FBDATA (_gdk_parent_root)->width = gdk_display->fb_width;
991 GDK_DRAWABLE_IMPL_FBDATA (_gdk_parent_root)->height = gdk_display->fb_height;
993 recompute_abs_positions (_gdk_parent_root,
995 gdk_display->fb_width, gdk_display->fb_height);
996 recompute_rowstride (_gdk_parent_root);
1000 recompute_drawable (GdkDrawable *drawable)
1002 if (GDK_IS_WINDOW (drawable))
1004 GdkWindowObject *private = GDK_WINDOW_P (drawable);
1007 parent = (GdkWindow *)private->parent;
1009 parent = _gdk_parent_root;
1011 recompute_abs_positions (drawable,
1012 GDK_DRAWABLE_IMPL_FBDATA (parent)->abs_x,
1013 GDK_DRAWABLE_IMPL_FBDATA (parent)->abs_y,
1014 GDK_DRAWABLE_IMPL_FBDATA (parent)->llim_x,
1015 GDK_DRAWABLE_IMPL_FBDATA (parent)->llim_y,
1016 GDK_DRAWABLE_IMPL_FBDATA (parent)->lim_x,
1017 GDK_DRAWABLE_IMPL_FBDATA (parent)->lim_y);
1020 recompute_abs_positions (drawable, 0, 0, 0, 0, INT_MAX, INT_MAX);
1024 gdk_fb_window_move_resize (GdkWindow *window,
1029 gboolean send_expose_events)
1031 GdkWindowObject *private;
1032 gint dx, dy, dw, dh;
1035 GdkWindow *mousewin;
1036 GdkRectangle root_rect;
1037 GdkRectangle update_rect;
1039 g_return_if_fail (window != NULL);
1040 g_return_if_fail (GDK_IS_WINDOW (window));
1047 private = (GdkWindowObject*) window;
1049 if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD))
1051 GdkWindowChildHandlerData *data;
1053 data = g_object_get_data (G_OBJECT (private->parent), "gdk-window-child-handler");
1055 if (data && (*data->changed) (window, x, y, width, height, data->user_data))
1059 if (!private->destroyed)
1061 GdkRegion *old_region = NULL;
1063 if (private->input_only)
1064 send_expose_events = FALSE;
1066 if (GDK_WINDOW_IS_MAPPED (private) && send_expose_events)
1067 old_region = gdk_fb_clip_region (GDK_DRAWABLE_IMPL(window), NULL, TRUE, FALSE, FALSE);
1069 dx = x - private->x;
1070 dy = y - private->y;
1071 dw = width - GDK_DRAWABLE_IMPL_FBDATA (private)->width;
1072 dh = height - GDK_DRAWABLE_IMPL_FBDATA (private)->height;
1076 GDK_DRAWABLE_IMPL_FBDATA (private)->width = width;
1077 GDK_DRAWABLE_IMPL_FBDATA (private)->height = height;
1079 if (GDK_WINDOW_IS_MAPPED (private))
1081 recompute_drawable ((GdkDrawable *)window);
1083 if (send_expose_events)
1085 GdkRegion *new_region, *region;
1086 gboolean handle_cursor = FALSE;
1088 new_region = gdk_fb_clip_region (GDK_DRAWABLE_IMPL (window), NULL, TRUE, FALSE, TRUE);
1090 region = gdk_region_copy (old_region);
1091 gdk_region_offset (region, dx, dy);
1092 gdk_region_intersect (region, new_region);
1094 if (region->numRects && ((dx != 0) || (dy != 0)))
1096 GdkFBDrawingContext fbdc;
1098 if (gdk_fb_cursor_region_need_hide (old_region) ||
1099 gdk_fb_cursor_region_need_hide (new_region))
1101 gdk_fb_cursor_hide ();
1102 handle_cursor = TRUE;
1105 gdk_fb_drawing_context_init (&fbdc, GDK_DRAWABLE_IMPL (_gdk_parent_root), NULL, FALSE, FALSE);
1108 if ((dy>0) || ((dy==0) && (dx>0)))
1111 for (i=(draw_dir>0)?0:region->numRects-1;i >= 0 && i < region->numRects; i+=draw_dir)
1113 GdkRegionBox *reg = ®ion->rects[i];
1115 gdk_fb_draw_drawable_3 (GDK_DRAWABLE_IMPL(_gdk_parent_root),
1117 GDK_DRAWABLE_IMPL(_gdk_parent_root),
1123 (reg->x2 - reg->x1),
1124 (reg->y2 - reg->y1));
1126 gdk_fb_drawing_context_finalize (&fbdc);
1128 gdk_shadow_fb_update (region->extents.x1, region->extents.y1,
1129 region->extents.x2, region->extents.y2);
1131 gdk_region_union (new_region, old_region);
1132 gdk_region_subtract (new_region, region);
1133 gdk_region_destroy (region);
1136 /* Clear the root window in new_region */
1139 root_rect.width = gdk_screen_width();
1140 root_rect.height = gdk_screen_height();
1141 gdk_region_get_clipbox (new_region, &update_rect);
1142 if (gdk_rectangle_intersect (&update_rect, &root_rect, &update_rect))
1143 gdk_window_clear_area (_gdk_parent_root,
1147 update_rect.height);
1148 /* Invalidate regions in new_region */
1149 gdk_window_invalidate_region (_gdk_parent_root, new_region, TRUE);
1152 gdk_fb_cursor_unhide ();
1154 gdk_region_destroy (old_region);
1155 gdk_region_destroy (new_region);
1157 /* Send GdkEventConfigure for toplevel windows */
1158 if (private->window_type != GDK_WINDOW_CHILD)
1160 GdkWindow *event_win;
1161 event_win = gdk_fb_other_event_window (window, GDK_CONFIGURE);
1164 event = gdk_event_make (event_win, GDK_CONFIGURE, TRUE);
1165 event->configure.x = private->x;
1166 event->configure.y = private->y;
1167 event->configure.width = GDK_DRAWABLE_IMPL_FBDATA (private)->width;
1168 event->configure.height = GDK_DRAWABLE_IMPL_FBDATA (private)->height;
1172 /* The window the pointer is in might have changed */
1173 mousewin = gdk_window_at_pointer (NULL, NULL);
1174 gdk_fb_window_send_crossing_events (NULL,
1176 GDK_CROSSING_NORMAL);
1182 gdk_window_move_resize (GdkWindow *window,
1188 gdk_fb_window_move_resize (window, x, y, width, height, TRUE);
1192 gdk_window_reparent (GdkWindow *window,
1193 GdkWindow *new_parent,
1197 GdkWindowObject *window_private;
1198 GdkWindowObject *parent_private;
1199 GdkWindowObject *old_parent_private;
1201 g_return_if_fail (window != NULL);
1202 g_return_if_fail (GDK_IS_WINDOW (window));
1203 g_return_if_fail (new_parent != NULL);
1204 g_return_if_fail (GDK_IS_WINDOW (new_parent));
1207 new_parent = _gdk_parent_root;
1209 window_private = (GdkWindowObject*) window;
1210 old_parent_private = (GdkWindowObject*)window_private->parent;
1211 parent_private = (GdkWindowObject*) new_parent;
1213 g_assert(GDK_DRAWABLE_IMPL_FBDATA (window_private)->colormap);
1215 window_private->parent = (GdkWindowObject *)new_parent;
1217 if (old_parent_private)
1218 old_parent_private->children = g_list_remove (old_parent_private->children, window);
1220 parent_private->children = g_list_prepend (parent_private->children, window);
1222 if (GDK_WINDOW_IS_MAPPED (window_private))
1227 r.x = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_x;
1228 r.y = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_y;
1229 r.width = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_x - r.x;
1230 r.height = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_y - r.y;
1231 region = gdk_region_rectangle (&r);
1233 recompute_drawable ((GdkDrawable *)window);
1234 r.x = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_x;
1235 r.y = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_y;
1236 r.width = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_x - r.x;
1237 r.height = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_y - r.y;
1238 gdk_region_union_with_rect (region, &r);
1240 gdk_window_invalidate_region (_gdk_parent_root, region, TRUE);
1241 gdk_region_destroy (region);
1247 _gdk_windowing_window_clear_area (GdkWindow *window,
1256 if (GDK_WINDOW_P (window)->input_only)
1259 bgpm = GDK_WINDOW_P (window)->bg_pixmap;
1262 width = GDK_DRAWABLE_IMPL_FBDATA (window)->width - x;
1265 height = GDK_DRAWABLE_IMPL_FBDATA (window)->height - y;
1268 while ((bgpm == GDK_PARENT_RELATIVE_BG) && relto)
1270 relto = (GdkWindow *)GDK_WINDOW_P(relto)->parent;
1271 bgpm = GDK_WINDOW_P (relto)->bg_pixmap;
1274 if (bgpm && bgpm != GDK_NO_BG)
1279 GdkFBDrawingContext fbdc;
1281 gdk_fb_drawing_context_init (&fbdc, GDK_DRAWABLE_IMPL (window), NULL, FALSE, TRUE);
1283 xtrans = GDK_DRAWABLE_IMPL_FBDATA (window)->abs_x - GDK_DRAWABLE_IMPL_FBDATA (relto)->abs_x;
1284 ytrans = GDK_DRAWABLE_IMPL_FBDATA (window)->abs_y - GDK_DRAWABLE_IMPL_FBDATA (relto)->abs_y;
1286 for (cury = y; cury < (y + height); cury += ystep)
1288 int drawh = (cury + ytrans) % GDK_DRAWABLE_IMPL_FBDATA (bgpm)->height;
1289 ystep = GDK_DRAWABLE_IMPL_FBDATA (bgpm)->height - drawh;
1291 ystep = MIN (ystep, y + height - cury);
1293 for (curx = x; curx < (x + width); curx += xstep)
1295 int draww = (curx + xtrans) % GDK_DRAWABLE_IMPL_FBDATA (bgpm)->width;
1296 xstep = GDK_DRAWABLE_IMPL_FBDATA (bgpm)->width - draww;
1298 xstep = MIN (xstep, x + width - curx);
1299 gdk_fb_draw_drawable_3 (GDK_DRAWABLE_IMPL (window),
1301 GDK_DRAWABLE_IMPL (bgpm),
1309 gdk_fb_drawing_context_finalize (&fbdc);
1313 if (relto == window)
1314 gdk_draw_rectangle (window, _gdk_fb_screen_gc, TRUE, x, y, width, height);
1317 /* GDK_PARENT_RELATIVE_BG, but no pixmap, get the color from the parent window. */
1320 values.foreground = GDK_WINDOW_P (relto)->bg_color;
1321 gc = gdk_gc_new_with_values (window, &values, GDK_GC_FOREGROUND);
1322 gdk_draw_rectangle (window, gc, TRUE, x, y, width, height);
1328 /* What's the diff? */
1330 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1336 _gdk_windowing_window_clear_area (window, x, y, width, height);
1340 gdk_fb_window_raise (GdkWindow *window)
1342 GdkWindowObject *parent;
1344 parent = GDK_WINDOW_OBJECT (window)->parent;
1346 parent->children = g_list_remove (parent->children, window);
1347 parent->children = g_list_prepend (parent->children, window);
1351 gdk_fb_window_lower (GdkWindow *window)
1353 GdkWindowObject *parent;
1355 parent = GDK_WINDOW_OBJECT (window)->parent;
1357 parent->children = g_list_remove (parent->children, window);
1358 parent->children = g_list_append (parent->children, window);
1363 gdk_window_raise (GdkWindow *window)
1365 g_return_if_fail (window != NULL);
1366 g_return_if_fail (GDK_IS_WINDOW (window));
1368 gdk_fb_window_raise (window);
1370 if (GDK_WINDOW_OBJECT (window)->parent)
1371 gdk_window_invalidate_rect (window, NULL, TRUE);
1375 gdk_window_lower (GdkWindow *window)
1377 g_return_if_fail (window != NULL);
1378 g_return_if_fail (GDK_IS_WINDOW (window));
1380 gdk_fb_window_lower (window);
1382 if (GDK_WINDOW_OBJECT (window)->parent)
1383 gdk_window_invalidate_rect (window, NULL, TRUE);
1387 gdk_window_set_hints (GdkWindow *window,
1399 gdk_window_set_geometry_hints (GdkWindow *window,
1400 GdkGeometry *geometry,
1401 GdkWindowHints geom_mask)
1406 gdk_window_set_title (GdkWindow *window,
1412 gdk_window_set_role (GdkWindow *window,
1418 gdk_window_set_transient_for (GdkWindow *window,
1421 GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
1422 GdkWindowObject *root = GDK_WINDOW_OBJECT (_gdk_parent_root);
1425 g_return_if_fail (window != NULL);
1426 g_return_if_fail (GDK_IS_WINDOW (window));
1428 g_return_if_fail (parent != NULL);
1429 g_return_if_fail (GDK_IS_WINDOW (parent));
1431 g_return_if_fail ((GdkWindow *)private->parent == _gdk_parent_root);
1432 g_return_if_fail ((GdkWindow *)GDK_WINDOW_OBJECT (parent)->parent == _gdk_parent_root);
1434 root->children = g_list_remove (root->children, window);
1436 i = g_list_index (root->children, parent);
1438 root->children = g_list_prepend (root->children, window);
1440 root->children = g_list_insert (root->children, window, i);
1444 gdk_window_set_background (GdkWindow *window,
1445 const GdkColor *color)
1447 GdkWindowObject *private = (GdkWindowObject *)window;
1449 g_return_if_fail (window != NULL);
1450 g_return_if_fail (GDK_IS_WINDOW (window));
1452 private->bg_color = *color;
1454 if (private->bg_pixmap &&
1455 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1456 private->bg_pixmap != GDK_NO_BG)
1458 gdk_pixmap_unref (private->bg_pixmap);
1459 private->bg_pixmap = NULL;
1464 gdk_window_set_back_pixmap (GdkWindow *window,
1466 gboolean parent_relative)
1468 GdkWindowObject *private = (GdkWindowObject *)window;
1469 GdkPixmap *old_pixmap;
1471 g_return_if_fail (window != NULL);
1472 g_return_if_fail (GDK_IS_WINDOW (window));
1473 g_return_if_fail (pixmap == NULL || !parent_relative);
1474 g_return_if_fail (pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap));
1476 if (pixmap && !gdk_drawable_get_colormap (pixmap))
1478 g_warning ("gdk_window_set_back_pixmap(): pixmap must have a colormap");
1482 old_pixmap = private->bg_pixmap;
1484 if (parent_relative)
1486 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1492 gdk_pixmap_ref (pixmap);
1493 private->bg_pixmap = pixmap;
1497 private->bg_pixmap = GDK_NO_BG;
1502 old_pixmap != GDK_PARENT_RELATIVE_BG &&
1503 old_pixmap != GDK_NO_BG)
1504 gdk_pixmap_unref (old_pixmap);
1508 gdk_window_set_cursor (GdkWindow *window,
1511 GdkCursor *old_cursor = GDK_WINDOW_IMPL_FBDATA(window)->cursor;
1512 GdkRectangle window_reg;
1514 GDK_WINDOW_IMPL_FBDATA (window)->cursor = cursor ? gdk_cursor_ref (cursor) : NULL;
1517 gdk_cursor_unref (old_cursor);
1519 window_reg.x = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_x;
1520 window_reg.y = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_y;
1521 window_reg.width = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_x - window_reg.x;
1522 window_reg.height = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_y - window_reg.y;
1523 if (gdk_fb_cursor_need_hide (&window_reg))
1524 gdk_fb_cursor_reset ();
1528 gdk_window_get_geometry (GdkWindow *window,
1535 GdkWindowObject *private = (GdkWindowObject *)window;
1537 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
1540 window = _gdk_parent_root;
1542 if (!private->destroyed)
1550 *width = GDK_DRAWABLE_IMPL_FBDATA (window)->width;
1552 *height = GDK_DRAWABLE_IMPL_FBDATA (window)->height;
1554 *depth = gdk_display->modeinfo.bits_per_pixel;
1559 gdk_window_get_origin (GdkWindow *window,
1563 g_return_val_if_fail (window != NULL, FALSE);
1566 *x = GDK_DRAWABLE_IMPL_FBDATA (window)->abs_x;
1568 *y = GDK_DRAWABLE_IMPL_FBDATA (window)->abs_y;
1574 gdk_window_get_deskrelative_origin (GdkWindow *window,
1580 gboolean return_val;
1582 g_return_val_if_fail (window != NULL, 0);
1584 if (!GDK_WINDOW_DESTROYED (window))
1586 tx = GDK_DRAWABLE_IMPL_FBDATA (window)->abs_x;
1587 ty = GDK_DRAWABLE_IMPL_FBDATA (window)->abs_y;
1603 gdk_window_get_root_origin (GdkWindow *window,
1607 gdk_window_get_deskrelative_origin (window, x, y);
1611 gdk_window_fb_get_visible_region (GdkDrawable *drawable)
1613 GdkDrawableFBData *priv = GDK_DRAWABLE_FBDATA (drawable);
1614 GdkRectangle result_rect;
1615 GdkRectangle screen_rect;
1619 result_rect.width = priv->width;
1620 result_rect.height = priv->height;
1622 screen_rect.x = -priv->abs_x;
1623 screen_rect.y = -priv->abs_y;
1624 screen_rect.width = gdk_display->fb_width;
1625 screen_rect.height = gdk_display->fb_height;
1627 gdk_rectangle_intersect (&result_rect, &screen_rect, &result_rect);
1629 return gdk_region_rectangle (&result_rect);
1633 _gdk_windowing_window_get_pointer (GdkDisplay *display,
1637 GdkModifierType *mask)
1639 GdkWindow *return_val;
1643 gint shape_dx, shape_dy;
1646 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1648 gdk_window_get_root_origin (window, &x_int, &y_int);
1649 gdk_fb_mouse_get_info (&winx, &winy, mask);
1659 shape = gdk_fb_window_peek_shape (window, &shape_dx, &shape_dy);
1660 if ((winx >= 0) && (winx < GDK_DRAWABLE_IMPL_FBDATA (window)->width) &&
1661 (winy >= 0) && (winy < GDK_DRAWABLE_IMPL_FBDATA (window)->height) &&
1662 (!shape || gdk_region_point_in (shape, winx - shape_dx, winy - shape_dy)))
1664 GdkWindowObject *private;
1665 GdkWindowObject *sub;
1666 int subx = winx, suby = winy;
1668 for (private = sub = (GdkWindowObject *)window; sub; private = sub)
1672 for (ltmp = private->children; ltmp; ltmp = ltmp->next)
1676 if (!GDK_WINDOW_IS_MAPPED (sub))
1679 shape = gdk_fb_window_peek_shape (GDK_WINDOW (sub),
1680 &shape_dx, &shape_dy);
1681 if (subx >= sub->x &&
1682 (subx < (GDK_DRAWABLE_IMPL_FBDATA (sub)->width + sub->x)) &&
1684 (suby < (GDK_DRAWABLE_IMPL_FBDATA (sub)->height + sub->y)) &&
1685 (!shape || gdk_region_point_in (shape, subx - sub->x - shape_dx, suby - sub->y - shape_dy)))
1700 return_val = (GdkWindow *)private;
1704 return_val = _gdk_parent_root;
1710 _gdk_windowing_get_pointer (GdkDisplay *display,
1714 GdkModifierType *mask)
1716 GdkScreen *default_screen = gdk_display_get_default_screen (display);
1717 GdkWindow *root_window = gdk_screen_get_root_window (default_screen);
1719 *screen = default_screen;
1720 _gdk_windowing_window_get_pointer (display, root_window, x, y, mask);
1724 _gdk_windowing_window_at_pointer (GdkDisplay *display,
1729 GdkWindow *retval = gdk_window_get_pointer (NULL, win_x, win_y, NULL);
1733 gdk_window_get_origin (retval, &ry, &rx);
1742 gdk_window_get_events (GdkWindow *window)
1744 g_return_val_if_fail (window != NULL, 0);
1745 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
1747 if (GDK_WINDOW_DESTROYED (window))
1750 return GDK_WINDOW_OBJECT (window)->event_mask;
1754 gdk_window_set_events (GdkWindow *window,
1755 GdkEventMask event_mask)
1758 g_return_if_fail (window != NULL);
1759 g_return_if_fail (GDK_IS_WINDOW (window));
1761 if (event_mask & GDK_BUTTON_MOTION_MASK)
1763 GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK |
1764 GDK_BUTTON3_MOTION_MASK;
1766 GDK_WINDOW_OBJECT (window)->event_mask = GDK_STRUCTURE_MASK | event_mask;
1770 gdk_window_add_colormap_windows (GdkWindow *window)
1772 g_return_if_fail (window != NULL);
1773 g_return_if_fail (GDK_IS_WINDOW (window));
1780 gdk_fb_region_create_from_bitmap (GdkBitmap *bitmap)
1782 GdkDrawableFBData *private;
1790 g_return_val_if_fail(bitmap != NULL, NULL);
1791 g_return_val_if_fail(GDK_IS_PIXMAP(bitmap), NULL);
1793 private = GDK_DRAWABLE_IMPL_FBDATA (bitmap);
1795 g_return_val_if_fail(private->depth == 1, NULL);
1797 region = gdk_region_new();
1801 in_rect = FALSE; /* Haven't started a rectangle yet */
1803 for (rect.y = 0; rect.y < private->height; (rect.y)++)
1805 src = private->mem + rect.y * private->rowstride;
1807 for (x = 0; x < private->width; x++)
1809 if ((*src & bit_mask) && !in_rect)
1815 else if (!(*src & bit_mask) && in_rect)
1819 rect.width = x - rect.x;
1820 gdk_region_union_with_rect (region, &rect);
1823 if (bit_mask == 1<<7)
1834 /* Past end of line */
1836 rect.width = x - rect.x;
1837 gdk_region_union_with_rect (region, &rect);
1845 gdk_fb_window_peek_shape (GdkDrawable *window, gint *dx, gint *dy)
1849 if (!GDK_IS_WINDOW (window))
1852 if (GDK_WINDOW_IMPL_FBDATA (window)->shape == NULL)
1857 while (GDK_WINDOW_IMPL_FBDATA (window)->shape == GDK_FB_USE_CHILD_SHAPE)
1860 children = ((GdkWindowObject*)window)->children;
1863 window = (GdkDrawable *)children->data;
1864 x += GDK_WINDOW_P(window)->x;
1865 y += GDK_WINDOW_P(window)->y;
1874 return GDK_WINDOW_IMPL_FBDATA (window)->shape;
1877 gdk_fb_window_get_abs_shape (GdkDrawable *window)
1881 if (!GDK_IS_WINDOW (window))
1884 if (GDK_WINDOW_IMPL_FBDATA (window)->shape == NULL)
1887 if (GDK_WINDOW_IMPL_FBDATA (window)->shape == GDK_FB_USE_CHILD_SHAPE)
1890 children = ((GdkWindowObject*)window)->children;
1892 return gdk_fb_window_get_abs_shape ((GdkDrawable *)children->data);
1897 shape = gdk_region_copy (GDK_WINDOW_IMPL_FBDATA (window)->shape);
1898 gdk_region_offset (shape,
1899 GDK_DRAWABLE_IMPL_FBDATA (window)->abs_x,
1900 GDK_DRAWABLE_IMPL_FBDATA (window)->abs_y);
1906 _gdk_window_shape_combine_region (GdkWindow *window,
1911 GdkWindowFBData *private;
1912 GdkDrawableFBData *drawable_private;
1913 GdkRegion *old_region = NULL;
1914 GdkRegion *new_region = NULL;
1917 g_return_if_fail (window != NULL);
1918 g_return_if_fail (GDK_IS_WINDOW (window));
1920 private = GDK_WINDOW_IMPL_FBDATA (window);
1921 drawable_private = GDK_DRAWABLE_IMPL_FBDATA (window);
1923 if (GDK_WINDOW_IS_MAPPED (window))
1925 old_region = gdk_fb_window_get_abs_shape (window);
1926 if (old_region == NULL)
1928 rect.x = drawable_private->llim_x;
1929 rect.y = drawable_private->llim_y;
1930 rect.width = drawable_private->lim_x - rect.x;
1931 rect.height = drawable_private->lim_y - rect.y;
1932 old_region = gdk_region_rectangle (&rect);
1936 if (private->shape && private->shape != GDK_FB_USE_CHILD_SHAPE)
1937 gdk_region_destroy (private->shape);
1941 private->shape = shape;
1942 if (shape != GDK_FB_USE_CHILD_SHAPE)
1943 gdk_region_offset (private->shape, x, y);
1946 private->shape = NULL;
1948 if (GDK_WINDOW_IS_MAPPED (window))
1950 new_region = gdk_fb_window_get_abs_shape (window);
1951 if (new_region == NULL)
1953 rect.x = drawable_private->llim_x;
1954 rect.y = drawable_private->llim_y;
1955 rect.width = drawable_private->lim_x - rect.x;
1956 rect.height = drawable_private->lim_y - rect.y;
1957 new_region = gdk_region_rectangle (&rect);
1960 gdk_region_subtract (old_region, new_region);
1961 gdk_region_destroy (new_region);
1962 gdk_window_invalidate_region (_gdk_parent_root, old_region, TRUE);
1963 gdk_region_destroy (old_region);
1968 gdk_window_shape_combine_mask (GdkWindow *window,
1972 _gdk_window_shape_combine_region (window,
1973 (mask == GDK_FB_USE_CHILD_SHAPE)?
1974 GDK_FB_USE_CHILD_SHAPE :
1976 gdk_fb_region_create_from_bitmap (mask) :
1982 gdk_window_shape_combine_region (GdkWindow *window,
1987 _gdk_window_shape_combine_region (window,
1988 gdk_region_copy (shape),
1993 gdk_window_set_override_redirect (GdkWindow *window,
1994 gboolean override_redirect)
1996 g_return_if_fail (window != NULL);
1997 g_return_if_fail (GDK_IS_WINDOW (window));
2003 gdk_window_set_accept_focus (GdkWindow *window,
2004 gboolean accept_focus)
2006 GdkWindowObject *private;
2007 g_return_if_fail (window != NULL);
2008 g_return_if_fail (GDK_IS_WINDOW (window));
2010 private = (GdkWindowObject *)window;
2012 accept_focus = accept_focus != FALSE;
2014 if (private->accept_focus != accept_focus)
2015 private->accept_focus = accept_focus;
2019 gdk_window_set_focus_on_map (GdkWindow *window,
2020 gboolean focus_on_map)
2022 GdkWindowObject *private;
2023 g_return_if_fail (window != NULL);
2024 g_return_if_fail (GDK_IS_WINDOW (window));
2026 private = (GdkWindowObject *)window;
2028 focus_on_map = focus_on_map != FALSE;
2030 if (private->focus_on_map != focus_on_map)
2031 private->focus_on_map = focus_on_map;
2035 gdk_window_set_icon (GdkWindow *window,
2036 GdkWindow *icon_window,
2040 g_return_if_fail (window != NULL);
2041 g_return_if_fail (GDK_IS_WINDOW (window));
2047 gdk_window_set_icon_name (GdkWindow *window,
2050 g_return_if_fail (window != NULL);
2051 g_return_if_fail (GDK_IS_WINDOW (window));
2057 gdk_window_set_group (GdkWindow *window,
2060 g_return_if_fail (window != NULL);
2061 g_return_if_fail (GDK_IS_WINDOW (window));
2062 g_return_if_fail (leader != NULL);
2063 g_return_if_fail (GDK_IS_WINDOW (leader));
2069 gdk_fb_window_set_child_handler (GdkWindow *window,
2070 GdkWindowChildChanged changed,
2071 GdkWindowChildGetPos get_pos,
2074 GdkWindowChildHandlerData *data;
2076 g_return_if_fail (window != NULL);
2077 g_return_if_fail (GDK_IS_WINDOW (window));
2079 data = g_new (GdkWindowChildHandlerData, 1);
2080 data->changed = changed;
2081 data->get_pos = get_pos;
2082 data->user_data = user_data;
2084 g_object_set_data_full (G_OBJECT (window), "gdk-window-child-handler",
2085 data, (GDestroyNotify) g_free);
2089 gdk_window_set_decorations (GdkWindow *window,
2090 GdkWMDecoration decorations)
2092 GdkWMDecoration *dec;
2094 g_return_if_fail (window != NULL);
2095 g_return_if_fail (GDK_IS_WINDOW (window));
2097 dec = g_new (GdkWMDecoration, 1);
2100 g_object_set_data_full (G_OBJECT (window), "gdk-window-decorations",
2101 dec, (GDestroyNotify) g_free);
2105 gdk_window_get_decorations(GdkWindow *window,
2106 GdkWMDecoration *decorations)
2108 GdkWMDecoration *dec;
2110 g_return_val_if_fail (window != NULL, FALSE);
2111 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2114 dec = g_object_get_data (G_OBJECT (window), "gdk-window-decorations");
2117 *decorations = *dec;
2124 gdk_window_set_functions (GdkWindow *window,
2125 GdkWMFunction functions)
2127 g_return_if_fail (window != NULL);
2128 g_return_if_fail (GDK_IS_WINDOW (window));
2134 gdk_window_set_child_shapes (GdkWindow *window)
2136 g_return_if_fail (window != NULL);
2137 g_return_if_fail (GDK_IS_WINDOW (window));
2142 gdk_window_merge_child_shapes (GdkWindow *window)
2144 g_return_if_fail (window != NULL);
2145 g_return_if_fail (GDK_IS_WINDOW (window));
2149 /*************************************************************
2150 * gdk_window_set_static_gravities:
2151 * Set the bit gravity of the given window to static,
2152 * and flag it so all children get static subwindow
2155 * window: window for which to set static gravity
2156 * use_static: Whether to turn static gravity on or off.
2158 * Does the XServer support static gravity?
2159 *************************************************************/
2162 gdk_window_set_static_gravities (GdkWindow *window,
2163 gboolean use_static)
2165 g_return_val_if_fail (window != NULL, FALSE);
2166 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2172 _gdk_windowing_window_get_offsets (GdkWindow *window,
2176 *x_offset = *y_offset = 0;
2180 _gdk_windowing_window_queue_antiexpose (GdkWindow *window,
2187 gdk_window_stick (GdkWindow *window)
2189 g_return_if_fail (GDK_IS_WINDOW (window));
2193 gdk_window_unstick (GdkWindow *window)
2195 g_return_if_fail (GDK_IS_WINDOW (window));
2199 gdk_window_maximize (GdkWindow *window)
2201 g_return_if_fail (GDK_IS_WINDOW (window));
2203 gdk_synthesize_window_state (window,
2205 GDK_WINDOW_STATE_MAXIMIZED);
2209 gdk_window_unmaximize (GdkWindow *window)
2211 g_return_if_fail (GDK_IS_WINDOW (window));
2213 gdk_synthesize_window_state (window,
2214 GDK_WINDOW_STATE_MAXIMIZED,
2219 gdk_window_iconify (GdkWindow *window)
2221 g_return_if_fail (window != NULL);
2222 g_return_if_fail (GDK_IS_WINDOW (window));
2224 g_warning ("gdk_window_iconify() not implemented.\n");
2228 gdk_window_deiconify (GdkWindow *window)
2230 g_return_if_fail (window != NULL);
2231 g_return_if_fail (GDK_IS_WINDOW (window));
2233 /* g_warning ("gdk_window_deiconify() not implemented.\n");*/
2237 gdk_window_fullscreen (GdkWindow *window)
2239 g_return_if_fail (GDK_IS_WINDOW (window));
2241 g_warning ("gdk_window_fullscreen() not implemented.\n");
2245 gdk_window_unfullscreen (GdkWindow *window)
2247 g_return_if_fail (GDK_IS_WINDOW (window));
2249 /* g_warning ("gdk_window_unfullscreen() not implemented.\n");*/
2253 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
2255 g_return_if_fail (GDK_IS_WINDOW (window));
2257 g_warning ("gdk_window_set_keep_above() not implemented.\n");
2261 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
2263 g_return_if_fail (GDK_IS_WINDOW (window));
2265 g_warning ("gdk_window_set_keep_below() not implemented.\n");
2269 gdk_window_focus (GdkWindow *window,
2272 g_return_if_fail (GDK_IS_WINDOW (window));
2274 g_warning ("gdk_window_focus() not implemented.\n");
2278 gdk_window_set_type_hint (GdkWindow *window,
2279 GdkWindowTypeHint hint)
2281 g_return_if_fail (window != NULL);
2282 g_return_if_fail (GDK_IS_WINDOW (window));
2286 gdk_window_set_modal_hint (GdkWindow *window,
2289 g_return_if_fail (GDK_IS_WINDOW (window));
2293 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
2294 gboolean skips_taskbar)
2296 g_return_if_fail (GDK_IS_WINDOW (window));
2300 gdk_window_set_skip_pager_hint (GdkWindow *window,
2301 gboolean skips_pager)
2303 g_return_if_fail (GDK_IS_WINDOW (window));
2307 gdk_window_begin_resize_drag (GdkWindow *window,
2314 g_return_if_fail (GDK_IS_WINDOW (window));
2319 gdk_window_begin_move_drag (GdkWindow *window,
2325 g_return_if_fail (GDK_IS_WINDOW (window));
2329 gdk_window_set_icon_list (GdkWindow *window,
2332 /* We don't support icons right now */
2335 /* No need to care about frames. Decoration is done by GtkWindow */
2337 gdk_window_get_frame_extents (GdkWindow *window,
2340 g_return_if_fail (window != NULL);
2342 rect->x = GDK_DRAWABLE_IMPL_FBDATA (window)->abs_x;
2343 rect->y = GDK_DRAWABLE_IMPL_FBDATA (window)->abs_y;
2344 rect->width = GDK_DRAWABLE_IMPL_FBDATA (window)->width;
2345 rect->height = GDK_DRAWABLE_IMPL_FBDATA (window)->height;
2349 gdk_window_foreign_new_for_display (GdkDisplay *display,
2350 GdkNativeWindow anid)
2352 return (GdkWindow*) gdk_drawable_ref ((GdkDrawable *)anid);
2356 gdk_window_lookup (GdkNativeWindow anid)
2358 return (GdkWindow*) (anid);
2362 gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
2364 g_return_val_if_fail (display == gdk_display_get_default(), NULL);
2366 return (GdkWindow*) (anid);
2370 gdk_window_enable_synchronized_configure (GdkWindow *window)
2375 gdk_window_configure_finished (GdkWindow *window)