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 );
107 if (private->update_freeze_count)
109 D_DEBUG_AT( GDKDFB_Updates, " -> %p frozen [%4d,%4d-%4dx%4d] (%d boxes)\n",
110 private, DFB_RECTANGLE_VALS_FROM_REGION( &wimpl->flips.bounding ),
111 wimpl->flips.num_regions );
112 update_windows = g_slist_prepend (update_windows, private);
116 D_DEBUG_AT( GDKDFB_Updates, " -> %p update [%4d,%4d-%4dx%4d] (%d boxes)\n",
117 private, DFB_RECTANGLE_VALS_FROM_REGION( &wimpl->flips.bounding ),
118 wimpl->flips.num_regions );
119 gdk_window_process_updates(tmp_list->data,TRUE);
122 g_object_unref (tmp_list->data);
123 tmp_list = tmp_list->next;
126 #ifndef GDK_DIRECTFB_NO_EXPERIMENTS
127 g_slist_foreach (old_update_windows, (GFunc)g_object_ref, NULL);
128 tmp_list = old_update_windows;
131 GdkWindowObject *top = GDK_WINDOW_OBJECT( gdk_window_get_toplevel( tmp_list->data ) );
135 GdkWindowImplDirectFB *wimpl = GDK_WINDOW_IMPL_DIRECTFB (top->impl);
137 if (wimpl->flips.num_regions)
139 D_DEBUG_AT( GDKDFB_Updates, " -> %p flip [%4d,%4d-%4dx%4d] (%d boxes)\n",
140 top, DFB_RECTANGLE_VALS_FROM_REGION( &wimpl->flips.bounding ),
141 wimpl->flips.num_regions );
143 wimpl->drawable.surface->Flip( wimpl->drawable.surface, &wimpl->flips.bounding, DSFLIP_NONE );
145 dfb_updates_reset( &wimpl->flips );
148 D_DEBUG_AT( GDKDFB_Updates, " -> %p has no flips!\n", top );
151 D_DEBUG_AT( GDKDFB_Updates, " -> %p has no top level window!\n", tmp_list->data );
153 g_object_unref (tmp_list->data);
154 tmp_list = tmp_list->next;
158 g_slist_free (old_update_windows);
162 gdk_window_update_idle (gpointer data)
164 gdk_window_directfb_process_all_updates ();
170 gdk_window_schedule_update (GdkWindow *window)
172 D_DEBUG_AT( GDKDFB_Updates, "%s( %p ) <- freeze count %d\n", __FUNCTION__, window,
173 window ? GDK_WINDOW_OBJECT (window)->update_freeze_count : -1 );
175 if (window && GDK_WINDOW_OBJECT (window)->update_freeze_count)
180 D_DEBUG_AT( GDKDFB_Updates, " -> adding idle callback\n" );
182 update_idle = gdk_threads_add_idle_full (GDK_PRIORITY_REDRAW,
183 gdk_window_update_idle, NULL, NULL);
188 static GdkWindow *gdk_directfb_window_containing_pointer = NULL;
189 static GdkWindow *gdk_directfb_focused_window = NULL;
190 static gpointer parent_class = NULL;
191 GdkWindow * _gdk_parent_root = NULL;
193 static void gdk_window_impl_directfb_paintable_init (GdkPaintableIface *iface);
197 gdk_window_impl_directfb_get_type (void)
199 static GType object_type = 0;
203 static const GTypeInfo object_info =
205 sizeof (GdkWindowImplDirectFBClass),
206 (GBaseInitFunc) NULL,
207 (GBaseFinalizeFunc) NULL,
208 (GClassInitFunc) gdk_window_impl_directfb_class_init,
209 NULL, /* class_finalize */
210 NULL, /* class_data */
211 sizeof (GdkWindowImplDirectFB),
213 (GInstanceInitFunc) gdk_window_impl_directfb_init,
216 static const GInterfaceInfo paintable_info =
218 (GInterfaceInitFunc) gdk_window_impl_directfb_paintable_init,
223 static const GInterfaceInfo window_impl_info =
225 (GInterfaceInitFunc) gdk_window_impl_iface_init,
230 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_DIRECTFB,
231 "GdkWindowImplDirectFB",
233 g_type_add_interface_static (object_type,
237 g_type_add_interface_static (object_type,
238 GDK_TYPE_WINDOW_IMPL,
246 _gdk_window_impl_get_type (void)
248 return gdk_window_impl_directfb_get_type ();
252 gdk_window_impl_directfb_init (GdkWindowImplDirectFB *impl)
254 impl->drawable.width = 1;
255 impl->drawable.height = 1;
256 //cannot use gdk_cursor_new here since gdk_display_get_default
258 impl->cursor = gdk_cursor_new_for_display (GDK_DISPLAY_OBJECT(_gdk_display),GDK_LEFT_PTR);
263 gdk_window_impl_directfb_class_init (GdkWindowImplDirectFBClass *klass)
265 GObjectClass *object_class = G_OBJECT_CLASS (klass);
266 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
268 parent_class = g_type_class_peek_parent (klass);
270 object_class->finalize = gdk_window_impl_directfb_finalize;
272 drawable_class->set_colormap = gdk_window_impl_directfb_set_colormap;
274 /* Visible and clip regions are the same */
276 drawable_class->get_clip_region =
277 gdk_window_impl_directfb_get_visible_region;
279 drawable_class->get_visible_region =
280 gdk_window_impl_directfb_get_visible_region;
284 g_free_2nd (gpointer a,
292 gdk_window_impl_directfb_finalize (GObject *object)
294 GdkWindowImplDirectFB *impl = GDK_WINDOW_IMPL_DIRECTFB (object);
296 D_DEBUG_AT( GDKDFB_Window, "%s( %p ) <- %dx%d\n", __FUNCTION__, impl, impl->drawable.width, impl->drawable.height );
298 if (GDK_WINDOW_IS_MAPPED (impl->drawable.wrapper))
299 gdk_window_hide (impl->drawable.wrapper);
302 gdk_cursor_unref (impl->cursor);
304 if (impl->properties)
306 g_hash_table_foreach (impl->properties, g_free_2nd, NULL);
307 g_hash_table_destroy (impl->properties);
311 gdk_directfb_window_id_table_remove (impl->dfb_id);
312 /* native window resource must be release before we can finalize !*/
316 if (G_OBJECT_CLASS (parent_class)->finalize)
317 G_OBJECT_CLASS (parent_class)->finalize (object);
321 gdk_window_impl_directfb_get_visible_region (GdkDrawable *drawable)
323 GdkDrawableImplDirectFB *priv = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
324 GdkRectangle rect = { 0, 0, 0, 0 };
325 DFBRectangle drect = { 0, 0, 0, 0 };
327 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, drawable );
330 priv->surface->GetVisibleRectangle (priv->surface, &drect);
336 D_DEBUG_AT( GDKDFB_Window, " -> returning %4d,%4d-%4dx%4d\n", drect.x, drect.y, drect.w, drect.h );
338 return gdk_region_rectangle (&rect);
342 gdk_window_impl_directfb_set_colormap (GdkDrawable *drawable,
343 GdkColormap *colormap)
345 GDK_DRAWABLE_CLASS (parent_class)->set_colormap (drawable, colormap);
349 GdkDrawableImplDirectFB *priv = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
353 IDirectFBPalette *palette = gdk_directfb_colormap_get_palette (colormap);
356 priv->surface->SetPalette (priv->surface, palette);
363 create_directfb_window (GdkWindowImplDirectFB *impl,
364 DFBWindowDescription *desc,
365 DFBWindowOptions window_options)
368 IDirectFBWindow *window;
370 D_DEBUG_AT( GDKDFB_Window, "%s( %4dx%4d, caps 0x%08x )\n", __FUNCTION__, desc->width, desc->height, desc->caps );
372 ret = _gdk_display->layer->CreateWindow (_gdk_display->layer, desc, &window);
376 DirectFBError ("gdk_window_new: Layer->CreateWindow failed", ret);
381 if ((desc->flags & DWDESC_CAPS) && (desc->caps & DWCAPS_INPUTONLY))
383 impl->drawable.surface = NULL;
385 window->GetSurface (window, &impl->drawable.surface);
389 DFBWindowOptions options;
390 window->GetOptions (window, &options);
391 window->SetOptions (window, options | window_options);
394 impl->window = window;
396 #ifndef GDK_DIRECTFB_NO_EXPERIMENTS
397 //direct_log_printf( NULL, "Initializing (window %p, wimpl %p)\n", win, impl );
399 dfb_updates_init( &impl->flips, impl->flip_regions, G_N_ELEMENTS(impl->flip_regions) );
406 _gdk_windowing_window_init (void)
408 GdkWindowObject *private;
409 GdkWindowImplDirectFB *impl;
410 DFBDisplayLayerConfig dlc;
412 g_assert (_gdk_parent_root == NULL);
414 _gdk_display->layer->GetConfiguration(
415 _gdk_display->layer, &dlc );
417 _gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL);
418 private = GDK_WINDOW_OBJECT (_gdk_parent_root);
419 private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
420 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
422 private->window_type = GDK_WINDOW_ROOT;
424 private->children = NULL;
425 // impl->drawable.paint_region = NULL;
426 impl->gdkWindow = _gdk_parent_root;
428 impl->drawable.abs_x = 0;
429 impl->drawable.abs_y = 0;
430 impl->drawable.width = dlc.width;
431 impl->drawable.height = dlc.height;
432 impl->drawable.wrapper = GDK_DRAWABLE (private);
433 /* custom root window init */
435 DFBWindowDescription desc;
437 /*XXX I must do this now its a bug ALPHA ROOT*/
439 desc.flags = DWDESC_CAPS;
441 desc.caps |= DWCAPS_NODECORATION;
442 desc.caps |= DWCAPS_ALPHACHANNEL;
443 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
444 DWDESC_POSX | DWDESC_POSY );
447 desc.width = dlc.width;
448 desc.height = dlc.height;
449 create_directfb_window (impl,&desc,0);
450 g_assert(impl->window != NULL);
451 g_assert(impl->drawable.surface != NULL );
453 impl->drawable.surface->GetPixelFormat(impl->drawable.surface,&impl->drawable.format);
454 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
456 Now we can set up the system colormap
458 gdk_drawable_set_colormap (GDK_DRAWABLE (_gdk_parent_root),gdk_colormap_get_system());
464 gdk_directfb_window_new (GdkWindow *parent,
465 GdkWindowAttr *attributes,
466 gint attributes_mask,
467 DFBWindowCapabilities window_caps,
468 DFBWindowOptions window_options,
469 DFBSurfaceCapabilities surface_caps)
472 GdkWindowObject *private;
473 GdkWindowObject *parent_private;
474 GdkWindowImplDirectFB *impl;
475 GdkWindowImplDirectFB *parent_impl;
477 DFBWindowDescription desc;
480 g_return_val_if_fail (attributes != NULL, NULL);
482 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, parent );
484 if (!parent || attributes->window_type != GDK_WINDOW_CHILD)
485 parent = _gdk_parent_root;
487 window = g_object_new (GDK_TYPE_WINDOW, NULL);
488 private = GDK_WINDOW_OBJECT (window);
489 private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
491 parent_private = GDK_WINDOW_OBJECT (parent);
492 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
493 private->parent = parent_private;
495 x = (attributes_mask & GDK_WA_X) ? attributes->x : 0;
496 y = (attributes_mask & GDK_WA_Y) ? attributes->y : 0;
498 gdk_window_set_events (window, attributes->event_mask | GDK_STRUCTURE_MASK);
500 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
501 impl->drawable.wrapper = GDK_DRAWABLE (window);
502 impl->gdkWindow = window;
507 _gdk_directfb_calc_abs (window);
509 impl->drawable.width = MAX (1, attributes->width);
510 impl->drawable.height = MAX (1, attributes->height);
512 private->window_type = attributes->window_type;
516 if (attributes_mask & GDK_WA_VISUAL)
517 visual = attributes->visual;
519 visual = gdk_drawable_get_visual (parent);
521 switch (attributes->wclass)
523 case GDK_INPUT_OUTPUT:
524 private->input_only = FALSE;
526 desc.flags |= DWDESC_PIXELFORMAT;
527 desc.pixelformat = ((GdkVisualDirectFB *) visual)->format;
529 if (DFB_PIXELFORMAT_HAS_ALPHA (desc.pixelformat))
531 desc.flags |= DWDESC_CAPS;
532 desc.caps = DWCAPS_ALPHACHANNEL;
537 private->input_only = TRUE;
538 desc.flags |= DWDESC_CAPS;
539 desc.caps = DWCAPS_INPUTONLY;
543 g_warning ("gdk_window_new: unsupported window class\n");
544 _gdk_window_destroy (window, FALSE);
548 switch (private->window_type)
550 case GDK_WINDOW_TOPLEVEL:
551 case GDK_WINDOW_DIALOG:
552 case GDK_WINDOW_TEMP:
553 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
554 DWDESC_POSX | DWDESC_POSY );
557 desc.width = impl->drawable.width;
558 desc.height = impl->drawable.height;
562 if (! (desc.flags & DWDESC_CAPS))
564 desc.flags |= DWDESC_CAPS;
565 desc.caps = DWCAPS_NONE;
568 desc.caps |= window_caps;
573 desc.flags |= DWDESC_SURFACE_CAPS;
574 desc.surface_caps = surface_caps;
578 if (!create_directfb_window (impl, &desc, window_options))
581 _gdk_window_destroy (window, FALSE);
584 if( desc.caps != DWCAPS_INPUTONLY )
585 impl->window->SetOpacity(impl->window, 0x00 );
588 case GDK_WINDOW_CHILD:
590 if (!private->input_only && parent_impl->drawable.surface)
594 { x, y, impl->drawable.width, impl->drawable.height };
595 parent_impl->drawable.surface->GetSubSurface (parent_impl->drawable.surface,
597 &impl->drawable.surface);
602 g_warning ("gdk_window_new: unsupported window type: %d",
603 private->window_type);
604 _gdk_window_destroy (window, FALSE);
608 if (impl->drawable.surface)
610 GdkColormap *colormap;
612 impl->drawable.surface->GetPixelFormat (impl->drawable.surface,
613 &impl->drawable.format);
615 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
617 if ((attributes_mask & GDK_WA_COLORMAP) && attributes->colormap)
619 colormap = attributes->colormap;
623 if (gdk_visual_get_system () == visual)
624 colormap = gdk_colormap_get_system ();
626 colormap =gdk_drawable_get_colormap (parent);
629 gdk_drawable_set_colormap (GDK_DRAWABLE (window), colormap);
633 impl->drawable.format = ((GdkVisualDirectFB *)visual)->format;
634 private->depth = visual->depth;
637 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
638 (attributes->cursor) : NULL));
641 parent_private->children = g_list_prepend (parent_private->children,
644 /* we hold a reference count on ourselves */
645 g_object_ref (window);
649 impl->window->GetID (impl->window, &impl->dfb_id);
650 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
651 gdk_directfb_event_windows_add (window);
654 if (attributes_mask & GDK_WA_TYPE_HINT)
655 gdk_window_set_type_hint (window, attributes->type_hint);
661 _gdk_window_new (GdkWindow *parent,
662 GdkWindowAttr *attributes,
663 gint attributes_mask)
665 g_return_val_if_fail (attributes != NULL, NULL);
667 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, parent );
669 return gdk_directfb_window_new (parent, attributes, attributes_mask,
670 DWCAPS_NONE, DWOP_NONE, DSCAPS_NONE);
673 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
675 /* It's somebody else's window, but in our hierarchy,
676 * so reparent it to the root window, and then send
677 * it a delete event, as if we were a WM
679 _gdk_windowing_window_destroy (window,TRUE,TRUE);
684 _gdk_windowing_window_destroy (GdkWindow *window,
686 gboolean foreign_destroy)
688 GdkWindowObject *private;
689 GdkWindowImplDirectFB *impl;
691 g_return_if_fail (GDK_IS_WINDOW (window));
693 D_DEBUG_AT( GDKDFB_Window, "%s( %p, %srecursing, %sforeign )\n", __FUNCTION__, window,
694 recursing ? "" : "not ", foreign_destroy ? "" : "no " );
696 private = GDK_WINDOW_OBJECT (window);
697 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
699 _gdk_selection_window_destroyed (window);
700 gdk_directfb_event_windows_remove (window);
702 if (window == _gdk_directfb_pointer_grab_window)
703 gdk_pointer_ungrab (GDK_CURRENT_TIME);
704 if (window == _gdk_directfb_keyboard_grab_window)
705 gdk_keyboard_ungrab (GDK_CURRENT_TIME);
707 if (window == gdk_directfb_focused_window)
708 gdk_directfb_change_focus (NULL);
711 if (impl->drawable.surface) {
712 GdkDrawableImplDirectFB *dimpl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
713 if(dimpl->cairo_surface) {
714 cairo_surface_destroy(dimpl->cairo_surface);
715 dimpl->cairo_surface= NULL;
717 impl->drawable.surface->Release (impl->drawable.surface);
718 impl->drawable.surface = NULL;
721 if (!recursing && !foreign_destroy && impl->window ) {
722 impl->window->SetOpacity (impl->window,0);
723 impl->window->Close(impl->window);
724 impl->window->Release(impl->window);
729 /* This function is called when the window is really gone.
732 gdk_window_destroy_notify (GdkWindow *window)
734 g_return_if_fail (GDK_IS_WINDOW (window));
736 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window );
738 if (!GDK_WINDOW_DESTROYED (window))
740 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
741 g_warning ("GdkWindow %p unexpectedly destroyed", window);
743 _gdk_window_destroy (window, TRUE);
745 g_object_unref (window);
748 /* Focus follows pointer */
750 gdk_directfb_window_find_toplevel (GdkWindow *window)
752 while (window && window != _gdk_parent_root)
754 GdkWindow *parent = (GdkWindow *) (GDK_WINDOW_OBJECT (window))->parent;
756 if ((parent == _gdk_parent_root) && GDK_WINDOW_IS_MAPPED (window))
762 return _gdk_parent_root;
766 gdk_directfb_window_find_focus (void)
768 if (_gdk_directfb_keyboard_grab_window)
769 return _gdk_directfb_keyboard_grab_window;
771 if (!gdk_directfb_focused_window)
772 gdk_directfb_focused_window = g_object_ref (_gdk_parent_root);
774 return gdk_directfb_focused_window;
778 gdk_directfb_change_focus (GdkWindow *new_focus_window)
780 GdkEventFocus *event;
783 GdkWindow *event_win;
785 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, new_focus_window );
787 /* No focus changes while the pointer is grabbed */
788 if (_gdk_directfb_pointer_grab_window)
791 old_win = gdk_directfb_focused_window;
792 new_win = gdk_directfb_window_find_toplevel (new_focus_window);
794 if (old_win == new_win)
799 event_win = gdk_directfb_keyboard_event_window (old_win,
803 event = (GdkEventFocus *) gdk_directfb_event_make (event_win,
809 event_win = gdk_directfb_keyboard_event_window (new_win,
813 event = (GdkEventFocus *) gdk_directfb_event_make (event_win,
818 if (gdk_directfb_focused_window)
819 g_object_unref (gdk_directfb_focused_window);
820 gdk_directfb_focused_window = g_object_ref (new_win);
824 gdk_window_set_accept_focus (GdkWindow *window,
825 gboolean accept_focus)
827 GdkWindowObject *private;
828 g_return_if_fail (window != NULL);
829 g_return_if_fail (GDK_IS_WINDOW (window));
831 private = (GdkWindowObject *)window;
833 accept_focus = accept_focus != FALSE;
835 if (private->accept_focus != accept_focus)
836 private->accept_focus = accept_focus;
841 gdk_window_set_focus_on_map (GdkWindow *window,
842 gboolean focus_on_map)
844 GdkWindowObject *private;
845 g_return_if_fail (window != NULL);
846 g_return_if_fail (GDK_IS_WINDOW (window));
848 private = (GdkWindowObject *)window;
850 focus_on_map = focus_on_map != FALSE;
852 if (private->focus_on_map != focus_on_map)
853 private->focus_on_map = focus_on_map;
857 gdk_directfb_window_raise (GdkWindow *window)
859 GdkWindowObject *parent;
861 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window );
863 parent = GDK_WINDOW_OBJECT (window)->parent;
865 if (parent->children->data == window)
868 parent->children = g_list_remove (parent->children, window);
869 parent->children = g_list_prepend (parent->children, window);
875 gdk_directfb_window_lower (GdkWindow *window)
877 GdkWindowObject *parent;
879 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window );
881 parent = GDK_WINDOW_OBJECT (window)->parent;
883 parent->children = g_list_remove (parent->children, window);
884 parent->children = g_list_append (parent->children, window);
888 all_parents_shown (GdkWindowObject *private)
890 while (GDK_WINDOW_IS_MAPPED (private))
893 private = GDK_WINDOW_OBJECT (private)->parent;
902 send_map_events (GdkWindowObject *private)
905 GdkWindow *event_win;
907 if (!GDK_WINDOW_IS_MAPPED (private))
910 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, private );
912 event_win = gdk_directfb_other_event_window ((GdkWindow *) private, GDK_MAP);
914 gdk_directfb_event_make (event_win, GDK_MAP);
916 for (list = private->children; list; list = list->next)
917 send_map_events (list->data);
921 gdk_directfb_find_common_ancestor (GdkWindow *win1,
927 for (a = GDK_WINDOW_OBJECT (win1); a; a = a->parent)
928 for (b = GDK_WINDOW_OBJECT (win2); b; b = b->parent)
931 return GDK_WINDOW (a);
938 gdk_directfb_window_send_crossing_events (GdkWindow *src,
940 GdkCrossingMode mode)
943 GdkWindow *win, *last, *next;
945 gint x, y, x_int, y_int;
946 GdkModifierType modifiers;
951 GdkWindow *event_win;
953 D_DEBUG_AT( GDKDFB_Crossing, "%s( %p -> %p, %d )\n", __FUNCTION__, src, dest, mode );
955 /* Do a possible cursor change before checking if we need to
956 generate crossing events so cursor changes due to pointer
957 grabs work correctly. */
959 static GdkCursorDirectFB *last_cursor = NULL;
961 GdkWindowObject *private = GDK_WINDOW_OBJECT (dest);
962 GdkWindowImplDirectFB *impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
963 GdkCursorDirectFB *cursor;
965 if (_gdk_directfb_pointer_grab_cursor)
966 cursor = (GdkCursorDirectFB*) _gdk_directfb_pointer_grab_cursor;
968 cursor = (GdkCursorDirectFB*) impl->cursor;
970 if (cursor != last_cursor)
972 win = gdk_directfb_window_find_toplevel (dest);
973 private = GDK_WINDOW_OBJECT (win);
974 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
977 impl->window->SetCursorShape (impl->window,
979 cursor->hot_x, cursor->hot_y);
980 last_cursor = cursor;
984 if (dest == gdk_directfb_window_containing_pointer) {
985 D_DEBUG_AT( GDKDFB_Crossing, " -> already containing the pointer\n" );
989 if (gdk_directfb_window_containing_pointer == NULL)
990 gdk_directfb_window_containing_pointer = g_object_ref (_gdk_parent_root);
995 a = gdk_directfb_window_containing_pointer;
1000 D_DEBUG_AT( GDKDFB_Crossing, " -> src == dest\n" );
1004 /* gdk_directfb_window_containing_pointer might have been destroyed.
1005 * The refcount we hold on it should keep it, but it's parents
1008 if (GDK_WINDOW_DESTROYED (a)) {
1009 D_DEBUG_AT( GDKDFB_Crossing, " -> src is destroyed!\n" );
1010 a = _gdk_parent_root;
1013 gdk_directfb_mouse_get_info (&x, &y, &modifiers);
1015 c = gdk_directfb_find_common_ancestor (a, b);
1017 D_DEBUG_AT( GDKDFB_Crossing, " -> common ancestor %p\n", c );
1019 non_linear = (c != a) && (c != b);
1021 D_DEBUG_AT( GDKDFB_Crossing, " -> non_linear: %s\n", non_linear ? "YES" : "NO" );
1023 event_win = gdk_directfb_pointer_event_window (a, GDK_LEAVE_NOTIFY);
1026 D_DEBUG_AT( GDKDFB_Crossing, " -> sending LEAVE to src\n" );
1028 event = gdk_directfb_event_make (event_win, GDK_LEAVE_NOTIFY);
1029 event->crossing.subwindow = NULL;
1031 gdk_window_get_origin (a, &x_int, &y_int);
1033 event->crossing.x = x - x_int;
1034 event->crossing.y = y - y_int;
1035 event->crossing.x_root = x;
1036 event->crossing.y_root = y;
1037 event->crossing.mode = mode;
1040 event->crossing.detail = GDK_NOTIFY_NONLINEAR;
1042 event->crossing.detail = GDK_NOTIFY_INFERIOR;
1044 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
1046 event->crossing.focus = FALSE;
1047 event->crossing.state = modifiers;
1049 D_DEBUG_AT( GDKDFB_Crossing, " => LEAVE (%p/%p) at %4f,%4f (%4f,%4f) mode %d, detail %d\n",
1051 event->crossing.x, event->crossing.y, event->crossing.x_root, event->crossing.y_root,
1052 event->crossing.mode, event->crossing.detail );
1055 /* Traverse up from a to (excluding) c */
1059 win = GDK_WINDOW (GDK_WINDOW_OBJECT (a)->parent);
1063 gdk_directfb_pointer_event_window (win, GDK_LEAVE_NOTIFY);
1067 event = gdk_directfb_event_make (event_win, GDK_LEAVE_NOTIFY);
1069 event->crossing.subwindow = g_object_ref (last);
1071 gdk_window_get_origin (win, &x_int, &y_int);
1073 event->crossing.x = x - x_int;
1074 event->crossing.y = y - y_int;
1075 event->crossing.x_root = x;
1076 event->crossing.y_root = y;
1077 event->crossing.mode = mode;
1080 event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
1082 event->crossing.detail = GDK_NOTIFY_VIRTUAL;
1084 event->crossing.focus = FALSE;
1085 event->crossing.state = modifiers;
1087 D_DEBUG_AT( GDKDFB_Crossing, " -> LEAVE (%p/%p) at %4f,%4f (%4f,%4f) mode %d, detail %d\n",
1089 event->crossing.x, event->crossing.y, event->crossing.x_root, event->crossing.y_root,
1090 event->crossing.mode, event->crossing.detail );
1094 win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent);
1098 /* Traverse down from c to b */
1102 win = GDK_WINDOW (GDK_WINDOW_OBJECT (b)->parent);
1105 path = g_slist_prepend (path, win);
1106 win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent);
1112 win = GDK_WINDOW (list->data);
1113 list = g_slist_next (list);
1116 next = GDK_WINDOW (list->data);
1121 gdk_directfb_pointer_event_window (win, GDK_ENTER_NOTIFY);
1125 event = gdk_directfb_event_make (event_win, GDK_ENTER_NOTIFY);
1127 event->crossing.subwindow = g_object_ref (next);
1129 gdk_window_get_origin (win, &x_int, &y_int);
1131 event->crossing.x = x - x_int;
1132 event->crossing.y = y - y_int;
1133 event->crossing.x_root = x;
1134 event->crossing.y_root = y;
1135 event->crossing.mode = mode;
1138 event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
1140 event->crossing.detail = GDK_NOTIFY_VIRTUAL;
1142 event->crossing.focus = FALSE;
1143 event->crossing.state = modifiers;
1145 D_DEBUG_AT( GDKDFB_Crossing, " -> ENTER (%p/%p) at %4f,%4f (%4f,%4f) mode %d, detail %d\n",
1147 event->crossing.x, event->crossing.y, event->crossing.x_root, event->crossing.y_root,
1148 event->crossing.mode, event->crossing.detail );
1152 g_slist_free (path);
1155 event_win = gdk_directfb_pointer_event_window (b, GDK_ENTER_NOTIFY);
1158 event = gdk_directfb_event_make (event_win, GDK_ENTER_NOTIFY);
1160 event->crossing.subwindow = NULL;
1162 gdk_window_get_origin (b, &x_int, &y_int);
1164 event->crossing.x = x - x_int;
1165 event->crossing.y = y - y_int;
1166 event->crossing.x_root = x;
1167 event->crossing.y_root = y;
1168 event->crossing.mode = mode;
1171 event->crossing.detail = GDK_NOTIFY_NONLINEAR;
1173 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
1175 event->crossing.detail = GDK_NOTIFY_INFERIOR;
1177 event->crossing.focus = FALSE;
1178 event->crossing.state = modifiers;
1180 D_DEBUG_AT( GDKDFB_Crossing, " => ENTER (%p/%p) at %4f,%4f (%4f,%4f) mode %d, detail %d\n",
1182 event->crossing.x, event->crossing.y, event->crossing.x_root, event->crossing.y_root,
1183 event->crossing.mode, event->crossing.detail );
1186 if (mode != GDK_CROSSING_GRAB)
1188 //this seems to cause focus to change as the pointer moves yuck
1189 //gdk_directfb_change_focus (b);
1190 if (b != gdk_directfb_window_containing_pointer)
1192 g_object_unref (gdk_directfb_window_containing_pointer);
1193 gdk_directfb_window_containing_pointer = g_object_ref (b);
1199 show_window_internal (GdkWindow *window,
1202 GdkWindowObject *private;
1203 GdkWindowImplDirectFB *impl;
1204 GdkWindow *mousewin;
1206 D_DEBUG_AT( GDKDFB_Window, "%s( %p, %sraise )\n", __FUNCTION__, window, raise ? "" : "no " );
1208 private = GDK_WINDOW_OBJECT (window);
1209 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1211 if (!private->destroyed && !GDK_WINDOW_IS_MAPPED (private))
1213 private->state &= ~GDK_WINDOW_STATE_WITHDRAWN;
1216 gdk_window_raise (window);
1218 if (all_parents_shown (GDK_WINDOW_OBJECT (private)->parent))
1220 send_map_events (private);
1222 mousewin = gdk_window_at_pointer (NULL, NULL);
1223 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1224 GDK_CROSSING_NORMAL);
1226 if (private->input_only)
1229 gdk_window_invalidate_rect (window, NULL, TRUE);
1235 if (gdk_directfb_apply_focus_opacity)
1236 impl->window->SetOpacity (impl->window,
1237 (impl->opacity >> 1) + (impl->opacity >> 2));
1239 impl->window->SetOpacity (impl->window, impl->opacity);
1240 /* if its the first window focus it */
1245 gdk_directfb_window_show (GdkWindow *window,
1248 g_return_if_fail (GDK_IS_WINDOW (window));
1250 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window );
1252 show_window_internal (window, raise);
1256 gdk_directfb_window_hide (GdkWindow *window)
1258 GdkWindowObject *private;
1259 GdkWindowImplDirectFB *impl;
1260 GdkWindow *mousewin;
1261 GdkWindow *event_win;
1263 g_return_if_fail (GDK_IS_WINDOW (window));
1265 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window );
1267 private = GDK_WINDOW_OBJECT (window);
1268 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1271 impl->window->SetOpacity (impl->window, 0);
1273 if (!private->destroyed && GDK_WINDOW_IS_MAPPED (private))
1277 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
1279 if (!private->input_only && private->parent)
1281 gdk_window_clear_area (GDK_WINDOW (private->parent),
1284 impl->drawable.width,
1285 impl->drawable.height);
1288 event_win = gdk_directfb_other_event_window (window, GDK_UNMAP);
1290 event = gdk_directfb_event_make (event_win, GDK_UNMAP);
1292 mousewin = gdk_window_at_pointer (NULL, NULL);
1293 gdk_directfb_window_send_crossing_events (NULL,
1295 GDK_CROSSING_NORMAL);
1297 if (window == _gdk_directfb_pointer_grab_window)
1298 gdk_pointer_ungrab (GDK_CURRENT_TIME);
1299 if (window == _gdk_directfb_keyboard_grab_window)
1300 gdk_keyboard_ungrab (GDK_CURRENT_TIME);
1305 gdk_directfb_window_withdraw (GdkWindow *window)
1307 g_return_if_fail (GDK_IS_WINDOW (window));
1309 /* for now this should be enough */
1310 gdk_window_hide (window);
1314 _gdk_directfb_move_resize_child (GdkWindow *window,
1320 GdkWindowObject *private;
1321 GdkWindowImplDirectFB *impl;
1322 GdkWindowImplDirectFB *parent_impl;
1325 g_return_if_fail (GDK_IS_WINDOW (window));
1327 private = GDK_WINDOW_OBJECT (window);
1328 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1333 impl->drawable.width = width;
1334 impl->drawable.height = height;
1336 if (!private->input_only)
1338 if (impl->drawable.surface) {
1339 GdkDrawableImplDirectFB *dimpl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1340 if(dimpl->cairo_surface) {
1341 cairo_surface_destroy(dimpl->cairo_surface);
1342 dimpl->cairo_surface= NULL;
1344 impl->drawable.surface->Release (impl->drawable.surface);
1345 impl->drawable.surface = NULL;
1348 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (private->parent)->impl);
1350 if (parent_impl->drawable.surface)
1352 DFBRectangle rect = { x, y, width, height };
1354 parent_impl->drawable.surface->GetSubSurface (parent_impl->drawable.surface,
1356 &impl->drawable.surface);
1360 for (list = private->children; list; list = list->next)
1362 private = GDK_WINDOW_OBJECT (list->data);
1363 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1364 _gdk_directfb_move_resize_child (list->data,
1365 private->x, private->y,
1366 impl->drawable.width, impl->drawable.height);
1371 gdk_directfb_window_move (GdkWindow *window,
1375 GdkWindowObject *private;
1376 GdkWindowImplDirectFB *impl;
1378 g_return_if_fail (GDK_IS_WINDOW (window));
1380 private = GDK_WINDOW_OBJECT (window);
1381 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1387 impl->window->MoveTo (impl->window, x, y);
1391 gint width=impl->drawable.width;
1392 gint height=impl->drawable.height;
1394 { private->x, private->y,width,height };
1396 _gdk_directfb_move_resize_child (window, x, y, width, height);
1397 _gdk_directfb_calc_abs (window);
1399 if (GDK_WINDOW_IS_MAPPED (private))
1401 GdkWindow *mousewin;
1402 GdkRectangle new = { x, y, width, height };
1404 gdk_rectangle_union (&new, &old, &new);
1405 gdk_window_invalidate_rect (GDK_WINDOW (private->parent), &new,TRUE);
1407 /* The window the pointer is in might have changed */
1408 mousewin = gdk_window_at_pointer (NULL, NULL);
1409 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1410 GDK_CROSSING_NORMAL);
1416 gdk_directfb_window_move_resize (GdkWindow *window,
1423 GdkWindowObject *private;
1424 GdkWindowImplDirectFB *impl;
1426 g_return_if_fail (GDK_IS_WINDOW (window));
1428 private = GDK_WINDOW_OBJECT (window);
1429 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1436 if (private->destroyed ||
1437 (private->x == x && private->y == y &&
1438 impl->drawable.width == width && impl->drawable.height == height))
1441 if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD))
1443 GdkWindowChildHandlerData *data;
1445 data = g_object_get_data (G_OBJECT (private->parent),
1446 "gdk-window-child-handler");
1449 (*data->changed) (window, x, y, width, height, data->user_data))
1453 if (impl->drawable.width == width && impl->drawable.height == height)
1456 gdk_directfb_window_move (window, x, y);
1458 else if (impl->window)
1462 impl->drawable.width = width;
1463 impl->drawable.height = height;
1466 impl->window->MoveTo (impl->window, x, y);
1467 impl->window->Resize (impl->window, width, height);
1471 GdkRectangle old = { private->x, private->y, impl->drawable.width, impl->drawable.height };
1472 GdkRectangle new = { x, y, width, height };
1480 _gdk_directfb_move_resize_child (window,
1481 new.x, new.y, new.width, new.height);
1482 _gdk_directfb_calc_abs (window);
1484 if (GDK_WINDOW_IS_MAPPED (private))
1486 GdkWindow *mousewin;
1488 gdk_rectangle_union (&new, &old, &new);
1489 gdk_window_invalidate_rect (GDK_WINDOW (private->parent), &new,TRUE);
1491 /* The window the pointer is in might have changed */
1492 mousewin = gdk_window_at_pointer (NULL, NULL);
1493 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1494 GDK_CROSSING_NORMAL);
1500 gdk_directfb_window_reparent (GdkWindow *window,
1501 GdkWindow *new_parent,
1505 GdkWindowObject *window_private;
1506 GdkWindowObject *parent_private;
1507 GdkWindowObject *old_parent_private;
1508 GdkWindowImplDirectFB *impl;
1509 GdkWindowImplDirectFB *parent_impl;
1512 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
1514 if (GDK_WINDOW_DESTROYED (window))
1518 new_parent = _gdk_parent_root;
1520 window_private = (GdkWindowObject *) window;
1521 old_parent_private = (GdkWindowObject *) window_private->parent;
1522 parent_private = (GdkWindowObject *) new_parent;
1523 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
1524 visual = gdk_drawable_get_visual (window);
1526 /* already parented */
1527 if( window_private->parent == (GdkWindowObject *)new_parent )
1530 window_private->parent = (GdkWindowObject *) new_parent;
1532 if (old_parent_private)
1534 old_parent_private->children =
1535 g_list_remove (old_parent_private->children, window);
1538 parent_private->children = g_list_prepend (parent_private->children, window);
1540 impl = GDK_WINDOW_IMPL_DIRECTFB (window_private->impl);
1542 if( impl->drawable.surface ) {
1543 impl->drawable.surface->Release (impl->drawable.surface);
1544 impl->drawable.surface = NULL;
1547 if( impl->window != NULL ) {
1548 gdk_directfb_window_id_table_remove (impl->dfb_id);
1549 impl->window->SetOpacity (impl->window,0);
1550 impl->window->Close(impl->window);
1551 impl->window->Release(impl->window);
1552 impl->window = NULL;
1555 //create window were a child of the root now
1556 if( window_private->parent == (GdkWindowObject *)_gdk_parent_root) {
1557 DFBWindowDescription desc;
1558 DFBWindowOptions window_options = DWOP_NONE;
1559 desc.flags = DWDESC_CAPS;
1560 if( window_private->input_only ) {
1561 desc.caps = DWCAPS_INPUTONLY;
1563 desc.flags |= DWDESC_PIXELFORMAT;
1564 desc.pixelformat = ((GdkVisualDirectFB *) visual)->format;
1565 if (DFB_PIXELFORMAT_HAS_ALPHA (desc.pixelformat)) {
1566 desc.flags |= DWDESC_CAPS;
1567 desc.caps = DWCAPS_ALPHACHANNEL;
1570 if( window_private->window_type == GDK_WINDOW_CHILD )
1571 window_private->window_type = GDK_WINDOW_TOPLEVEL;
1572 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
1573 DWDESC_POSX | DWDESC_POSY );
1576 desc.width = impl->drawable.width;
1577 desc.height = impl->drawable.height;
1578 if (!create_directfb_window (impl, &desc, window_options))
1581 _gdk_window_destroy (window, FALSE);
1584 /* we hold a reference count on ourselves */
1585 g_object_ref (window);
1586 impl->window->GetID (impl->window, &impl->dfb_id);
1587 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
1588 gdk_directfb_event_windows_add (window);
1590 DFBRectangle rect = { x, y, impl->drawable.width,
1591 impl->drawable.height};
1592 impl->window = NULL;
1593 parent_impl->drawable.surface->GetSubSurface (
1594 parent_impl->drawable.surface,
1596 &impl->drawable.surface);
1603 gdk_directfb_window_clear_area (GdkWindow *window,
1608 gboolean send_expose)
1610 GdkWindowObject *private;
1611 GdkDrawableImplDirectFB *impl;
1612 GdkPixmap *bg_pixmap;
1613 GdkWindowObject *relative_to;
1618 D_DEBUG_AT( GDKDFB_Window, "%s( %p, %4d,%4d-%4dx%4d )\n", __FUNCTION__, window, x, y, width, height );
1620 g_return_if_fail (GDK_IS_WINDOW (window));
1622 if (GDK_WINDOW_DESTROYED (window)) {
1623 D_DEBUG_AT( GDKDFB_Window, " -> DESTROYED!\n" );
1627 private = GDK_WINDOW_OBJECT (window);
1629 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1632 Follow XClearArea definition for zero height width
1635 width = impl->width-x;
1637 height = impl->height-y;
1639 bg_pixmap = private->bg_pixmap;
1641 for (relative_to = private;
1642 relative_to && bg_pixmap == GDK_PARENT_RELATIVE_BG;
1643 relative_to = relative_to->parent)
1645 bg_pixmap = relative_to->bg_pixmap;
1646 dx += relative_to->x;
1647 dy += relative_to->y;
1650 if (bg_pixmap == GDK_NO_BG) {
1651 D_DEBUG_AT( GDKDFB_Window, " -> NO BG\n" );
1655 if (bg_pixmap && bg_pixmap != GDK_PARENT_RELATIVE_BG)
1659 values.fill = GDK_TILED;
1660 values.tile = bg_pixmap;
1661 values.ts_x_origin = - dx;
1662 values.ts_y_origin = - dy;
1664 D_DEBUG_AT( GDKDFB_Window, " -> PIXMAP\n" );
1666 gc = gdk_gc_new_with_values (GDK_DRAWABLE (impl), &values,
1667 GDK_GC_FILL | GDK_GC_TILE |
1668 GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN);
1672 /* GDK_PARENT_RELATIVE_BG, but no pixmap,
1673 get the color from the parent window. */
1677 values.foreground = relative_to->bg_color;
1679 D_DEBUG_AT( GDKDFB_Window, " -> COLOR\n" );
1681 gc = gdk_gc_new_with_values (GDK_DRAWABLE (impl), &values,
1685 gdk_draw_rectangle (GDK_DRAWABLE (impl),
1686 gc, TRUE, x, y, width, height);
1689 g_object_unref (gc);
1693 gdk_window_directfb_raise (GdkWindow *window)
1695 GdkWindowImplDirectFB *impl;
1697 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window );
1699 g_return_if_fail (GDK_IS_WINDOW (window));
1701 if (GDK_WINDOW_DESTROYED (window))
1704 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1710 ret = impl->window->RaiseToTop (impl->window);
1712 DirectFBError ("gdkwindow-directfb.c: RaiseToTop", ret);
1714 gdk_directfb_window_raise (window);
1718 if (gdk_directfb_window_raise (window))
1719 gdk_window_invalidate_rect (window, NULL, TRUE);
1724 gdk_window_directfb_lower (GdkWindow *window)
1726 GdkWindowImplDirectFB *impl;
1728 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window );
1730 g_return_if_fail (GDK_IS_WINDOW (window));
1732 if (GDK_WINDOW_DESTROYED (window))
1735 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1741 ret = impl->window->LowerToBottom (impl->window);
1743 DirectFBError ("gdkwindow-directfb.c: LowerToBottom", ret);
1745 gdk_directfb_window_lower (window);
1749 gdk_directfb_window_lower (window);
1750 gdk_window_invalidate_rect (window, NULL, TRUE);
1755 gdk_window_set_hints (GdkWindow *window,
1764 g_return_if_fail (GDK_IS_WINDOW (window));
1766 if (GDK_WINDOW_DESTROYED (window))
1769 D_DEBUG_AT( GDKDFB_Window, "%s( %p, %3d,%3d, min %4dx%4d, max %4dx%4d, flags 0x%08x )\n", __FUNCTION__,
1770 window, x,y, min_width, min_height, max_width, max_height, flags );
1775 gdk_window_set_geometry_hints (GdkWindow *window,
1776 const GdkGeometry *geometry,
1777 GdkWindowHints geom_mask)
1779 g_return_if_fail (GDK_IS_WINDOW (window));
1781 if (GDK_WINDOW_DESTROYED (window))
1788 gdk_window_set_title (GdkWindow *window,
1791 g_return_if_fail (GDK_IS_WINDOW (window));
1793 if (GDK_WINDOW_DESTROYED (window))
1796 D_DEBUG_AT( GDKDFB_Window, "%s( %p, '%s' )\n", __FUNCTION__, window, title );
1798 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window );
1802 gdk_window_set_role (GdkWindow *window,
1805 g_return_if_fail (GDK_IS_WINDOW (window));
1807 if (GDK_WINDOW_DESTROYED (window))
1814 * gdk_window_set_startup_id:
1815 * @window: a toplevel #GdkWindow
1816 * @startup_id: a string with startup-notification identifier
1818 * When using GTK+, typically you should use gtk_window_set_startup_id()
1819 * instead of this low-level function.
1825 gdk_window_set_startup_id (GdkWindow *window,
1826 const gchar *startup_id)
1831 gdk_window_set_transient_for (GdkWindow *window,
1834 GdkWindowObject *private;
1835 GdkWindowObject *root;
1838 g_return_if_fail (GDK_IS_WINDOW (window));
1839 g_return_if_fail (GDK_IS_WINDOW (parent));
1841 private = GDK_WINDOW_OBJECT (window);
1842 root = GDK_WINDOW_OBJECT (_gdk_parent_root);
1844 g_return_if_fail (GDK_WINDOW (private->parent) == _gdk_parent_root);
1845 g_return_if_fail (GDK_WINDOW (GDK_WINDOW_OBJECT (parent)->parent) == _gdk_parent_root);
1847 root->children = g_list_remove (root->children, window);
1849 i = g_list_index (root->children, parent);
1851 root->children = g_list_prepend (root->children, window);
1853 root->children = g_list_insert (root->children, window, i);
1857 gdk_directfb_window_set_background (GdkWindow *window,
1858 const GdkColor *color)
1860 GdkWindowObject *private;
1862 g_return_if_fail (GDK_IS_WINDOW (window));
1864 g_return_if_fail (color != NULL);
1866 D_DEBUG_AT( GDKDFB_Window, "%s( %p, %d,%d,%d )\n", __FUNCTION__, window, color->red, color->green, color->blue );
1868 private = GDK_WINDOW_OBJECT (window);
1869 private->bg_color = *color;
1871 if (private->bg_pixmap &&
1872 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1873 private->bg_pixmap != GDK_NO_BG)
1874 g_object_unref (private->bg_pixmap);
1876 private->bg_pixmap = NULL;
1880 gdk_directfb_window_set_back_pixmap (GdkWindow *window,
1882 gboolean parent_relative)
1884 GdkWindowObject *private;
1885 GdkPixmap *old_pixmap;
1887 g_return_if_fail (GDK_IS_WINDOW (window));
1888 g_return_if_fail (pixmap == NULL || !parent_relative);
1890 D_DEBUG_AT( GDKDFB_Window, "%s( %p, %p, %srelative )\n", __FUNCTION__,
1891 window, pixmap, parent_relative ? "" : "not " );
1893 private = GDK_WINDOW_OBJECT (window);
1894 old_pixmap = private->bg_pixmap;
1896 if (private->bg_pixmap &&
1897 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1898 private->bg_pixmap != GDK_NO_BG)
1900 g_object_unref (private->bg_pixmap);
1903 if (parent_relative)
1905 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1911 g_object_ref (pixmap);
1912 private->bg_pixmap = pixmap;
1916 private->bg_pixmap = GDK_NO_BG;
1922 gdk_directfb_window_set_cursor (GdkWindow *window,
1925 GdkWindowImplDirectFB *impl;
1926 GdkCursor *old_cursor;
1928 g_return_if_fail (GDK_IS_WINDOW (window));
1930 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1931 old_cursor = impl->cursor;
1933 impl->cursor = (cursor ?
1934 gdk_cursor_ref (cursor) : gdk_cursor_new (GDK_LEFT_PTR));
1936 if (gdk_window_at_pointer (NULL, NULL) == window)
1938 /* This is a bit evil but we want to keep all cursor changes in
1939 one place, so let gdk_directfb_window_send_crossing_events
1940 do the work for us. */
1942 gdk_directfb_window_send_crossing_events (window, window,
1943 GDK_CROSSING_NORMAL);
1945 else if (impl->window)
1947 GdkCursorDirectFB *dfb_cursor = (GdkCursorDirectFB *) impl->cursor;
1949 /* this branch takes care of setting the cursor for unmapped windows */
1951 impl->window->SetCursorShape (impl->window,
1953 dfb_cursor->hot_x, dfb_cursor->hot_y);
1957 gdk_cursor_unref (old_cursor);
1961 gdk_directfb_window_get_geometry (GdkWindow *window,
1968 GdkWindowObject *private;
1969 GdkDrawableImplDirectFB *impl;
1971 g_return_if_fail (GDK_IS_WINDOW (window));
1973 private = GDK_WINDOW_OBJECT (window);
1974 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1976 if (!GDK_WINDOW_DESTROYED (window))
1985 *width = impl->width;
1988 *height = impl->height;
1991 *depth = DFB_BITS_PER_PIXEL(impl->format);
1996 _gdk_directfb_calc_abs (GdkWindow *window)
1998 GdkWindowObject *private;
1999 GdkDrawableImplDirectFB *impl;
2002 g_return_if_fail (GDK_IS_WINDOW (window));
2004 private = GDK_WINDOW_OBJECT (window);
2005 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
2007 impl->abs_x = private->x;
2008 impl->abs_y = private->y;
2010 if (private->parent)
2012 GdkDrawableImplDirectFB *parent_impl =
2013 GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (private->parent)->impl);
2015 impl->abs_x += parent_impl->abs_x;
2016 impl->abs_y += parent_impl->abs_y;
2019 D_DEBUG_AT( GDKDFB_Window, "%s( %p ) -> %4d,%4d\n", __FUNCTION__, window, impl->abs_x, impl->abs_y );
2021 for (list = private->children; list; list = list->next)
2023 _gdk_directfb_calc_abs (list->data);
2028 gdk_directfb_window_get_origin (GdkWindow *window,
2032 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2034 if (!GDK_WINDOW_DESTROYED (window))
2036 GdkDrawableImplDirectFB *impl;
2038 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2052 gdk_window_get_deskrelative_origin (GdkWindow *window,
2056 return gdk_window_get_origin (window, x, y);
2060 gdk_window_get_root_origin (GdkWindow *window,
2064 GdkWindowObject *rover;
2066 g_return_if_fail (GDK_IS_WINDOW (window));
2068 rover = (GdkWindowObject*) window;
2074 if (GDK_WINDOW_DESTROYED (window))
2077 while (rover->parent && ((GdkWindowObject*) rover->parent)->parent)
2078 rover = (GdkWindowObject *) rover->parent;
2079 if (rover->destroyed)
2089 _gdk_windowing_window_get_pointer (GdkDisplay *display,
2093 GdkModifierType *mask)
2095 GdkWindow *retval = NULL;
2096 gint rx, ry, wx, wy;
2097 GdkDrawableImplDirectFB *impl;
2099 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
2102 window = _gdk_parent_root;
2104 gdk_directfb_mouse_get_info (&rx, &ry, mask);
2108 retval = gdk_directfb_child_at (_gdk_parent_root, &wx, &wy);
2110 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2113 *x = rx - impl->abs_x;
2115 *y = ry - impl->abs_y;
2121 _gdk_windowing_window_at_pointer (GdkDisplay *display,
2128 if (!win_x || !win_y)
2129 gdk_directfb_mouse_get_info (&wx, &wy, NULL);
2137 retval = gdk_directfb_child_at (_gdk_parent_root, &wx, &wy);
2149 _gdk_windowing_get_pointer (GdkDisplay *display,
2153 GdkModifierType *mask)
2157 *screen = gdk_display_get_default_screen (display);
2159 _gdk_windowing_window_get_pointer (display,
2160 _gdk_windowing_window_at_pointer(display,NULL,NULL),x,y,mask);
2165 gdk_directfb_window_get_events (GdkWindow *window)
2167 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
2169 if (GDK_WINDOW_DESTROYED (window))
2172 return GDK_WINDOW_OBJECT (window)->event_mask;
2176 gdk_directfb_window_set_events (GdkWindow *window,
2177 GdkEventMask event_mask)
2179 g_return_if_fail (GDK_IS_WINDOW (window));
2181 if (event_mask & GDK_BUTTON_MOTION_MASK)
2182 event_mask |= (GDK_BUTTON1_MOTION_MASK |
2183 GDK_BUTTON2_MOTION_MASK |
2184 GDK_BUTTON3_MOTION_MASK);
2186 GDK_WINDOW_OBJECT (window)->event_mask = event_mask;
2190 gdk_directfb_window_shape_combine_mask (GdkWindow *window,
2198 gdk_window_input_shape_combine_mask (GdkWindow *window,
2206 gdk_directfb_window_shape_combine_region (GdkWindow *window,
2207 const GdkRegion *shape_region,
2214 gdk_window_input_shape_combine_region (GdkWindow *window,
2215 const GdkRegion *shape_region,
2222 gdk_window_set_override_redirect (GdkWindow *window,
2223 gboolean override_redirect)
2225 g_return_if_fail (GDK_IS_WINDOW (window));
2227 if (GDK_WINDOW_DESTROYED (window))
2234 gdk_window_set_icon_list (GdkWindow *window,
2237 g_return_if_fail (GDK_IS_WINDOW (window));
2239 if (GDK_WINDOW_DESTROYED (window))
2246 gdk_window_set_icon (GdkWindow *window,
2247 GdkWindow *icon_window,
2251 g_return_if_fail (GDK_IS_WINDOW (window));
2253 if (GDK_WINDOW_DESTROYED (window))
2260 gdk_window_set_icon_name (GdkWindow *window,
2263 g_return_if_fail (GDK_IS_WINDOW (window));
2265 if (GDK_WINDOW_DESTROYED (window))
2272 gdk_window_iconify (GdkWindow *window)
2274 g_return_if_fail (GDK_IS_WINDOW (window));
2276 if (GDK_WINDOW_DESTROYED (window))
2279 gdk_window_hide (window);
2283 gdk_window_deiconify (GdkWindow *window)
2285 g_return_if_fail (GDK_IS_WINDOW (window));
2287 if (GDK_WINDOW_DESTROYED (window))
2290 gdk_window_show (window);
2294 gdk_window_stick (GdkWindow *window)
2296 g_return_if_fail (GDK_IS_WINDOW (window));
2298 if (GDK_WINDOW_DESTROYED (window))
2305 gdk_window_unstick (GdkWindow *window)
2307 g_return_if_fail (GDK_IS_WINDOW (window));
2309 if (GDK_WINDOW_DESTROYED (window))
2316 gdk_directfb_window_set_opacity (GdkWindow *window,
2319 GdkWindowImplDirectFB *impl;
2321 g_return_if_fail (GDK_IS_WINDOW (window));
2323 if (GDK_WINDOW_DESTROYED (window))
2326 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2328 impl->opacity = opacity;
2330 if (impl->window && GDK_WINDOW_IS_MAPPED (window))
2332 if (gdk_directfb_apply_focus_opacity &&
2333 window == gdk_directfb_focused_window)
2334 impl->window->SetOpacity (impl->window,
2335 (impl->opacity >> 1) + (impl->opacity >> 2));
2337 impl->window->SetOpacity (impl->window, impl->opacity);
2342 gdk_window_focus (GdkWindow *window,
2345 GdkWindow *toplevel;
2347 g_return_if_fail (GDK_IS_WINDOW (window));
2349 if (GDK_WINDOW_DESTROYED (window))
2352 toplevel = gdk_directfb_window_find_toplevel (window);
2353 if (toplevel != _gdk_parent_root)
2355 GdkWindowImplDirectFB *impl;
2357 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (toplevel)->impl);
2359 impl->window->RequestFocus (impl->window);
2364 gdk_window_maximize (GdkWindow *window)
2366 g_return_if_fail (GDK_IS_WINDOW (window));
2368 if (GDK_WINDOW_DESTROYED (window))
2375 gdk_window_unmaximize (GdkWindow *window)
2377 g_return_if_fail (GDK_IS_WINDOW (window));
2379 if (GDK_WINDOW_DESTROYED (window))
2386 gdk_window_set_type_hint (GdkWindow *window,
2387 GdkWindowTypeHint hint)
2389 g_return_if_fail (GDK_IS_WINDOW (window));
2391 if (GDK_WINDOW_DESTROYED (window))
2394 GDK_NOTE (MISC, g_print ("gdk_window_set_type_hint: 0x%x: %d\n",
2395 GDK_WINDOW_DFB_ID (window), hint));
2397 ((GdkWindowImplDirectFB *)((GdkWindowObject *)window)->impl)->type_hint = hint;
2404 gdk_window_get_type_hint (GdkWindow *window)
2406 g_return_val_if_fail (GDK_IS_WINDOW (window), GDK_WINDOW_TYPE_HINT_NORMAL);
2408 if (GDK_WINDOW_DESTROYED (window))
2409 return GDK_WINDOW_TYPE_HINT_NORMAL;
2411 return GDK_WINDOW_IMPL_DIRECTFB (((GdkWindowObject *) window)->impl)->type_hint;
2415 gdk_window_set_modal_hint (GdkWindow *window,
2418 GdkWindowImplDirectFB *impl;
2420 g_return_if_fail (GDK_IS_WINDOW (window));
2422 if (GDK_WINDOW_DESTROYED (window))
2425 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2429 impl->window->SetStackingClass (impl->window,
2430 modal ? DWSC_UPPER : DWSC_MIDDLE);
2435 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
2436 gboolean skips_taskbar)
2438 g_return_if_fail (GDK_IS_WINDOW (window));
2442 gdk_window_set_skip_pager_hint (GdkWindow *window,
2443 gboolean skips_pager)
2445 g_return_if_fail (GDK_IS_WINDOW (window));
2450 gdk_window_set_group (GdkWindow *window,
2453 g_return_if_fail (GDK_IS_WINDOW (window));
2454 g_return_if_fail (GDK_IS_WINDOW (leader));
2455 g_warning(" DirectFb set_group groups not supported \n");
2457 if (GDK_WINDOW_DESTROYED (window))
2463 GdkWindow * gdk_window_get_group (GdkWindow *window)
2465 g_warning(" DirectFb get_group groups not supported \n");
2470 gdk_fb_window_set_child_handler (GdkWindow *window,
2471 GdkWindowChildChanged changed,
2472 GdkWindowChildGetPos get_pos,
2475 GdkWindowChildHandlerData *data;
2477 g_return_if_fail (GDK_IS_WINDOW (window));
2479 data = g_new (GdkWindowChildHandlerData, 1);
2480 data->changed = changed;
2481 data->get_pos = get_pos;
2482 data->user_data = user_data;
2484 g_object_set_data_full (G_OBJECT (window), "gdk-window-child-handler",
2485 data, (GDestroyNotify) g_free);
2489 gdk_window_set_decorations (GdkWindow *window,
2490 GdkWMDecoration decorations)
2492 GdkWMDecoration *dec;
2494 g_return_if_fail (GDK_IS_WINDOW (window));
2496 dec = g_new (GdkWMDecoration, 1);
2499 g_object_set_data_full (G_OBJECT (window), "gdk-window-decorations",
2500 dec, (GDestroyNotify) g_free);
2504 gdk_window_get_decorations (GdkWindow *window,
2505 GdkWMDecoration *decorations)
2507 GdkWMDecoration *dec;
2509 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2511 dec = g_object_get_data (G_OBJECT (window), "gdk-window-decorations");
2514 *decorations = *dec;
2521 gdk_window_set_functions (GdkWindow *window,
2522 GdkWMFunction functions)
2524 g_return_if_fail (GDK_IS_WINDOW (window));
2526 if (GDK_WINDOW_DESTROYED (window))
2530 g_message("unimplemented %s", __FUNCTION__);
2534 gdk_directfb_window_set_child_shapes (GdkWindow *window)
2539 gdk_directfb_window_merge_child_shapes (GdkWindow *window)
2544 gdk_window_set_child_input_shapes (GdkWindow *window)
2549 gdk_window_merge_child_input_shapes (GdkWindow *window)
2554 gdk_directfb_window_set_static_gravities (GdkWindow *window,
2555 gboolean use_static)
2557 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2559 if (GDK_WINDOW_DESTROYED (window))
2563 g_message("unimplemented %s", __FUNCTION__);
2569 gdk_window_begin_resize_drag (GdkWindow *window,
2576 g_return_if_fail (GDK_IS_WINDOW (window));
2578 if (GDK_WINDOW_DESTROYED (window))
2581 g_message("unimplemented %s", __FUNCTION__);
2585 gdk_window_begin_move_drag (GdkWindow *window,
2591 g_return_if_fail (GDK_IS_WINDOW (window));
2593 if (GDK_WINDOW_DESTROYED (window))
2596 g_message("unimplemented %s", __FUNCTION__);
2600 * gdk_window_get_frame_extents:
2601 * @window: a #GdkWindow
2602 * @rect: rectangle to fill with bounding box of the window frame
2604 * Obtains the bounding box of the window, including window manager
2605 * titlebar/borders if any. The frame position is given in root window
2606 * coordinates. To get the position of the window itself (rather than
2607 * the frame) in root window coordinates, use gdk_window_get_origin().
2611 gdk_window_get_frame_extents (GdkWindow *window,
2614 GdkWindowObject *private;
2615 GdkDrawableImplDirectFB *impl;
2617 g_return_if_fail (GDK_IS_WINDOW (window));
2618 g_return_if_fail (rect != NULL);
2620 if (GDK_WINDOW_DESTROYED (window))
2623 private = GDK_WINDOW_OBJECT (window);
2625 while (private->parent && ((GdkWindowObject*) private->parent)->parent)
2626 private = (GdkWindowObject*) private->parent;
2627 if (GDK_WINDOW_DESTROYED (window))
2630 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
2632 rect->x = impl->abs_x;
2633 rect->y = impl->abs_y;
2634 rect->width = impl->width;
2635 rect->height = impl->height;
2639 * Given a directfb window and a subsurface of that window
2640 * create a gdkwindow child wrapper
2642 GdkWindow *gdk_directfb_create_child_window(GdkWindow *parent,
2643 IDirectFBSurface *subsurface)
2646 GdkWindowObject *private;
2647 GdkWindowObject *parent_private;
2648 GdkWindowImplDirectFB *impl;
2649 GdkWindowImplDirectFB *parent_impl;
2652 g_return_val_if_fail (parent != NULL, NULL);
2654 window = g_object_new (GDK_TYPE_WINDOW, NULL);
2655 private = GDK_WINDOW_OBJECT (window);
2656 parent_private = GDK_WINDOW_OBJECT (parent);
2657 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
2658 private->parent = parent_private;
2660 subsurface->GetPosition(subsurface,&x,&y);
2661 subsurface->GetSize(subsurface,&w,&h);
2663 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2664 impl->drawable.wrapper = GDK_DRAWABLE (window);
2669 _gdk_directfb_calc_abs (window);
2671 impl->drawable.width = w;
2672 impl->drawable.height = h;
2673 private->window_type = GDK_WINDOW_CHILD;
2674 impl->drawable.surface = subsurface;
2675 impl->drawable.format = parent_impl->drawable.format;
2676 private->depth = parent_private->depth;
2677 gdk_drawable_set_colormap (GDK_DRAWABLE (window),
2678 gdk_drawable_get_colormap (parent));
2679 gdk_window_set_cursor (window, NULL);
2680 parent_private->children = g_list_prepend (parent_private->children,window);
2681 /*we hold a reference count on ourselves */
2682 g_object_ref (window);
2689 * The wrapping is not perfect since directfb does not give full access
2690 * to the current state of a window event mask etc need to fix dfb
2693 gdk_window_foreign_new_for_display (GdkDisplay* display,GdkNativeWindow anid)
2695 GdkWindow *window = NULL;
2696 GdkWindow *parent =NULL;
2697 GdkWindowObject *private =NULL;
2698 GdkWindowObject *parent_private =NULL;
2699 GdkWindowImplDirectFB *parent_impl =NULL;
2700 GdkWindowImplDirectFB *impl =NULL;
2701 DFBWindowOptions options;
2703 GdkDisplayDFB * gdkdisplay = _gdk_display;
2704 IDirectFBWindow *dfbwindow;
2706 window = gdk_window_lookup (anid);
2709 g_object_ref (window);
2712 if( display != NULL )
2713 gdkdisplay = GDK_DISPLAY_DFB(display);
2715 ret = gdkdisplay->layer->GetWindow (gdkdisplay->layer,
2716 (DFBWindowID)anid,&dfbwindow);
2718 if (ret != DFB_OK) {
2719 DirectFBError ("gdk_window_new: Layer->GetWindow failed", ret);
2723 parent = _gdk_parent_root;
2726 parent_private = GDK_WINDOW_OBJECT (parent);
2727 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
2730 window = g_object_new (GDK_TYPE_WINDOW, NULL);
2731 /* we hold a reference count on ourselves */
2732 g_object_ref (window);
2733 private = GDK_WINDOW_OBJECT (window);
2734 private->parent = parent_private;
2735 private->window_type = GDK_WINDOW_TOPLEVEL;
2736 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2738 impl->drawable.wrapper = GDK_DRAWABLE (window);
2739 impl->window = dfbwindow;
2740 dfbwindow->GetOptions(dfbwindow,&options);
2741 dfbwindow->GetPosition(dfbwindow,&private->x,&private->y);
2742 dfbwindow->GetSize(dfbwindow,&impl->drawable.width,&impl->drawable.height);
2745 private->input_only = FALSE;
2747 if( dfbwindow->GetSurface (dfbwindow, &impl->drawable.surface) == DFB_UNSUPPORTED ){
2748 private->input_only = TRUE;
2749 impl->drawable.surface = NULL;
2752 * Position ourselevs
2754 _gdk_directfb_calc_abs (window);
2756 /* We default to all events least surprise to the user
2757 * minus the poll for motion events
2759 gdk_window_set_events (window, (GDK_ALL_EVENTS_MASK ^ GDK_POINTER_MOTION_HINT_MASK));
2761 if (impl->drawable.surface)
2763 impl->drawable.surface->GetPixelFormat (impl->drawable.surface,
2764 &impl->drawable.format);
2766 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
2768 gdk_drawable_set_colormap (GDK_DRAWABLE (window), gdk_drawable_get_colormap (parent));
2770 gdk_drawable_set_colormap (GDK_DRAWABLE (window), gdk_colormap_get_system());
2773 //can be null for the soft cursor window itself when
2774 //running a gtk directfb wm
2775 if( gdk_display_get_default() != NULL ) {
2776 gdk_window_set_cursor (window,NULL);
2780 parent_private->children = g_list_prepend (parent_private->children,
2782 impl->dfb_id = (DFBWindowID)anid;
2783 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
2784 gdk_directfb_event_windows_add (window);
2790 gdk_window_lookup_for_display (GdkDisplay *display,GdkNativeWindow anid)
2792 return gdk_directfb_window_id_table_lookup ((DFBWindowID) anid);
2796 gdk_window_lookup (GdkNativeWindow anid)
2798 return gdk_directfb_window_id_table_lookup ((DFBWindowID) anid);
2801 IDirectFBWindow *gdk_directfb_window_lookup(GdkWindow *window )
2803 GdkWindowObject *private;
2804 GdkWindowImplDirectFB *impl;
2805 g_return_val_if_fail (GDK_IS_WINDOW (window),NULL);
2806 private = GDK_WINDOW_OBJECT (window);
2807 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2808 return impl->window;
2811 IDirectFBSurface *gdk_directfb_surface_lookup(GdkWindow *window)
2813 GdkWindowObject *private;
2814 GdkWindowImplDirectFB *impl;
2815 g_return_val_if_fail (GDK_IS_WINDOW (window),NULL);
2816 private = GDK_WINDOW_OBJECT (window);
2817 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2818 return impl->drawable.surface;
2822 gdk_window_fullscreen (GdkWindow *window)
2824 g_return_if_fail (GDK_IS_WINDOW (window));
2825 g_warning ("gdk_window_fullscreen() not implemented.\n");
2829 gdk_window_unfullscreen (GdkWindow *window)
2831 g_return_if_fail (GDK_IS_WINDOW (window));
2832 /* g_warning ("gdk_window_unfullscreen() not implemented.\n");*/
2836 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
2838 g_return_if_fail (GDK_IS_WINDOW (window));
2839 static gboolean first_call = TRUE;
2841 g_warning ("gdk_window_set_keep_above() not implemented.\n");
2848 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
2850 g_return_if_fail (GDK_IS_WINDOW (window));
2851 static gboolean first_call = TRUE;
2853 g_warning ("gdk_window_set_keep_below() not implemented.\n");
2860 gdk_window_enable_synchronized_configure (GdkWindow *window)
2865 gdk_window_configure_finished (GdkWindow *window)
2870 gdk_display_warp_pointer (GdkDisplay *display,
2875 g_warning ("gdk_display_warp_pointer() not implemented.\n");
2879 gdk_window_set_urgency_hint (GdkWindow *window,
2882 g_return_if_fail (GDK_IS_WINDOW (window));
2883 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD);
2885 if (GDK_WINDOW_DESTROYED (window))
2888 g_warning ("gdk_window_set_urgency_hint() not implemented.\n");
2893 gdk_window_impl_directfb_invalidate_maybe_recurse (GdkPaintable *paintable,
2894 const GdkRegion *region,
2895 gboolean (*child_func) (GdkWindow *, gpointer),
2899 GdkWindowObject *private;
2900 GdkWindowImplDirectFB *wimpl;
2901 GdkDrawableImplDirectFB *impl;
2903 wimpl = GDK_WINDOW_IMPL_DIRECTFB (paintable);
2904 impl = (GdkDrawableImplDirectFB *)wimpl;
2905 window = wimpl->gdkWindow;
2906 private = (GdkWindowObject *)window;
2908 GdkRegion visible_region;
2911 g_return_if_fail (window != NULL);
2912 g_return_if_fail (GDK_IS_WINDOW (window));
2914 if (GDK_WINDOW_DESTROYED (window))
2917 if (private->input_only || !GDK_WINDOW_IS_MAPPED (window))
2920 temp_region_init_rectangle_vals( &visible_region, 0, 0, impl->width, impl->height );
2921 gdk_region_intersect (&visible_region, region);
2923 tmp_list = private->children;
2926 GdkWindowObject *child = tmp_list->data;
2927 GdkDrawableImplDirectFB *cimpl = (GdkDrawableImplDirectFB *) child->impl;
2929 if (!child->input_only)
2931 GdkRegion child_region;
2933 temp_region_init_rectangle_vals( &child_region, child->x, child->y, cimpl->width, cimpl->height );
2935 /* remove child area from the invalid area of the parent */
2936 if (GDK_WINDOW_IS_MAPPED (child) && !child->shaped)
2937 gdk_region_subtract (&visible_region, &child_region);
2939 if (child_func && (*child_func) ((GdkWindow *)child, user_data))
2941 gdk_region_intersect (&child_region, region);
2942 gdk_region_offset (&child_region, - child->x, - child->y);
2944 gdk_window_invalidate_maybe_recurse ((GdkWindow *)child,
2945 &child_region, child_func, user_data);
2948 temp_region_deinit( &child_region );
2951 tmp_list = tmp_list->next;
2954 if (!gdk_region_empty (&visible_region))
2957 if (private->update_area)
2959 gdk_region_union (private->update_area, &visible_region);
2963 update_windows = g_slist_prepend (update_windows, window);
2964 private->update_area = gdk_region_copy (&visible_region);
2965 gdk_window_schedule_update (window);
2969 temp_region_deinit( &visible_region );
2974 gdk_window_impl_directfb_process_updates (GdkPaintable *paintable,
2975 gboolean update_children)
2977 GdkWindowImplDirectFB *wimpl;
2978 GdkDrawableImplDirectFB *impl;
2980 GdkWindowObject *private;
2981 GdkRegion *update_area;
2983 wimpl = GDK_WINDOW_IMPL_DIRECTFB (paintable);
2984 impl = (GdkDrawableImplDirectFB *)wimpl;
2985 window = wimpl->gdkWindow;
2986 private = (GdkWindowObject *)window;
2988 D_DEBUG_AT( GDKDFB_Paintable, "%s( %p, %schildren )\n", __FUNCTION__,
2989 paintable, update_children ? "update " : "no " );
2991 /* If an update got queued during update processing, we can get a
2992 * window in the update queue that has an empty update_area.
2995 if (!private->update_area)
2998 update_area = private->update_area;
2999 private->update_area = NULL;
3001 D_DEBUG_AT( GDKDFB_Paintable, " -> update area %4d,%4d-%4dx%4d\n",
3002 GDKDFB_RECTANGLE_VALS_FROM_BOX( &update_area->extents ) );
3004 if (_gdk_event_func && gdk_window_is_viewable (window))
3006 GdkRegion *expose_region = update_area;
3007 GdkRegion window_region;
3009 temp_region_init_rectangle_vals( &window_region, 0, 0, impl->width, impl->height );
3010 gdk_region_intersect( expose_region, &window_region );
3011 temp_region_deinit (&window_region);
3013 if (!gdk_region_empty (expose_region) && (private->event_mask & GDK_EXPOSURE_MASK))
3017 event.expose.type = GDK_EXPOSE;
3018 event.expose.window = g_object_ref (window);
3019 event.expose.send_event = FALSE;
3020 event.expose.count = 0;
3021 event.expose.region = expose_region;
3022 gdk_region_get_clipbox (expose_region, &event.expose.area);
3023 (*_gdk_event_func) (&event, _gdk_event_data);
3025 g_object_unref (window);
3028 if (expose_region != update_area)
3029 gdk_region_destroy (expose_region);
3032 gdk_region_destroy (update_area);
3037 gdk_window_impl_directfb_begin_paint_region (GdkPaintable *paintable,
3038 const GdkRegion *region)
3040 GdkDrawableImplDirectFB *impl;
3041 GdkWindowImplDirectFB *wimpl;
3045 g_assert (region != NULL );
3046 wimpl = GDK_WINDOW_IMPL_DIRECTFB (paintable);
3047 impl = (GdkDrawableImplDirectFB *)wimpl;
3052 D_DEBUG_AT( GDKDFB_Window, "%s( %p ) <- %4d,%4d-%4d,%4d (%ld boxes)\n", __FUNCTION__,
3053 paintable, GDKDFB_RECTANGLE_VALS_FROM_BOX(®ion->extents), region->numRects );
3055 /* When it's buffered... */
3058 /* ...we're already painting on it! */
3059 g_assert( impl->paint_depth > 0 );
3061 D_DEBUG_AT( GDKDFB_Window, " -> painted %4d,%4d-%4dx%4d (%ld boxes)\n",
3062 DFB_RECTANGLE_VALS_FROM_REGION( &impl->paint_region.extents ), impl->paint_region.numRects );
3064 /* Add the new region to the paint region... */
3065 gdk_region_union (&impl->paint_region, region);
3069 /* ...otherwise it's the first time! */
3070 g_assert( impl->paint_depth == 0 );
3072 /* Generate the clip region for painting around child windows. */
3073 gdk_directfb_clip_region( GDK_DRAWABLE(paintable), NULL, NULL, &impl->clip_region );
3075 /* Initialize the paint region with the new one... */
3076 temp_region_init_copy( &impl->paint_region, region );
3078 impl->buffered = TRUE;
3081 D_DEBUG_AT( GDKDFB_Window, " -> painting %4d,%4d-%4dx%4d (%ld boxes)\n",
3082 DFB_RECTANGLE_VALS_FROM_REGION( &impl->paint_region.extents ), impl->paint_region.numRects );
3084 /* ...but clip the initial/compound result against the clip region. */
3085 gdk_region_intersect (&impl->paint_region, &impl->clip_region);
3087 D_DEBUG_AT( GDKDFB_Window, " -> clipped %4d,%4d-%4dx%4d (%ld boxes)\n",
3088 DFB_RECTANGLE_VALS_FROM_REGION( &impl->paint_region.extents ), impl->paint_region.numRects );
3090 impl->paint_depth++;
3092 D_DEBUG_AT( GDKDFB_Window, " -> depth is now %d\n", impl->paint_depth );
3094 for (i = 0; i < region->numRects; i++)
3096 GdkRegionBox *box = ®ion->rects[i];
3098 D_DEBUG_AT( GDKDFB_Window, " -> [%2d] %4d,%4d-%4dx%4d\n", i, GDKDFB_RECTANGLE_VALS_FROM_BOX( box ) );
3100 gdk_window_clear_area (GDK_WINDOW(wimpl->gdkWindow),
3109 gdk_window_impl_directfb_end_paint (GdkPaintable *paintable)
3111 GdkDrawableImplDirectFB *impl;
3113 impl = GDK_DRAWABLE_IMPL_DIRECTFB (paintable);
3115 D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, paintable );
3117 g_return_if_fail (impl->paint_depth > 0);
3119 g_assert( impl->buffered );
3121 impl->paint_depth--;
3123 #ifdef GDK_DIRECTFB_NO_EXPERIMENTS
3124 if (impl->paint_depth == 0)
3126 impl->buffered = FALSE;
3128 if (impl->paint_region.numRects)
3130 DFBRegion reg = { impl->paint_region.extents.x1,
3131 impl->paint_region.extents.y1,
3132 impl->paint_region.extents.x2-1,
3133 impl->paint_region.extents.y2-1 };
3135 D_DEBUG_AT( GDKDFB_Window, " -> flip %4d,%4d-%4dx%4d (%ld boxes)\n",
3136 DFB_RECTANGLE_VALS_FROM_REGION( ® ), impl->paint_region.numRects );
3138 impl->surface->Flip( impl->surface, ®, 0 );
3140 temp_region_reset( &impl->paint_region );
3144 if (impl->paint_depth == 0)
3146 impl->buffered = FALSE;
3148 temp_region_deinit( &impl->clip_region );
3150 if (impl->paint_region.numRects)
3152 GdkWindow *window = GDK_WINDOW( impl->wrapper );
3154 if (GDK_IS_WINDOW(window))
3156 GdkWindowObject *top = GDK_WINDOW_OBJECT( gdk_window_get_toplevel( window ) );
3161 GdkWindowImplDirectFB *wimpl = GDK_WINDOW_IMPL_DIRECTFB (top->impl);
3163 reg.x1 = impl->abs_x - top->x + impl->paint_region.extents.x1;
3164 reg.y1 = impl->abs_y - top->y + impl->paint_region.extents.y1;
3165 reg.x2 = impl->abs_x - top->x + impl->paint_region.extents.x2 - 1;
3166 reg.y2 = impl->abs_y - top->y + impl->paint_region.extents.y2 - 1;
3168 D_DEBUG_AT( GDKDFB_Window, " -> queue flip %4d,%4d-%4dx%4d (%ld boxes)\n",
3169 DFB_RECTANGLE_VALS_FROM_REGION( ® ), impl->paint_region.numRects );
3171 dfb_updates_add( &wimpl->flips, ® );
3175 temp_region_reset( &impl->paint_region );
3180 D_DEBUG_AT( GDKDFB_Window, " -> depth is still %d\n", impl->paint_depth );
3185 gdk_window_impl_directfb_paintable_init (GdkPaintableIface *iface)
3187 iface->begin_paint_region = gdk_window_impl_directfb_begin_paint_region;
3188 iface->end_paint = gdk_window_impl_directfb_end_paint;
3190 iface->invalidate_maybe_recurse = gdk_window_impl_directfb_invalidate_maybe_recurse;
3191 iface->process_updates = gdk_window_impl_directfb_process_updates;
3195 gdk_window_beep (GdkWindow *window)
3197 gdk_display_beep (gdk_display_get_default());
3201 gdk_window_set_opacity (GdkWindow *window,
3204 GdkDisplay *display;
3207 g_return_if_fail (GDK_IS_WINDOW (window));
3209 if (GDK_WINDOW_DESTROYED (window))
3212 display = gdk_drawable_get_display (window);
3216 else if (opacity > 1)
3218 cardinal = opacity * 0xff;
3219 gdk_directfb_window_set_opacity(window,cardinal);
3223 _gdk_windowing_window_set_composited (GdkWindow *window,
3224 gboolean composited)
3229 gdk_window_impl_iface_init (GdkWindowImplIface *iface)
3231 iface->show = gdk_directfb_window_show;
3232 iface->hide = gdk_directfb_window_hide;
3233 iface->withdraw = gdk_directfb_window_withdraw;
3234 iface->raise = gdk_window_directfb_raise;
3235 iface->lower = gdk_window_directfb_lower;
3236 iface->move_resize = gdk_directfb_window_move_resize;
3237 iface->move_region = _gdk_directfb_window_move_region;
3238 iface->scroll = _gdk_directfb_window_scroll;
3239 iface->clear_area = gdk_directfb_window_clear_area;
3240 iface->set_background = gdk_directfb_window_set_background;
3241 iface->set_back_pixmap = gdk_directfb_window_set_back_pixmap;
3242 iface->get_events = gdk_directfb_window_get_events;
3243 iface->set_events = gdk_directfb_window_set_events;
3244 iface->reparent = gdk_directfb_window_reparent;
3245 iface->set_cursor = gdk_directfb_window_set_cursor;
3246 iface->get_geometry = gdk_directfb_window_get_geometry;
3247 iface->get_origin = gdk_directfb_window_get_origin;
3248 iface->get_offsets = _gdk_directfb_window_get_offsets;
3249 iface->shape_combine_mask = gdk_directfb_window_shape_combine_mask;
3250 iface->shape_combine_region = gdk_directfb_window_shape_combine_region;
3251 iface->set_child_shapes = gdk_directfb_window_set_child_shapes;
3252 iface->merge_child_shapes = gdk_directfb_window_merge_child_shapes;
3253 iface->set_static_gravities = gdk_directfb_window_set_static_gravities;
3256 #define __GDK_WINDOW_X11_C__
3257 #include "gdkaliasdef.c"