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>
58 D_DEBUG_DOMAIN( GDKDFB_Crossing, "GDKDFB/Crossing", "GDK DirectFB Crossing Events" );
59 D_DEBUG_DOMAIN( GDKDFB_Updates, "GDKDFB/Updates", "GDK DirectFB Updates" );
60 D_DEBUG_DOMAIN( GDKDFB_Paintable, "GDKDFB/Paintable", "GDK DirectFB Paintable" );
61 D_DEBUG_DOMAIN( GDKDFB_Window, "GDKDFB/Window", "GDK DirectFB Window" );
64 static GdkRegion * gdk_window_impl_directfb_get_visible_region (GdkDrawable *drawable);
65 static void gdk_window_impl_directfb_set_colormap (GdkDrawable *drawable,
66 GdkColormap *colormap);
67 static void gdk_window_impl_directfb_init (GdkWindowImplDirectFB *window);
68 static void gdk_window_impl_directfb_class_init (GdkWindowImplDirectFBClass *klass);
69 static void gdk_window_impl_directfb_finalize (GObject *object);
71 static void gdk_window_impl_iface_init (GdkWindowImplIface *iface);
76 GdkWindowChildChanged changed;
77 GdkWindowChildGetPos get_pos;
79 } GdkWindowChildHandlerData;
82 /* Code for dirty-region queueing
84 static GSList *update_windows = NULL;
85 static guint update_idle = 0;
88 gdk_window_directfb_process_all_updates (void)
91 GSList *old_update_windows = update_windows;
94 g_source_remove (update_idle);
96 update_windows = NULL;
99 D_DEBUG_AT( GDKDFB_Updates, "%s()\n", __FUNCTION__ );
101 g_slist_foreach (old_update_windows, (GFunc)g_object_ref, NULL);
102 tmp_list = old_update_windows;
105 GdkWindowObject *private = GDK_WINDOW_OBJECT( tmp_list->data );
106 #ifdef DIRECT_ENABLE_DEBUG
107 GdkWindowImplDirectFB *wimpl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
110 if (private->update_freeze_count)
112 D_DEBUG_AT( GDKDFB_Updates, " -> %p frozen [%4d,%4d-%4dx%4d] (%d boxes)\n",
113 private, DFB_RECTANGLE_VALS_FROM_REGION( &wimpl->flips.bounding ),
114 wimpl->flips.num_regions );
115 update_windows = g_slist_prepend (update_windows, private);
119 D_DEBUG_AT( GDKDFB_Updates, " -> %p update [%4d,%4d-%4dx%4d] (%d boxes)\n",
120 private, DFB_RECTANGLE_VALS_FROM_REGION( &wimpl->flips.bounding ),
121 wimpl->flips.num_regions );
122 gdk_window_process_updates(tmp_list->data,TRUE);
125 g_object_unref (tmp_list->data);
126 tmp_list = tmp_list->next;
129 #ifndef GDK_DIRECTFB_NO_EXPERIMENTS
130 g_slist_foreach (old_update_windows, (GFunc)g_object_ref, NULL);
131 tmp_list = old_update_windows;
134 GdkWindowObject *top = GDK_WINDOW_OBJECT( gdk_window_get_toplevel( tmp_list->data ) );
138 GdkWindowImplDirectFB *wimpl = GDK_WINDOW_IMPL_DIRECTFB (top->impl);
140 if (wimpl->flips.num_regions)
142 D_DEBUG_AT( GDKDFB_Updates, " -> %p flip [%4d,%4d-%4dx%4d] (%d boxes)\n",
143 top, DFB_RECTANGLE_VALS_FROM_REGION( &wimpl->flips.bounding ),
144 wimpl->flips.num_regions );
146 wimpl->drawable.surface->Flip( wimpl->drawable.surface, &wimpl->flips.bounding, DSFLIP_NONE );
148 dfb_updates_reset( &wimpl->flips );
151 D_DEBUG_AT( GDKDFB_Updates, " -> %p has no flips!\n", top );
154 D_DEBUG_AT( GDKDFB_Updates, " -> %p has no top level window!\n", tmp_list->data );
156 g_object_unref (tmp_list->data);
157 tmp_list = tmp_list->next;
161 g_slist_free (old_update_windows);
165 gdk_window_update_idle (gpointer data)
167 gdk_window_directfb_process_all_updates ();
173 gdk_window_schedule_update (GdkWindow *window)
175 D_DEBUG_AT( GDKDFB_Updates, "%s( %p ) <- freeze count %d\n", __FUNCTION__, window,
176 window ? GDK_WINDOW_OBJECT (window)->update_freeze_count : -1 );
178 if (window && GDK_WINDOW_OBJECT (window)->update_freeze_count)
183 D_DEBUG_AT( GDKDFB_Updates, " -> adding idle callback\n" );
185 update_idle = gdk_threads_add_idle_full (GDK_PRIORITY_REDRAW,
186 gdk_window_update_idle, NULL, NULL);
191 static GdkWindow *gdk_directfb_window_containing_pointer = NULL;
192 static GdkWindow *gdk_directfb_focused_window = NULL;
193 static gpointer parent_class = NULL;
194 GdkWindow * _gdk_parent_root = NULL;
196 static void gdk_window_impl_directfb_paintable_init (GdkPaintableIface *iface);
200 gdk_window_impl_directfb_get_type (void)
202 static GType object_type = 0;
206 static const GTypeInfo object_info =
208 sizeof (GdkWindowImplDirectFBClass),
209 (GBaseInitFunc) NULL,
210 (GBaseFinalizeFunc) NULL,
211 (GClassInitFunc) gdk_window_impl_directfb_class_init,
212 NULL, /* class_finalize */
213 NULL, /* class_data */
214 sizeof (GdkWindowImplDirectFB),
216 (GInstanceInitFunc) gdk_window_impl_directfb_init,
219 static const GInterfaceInfo paintable_info =
221 (GInterfaceInitFunc) gdk_window_impl_directfb_paintable_init,
226 static const GInterfaceInfo window_impl_info =
228 (GInterfaceInitFunc) gdk_window_impl_iface_init,
233 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_DIRECTFB,
234 "GdkWindowImplDirectFB",
236 g_type_add_interface_static (object_type,
240 g_type_add_interface_static (object_type,
241 GDK_TYPE_WINDOW_IMPL,
249 _gdk_window_impl_get_type (void)
251 return gdk_window_impl_directfb_get_type ();
255 gdk_window_impl_directfb_init (GdkWindowImplDirectFB *impl)
257 impl->drawable.width = 1;
258 impl->drawable.height = 1;
259 //cannot use gdk_cursor_new here since gdk_display_get_default
261 impl->cursor = gdk_cursor_new_for_display (GDK_DISPLAY_OBJECT(_gdk_display),GDK_LEFT_PTR);
266 gdk_window_impl_directfb_class_init (GdkWindowImplDirectFBClass *klass)
268 GObjectClass *object_class = G_OBJECT_CLASS (klass);
269 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
271 parent_class = g_type_class_peek_parent (klass);
273 object_class->finalize = gdk_window_impl_directfb_finalize;
275 drawable_class->set_colormap = gdk_window_impl_directfb_set_colormap;
277 /* Visible and clip regions are the same */
279 drawable_class->get_clip_region =
280 gdk_window_impl_directfb_get_visible_region;
282 drawable_class->get_visible_region =
283 gdk_window_impl_directfb_get_visible_region;
287 g_free_2nd (gpointer a,
295 gdk_window_impl_directfb_finalize (GObject *object)
297 GdkWindowImplDirectFB *impl = GDK_WINDOW_IMPL_DIRECTFB (object);
299 D_DEBUG_AT( GDKDFB_Window, "%s( %p ) <- %dx%d\n", __FUNCTION__, impl, impl->drawable.width, impl->drawable.height );
301 if (GDK_WINDOW_IS_MAPPED (impl->drawable.wrapper))
302 gdk_window_hide (impl->drawable.wrapper);
305 gdk_cursor_unref (impl->cursor);
307 if (impl->properties)
309 g_hash_table_foreach (impl->properties, g_free_2nd, NULL);
310 g_hash_table_destroy (impl->properties);
314 gdk_directfb_window_id_table_remove (impl->dfb_id);
315 /* native window resource must be release before we can finalize !*/
319 if (G_OBJECT_CLASS (parent_class)->finalize)
320 G_OBJECT_CLASS (parent_class)->finalize (object);
324 gdk_window_impl_directfb_get_visible_region (GdkDrawable *drawable)
326 GdkDrawableImplDirectFB *priv = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
327 GdkRectangle rect = { 0, 0, 0, 0 };
328 DFBRectangle drect = { 0, 0, 0, 0 };
330 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, drawable );
333 priv->surface->GetVisibleRectangle (priv->surface, &drect);
339 D_DEBUG_AT( GDKDFB_Window, " -> returning %4d,%4d-%4dx%4d\n", drect.x, drect.y, drect.w, drect.h );
341 return gdk_region_rectangle (&rect);
345 gdk_window_impl_directfb_set_colormap (GdkDrawable *drawable,
346 GdkColormap *colormap)
348 GDK_DRAWABLE_CLASS (parent_class)->set_colormap (drawable, colormap);
352 GdkDrawableImplDirectFB *priv = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
356 IDirectFBPalette *palette = gdk_directfb_colormap_get_palette (colormap);
359 priv->surface->SetPalette (priv->surface, palette);
366 create_directfb_window (GdkWindowImplDirectFB *impl,
367 DFBWindowDescription *desc,
368 DFBWindowOptions window_options)
371 IDirectFBWindow *window;
373 D_DEBUG_AT( GDKDFB_Window, "%s( %4dx%4d, caps 0x%08x )\n", __FUNCTION__, desc->width, desc->height, desc->caps );
375 ret = _gdk_display->layer->CreateWindow (_gdk_display->layer, desc, &window);
379 DirectFBError ("gdk_window_new: Layer->CreateWindow failed", ret);
384 if ((desc->flags & DWDESC_CAPS) && (desc->caps & DWCAPS_INPUTONLY))
386 impl->drawable.surface = NULL;
388 window->GetSurface (window, &impl->drawable.surface);
392 DFBWindowOptions options;
393 window->GetOptions (window, &options);
394 window->SetOptions (window, options | window_options);
397 impl->window = window;
399 #ifndef GDK_DIRECTFB_NO_EXPERIMENTS
400 //direct_log_printf( NULL, "Initializing (window %p, wimpl %p)\n", win, impl );
402 dfb_updates_init( &impl->flips, impl->flip_regions, G_N_ELEMENTS(impl->flip_regions) );
409 _gdk_windowing_window_init (void)
411 GdkWindowObject *private;
412 GdkWindowImplDirectFB *impl;
413 DFBDisplayLayerConfig dlc;
415 g_assert (_gdk_parent_root == NULL);
417 _gdk_display->layer->GetConfiguration (_gdk_display->layer, &dlc);
419 _gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL);
420 private = GDK_WINDOW_OBJECT (_gdk_parent_root);
421 private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
422 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
424 private->window_type = GDK_WINDOW_ROOT;
426 private->children = NULL;
427 // impl->drawable.paint_region = NULL;
428 impl->gdkWindow = _gdk_parent_root;
430 impl->drawable.abs_x = 0;
431 impl->drawable.abs_y = 0;
432 impl->drawable.width = dlc.width;
433 impl->drawable.height = dlc.height;
434 impl->drawable.wrapper = GDK_DRAWABLE (private);
435 /* custom root window init */
437 DFBWindowDescription desc;
439 /*XXX I must do this now its a bug ALPHA ROOT*/
441 desc.flags = DWDESC_CAPS;
443 desc.caps |= DWCAPS_NODECORATION;
444 desc.caps |= DWCAPS_ALPHACHANNEL;
445 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
446 DWDESC_POSX | DWDESC_POSY );
449 desc.width = dlc.width;
450 desc.height = dlc.height;
451 create_directfb_window (impl,&desc,0);
452 g_assert(impl->window != NULL);
453 g_assert(impl->drawable.surface != NULL );
455 impl->drawable.surface->GetPixelFormat(impl->drawable.surface,&impl->drawable.format);
456 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
458 Now we can set up the system colormap
460 gdk_drawable_set_colormap (GDK_DRAWABLE (_gdk_parent_root),gdk_colormap_get_system());
466 gdk_directfb_window_new (GdkWindow *parent,
467 GdkWindowAttr *attributes,
468 gint attributes_mask,
469 DFBWindowCapabilities window_caps,
470 DFBWindowOptions window_options,
471 DFBSurfaceCapabilities surface_caps)
474 GdkWindowObject *private;
475 GdkWindowObject *parent_private;
476 GdkWindowImplDirectFB *impl;
477 GdkWindowImplDirectFB *parent_impl;
479 DFBWindowDescription desc;
482 g_return_val_if_fail (attributes != NULL, NULL);
484 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, parent );
486 if (!parent || attributes->window_type != GDK_WINDOW_CHILD)
487 parent = _gdk_parent_root;
489 window = g_object_new (GDK_TYPE_WINDOW, NULL);
490 private = GDK_WINDOW_OBJECT (window);
491 private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
493 parent_private = GDK_WINDOW_OBJECT (parent);
494 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
495 private->parent = parent_private;
497 x = (attributes_mask & GDK_WA_X) ? attributes->x : 0;
498 y = (attributes_mask & GDK_WA_Y) ? attributes->y : 0;
500 gdk_window_set_events (window, attributes->event_mask | GDK_STRUCTURE_MASK);
502 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
503 impl->drawable.wrapper = GDK_DRAWABLE (window);
504 impl->gdkWindow = window;
509 _gdk_directfb_calc_abs (window);
511 impl->drawable.width = MAX (1, attributes->width);
512 impl->drawable.height = MAX (1, attributes->height);
514 private->window_type = attributes->window_type;
518 if (attributes_mask & GDK_WA_VISUAL)
519 visual = attributes->visual;
521 visual = gdk_drawable_get_visual (parent);
523 switch (attributes->wclass)
525 case GDK_INPUT_OUTPUT:
526 private->input_only = FALSE;
528 desc.flags |= DWDESC_PIXELFORMAT;
529 desc.pixelformat = ((GdkVisualDirectFB *) visual)->format;
531 if (DFB_PIXELFORMAT_HAS_ALPHA (desc.pixelformat))
533 desc.flags |= DWDESC_CAPS;
534 desc.caps = DWCAPS_ALPHACHANNEL;
539 private->input_only = TRUE;
540 desc.flags |= DWDESC_CAPS;
541 desc.caps = DWCAPS_INPUTONLY;
545 g_warning ("gdk_window_new: unsupported window class\n");
546 _gdk_window_destroy (window, FALSE);
550 switch (private->window_type)
552 case GDK_WINDOW_TOPLEVEL:
553 case GDK_WINDOW_DIALOG:
554 case GDK_WINDOW_TEMP:
555 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
556 DWDESC_POSX | DWDESC_POSY );
559 desc.width = impl->drawable.width;
560 desc.height = impl->drawable.height;
564 if (! (desc.flags & DWDESC_CAPS))
566 desc.flags |= DWDESC_CAPS;
567 desc.caps = DWCAPS_NONE;
570 desc.caps |= window_caps;
575 desc.flags |= DWDESC_SURFACE_CAPS;
576 desc.surface_caps = surface_caps;
580 if (!create_directfb_window (impl, &desc, window_options))
583 _gdk_window_destroy (window, FALSE);
586 if( desc.caps != DWCAPS_INPUTONLY )
587 impl->window->SetOpacity(impl->window, 0x00 );
590 case GDK_WINDOW_CHILD:
592 if (!private->input_only && parent_impl->drawable.surface)
596 { x, y, impl->drawable.width, impl->drawable.height };
597 parent_impl->drawable.surface->GetSubSurface (parent_impl->drawable.surface,
599 &impl->drawable.surface);
604 g_warning ("gdk_window_new: unsupported window type: %d",
605 private->window_type);
606 _gdk_window_destroy (window, FALSE);
610 if (impl->drawable.surface)
612 GdkColormap *colormap;
614 impl->drawable.surface->GetPixelFormat (impl->drawable.surface,
615 &impl->drawable.format);
617 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
619 if ((attributes_mask & GDK_WA_COLORMAP) && attributes->colormap)
621 colormap = attributes->colormap;
625 if (gdk_visual_get_system () == visual)
626 colormap = gdk_colormap_get_system ();
628 colormap =gdk_drawable_get_colormap (parent);
631 gdk_drawable_set_colormap (GDK_DRAWABLE (window), colormap);
635 impl->drawable.format = ((GdkVisualDirectFB *)visual)->format;
636 private->depth = visual->depth;
639 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
640 (attributes->cursor) : NULL));
643 parent_private->children = g_list_prepend (parent_private->children,
646 /* we hold a reference count on ourselves */
647 g_object_ref (window);
651 impl->window->GetID (impl->window, &impl->dfb_id);
652 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
653 gdk_directfb_event_windows_add (window);
656 if (attributes_mask & GDK_WA_TYPE_HINT)
657 gdk_window_set_type_hint (window, attributes->type_hint);
663 _gdk_window_new (GdkWindow *parent,
664 GdkWindowAttr *attributes,
665 gint attributes_mask)
667 g_return_val_if_fail (attributes != NULL, NULL);
669 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, parent );
671 return gdk_directfb_window_new (parent, attributes, attributes_mask,
672 DWCAPS_NONE, DWOP_NONE, DSCAPS_NONE);
675 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
677 /* It's somebody else's window, but in our hierarchy,
678 * so reparent it to the root window, and then send
679 * it a delete event, as if we were a WM
681 _gdk_windowing_window_destroy (window,TRUE,TRUE);
686 _gdk_windowing_window_destroy (GdkWindow *window,
688 gboolean foreign_destroy)
690 GdkWindowObject *private;
691 GdkWindowImplDirectFB *impl;
693 g_return_if_fail (GDK_IS_WINDOW (window));
695 D_DEBUG_AT( GDKDFB_Window, "%s( %p, %srecursing, %sforeign )\n", __FUNCTION__, window,
696 recursing ? "" : "not ", foreign_destroy ? "" : "no " );
698 private = GDK_WINDOW_OBJECT (window);
699 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
701 _gdk_selection_window_destroyed (window);
702 gdk_directfb_event_windows_remove (window);
704 if (window == _gdk_directfb_pointer_grab_window)
705 gdk_pointer_ungrab (GDK_CURRENT_TIME);
706 if (window == _gdk_directfb_keyboard_grab_window)
707 gdk_keyboard_ungrab (GDK_CURRENT_TIME);
709 if (window == gdk_directfb_focused_window)
710 gdk_directfb_change_focus (NULL);
713 if (impl->drawable.surface) {
714 GdkDrawableImplDirectFB *dimpl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
715 if(dimpl->cairo_surface) {
716 cairo_surface_destroy(dimpl->cairo_surface);
717 dimpl->cairo_surface= NULL;
719 impl->drawable.surface->Release (impl->drawable.surface);
720 impl->drawable.surface = NULL;
723 if (!recursing && !foreign_destroy && impl->window ) {
724 impl->window->SetOpacity (impl->window,0);
725 impl->window->Close(impl->window);
726 impl->window->Release(impl->window);
731 /* This function is called when the window is really gone.
734 gdk_window_destroy_notify (GdkWindow *window)
736 g_return_if_fail (GDK_IS_WINDOW (window));
738 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window );
740 if (!GDK_WINDOW_DESTROYED (window))
742 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
743 g_warning ("GdkWindow %p unexpectedly destroyed", window);
745 _gdk_window_destroy (window, TRUE);
747 g_object_unref (window);
750 /* Focus follows pointer */
752 gdk_directfb_window_find_toplevel (GdkWindow *window)
754 while (window && window != _gdk_parent_root)
756 GdkWindow *parent = (GdkWindow *) (GDK_WINDOW_OBJECT (window))->parent;
758 if ((parent == _gdk_parent_root) && GDK_WINDOW_IS_MAPPED (window))
764 return _gdk_parent_root;
768 gdk_directfb_window_find_focus (void)
770 if (_gdk_directfb_keyboard_grab_window)
771 return _gdk_directfb_keyboard_grab_window;
773 if (!gdk_directfb_focused_window)
774 gdk_directfb_focused_window = g_object_ref (_gdk_parent_root);
776 return gdk_directfb_focused_window;
780 gdk_directfb_change_focus (GdkWindow *new_focus_window)
782 GdkEventFocus *event;
785 GdkWindow *event_win;
787 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, new_focus_window );
789 /* No focus changes while the pointer is grabbed */
790 if (_gdk_directfb_pointer_grab_window)
793 old_win = gdk_directfb_focused_window;
794 new_win = gdk_directfb_window_find_toplevel (new_focus_window);
796 if (old_win == new_win)
801 event_win = gdk_directfb_keyboard_event_window (old_win,
805 event = (GdkEventFocus *) gdk_directfb_event_make (event_win,
811 event_win = gdk_directfb_keyboard_event_window (new_win,
815 event = (GdkEventFocus *) gdk_directfb_event_make (event_win,
820 if (gdk_directfb_focused_window)
821 g_object_unref (gdk_directfb_focused_window);
822 gdk_directfb_focused_window = g_object_ref (new_win);
826 gdk_window_set_accept_focus (GdkWindow *window,
827 gboolean accept_focus)
829 GdkWindowObject *private;
830 g_return_if_fail (window != NULL);
831 g_return_if_fail (GDK_IS_WINDOW (window));
833 private = (GdkWindowObject *)window;
835 accept_focus = accept_focus != FALSE;
837 if (private->accept_focus != accept_focus)
838 private->accept_focus = accept_focus;
843 gdk_window_set_focus_on_map (GdkWindow *window,
844 gboolean focus_on_map)
846 GdkWindowObject *private;
847 g_return_if_fail (window != NULL);
848 g_return_if_fail (GDK_IS_WINDOW (window));
850 private = (GdkWindowObject *)window;
852 focus_on_map = focus_on_map != FALSE;
854 if (private->focus_on_map != focus_on_map)
855 private->focus_on_map = focus_on_map;
859 gdk_directfb_window_raise (GdkWindow *window)
861 GdkWindowObject *parent;
863 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window );
865 parent = GDK_WINDOW_OBJECT (window)->parent;
867 if (parent->children->data == window)
870 parent->children = g_list_remove (parent->children, window);
871 parent->children = g_list_prepend (parent->children, window);
877 gdk_directfb_window_lower (GdkWindow *window)
879 GdkWindowObject *parent;
881 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window );
883 parent = GDK_WINDOW_OBJECT (window)->parent;
885 parent->children = g_list_remove (parent->children, window);
886 parent->children = g_list_append (parent->children, window);
890 all_parents_shown (GdkWindowObject *private)
892 while (GDK_WINDOW_IS_MAPPED (private))
895 private = GDK_WINDOW_OBJECT (private)->parent;
904 send_map_events (GdkWindowObject *private)
907 GdkWindow *event_win;
909 if (!GDK_WINDOW_IS_MAPPED (private))
912 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, private );
914 event_win = gdk_directfb_other_event_window ((GdkWindow *) private, GDK_MAP);
916 gdk_directfb_event_make (event_win, GDK_MAP);
918 for (list = private->children; list; list = list->next)
919 send_map_events (list->data);
923 gdk_directfb_find_common_ancestor (GdkWindow *win1,
929 for (a = GDK_WINDOW_OBJECT (win1); a; a = a->parent)
930 for (b = GDK_WINDOW_OBJECT (win2); b; b = b->parent)
933 return GDK_WINDOW (a);
940 gdk_directfb_window_send_crossing_events (GdkWindow *src,
942 GdkCrossingMode mode)
945 GdkWindow *win, *last, *next;
947 gint x, y, x_int, y_int;
948 GdkModifierType modifiers;
953 GdkWindow *event_win;
955 D_DEBUG_AT( GDKDFB_Crossing, "%s( %p -> %p, %d )\n", __FUNCTION__, src, dest, mode );
957 /* Do a possible cursor change before checking if we need to
958 generate crossing events so cursor changes due to pointer
959 grabs work correctly. */
961 static GdkCursorDirectFB *last_cursor = NULL;
963 GdkWindowObject *private = GDK_WINDOW_OBJECT (dest);
964 GdkWindowImplDirectFB *impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
965 GdkCursorDirectFB *cursor;
967 if (_gdk_directfb_pointer_grab_cursor)
968 cursor = (GdkCursorDirectFB*) _gdk_directfb_pointer_grab_cursor;
970 cursor = (GdkCursorDirectFB*) impl->cursor;
972 if (cursor != last_cursor)
974 win = gdk_directfb_window_find_toplevel (dest);
975 private = GDK_WINDOW_OBJECT (win);
976 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
979 impl->window->SetCursorShape (impl->window,
981 cursor->hot_x, cursor->hot_y);
982 last_cursor = cursor;
986 if (dest == gdk_directfb_window_containing_pointer) {
987 D_DEBUG_AT( GDKDFB_Crossing, " -> already containing the pointer\n" );
991 if (gdk_directfb_window_containing_pointer == NULL)
992 gdk_directfb_window_containing_pointer = g_object_ref (_gdk_parent_root);
997 a = gdk_directfb_window_containing_pointer;
1002 D_DEBUG_AT( GDKDFB_Crossing, " -> src == dest\n" );
1006 /* gdk_directfb_window_containing_pointer might have been destroyed.
1007 * The refcount we hold on it should keep it, but it's parents
1010 if (GDK_WINDOW_DESTROYED (a)) {
1011 D_DEBUG_AT( GDKDFB_Crossing, " -> src is destroyed!\n" );
1012 a = _gdk_parent_root;
1015 gdk_directfb_mouse_get_info (&x, &y, &modifiers);
1017 c = gdk_directfb_find_common_ancestor (a, b);
1019 D_DEBUG_AT( GDKDFB_Crossing, " -> common ancestor %p\n", c );
1021 non_linear = (c != a) && (c != b);
1023 D_DEBUG_AT( GDKDFB_Crossing, " -> non_linear: %s\n", non_linear ? "YES" : "NO" );
1025 event_win = gdk_directfb_pointer_event_window (a, GDK_LEAVE_NOTIFY);
1028 D_DEBUG_AT( GDKDFB_Crossing, " -> sending LEAVE to src\n" );
1030 event = gdk_directfb_event_make (event_win, GDK_LEAVE_NOTIFY);
1031 event->crossing.subwindow = NULL;
1033 gdk_window_get_origin (a, &x_int, &y_int);
1035 event->crossing.x = x - x_int;
1036 event->crossing.y = y - y_int;
1037 event->crossing.x_root = x;
1038 event->crossing.y_root = y;
1039 event->crossing.mode = mode;
1042 event->crossing.detail = GDK_NOTIFY_NONLINEAR;
1044 event->crossing.detail = GDK_NOTIFY_INFERIOR;
1046 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
1048 event->crossing.focus = FALSE;
1049 event->crossing.state = modifiers;
1051 D_DEBUG_AT( GDKDFB_Crossing, " => LEAVE (%p/%p) at %4f,%4f (%4f,%4f) mode %d, detail %d\n",
1053 event->crossing.x, event->crossing.y, event->crossing.x_root, event->crossing.y_root,
1054 event->crossing.mode, event->crossing.detail );
1057 /* Traverse up from a to (excluding) c */
1061 win = GDK_WINDOW (GDK_WINDOW_OBJECT (a)->parent);
1065 gdk_directfb_pointer_event_window (win, GDK_LEAVE_NOTIFY);
1069 event = gdk_directfb_event_make (event_win, GDK_LEAVE_NOTIFY);
1071 event->crossing.subwindow = g_object_ref (last);
1073 gdk_window_get_origin (win, &x_int, &y_int);
1075 event->crossing.x = x - x_int;
1076 event->crossing.y = y - y_int;
1077 event->crossing.x_root = x;
1078 event->crossing.y_root = y;
1079 event->crossing.mode = mode;
1082 event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
1084 event->crossing.detail = GDK_NOTIFY_VIRTUAL;
1086 event->crossing.focus = FALSE;
1087 event->crossing.state = modifiers;
1089 D_DEBUG_AT( GDKDFB_Crossing, " -> LEAVE (%p/%p) at %4f,%4f (%4f,%4f) mode %d, detail %d\n",
1091 event->crossing.x, event->crossing.y, event->crossing.x_root, event->crossing.y_root,
1092 event->crossing.mode, event->crossing.detail );
1096 win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent);
1100 /* Traverse down from c to b */
1104 win = GDK_WINDOW (GDK_WINDOW_OBJECT (b)->parent);
1107 path = g_slist_prepend (path, win);
1108 win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent);
1114 win = GDK_WINDOW (list->data);
1115 list = g_slist_next (list);
1118 next = GDK_WINDOW (list->data);
1123 gdk_directfb_pointer_event_window (win, GDK_ENTER_NOTIFY);
1127 event = gdk_directfb_event_make (event_win, GDK_ENTER_NOTIFY);
1129 event->crossing.subwindow = g_object_ref (next);
1131 gdk_window_get_origin (win, &x_int, &y_int);
1133 event->crossing.x = x - x_int;
1134 event->crossing.y = y - y_int;
1135 event->crossing.x_root = x;
1136 event->crossing.y_root = y;
1137 event->crossing.mode = mode;
1140 event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
1142 event->crossing.detail = GDK_NOTIFY_VIRTUAL;
1144 event->crossing.focus = FALSE;
1145 event->crossing.state = modifiers;
1147 D_DEBUG_AT( GDKDFB_Crossing, " -> ENTER (%p/%p) at %4f,%4f (%4f,%4f) mode %d, detail %d\n",
1149 event->crossing.x, event->crossing.y, event->crossing.x_root, event->crossing.y_root,
1150 event->crossing.mode, event->crossing.detail );
1154 g_slist_free (path);
1157 event_win = gdk_directfb_pointer_event_window (b, GDK_ENTER_NOTIFY);
1160 event = gdk_directfb_event_make (event_win, GDK_ENTER_NOTIFY);
1162 event->crossing.subwindow = NULL;
1164 gdk_window_get_origin (b, &x_int, &y_int);
1166 event->crossing.x = x - x_int;
1167 event->crossing.y = y - y_int;
1168 event->crossing.x_root = x;
1169 event->crossing.y_root = y;
1170 event->crossing.mode = mode;
1173 event->crossing.detail = GDK_NOTIFY_NONLINEAR;
1175 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
1177 event->crossing.detail = GDK_NOTIFY_INFERIOR;
1179 event->crossing.focus = FALSE;
1180 event->crossing.state = modifiers;
1182 D_DEBUG_AT( GDKDFB_Crossing, " => ENTER (%p/%p) at %4f,%4f (%4f,%4f) mode %d, detail %d\n",
1184 event->crossing.x, event->crossing.y, event->crossing.x_root, event->crossing.y_root,
1185 event->crossing.mode, event->crossing.detail );
1188 if (mode != GDK_CROSSING_GRAB)
1190 //this seems to cause focus to change as the pointer moves yuck
1191 //gdk_directfb_change_focus (b);
1192 if (b != gdk_directfb_window_containing_pointer)
1194 g_object_unref (gdk_directfb_window_containing_pointer);
1195 gdk_directfb_window_containing_pointer = g_object_ref (b);
1201 show_window_internal (GdkWindow *window,
1204 GdkWindowObject *private;
1205 GdkWindowImplDirectFB *impl;
1206 GdkWindow *mousewin;
1208 D_DEBUG_AT( GDKDFB_Window, "%s( %p, %sraise )\n", __FUNCTION__, window, raise ? "" : "no " );
1210 private = GDK_WINDOW_OBJECT (window);
1211 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1213 if (!private->destroyed && !GDK_WINDOW_IS_MAPPED (private))
1215 private->state &= ~GDK_WINDOW_STATE_WITHDRAWN;
1218 gdk_window_raise (window);
1220 if (all_parents_shown (GDK_WINDOW_OBJECT (private)->parent))
1222 send_map_events (private);
1224 mousewin = gdk_window_at_pointer (NULL, NULL);
1225 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1226 GDK_CROSSING_NORMAL);
1228 if (private->input_only)
1231 gdk_window_invalidate_rect (window, NULL, TRUE);
1237 if (gdk_directfb_apply_focus_opacity)
1238 impl->window->SetOpacity (impl->window,
1239 (impl->opacity >> 1) + (impl->opacity >> 2));
1241 impl->window->SetOpacity (impl->window, impl->opacity);
1242 /* if its the first window focus it */
1247 gdk_directfb_window_show (GdkWindow *window,
1250 g_return_if_fail (GDK_IS_WINDOW (window));
1252 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window );
1254 show_window_internal (window, raise);
1258 gdk_directfb_window_hide (GdkWindow *window)
1260 GdkWindowObject *private;
1261 GdkWindowImplDirectFB *impl;
1262 GdkWindow *mousewin;
1263 GdkWindow *event_win;
1265 g_return_if_fail (GDK_IS_WINDOW (window));
1267 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window );
1269 private = GDK_WINDOW_OBJECT (window);
1270 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1273 impl->window->SetOpacity (impl->window, 0);
1275 if (!private->destroyed && GDK_WINDOW_IS_MAPPED (private))
1279 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
1281 if (!private->input_only && private->parent)
1283 gdk_window_clear_area (GDK_WINDOW (private->parent),
1286 impl->drawable.width,
1287 impl->drawable.height);
1290 event_win = gdk_directfb_other_event_window (window, GDK_UNMAP);
1292 event = gdk_directfb_event_make (event_win, GDK_UNMAP);
1294 mousewin = gdk_window_at_pointer (NULL, NULL);
1295 gdk_directfb_window_send_crossing_events (NULL,
1297 GDK_CROSSING_NORMAL);
1299 if (window == _gdk_directfb_pointer_grab_window)
1300 gdk_pointer_ungrab (GDK_CURRENT_TIME);
1301 if (window == _gdk_directfb_keyboard_grab_window)
1302 gdk_keyboard_ungrab (GDK_CURRENT_TIME);
1307 gdk_directfb_window_withdraw (GdkWindow *window)
1309 g_return_if_fail (GDK_IS_WINDOW (window));
1311 /* for now this should be enough */
1312 gdk_window_hide (window);
1316 _gdk_directfb_move_resize_child (GdkWindow *window,
1322 GdkWindowObject *private;
1323 GdkWindowImplDirectFB *impl;
1324 GdkWindowImplDirectFB *parent_impl;
1327 g_return_if_fail (GDK_IS_WINDOW (window));
1329 private = GDK_WINDOW_OBJECT (window);
1330 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1335 impl->drawable.width = width;
1336 impl->drawable.height = height;
1338 if (!private->input_only)
1340 if (impl->drawable.surface)
1342 if (impl->drawable.cairo_surface)
1344 cairo_surface_destroy (impl->drawable.cairo_surface);
1345 impl->drawable.cairo_surface = NULL;
1348 impl->drawable.surface->Release (impl->drawable.surface);
1349 impl->drawable.surface = NULL;
1352 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (private->parent)->impl);
1354 if (parent_impl->drawable.surface)
1356 DFBRectangle rect = { x, y, width, height };
1358 parent_impl->drawable.surface->GetSubSurface (parent_impl->drawable.surface,
1360 &impl->drawable.surface);
1364 for (list = private->children; list; list = list->next)
1366 private = GDK_WINDOW_OBJECT (list->data);
1367 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1369 _gdk_directfb_move_resize_child (list->data,
1370 private->x, private->y,
1371 impl->drawable.width, impl->drawable.height);
1376 gdk_directfb_window_move (GdkWindow *window,
1380 GdkWindowObject *private;
1381 GdkWindowImplDirectFB *impl;
1383 g_return_if_fail (GDK_IS_WINDOW (window));
1385 private = GDK_WINDOW_OBJECT (window);
1386 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1392 impl->window->MoveTo (impl->window, x, y);
1396 gint width=impl->drawable.width;
1397 gint height=impl->drawable.height;
1399 { private->x, private->y,width,height };
1401 _gdk_directfb_move_resize_child (window, x, y, width, height);
1402 _gdk_directfb_calc_abs (window);
1404 if (GDK_WINDOW_IS_MAPPED (private))
1406 GdkWindow *mousewin;
1407 GdkRectangle new = { x, y, width, height };
1409 gdk_rectangle_union (&new, &old, &new);
1410 gdk_window_invalidate_rect (GDK_WINDOW (private->parent), &new,TRUE);
1412 /* The window the pointer is in might have changed */
1413 mousewin = gdk_window_at_pointer (NULL, NULL);
1414 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1415 GDK_CROSSING_NORMAL);
1421 gdk_directfb_window_move_resize (GdkWindow *window,
1428 GdkWindowObject *private;
1429 GdkWindowImplDirectFB *impl;
1431 g_return_if_fail (GDK_IS_WINDOW (window));
1433 private = GDK_WINDOW_OBJECT (window);
1434 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1436 if (with_move && (width < 0 && height < 0))
1438 gdk_directfb_window_move (window, x, y);
1447 if (private->destroyed ||
1448 (private->x == x && private->y == y &&
1449 impl->drawable.width == width && impl->drawable.height == height))
1452 if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD))
1454 GdkWindowChildHandlerData *data;
1456 data = g_object_get_data (G_OBJECT (private->parent),
1457 "gdk-window-child-handler");
1460 (*data->changed) (window, x, y, width, height, data->user_data))
1464 if (impl->drawable.width == width && impl->drawable.height == height)
1467 gdk_directfb_window_move (window, x, y);
1469 else if (impl->window)
1473 impl->drawable.width = width;
1474 impl->drawable.height = height;
1477 impl->window->MoveTo (impl->window, x, y);
1478 impl->window->Resize (impl->window, width, height);
1482 GdkRectangle old = { private->x, private->y,
1483 impl->drawable.width, impl->drawable.height };
1484 GdkRectangle new = { x, y, width, height };
1492 _gdk_directfb_move_resize_child (window,
1493 new.x, new.y, new.width, new.height);
1494 _gdk_directfb_calc_abs (window);
1496 if (GDK_WINDOW_IS_MAPPED (private))
1498 GdkWindow *mousewin;
1500 gdk_rectangle_union (&new, &old, &new);
1501 gdk_window_invalidate_rect (GDK_WINDOW (private->parent), &new,TRUE);
1503 /* The window the pointer is in might have changed */
1504 mousewin = gdk_window_at_pointer (NULL, NULL);
1505 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1506 GDK_CROSSING_NORMAL);
1512 gdk_directfb_window_reparent (GdkWindow *window,
1513 GdkWindow *new_parent,
1517 GdkWindowObject *window_private;
1518 GdkWindowObject *parent_private;
1519 GdkWindowObject *old_parent_private;
1520 GdkWindowImplDirectFB *impl;
1521 GdkWindowImplDirectFB *parent_impl;
1524 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
1526 if (GDK_WINDOW_DESTROYED (window))
1530 new_parent = _gdk_parent_root;
1532 window_private = (GdkWindowObject *) window;
1533 old_parent_private = (GdkWindowObject *) window_private->parent;
1534 parent_private = (GdkWindowObject *) new_parent;
1535 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
1536 visual = gdk_drawable_get_visual (window);
1538 /* already parented */
1539 if( window_private->parent == (GdkWindowObject *)new_parent )
1542 window_private->parent = (GdkWindowObject *) new_parent;
1544 if (old_parent_private)
1546 old_parent_private->children =
1547 g_list_remove (old_parent_private->children, window);
1550 parent_private->children = g_list_prepend (parent_private->children, window);
1552 impl = GDK_WINDOW_IMPL_DIRECTFB (window_private->impl);
1554 if( impl->drawable.surface ) {
1555 impl->drawable.surface->Release (impl->drawable.surface);
1556 impl->drawable.surface = NULL;
1559 if( impl->window != NULL ) {
1560 gdk_directfb_window_id_table_remove (impl->dfb_id);
1561 impl->window->SetOpacity (impl->window,0);
1562 impl->window->Close(impl->window);
1563 impl->window->Release(impl->window);
1564 impl->window = NULL;
1567 //create window were a child of the root now
1568 if( window_private->parent == (GdkWindowObject *)_gdk_parent_root) {
1569 DFBWindowDescription desc;
1570 DFBWindowOptions window_options = DWOP_NONE;
1571 desc.flags = DWDESC_CAPS;
1572 if( window_private->input_only ) {
1573 desc.caps = DWCAPS_INPUTONLY;
1575 desc.flags |= DWDESC_PIXELFORMAT;
1576 desc.pixelformat = ((GdkVisualDirectFB *) visual)->format;
1577 if (DFB_PIXELFORMAT_HAS_ALPHA (desc.pixelformat)) {
1578 desc.flags |= DWDESC_CAPS;
1579 desc.caps = DWCAPS_ALPHACHANNEL;
1582 if( window_private->window_type == GDK_WINDOW_CHILD )
1583 window_private->window_type = GDK_WINDOW_TOPLEVEL;
1584 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
1585 DWDESC_POSX | DWDESC_POSY );
1588 desc.width = impl->drawable.width;
1589 desc.height = impl->drawable.height;
1590 if (!create_directfb_window (impl, &desc, window_options))
1593 _gdk_window_destroy (window, FALSE);
1596 /* we hold a reference count on ourselves */
1597 g_object_ref (window);
1598 impl->window->GetID (impl->window, &impl->dfb_id);
1599 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
1600 gdk_directfb_event_windows_add (window);
1602 DFBRectangle rect = { x, y, impl->drawable.width,
1603 impl->drawable.height};
1604 impl->window = NULL;
1605 parent_impl->drawable.surface->GetSubSurface (
1606 parent_impl->drawable.surface,
1608 &impl->drawable.surface);
1615 gdk_directfb_window_clear_area (GdkWindow *window,
1620 gboolean send_expose)
1622 GdkWindowObject *private;
1623 GdkDrawableImplDirectFB *impl;
1624 GdkPixmap *bg_pixmap;
1625 GdkWindowObject *relative_to;
1630 D_DEBUG_AT( GDKDFB_Window, "%s( %p, %4d,%4d-%4dx%4d )\n", __FUNCTION__, window, x, y, width, height );
1632 g_return_if_fail (GDK_IS_WINDOW (window));
1634 if (GDK_WINDOW_DESTROYED (window)) {
1635 D_DEBUG_AT( GDKDFB_Window, " -> DESTROYED!\n" );
1639 private = GDK_WINDOW_OBJECT (window);
1641 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1644 Follow XClearArea definition for zero height width
1647 width = impl->width-x;
1649 height = impl->height-y;
1651 bg_pixmap = private->bg_pixmap;
1653 for (relative_to = private;
1654 relative_to && bg_pixmap == GDK_PARENT_RELATIVE_BG;
1655 relative_to = relative_to->parent)
1657 bg_pixmap = relative_to->bg_pixmap;
1658 dx += relative_to->x;
1659 dy += relative_to->y;
1662 if (bg_pixmap == GDK_NO_BG) {
1663 D_DEBUG_AT( GDKDFB_Window, " -> NO BG\n" );
1667 if (bg_pixmap && bg_pixmap != GDK_PARENT_RELATIVE_BG)
1671 values.fill = GDK_TILED;
1672 values.tile = bg_pixmap;
1673 values.ts_x_origin = - dx;
1674 values.ts_y_origin = - dy;
1676 D_DEBUG_AT( GDKDFB_Window, " -> PIXMAP\n" );
1678 gc = gdk_gc_new_with_values (GDK_DRAWABLE (impl), &values,
1679 GDK_GC_FILL | GDK_GC_TILE |
1680 GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN);
1684 /* GDK_PARENT_RELATIVE_BG, but no pixmap,
1685 get the color from the parent window. */
1689 values.foreground = relative_to->bg_color;
1691 D_DEBUG_AT( GDKDFB_Window, " -> COLOR\n" );
1693 gc = gdk_gc_new_with_values (GDK_DRAWABLE (impl), &values,
1697 gdk_draw_rectangle (GDK_DRAWABLE (impl),
1698 gc, TRUE, x, y, width, height);
1701 g_object_unref (gc);
1705 gdk_window_directfb_raise (GdkWindow *window)
1707 GdkWindowImplDirectFB *impl;
1709 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window );
1711 g_return_if_fail (GDK_IS_WINDOW (window));
1713 if (GDK_WINDOW_DESTROYED (window))
1716 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1722 ret = impl->window->RaiseToTop (impl->window);
1724 DirectFBError ("gdkwindow-directfb.c: RaiseToTop", ret);
1726 gdk_directfb_window_raise (window);
1730 if (gdk_directfb_window_raise (window))
1731 gdk_window_invalidate_rect (window, NULL, TRUE);
1736 gdk_window_directfb_lower (GdkWindow *window)
1738 GdkWindowImplDirectFB *impl;
1740 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window );
1742 g_return_if_fail (GDK_IS_WINDOW (window));
1744 if (GDK_WINDOW_DESTROYED (window))
1747 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1753 ret = impl->window->LowerToBottom (impl->window);
1755 DirectFBError ("gdkwindow-directfb.c: LowerToBottom", ret);
1757 gdk_directfb_window_lower (window);
1761 gdk_directfb_window_lower (window);
1762 gdk_window_invalidate_rect (window, NULL, TRUE);
1767 gdk_window_set_hints (GdkWindow *window,
1776 g_return_if_fail (GDK_IS_WINDOW (window));
1778 if (GDK_WINDOW_DESTROYED (window))
1781 D_DEBUG_AT( GDKDFB_Window, "%s( %p, %3d,%3d, min %4dx%4d, max %4dx%4d, flags 0x%08x )\n", __FUNCTION__,
1782 window, x,y, min_width, min_height, max_width, max_height, flags );
1787 gdk_window_set_geometry_hints (GdkWindow *window,
1788 const GdkGeometry *geometry,
1789 GdkWindowHints geom_mask)
1791 g_return_if_fail (GDK_IS_WINDOW (window));
1793 if (GDK_WINDOW_DESTROYED (window))
1800 gdk_window_set_title (GdkWindow *window,
1803 g_return_if_fail (GDK_IS_WINDOW (window));
1805 if (GDK_WINDOW_DESTROYED (window))
1808 D_DEBUG_AT( GDKDFB_Window, "%s( %p, '%s' )\n", __FUNCTION__, window, title );
1810 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window );
1814 gdk_window_set_role (GdkWindow *window,
1817 g_return_if_fail (GDK_IS_WINDOW (window));
1819 if (GDK_WINDOW_DESTROYED (window))
1826 * gdk_window_set_startup_id:
1827 * @window: a toplevel #GdkWindow
1828 * @startup_id: a string with startup-notification identifier
1830 * When using GTK+, typically you should use gtk_window_set_startup_id()
1831 * instead of this low-level function.
1837 gdk_window_set_startup_id (GdkWindow *window,
1838 const gchar *startup_id)
1843 gdk_window_set_transient_for (GdkWindow *window,
1846 GdkWindowObject *private;
1847 GdkWindowObject *root;
1850 g_return_if_fail (GDK_IS_WINDOW (window));
1851 g_return_if_fail (GDK_IS_WINDOW (parent));
1853 private = GDK_WINDOW_OBJECT (window);
1854 root = GDK_WINDOW_OBJECT (_gdk_parent_root);
1856 g_return_if_fail (GDK_WINDOW (private->parent) == _gdk_parent_root);
1857 g_return_if_fail (GDK_WINDOW (GDK_WINDOW_OBJECT (parent)->parent) == _gdk_parent_root);
1859 root->children = g_list_remove (root->children, window);
1861 i = g_list_index (root->children, parent);
1863 root->children = g_list_prepend (root->children, window);
1865 root->children = g_list_insert (root->children, window, i);
1869 gdk_directfb_window_set_background (GdkWindow *window,
1870 const GdkColor *color)
1872 GdkWindowObject *private;
1874 g_return_if_fail (GDK_IS_WINDOW (window));
1876 g_return_if_fail (color != NULL);
1878 D_DEBUG_AT( GDKDFB_Window, "%s( %p, %d,%d,%d )\n", __FUNCTION__, window, color->red, color->green, color->blue );
1880 private = GDK_WINDOW_OBJECT (window);
1881 private->bg_color = *color;
1883 if (private->bg_pixmap &&
1884 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1885 private->bg_pixmap != GDK_NO_BG)
1886 g_object_unref (private->bg_pixmap);
1888 private->bg_pixmap = NULL;
1892 gdk_directfb_window_set_back_pixmap (GdkWindow *window,
1894 gboolean parent_relative)
1896 GdkWindowObject *private;
1897 GdkPixmap *old_pixmap;
1899 g_return_if_fail (GDK_IS_WINDOW (window));
1900 g_return_if_fail (pixmap == NULL || !parent_relative);
1902 D_DEBUG_AT( GDKDFB_Window, "%s( %p, %p, %srelative )\n", __FUNCTION__,
1903 window, pixmap, parent_relative ? "" : "not " );
1905 private = GDK_WINDOW_OBJECT (window);
1906 old_pixmap = private->bg_pixmap;
1908 if (private->bg_pixmap &&
1909 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1910 private->bg_pixmap != GDK_NO_BG)
1912 g_object_unref (private->bg_pixmap);
1915 if (parent_relative)
1917 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1923 g_object_ref (pixmap);
1924 private->bg_pixmap = pixmap;
1928 private->bg_pixmap = GDK_NO_BG;
1934 gdk_directfb_window_set_cursor (GdkWindow *window,
1937 GdkWindowImplDirectFB *impl;
1938 GdkCursor *old_cursor;
1940 g_return_if_fail (GDK_IS_WINDOW (window));
1942 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1943 old_cursor = impl->cursor;
1945 impl->cursor = (cursor ?
1946 gdk_cursor_ref (cursor) : gdk_cursor_new (GDK_LEFT_PTR));
1948 if (gdk_window_at_pointer (NULL, NULL) == window)
1950 /* This is a bit evil but we want to keep all cursor changes in
1951 one place, so let gdk_directfb_window_send_crossing_events
1952 do the work for us. */
1954 gdk_directfb_window_send_crossing_events (window, window,
1955 GDK_CROSSING_NORMAL);
1957 else if (impl->window)
1959 GdkCursorDirectFB *dfb_cursor = (GdkCursorDirectFB *) impl->cursor;
1961 /* this branch takes care of setting the cursor for unmapped windows */
1963 impl->window->SetCursorShape (impl->window,
1965 dfb_cursor->hot_x, dfb_cursor->hot_y);
1969 gdk_cursor_unref (old_cursor);
1973 gdk_directfb_window_get_geometry (GdkWindow *window,
1980 GdkWindowObject *private;
1981 GdkDrawableImplDirectFB *impl;
1983 g_return_if_fail (GDK_IS_WINDOW (window));
1985 private = GDK_WINDOW_OBJECT (window);
1986 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1988 if (!GDK_WINDOW_DESTROYED (window))
1997 *width = impl->width;
2000 *height = impl->height;
2003 *depth = DFB_BITS_PER_PIXEL(impl->format);
2008 _gdk_directfb_calc_abs (GdkWindow *window)
2010 GdkWindowObject *private;
2011 GdkDrawableImplDirectFB *impl;
2014 g_return_if_fail (GDK_IS_WINDOW (window));
2016 private = GDK_WINDOW_OBJECT (window);
2017 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
2019 impl->abs_x = private->x;
2020 impl->abs_y = private->y;
2022 if (private->parent)
2024 GdkDrawableImplDirectFB *parent_impl =
2025 GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (private->parent)->impl);
2027 impl->abs_x += parent_impl->abs_x;
2028 impl->abs_y += parent_impl->abs_y;
2031 D_DEBUG_AT( GDKDFB_Window, "%s( %p ) -> %4d,%4d\n", __FUNCTION__, window, impl->abs_x, impl->abs_y );
2033 for (list = private->children; list; list = list->next)
2035 _gdk_directfb_calc_abs (list->data);
2040 gdk_directfb_window_get_origin (GdkWindow *window,
2044 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2046 if (!GDK_WINDOW_DESTROYED (window))
2048 GdkDrawableImplDirectFB *impl;
2050 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2064 gdk_window_get_deskrelative_origin (GdkWindow *window,
2068 return gdk_window_get_origin (window, x, y);
2072 gdk_window_get_root_origin (GdkWindow *window,
2076 GdkWindowObject *rover;
2078 g_return_if_fail (GDK_IS_WINDOW (window));
2080 rover = (GdkWindowObject*) window;
2086 if (GDK_WINDOW_DESTROYED (window))
2089 while (rover->parent && ((GdkWindowObject*) rover->parent)->parent)
2090 rover = (GdkWindowObject *) rover->parent;
2091 if (rover->destroyed)
2101 _gdk_windowing_window_get_pointer (GdkDisplay *display,
2105 GdkModifierType *mask)
2107 GdkWindow *retval = NULL;
2108 gint rx, ry, wx, wy;
2109 GdkDrawableImplDirectFB *impl;
2111 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
2114 window = _gdk_parent_root;
2116 gdk_directfb_mouse_get_info (&rx, &ry, mask);
2120 retval = gdk_directfb_child_at (_gdk_parent_root, &wx, &wy);
2122 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2125 *x = rx - impl->abs_x;
2127 *y = ry - impl->abs_y;
2133 _gdk_windowing_window_at_pointer (GdkDisplay *display,
2140 if (!win_x || !win_y)
2141 gdk_directfb_mouse_get_info (&wx, &wy, NULL);
2149 retval = gdk_directfb_child_at (_gdk_parent_root, &wx, &wy);
2161 _gdk_windowing_get_pointer (GdkDisplay *display,
2165 GdkModifierType *mask)
2169 *screen = gdk_display_get_default_screen (display);
2171 _gdk_windowing_window_get_pointer (display,
2172 _gdk_windowing_window_at_pointer(display,NULL,NULL),x,y,mask);
2177 gdk_directfb_window_get_events (GdkWindow *window)
2179 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
2181 if (GDK_WINDOW_DESTROYED (window))
2184 return GDK_WINDOW_OBJECT (window)->event_mask;
2188 gdk_directfb_window_set_events (GdkWindow *window,
2189 GdkEventMask event_mask)
2191 g_return_if_fail (GDK_IS_WINDOW (window));
2193 if (event_mask & GDK_BUTTON_MOTION_MASK)
2194 event_mask |= (GDK_BUTTON1_MOTION_MASK |
2195 GDK_BUTTON2_MOTION_MASK |
2196 GDK_BUTTON3_MOTION_MASK);
2198 GDK_WINDOW_OBJECT (window)->event_mask = event_mask;
2202 gdk_directfb_window_shape_combine_mask (GdkWindow *window,
2210 gdk_window_input_shape_combine_mask (GdkWindow *window,
2218 gdk_directfb_window_shape_combine_region (GdkWindow *window,
2219 const GdkRegion *shape_region,
2226 gdk_window_input_shape_combine_region (GdkWindow *window,
2227 const GdkRegion *shape_region,
2234 gdk_window_set_override_redirect (GdkWindow *window,
2235 gboolean override_redirect)
2237 g_return_if_fail (GDK_IS_WINDOW (window));
2239 if (GDK_WINDOW_DESTROYED (window))
2246 gdk_window_set_icon_list (GdkWindow *window,
2249 g_return_if_fail (GDK_IS_WINDOW (window));
2251 if (GDK_WINDOW_DESTROYED (window))
2258 gdk_window_set_icon (GdkWindow *window,
2259 GdkWindow *icon_window,
2263 g_return_if_fail (GDK_IS_WINDOW (window));
2265 if (GDK_WINDOW_DESTROYED (window))
2272 gdk_window_set_icon_name (GdkWindow *window,
2275 g_return_if_fail (GDK_IS_WINDOW (window));
2277 if (GDK_WINDOW_DESTROYED (window))
2284 gdk_window_iconify (GdkWindow *window)
2286 g_return_if_fail (GDK_IS_WINDOW (window));
2288 if (GDK_WINDOW_DESTROYED (window))
2291 gdk_window_hide (window);
2295 gdk_window_deiconify (GdkWindow *window)
2297 g_return_if_fail (GDK_IS_WINDOW (window));
2299 if (GDK_WINDOW_DESTROYED (window))
2302 gdk_window_show (window);
2306 gdk_window_stick (GdkWindow *window)
2308 g_return_if_fail (GDK_IS_WINDOW (window));
2310 if (GDK_WINDOW_DESTROYED (window))
2317 gdk_window_unstick (GdkWindow *window)
2319 g_return_if_fail (GDK_IS_WINDOW (window));
2321 if (GDK_WINDOW_DESTROYED (window))
2328 gdk_directfb_window_set_opacity (GdkWindow *window,
2331 GdkWindowImplDirectFB *impl;
2333 g_return_if_fail (GDK_IS_WINDOW (window));
2335 if (GDK_WINDOW_DESTROYED (window))
2338 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2340 impl->opacity = opacity;
2342 if (impl->window && GDK_WINDOW_IS_MAPPED (window))
2344 if (gdk_directfb_apply_focus_opacity &&
2345 window == gdk_directfb_focused_window)
2346 impl->window->SetOpacity (impl->window,
2347 (impl->opacity >> 1) + (impl->opacity >> 2));
2349 impl->window->SetOpacity (impl->window, impl->opacity);
2354 gdk_window_focus (GdkWindow *window,
2357 GdkWindow *toplevel;
2359 g_return_if_fail (GDK_IS_WINDOW (window));
2361 if (GDK_WINDOW_DESTROYED (window))
2364 toplevel = gdk_directfb_window_find_toplevel (window);
2365 if (toplevel != _gdk_parent_root)
2367 GdkWindowImplDirectFB *impl;
2369 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (toplevel)->impl);
2371 impl->window->RequestFocus (impl->window);
2376 gdk_window_maximize (GdkWindow *window)
2378 g_return_if_fail (GDK_IS_WINDOW (window));
2380 if (GDK_WINDOW_DESTROYED (window))
2387 gdk_window_unmaximize (GdkWindow *window)
2389 g_return_if_fail (GDK_IS_WINDOW (window));
2391 if (GDK_WINDOW_DESTROYED (window))
2398 gdk_window_set_type_hint (GdkWindow *window,
2399 GdkWindowTypeHint hint)
2401 g_return_if_fail (GDK_IS_WINDOW (window));
2403 if (GDK_WINDOW_DESTROYED (window))
2406 GDK_NOTE (MISC, g_print ("gdk_window_set_type_hint: 0x%x: %d\n",
2407 GDK_WINDOW_DFB_ID (window), hint));
2409 ((GdkWindowImplDirectFB *)((GdkWindowObject *)window)->impl)->type_hint = hint;
2416 gdk_window_get_type_hint (GdkWindow *window)
2418 g_return_val_if_fail (GDK_IS_WINDOW (window), GDK_WINDOW_TYPE_HINT_NORMAL);
2420 if (GDK_WINDOW_DESTROYED (window))
2421 return GDK_WINDOW_TYPE_HINT_NORMAL;
2423 return GDK_WINDOW_IMPL_DIRECTFB (((GdkWindowObject *) window)->impl)->type_hint;
2427 gdk_window_set_modal_hint (GdkWindow *window,
2430 GdkWindowImplDirectFB *impl;
2432 g_return_if_fail (GDK_IS_WINDOW (window));
2434 if (GDK_WINDOW_DESTROYED (window))
2437 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2441 impl->window->SetStackingClass (impl->window,
2442 modal ? DWSC_UPPER : DWSC_MIDDLE);
2447 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
2448 gboolean skips_taskbar)
2450 g_return_if_fail (GDK_IS_WINDOW (window));
2454 gdk_window_set_skip_pager_hint (GdkWindow *window,
2455 gboolean skips_pager)
2457 g_return_if_fail (GDK_IS_WINDOW (window));
2462 gdk_window_set_group (GdkWindow *window,
2465 g_return_if_fail (GDK_IS_WINDOW (window));
2466 g_return_if_fail (GDK_IS_WINDOW (leader));
2467 g_warning(" DirectFb set_group groups not supported \n");
2469 if (GDK_WINDOW_DESTROYED (window))
2475 GdkWindow * gdk_window_get_group (GdkWindow *window)
2477 g_warning(" DirectFb get_group groups not supported \n");
2482 gdk_fb_window_set_child_handler (GdkWindow *window,
2483 GdkWindowChildChanged changed,
2484 GdkWindowChildGetPos get_pos,
2487 GdkWindowChildHandlerData *data;
2489 g_return_if_fail (GDK_IS_WINDOW (window));
2491 data = g_new (GdkWindowChildHandlerData, 1);
2492 data->changed = changed;
2493 data->get_pos = get_pos;
2494 data->user_data = user_data;
2496 g_object_set_data_full (G_OBJECT (window), "gdk-window-child-handler",
2497 data, (GDestroyNotify) g_free);
2501 gdk_window_set_decorations (GdkWindow *window,
2502 GdkWMDecoration decorations)
2504 GdkWMDecoration *dec;
2506 g_return_if_fail (GDK_IS_WINDOW (window));
2508 dec = g_new (GdkWMDecoration, 1);
2511 g_object_set_data_full (G_OBJECT (window), "gdk-window-decorations",
2512 dec, (GDestroyNotify) g_free);
2516 gdk_window_get_decorations (GdkWindow *window,
2517 GdkWMDecoration *decorations)
2519 GdkWMDecoration *dec;
2521 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2523 dec = g_object_get_data (G_OBJECT (window), "gdk-window-decorations");
2526 *decorations = *dec;
2533 gdk_window_set_functions (GdkWindow *window,
2534 GdkWMFunction functions)
2536 g_return_if_fail (GDK_IS_WINDOW (window));
2538 if (GDK_WINDOW_DESTROYED (window))
2542 g_message("unimplemented %s", __FUNCTION__);
2546 gdk_directfb_window_set_child_shapes (GdkWindow *window)
2551 gdk_directfb_window_merge_child_shapes (GdkWindow *window)
2556 gdk_window_set_child_input_shapes (GdkWindow *window)
2561 gdk_window_merge_child_input_shapes (GdkWindow *window)
2566 gdk_directfb_window_set_static_gravities (GdkWindow *window,
2567 gboolean use_static)
2569 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2571 if (GDK_WINDOW_DESTROYED (window))
2575 g_message("unimplemented %s", __FUNCTION__);
2581 gdk_window_begin_resize_drag (GdkWindow *window,
2588 g_return_if_fail (GDK_IS_WINDOW (window));
2590 if (GDK_WINDOW_DESTROYED (window))
2593 g_message("unimplemented %s", __FUNCTION__);
2597 gdk_window_begin_move_drag (GdkWindow *window,
2603 g_return_if_fail (GDK_IS_WINDOW (window));
2605 if (GDK_WINDOW_DESTROYED (window))
2608 g_message("unimplemented %s", __FUNCTION__);
2612 * gdk_window_get_frame_extents:
2613 * @window: a #GdkWindow
2614 * @rect: rectangle to fill with bounding box of the window frame
2616 * Obtains the bounding box of the window, including window manager
2617 * titlebar/borders if any. The frame position is given in root window
2618 * coordinates. To get the position of the window itself (rather than
2619 * the frame) in root window coordinates, use gdk_window_get_origin().
2623 gdk_window_get_frame_extents (GdkWindow *window,
2626 GdkWindowObject *private;
2627 GdkDrawableImplDirectFB *impl;
2629 g_return_if_fail (GDK_IS_WINDOW (window));
2630 g_return_if_fail (rect != NULL);
2632 if (GDK_WINDOW_DESTROYED (window))
2635 private = GDK_WINDOW_OBJECT (window);
2637 while (private->parent && ((GdkWindowObject*) private->parent)->parent)
2638 private = (GdkWindowObject*) private->parent;
2639 if (GDK_WINDOW_DESTROYED (window))
2642 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
2644 rect->x = impl->abs_x;
2645 rect->y = impl->abs_y;
2646 rect->width = impl->width;
2647 rect->height = impl->height;
2651 * Given a directfb window and a subsurface of that window
2652 * create a gdkwindow child wrapper
2654 GdkWindow *gdk_directfb_create_child_window(GdkWindow *parent,
2655 IDirectFBSurface *subsurface)
2658 GdkWindowObject *private;
2659 GdkWindowObject *parent_private;
2660 GdkWindowImplDirectFB *impl;
2661 GdkWindowImplDirectFB *parent_impl;
2664 g_return_val_if_fail (parent != NULL, NULL);
2666 window = g_object_new (GDK_TYPE_WINDOW, NULL);
2667 private = GDK_WINDOW_OBJECT (window);
2668 private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
2669 parent_private = GDK_WINDOW_OBJECT (parent);
2670 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
2671 private->parent = parent_private;
2673 subsurface->GetPosition(subsurface,&x,&y);
2674 subsurface->GetSize(subsurface,&w,&h);
2676 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2677 impl->drawable.wrapper = GDK_DRAWABLE (window);
2682 _gdk_directfb_calc_abs (window);
2684 impl->drawable.width = w;
2685 impl->drawable.height = h;
2686 private->window_type = GDK_WINDOW_CHILD;
2687 impl->drawable.surface = subsurface;
2688 impl->drawable.format = parent_impl->drawable.format;
2689 private->depth = parent_private->depth;
2690 gdk_drawable_set_colormap (GDK_DRAWABLE (window),
2691 gdk_drawable_get_colormap (parent));
2692 gdk_window_set_cursor (window, NULL);
2693 parent_private->children = g_list_prepend (parent_private->children,window);
2694 /*we hold a reference count on ourselves */
2695 g_object_ref (window);
2702 * The wrapping is not perfect since directfb does not give full access
2703 * to the current state of a window event mask etc need to fix dfb
2706 gdk_window_foreign_new_for_display (GdkDisplay* display,GdkNativeWindow anid)
2708 GdkWindow *window = NULL;
2709 GdkWindow *parent =NULL;
2710 GdkWindowObject *private =NULL;
2711 GdkWindowObject *parent_private =NULL;
2712 GdkWindowImplDirectFB *parent_impl =NULL;
2713 GdkWindowImplDirectFB *impl =NULL;
2714 DFBWindowOptions options;
2716 GdkDisplayDFB * gdkdisplay = _gdk_display;
2717 IDirectFBWindow *dfbwindow;
2719 window = gdk_window_lookup (anid);
2722 g_object_ref (window);
2725 if( display != NULL )
2726 gdkdisplay = GDK_DISPLAY_DFB(display);
2728 ret = gdkdisplay->layer->GetWindow (gdkdisplay->layer,
2729 (DFBWindowID)anid,&dfbwindow);
2731 if (ret != DFB_OK) {
2732 DirectFBError ("gdk_window_new: Layer->GetWindow failed", ret);
2736 parent = _gdk_parent_root;
2739 parent_private = GDK_WINDOW_OBJECT (parent);
2740 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
2743 window = g_object_new (GDK_TYPE_WINDOW, NULL);
2744 /* we hold a reference count on ourselves */
2745 g_object_ref (window);
2746 private = GDK_WINDOW_OBJECT (window);
2747 private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
2748 private->parent = parent_private;
2749 private->window_type = GDK_WINDOW_TOPLEVEL;
2750 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2752 impl->drawable.wrapper = GDK_DRAWABLE (window);
2753 impl->window = dfbwindow;
2754 dfbwindow->GetOptions(dfbwindow,&options);
2755 dfbwindow->GetPosition(dfbwindow,&private->x,&private->y);
2756 dfbwindow->GetSize(dfbwindow,&impl->drawable.width,&impl->drawable.height);
2759 private->input_only = FALSE;
2761 if( dfbwindow->GetSurface (dfbwindow, &impl->drawable.surface) == DFB_UNSUPPORTED ){
2762 private->input_only = TRUE;
2763 impl->drawable.surface = NULL;
2766 * Position ourselevs
2768 _gdk_directfb_calc_abs (window);
2770 /* We default to all events least surprise to the user
2771 * minus the poll for motion events
2773 gdk_window_set_events (window, (GDK_ALL_EVENTS_MASK ^ GDK_POINTER_MOTION_HINT_MASK));
2775 if (impl->drawable.surface)
2777 impl->drawable.surface->GetPixelFormat (impl->drawable.surface,
2778 &impl->drawable.format);
2780 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
2782 gdk_drawable_set_colormap (GDK_DRAWABLE (window), gdk_drawable_get_colormap (parent));
2784 gdk_drawable_set_colormap (GDK_DRAWABLE (window), gdk_colormap_get_system());
2787 //can be null for the soft cursor window itself when
2788 //running a gtk directfb wm
2789 if( gdk_display_get_default() != NULL ) {
2790 gdk_window_set_cursor (window,NULL);
2794 parent_private->children = g_list_prepend (parent_private->children,
2796 impl->dfb_id = (DFBWindowID)anid;
2797 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
2798 gdk_directfb_event_windows_add (window);
2804 gdk_window_lookup_for_display (GdkDisplay *display,GdkNativeWindow anid)
2806 return gdk_directfb_window_id_table_lookup ((DFBWindowID) anid);
2810 gdk_window_lookup (GdkNativeWindow anid)
2812 return gdk_directfb_window_id_table_lookup ((DFBWindowID) anid);
2815 IDirectFBWindow *gdk_directfb_window_lookup(GdkWindow *window )
2817 GdkWindowObject *private;
2818 GdkWindowImplDirectFB *impl;
2819 g_return_val_if_fail (GDK_IS_WINDOW (window),NULL);
2820 private = GDK_WINDOW_OBJECT (window);
2821 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2822 return impl->window;
2825 IDirectFBSurface *gdk_directfb_surface_lookup(GdkWindow *window)
2827 GdkWindowObject *private;
2828 GdkWindowImplDirectFB *impl;
2829 g_return_val_if_fail (GDK_IS_WINDOW (window),NULL);
2830 private = GDK_WINDOW_OBJECT (window);
2831 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2832 return impl->drawable.surface;
2836 gdk_window_fullscreen (GdkWindow *window)
2838 g_return_if_fail (GDK_IS_WINDOW (window));
2839 g_warning ("gdk_window_fullscreen() not implemented.\n");
2843 gdk_window_unfullscreen (GdkWindow *window)
2845 g_return_if_fail (GDK_IS_WINDOW (window));
2846 /* g_warning ("gdk_window_unfullscreen() not implemented.\n");*/
2850 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
2852 g_return_if_fail (GDK_IS_WINDOW (window));
2853 static gboolean first_call = TRUE;
2855 g_warning ("gdk_window_set_keep_above() not implemented.\n");
2862 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
2864 g_return_if_fail (GDK_IS_WINDOW (window));
2865 static gboolean first_call = TRUE;
2867 g_warning ("gdk_window_set_keep_below() not implemented.\n");
2874 gdk_window_enable_synchronized_configure (GdkWindow *window)
2879 gdk_window_configure_finished (GdkWindow *window)
2884 gdk_display_warp_pointer (GdkDisplay *display,
2889 g_warning ("gdk_display_warp_pointer() not implemented.\n");
2893 gdk_window_set_urgency_hint (GdkWindow *window,
2896 g_return_if_fail (GDK_IS_WINDOW (window));
2897 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD);
2899 if (GDK_WINDOW_DESTROYED (window))
2902 g_warning ("gdk_window_set_urgency_hint() not implemented.\n");
2907 gdk_window_impl_directfb_invalidate_maybe_recurse (GdkPaintable *paintable,
2908 const GdkRegion *region,
2909 gboolean (*child_func) (GdkWindow *, gpointer),
2913 GdkWindowObject *private;
2914 GdkWindowImplDirectFB *wimpl;
2915 GdkDrawableImplDirectFB *impl;
2917 wimpl = GDK_WINDOW_IMPL_DIRECTFB (paintable);
2918 impl = (GdkDrawableImplDirectFB *)wimpl;
2919 window = wimpl->gdkWindow;
2920 private = (GdkWindowObject *)window;
2922 GdkRegion visible_region;
2925 g_return_if_fail (window != NULL);
2926 g_return_if_fail (GDK_IS_WINDOW (window));
2928 if (GDK_WINDOW_DESTROYED (window))
2931 if (private->input_only || !GDK_WINDOW_IS_MAPPED (window))
2934 temp_region_init_rectangle_vals( &visible_region, 0, 0, impl->width, impl->height );
2935 gdk_region_intersect (&visible_region, region);
2937 tmp_list = private->children;
2940 GdkWindowObject *child = tmp_list->data;
2941 GdkDrawableImplDirectFB *cimpl = (GdkDrawableImplDirectFB *) child->impl;
2943 if (!child->input_only)
2945 GdkRegion child_region;
2947 temp_region_init_rectangle_vals( &child_region, child->x, child->y, cimpl->width, cimpl->height );
2949 /* remove child area from the invalid area of the parent */
2950 if (GDK_WINDOW_IS_MAPPED (child) && !child->shaped)
2951 gdk_region_subtract (&visible_region, &child_region);
2953 if (child_func && (*child_func) ((GdkWindow *)child, user_data))
2955 gdk_region_intersect (&child_region, region);
2956 gdk_region_offset (&child_region, - child->x, - child->y);
2958 gdk_window_invalidate_maybe_recurse ((GdkWindow *)child,
2959 &child_region, child_func, user_data);
2962 temp_region_deinit( &child_region );
2965 tmp_list = tmp_list->next;
2968 if (!gdk_region_empty (&visible_region))
2971 if (private->update_area)
2973 gdk_region_union (private->update_area, &visible_region);
2977 update_windows = g_slist_prepend (update_windows, window);
2978 private->update_area = gdk_region_copy (&visible_region);
2979 gdk_window_schedule_update (window);
2983 temp_region_deinit( &visible_region );
2988 gdk_window_impl_directfb_process_updates (GdkPaintable *paintable,
2989 gboolean update_children)
2991 GdkWindowImplDirectFB *wimpl;
2992 GdkDrawableImplDirectFB *impl;
2994 GdkWindowObject *private;
2995 GdkRegion *update_area;
2997 wimpl = GDK_WINDOW_IMPL_DIRECTFB (paintable);
2998 impl = (GdkDrawableImplDirectFB *)wimpl;
2999 window = wimpl->gdkWindow;
3000 private = (GdkWindowObject *)window;
3002 D_DEBUG_AT( GDKDFB_Paintable, "%s( %p, %schildren )\n", __FUNCTION__,
3003 paintable, update_children ? "update " : "no " );
3005 /* If an update got queued during update processing, we can get a
3006 * window in the update queue that has an empty update_area.
3009 if (!private->update_area)
3012 update_area = private->update_area;
3013 private->update_area = NULL;
3015 D_DEBUG_AT( GDKDFB_Paintable, " -> update area %4d,%4d-%4dx%4d\n",
3016 GDKDFB_RECTANGLE_VALS_FROM_BOX( &update_area->extents ) );
3018 if (_gdk_event_func && gdk_window_is_viewable (window))
3020 GdkRegion *expose_region = update_area;
3021 GdkRegion window_region;
3023 temp_region_init_rectangle_vals( &window_region, 0, 0, impl->width, impl->height );
3024 gdk_region_intersect( expose_region, &window_region );
3025 temp_region_deinit (&window_region);
3027 if (!gdk_region_empty (expose_region) && (private->event_mask & GDK_EXPOSURE_MASK))
3031 event.expose.type = GDK_EXPOSE;
3032 event.expose.window = g_object_ref (window);
3033 event.expose.send_event = FALSE;
3034 event.expose.count = 0;
3035 event.expose.region = expose_region;
3036 gdk_region_get_clipbox (expose_region, &event.expose.area);
3037 (*_gdk_event_func) (&event, _gdk_event_data);
3039 g_object_unref (window);
3042 if (expose_region != update_area)
3043 gdk_region_destroy (expose_region);
3046 gdk_region_destroy (update_area);
3051 gdk_window_impl_directfb_begin_paint_region (GdkPaintable *paintable,
3052 const GdkRegion *region)
3054 GdkDrawableImplDirectFB *impl;
3055 GdkWindowImplDirectFB *wimpl;
3059 g_assert (region != NULL );
3060 wimpl = GDK_WINDOW_IMPL_DIRECTFB (paintable);
3061 impl = (GdkDrawableImplDirectFB *)wimpl;
3066 D_DEBUG_AT( GDKDFB_Window, "%s( %p ) <- %4d,%4d-%4d,%4d (%ld boxes)\n", __FUNCTION__,
3067 paintable, GDKDFB_RECTANGLE_VALS_FROM_BOX(®ion->extents), region->numRects );
3069 /* When it's buffered... */
3072 /* ...we're already painting on it! */
3073 g_assert( impl->paint_depth > 0 );
3075 D_DEBUG_AT( GDKDFB_Window, " -> painted %4d,%4d-%4dx%4d (%ld boxes)\n",
3076 DFB_RECTANGLE_VALS_FROM_REGION( &impl->paint_region.extents ), impl->paint_region.numRects );
3078 /* Add the new region to the paint region... */
3079 gdk_region_union (&impl->paint_region, region);
3083 /* ...otherwise it's the first time! */
3084 g_assert( impl->paint_depth == 0 );
3086 /* Generate the clip region for painting around child windows. */
3087 gdk_directfb_clip_region( GDK_DRAWABLE(paintable), NULL, NULL, &impl->clip_region );
3089 /* Initialize the paint region with the new one... */
3090 temp_region_init_copy( &impl->paint_region, region );
3092 impl->buffered = TRUE;
3095 D_DEBUG_AT( GDKDFB_Window, " -> painting %4d,%4d-%4dx%4d (%ld boxes)\n",
3096 DFB_RECTANGLE_VALS_FROM_REGION( &impl->paint_region.extents ), impl->paint_region.numRects );
3098 /* ...but clip the initial/compound result against the clip region. */
3099 gdk_region_intersect (&impl->paint_region, &impl->clip_region);
3101 D_DEBUG_AT( GDKDFB_Window, " -> clipped %4d,%4d-%4dx%4d (%ld boxes)\n",
3102 DFB_RECTANGLE_VALS_FROM_REGION( &impl->paint_region.extents ), impl->paint_region.numRects );
3104 impl->paint_depth++;
3106 D_DEBUG_AT( GDKDFB_Window, " -> depth is now %d\n", impl->paint_depth );
3108 for (i = 0; i < region->numRects; i++)
3110 GdkRegionBox *box = ®ion->rects[i];
3112 D_DEBUG_AT( GDKDFB_Window, " -> [%2d] %4d,%4d-%4dx%4d\n", i, GDKDFB_RECTANGLE_VALS_FROM_BOX( box ) );
3114 gdk_window_clear_area (GDK_WINDOW(wimpl->gdkWindow),
3123 gdk_window_impl_directfb_end_paint (GdkPaintable *paintable)
3125 GdkDrawableImplDirectFB *impl;
3127 impl = GDK_DRAWABLE_IMPL_DIRECTFB (paintable);
3129 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, paintable );
3131 g_return_if_fail (impl->paint_depth > 0);
3133 g_assert( impl->buffered );
3135 impl->paint_depth--;
3137 #ifdef GDK_DIRECTFB_NO_EXPERIMENTS
3138 if (impl->paint_depth == 0)
3140 impl->buffered = FALSE;
3142 if (impl->paint_region.numRects)
3144 DFBRegion reg = { impl->paint_region.extents.x1,
3145 impl->paint_region.extents.y1,
3146 impl->paint_region.extents.x2-1,
3147 impl->paint_region.extents.y2-1 };
3149 D_DEBUG_AT( GDKDFB_Window, " -> flip %4d,%4d-%4dx%4d (%ld boxes)\n",
3150 DFB_RECTANGLE_VALS_FROM_REGION( ® ), impl->paint_region.numRects );
3152 impl->surface->Flip( impl->surface, ®, 0 );
3154 temp_region_reset( &impl->paint_region );
3158 if (impl->paint_depth == 0)
3160 impl->buffered = FALSE;
3162 temp_region_deinit( &impl->clip_region );
3164 if (impl->paint_region.numRects)
3166 GdkWindow *window = GDK_WINDOW( impl->wrapper );
3168 if (GDK_IS_WINDOW(window))
3170 GdkWindowObject *top = GDK_WINDOW_OBJECT( gdk_window_get_toplevel( window ) );
3175 GdkWindowImplDirectFB *wimpl = GDK_WINDOW_IMPL_DIRECTFB (top->impl);
3177 reg.x1 = impl->abs_x - top->x + impl->paint_region.extents.x1;
3178 reg.y1 = impl->abs_y - top->y + impl->paint_region.extents.y1;
3179 reg.x2 = impl->abs_x - top->x + impl->paint_region.extents.x2 - 1;
3180 reg.y2 = impl->abs_y - top->y + impl->paint_region.extents.y2 - 1;
3182 D_DEBUG_AT( GDKDFB_Window, " -> queue flip %4d,%4d-%4dx%4d (%ld boxes)\n",
3183 DFB_RECTANGLE_VALS_FROM_REGION( ® ), impl->paint_region.numRects );
3185 dfb_updates_add( &wimpl->flips, ® );
3189 temp_region_reset( &impl->paint_region );
3194 D_DEBUG_AT( GDKDFB_Window, " -> depth is still %d\n", impl->paint_depth );
3199 gdk_window_impl_directfb_paintable_init (GdkPaintableIface *iface)
3201 iface->begin_paint_region = gdk_window_impl_directfb_begin_paint_region;
3202 iface->end_paint = gdk_window_impl_directfb_end_paint;
3204 iface->invalidate_maybe_recurse = gdk_window_impl_directfb_invalidate_maybe_recurse;
3205 iface->process_updates = gdk_window_impl_directfb_process_updates;
3209 gdk_window_beep (GdkWindow *window)
3211 gdk_display_beep (gdk_display_get_default());
3215 gdk_window_set_opacity (GdkWindow *window,
3218 GdkDisplay *display;
3221 g_return_if_fail (GDK_IS_WINDOW (window));
3223 if (GDK_WINDOW_DESTROYED (window))
3226 display = gdk_drawable_get_display (window);
3230 else if (opacity > 1)
3232 cardinal = opacity * 0xff;
3233 gdk_directfb_window_set_opacity(window,cardinal);
3237 _gdk_windowing_window_set_composited (GdkWindow *window,
3238 gboolean composited)
3243 gdk_window_impl_iface_init (GdkWindowImplIface *iface)
3245 iface->show = gdk_directfb_window_show;
3246 iface->hide = gdk_directfb_window_hide;
3247 iface->withdraw = gdk_directfb_window_withdraw;
3248 iface->raise = gdk_window_directfb_raise;
3249 iface->lower = gdk_window_directfb_lower;
3250 iface->move_resize = gdk_directfb_window_move_resize;
3251 iface->move_region = _gdk_directfb_window_move_region;
3252 iface->scroll = _gdk_directfb_window_scroll;
3253 iface->clear_area = gdk_directfb_window_clear_area;
3254 iface->set_background = gdk_directfb_window_set_background;
3255 iface->set_back_pixmap = gdk_directfb_window_set_back_pixmap;
3256 iface->get_events = gdk_directfb_window_get_events;
3257 iface->set_events = gdk_directfb_window_set_events;
3258 iface->reparent = gdk_directfb_window_reparent;
3259 iface->set_cursor = gdk_directfb_window_set_cursor;
3260 iface->get_geometry = gdk_directfb_window_get_geometry;
3261 iface->get_origin = gdk_directfb_window_get_origin;
3262 iface->get_offsets = _gdk_directfb_window_get_offsets;
3263 iface->shape_combine_mask = gdk_directfb_window_shape_combine_mask;
3264 iface->shape_combine_region = gdk_directfb_window_shape_combine_region;
3265 iface->set_child_shapes = gdk_directfb_window_set_child_shapes;
3266 iface->merge_child_shapes = gdk_directfb_window_merge_child_shapes;
3267 iface->set_static_gravities = gdk_directfb_window_set_static_gravities;
3270 #define __GDK_WINDOW_X11_C__
3271 #include "gdkaliasdef.c"