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 "gdkwindowimpl.h"
37 #include "gdkwindow.h"
39 #include "gdkdirectfb.h"
40 #include "gdkprivate-directfb.h"
41 #include "gdkdisplay-directfb.h"
43 #include "gdkregion-generic.h"
45 #include "gdkinternals.h"
50 #include <direct/debug.h>
52 #include <directfb_util.h>
54 D_DEBUG_DOMAIN( GDKDFB_Crossing, "GDKDFB/Crossing", "GDK DirectFB Crossing Events" );
55 D_DEBUG_DOMAIN( GDKDFB_Updates, "GDKDFB/Updates", "GDK DirectFB Updates" );
56 D_DEBUG_DOMAIN( GDKDFB_Paintable, "GDKDFB/Paintable", "GDK DirectFB Paintable" );
57 D_DEBUG_DOMAIN( GDKDFB_Window, "GDKDFB/Window", "GDK DirectFB Window" );
60 static GdkRegion * gdk_window_impl_directfb_get_visible_region (GdkDrawable *drawable);
61 static void gdk_window_impl_directfb_set_colormap (GdkDrawable *drawable,
62 GdkColormap *colormap);
63 static void gdk_window_impl_directfb_init (GdkWindowImplDirectFB *window);
64 static void gdk_window_impl_directfb_class_init (GdkWindowImplDirectFBClass *klass);
65 static void gdk_window_impl_directfb_finalize (GObject *object);
67 static void gdk_window_impl_iface_init (GdkWindowImplIface *iface);
68 static void gdk_directfb_window_destroy (GdkWindow *window,
70 gboolean foreign_destroy);
74 GdkWindowChildChanged changed;
75 GdkWindowChildGetPos get_pos;
77 } GdkWindowChildHandlerData;
80 static GdkWindow *gdk_directfb_window_containing_pointer = NULL;
81 static GdkWindow *gdk_directfb_focused_window = NULL;
82 static gpointer parent_class = NULL;
83 GdkWindow * _gdk_parent_root = NULL;
85 static void gdk_window_impl_directfb_paintable_init (GdkPaintableIface *iface);
89 gdk_window_impl_directfb_get_type (void)
91 static GType object_type = 0;
95 const GTypeInfo object_info =
97 sizeof (GdkWindowImplDirectFBClass),
99 (GBaseFinalizeFunc) NULL,
100 (GClassInitFunc) gdk_window_impl_directfb_class_init,
101 NULL, /* class_finalize */
102 NULL, /* class_data */
103 sizeof (GdkWindowImplDirectFB),
105 (GInstanceInitFunc) gdk_window_impl_directfb_init,
108 const GInterfaceInfo paintable_info =
110 (GInterfaceInitFunc) gdk_window_impl_directfb_paintable_init,
115 const GInterfaceInfo window_impl_info =
117 (GInterfaceInitFunc) gdk_window_impl_iface_init,
122 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_DIRECTFB,
123 "GdkWindowImplDirectFB",
125 g_type_add_interface_static (object_type,
129 g_type_add_interface_static (object_type,
130 GDK_TYPE_WINDOW_IMPL,
138 _gdk_window_impl_get_type (void)
140 return gdk_window_impl_directfb_get_type ();
144 gdk_window_impl_directfb_init (GdkWindowImplDirectFB *impl)
146 impl->drawable.width = 1;
147 impl->drawable.height = 1;
148 //cannot use gdk_cursor_new here since gdk_display_get_default
150 impl->cursor = gdk_cursor_new_for_display (GDK_DISPLAY_OBJECT(_gdk_display),GDK_LEFT_PTR);
155 gdk_window_impl_directfb_class_init (GdkWindowImplDirectFBClass *klass)
157 GObjectClass *object_class = G_OBJECT_CLASS (klass);
158 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
160 parent_class = g_type_class_peek_parent (klass);
162 object_class->finalize = gdk_window_impl_directfb_finalize;
164 drawable_class->set_colormap = gdk_window_impl_directfb_set_colormap;
166 /* Visible and clip regions are the same */
168 drawable_class->get_clip_region =
169 gdk_window_impl_directfb_get_visible_region;
171 drawable_class->get_visible_region =
172 gdk_window_impl_directfb_get_visible_region;
176 g_free_2nd (gpointer a,
184 gdk_window_impl_directfb_finalize (GObject *object)
186 GdkWindowImplDirectFB *impl = GDK_WINDOW_IMPL_DIRECTFB (object);
188 D_DEBUG_AT( GDKDFB_Window, "%s( %p ) <- %dx%d\n", G_STRFUNC, impl, impl->drawable.width, impl->drawable.height );
190 if (GDK_WINDOW_IS_MAPPED (impl->drawable.wrapper))
191 gdk_window_hide (impl->drawable.wrapper);
194 gdk_cursor_unref (impl->cursor);
196 if (impl->properties)
198 g_hash_table_foreach (impl->properties, g_free_2nd, NULL);
199 g_hash_table_destroy (impl->properties);
203 gdk_directfb_window_id_table_remove (impl->dfb_id);
204 /* native window resource must be release before we can finalize !*/
208 if (G_OBJECT_CLASS (parent_class)->finalize)
209 G_OBJECT_CLASS (parent_class)->finalize (object);
213 gdk_window_impl_directfb_get_visible_region (GdkDrawable *drawable)
215 GdkDrawableImplDirectFB *priv = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
216 GdkRectangle rect = { 0, 0, 0, 0 };
217 DFBRectangle drect = { 0, 0, 0, 0 };
219 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", G_STRFUNC, drawable );
222 priv->surface->GetVisibleRectangle (priv->surface, &drect);
228 D_DEBUG_AT( GDKDFB_Window, " -> returning %4d,%4d-%4dx%4d\n", drect.x, drect.y, drect.w, drect.h );
230 return gdk_region_rectangle (&rect);
234 gdk_window_impl_directfb_set_colormap (GdkDrawable *drawable,
235 GdkColormap *colormap)
237 GDK_DRAWABLE_CLASS (parent_class)->set_colormap (drawable, colormap);
241 GdkDrawableImplDirectFB *priv = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
245 IDirectFBPalette *palette = gdk_directfb_colormap_get_palette (colormap);
248 priv->surface->SetPalette (priv->surface, palette);
255 create_directfb_window (GdkWindowImplDirectFB *impl,
256 DFBWindowDescription *desc,
257 DFBWindowOptions window_options)
260 IDirectFBWindow *window;
262 D_DEBUG_AT( GDKDFB_Window, "%s( %4dx%4d, caps 0x%08x )\n", G_STRFUNC, desc->width, desc->height, desc->caps );
264 ret = _gdk_display->layer->CreateWindow (_gdk_display->layer, desc, &window);
268 DirectFBError ("gdk_window_new: Layer->CreateWindow failed", ret);
273 if ((desc->flags & DWDESC_CAPS) && (desc->caps & DWCAPS_INPUTONLY))
275 impl->drawable.surface = NULL;
277 window->GetSurface (window, &impl->drawable.surface);
281 DFBWindowOptions options;
282 window->GetOptions (window, &options);
283 window->SetOptions (window, options | window_options);
286 impl->window = window;
288 #ifndef GDK_DIRECTFB_NO_EXPERIMENTS
289 //direct_log_printf( NULL, "Initializing (window %p, wimpl %p)\n", win, impl );
291 dfb_updates_init( &impl->flips, impl->flip_regions, G_N_ELEMENTS(impl->flip_regions) );
298 _gdk_windowing_window_init (void)
300 GdkWindowObject *private;
301 GdkWindowImplDirectFB *impl;
302 DFBDisplayLayerConfig dlc;
304 g_assert (_gdk_parent_root == NULL);
306 _gdk_display->layer->GetConfiguration (_gdk_display->layer, &dlc);
308 _gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL);
310 private = GDK_WINDOW_OBJECT (_gdk_parent_root);
311 private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
312 private->impl_window = private;
314 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
316 private->window_type = GDK_WINDOW_ROOT;
318 private->children = NULL;
319 private->viewable = TRUE;
320 // impl->drawable.paint_region = NULL;
321 impl->gdkWindow = _gdk_parent_root;
323 impl->drawable.abs_x = 0;
324 impl->drawable.abs_y = 0;
325 impl->drawable.width = dlc.width;
326 impl->drawable.height = dlc.height;
327 impl->drawable.wrapper = GDK_DRAWABLE (private);
328 /* custom root window init */
330 DFBWindowDescription desc;
332 /*XXX I must do this now its a bug ALPHA ROOT*/
334 desc.flags = DWDESC_CAPS;
336 desc.caps |= DWCAPS_NODECORATION;
337 desc.caps |= DWCAPS_ALPHACHANNEL;
338 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
339 DWDESC_POSX | DWDESC_POSY );
342 desc.width = dlc.width;
343 desc.height = dlc.height;
344 create_directfb_window (impl,&desc,0);
345 g_assert(impl->window != NULL);
346 g_assert(impl->drawable.surface != NULL );
348 impl->drawable.surface->GetPixelFormat(impl->drawable.surface,&impl->drawable.format);
349 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
351 _gdk_window_update_size (_gdk_parent_root);
354 Now we can set up the system colormap
356 gdk_drawable_set_colormap (GDK_DRAWABLE (_gdk_parent_root),gdk_colormap_get_system());
360 _gdk_window_impl_new (GdkWindow *window,
361 GdkWindow *real_parent,
364 GdkEventMask event_mask,
365 GdkWindowAttr *attributes,
366 gint attributes_mask)
368 GdkWindowObject *private;
369 GdkWindowObject *parent_private;
370 GdkWindowImplDirectFB *impl;
371 GdkWindowImplDirectFB *parent_impl;
372 DFBWindowDescription desc;
374 impl = g_object_new (_gdk_window_impl_get_type (), NULL);
375 impl->drawable.wrapper = GDK_DRAWABLE (window);
376 impl->gdkWindow = window;
378 private = GDK_WINDOW_OBJECT (window);
379 private->impl = (GdkDrawable *)impl;
381 private->x = (attributes_mask & GDK_WA_X) ? attributes->x : 0;
382 private->y = (attributes_mask & GDK_WA_Y) ? attributes->y : 0;
384 parent_private = GDK_WINDOW_OBJECT (real_parent);
385 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
387 private->parent = parent_private;
389 _gdk_directfb_calc_abs (window);
391 impl->drawable.width = MAX (1, attributes->width);
392 impl->drawable.height = MAX (1, attributes->height);
394 private->window_type = attributes->window_type;
398 switch (attributes->wclass)
400 case GDK_INPUT_OUTPUT:
401 private->input_only = FALSE;
403 desc.flags |= DWDESC_PIXELFORMAT;
404 desc.pixelformat = ((GdkVisualDirectFB *)visual)->format;
406 if (DFB_PIXELFORMAT_HAS_ALPHA (desc.pixelformat))
408 desc.flags |= DWDESC_CAPS;
409 desc.caps = DWCAPS_ALPHACHANNEL;
415 private->input_only = TRUE;
416 desc.flags |= DWDESC_CAPS;
417 desc.caps = DWCAPS_INPUTONLY;
421 g_warning ("_gdk_window_impl_new: unsupported window class\n");
422 _gdk_window_destroy (window, FALSE);
426 switch (private->window_type)
428 case GDK_WINDOW_TOPLEVEL:
429 case GDK_WINDOW_DIALOG:
430 case GDK_WINDOW_TEMP:
431 desc.flags |= (DWDESC_WIDTH | DWDESC_HEIGHT |
432 DWDESC_POSX | DWDESC_POSY);
433 desc.posx = private->x;
434 desc.posy = private->y;
435 desc.width = impl->drawable.width;
436 desc.height = impl->drawable.height;
438 if (!create_directfb_window (impl, &desc, DWOP_NONE))
441 _gdk_window_destroy (window, FALSE);
446 if (desc.caps != DWCAPS_INPUTONLY)
448 impl->window->SetOpacity (impl->window, 0x00);
453 case GDK_WINDOW_CHILD:
456 if (!private->input_only && parent_impl->drawable.surface)
458 DFBRectangle rect = { private->x,
460 impl->drawable.width,
461 impl->drawable.height };
462 parent_impl->drawable.surface->GetSubSurface (parent_impl->drawable.surface,
464 &impl->drawable.surface);
470 g_warning ("_gdk_window_impl_new: unsupported window type: %d",
471 private->window_type);
472 _gdk_window_destroy (window, FALSE);
477 if (impl->drawable.surface)
479 GdkColormap *colormap;
481 impl->drawable.surface->GetPixelFormat (impl->drawable.surface,
482 &impl->drawable.format);
484 private->depth = DFB_BITS_PER_PIXEL (impl->drawable.format);
486 if ((attributes_mask & GDK_WA_COLORMAP) && attributes->colormap)
488 colormap = attributes->colormap;
492 if (gdk_visual_get_system () == visual)
493 colormap = gdk_colormap_get_system ();
495 colormap = gdk_colormap_new (visual, FALSE);
498 gdk_drawable_set_colormap (GDK_DRAWABLE (window), colormap);
502 impl->drawable.format = ((GdkVisualDirectFB *)visual)->format;
503 private->depth = visual->depth;
506 gdk_window_set_cursor (window,
507 ((attributes_mask & GDK_WA_CURSOR) ?
508 (attributes->cursor) : NULL));
511 parent_private->children = g_list_prepend (parent_private->children,
514 /* we hold a reference count on ourself */
515 g_object_ref (window);
519 impl->window->GetID (impl->window, &impl->dfb_id);
520 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
521 gdk_directfb_event_windows_add (window);
524 if (attributes_mask & GDK_WA_TYPE_HINT)
525 gdk_window_set_type_hint (window, attributes->type_hint);
529 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
531 /* It's somebody else's window, but in our hierarchy,
532 * so reparent it to the root window, and then send
533 * it a delete event, as if we were a WM
535 gdk_directfb_window_destroy (window, TRUE, TRUE);
539 gdk_directfb_window_destroy (GdkWindow *window,
541 gboolean foreign_destroy)
543 GdkWindowObject *private;
544 GdkWindowImplDirectFB *impl;
546 g_return_if_fail (GDK_IS_WINDOW (window));
548 D_DEBUG_AT( GDKDFB_Window, "%s( %p, %srecursing, %sforeign )\n", G_STRFUNC, window,
549 recursing ? "" : "not ", foreign_destroy ? "" : "no " );
551 private = GDK_WINDOW_OBJECT (window);
552 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
554 _gdk_selection_window_destroyed (window);
555 gdk_directfb_event_windows_remove (window);
557 if (window == _gdk_directfb_pointer_grab_window)
558 gdk_pointer_ungrab (GDK_CURRENT_TIME);
559 if (window == _gdk_directfb_keyboard_grab_window)
560 gdk_keyboard_ungrab (GDK_CURRENT_TIME);
562 if (window == gdk_directfb_focused_window)
563 gdk_directfb_change_focus (NULL);
565 if (impl->drawable.surface) {
566 GdkDrawableImplDirectFB *dimpl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
567 if(dimpl->cairo_surface) {
568 cairo_surface_destroy(dimpl->cairo_surface);
569 dimpl->cairo_surface= NULL;
571 impl->drawable.surface->Release (impl->drawable.surface);
572 impl->drawable.surface = NULL;
575 if (!recursing && !foreign_destroy && impl->window ) {
576 impl->window->SetOpacity (impl->window,0);
577 impl->window->Close(impl->window);
578 impl->window->Release(impl->window);
583 /* This function is called when the window is really gone.
586 gdk_window_destroy_notify (GdkWindow *window)
588 g_return_if_fail (GDK_IS_WINDOW (window));
590 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", G_STRFUNC, window );
592 if (!GDK_WINDOW_DESTROYED (window))
594 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
595 g_warning ("GdkWindow %p unexpectedly destroyed", window);
597 _gdk_window_destroy (window, TRUE);
599 g_object_unref (window);
602 /* Focus follows pointer */
604 gdk_directfb_window_find_toplevel (GdkWindow *window)
606 while (window && window != _gdk_parent_root)
608 GdkWindow *parent = (GdkWindow *) (GDK_WINDOW_OBJECT (window))->parent;
610 if ((parent == _gdk_parent_root) && GDK_WINDOW_IS_MAPPED (window))
616 return _gdk_parent_root;
620 gdk_directfb_window_find_focus (void)
622 if (_gdk_directfb_keyboard_grab_window)
623 return _gdk_directfb_keyboard_grab_window;
625 if (!gdk_directfb_focused_window)
626 gdk_directfb_focused_window = g_object_ref (_gdk_parent_root);
628 return gdk_directfb_focused_window;
632 gdk_directfb_change_focus (GdkWindow *new_focus_window)
634 GdkEventFocus *event;
637 GdkWindow *event_win;
639 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", G_STRFUNC, new_focus_window );
641 /* No focus changes while the pointer is grabbed */
642 if (_gdk_directfb_pointer_grab_window)
645 old_win = gdk_directfb_focused_window;
646 new_win = gdk_directfb_window_find_toplevel (new_focus_window);
648 if (old_win == new_win)
653 event_win = gdk_directfb_keyboard_event_window (old_win,
657 event = (GdkEventFocus *) gdk_directfb_event_make (event_win,
663 event_win = gdk_directfb_keyboard_event_window (new_win,
667 event = (GdkEventFocus *) gdk_directfb_event_make (event_win,
672 if (gdk_directfb_focused_window)
673 g_object_unref (gdk_directfb_focused_window);
674 gdk_directfb_focused_window = g_object_ref (new_win);
678 gdk_window_set_accept_focus (GdkWindow *window,
679 gboolean accept_focus)
681 GdkWindowObject *private;
682 g_return_if_fail (window != NULL);
683 g_return_if_fail (GDK_IS_WINDOW (window));
685 private = (GdkWindowObject *)window;
687 accept_focus = accept_focus != FALSE;
689 if (private->accept_focus != accept_focus)
690 private->accept_focus = accept_focus;
695 gdk_window_set_focus_on_map (GdkWindow *window,
696 gboolean focus_on_map)
698 GdkWindowObject *private;
699 g_return_if_fail (window != NULL);
700 g_return_if_fail (GDK_IS_WINDOW (window));
702 private = (GdkWindowObject *)window;
704 focus_on_map = focus_on_map != FALSE;
706 if (private->focus_on_map != focus_on_map)
707 private->focus_on_map = focus_on_map;
711 gdk_directfb_window_raise (GdkWindow *window)
713 GdkWindowObject *parent;
715 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", G_STRFUNC, window );
717 parent = GDK_WINDOW_OBJECT (window)->parent;
719 if (parent->children->data == window)
722 parent->children = g_list_remove (parent->children, window);
723 parent->children = g_list_prepend (parent->children, window);
729 gdk_directfb_window_lower (GdkWindow *window)
731 GdkWindowObject *parent;
733 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", G_STRFUNC, window );
735 parent = GDK_WINDOW_OBJECT (window)->parent;
737 parent->children = g_list_remove (parent->children, window);
738 parent->children = g_list_append (parent->children, window);
742 all_parents_shown (GdkWindowObject *private)
744 while (GDK_WINDOW_IS_MAPPED (private))
747 private = GDK_WINDOW_OBJECT (private)->parent;
756 send_map_events (GdkWindowObject *private)
759 GdkWindow *event_win;
761 if (!GDK_WINDOW_IS_MAPPED (private))
764 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", G_STRFUNC, private );
766 event_win = gdk_directfb_other_event_window ((GdkWindow *) private, GDK_MAP);
768 gdk_directfb_event_make (event_win, GDK_MAP);
770 for (list = private->children; list; list = list->next)
771 send_map_events (list->data);
775 gdk_directfb_find_common_ancestor (GdkWindow *win1,
781 for (a = GDK_WINDOW_OBJECT (win1); a; a = a->parent)
782 for (b = GDK_WINDOW_OBJECT (win2); b; b = b->parent)
785 return GDK_WINDOW (a);
792 gdk_directfb_window_send_crossing_events (GdkWindow *src,
794 GdkCrossingMode mode)
797 GdkWindow *win, *last, *next;
799 gint x, y, x_int, y_int;
800 GdkModifierType modifiers;
805 GdkWindow *event_win;
807 D_DEBUG_AT( GDKDFB_Crossing, "%s( %p -> %p, %d )\n", G_STRFUNC, src, dest, mode );
809 /* Do a possible cursor change before checking if we need to
810 generate crossing events so cursor changes due to pointer
811 grabs work correctly. */
813 static GdkCursorDirectFB *last_cursor = NULL;
815 GdkWindowObject *private = GDK_WINDOW_OBJECT (dest);
816 GdkWindowImplDirectFB *impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
817 GdkCursorDirectFB *cursor;
819 if (_gdk_directfb_pointer_grab_cursor)
820 cursor = (GdkCursorDirectFB*) _gdk_directfb_pointer_grab_cursor;
822 cursor = (GdkCursorDirectFB*) impl->cursor;
824 if (cursor != last_cursor)
826 win = gdk_directfb_window_find_toplevel (dest);
827 private = GDK_WINDOW_OBJECT (win);
828 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
831 impl->window->SetCursorShape (impl->window,
833 cursor->hot_x, cursor->hot_y);
834 last_cursor = cursor;
838 if (dest == gdk_directfb_window_containing_pointer) {
839 D_DEBUG_AT( GDKDFB_Crossing, " -> already containing the pointer\n" );
843 if (gdk_directfb_window_containing_pointer == NULL)
844 gdk_directfb_window_containing_pointer = g_object_ref (_gdk_parent_root);
849 a = gdk_directfb_window_containing_pointer;
854 D_DEBUG_AT( GDKDFB_Crossing, " -> src == dest\n" );
858 /* gdk_directfb_window_containing_pointer might have been destroyed.
859 * The refcount we hold on it should keep it, but it's parents
862 if (GDK_WINDOW_DESTROYED (a)) {
863 D_DEBUG_AT( GDKDFB_Crossing, " -> src is destroyed!\n" );
864 a = _gdk_parent_root;
867 gdk_directfb_mouse_get_info (&x, &y, &modifiers);
869 c = gdk_directfb_find_common_ancestor (a, b);
871 D_DEBUG_AT( GDKDFB_Crossing, " -> common ancestor %p\n", c );
873 non_linear = (c != a) && (c != b);
875 D_DEBUG_AT( GDKDFB_Crossing, " -> non_linear: %s\n", non_linear ? "YES" : "NO" );
877 event_win = gdk_directfb_pointer_event_window (a, GDK_LEAVE_NOTIFY);
880 D_DEBUG_AT( GDKDFB_Crossing, " -> sending LEAVE to src\n" );
882 event = gdk_directfb_event_make (event_win, GDK_LEAVE_NOTIFY);
883 event->crossing.subwindow = NULL;
885 gdk_window_get_origin (a, &x_int, &y_int);
887 event->crossing.x = x - x_int;
888 event->crossing.y = y - y_int;
889 event->crossing.x_root = x;
890 event->crossing.y_root = y;
891 event->crossing.mode = mode;
894 event->crossing.detail = GDK_NOTIFY_NONLINEAR;
896 event->crossing.detail = GDK_NOTIFY_INFERIOR;
898 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
900 event->crossing.focus = FALSE;
901 event->crossing.state = modifiers;
903 D_DEBUG_AT( GDKDFB_Crossing, " => LEAVE (%p/%p) at %4f,%4f (%4f,%4f) mode %d, detail %d\n",
905 event->crossing.x, event->crossing.y, event->crossing.x_root, event->crossing.y_root,
906 event->crossing.mode, event->crossing.detail );
909 /* Traverse up from a to (excluding) c */
913 win = GDK_WINDOW (GDK_WINDOW_OBJECT (a)->parent);
917 gdk_directfb_pointer_event_window (win, GDK_LEAVE_NOTIFY);
921 event = gdk_directfb_event_make (event_win, GDK_LEAVE_NOTIFY);
923 event->crossing.subwindow = g_object_ref (last);
925 gdk_window_get_origin (win, &x_int, &y_int);
927 event->crossing.x = x - x_int;
928 event->crossing.y = y - y_int;
929 event->crossing.x_root = x;
930 event->crossing.y_root = y;
931 event->crossing.mode = mode;
934 event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
936 event->crossing.detail = GDK_NOTIFY_VIRTUAL;
938 event->crossing.focus = FALSE;
939 event->crossing.state = modifiers;
941 D_DEBUG_AT( GDKDFB_Crossing, " -> LEAVE (%p/%p) at %4f,%4f (%4f,%4f) mode %d, detail %d\n",
943 event->crossing.x, event->crossing.y, event->crossing.x_root, event->crossing.y_root,
944 event->crossing.mode, event->crossing.detail );
948 win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent);
952 /* Traverse down from c to b */
956 win = GDK_WINDOW (GDK_WINDOW_OBJECT (b)->parent);
959 path = g_slist_prepend (path, win);
960 win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent);
966 win = GDK_WINDOW (list->data);
967 list = g_slist_next (list);
970 next = GDK_WINDOW (list->data);
975 gdk_directfb_pointer_event_window (win, GDK_ENTER_NOTIFY);
979 event = gdk_directfb_event_make (event_win, GDK_ENTER_NOTIFY);
981 event->crossing.subwindow = g_object_ref (next);
983 gdk_window_get_origin (win, &x_int, &y_int);
985 event->crossing.x = x - x_int;
986 event->crossing.y = y - y_int;
987 event->crossing.x_root = x;
988 event->crossing.y_root = y;
989 event->crossing.mode = mode;
992 event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
994 event->crossing.detail = GDK_NOTIFY_VIRTUAL;
996 event->crossing.focus = FALSE;
997 event->crossing.state = modifiers;
999 D_DEBUG_AT( GDKDFB_Crossing, " -> ENTER (%p/%p) at %4f,%4f (%4f,%4f) mode %d, detail %d\n",
1001 event->crossing.x, event->crossing.y, event->crossing.x_root, event->crossing.y_root,
1002 event->crossing.mode, event->crossing.detail );
1006 g_slist_free (path);
1009 event_win = gdk_directfb_pointer_event_window (b, GDK_ENTER_NOTIFY);
1012 event = gdk_directfb_event_make (event_win, GDK_ENTER_NOTIFY);
1014 event->crossing.subwindow = NULL;
1016 gdk_window_get_origin (b, &x_int, &y_int);
1018 event->crossing.x = x - x_int;
1019 event->crossing.y = y - y_int;
1020 event->crossing.x_root = x;
1021 event->crossing.y_root = y;
1022 event->crossing.mode = mode;
1025 event->crossing.detail = GDK_NOTIFY_NONLINEAR;
1027 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
1029 event->crossing.detail = GDK_NOTIFY_INFERIOR;
1031 event->crossing.focus = FALSE;
1032 event->crossing.state = modifiers;
1034 D_DEBUG_AT( GDKDFB_Crossing, " => ENTER (%p/%p) at %4f,%4f (%4f,%4f) mode %d, detail %d\n",
1036 event->crossing.x, event->crossing.y, event->crossing.x_root, event->crossing.y_root,
1037 event->crossing.mode, event->crossing.detail );
1040 if (mode != GDK_CROSSING_GRAB)
1042 //this seems to cause focus to change as the pointer moves yuck
1043 //gdk_directfb_change_focus (b);
1044 if (b != gdk_directfb_window_containing_pointer)
1046 g_object_unref (gdk_directfb_window_containing_pointer);
1047 gdk_directfb_window_containing_pointer = g_object_ref (b);
1053 show_window_internal (GdkWindow *window,
1056 GdkWindowObject *private;
1057 GdkWindowImplDirectFB *impl;
1058 GdkWindow *mousewin;
1060 D_DEBUG_AT( GDKDFB_Window, "%s( %p, %sraise )\n", G_STRFUNC, window, raise ? "" : "no " );
1062 private = GDK_WINDOW_OBJECT (window);
1063 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1065 if (!private->destroyed && !GDK_WINDOW_IS_MAPPED (private))
1067 private->state &= ~GDK_WINDOW_STATE_WITHDRAWN;
1070 gdk_window_raise (window);
1072 if (all_parents_shown (GDK_WINDOW_OBJECT (private)->parent))
1074 send_map_events (private);
1076 mousewin = gdk_window_at_pointer (NULL, NULL);
1077 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1078 GDK_CROSSING_NORMAL);
1080 if (private->input_only)
1083 gdk_window_invalidate_rect (window, NULL, TRUE);
1089 if (gdk_directfb_apply_focus_opacity)
1090 impl->window->SetOpacity (impl->window,
1091 (impl->opacity >> 1) + (impl->opacity >> 2));
1093 impl->window->SetOpacity (impl->window, impl->opacity);
1094 /* if its the first window focus it */
1099 gdk_directfb_window_show (GdkWindow *window,
1102 g_return_if_fail (GDK_IS_WINDOW (window));
1104 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", G_STRFUNC, window );
1106 show_window_internal (window, raise);
1110 gdk_directfb_window_hide (GdkWindow *window)
1112 GdkWindowObject *private;
1113 GdkWindowImplDirectFB *impl;
1114 GdkWindow *mousewin;
1115 GdkWindow *event_win;
1117 g_return_if_fail (GDK_IS_WINDOW (window));
1119 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", G_STRFUNC, window );
1121 private = GDK_WINDOW_OBJECT (window);
1122 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1125 impl->window->SetOpacity (impl->window, 0);
1127 if (!private->destroyed && GDK_WINDOW_IS_MAPPED (private))
1131 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
1133 if (!private->input_only && private->parent)
1135 gdk_window_clear_area (GDK_WINDOW (private->parent),
1138 impl->drawable.width,
1139 impl->drawable.height);
1142 event_win = gdk_directfb_other_event_window (window, GDK_UNMAP);
1144 event = gdk_directfb_event_make (event_win, GDK_UNMAP);
1146 mousewin = gdk_window_at_pointer (NULL, NULL);
1147 gdk_directfb_window_send_crossing_events (NULL,
1149 GDK_CROSSING_NORMAL);
1151 if (window == _gdk_directfb_pointer_grab_window)
1152 gdk_pointer_ungrab (GDK_CURRENT_TIME);
1153 if (window == _gdk_directfb_keyboard_grab_window)
1154 gdk_keyboard_ungrab (GDK_CURRENT_TIME);
1159 gdk_directfb_window_withdraw (GdkWindow *window)
1161 g_return_if_fail (GDK_IS_WINDOW (window));
1163 /* for now this should be enough */
1164 gdk_window_hide (window);
1168 _gdk_directfb_move_resize_child (GdkWindow *window,
1174 GdkWindowObject *private;
1175 GdkWindowImplDirectFB *impl;
1176 GdkWindowImplDirectFB *parent_impl;
1179 g_return_if_fail (GDK_IS_WINDOW (window));
1181 private = GDK_WINDOW_OBJECT (window);
1182 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1187 impl->drawable.width = width;
1188 impl->drawable.height = height;
1190 if (!private->input_only)
1192 if (impl->drawable.surface)
1194 if (impl->drawable.cairo_surface)
1196 cairo_surface_destroy (impl->drawable.cairo_surface);
1197 impl->drawable.cairo_surface = NULL;
1200 impl->drawable.surface->Release (impl->drawable.surface);
1201 impl->drawable.surface = NULL;
1204 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (private->parent)->impl);
1206 if (parent_impl->drawable.surface)
1208 DFBRectangle rect = { x, y, width, height };
1210 parent_impl->drawable.surface->GetSubSurface (parent_impl->drawable.surface,
1212 &impl->drawable.surface);
1216 for (list = private->children; list; list = list->next)
1218 private = GDK_WINDOW_OBJECT (list->data);
1219 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1221 _gdk_directfb_move_resize_child (list->data,
1222 private->x, private->y,
1223 impl->drawable.width, impl->drawable.height);
1228 gdk_directfb_window_move (GdkWindow *window,
1232 GdkWindowObject *private;
1233 GdkWindowImplDirectFB *impl;
1235 g_return_if_fail (GDK_IS_WINDOW (window));
1237 private = GDK_WINDOW_OBJECT (window);
1238 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1244 impl->window->MoveTo (impl->window, x, y);
1248 gint width=impl->drawable.width;
1249 gint height=impl->drawable.height;
1251 { private->x, private->y,width,height };
1253 _gdk_directfb_move_resize_child (window, x, y, width, height);
1254 _gdk_directfb_calc_abs (window);
1256 if (GDK_WINDOW_IS_MAPPED (private))
1258 GdkWindow *mousewin;
1259 GdkRectangle new = { x, y, width, height };
1261 gdk_rectangle_union (&new, &old, &new);
1262 gdk_window_invalidate_rect (GDK_WINDOW (private->parent), &new,TRUE);
1264 /* The window the pointer is in might have changed */
1265 mousewin = gdk_window_at_pointer (NULL, NULL);
1266 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1267 GDK_CROSSING_NORMAL);
1273 gdk_directfb_window_move_resize (GdkWindow *window,
1280 GdkWindowObject *private;
1281 GdkWindowImplDirectFB *impl;
1283 g_return_if_fail (GDK_IS_WINDOW (window));
1285 private = GDK_WINDOW_OBJECT (window);
1286 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1288 if (with_move && (width < 0 && height < 0))
1290 gdk_directfb_window_move (window, x, y);
1299 if (private->destroyed ||
1300 (private->x == x && private->y == y &&
1301 impl->drawable.width == width && impl->drawable.height == height))
1304 if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD))
1306 GdkWindowChildHandlerData *data;
1308 data = g_object_get_data (G_OBJECT (private->parent),
1309 "gdk-window-child-handler");
1312 (*data->changed) (window, x, y, width, height, data->user_data))
1316 if (impl->drawable.width == width && impl->drawable.height == height)
1319 gdk_directfb_window_move (window, x, y);
1321 else if (impl->window)
1326 impl->window->MoveTo (impl->window, x, y);
1328 impl->drawable.width = width;
1329 impl->drawable.height = height;
1331 impl->window->Resize (impl->window, width, height);
1335 GdkRectangle old = { private->x, private->y,
1336 impl->drawable.width, impl->drawable.height };
1337 GdkRectangle new = { x, y, width, height };
1345 _gdk_directfb_move_resize_child (window,
1346 new.x, new.y, new.width, new.height);
1347 _gdk_directfb_calc_abs (window);
1349 if (GDK_WINDOW_IS_MAPPED (private))
1351 GdkWindow *mousewin;
1353 gdk_rectangle_union (&new, &old, &new);
1354 gdk_window_invalidate_rect (GDK_WINDOW (private->parent), &new,TRUE);
1356 /* The window the pointer is in might have changed */
1357 mousewin = gdk_window_at_pointer (NULL, NULL);
1358 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1359 GDK_CROSSING_NORMAL);
1365 gdk_directfb_window_reparent (GdkWindow *window,
1366 GdkWindow *new_parent,
1370 GdkWindowObject *window_private;
1371 GdkWindowObject *parent_private;
1372 GdkWindowObject *old_parent_private;
1373 GdkWindowImplDirectFB *impl;
1374 GdkWindowImplDirectFB *parent_impl;
1377 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
1379 if (GDK_WINDOW_DESTROYED (window))
1383 new_parent = _gdk_parent_root;
1385 window_private = (GdkWindowObject *) window;
1386 old_parent_private = (GdkWindowObject *) window_private->parent;
1387 parent_private = (GdkWindowObject *) new_parent;
1388 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
1389 visual = gdk_drawable_get_visual (window);
1391 /* already parented */
1392 if( window_private->parent == (GdkWindowObject *)new_parent )
1395 window_private->parent = (GdkWindowObject *) new_parent;
1397 if (old_parent_private)
1399 old_parent_private->children =
1400 g_list_remove (old_parent_private->children, window);
1403 parent_private->children = g_list_prepend (parent_private->children, window);
1405 impl = GDK_WINDOW_IMPL_DIRECTFB (window_private->impl);
1407 if( impl->drawable.surface ) {
1408 impl->drawable.surface->Release (impl->drawable.surface);
1409 impl->drawable.surface = NULL;
1412 if( impl->window != NULL ) {
1413 gdk_directfb_window_id_table_remove (impl->dfb_id);
1414 impl->window->SetOpacity (impl->window,0);
1415 impl->window->Close(impl->window);
1416 impl->window->Release(impl->window);
1417 impl->window = NULL;
1420 //create window were a child of the root now
1421 if( window_private->parent == (GdkWindowObject *)_gdk_parent_root) {
1422 DFBWindowDescription desc;
1423 DFBWindowOptions window_options = DWOP_NONE;
1424 desc.flags = DWDESC_CAPS;
1425 if( window_private->input_only ) {
1426 desc.caps = DWCAPS_INPUTONLY;
1428 desc.flags |= DWDESC_PIXELFORMAT;
1429 desc.pixelformat = ((GdkVisualDirectFB *) visual)->format;
1430 if (DFB_PIXELFORMAT_HAS_ALPHA (desc.pixelformat)) {
1431 desc.flags |= DWDESC_CAPS;
1432 desc.caps = DWCAPS_ALPHACHANNEL;
1435 if( window_private->window_type == GDK_WINDOW_CHILD )
1436 window_private->window_type = GDK_WINDOW_TOPLEVEL;
1437 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
1438 DWDESC_POSX | DWDESC_POSY );
1441 desc.width = impl->drawable.width;
1442 desc.height = impl->drawable.height;
1443 if (!create_directfb_window (impl, &desc, window_options))
1446 _gdk_window_destroy (window, FALSE);
1449 /* we hold a reference count on ourselves */
1450 g_object_ref (window);
1451 impl->window->GetID (impl->window, &impl->dfb_id);
1452 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
1453 gdk_directfb_event_windows_add (window);
1455 DFBRectangle rect = { x, y, impl->drawable.width,
1456 impl->drawable.height};
1457 impl->window = NULL;
1458 parent_impl->drawable.surface->GetSubSurface (
1459 parent_impl->drawable.surface,
1461 &impl->drawable.surface);
1468 gdk_window_directfb_raise (GdkWindow *window)
1470 GdkWindowImplDirectFB *impl;
1472 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", G_STRFUNC, window );
1474 g_return_if_fail (GDK_IS_WINDOW (window));
1476 if (GDK_WINDOW_DESTROYED (window))
1479 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1485 ret = impl->window->RaiseToTop (impl->window);
1487 DirectFBError ("gdkwindow-directfb.c: RaiseToTop", ret);
1489 gdk_directfb_window_raise (window);
1493 if (gdk_directfb_window_raise (window))
1494 gdk_window_invalidate_rect (window, NULL, TRUE);
1499 gdk_window_directfb_lower (GdkWindow *window)
1501 GdkWindowImplDirectFB *impl;
1503 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", G_STRFUNC, window );
1505 g_return_if_fail (GDK_IS_WINDOW (window));
1507 if (GDK_WINDOW_DESTROYED (window))
1510 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1516 ret = impl->window->LowerToBottom (impl->window);
1518 DirectFBError ("gdkwindow-directfb.c: LowerToBottom", ret);
1520 gdk_directfb_window_lower (window);
1524 gdk_directfb_window_lower (window);
1525 gdk_window_invalidate_rect (window, NULL, TRUE);
1530 gdk_window_set_geometry_hints (GdkWindow *window,
1531 const GdkGeometry *geometry,
1532 GdkWindowHints geom_mask)
1534 g_return_if_fail (GDK_IS_WINDOW (window));
1536 if (GDK_WINDOW_DESTROYED (window))
1543 gdk_window_set_title (GdkWindow *window,
1546 g_return_if_fail (GDK_IS_WINDOW (window));
1548 if (GDK_WINDOW_DESTROYED (window))
1551 D_DEBUG_AT( GDKDFB_Window, "%s( %p, '%s' )\n", G_STRFUNC, window, title );
1553 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", G_STRFUNC, window );
1557 gdk_window_set_role (GdkWindow *window,
1560 g_return_if_fail (GDK_IS_WINDOW (window));
1562 if (GDK_WINDOW_DESTROYED (window))
1569 * gdk_window_set_startup_id:
1570 * @window: a toplevel #GdkWindow
1571 * @startup_id: a string with startup-notification identifier
1573 * When using GTK+, typically you should use gtk_window_set_startup_id()
1574 * instead of this low-level function.
1580 gdk_window_set_startup_id (GdkWindow *window,
1581 const gchar *startup_id)
1586 gdk_window_set_transient_for (GdkWindow *window,
1589 GdkWindowObject *private;
1590 GdkWindowObject *root;
1593 g_return_if_fail (GDK_IS_WINDOW (window));
1594 g_return_if_fail (GDK_IS_WINDOW (parent));
1596 private = GDK_WINDOW_OBJECT (window);
1597 root = GDK_WINDOW_OBJECT (_gdk_parent_root);
1599 g_return_if_fail (GDK_WINDOW (private->parent) == _gdk_parent_root);
1600 g_return_if_fail (GDK_WINDOW (GDK_WINDOW_OBJECT (parent)->parent) == _gdk_parent_root);
1602 root->children = g_list_remove (root->children, window);
1604 i = g_list_index (root->children, parent);
1606 root->children = g_list_prepend (root->children, window);
1608 root->children = g_list_insert (root->children, window, i);
1612 gdk_directfb_window_set_background (GdkWindow *window,
1613 const GdkColor *color)
1615 GdkWindowObject *private;
1617 g_return_if_fail (GDK_IS_WINDOW (window));
1619 g_return_if_fail (color != NULL);
1621 D_DEBUG_AT( GDKDFB_Window, "%s( %p, %d,%d,%d )\n", G_STRFUNC, window, color->red, color->green, color->blue );
1623 private = GDK_WINDOW_OBJECT (window);
1624 private->bg_color = *color;
1626 if (private->bg_pixmap &&
1627 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1628 private->bg_pixmap != GDK_NO_BG)
1629 g_object_unref (private->bg_pixmap);
1631 private->bg_pixmap = NULL;
1635 gdk_directfb_window_set_back_pixmap (GdkWindow *window,
1638 GdkWindowObject *private;
1640 g_return_if_fail (GDK_IS_WINDOW (window));
1642 D_DEBUG_AT( GDKDFB_Window, "%s( %p, %p )\n", G_STRFUNC,
1645 private = GDK_WINDOW_OBJECT (window);
1647 if (private->bg_pixmap &&
1648 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1649 private->bg_pixmap != GDK_NO_BG)
1651 g_object_unref (private->bg_pixmap);
1654 if (pixmap == GDK_PARENT_RELATIVE_BG)
1656 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1662 g_object_ref (pixmap);
1663 private->bg_pixmap = pixmap;
1667 private->bg_pixmap = GDK_NO_BG;
1673 gdk_directfb_window_set_cursor (GdkWindow *window,
1676 GdkWindowImplDirectFB *impl;
1677 GdkCursor *old_cursor;
1679 g_return_if_fail (GDK_IS_WINDOW (window));
1681 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1682 old_cursor = impl->cursor;
1684 impl->cursor = (cursor ?
1685 gdk_cursor_ref (cursor) : gdk_cursor_new (GDK_LEFT_PTR));
1687 if (gdk_window_at_pointer (NULL, NULL) == window)
1689 /* This is a bit evil but we want to keep all cursor changes in
1690 one place, so let gdk_directfb_window_send_crossing_events
1691 do the work for us. */
1693 gdk_directfb_window_send_crossing_events (window, window,
1694 GDK_CROSSING_NORMAL);
1696 else if (impl->window)
1698 GdkCursorDirectFB *dfb_cursor = (GdkCursorDirectFB *) impl->cursor;
1700 /* this branch takes care of setting the cursor for unmapped windows */
1702 impl->window->SetCursorShape (impl->window,
1704 dfb_cursor->hot_x, dfb_cursor->hot_y);
1708 gdk_cursor_unref (old_cursor);
1712 gdk_directfb_window_get_geometry (GdkWindow *window,
1719 GdkWindowObject *private;
1720 GdkDrawableImplDirectFB *impl;
1722 g_return_if_fail (GDK_IS_WINDOW (window));
1724 private = GDK_WINDOW_OBJECT (window);
1725 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1727 if (!GDK_WINDOW_DESTROYED (window))
1736 *width = impl->width;
1739 *height = impl->height;
1742 *depth = DFB_BITS_PER_PIXEL(impl->format);
1747 _gdk_directfb_calc_abs (GdkWindow *window)
1749 GdkWindowObject *private;
1750 GdkDrawableImplDirectFB *impl;
1753 g_return_if_fail (GDK_IS_WINDOW (window));
1755 private = GDK_WINDOW_OBJECT (window);
1756 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1758 impl->abs_x = private->x;
1759 impl->abs_y = private->y;
1761 if (private->parent)
1763 GdkDrawableImplDirectFB *parent_impl =
1764 GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (private->parent)->impl);
1766 impl->abs_x += parent_impl->abs_x;
1767 impl->abs_y += parent_impl->abs_y;
1770 D_DEBUG_AT( GDKDFB_Window, "%s( %p ) -> %4d,%4d\n", G_STRFUNC, window, impl->abs_x, impl->abs_y );
1772 for (list = private->children; list; list = list->next)
1774 _gdk_directfb_calc_abs (list->data);
1779 gdk_directfb_window_get_deskrelative_origin (GdkWindow *window,
1783 return gdk_window_get_origin (window, x, y);
1787 gdk_window_get_root_origin (GdkWindow *window,
1791 GdkWindowObject *rover;
1793 g_return_if_fail (GDK_IS_WINDOW (window));
1795 rover = (GdkWindowObject*) window;
1801 if (GDK_WINDOW_DESTROYED (window))
1804 while (rover->parent && ((GdkWindowObject*) rover->parent)->parent)
1805 rover = (GdkWindowObject *) rover->parent;
1806 if (rover->destroyed)
1816 gdk_directfb_window_get_pointer_helper (GdkWindow *window,
1819 GdkModifierType *mask)
1821 GdkWindow *retval = NULL;
1822 gint rx, ry, wx, wy;
1823 GdkDrawableImplDirectFB *impl;
1825 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1828 window = _gdk_parent_root;
1830 gdk_directfb_mouse_get_info (&rx, &ry, mask);
1834 retval = gdk_directfb_child_at (_gdk_parent_root, &wx, &wy);
1836 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1839 *x = rx - impl->abs_x;
1841 *y = ry - impl->abs_y;
1847 gdk_directfb_window_get_pointer (GdkWindow *window,
1850 GdkModifierType *mask)
1852 return gdk_directfb_window_get_pointer_helper (window, x, y, mask) != NULL;
1856 _gdk_windowing_window_at_pointer (GdkDisplay *display,
1859 GdkModifierType *mask,
1860 gboolean get_toplevel)
1865 gdk_directfb_mouse_get_info (&wx, &wy, NULL);
1867 retval = gdk_directfb_child_at (_gdk_parent_root, &wx, &wy);
1877 GdkWindowObject *w = (GdkWindowObject *)retval;
1878 /* Requested toplevel, find it. */
1879 /* TODO: This can be implemented more efficient by never
1880 recursing into children in the first place */
1883 /* Convert to toplevel */
1884 while (w->parent != NULL &&
1885 w->parent->window_type != GDK_WINDOW_ROOT)
1891 retval = (GdkWindow *)w;
1899 _gdk_windowing_get_pointer (GdkDisplay *display,
1903 GdkModifierType *mask)
1907 *screen = gdk_display_get_default_screen (display);
1910 gdk_directfb_window_get_pointer (_gdk_windowing_window_at_pointer (display,
1919 gdk_directfb_window_get_events (GdkWindow *window)
1921 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
1923 if (GDK_WINDOW_DESTROYED (window))
1926 return GDK_WINDOW_OBJECT (window)->event_mask;
1930 gdk_directfb_window_set_events (GdkWindow *window,
1931 GdkEventMask event_mask)
1933 g_return_if_fail (GDK_IS_WINDOW (window));
1935 if (event_mask & GDK_BUTTON_MOTION_MASK)
1936 event_mask |= (GDK_BUTTON1_MOTION_MASK |
1937 GDK_BUTTON2_MOTION_MASK |
1938 GDK_BUTTON3_MOTION_MASK);
1940 GDK_WINDOW_OBJECT (window)->event_mask = event_mask;
1944 gdk_directfb_window_shape_combine_region (GdkWindow *window,
1945 const GdkRegion *shape_region,
1952 gdk_directfb_window_input_shape_combine_region (GdkWindow *window,
1953 const GdkRegion *shape_region,
1960 gdk_directfb_window_queue_translation (GdkWindow *window,
1969 gdk_window_set_override_redirect (GdkWindow *window,
1970 gboolean override_redirect)
1972 g_return_if_fail (GDK_IS_WINDOW (window));
1974 if (GDK_WINDOW_DESTROYED (window))
1981 gdk_window_set_icon_list (GdkWindow *window,
1984 g_return_if_fail (GDK_IS_WINDOW (window));
1986 if (GDK_WINDOW_DESTROYED (window))
1993 gdk_window_set_icon (GdkWindow *window,
1994 GdkWindow *icon_window,
1998 g_return_if_fail (GDK_IS_WINDOW (window));
2000 if (GDK_WINDOW_DESTROYED (window))
2007 gdk_window_set_icon_name (GdkWindow *window,
2010 g_return_if_fail (GDK_IS_WINDOW (window));
2012 if (GDK_WINDOW_DESTROYED (window))
2019 gdk_window_iconify (GdkWindow *window)
2021 g_return_if_fail (GDK_IS_WINDOW (window));
2023 if (GDK_WINDOW_DESTROYED (window))
2026 gdk_window_hide (window);
2030 gdk_window_deiconify (GdkWindow *window)
2032 g_return_if_fail (GDK_IS_WINDOW (window));
2034 if (GDK_WINDOW_DESTROYED (window))
2037 gdk_window_show (window);
2041 gdk_window_stick (GdkWindow *window)
2043 g_return_if_fail (GDK_IS_WINDOW (window));
2045 if (GDK_WINDOW_DESTROYED (window))
2052 gdk_window_unstick (GdkWindow *window)
2054 g_return_if_fail (GDK_IS_WINDOW (window));
2056 if (GDK_WINDOW_DESTROYED (window))
2063 gdk_directfb_window_set_opacity (GdkWindow *window,
2066 GdkWindowImplDirectFB *impl;
2068 g_return_if_fail (GDK_IS_WINDOW (window));
2070 if (GDK_WINDOW_DESTROYED (window))
2073 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2075 impl->opacity = opacity;
2077 if (impl->window && GDK_WINDOW_IS_MAPPED (window))
2079 if (gdk_directfb_apply_focus_opacity &&
2080 window == gdk_directfb_focused_window)
2081 impl->window->SetOpacity (impl->window,
2082 (impl->opacity >> 1) + (impl->opacity >> 2));
2084 impl->window->SetOpacity (impl->window, impl->opacity);
2089 gdk_window_focus (GdkWindow *window,
2092 GdkWindow *toplevel;
2094 g_return_if_fail (GDK_IS_WINDOW (window));
2096 if (GDK_WINDOW_DESTROYED (window))
2099 toplevel = gdk_directfb_window_find_toplevel (window);
2100 if (toplevel != _gdk_parent_root)
2102 GdkWindowImplDirectFB *impl;
2104 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (toplevel)->impl);
2106 impl->window->RequestFocus (impl->window);
2111 gdk_window_maximize (GdkWindow *window)
2113 g_return_if_fail (GDK_IS_WINDOW (window));
2115 if (GDK_WINDOW_DESTROYED (window))
2122 gdk_window_unmaximize (GdkWindow *window)
2124 g_return_if_fail (GDK_IS_WINDOW (window));
2126 if (GDK_WINDOW_DESTROYED (window))
2133 gdk_window_set_type_hint (GdkWindow *window,
2134 GdkWindowTypeHint hint)
2136 g_return_if_fail (GDK_IS_WINDOW (window));
2138 if (GDK_WINDOW_DESTROYED (window))
2141 GDK_NOTE (MISC, g_print ("gdk_window_set_type_hint: 0x%x: %d\n",
2142 GDK_WINDOW_DFB_ID (window), hint));
2144 ((GdkWindowImplDirectFB *)((GdkWindowObject *)window)->impl)->type_hint = hint;
2151 gdk_window_get_type_hint (GdkWindow *window)
2153 g_return_val_if_fail (GDK_IS_WINDOW (window), GDK_WINDOW_TYPE_HINT_NORMAL);
2155 if (GDK_WINDOW_DESTROYED (window))
2156 return GDK_WINDOW_TYPE_HINT_NORMAL;
2158 return GDK_WINDOW_IMPL_DIRECTFB (((GdkWindowObject *) window)->impl)->type_hint;
2162 gdk_window_set_modal_hint (GdkWindow *window,
2165 GdkWindowImplDirectFB *impl;
2167 g_return_if_fail (GDK_IS_WINDOW (window));
2169 if (GDK_WINDOW_DESTROYED (window))
2172 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2176 impl->window->SetStackingClass (impl->window,
2177 modal ? DWSC_UPPER : DWSC_MIDDLE);
2182 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
2183 gboolean skips_taskbar)
2185 g_return_if_fail (GDK_IS_WINDOW (window));
2189 gdk_window_set_skip_pager_hint (GdkWindow *window,
2190 gboolean skips_pager)
2192 g_return_if_fail (GDK_IS_WINDOW (window));
2197 gdk_window_set_group (GdkWindow *window,
2200 g_return_if_fail (GDK_IS_WINDOW (window));
2201 g_return_if_fail (GDK_IS_WINDOW (leader));
2202 g_warning(" DirectFb set_group groups not supported \n");
2204 if (GDK_WINDOW_DESTROYED (window))
2210 GdkWindow * gdk_window_get_group (GdkWindow *window)
2212 g_warning(" DirectFb get_group groups not supported \n");
2217 gdk_fb_window_set_child_handler (GdkWindow *window,
2218 GdkWindowChildChanged changed,
2219 GdkWindowChildGetPos get_pos,
2222 GdkWindowChildHandlerData *data;
2224 g_return_if_fail (GDK_IS_WINDOW (window));
2226 data = g_new (GdkWindowChildHandlerData, 1);
2227 data->changed = changed;
2228 data->get_pos = get_pos;
2229 data->user_data = user_data;
2231 g_object_set_data_full (G_OBJECT (window), "gdk-window-child-handler",
2232 data, (GDestroyNotify) g_free);
2236 gdk_window_set_decorations (GdkWindow *window,
2237 GdkWMDecoration decorations)
2239 GdkWMDecoration *dec;
2241 g_return_if_fail (GDK_IS_WINDOW (window));
2243 dec = g_new (GdkWMDecoration, 1);
2246 g_object_set_data_full (G_OBJECT (window), "gdk-window-decorations",
2247 dec, (GDestroyNotify) g_free);
2251 gdk_window_get_decorations (GdkWindow *window,
2252 GdkWMDecoration *decorations)
2254 GdkWMDecoration *dec;
2256 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2258 dec = g_object_get_data (G_OBJECT (window), "gdk-window-decorations");
2261 *decorations = *dec;
2268 gdk_window_set_functions (GdkWindow *window,
2269 GdkWMFunction functions)
2271 g_return_if_fail (GDK_IS_WINDOW (window));
2273 if (GDK_WINDOW_DESTROYED (window))
2277 g_message("unimplemented %s", G_STRFUNC);
2281 gdk_directfb_window_set_static_gravities (GdkWindow *window,
2282 gboolean use_static)
2284 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2286 if (GDK_WINDOW_DESTROYED (window))
2290 g_message("unimplemented %s", G_STRFUNC);
2296 gdk_window_begin_resize_drag (GdkWindow *window,
2303 g_return_if_fail (GDK_IS_WINDOW (window));
2305 if (GDK_WINDOW_DESTROYED (window))
2308 g_message("unimplemented %s", G_STRFUNC);
2312 gdk_window_begin_move_drag (GdkWindow *window,
2318 g_return_if_fail (GDK_IS_WINDOW (window));
2320 if (GDK_WINDOW_DESTROYED (window))
2323 g_message("unimplemented %s", G_STRFUNC);
2327 * gdk_window_get_frame_extents:
2328 * @window: a #GdkWindow
2329 * @rect: rectangle to fill with bounding box of the window frame
2331 * Obtains the bounding box of the window, including window manager
2332 * titlebar/borders if any. The frame position is given in root window
2333 * coordinates. To get the position of the window itself (rather than
2334 * the frame) in root window coordinates, use gdk_window_get_origin().
2338 gdk_window_get_frame_extents (GdkWindow *window,
2341 GdkWindowObject *private;
2342 GdkDrawableImplDirectFB *impl;
2344 g_return_if_fail (GDK_IS_WINDOW (window));
2345 g_return_if_fail (rect != NULL);
2347 if (GDK_WINDOW_DESTROYED (window))
2350 private = GDK_WINDOW_OBJECT (window);
2352 while (private->parent && ((GdkWindowObject*) private->parent)->parent)
2353 private = (GdkWindowObject*) private->parent;
2354 if (GDK_WINDOW_DESTROYED (window))
2357 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
2359 rect->x = impl->abs_x;
2360 rect->y = impl->abs_y;
2361 rect->width = impl->width;
2362 rect->height = impl->height;
2366 * Given a directfb window and a subsurface of that window
2367 * create a gdkwindow child wrapper
2369 GdkWindow *gdk_directfb_create_child_window(GdkWindow *parent,
2370 IDirectFBSurface *subsurface)
2373 GdkWindowObject *private;
2374 GdkWindowObject *parent_private;
2375 GdkWindowImplDirectFB *impl;
2376 GdkWindowImplDirectFB *parent_impl;
2379 g_return_val_if_fail (parent != NULL, NULL);
2381 window = g_object_new (GDK_TYPE_WINDOW, NULL);
2382 private = GDK_WINDOW_OBJECT (window);
2383 private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
2384 parent_private = GDK_WINDOW_OBJECT (parent);
2385 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
2386 private->parent = parent_private;
2388 subsurface->GetPosition(subsurface,&x,&y);
2389 subsurface->GetSize(subsurface,&w,&h);
2391 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2392 impl->drawable.wrapper = GDK_DRAWABLE (window);
2397 _gdk_directfb_calc_abs (window);
2399 impl->drawable.width = w;
2400 impl->drawable.height = h;
2401 private->window_type = GDK_WINDOW_CHILD;
2402 impl->drawable.surface = subsurface;
2403 impl->drawable.format = parent_impl->drawable.format;
2404 private->depth = parent_private->depth;
2405 gdk_drawable_set_colormap (GDK_DRAWABLE (window),
2406 gdk_drawable_get_colormap (parent));
2407 gdk_window_set_cursor (window, NULL);
2408 parent_private->children = g_list_prepend (parent_private->children,window);
2409 /*we hold a reference count on ourselves */
2410 g_object_ref (window);
2417 * The wrapping is not perfect since directfb does not give full access
2418 * to the current state of a window event mask etc need to fix dfb
2421 gdk_window_foreign_new_for_display (GdkDisplay* display,GdkNativeWindow anid)
2423 GdkWindow *window = NULL;
2424 GdkWindow *parent =NULL;
2425 GdkWindowObject *private =NULL;
2426 GdkWindowObject *parent_private =NULL;
2427 GdkWindowImplDirectFB *parent_impl =NULL;
2428 GdkWindowImplDirectFB *impl =NULL;
2429 DFBWindowOptions options;
2431 GdkDisplayDFB * gdkdisplay = _gdk_display;
2432 IDirectFBWindow *dfbwindow;
2434 window = gdk_window_lookup (anid);
2437 g_object_ref (window);
2440 if( display != NULL )
2441 gdkdisplay = GDK_DISPLAY_DFB(display);
2443 ret = gdkdisplay->layer->GetWindow (gdkdisplay->layer,
2444 (DFBWindowID)anid,&dfbwindow);
2446 if (ret != DFB_OK) {
2447 DirectFBError ("gdk_window_new: Layer->GetWindow failed", ret);
2451 parent = _gdk_parent_root;
2454 parent_private = GDK_WINDOW_OBJECT (parent);
2455 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
2458 window = g_object_new (GDK_TYPE_WINDOW, NULL);
2459 /* we hold a reference count on ourselves */
2460 g_object_ref (window);
2461 private = GDK_WINDOW_OBJECT (window);
2462 private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
2463 private->parent = parent_private;
2464 private->window_type = GDK_WINDOW_TOPLEVEL;
2465 private->viewable = TRUE;
2466 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2468 impl->drawable.wrapper = GDK_DRAWABLE (window);
2469 impl->window = dfbwindow;
2470 dfbwindow->GetOptions(dfbwindow,&options);
2471 dfbwindow->GetPosition(dfbwindow,&private->x,&private->y);
2472 dfbwindow->GetSize(dfbwindow,&impl->drawable.width,&impl->drawable.height);
2475 private->input_only = FALSE;
2477 if( dfbwindow->GetSurface (dfbwindow, &impl->drawable.surface) == DFB_UNSUPPORTED ){
2478 private->input_only = TRUE;
2479 impl->drawable.surface = NULL;
2482 * Position ourselevs
2484 _gdk_directfb_calc_abs (window);
2486 /* We default to all events least surprise to the user
2487 * minus the poll for motion events
2489 gdk_window_set_events (window, (GDK_ALL_EVENTS_MASK ^ GDK_POINTER_MOTION_HINT_MASK));
2491 if (impl->drawable.surface)
2493 impl->drawable.surface->GetPixelFormat (impl->drawable.surface,
2494 &impl->drawable.format);
2496 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
2498 gdk_drawable_set_colormap (GDK_DRAWABLE (window), gdk_drawable_get_colormap (parent));
2500 gdk_drawable_set_colormap (GDK_DRAWABLE (window), gdk_colormap_get_system());
2503 //can be null for the soft cursor window itself when
2504 //running a gtk directfb wm
2505 if( gdk_display_get_default() != NULL ) {
2506 gdk_window_set_cursor (window,NULL);
2510 parent_private->children = g_list_prepend (parent_private->children,
2512 impl->dfb_id = (DFBWindowID)anid;
2513 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
2514 gdk_directfb_event_windows_add (window);
2520 gdk_window_lookup_for_display (GdkDisplay *display,GdkNativeWindow anid)
2522 return gdk_directfb_window_id_table_lookup ((DFBWindowID) anid);
2526 gdk_window_lookup (GdkNativeWindow anid)
2528 return gdk_directfb_window_id_table_lookup ((DFBWindowID) anid);
2531 IDirectFBWindow *gdk_directfb_window_lookup(GdkWindow *window )
2533 GdkWindowObject *private;
2534 GdkWindowImplDirectFB *impl;
2535 g_return_val_if_fail (GDK_IS_WINDOW (window),NULL);
2536 private = GDK_WINDOW_OBJECT (window);
2537 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2538 return impl->window;
2541 IDirectFBSurface *gdk_directfb_surface_lookup(GdkWindow *window)
2543 GdkWindowObject *private;
2544 GdkWindowImplDirectFB *impl;
2545 g_return_val_if_fail (GDK_IS_WINDOW (window),NULL);
2546 private = GDK_WINDOW_OBJECT (window);
2547 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2548 return impl->drawable.surface;
2552 gdk_window_fullscreen (GdkWindow *window)
2554 g_return_if_fail (GDK_IS_WINDOW (window));
2555 g_warning ("gdk_window_fullscreen() not implemented.\n");
2559 gdk_window_unfullscreen (GdkWindow *window)
2561 g_return_if_fail (GDK_IS_WINDOW (window));
2562 /* g_warning ("gdk_window_unfullscreen() not implemented.\n");*/
2566 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
2568 g_return_if_fail (GDK_IS_WINDOW (window));
2569 static gboolean first_call = TRUE;
2571 g_warning ("gdk_window_set_keep_above() not implemented.\n");
2578 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
2580 g_return_if_fail (GDK_IS_WINDOW (window));
2581 static gboolean first_call = TRUE;
2583 g_warning ("gdk_window_set_keep_below() not implemented.\n");
2590 gdk_window_enable_synchronized_configure (GdkWindow *window)
2595 gdk_window_configure_finished (GdkWindow *window)
2600 gdk_display_warp_pointer (GdkDisplay *display,
2605 g_warning ("gdk_display_warp_pointer() not implemented.\n");
2609 gdk_window_set_urgency_hint (GdkWindow *window,
2612 g_return_if_fail (GDK_IS_WINDOW (window));
2613 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD);
2615 if (GDK_WINDOW_DESTROYED (window))
2618 g_warning ("gdk_window_set_urgency_hint() not implemented.\n");
2623 gdk_window_impl_directfb_begin_paint_region (GdkPaintable *paintable,
2625 const GdkRegion *region)
2627 GdkDrawableImplDirectFB *impl;
2628 GdkWindowImplDirectFB *wimpl;
2631 g_assert (region != NULL );
2632 wimpl = GDK_WINDOW_IMPL_DIRECTFB (paintable);
2633 impl = (GdkDrawableImplDirectFB *)wimpl;
2638 D_DEBUG_AT( GDKDFB_Window, "%s( %p ) <- %4d,%4d-%4d,%4d (%ld boxes)\n", G_STRFUNC,
2639 paintable, GDKDFB_RECTANGLE_VALS_FROM_BOX(®ion->extents), region->numRects );
2641 /* When it's buffered... */
2644 /* ...we're already painting on it! */
2645 g_assert( impl->paint_depth > 0 );
2647 D_DEBUG_AT( GDKDFB_Window, " -> painted %4d,%4d-%4dx%4d (%ld boxes)\n",
2648 DFB_RECTANGLE_VALS_FROM_REGION( &impl->paint_region.extents ), impl->paint_region.numRects );
2650 /* Add the new region to the paint region... */
2651 gdk_region_union (&impl->paint_region, region);
2655 /* ...otherwise it's the first time! */
2656 g_assert( impl->paint_depth == 0 );
2658 /* Generate the clip region for painting around child windows. */
2659 gdk_directfb_clip_region( GDK_DRAWABLE(paintable), NULL, NULL, &impl->clip_region );
2661 /* Initialize the paint region with the new one... */
2662 temp_region_init_copy( &impl->paint_region, region );
2664 impl->buffered = TRUE;
2667 D_DEBUG_AT( GDKDFB_Window, " -> painting %4d,%4d-%4dx%4d (%ld boxes)\n",
2668 DFB_RECTANGLE_VALS_FROM_REGION( &impl->paint_region.extents ), impl->paint_region.numRects );
2670 /* ...but clip the initial/compound result against the clip region. */
2671 gdk_region_intersect (&impl->paint_region, &impl->clip_region);
2673 D_DEBUG_AT( GDKDFB_Window, " -> clipped %4d,%4d-%4dx%4d (%ld boxes)\n",
2674 DFB_RECTANGLE_VALS_FROM_REGION( &impl->paint_region.extents ), impl->paint_region.numRects );
2676 impl->paint_depth++;
2678 D_DEBUG_AT( GDKDFB_Window, " -> depth is now %d\n", impl->paint_depth );
2680 for (i = 0; i < region->numRects; i++)
2682 GdkRegionBox *box = ®ion->rects[i];
2684 D_DEBUG_AT( GDKDFB_Window, " -> [%2d] %4d,%4d-%4dx%4d\n", i, GDKDFB_RECTANGLE_VALS_FROM_BOX( box ) );
2686 gdk_window_clear_area (GDK_WINDOW(wimpl->gdkWindow),
2695 gdk_window_impl_directfb_end_paint (GdkPaintable *paintable)
2697 GdkDrawableImplDirectFB *impl;
2699 impl = GDK_DRAWABLE_IMPL_DIRECTFB (paintable);
2701 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", G_STRFUNC, paintable );
2703 g_return_if_fail (impl->paint_depth > 0);
2705 g_assert( impl->buffered );
2707 impl->paint_depth--;
2709 #ifdef GDK_DIRECTFB_NO_EXPERIMENTS
2710 if (impl->paint_depth == 0)
2712 impl->buffered = FALSE;
2714 if (impl->paint_region.numRects)
2716 DFBRegion reg = { impl->paint_region.extents.x1,
2717 impl->paint_region.extents.y1,
2718 impl->paint_region.extents.x2-1,
2719 impl->paint_region.extents.y2-1 };
2721 D_DEBUG_AT( GDKDFB_Window, " -> flip %4d,%4d-%4dx%4d (%ld boxes)\n",
2722 DFB_RECTANGLE_VALS_FROM_REGION( ® ), impl->paint_region.numRects );
2724 impl->surface->Flip( impl->surface, ®, 0 );
2726 temp_region_reset( &impl->paint_region );
2730 if (impl->paint_depth == 0)
2732 impl->buffered = FALSE;
2734 temp_region_deinit( &impl->clip_region );
2736 if (impl->paint_region.numRects)
2738 GdkWindow *window = GDK_WINDOW( impl->wrapper );
2740 if (GDK_IS_WINDOW(window))
2742 GdkWindowObject *top = GDK_WINDOW_OBJECT( gdk_window_get_toplevel( window ) );
2747 GdkWindowImplDirectFB *wimpl = GDK_WINDOW_IMPL_DIRECTFB (top->impl);
2749 reg.x1 = impl->abs_x - top->x + impl->paint_region.extents.x1;
2750 reg.y1 = impl->abs_y - top->y + impl->paint_region.extents.y1;
2751 reg.x2 = impl->abs_x - top->x + impl->paint_region.extents.x2 - 1;
2752 reg.y2 = impl->abs_y - top->y + impl->paint_region.extents.y2 - 1;
2754 D_DEBUG_AT( GDKDFB_Window, " -> queue flip %4d,%4d-%4dx%4d (%ld boxes)\n",
2755 DFB_RECTANGLE_VALS_FROM_REGION( ® ), impl->paint_region.numRects );
2757 dfb_updates_add( &wimpl->flips, ® );
2761 temp_region_reset( &impl->paint_region );
2766 D_DEBUG_AT( GDKDFB_Window, " -> depth is still %d\n", impl->paint_depth );
2770 _gdk_windowing_get_shape_for_mask (GdkBitmap *mask)
2776 _gdk_windowing_window_get_shape (GdkWindow *window)
2782 _gdk_windowing_window_get_next_serial (GdkDisplay *display)
2788 _gdk_windowing_window_get_input_shape (GdkWindow *window)
2794 _gdk_windowing_before_process_all_updates (void)
2799 _gdk_windowing_after_process_all_updates (void)
2804 _gdk_windowing_window_process_updates_recurse (GdkWindow *window,
2807 _gdk_window_process_updates_recurse (window, region);
2811 gdk_window_impl_directfb_paintable_init (GdkPaintableIface *iface)
2813 iface->begin_paint_region = gdk_window_impl_directfb_begin_paint_region;
2814 iface->end_paint = gdk_window_impl_directfb_end_paint;
2818 _gdk_windowing_window_beep (GdkWindow *window)
2820 gdk_display_beep (gdk_display_get_default());
2824 gdk_window_set_opacity (GdkWindow *window,
2827 GdkDisplay *display;
2830 g_return_if_fail (GDK_IS_WINDOW (window));
2832 if (GDK_WINDOW_DESTROYED (window))
2835 display = gdk_drawable_get_display (window);
2839 else if (opacity > 1)
2841 cardinal = opacity * 0xff;
2842 gdk_directfb_window_set_opacity(window,cardinal);
2846 _gdk_windowing_window_set_composited (GdkWindow *window,
2847 gboolean composited)
2852 gdk_directfb_window_get_root_coords (GdkWindow *window,
2863 gdk_directfb_window_queue_antiexpose (GdkWindow *window,
2870 gdk_window_impl_iface_init (GdkWindowImplIface *iface)
2872 iface->show = gdk_directfb_window_show;
2873 iface->hide = gdk_directfb_window_hide;
2874 iface->withdraw = gdk_directfb_window_withdraw;
2875 iface->set_events = gdk_directfb_window_set_events;
2876 iface->get_events = gdk_directfb_window_get_events;
2877 iface->raise = gdk_window_directfb_raise;
2878 iface->lower = gdk_window_directfb_lower;
2879 iface->move_resize = gdk_directfb_window_move_resize;
2880 iface->set_background = gdk_directfb_window_set_background;
2881 iface->set_back_pixmap = gdk_directfb_window_set_back_pixmap;
2882 iface->reparent = gdk_directfb_window_reparent;
2883 iface->set_cursor = gdk_directfb_window_set_cursor;
2884 iface->get_geometry = gdk_directfb_window_get_geometry;
2885 iface->get_root_coords = gdk_directfb_window_get_root_coords;
2886 iface->get_pointer = gdk_directfb_window_get_pointer;
2887 iface->get_deskrelative_origin = gdk_directfb_window_get_deskrelative_origin;
2888 iface->shape_combine_region = gdk_directfb_window_shape_combine_region;
2889 iface->input_shape_combine_region = gdk_directfb_window_input_shape_combine_region;
2890 iface->set_static_gravities = gdk_directfb_window_set_static_gravities;
2891 iface->queue_antiexpose = gdk_directfb_window_queue_antiexpose;
2892 iface->queue_translation = gdk_directfb_window_queue_translation;
2893 iface->destroy = gdk_directfb_window_destroy;
2896 #define __GDK_WINDOW_X11_C__
2897 #include "gdkaliasdef.c"