1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3 * Copyright (C) 1998-1999 Tor Lillqvist
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
22 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
23 * file for a list of people on the GTK+ Team.
27 * GTK+ DirectFB backend
28 * Copyright (C) 2001-2002 convergence integrated media GmbH
29 * Copyright (C) 2002-2004 convergence GmbH
30 * Written by Denis Oliver Kropp <dok@convergence.de> and
31 * Sven Neumann <sven@convergence.de>
36 #include "gdkwindow.h"
38 #include "gdkdirectfb.h"
39 #include "gdkprivate-directfb.h"
41 #include "gdkregion-generic.h"
43 #include "gdkinternals.h"
47 static GdkRegion * gdk_window_impl_directfb_get_visible_region (GdkDrawable *drawable);
48 static void gdk_window_impl_directfb_set_colormap (GdkDrawable *drawable,
49 GdkColormap *colormap);
50 static void gdk_window_impl_directfb_init (GdkWindowImplDirectFB *window);
51 static void gdk_window_impl_directfb_class_init (GdkWindowImplDirectFBClass *klass);
52 static void gdk_window_impl_directfb_finalize (GObject *object);
56 GdkWindowChildChanged changed;
57 GdkWindowChildGetPos get_pos;
59 } GdkWindowChildHandlerData;
63 static GdkWindow *gdk_directfb_window_containing_pointer = NULL;
64 static GdkWindow *gdk_directfb_focused_window = NULL;
65 static gpointer parent_class = NULL;
66 GdkWindow * _gdk_parent_root = NULL;
70 gdk_window_impl_directfb_get_type (void)
72 static GType object_type = 0;
76 static const GTypeInfo object_info =
78 sizeof (GdkWindowImplDirectFBClass),
80 (GBaseFinalizeFunc) NULL,
81 (GClassInitFunc) gdk_window_impl_directfb_class_init,
82 NULL, /* class_finalize */
83 NULL, /* class_data */
84 sizeof (GdkWindowImplDirectFB),
86 (GInstanceInitFunc) gdk_window_impl_directfb_init,
89 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_DIRECTFB,
90 "GdkWindowImplDirectFB",
98 _gdk_window_impl_get_type (void)
100 return gdk_window_impl_directfb_get_type ();
104 gdk_window_impl_directfb_init (GdkWindowImplDirectFB *impl)
106 impl->drawable.width = 1;
107 impl->drawable.height = 1;
108 //cannot use gdk_cursor_new here since gdk_display_get_default
110 impl->cursor = gdk_cursor_new_for_display (GDK_DISPLAY_OBJECT(_gdk_display),GDK_LEFT_PTR);
115 gdk_window_impl_directfb_class_init (GdkWindowImplDirectFBClass *klass)
117 GObjectClass *object_class = G_OBJECT_CLASS (klass);
118 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
120 parent_class = g_type_class_peek_parent (klass);
122 object_class->finalize = gdk_window_impl_directfb_finalize;
124 drawable_class->set_colormap = gdk_window_impl_directfb_set_colormap;
126 /* Visible and clip regions are the same */
128 drawable_class->get_clip_region =
129 gdk_window_impl_directfb_get_visible_region;
131 drawable_class->get_visible_region =
132 gdk_window_impl_directfb_get_visible_region;
136 g_free_2nd (gpointer a,
144 gdk_window_impl_directfb_finalize (GObject *object)
146 GdkWindowImplDirectFB *impl = GDK_WINDOW_IMPL_DIRECTFB (object);
148 if (GDK_WINDOW_IS_MAPPED (impl->drawable.wrapper))
149 gdk_window_hide (impl->drawable.wrapper);
152 gdk_cursor_unref (impl->cursor);
154 if (impl->properties)
156 g_hash_table_foreach (impl->properties, g_free_2nd, NULL);
157 g_hash_table_destroy (impl->properties);
161 gdk_directfb_window_id_table_remove (impl->dfb_id);
162 /* native window resource must be release before we can finalize !*/
163 /*impl->window->Release (impl->window);*/
167 if (G_OBJECT_CLASS (parent_class)->finalize)
168 G_OBJECT_CLASS (parent_class)->finalize (object);
172 gdk_window_impl_directfb_get_visible_region (GdkDrawable *drawable)
174 GdkDrawableImplDirectFB *priv = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
175 GdkRectangle rect = { 0, 0, 0, 0 };
176 DFBRectangle drect = { 0, 0, 0, 0 };
179 priv->surface->GetVisibleRectangle (priv->surface, &drect);
184 return gdk_region_rectangle (&rect);
188 gdk_window_impl_directfb_set_colormap (GdkDrawable *drawable,
189 GdkColormap *colormap)
191 GDK_DRAWABLE_CLASS (parent_class)->set_colormap (drawable, colormap);
195 GdkDrawableImplDirectFB *priv = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
199 IDirectFBPalette *palette = gdk_directfb_colormap_get_palette (colormap);
202 priv->surface->SetPalette (priv->surface, palette);
209 create_directfb_window (GdkWindowImplDirectFB *impl,
210 DFBWindowDescription *desc,
211 DFBWindowOptions window_options)
214 IDirectFBWindow *window;
216 ret = _gdk_display->layer->CreateWindow (_gdk_display->layer, desc, &window);
220 DirectFBError ("gdk_window_new: Layer->CreateWindow failed", ret);
224 if ((desc->flags & DWDESC_CAPS) && (desc->caps & DWCAPS_INPUTONLY))
225 impl->drawable.surface = NULL;
227 window->GetSurface (window, &impl->drawable.surface);
231 DFBWindowOptions options;
232 window->GetOptions (window, &options);
233 window->SetOptions (window, options | window_options);
236 impl->window = window;
242 _gdk_windowing_window_init (void)
244 GdkWindowObject *private;
245 GdkWindowImplDirectFB *impl;
246 DFBDisplayLayerConfig dlc;
248 g_assert (_gdk_parent_root == NULL);
250 _gdk_display->layer->GetConfiguration(
251 _gdk_display->layer, &dlc );
253 _gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL);
254 private = GDK_WINDOW_OBJECT (_gdk_parent_root);
255 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
257 private->window_type = GDK_WINDOW_ROOT;
259 private->children = NULL;
262 impl->drawable.abs_x = 0;
263 impl->drawable.abs_y = 0;
264 impl->drawable.width = dlc.width;
265 impl->drawable.height = dlc.height;
266 impl->drawable.wrapper = GDK_DRAWABLE (private);
267 /* custom root window init */
269 DFBWindowDescription desc;
271 /*XXX I must do this now its a bug ALPHA ROOT*/
273 desc.flags |= DWDESC_CAPS;
274 desc.caps = DWCAPS_ALPHACHANNEL;
276 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
277 DWDESC_POSX | DWDESC_POSY );
280 desc.width = dlc.width;
281 desc.height = dlc.height;
282 create_directfb_window (impl,&desc,0);
283 g_assert(impl->window != NULL);
284 g_assert(impl->drawable.surface != NULL );
286 impl->drawable.surface->GetPixelFormat(impl->drawable.surface,&impl->drawable.format);
287 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
293 gdk_directfb_window_new (GdkWindow *parent,
294 GdkWindowAttr *attributes,
295 gint attributes_mask,
296 DFBWindowCapabilities window_caps,
297 DFBWindowOptions window_options,
298 DFBSurfaceCapabilities surface_caps)
301 GdkWindowObject *private;
302 GdkWindowObject *parent_private;
303 GdkWindowImplDirectFB *impl;
304 GdkWindowImplDirectFB *parent_impl;
306 DFBWindowDescription desc;
309 g_return_val_if_fail (attributes != NULL, NULL);
311 if (!parent || attributes->window_type != GDK_WINDOW_CHILD)
312 parent = _gdk_parent_root;
314 window = g_object_new (GDK_TYPE_WINDOW, NULL);
315 private = GDK_WINDOW_OBJECT (window);
317 parent_private = GDK_WINDOW_OBJECT (parent);
318 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
319 private->parent = parent_private;
321 x = (attributes_mask & GDK_WA_X) ? attributes->x : 0;
322 y = (attributes_mask & GDK_WA_Y) ? attributes->y : 0;
324 gdk_window_set_events (window, attributes->event_mask | GDK_STRUCTURE_MASK);
326 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
327 impl->drawable.wrapper = GDK_DRAWABLE (window);
332 _gdk_directfb_calc_abs (window);
334 impl->drawable.width = MAX (1, attributes->width);
335 impl->drawable.height = MAX (1, attributes->height);
337 private->window_type = attributes->window_type;
341 if (attributes_mask & GDK_WA_VISUAL)
342 visual = attributes->visual;
344 visual = gdk_drawable_get_visual (parent);
346 switch (attributes->wclass)
348 case GDK_INPUT_OUTPUT:
349 private->input_only = FALSE;
351 desc.flags |= DWDESC_PIXELFORMAT;
352 desc.pixelformat = ((GdkVisualDirectFB *) visual)->format;
354 if (DFB_PIXELFORMAT_HAS_ALPHA (desc.pixelformat))
356 desc.flags |= DWDESC_CAPS;
357 desc.caps = DWCAPS_ALPHACHANNEL;
362 private->input_only = TRUE;
363 desc.flags |= DWDESC_CAPS;
364 desc.caps = DWCAPS_INPUTONLY;
368 g_warning ("gdk_window_new: unsupported window class\n");
369 _gdk_window_destroy (window, FALSE);
373 switch (private->window_type)
375 case GDK_WINDOW_TOPLEVEL:
376 case GDK_WINDOW_DIALOG:
377 case GDK_WINDOW_TEMP:
378 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
379 DWDESC_POSX | DWDESC_POSY );
382 desc.width = impl->drawable.width;
383 desc.height = impl->drawable.height;
387 if (! (desc.flags & DWDESC_CAPS))
389 desc.flags |= DWDESC_CAPS;
390 desc.caps = DWCAPS_NONE;
393 desc.caps |= window_caps;
398 desc.flags |= DWDESC_SURFACE_CAPS;
399 desc.surface_caps = surface_caps;
403 if (!create_directfb_window (impl, &desc, window_options))
406 _gdk_window_destroy (window, FALSE);
409 if( desc.caps != DWCAPS_INPUTONLY )
410 impl->window->SetOpacity(impl->window, 0x00 );
413 case GDK_WINDOW_CHILD:
415 if (!private->input_only && parent_impl->drawable.surface)
418 { x, y, impl->drawable.width, impl->drawable.height };
420 parent_impl->drawable.surface->GetSubSurface (parent_impl->drawable.surface,
422 &impl->drawable.surface);
427 g_warning ("gdk_window_new: unsupported window type: %d",
428 private->window_type);
429 _gdk_window_destroy (window, FALSE);
433 if (impl->drawable.surface)
435 GdkColormap *colormap;
437 impl->drawable.surface->GetPixelFormat (impl->drawable.surface,
438 &impl->drawable.format);
440 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
442 if ((attributes_mask & GDK_WA_COLORMAP) && attributes->colormap)
444 colormap = attributes->colormap;
448 if (gdk_visual_get_system () == visual)
449 colormap = gdk_colormap_get_system ();
451 colormap =gdk_drawable_get_colormap (parent);
454 gdk_drawable_set_colormap (GDK_DRAWABLE (window), colormap);
458 impl->drawable.format = ((GdkVisualDirectFB *)visual)->format;
459 private->depth = visual->depth;
462 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
463 (attributes->cursor) : NULL));
466 parent_private->children = g_list_prepend (parent_private->children,
469 /* we hold a reference count on ourselves */
470 g_object_ref (window);
474 impl->window->GetID (impl->window, &impl->dfb_id);
475 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
476 gdk_directfb_event_windows_add (window);
483 gdk_window_new (GdkWindow *parent,
484 GdkWindowAttr *attributes,
485 gint attributes_mask)
487 g_return_val_if_fail (attributes != NULL, NULL);
489 return gdk_directfb_window_new (parent, attributes, attributes_mask,
490 DWCAPS_NONE, DWOP_NONE, DSCAPS_NONE);
493 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
495 /* It's somebody else's window, but in our heirarchy,
496 * so reparent it to the root window, and then send
497 * it a delete event, as if we were a WM
499 _gdk_windowing_window_destroy (window,TRUE,TRUE);
504 _gdk_windowing_window_destroy (GdkWindow *window,
506 gboolean foreign_destroy)
508 GdkWindowObject *private;
509 GdkWindowImplDirectFB *impl;
511 g_return_if_fail (GDK_IS_WINDOW (window));
513 private = GDK_WINDOW_OBJECT (window);
514 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
516 _gdk_selection_window_destroyed (window);
518 if (window == _gdk_directfb_pointer_grab_window)
519 gdk_pointer_ungrab (GDK_CURRENT_TIME);
520 if (window == _gdk_directfb_keyboard_grab_window)
521 gdk_keyboard_ungrab (GDK_CURRENT_TIME);
523 if (window == gdk_directfb_focused_window)
524 gdk_directfb_change_focus (NULL);
527 printf( " DESTROYING WINDOW %p %p %d parent=%p\n",window,impl->window,recursing,(GDK_WINDOW_OBJECT (window))->parent);
529 if (!recursing && !foreign_destroy && impl->window ) {
530 impl->window->SetOpacity (impl->window,0);
531 impl->window->Close(impl->window);
532 impl->window->Release(impl->window);
535 #if 0 /* let the finalizer kill it */
536 if (!recursing && !foreign_destroy)
539 impl->window->Destroy (impl->window);
545 /* This function is called when the window is really gone.
548 gdk_window_destroy_notify (GdkWindow *window)
550 g_return_if_fail (GDK_IS_WINDOW (window));
552 if (!GDK_WINDOW_DESTROYED (window))
554 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
555 g_warning ("GdkWindow %p unexpectedly destroyed", window);
557 _gdk_window_destroy (window, TRUE);
559 g_object_unref (window);
562 /* Focus follows pointer */
564 gdk_directfb_window_find_toplevel (GdkWindow *window)
566 while (window && window != _gdk_parent_root)
568 GdkWindow *parent = (GdkWindow *) (GDK_WINDOW_OBJECT (window))->parent;
570 if ((parent == _gdk_parent_root) && GDK_WINDOW_IS_MAPPED (window))
576 return _gdk_parent_root;
580 gdk_directfb_window_find_focus (void)
582 if (_gdk_directfb_keyboard_grab_window)
583 return _gdk_directfb_keyboard_grab_window;
585 if (!gdk_directfb_focused_window)
586 gdk_directfb_focused_window = g_object_ref (_gdk_parent_root);
588 return gdk_directfb_focused_window;
592 gdk_directfb_change_focus (GdkWindow *new_focus_window)
594 GdkEventFocus *event;
597 GdkWindow *event_win;
600 /* No focus changes while the pointer is grabbed */
601 if (_gdk_directfb_pointer_grab_window)
604 old_win = gdk_directfb_focused_window;
605 new_win = gdk_directfb_window_find_toplevel (new_focus_window);
607 if (old_win == new_win)
612 event_win = gdk_directfb_keyboard_event_window (old_win,
616 event = (GdkEventFocus *) gdk_directfb_event_make (event_win,
622 event_win = gdk_directfb_keyboard_event_window (new_win,
626 event = (GdkEventFocus *) gdk_directfb_event_make (event_win,
631 if (gdk_directfb_focused_window)
632 g_object_unref (gdk_directfb_focused_window);
633 gdk_directfb_focused_window = g_object_ref (new_win);
637 gdk_window_set_accept_focus (GdkWindow *window,
638 gboolean accept_focus)
640 GdkWindowObject *private;
641 g_return_if_fail (window != NULL);
642 g_return_if_fail (GDK_IS_WINDOW (window));
644 private = (GdkWindowObject *)window;
646 accept_focus = accept_focus != FALSE;
648 if (private->accept_focus != accept_focus)
649 private->accept_focus = accept_focus;
654 gdk_window_set_focus_on_map (GdkWindow *window,
655 gboolean focus_on_map)
657 GdkWindowObject *private;
658 g_return_if_fail (window != NULL);
659 g_return_if_fail (GDK_IS_WINDOW (window));
661 private = (GdkWindowObject *)window;
663 focus_on_map = focus_on_map != FALSE;
665 if (private->focus_on_map != focus_on_map)
666 private->focus_on_map = focus_on_map;
670 gdk_directfb_window_raise (GdkWindow *window)
672 GdkWindowObject *parent;
674 parent = GDK_WINDOW_OBJECT (window)->parent;
676 if (parent->children->data == window)
679 parent->children = g_list_remove (parent->children, window);
680 parent->children = g_list_prepend (parent->children, window);
686 gdk_directfb_window_lower (GdkWindow *window)
688 GdkWindowObject *parent;
690 parent = GDK_WINDOW_OBJECT (window)->parent;
692 parent->children = g_list_remove (parent->children, window);
693 parent->children = g_list_append (parent->children, window);
697 all_parents_shown (GdkWindowObject *private)
699 while (GDK_WINDOW_IS_MAPPED (private))
702 private = GDK_WINDOW_OBJECT (private)->parent;
711 send_map_events (GdkWindowObject *private)
714 GdkWindow *event_win;
716 if (!GDK_WINDOW_IS_MAPPED (private))
719 event_win = gdk_directfb_other_event_window ((GdkWindow *) private, GDK_MAP);
721 gdk_directfb_event_make (event_win, GDK_MAP);
723 for (list = private->children; list; list = list->next)
724 send_map_events (list->data);
728 gdk_directfb_find_common_ancestor (GdkWindow *win1,
734 for (a = GDK_WINDOW_OBJECT (win1); a; a = a->parent)
735 for (b = GDK_WINDOW_OBJECT (win2); b; b = b->parent)
738 return GDK_WINDOW (a);
745 gdk_directfb_window_send_crossing_events (GdkWindow *src,
747 GdkCrossingMode mode)
750 GdkWindow *win, *last, *next;
752 gint x, y, x_int, y_int;
753 GdkModifierType modifiers;
758 GdkWindow *event_win;
760 /* Do a possible cursor change before checking if we need to
761 generate crossing events so cursor changes due to pointer
762 grabs work correctly. */
764 static GdkCursorDirectFB *last_cursor = NULL;
766 GdkWindowObject *private = GDK_WINDOW_OBJECT (dest);
767 GdkWindowImplDirectFB *impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
768 GdkCursorDirectFB *cursor;
770 if (_gdk_directfb_pointer_grab_cursor)
771 cursor = (GdkCursorDirectFB*) _gdk_directfb_pointer_grab_cursor;
773 cursor = (GdkCursorDirectFB*) impl->cursor;
775 if (cursor != last_cursor)
777 win = gdk_directfb_window_find_toplevel (dest);
778 private = GDK_WINDOW_OBJECT (win);
779 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
782 impl->window->SetCursorShape (impl->window,
784 cursor->hot_x, cursor->hot_y);
785 last_cursor = cursor;
789 if (dest == gdk_directfb_window_containing_pointer)
792 if (gdk_directfb_window_containing_pointer == NULL)
793 gdk_directfb_window_containing_pointer = g_object_ref (_gdk_parent_root);
798 a = gdk_directfb_window_containing_pointer;
805 /* gdk_directfb_window_containing_pointer might have been destroyed.
806 * The refcount we hold on it should keep it, but it's parents
809 if (GDK_WINDOW_DESTROYED (a))
810 a = _gdk_parent_root;
812 gdk_directfb_mouse_get_info (&x, &y, &modifiers);
814 c = gdk_directfb_find_common_ancestor (a, b);
816 non_linear = (c != a) && (c != b);
818 event_win = gdk_directfb_pointer_event_window (a, GDK_LEAVE_NOTIFY);
821 event = gdk_directfb_event_make (event_win, GDK_LEAVE_NOTIFY);
822 event->crossing.subwindow = NULL;
824 gdk_window_get_origin (a, &x_int, &y_int);
826 event->crossing.x = x - x_int;
827 event->crossing.y = y - y_int;
828 event->crossing.x_root = x;
829 event->crossing.y_root = y;
830 event->crossing.mode = mode;
833 event->crossing.detail = GDK_NOTIFY_NONLINEAR;
835 event->crossing.detail = GDK_NOTIFY_INFERIOR;
837 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
839 event->crossing.focus = FALSE;
840 event->crossing.state = modifiers;
843 /* Traverse up from a to (excluding) c */
847 win = GDK_WINDOW (GDK_WINDOW_OBJECT (a)->parent);
851 gdk_directfb_pointer_event_window (win, GDK_LEAVE_NOTIFY);
855 event = gdk_directfb_event_make (event_win, GDK_LEAVE_NOTIFY);
857 event->crossing.subwindow = g_object_ref (last);
859 gdk_window_get_origin (win, &x_int, &y_int);
861 event->crossing.x = x - x_int;
862 event->crossing.y = y - y_int;
863 event->crossing.x_root = x;
864 event->crossing.y_root = y;
865 event->crossing.mode = mode;
868 event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
870 event->crossing.detail = GDK_NOTIFY_VIRTUAL;
872 event->crossing.focus = FALSE;
873 event->crossing.state = modifiers;
877 win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent);
881 /* Traverse down from c to b */
885 win = GDK_WINDOW (GDK_WINDOW_OBJECT (b)->parent);
888 path = g_slist_prepend (path, win);
889 win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent);
895 win = GDK_WINDOW (list->data);
896 list = g_slist_next (list);
899 next = GDK_WINDOW (list->data);
904 gdk_directfb_pointer_event_window (win, GDK_ENTER_NOTIFY);
908 event = gdk_directfb_event_make (event_win, GDK_ENTER_NOTIFY);
910 event->crossing.subwindow = g_object_ref (next);
912 gdk_window_get_origin (win, &x_int, &y_int);
914 event->crossing.x = x - x_int;
915 event->crossing.y = y - y_int;
916 event->crossing.x_root = x;
917 event->crossing.y_root = y;
918 event->crossing.mode = mode;
921 event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
923 event->crossing.detail = GDK_NOTIFY_VIRTUAL;
925 event->crossing.focus = FALSE;
926 event->crossing.state = modifiers;
933 event_win = gdk_directfb_pointer_event_window (b, GDK_ENTER_NOTIFY);
936 event = gdk_directfb_event_make (event_win, GDK_ENTER_NOTIFY);
938 event->crossing.subwindow = NULL;
940 gdk_window_get_origin (b, &x_int, &y_int);
942 event->crossing.x = x - x_int;
943 event->crossing.y = y - y_int;
944 event->crossing.x_root = x;
945 event->crossing.y_root = y;
946 event->crossing.mode = mode;
949 event->crossing.detail = GDK_NOTIFY_NONLINEAR;
951 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
953 event->crossing.detail = GDK_NOTIFY_INFERIOR;
955 event->crossing.focus = FALSE;
956 event->crossing.state = modifiers;
959 if (mode != GDK_CROSSING_GRAB)
961 //this seems to cause focus to change as the pointer moves yuck
962 //gdk_directfb_change_focus (b);
963 if (b != gdk_directfb_window_containing_pointer)
965 g_object_unref (gdk_directfb_window_containing_pointer);
966 gdk_directfb_window_containing_pointer = g_object_ref (b);
972 show_window_internal (GdkWindow *window,
975 GdkWindowObject *private;
976 GdkWindowImplDirectFB *impl;
979 private = GDK_WINDOW_OBJECT (window);
980 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
982 if (!private->destroyed && !GDK_WINDOW_IS_MAPPED (private))
984 private->state &= ~GDK_WINDOW_STATE_WITHDRAWN;
987 gdk_window_raise (window);
989 if (all_parents_shown (GDK_WINDOW_OBJECT (private)->parent))
991 send_map_events (private);
993 mousewin = gdk_window_at_pointer (NULL, NULL);
994 gdk_directfb_window_send_crossing_events (NULL, mousewin,
995 GDK_CROSSING_NORMAL);
997 if (private->input_only)
1000 gdk_window_invalidate_rect (window, NULL, TRUE);
1006 if (gdk_directfb_apply_focus_opacity)
1007 impl->window->SetOpacity (impl->window,
1008 (impl->opacity >> 1) + (impl->opacity >> 2));
1010 impl->window->SetOpacity (impl->window, impl->opacity);
1011 /* if its the first window focus it */
1016 gdk_window_show_unraised (GdkWindow *window)
1018 g_return_if_fail (GDK_IS_WINDOW (window));
1020 show_window_internal (window, FALSE);
1024 gdk_window_show (GdkWindow *window)
1026 g_return_if_fail (GDK_IS_WINDOW (window));
1028 show_window_internal (window, TRUE);
1032 gdk_window_hide (GdkWindow *window)
1034 GdkWindowObject *private;
1035 GdkWindowImplDirectFB *impl;
1036 GdkWindow *mousewin;
1037 GdkWindow *event_win;
1039 g_return_if_fail (GDK_IS_WINDOW (window));
1041 private = GDK_WINDOW_OBJECT (window);
1042 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1045 impl->window->SetOpacity (impl->window, 0);
1047 if (!private->destroyed && GDK_WINDOW_IS_MAPPED (private))
1051 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
1053 if (!private->input_only && private->parent)
1055 _gdk_windowing_window_clear_area (GDK_WINDOW (private->parent),
1058 impl->drawable.width,
1059 impl->drawable.height);
1062 event_win = gdk_directfb_other_event_window (window, GDK_UNMAP);
1064 event = gdk_directfb_event_make (event_win, GDK_UNMAP);
1066 mousewin = gdk_window_at_pointer (NULL, NULL);
1067 gdk_directfb_window_send_crossing_events (NULL,
1069 GDK_CROSSING_NORMAL);
1071 if (window == _gdk_directfb_pointer_grab_window)
1072 gdk_pointer_ungrab (GDK_CURRENT_TIME);
1073 if (window == _gdk_directfb_keyboard_grab_window)
1074 gdk_keyboard_ungrab (GDK_CURRENT_TIME);
1079 gdk_window_withdraw (GdkWindow *window)
1081 g_return_if_fail (GDK_IS_WINDOW (window));
1083 /* for now this should be enough */
1084 gdk_window_hide (window);
1088 gdk_window_move (GdkWindow *window,
1092 GdkWindowObject *private;
1093 GdkWindowImplDirectFB *impl;
1095 g_return_if_fail (GDK_IS_WINDOW (window));
1097 private = GDK_WINDOW_OBJECT (window);
1098 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1104 impl->window->MoveTo (impl->window, x, y);
1108 gint width=impl->drawable.width;
1109 gint height=impl->drawable.height;
1111 { private->x, private->y,width,height };
1113 _gdk_directfb_move_resize_child (window, x, y, width, height);
1114 _gdk_directfb_calc_abs (window);
1116 if (GDK_WINDOW_IS_MAPPED (private))
1118 GdkWindow *mousewin;
1119 GdkRectangle new = { x, y, width, height };
1121 gdk_rectangle_union (&new, &old, &new);
1122 gdk_window_invalidate_rect (GDK_WINDOW (private->parent), &new,TRUE);
1124 /* The window the pointer is in might have changed */
1125 mousewin = gdk_window_at_pointer (NULL, NULL);
1126 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1127 GDK_CROSSING_NORMAL);
1133 gdk_window_resize (GdkWindow *window,
1137 GdkWindowObject *private;
1140 g_return_if_fail (GDK_IS_WINDOW (window));
1142 private = GDK_WINDOW_OBJECT (window);
1147 if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD))
1149 GdkWindowChildHandlerData *data;
1151 data = g_object_get_data (G_OBJECT (private->parent),
1152 "gdk-window-child-handler");
1155 (*data->get_pos) (window, &x, &y, data->user_data);
1158 gdk_window_move_resize (window, x, y, width, height);
1162 _gdk_directfb_move_resize_child (GdkWindow *window,
1168 GdkWindowObject *private;
1169 GdkWindowImplDirectFB *impl;
1170 GdkWindowImplDirectFB *parent_impl;
1173 g_return_if_fail (GDK_IS_WINDOW (window));
1175 private = GDK_WINDOW_OBJECT (window);
1176 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1181 impl->drawable.width = width;
1182 impl->drawable.height = height;
1184 if (!private->input_only)
1186 if (impl->drawable.surface)
1188 impl->drawable.surface->Release (impl->drawable.surface);
1189 impl->drawable.surface = NULL;
1192 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (private->parent)->impl);
1194 if (parent_impl->drawable.surface)
1196 DFBRectangle rect = { x, y, width, height };
1198 parent_impl->drawable.surface->GetSubSurface (parent_impl->drawable.surface,
1200 &impl->drawable.surface);
1204 for (list = private->children; list; list = list->next)
1206 private = GDK_WINDOW_OBJECT (list->data);
1207 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1208 _gdk_directfb_move_resize_child (list->data,
1209 private->x, private->y,
1210 impl->drawable.width, impl->drawable.height);
1215 gdk_window_move_resize (GdkWindow *window,
1221 GdkWindowObject *private;
1222 GdkWindowImplDirectFB *impl;
1224 g_return_if_fail (GDK_IS_WINDOW (window));
1226 private = GDK_WINDOW_OBJECT (window);
1227 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1234 if (private->destroyed ||
1235 (private->x == x && private->y == y &&
1236 impl->drawable.width == width && impl->drawable.height == height))
1239 if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD))
1241 GdkWindowChildHandlerData *data;
1243 data = g_object_get_data (G_OBJECT (private->parent),
1244 "gdk-window-child-handler");
1247 (*data->changed) (window, x, y, width, height, data->user_data))
1251 if (impl->drawable.width == width && impl->drawable.height == height)
1253 gdk_window_move (window, x, y);
1255 else if (impl->window)
1259 impl->window->MoveTo (impl->window, x, y);
1260 impl->window->Resize (impl->window, width, height);
1265 { private->x, private->y, impl->drawable.width, impl->drawable.height };
1266 _gdk_directfb_move_resize_child (window, x, y, width, height);
1267 _gdk_directfb_calc_abs (window);
1269 if (GDK_WINDOW_IS_MAPPED (private))
1271 GdkWindow *mousewin;
1272 GdkRectangle new = { x, y, width, height };
1274 gdk_rectangle_union (&new, &old, &new);
1275 gdk_window_invalidate_rect (GDK_WINDOW (private->parent), &new,TRUE);
1277 /* The window the pointer is in might have changed */
1278 mousewin = gdk_window_at_pointer (NULL, NULL);
1279 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1280 GDK_CROSSING_NORMAL);
1286 gdk_window_reparent (GdkWindow *window,
1287 GdkWindow *new_parent,
1291 GdkWindowObject *window_private;
1292 GdkWindowObject *parent_private;
1293 GdkWindowObject *old_parent_private;
1295 g_return_if_fail (GDK_IS_WINDOW (window));
1297 if (GDK_WINDOW_DESTROYED (window))
1301 new_parent = _gdk_parent_root;
1303 window_private = (GdkWindowObject *) window;
1304 old_parent_private = (GdkWindowObject *) window_private->parent;
1305 parent_private = (GdkWindowObject *) new_parent;
1307 window_private->parent = (GdkWindowObject *) new_parent;
1309 if (old_parent_private)
1311 old_parent_private->children =
1312 g_list_remove (old_parent_private->children, window);
1315 parent_private->children = g_list_prepend (parent_private->children, window);
1317 gdk_window_move_resize (window, x, y, -1, -1);
1321 _gdk_windowing_window_clear_area (GdkWindow *window,
1327 GdkWindowObject *private;
1328 GdkDrawableImplDirectFB *impl;
1329 GdkPixmap *bg_pixmap;
1330 GdkWindowObject *relative_to;
1335 g_return_if_fail (GDK_IS_WINDOW (window));
1337 if (GDK_WINDOW_DESTROYED (window))
1340 private = GDK_WINDOW_OBJECT (window);
1342 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1345 Follow XClearArea definition for zero height width
1348 width = impl->width-x;
1350 height = impl->height-y;
1352 bg_pixmap = private->bg_pixmap;
1354 for (relative_to = private;
1355 relative_to && bg_pixmap == GDK_PARENT_RELATIVE_BG;
1356 relative_to = relative_to->parent)
1358 bg_pixmap = relative_to->bg_pixmap;
1359 dx += relative_to->x;
1360 dy += relative_to->y;
1363 if (bg_pixmap == GDK_NO_BG)
1366 if (bg_pixmap && bg_pixmap != GDK_PARENT_RELATIVE_BG)
1370 values.fill = GDK_TILED;
1371 values.tile = bg_pixmap;
1372 values.ts_x_origin = - dx;
1373 values.ts_y_origin = - dy;
1375 gc = gdk_gc_new_with_values (GDK_DRAWABLE (impl), &values,
1376 GDK_GC_FILL | GDK_GC_TILE |
1377 GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN);
1381 /* GDK_PARENT_RELATIVE_BG, but no pixmap,
1382 get the color from the parent window. */
1386 values.foreground = relative_to->bg_color;
1388 gc = gdk_gc_new_with_values (GDK_DRAWABLE (impl), &values,
1392 gdk_draw_rectangle (GDK_DRAWABLE (impl),
1393 gc, TRUE, x, y, width, height);
1396 g_object_unref (gc);
1400 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1407 GdkWindowObject *private;
1408 GdkWindowImplDirectFB *impl;
1410 g_return_if_fail (GDK_IS_WINDOW (window));
1412 private = GDK_WINDOW_OBJECT (window);
1413 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1416 Follow XClearArea definition for zero height width
1419 width = impl->drawable.width-x;
1421 height = impl->drawable.height-y;
1426 rect.height = height;
1428 g_return_if_fail (GDK_IS_WINDOW (window));
1430 if (GDK_WINDOW_DESTROYED (window))
1433 _gdk_windowing_window_clear_area (window, x, y, width, height);
1435 gdk_window_invalidate_rect (window, &rect, TRUE);
1439 gdk_window_raise (GdkWindow *window)
1441 GdkWindowImplDirectFB *impl;
1443 g_return_if_fail (GDK_IS_WINDOW (window));
1445 if (GDK_WINDOW_DESTROYED (window))
1448 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1454 ret = impl->window->RaiseToTop (impl->window);
1456 DirectFBError ("gdkwindow-directfb.c: RaiseToTop", ret);
1458 gdk_directfb_window_raise (window);
1462 if (gdk_directfb_window_raise (window))
1463 gdk_window_invalidate_rect (window, NULL, TRUE);
1468 gdk_window_lower (GdkWindow *window)
1470 GdkWindowImplDirectFB *impl;
1472 g_return_if_fail (GDK_IS_WINDOW (window));
1474 if (GDK_WINDOW_DESTROYED (window))
1477 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1483 ret = impl->window->LowerToBottom (impl->window);
1485 DirectFBError ("gdkwindow-directfb.c: LowerToBottom", ret);
1487 gdk_directfb_window_lower (window);
1491 gdk_directfb_window_lower (window);
1492 gdk_window_invalidate_rect (window, NULL, TRUE);
1497 gdk_window_set_hints (GdkWindow *window,
1506 g_return_if_fail (GDK_IS_WINDOW (window));
1508 if (GDK_WINDOW_DESTROYED (window))
1515 gdk_window_set_geometry_hints (GdkWindow *window,
1516 GdkGeometry *geometry,
1517 GdkWindowHints geom_mask)
1519 g_return_if_fail (GDK_IS_WINDOW (window));
1521 if (GDK_WINDOW_DESTROYED (window))
1528 gdk_window_set_title (GdkWindow *window,
1531 g_return_if_fail (GDK_IS_WINDOW (window));
1533 if (GDK_WINDOW_DESTROYED (window))
1540 gdk_window_set_role (GdkWindow *window,
1543 g_return_if_fail (GDK_IS_WINDOW (window));
1545 if (GDK_WINDOW_DESTROYED (window))
1552 gdk_window_set_transient_for (GdkWindow *window,
1555 GdkWindowObject *private;
1556 GdkWindowObject *root;
1559 g_return_if_fail (GDK_IS_WINDOW (window));
1560 g_return_if_fail (GDK_IS_WINDOW (parent));
1562 private = GDK_WINDOW_OBJECT (window);
1563 root = GDK_WINDOW_OBJECT (_gdk_parent_root);
1565 g_return_if_fail (GDK_WINDOW (private->parent) == _gdk_parent_root);
1566 g_return_if_fail (GDK_WINDOW (GDK_WINDOW_OBJECT (parent)->parent) == _gdk_parent_root);
1568 root->children = g_list_remove (root->children, window);
1570 i = g_list_index (root->children, parent);
1572 root->children = g_list_prepend (root->children, window);
1574 root->children = g_list_insert (root->children, window, i);
1578 gdk_window_set_background (GdkWindow *window,
1579 const GdkColor *color)
1581 GdkWindowObject *private;
1583 g_return_if_fail (GDK_IS_WINDOW (window));
1585 g_return_if_fail (color != NULL);
1587 private = GDK_WINDOW_OBJECT (window);
1588 private->bg_color = *color;
1590 if (private->bg_pixmap &&
1591 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1592 private->bg_pixmap != GDK_NO_BG)
1593 g_object_unref (private->bg_pixmap);
1595 private->bg_pixmap = NULL;
1599 gdk_window_set_back_pixmap (GdkWindow *window,
1601 gint parent_relative)
1603 GdkWindowObject *private;
1604 GdkPixmap *old_pixmap;
1606 g_return_if_fail (GDK_IS_WINDOW (window));
1607 g_return_if_fail (pixmap == NULL || !parent_relative);
1609 private = GDK_WINDOW_OBJECT (window);
1610 old_pixmap = private->bg_pixmap;
1612 if (private->bg_pixmap &&
1613 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1614 private->bg_pixmap != GDK_NO_BG)
1616 g_object_unref (private->bg_pixmap);
1619 if (parent_relative)
1621 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1625 if (pixmap && pixmap != GDK_NO_BG && pixmap != GDK_PARENT_RELATIVE_BG)
1626 g_object_ref (pixmap);
1628 private->bg_pixmap = pixmap;
1633 gdk_window_set_cursor (GdkWindow *window,
1636 GdkWindowImplDirectFB *impl;
1637 GdkCursor *old_cursor;
1639 g_return_if_fail (GDK_IS_WINDOW (window));
1641 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1642 old_cursor = impl->cursor;
1644 impl->cursor = (cursor ?
1645 gdk_cursor_ref (cursor) : gdk_cursor_new (GDK_LEFT_PTR));
1647 if (gdk_window_at_pointer (NULL, NULL) == window)
1649 /* This is a bit evil but we want to keep all cursor changes in
1650 one place, so let gdk_directfb_window_send_crossing_events
1651 do the work for us. */
1653 gdk_directfb_window_send_crossing_events (window, window,
1654 GDK_CROSSING_NORMAL);
1656 else if (impl->window)
1658 GdkCursorDirectFB *dfb_cursor = (GdkCursorDirectFB *) impl->cursor;
1660 /* this branch takes care of setting the cursor for unmapped windows */
1662 impl->window->SetCursorShape (impl->window,
1664 dfb_cursor->hot_x, dfb_cursor->hot_y);
1668 gdk_cursor_unref (old_cursor);
1672 gdk_window_get_geometry (GdkWindow *window,
1679 GdkWindowObject *private;
1680 GdkDrawableImplDirectFB *impl;
1682 g_return_if_fail (GDK_IS_WINDOW (window));
1684 private = GDK_WINDOW_OBJECT (window);
1685 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1687 if (!GDK_WINDOW_DESTROYED (window))
1696 *width = impl->width;
1699 *height = impl->height;
1702 *depth = DFB_BITS_PER_PIXEL(impl->format);
1707 _gdk_directfb_calc_abs (GdkWindow *window)
1709 GdkWindowObject *private;
1710 GdkDrawableImplDirectFB *impl;
1713 g_return_if_fail (GDK_IS_WINDOW (window));
1715 private = GDK_WINDOW_OBJECT (window);
1716 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1718 impl->abs_x = private->x;
1719 impl->abs_y = private->y;
1721 if (private->parent)
1723 GdkDrawableImplDirectFB *parent_impl =
1724 GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (private->parent)->impl);
1726 impl->abs_x += parent_impl->abs_x;
1727 impl->abs_y += parent_impl->abs_y;
1730 for (list = private->children; list; list = list->next)
1732 _gdk_directfb_calc_abs (list->data);
1737 gdk_window_get_origin (GdkWindow *window,
1741 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
1743 if (!GDK_WINDOW_DESTROYED (window))
1745 GdkDrawableImplDirectFB *impl;
1747 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1761 gdk_window_get_deskrelative_origin (GdkWindow *window,
1765 return gdk_window_get_origin (window, x, y);
1769 gdk_window_get_root_origin (GdkWindow *window,
1773 GdkWindowObject *rover;
1775 g_return_if_fail (GDK_IS_WINDOW (window));
1777 rover = (GdkWindowObject*) window;
1783 if (GDK_WINDOW_DESTROYED (window))
1786 while (rover->parent && ((GdkWindowObject*) rover->parent)->parent)
1787 rover = (GdkWindowObject *) rover->parent;
1788 if (rover->destroyed)
1798 _gdk_windowing_window_get_pointer (GdkDisplay *display,
1802 GdkModifierType *mask)
1804 GdkWindow *retval = NULL;
1805 gint rx, ry, wx, wy;
1806 GdkDrawableImplDirectFB *impl;
1808 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1811 window = _gdk_parent_root;
1813 gdk_directfb_mouse_get_info (&rx, &ry, mask);
1817 retval = gdk_directfb_child_at (_gdk_parent_root, &wx, &wy);
1819 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1822 *x = rx - impl->abs_x;
1824 *y = ry - impl->abs_y;
1830 _gdk_windowing_window_at_pointer (GdkDisplay *display,
1837 if (!win_x || !win_y)
1838 gdk_directfb_mouse_get_info (&wx, &wy, NULL);
1846 retval = gdk_directfb_child_at (_gdk_parent_root, &wx, &wy);
1858 _gdk_windowing_get_pointer (GdkDisplay *display,
1862 GdkModifierType *mask)
1866 *screen = gdk_display_get_default_screen (display);
1868 _gdk_windowing_window_get_pointer (display,
1869 _gdk_windowing_window_at_pointer(display,NULL,NULL),x,y,mask);
1874 gdk_window_get_events (GdkWindow *window)
1876 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
1878 if (GDK_WINDOW_DESTROYED (window))
1881 return GDK_WINDOW_OBJECT (window)->event_mask;
1885 gdk_window_set_events (GdkWindow *window,
1886 GdkEventMask event_mask)
1888 g_return_if_fail (GDK_IS_WINDOW (window));
1890 if (event_mask & GDK_BUTTON_MOTION_MASK)
1891 event_mask |= (GDK_BUTTON1_MOTION_MASK |
1892 GDK_BUTTON2_MOTION_MASK |
1893 GDK_BUTTON3_MOTION_MASK);
1895 GDK_WINDOW_OBJECT (window)->event_mask = event_mask;
1899 gdk_window_shape_combine_mask (GdkWindow *window,
1907 gdk_window_input_shape_combine_mask (GdkWindow *window,
1915 gdk_window_shape_combine_region (GdkWindow *window,
1916 GdkRegion *shape_region,
1923 gdk_window_input_shape_combine_region (GdkWindow *window,
1924 GdkRegion *shape_region,
1931 gdk_window_set_override_redirect (GdkWindow *window,
1932 gboolean override_redirect)
1934 g_return_if_fail (GDK_IS_WINDOW (window));
1936 if (GDK_WINDOW_DESTROYED (window))
1943 gdk_window_set_icon_list (GdkWindow *window,
1946 g_return_if_fail (GDK_IS_WINDOW (window));
1948 if (GDK_WINDOW_DESTROYED (window))
1955 gdk_window_set_icon (GdkWindow *window,
1956 GdkWindow *icon_window,
1960 g_return_if_fail (GDK_IS_WINDOW (window));
1962 if (GDK_WINDOW_DESTROYED (window))
1969 gdk_window_set_icon_name (GdkWindow *window,
1972 g_return_if_fail (GDK_IS_WINDOW (window));
1974 if (GDK_WINDOW_DESTROYED (window))
1981 gdk_window_iconify (GdkWindow *window)
1983 g_return_if_fail (GDK_IS_WINDOW (window));
1985 if (GDK_WINDOW_DESTROYED (window))
1988 gdk_window_hide (window);
1992 gdk_window_deiconify (GdkWindow *window)
1994 g_return_if_fail (GDK_IS_WINDOW (window));
1996 if (GDK_WINDOW_DESTROYED (window))
1999 gdk_window_show (window);
2003 gdk_window_stick (GdkWindow *window)
2005 g_return_if_fail (GDK_IS_WINDOW (window));
2007 if (GDK_WINDOW_DESTROYED (window))
2014 gdk_window_unstick (GdkWindow *window)
2016 g_return_if_fail (GDK_IS_WINDOW (window));
2018 if (GDK_WINDOW_DESTROYED (window))
2025 gdk_directfb_window_set_opacity (GdkWindow *window,
2028 GdkWindowImplDirectFB *impl;
2030 g_return_if_fail (GDK_IS_WINDOW (window));
2032 if (GDK_WINDOW_DESTROYED (window))
2035 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2037 impl->opacity = opacity;
2039 if (impl->window && GDK_WINDOW_IS_MAPPED (window))
2041 if (gdk_directfb_apply_focus_opacity &&
2042 window == gdk_directfb_focused_window)
2043 impl->window->SetOpacity (impl->window,
2044 (impl->opacity >> 1) + (impl->opacity >> 2));
2046 impl->window->SetOpacity (impl->window, impl->opacity);
2051 gdk_window_focus (GdkWindow *window,
2054 GdkWindow *toplevel;
2056 g_return_if_fail (GDK_IS_WINDOW (window));
2058 if (GDK_WINDOW_DESTROYED (window))
2061 toplevel = gdk_directfb_window_find_toplevel (window);
2062 if (toplevel != _gdk_parent_root)
2064 GdkWindowImplDirectFB *impl;
2066 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (toplevel)->impl);
2068 impl->window->RequestFocus (impl->window);
2073 gdk_window_maximize (GdkWindow *window)
2075 g_return_if_fail (GDK_IS_WINDOW (window));
2077 if (GDK_WINDOW_DESTROYED (window))
2084 gdk_window_unmaximize (GdkWindow *window)
2086 g_return_if_fail (GDK_IS_WINDOW (window));
2088 if (GDK_WINDOW_DESTROYED (window))
2095 gdk_window_set_type_hint (GdkWindow *window,
2096 GdkWindowTypeHint hint)
2098 g_return_if_fail (GDK_IS_WINDOW (window));
2100 if (GDK_WINDOW_DESTROYED (window))
2103 GDK_NOTE (MISC, g_print ("gdk_window_set_type_hint: 0x%x: %d\n",
2104 GDK_WINDOW_DFB_ID (window), hint));
2106 ((GdkWindowImplDirectFB *)((GdkWindowObject *)window)->impl)->type_hint = hint;
2113 gdk_window_get_type_hint (GdkWindow *window)
2115 g_return_val_if_fail (GDK_IS_WINDOW (window), GDK_WINDOW_TYPE_HINT_NORMAL);
2117 if (GDK_WINDOW_DESTROYED (window))
2118 return GDK_WINDOW_TYPE_HINT_NORMAL;
2120 return GDK_WINDOW_IMPL_DIRECTFB (((GdkWindowObject *) window)->impl)->type_hint;
2124 gdk_window_set_modal_hint (GdkWindow *window,
2127 GdkWindowImplDirectFB *impl;
2129 g_return_if_fail (GDK_IS_WINDOW (window));
2131 if (GDK_WINDOW_DESTROYED (window))
2134 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2138 impl->window->SetStackingClass (impl->window,
2139 modal ? DWSC_UPPER : DWSC_MIDDLE);
2144 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
2145 gboolean skips_taskbar)
2147 g_return_if_fail (GDK_IS_WINDOW (window));
2151 gdk_window_set_skip_pager_hint (GdkWindow *window,
2152 gboolean skips_pager)
2154 g_return_if_fail (GDK_IS_WINDOW (window));
2159 gdk_window_set_group (GdkWindow *window,
2162 g_return_if_fail (GDK_IS_WINDOW (window));
2163 g_return_if_fail (GDK_IS_WINDOW (leader));
2164 g_warning(" DirectFb set_group groups not supported \n");
2166 if (GDK_WINDOW_DESTROYED (window))
2172 GdkWindow * gdk_window_get_group (GdkWindow *window)
2174 g_warning(" DirectFb get_group groups not supported \n");
2179 gdk_fb_window_set_child_handler (GdkWindow *window,
2180 GdkWindowChildChanged changed,
2181 GdkWindowChildGetPos get_pos,
2184 GdkWindowChildHandlerData *data;
2186 g_return_if_fail (GDK_IS_WINDOW (window));
2188 data = g_new (GdkWindowChildHandlerData, 1);
2189 data->changed = changed;
2190 data->get_pos = get_pos;
2191 data->user_data = user_data;
2193 g_object_set_data_full (G_OBJECT (window), "gdk-window-child-handler",
2194 data, (GDestroyNotify) g_free);
2198 gdk_window_set_decorations (GdkWindow *window,
2199 GdkWMDecoration decorations)
2201 GdkWMDecoration *dec;
2203 g_return_if_fail (GDK_IS_WINDOW (window));
2205 dec = g_new (GdkWMDecoration, 1);
2208 g_object_set_data_full (G_OBJECT (window), "gdk-window-decorations",
2209 dec, (GDestroyNotify) g_free);
2213 gdk_window_get_decorations (GdkWindow *window,
2214 GdkWMDecoration *decorations)
2216 GdkWMDecoration *dec;
2218 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2220 dec = g_object_get_data (G_OBJECT (window), "gdk-window-decorations");
2223 *decorations = *dec;
2230 gdk_window_set_functions (GdkWindow *window,
2231 GdkWMFunction functions)
2233 g_return_if_fail (GDK_IS_WINDOW (window));
2235 if (GDK_WINDOW_DESTROYED (window))
2239 g_message("unimplemented %s", G_GNUC_FUNCTION);
2243 gdk_window_set_child_shapes (GdkWindow *window)
2248 gdk_window_merge_child_shapes (GdkWindow *window)
2253 gdk_window_set_child_input_shapes (GdkWindow *window)
2258 gdk_window_merge_child_input_shapes (GdkWindow *window)
2263 gdk_window_set_static_gravities (GdkWindow *window,
2264 gboolean use_static)
2266 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2268 if (GDK_WINDOW_DESTROYED (window))
2272 g_message("unimplemented %s", G_GNUC_FUNCTION);
2278 gdk_window_begin_paint_region (GdkWindow *window,
2281 GdkDrawableImplDirectFB *impl;
2284 g_return_if_fail (GDK_IS_WINDOW (window));
2286 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2288 impl->buffered = TRUE;
2289 impl->paint_depth++;
2294 if (impl->paint_region)
2295 gdk_region_union (impl->paint_region, region);
2297 impl->paint_region = gdk_region_copy (region);
2299 for (i = 0; i < region->numRects; i++)
2301 GdkRegionBox *box = ®ion->rects[i];
2303 _gdk_windowing_window_clear_area (window,
2312 gdk_window_end_paint (GdkWindow *window)
2314 GdkDrawableImplDirectFB *impl;
2316 g_return_if_fail (GDK_IS_WINDOW (window));
2318 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2320 g_return_if_fail (impl->paint_depth > 0);
2322 impl->paint_depth--;
2324 if (impl->paint_depth == 0)
2326 impl->buffered = FALSE;
2328 if (impl->paint_region)
2330 DFBRegion reg = { impl->paint_region->extents.x1,
2331 impl->paint_region->extents.y1,
2332 impl->paint_region->extents.x2 - 1,
2333 impl->paint_region->extents.y2 - 1 };
2335 _gdk_directfb_update (impl, ®);
2337 gdk_region_destroy (impl->paint_region);
2338 impl->paint_region = NULL;
2345 gdk_window_begin_resize_drag (GdkWindow *window,
2352 g_return_if_fail (GDK_IS_WINDOW (window));
2354 if (GDK_WINDOW_DESTROYED (window))
2357 g_message("unimplemented %s", G_GNUC_FUNCTION);
2361 gdk_window_begin_move_drag (GdkWindow *window,
2367 g_return_if_fail (GDK_IS_WINDOW (window));
2369 if (GDK_WINDOW_DESTROYED (window))
2372 g_message("unimplemented %s", G_GNUC_FUNCTION);
2376 * gdk_window_get_frame_extents:
2377 * @window: a #GdkWindow
2378 * @rect: rectangle to fill with bounding box of the window frame
2380 * Obtains the bounding box of the window, including window manager
2381 * titlebar/borders if any. The frame position is given in root window
2382 * coordinates. To get the position of the window itself (rather than
2383 * the frame) in root window coordinates, use gdk_window_get_origin().
2387 gdk_window_get_frame_extents (GdkWindow *window,
2390 GdkWindowObject *private;
2391 GdkDrawableImplDirectFB *impl;
2393 g_return_if_fail (GDK_IS_WINDOW (window));
2394 g_return_if_fail (rect != NULL);
2396 if (GDK_WINDOW_DESTROYED (window))
2399 private = GDK_WINDOW_OBJECT (window);
2401 while (private->parent && ((GdkWindowObject*) private->parent)->parent)
2402 private = (GdkWindowObject*) private->parent;
2403 if (GDK_WINDOW_DESTROYED (window))
2406 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
2408 rect->x = impl->abs_x;
2409 rect->y = impl->abs_x;
2410 rect->width = impl->width;
2411 rect->height = impl->height;
2417 gdk_window_foreign_new_for_display (GdkDisplay* display,GdkNativeWindow anid)
2421 window = gdk_window_lookup (anid);
2424 g_object_ref (window);
2430 gdk_window_lookup_for_display (GdkDisplay *display,GdkNativeWindow anid)
2432 return gdk_directfb_window_id_table_lookup ((DFBWindowID) anid);
2436 gdk_window_lookup (GdkNativeWindow anid)
2438 return gdk_directfb_window_id_table_lookup ((DFBWindowID) anid);
2444 gdk_window_fullscreen (GdkWindow *window)
2446 g_return_if_fail (GDK_IS_WINDOW (window));
2448 g_warning ("gdk_window_fullscreen() not implemented.\n");
2452 gdk_window_unfullscreen (GdkWindow *window)
2454 g_return_if_fail (GDK_IS_WINDOW (window));
2456 /* g_warning ("gdk_window_unfullscreen() not implemented.\n");*/
2460 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
2462 g_return_if_fail (GDK_IS_WINDOW (window));
2463 static gboolean first_call = TRUE;
2465 g_warning ("gdk_window_set_keep_above() not implemented.\n");
2472 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
2474 g_return_if_fail (GDK_IS_WINDOW (window));
2475 static gboolean first_call = TRUE;
2477 g_warning ("gdk_window_set_keep_below() not implemented.\n");
2484 gdk_window_enable_synchronized_configure (GdkWindow *window)
2489 gdk_window_configure_finished (GdkWindow *window)
2494 gdk_display_warp_pointer (GdkDisplay *display,
2499 g_warning ("gdk_display_warp_pointer() not implemented.\n");
2503 gdk_window_set_urgency_hint (GdkWindow *window,
2506 g_return_if_fail (GDK_IS_WINDOW (window));
2507 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD);
2509 if (GDK_WINDOW_DESTROYED (window))
2512 g_warning ("gdk_window_set_urgency_hint() not implemented.\n");
2517 #define __GDK_WINDOW_X11_C__
2518 #include "gdkaliasdef.c"