1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3 * Copyright (C) 1998-1999 Tor Lillqvist
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
22 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
23 * file for a list of people on the GTK+ Team.
27 * GTK+ DirectFB backend
28 * Copyright (C) 2001-2002 convergence integrated media GmbH
29 * Copyright (C) 2002-2004 convergence GmbH
30 * Written by Denis Oliver Kropp <dok@convergence.de> and
31 * Sven Neumann <sven@convergence.de>
36 #include "gdkwindow.h"
38 #include "gdkdirectfb.h"
39 #include "gdkprivate-directfb.h"
40 #include "gdkdisplay-directfb.h"
42 #include "gdkregion-generic.h"
44 #include "gdkinternals.h"
49 #include <directfb_util.h>
51 static GdkRegion * gdk_window_impl_directfb_get_visible_region (GdkDrawable *drawable);
52 static void gdk_window_impl_directfb_set_colormap (GdkDrawable *drawable,
53 GdkColormap *colormap);
54 static void gdk_window_impl_directfb_init (GdkWindowImplDirectFB *window);
55 static void gdk_window_impl_directfb_class_init (GdkWindowImplDirectFBClass *klass);
56 static void gdk_window_impl_directfb_finalize (GObject *object);
60 GdkWindowChildChanged changed;
61 GdkWindowChildGetPos get_pos;
63 } GdkWindowChildHandlerData;
66 /* Code for dirty-region queueing
68 static GSList *update_windows = NULL;
69 static guint update_idle = 0;
72 gdk_window_directfb_process_all_updates (void)
74 GSList *old_update_windows = update_windows;
75 GSList *tmp_list = update_windows;
78 g_source_remove (update_idle);
80 update_windows = NULL;
83 g_slist_foreach (old_update_windows, (GFunc)g_object_ref, NULL);
87 GdkWindowObject *private = (GdkWindowObject *)tmp_list->data;
89 if (private->update_freeze_count)
90 update_windows = g_slist_prepend (update_windows, private);
92 gdk_window_process_updates(tmp_list->data,TRUE);
94 g_object_unref (tmp_list->data);
95 tmp_list = tmp_list->next;
99 #ifndef GDK_DIRECTFB_NO_EXPERIMENTS
100 tmp_list = old_update_windows;
102 g_slist_foreach (old_update_windows, (GFunc)g_object_ref, NULL);
105 GdkWindowObject *top = GDK_WINDOW_OBJECT( gdk_window_get_toplevel( tmp_list->data ) );
108 GdkWindowImplDirectFB *wimpl = GDK_WINDOW_IMPL_DIRECTFB (top->impl);
110 if (wimpl->flips.num_regions) {
111 //direct_log_printf( NULL, "Flipping bounding box of paints: %d,%d - %dx%d (top %p, wimpl %p)\n",
112 // DFB_RECTANGLE_VALS_FROM_REGION( &wimpl->flips.bounding ), top, wimpl );
114 wimpl->drawable.surface->Flip( wimpl->drawable.surface, &wimpl->flips.bounding, DSFLIP_NONE );
116 dfb_updates_reset( &wimpl->flips );
121 g_object_unref (tmp_list->data);
122 tmp_list = tmp_list->next;
127 g_slist_free (old_update_windows);
132 gdk_window_update_idle (gpointer data)
134 gdk_window_directfb_process_all_updates ();
140 gdk_window_schedule_update (GdkWindow *window)
142 if (window && GDK_WINDOW_OBJECT (window)->update_freeze_count)
147 update_idle = gdk_threads_add_idle_full (GDK_PRIORITY_REDRAW,
148 gdk_window_update_idle, NULL, NULL);
153 static GdkWindow *gdk_directfb_window_containing_pointer = NULL;
154 static GdkWindow *gdk_directfb_focused_window = NULL;
155 static gpointer parent_class = NULL;
156 GdkWindow * _gdk_parent_root = NULL;
158 gdk_window_impl_directfb_paintable_init (GdkPaintableIface *iface);
165 gdk_window_impl_directfb_get_type (void)
167 static GType object_type = 0;
171 static const GTypeInfo object_info =
173 sizeof (GdkWindowImplDirectFBClass),
174 (GBaseInitFunc) NULL,
175 (GBaseFinalizeFunc) NULL,
176 (GClassInitFunc) gdk_window_impl_directfb_class_init,
177 NULL, /* class_finalize */
178 NULL, /* class_data */
179 sizeof (GdkWindowImplDirectFB),
181 (GInstanceInitFunc) gdk_window_impl_directfb_init,
184 static const GInterfaceInfo paintable_info =
186 (GInterfaceInitFunc) gdk_window_impl_directfb_paintable_init,
191 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_DIRECTFB,
192 "GdkWindowImplDirectFB",
194 g_type_add_interface_static (object_type,
204 _gdk_window_impl_get_type (void)
206 return gdk_window_impl_directfb_get_type ();
210 gdk_window_impl_directfb_init (GdkWindowImplDirectFB *impl)
212 impl->drawable.width = 1;
213 impl->drawable.height = 1;
214 //cannot use gdk_cursor_new here since gdk_display_get_default
216 impl->cursor = gdk_cursor_new_for_display (GDK_DISPLAY_OBJECT(_gdk_display),GDK_LEFT_PTR);
221 gdk_window_impl_directfb_class_init (GdkWindowImplDirectFBClass *klass)
223 GObjectClass *object_class = G_OBJECT_CLASS (klass);
224 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
226 parent_class = g_type_class_peek_parent (klass);
228 object_class->finalize = gdk_window_impl_directfb_finalize;
230 drawable_class->set_colormap = gdk_window_impl_directfb_set_colormap;
232 /* Visible and clip regions are the same */
234 drawable_class->get_clip_region =
235 gdk_window_impl_directfb_get_visible_region;
237 drawable_class->get_visible_region =
238 gdk_window_impl_directfb_get_visible_region;
242 g_free_2nd (gpointer a,
250 gdk_window_impl_directfb_finalize (GObject *object)
252 GdkWindowImplDirectFB *impl = GDK_WINDOW_IMPL_DIRECTFB (object);
254 if (GDK_WINDOW_IS_MAPPED (impl->drawable.wrapper))
255 gdk_window_hide (impl->drawable.wrapper);
258 gdk_cursor_unref (impl->cursor);
260 if (impl->properties)
262 g_hash_table_foreach (impl->properties, g_free_2nd, NULL);
263 g_hash_table_destroy (impl->properties);
267 gdk_directfb_window_id_table_remove (impl->dfb_id);
268 /* native window resource must be release before we can finalize !*/
272 if (G_OBJECT_CLASS (parent_class)->finalize)
273 G_OBJECT_CLASS (parent_class)->finalize (object);
277 gdk_window_impl_directfb_get_visible_region (GdkDrawable *drawable)
279 GdkDrawableImplDirectFB *priv = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
280 GdkRectangle rect = { 0, 0, 0, 0 };
281 DFBRectangle drect = { 0, 0, 0, 0 };
284 priv->surface->GetVisibleRectangle (priv->surface, &drect);
289 return gdk_region_rectangle (&rect);
293 gdk_window_impl_directfb_set_colormap (GdkDrawable *drawable,
294 GdkColormap *colormap)
296 GDK_DRAWABLE_CLASS (parent_class)->set_colormap (drawable, colormap);
300 GdkDrawableImplDirectFB *priv = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
304 IDirectFBPalette *palette = gdk_directfb_colormap_get_palette (colormap);
307 priv->surface->SetPalette (priv->surface, palette);
314 create_directfb_window (GdkWindowImplDirectFB *impl,
315 DFBWindowDescription *desc,
316 DFBWindowOptions window_options)
319 IDirectFBWindow *window;
321 ret = _gdk_display->layer->CreateWindow (_gdk_display->layer, desc, &window);
325 DirectFBError ("gdk_window_new: Layer->CreateWindow failed", ret);
330 if ((desc->flags & DWDESC_CAPS) && (desc->caps & DWCAPS_INPUTONLY))
332 impl->drawable.surface = NULL;
334 window->GetSurface (window, &impl->drawable.surface);
338 DFBWindowOptions options;
339 window->GetOptions (window, &options);
340 window->SetOptions (window, options | window_options);
343 impl->window = window;
345 #ifndef GDK_DIRECTFB_NO_EXPERIMENTS
346 //direct_log_printf( NULL, "Initializing (window %p, wimpl %p)\n", win, impl );
348 dfb_updates_init( &impl->flips, impl->flip_regions, G_N_ELEMENTS(impl->flip_regions) );
355 _gdk_windowing_window_init (void)
357 GdkWindowObject *private;
358 GdkWindowImplDirectFB *impl;
359 DFBDisplayLayerConfig dlc;
361 g_assert (_gdk_parent_root == NULL);
363 _gdk_display->layer->GetConfiguration(
364 _gdk_display->layer, &dlc );
366 _gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL);
367 private = GDK_WINDOW_OBJECT (_gdk_parent_root);
368 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
370 private->window_type = GDK_WINDOW_ROOT;
372 private->children = NULL;
373 // impl->drawable.paint_region = NULL;
374 impl->gdkWindow = _gdk_parent_root;
376 impl->drawable.abs_x = 0;
377 impl->drawable.abs_y = 0;
378 impl->drawable.width = dlc.width;
379 impl->drawable.height = dlc.height;
380 impl->drawable.wrapper = GDK_DRAWABLE (private);
381 /* custom root window init */
383 DFBWindowDescription desc;
385 /*XXX I must do this now its a bug ALPHA ROOT*/
387 desc.flags = DWDESC_CAPS;
389 desc.caps |= DWCAPS_NODECORATION;
390 desc.caps |= DWCAPS_ALPHACHANNEL;
391 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
392 DWDESC_POSX | DWDESC_POSY );
395 desc.width = dlc.width;
396 desc.height = dlc.height;
397 create_directfb_window (impl,&desc,0);
398 g_assert(impl->window != NULL);
399 g_assert(impl->drawable.surface != NULL );
401 impl->drawable.surface->GetPixelFormat(impl->drawable.surface,&impl->drawable.format);
402 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
404 Now we can set up the system colormap
406 gdk_drawable_set_colormap (GDK_DRAWABLE (_gdk_parent_root),gdk_colormap_get_system());
412 gdk_directfb_window_new (GdkWindow *parent,
413 GdkWindowAttr *attributes,
414 gint attributes_mask,
415 DFBWindowCapabilities window_caps,
416 DFBWindowOptions window_options,
417 DFBSurfaceCapabilities surface_caps)
420 GdkWindowObject *private;
421 GdkWindowObject *parent_private;
422 GdkWindowImplDirectFB *impl;
423 GdkWindowImplDirectFB *parent_impl;
425 DFBWindowDescription desc;
428 g_return_val_if_fail (attributes != NULL, NULL);
430 if (!parent || attributes->window_type != GDK_WINDOW_CHILD)
431 parent = _gdk_parent_root;
433 window = g_object_new (GDK_TYPE_WINDOW, NULL);
434 private = GDK_WINDOW_OBJECT (window);
436 parent_private = GDK_WINDOW_OBJECT (parent);
437 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
438 private->parent = parent_private;
440 x = (attributes_mask & GDK_WA_X) ? attributes->x : 0;
441 y = (attributes_mask & GDK_WA_Y) ? attributes->y : 0;
443 gdk_window_set_events (window, attributes->event_mask | GDK_STRUCTURE_MASK);
445 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
446 impl->drawable.wrapper = GDK_DRAWABLE (window);
447 impl->gdkWindow = window;
452 _gdk_directfb_calc_abs (window);
454 impl->drawable.width = MAX (1, attributes->width);
455 impl->drawable.height = MAX (1, attributes->height);
457 private->window_type = attributes->window_type;
461 if (attributes_mask & GDK_WA_VISUAL)
462 visual = attributes->visual;
464 visual = gdk_drawable_get_visual (parent);
466 switch (attributes->wclass)
468 case GDK_INPUT_OUTPUT:
469 private->input_only = FALSE;
471 desc.flags |= DWDESC_PIXELFORMAT;
472 desc.pixelformat = ((GdkVisualDirectFB *) visual)->format;
474 if (DFB_PIXELFORMAT_HAS_ALPHA (desc.pixelformat))
476 desc.flags |= DWDESC_CAPS;
477 desc.caps = DWCAPS_ALPHACHANNEL;
482 private->input_only = TRUE;
483 desc.flags |= DWDESC_CAPS;
484 desc.caps = DWCAPS_INPUTONLY;
488 g_warning ("gdk_window_new: unsupported window class\n");
489 _gdk_window_destroy (window, FALSE);
493 switch (private->window_type)
495 case GDK_WINDOW_TOPLEVEL:
496 case GDK_WINDOW_DIALOG:
497 case GDK_WINDOW_TEMP:
498 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
499 DWDESC_POSX | DWDESC_POSY );
502 desc.width = impl->drawable.width;
503 desc.height = impl->drawable.height;
507 if (! (desc.flags & DWDESC_CAPS))
509 desc.flags |= DWDESC_CAPS;
510 desc.caps = DWCAPS_NONE;
513 desc.caps |= window_caps;
518 desc.flags |= DWDESC_SURFACE_CAPS;
519 desc.surface_caps = surface_caps;
523 if (!create_directfb_window (impl, &desc, window_options))
526 _gdk_window_destroy (window, FALSE);
529 if( desc.caps != DWCAPS_INPUTONLY )
530 impl->window->SetOpacity(impl->window, 0x00 );
533 case GDK_WINDOW_CHILD:
535 if (!private->input_only && parent_impl->drawable.surface)
539 { x, y, impl->drawable.width, impl->drawable.height };
540 parent_impl->drawable.surface->GetSubSurface (parent_impl->drawable.surface,
542 &impl->drawable.surface);
547 g_warning ("gdk_window_new: unsupported window type: %d",
548 private->window_type);
549 _gdk_window_destroy (window, FALSE);
553 if (impl->drawable.surface)
555 GdkColormap *colormap;
557 impl->drawable.surface->GetPixelFormat (impl->drawable.surface,
558 &impl->drawable.format);
560 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
562 if ((attributes_mask & GDK_WA_COLORMAP) && attributes->colormap)
564 colormap = attributes->colormap;
568 if (gdk_visual_get_system () == visual)
569 colormap = gdk_colormap_get_system ();
571 colormap =gdk_drawable_get_colormap (parent);
574 gdk_drawable_set_colormap (GDK_DRAWABLE (window), colormap);
578 impl->drawable.format = ((GdkVisualDirectFB *)visual)->format;
579 private->depth = visual->depth;
582 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
583 (attributes->cursor) : NULL));
586 parent_private->children = g_list_prepend (parent_private->children,
589 /* we hold a reference count on ourselves */
590 g_object_ref (window);
594 impl->window->GetID (impl->window, &impl->dfb_id);
595 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
596 gdk_directfb_event_windows_add (window);
599 if (attributes_mask & GDK_WA_TYPE_HINT)
600 gdk_window_set_type_hint (window, attributes->type_hint);
606 gdk_window_new (GdkWindow *parent,
607 GdkWindowAttr *attributes,
608 gint attributes_mask)
610 g_return_val_if_fail (attributes != NULL, NULL);
612 return gdk_directfb_window_new (parent, attributes, attributes_mask,
613 DWCAPS_NONE, DWOP_NONE, DSCAPS_NONE);
616 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
618 /* It's somebody else's window, but in our heirarchy,
619 * so reparent it to the root window, and then send
620 * it a delete event, as if we were a WM
622 _gdk_windowing_window_destroy (window,TRUE,TRUE);
627 _gdk_windowing_window_destroy (GdkWindow *window,
629 gboolean foreign_destroy)
631 GdkWindowObject *private;
632 GdkWindowImplDirectFB *impl;
634 g_return_if_fail (GDK_IS_WINDOW (window));
636 private = GDK_WINDOW_OBJECT (window);
637 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
639 _gdk_selection_window_destroyed (window);
640 #if (DIRECTFB_MAJOR_VERSION >= 1)
641 gdk_directfb_event_windows_remove (window);
643 if (window == _gdk_directfb_pointer_grab_window)
644 gdk_pointer_ungrab (GDK_CURRENT_TIME);
645 if (window == _gdk_directfb_keyboard_grab_window)
646 gdk_keyboard_ungrab (GDK_CURRENT_TIME);
648 if (window == gdk_directfb_focused_window)
649 gdk_directfb_change_focus (NULL);
652 if (impl->drawable.surface) {
653 GdkDrawableImplDirectFB *dimpl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
654 if(dimpl->cairo_surface) {
655 cairo_surface_destroy(dimpl->cairo_surface);
656 dimpl->cairo_surface= NULL;
658 impl->drawable.surface->Release (impl->drawable.surface);
659 impl->drawable.surface = NULL;
662 if (!recursing && !foreign_destroy && impl->window ) {
663 impl->window->SetOpacity (impl->window,0);
664 impl->window->Close(impl->window);
665 impl->window->Release(impl->window);
670 /* This function is called when the window is really gone.
673 gdk_window_destroy_notify (GdkWindow *window)
675 g_return_if_fail (GDK_IS_WINDOW (window));
677 if (!GDK_WINDOW_DESTROYED (window))
679 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
680 g_warning ("GdkWindow %p unexpectedly destroyed", window);
682 _gdk_window_destroy (window, TRUE);
684 g_object_unref (window);
687 /* Focus follows pointer */
689 gdk_directfb_window_find_toplevel (GdkWindow *window)
691 while (window && window != _gdk_parent_root)
693 GdkWindow *parent = (GdkWindow *) (GDK_WINDOW_OBJECT (window))->parent;
695 if ((parent == _gdk_parent_root) && GDK_WINDOW_IS_MAPPED (window))
701 return _gdk_parent_root;
705 gdk_directfb_window_find_focus (void)
707 if (_gdk_directfb_keyboard_grab_window)
708 return _gdk_directfb_keyboard_grab_window;
710 if (!gdk_directfb_focused_window)
711 gdk_directfb_focused_window = g_object_ref (_gdk_parent_root);
713 return gdk_directfb_focused_window;
717 gdk_directfb_change_focus (GdkWindow *new_focus_window)
719 GdkEventFocus *event;
722 GdkWindow *event_win;
725 /* No focus changes while the pointer is grabbed */
726 if (_gdk_directfb_pointer_grab_window)
729 old_win = gdk_directfb_focused_window;
730 new_win = gdk_directfb_window_find_toplevel (new_focus_window);
732 if (old_win == new_win)
737 event_win = gdk_directfb_keyboard_event_window (old_win,
741 event = (GdkEventFocus *) gdk_directfb_event_make (event_win,
747 event_win = gdk_directfb_keyboard_event_window (new_win,
751 event = (GdkEventFocus *) gdk_directfb_event_make (event_win,
756 if (gdk_directfb_focused_window)
757 g_object_unref (gdk_directfb_focused_window);
758 gdk_directfb_focused_window = g_object_ref (new_win);
762 gdk_window_set_accept_focus (GdkWindow *window,
763 gboolean accept_focus)
765 GdkWindowObject *private;
766 g_return_if_fail (window != NULL);
767 g_return_if_fail (GDK_IS_WINDOW (window));
769 private = (GdkWindowObject *)window;
771 accept_focus = accept_focus != FALSE;
773 if (private->accept_focus != accept_focus)
774 private->accept_focus = accept_focus;
779 gdk_window_set_focus_on_map (GdkWindow *window,
780 gboolean focus_on_map)
782 GdkWindowObject *private;
783 g_return_if_fail (window != NULL);
784 g_return_if_fail (GDK_IS_WINDOW (window));
786 private = (GdkWindowObject *)window;
788 focus_on_map = focus_on_map != FALSE;
790 if (private->focus_on_map != focus_on_map)
791 private->focus_on_map = focus_on_map;
795 gdk_directfb_window_raise (GdkWindow *window)
797 GdkWindowObject *parent;
799 parent = GDK_WINDOW_OBJECT (window)->parent;
801 if (parent->children->data == window)
804 parent->children = g_list_remove (parent->children, window);
805 parent->children = g_list_prepend (parent->children, window);
811 gdk_directfb_window_lower (GdkWindow *window)
813 GdkWindowObject *parent;
815 parent = GDK_WINDOW_OBJECT (window)->parent;
817 parent->children = g_list_remove (parent->children, window);
818 parent->children = g_list_append (parent->children, window);
822 all_parents_shown (GdkWindowObject *private)
824 while (GDK_WINDOW_IS_MAPPED (private))
827 private = GDK_WINDOW_OBJECT (private)->parent;
836 send_map_events (GdkWindowObject *private)
839 GdkWindow *event_win;
841 if (!GDK_WINDOW_IS_MAPPED (private))
844 event_win = gdk_directfb_other_event_window ((GdkWindow *) private, GDK_MAP);
846 gdk_directfb_event_make (event_win, GDK_MAP);
848 for (list = private->children; list; list = list->next)
849 send_map_events (list->data);
853 gdk_directfb_find_common_ancestor (GdkWindow *win1,
859 for (a = GDK_WINDOW_OBJECT (win1); a; a = a->parent)
860 for (b = GDK_WINDOW_OBJECT (win2); b; b = b->parent)
863 return GDK_WINDOW (a);
870 gdk_directfb_window_send_crossing_events (GdkWindow *src,
872 GdkCrossingMode mode)
875 GdkWindow *win, *last, *next;
877 gint x, y, x_int, y_int;
878 GdkModifierType modifiers;
883 GdkWindow *event_win;
885 /* Do a possible cursor change before checking if we need to
886 generate crossing events so cursor changes due to pointer
887 grabs work correctly. */
889 static GdkCursorDirectFB *last_cursor = NULL;
891 GdkWindowObject *private = GDK_WINDOW_OBJECT (dest);
892 GdkWindowImplDirectFB *impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
893 GdkCursorDirectFB *cursor;
895 if (_gdk_directfb_pointer_grab_cursor)
896 cursor = (GdkCursorDirectFB*) _gdk_directfb_pointer_grab_cursor;
898 cursor = (GdkCursorDirectFB*) impl->cursor;
900 if (cursor != last_cursor)
902 win = gdk_directfb_window_find_toplevel (dest);
903 private = GDK_WINDOW_OBJECT (win);
904 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
907 impl->window->SetCursorShape (impl->window,
909 cursor->hot_x, cursor->hot_y);
910 last_cursor = cursor;
914 if (dest == gdk_directfb_window_containing_pointer)
917 if (gdk_directfb_window_containing_pointer == NULL)
918 gdk_directfb_window_containing_pointer = g_object_ref (_gdk_parent_root);
923 a = gdk_directfb_window_containing_pointer;
930 /* gdk_directfb_window_containing_pointer might have been destroyed.
931 * The refcount we hold on it should keep it, but it's parents
934 if (GDK_WINDOW_DESTROYED (a))
935 a = _gdk_parent_root;
937 gdk_directfb_mouse_get_info (&x, &y, &modifiers);
939 c = gdk_directfb_find_common_ancestor (a, b);
941 non_linear = (c != a) && (c != b);
943 event_win = gdk_directfb_pointer_event_window (a, GDK_LEAVE_NOTIFY);
946 event = gdk_directfb_event_make (event_win, GDK_LEAVE_NOTIFY);
947 event->crossing.subwindow = NULL;
949 gdk_window_get_origin (a, &x_int, &y_int);
951 event->crossing.x = x - x_int;
952 event->crossing.y = y - y_int;
953 event->crossing.x_root = x;
954 event->crossing.y_root = y;
955 event->crossing.mode = mode;
958 event->crossing.detail = GDK_NOTIFY_NONLINEAR;
960 event->crossing.detail = GDK_NOTIFY_INFERIOR;
962 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
964 event->crossing.focus = FALSE;
965 event->crossing.state = modifiers;
968 /* Traverse up from a to (excluding) c */
972 win = GDK_WINDOW (GDK_WINDOW_OBJECT (a)->parent);
976 gdk_directfb_pointer_event_window (win, GDK_LEAVE_NOTIFY);
980 event = gdk_directfb_event_make (event_win, GDK_LEAVE_NOTIFY);
982 event->crossing.subwindow = g_object_ref (last);
984 gdk_window_get_origin (win, &x_int, &y_int);
986 event->crossing.x = x - x_int;
987 event->crossing.y = y - y_int;
988 event->crossing.x_root = x;
989 event->crossing.y_root = y;
990 event->crossing.mode = mode;
993 event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
995 event->crossing.detail = GDK_NOTIFY_VIRTUAL;
997 event->crossing.focus = FALSE;
998 event->crossing.state = modifiers;
1002 win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent);
1006 /* Traverse down from c to b */
1010 win = GDK_WINDOW (GDK_WINDOW_OBJECT (b)->parent);
1013 path = g_slist_prepend (path, win);
1014 win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent);
1020 win = GDK_WINDOW (list->data);
1021 list = g_slist_next (list);
1024 next = GDK_WINDOW (list->data);
1029 gdk_directfb_pointer_event_window (win, GDK_ENTER_NOTIFY);
1033 event = gdk_directfb_event_make (event_win, GDK_ENTER_NOTIFY);
1035 event->crossing.subwindow = g_object_ref (next);
1037 gdk_window_get_origin (win, &x_int, &y_int);
1039 event->crossing.x = x - x_int;
1040 event->crossing.y = y - y_int;
1041 event->crossing.x_root = x;
1042 event->crossing.y_root = y;
1043 event->crossing.mode = mode;
1046 event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
1048 event->crossing.detail = GDK_NOTIFY_VIRTUAL;
1050 event->crossing.focus = FALSE;
1051 event->crossing.state = modifiers;
1055 g_slist_free (path);
1058 event_win = gdk_directfb_pointer_event_window (b, GDK_ENTER_NOTIFY);
1061 event = gdk_directfb_event_make (event_win, GDK_ENTER_NOTIFY);
1063 event->crossing.subwindow = NULL;
1065 gdk_window_get_origin (b, &x_int, &y_int);
1067 event->crossing.x = x - x_int;
1068 event->crossing.y = y - y_int;
1069 event->crossing.x_root = x;
1070 event->crossing.y_root = y;
1071 event->crossing.mode = mode;
1074 event->crossing.detail = GDK_NOTIFY_NONLINEAR;
1076 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
1078 event->crossing.detail = GDK_NOTIFY_INFERIOR;
1080 event->crossing.focus = FALSE;
1081 event->crossing.state = modifiers;
1084 if (mode != GDK_CROSSING_GRAB)
1086 //this seems to cause focus to change as the pointer moves yuck
1087 //gdk_directfb_change_focus (b);
1088 if (b != gdk_directfb_window_containing_pointer)
1090 g_object_unref (gdk_directfb_window_containing_pointer);
1091 gdk_directfb_window_containing_pointer = g_object_ref (b);
1097 show_window_internal (GdkWindow *window,
1100 GdkWindowObject *private;
1101 GdkWindowImplDirectFB *impl;
1102 GdkWindow *mousewin;
1104 private = GDK_WINDOW_OBJECT (window);
1105 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1107 if (!private->destroyed && !GDK_WINDOW_IS_MAPPED (private))
1109 private->state &= ~GDK_WINDOW_STATE_WITHDRAWN;
1112 gdk_window_raise (window);
1114 if (all_parents_shown (GDK_WINDOW_OBJECT (private)->parent))
1116 send_map_events (private);
1118 mousewin = gdk_window_at_pointer (NULL, NULL);
1119 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1120 GDK_CROSSING_NORMAL);
1122 if (private->input_only)
1125 gdk_window_invalidate_rect (window, NULL, TRUE);
1131 if (gdk_directfb_apply_focus_opacity)
1132 impl->window->SetOpacity (impl->window,
1133 (impl->opacity >> 1) + (impl->opacity >> 2));
1135 impl->window->SetOpacity (impl->window, impl->opacity);
1136 /* if its the first window focus it */
1141 gdk_window_show_unraised (GdkWindow *window)
1143 g_return_if_fail (GDK_IS_WINDOW (window));
1145 show_window_internal (window, FALSE);
1149 gdk_window_show (GdkWindow *window)
1151 g_return_if_fail (GDK_IS_WINDOW (window));
1153 show_window_internal (window, TRUE);
1157 gdk_window_hide (GdkWindow *window)
1159 GdkWindowObject *private;
1160 GdkWindowImplDirectFB *impl;
1161 GdkWindow *mousewin;
1162 GdkWindow *event_win;
1164 g_return_if_fail (GDK_IS_WINDOW (window));
1166 private = GDK_WINDOW_OBJECT (window);
1167 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1170 impl->window->SetOpacity (impl->window, 0);
1172 if (!private->destroyed && GDK_WINDOW_IS_MAPPED (private))
1176 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
1178 if (!private->input_only && private->parent)
1180 _gdk_windowing_window_clear_area (GDK_WINDOW (private->parent),
1183 impl->drawable.width,
1184 impl->drawable.height);
1187 event_win = gdk_directfb_other_event_window (window, GDK_UNMAP);
1189 event = gdk_directfb_event_make (event_win, GDK_UNMAP);
1191 mousewin = gdk_window_at_pointer (NULL, NULL);
1192 gdk_directfb_window_send_crossing_events (NULL,
1194 GDK_CROSSING_NORMAL);
1196 if (window == _gdk_directfb_pointer_grab_window)
1197 gdk_pointer_ungrab (GDK_CURRENT_TIME);
1198 if (window == _gdk_directfb_keyboard_grab_window)
1199 gdk_keyboard_ungrab (GDK_CURRENT_TIME);
1204 gdk_window_withdraw (GdkWindow *window)
1206 g_return_if_fail (GDK_IS_WINDOW (window));
1208 /* for now this should be enough */
1209 gdk_window_hide (window);
1213 gdk_window_move (GdkWindow *window,
1217 GdkWindowObject *private;
1218 GdkWindowImplDirectFB *impl;
1220 g_return_if_fail (GDK_IS_WINDOW (window));
1222 private = GDK_WINDOW_OBJECT (window);
1223 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1229 impl->window->MoveTo (impl->window, x, y);
1233 gint width=impl->drawable.width;
1234 gint height=impl->drawable.height;
1236 { private->x, private->y,width,height };
1238 _gdk_directfb_move_resize_child (window, x, y, width, height);
1239 _gdk_directfb_calc_abs (window);
1241 if (GDK_WINDOW_IS_MAPPED (private))
1243 GdkWindow *mousewin;
1244 GdkRectangle new = { x, y, width, height };
1246 gdk_rectangle_union (&new, &old, &new);
1247 gdk_window_invalidate_rect (GDK_WINDOW (private->parent), &new,TRUE);
1249 /* The window the pointer is in might have changed */
1250 mousewin = gdk_window_at_pointer (NULL, NULL);
1251 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1252 GDK_CROSSING_NORMAL);
1258 gdk_window_resize (GdkWindow *window,
1262 GdkWindowObject *private;
1265 g_return_if_fail (GDK_IS_WINDOW (window));
1267 private = GDK_WINDOW_OBJECT (window);
1272 if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD))
1274 GdkWindowChildHandlerData *data;
1276 data = g_object_get_data (G_OBJECT (private->parent),
1277 "gdk-window-child-handler");
1280 (*data->get_pos) (window, &x, &y, data->user_data);
1283 gdk_window_move_resize (window, x, y, width, height);
1287 _gdk_directfb_move_resize_child (GdkWindow *window,
1293 GdkWindowObject *private;
1294 GdkWindowImplDirectFB *impl;
1295 GdkWindowImplDirectFB *parent_impl;
1298 g_return_if_fail (GDK_IS_WINDOW (window));
1300 private = GDK_WINDOW_OBJECT (window);
1301 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1306 impl->drawable.width = width;
1307 impl->drawable.height = height;
1309 if (!private->input_only)
1311 if (impl->drawable.surface) {
1312 GdkDrawableImplDirectFB *dimpl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1313 if(dimpl->cairo_surface) {
1314 cairo_surface_destroy(dimpl->cairo_surface);
1315 dimpl->cairo_surface= NULL;
1317 impl->drawable.surface->Release (impl->drawable.surface);
1318 impl->drawable.surface = NULL;
1321 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (private->parent)->impl);
1323 if (parent_impl->drawable.surface)
1325 DFBRectangle rect = { x, y, width, height };
1327 parent_impl->drawable.surface->GetSubSurface (parent_impl->drawable.surface,
1329 &impl->drawable.surface);
1333 for (list = private->children; list; list = list->next)
1335 private = GDK_WINDOW_OBJECT (list->data);
1336 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1337 _gdk_directfb_move_resize_child (list->data,
1338 private->x, private->y,
1339 impl->drawable.width, impl->drawable.height);
1344 gdk_window_move_resize (GdkWindow *window,
1350 GdkWindowObject *private;
1351 GdkWindowImplDirectFB *impl;
1353 g_return_if_fail (GDK_IS_WINDOW (window));
1355 private = GDK_WINDOW_OBJECT (window);
1356 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1363 if (private->destroyed ||
1364 (private->x == x && private->y == y &&
1365 impl->drawable.width == width && impl->drawable.height == height))
1368 if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD))
1370 GdkWindowChildHandlerData *data;
1372 data = g_object_get_data (G_OBJECT (private->parent),
1373 "gdk-window-child-handler");
1376 (*data->changed) (window, x, y, width, height, data->user_data))
1380 if (impl->drawable.width == width && impl->drawable.height == height)
1382 gdk_window_move (window, x, y);
1384 else if (impl->window)
1388 impl->window->MoveTo (impl->window, x, y);
1389 impl->window->Resize (impl->window, width, height);
1394 { private->x, private->y, impl->drawable.width, impl->drawable.height };
1395 _gdk_directfb_move_resize_child (window, x, y, width, height);
1396 _gdk_directfb_calc_abs (window);
1398 if (GDK_WINDOW_IS_MAPPED (private))
1400 GdkWindow *mousewin;
1401 GdkRectangle new = { x, y, width, height };
1403 gdk_rectangle_union (&new, &old, &new);
1404 gdk_window_invalidate_rect (GDK_WINDOW (private->parent), &new,TRUE);
1406 /* The window the pointer is in might have changed */
1407 mousewin = gdk_window_at_pointer (NULL, NULL);
1408 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1409 GDK_CROSSING_NORMAL);
1415 gdk_window_reparent (GdkWindow *window,
1416 GdkWindow *new_parent,
1420 GdkWindowObject *window_private;
1421 GdkWindowObject *parent_private;
1422 GdkWindowObject *old_parent_private;
1423 GdkWindowImplDirectFB *impl;
1424 GdkWindowImplDirectFB *parent_impl;
1427 g_return_if_fail (GDK_IS_WINDOW (window));
1429 if (GDK_WINDOW_DESTROYED (window))
1433 new_parent = _gdk_parent_root;
1435 window_private = (GdkWindowObject *) window;
1436 old_parent_private = (GdkWindowObject *) window_private->parent;
1437 parent_private = (GdkWindowObject *) new_parent;
1438 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
1439 visual = gdk_drawable_get_visual (window);
1441 /* already parented */
1442 if( window_private->parent == (GdkWindowObject *)new_parent )
1445 window_private->parent = (GdkWindowObject *) new_parent;
1447 if (old_parent_private)
1449 old_parent_private->children =
1450 g_list_remove (old_parent_private->children, window);
1453 parent_private->children = g_list_prepend (parent_private->children, window);
1455 impl = GDK_WINDOW_IMPL_DIRECTFB (window_private->impl);
1457 if( impl->drawable.surface ) {
1458 impl->drawable.surface->Release (impl->drawable.surface);
1459 impl->drawable.surface = NULL;
1462 if( impl->window != NULL ) {
1463 gdk_directfb_window_id_table_remove (impl->dfb_id);
1464 impl->window->SetOpacity (impl->window,0);
1465 impl->window->Close(impl->window);
1466 impl->window->Release(impl->window);
1467 impl->window = NULL;
1470 //create window were a child of the root now
1471 if( window_private->parent == (GdkWindowObject *)_gdk_parent_root) {
1472 DFBWindowDescription desc;
1473 DFBWindowOptions window_options = DWOP_NONE;
1474 desc.flags = DWDESC_CAPS;
1475 if( window_private->input_only ) {
1476 desc.caps = DWCAPS_INPUTONLY;
1478 desc.flags |= DWDESC_PIXELFORMAT;
1479 desc.pixelformat = ((GdkVisualDirectFB *) visual)->format;
1480 if (DFB_PIXELFORMAT_HAS_ALPHA (desc.pixelformat)) {
1481 desc.flags |= DWDESC_CAPS;
1482 desc.caps = DWCAPS_ALPHACHANNEL;
1485 if( window_private->window_type == GDK_WINDOW_CHILD )
1486 window_private->window_type = GDK_WINDOW_TOPLEVEL;
1487 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
1488 DWDESC_POSX | DWDESC_POSY );
1491 desc.width = impl->drawable.width;
1492 desc.height = impl->drawable.height;
1493 if (!create_directfb_window (impl, &desc, window_options))
1496 _gdk_window_destroy (window, FALSE);
1499 /* we hold a reference count on ourselves */
1500 g_object_ref (window);
1501 impl->window->GetID (impl->window, &impl->dfb_id);
1502 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
1503 gdk_directfb_event_windows_add (window);
1505 DFBRectangle rect = { x, y, impl->drawable.width,
1506 impl->drawable.height};
1507 impl->window = NULL;
1508 parent_impl->drawable.surface->GetSubSurface (
1509 parent_impl->drawable.surface,
1511 &impl->drawable.surface);
1516 _gdk_windowing_window_clear_area (GdkWindow *window,
1522 GdkWindowObject *private;
1523 GdkDrawableImplDirectFB *impl;
1524 GdkPixmap *bg_pixmap;
1525 GdkWindowObject *relative_to;
1530 g_return_if_fail (GDK_IS_WINDOW (window));
1532 if (GDK_WINDOW_DESTROYED (window))
1535 private = GDK_WINDOW_OBJECT (window);
1537 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1540 Follow XClearArea definition for zero height width
1543 width = impl->width-x;
1545 height = impl->height-y;
1547 bg_pixmap = private->bg_pixmap;
1549 for (relative_to = private;
1550 relative_to && bg_pixmap == GDK_PARENT_RELATIVE_BG;
1551 relative_to = relative_to->parent)
1553 bg_pixmap = relative_to->bg_pixmap;
1554 dx += relative_to->x;
1555 dy += relative_to->y;
1558 if (bg_pixmap == GDK_NO_BG)
1561 if (bg_pixmap && bg_pixmap != GDK_PARENT_RELATIVE_BG)
1565 values.fill = GDK_TILED;
1566 values.tile = bg_pixmap;
1567 values.ts_x_origin = - dx;
1568 values.ts_y_origin = - dy;
1570 gc = gdk_gc_new_with_values (GDK_DRAWABLE (impl), &values,
1571 GDK_GC_FILL | GDK_GC_TILE |
1572 GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN);
1576 /* GDK_PARENT_RELATIVE_BG, but no pixmap,
1577 get the color from the parent window. */
1581 values.foreground = relative_to->bg_color;
1583 gc = gdk_gc_new_with_values (GDK_DRAWABLE (impl), &values,
1587 gdk_draw_rectangle (GDK_DRAWABLE (impl),
1588 gc, TRUE, x, y, width, height);
1591 g_object_unref (gc);
1595 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1602 GdkWindowObject *private;
1603 GdkWindowImplDirectFB *impl;
1605 g_return_if_fail (GDK_IS_WINDOW (window));
1607 private = GDK_WINDOW_OBJECT (window);
1608 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1611 Follow XClearArea definition for zero height width
1614 width = impl->drawable.width-x;
1616 height = impl->drawable.height-y;
1621 rect.height = height;
1623 g_return_if_fail (GDK_IS_WINDOW (window));
1625 if (GDK_WINDOW_DESTROYED (window))
1628 _gdk_windowing_window_clear_area (window, x, y, width, height);
1630 gdk_window_invalidate_rect (window, &rect, TRUE);
1634 gdk_window_raise (GdkWindow *window)
1636 GdkWindowImplDirectFB *impl;
1638 g_return_if_fail (GDK_IS_WINDOW (window));
1640 if (GDK_WINDOW_DESTROYED (window))
1643 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1649 ret = impl->window->RaiseToTop (impl->window);
1651 DirectFBError ("gdkwindow-directfb.c: RaiseToTop", ret);
1653 gdk_directfb_window_raise (window);
1657 if (gdk_directfb_window_raise (window))
1658 gdk_window_invalidate_rect (window, NULL, TRUE);
1663 gdk_window_lower (GdkWindow *window)
1665 GdkWindowImplDirectFB *impl;
1667 g_return_if_fail (GDK_IS_WINDOW (window));
1669 if (GDK_WINDOW_DESTROYED (window))
1672 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1678 ret = impl->window->LowerToBottom (impl->window);
1680 DirectFBError ("gdkwindow-directfb.c: LowerToBottom", ret);
1682 gdk_directfb_window_lower (window);
1686 gdk_directfb_window_lower (window);
1687 gdk_window_invalidate_rect (window, NULL, TRUE);
1692 gdk_window_set_hints (GdkWindow *window,
1701 g_return_if_fail (GDK_IS_WINDOW (window));
1703 if (GDK_WINDOW_DESTROYED (window))
1710 gdk_window_set_geometry_hints (GdkWindow *window,
1711 GdkGeometry *geometry,
1712 GdkWindowHints geom_mask)
1714 g_return_if_fail (GDK_IS_WINDOW (window));
1716 if (GDK_WINDOW_DESTROYED (window))
1723 gdk_window_set_title (GdkWindow *window,
1726 g_return_if_fail (GDK_IS_WINDOW (window));
1728 if (GDK_WINDOW_DESTROYED (window))
1735 gdk_window_set_role (GdkWindow *window,
1738 g_return_if_fail (GDK_IS_WINDOW (window));
1740 if (GDK_WINDOW_DESTROYED (window))
1747 * gdk_window_set_startup_id:
1748 * @window: a toplevel #GdkWindow
1749 * @startup_id: a string with startup-notification identifier
1751 * When using GTK+, typically you should use gtk_window_set_startup_id()
1752 * instead of this low-level function.
1758 gdk_window_set_startup_id (GdkWindow *window,
1759 const gchar *startup_id)
1764 gdk_window_set_transient_for (GdkWindow *window,
1767 GdkWindowObject *private;
1768 GdkWindowObject *root;
1771 g_return_if_fail (GDK_IS_WINDOW (window));
1772 g_return_if_fail (GDK_IS_WINDOW (parent));
1774 private = GDK_WINDOW_OBJECT (window);
1775 root = GDK_WINDOW_OBJECT (_gdk_parent_root);
1777 g_return_if_fail (GDK_WINDOW (private->parent) == _gdk_parent_root);
1778 g_return_if_fail (GDK_WINDOW (GDK_WINDOW_OBJECT (parent)->parent) == _gdk_parent_root);
1780 root->children = g_list_remove (root->children, window);
1782 i = g_list_index (root->children, parent);
1784 root->children = g_list_prepend (root->children, window);
1786 root->children = g_list_insert (root->children, window, i);
1790 gdk_window_set_background (GdkWindow *window,
1791 const GdkColor *color)
1793 GdkWindowObject *private;
1795 g_return_if_fail (GDK_IS_WINDOW (window));
1797 g_return_if_fail (color != NULL);
1799 private = GDK_WINDOW_OBJECT (window);
1800 private->bg_color = *color;
1802 if (private->bg_pixmap &&
1803 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1804 private->bg_pixmap != GDK_NO_BG)
1805 g_object_unref (private->bg_pixmap);
1807 private->bg_pixmap = NULL;
1811 gdk_window_set_back_pixmap (GdkWindow *window,
1813 gint parent_relative)
1815 GdkWindowObject *private;
1816 GdkPixmap *old_pixmap;
1818 g_return_if_fail (GDK_IS_WINDOW (window));
1819 g_return_if_fail (pixmap == NULL || !parent_relative);
1821 private = GDK_WINDOW_OBJECT (window);
1822 old_pixmap = private->bg_pixmap;
1824 if (private->bg_pixmap &&
1825 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1826 private->bg_pixmap != GDK_NO_BG)
1828 g_object_unref (private->bg_pixmap);
1831 if (parent_relative)
1833 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1839 g_object_ref (pixmap);
1840 private->bg_pixmap = pixmap;
1844 private->bg_pixmap = GDK_NO_BG;
1850 gdk_window_set_cursor (GdkWindow *window,
1853 GdkWindowImplDirectFB *impl;
1854 GdkCursor *old_cursor;
1856 g_return_if_fail (GDK_IS_WINDOW (window));
1858 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1859 old_cursor = impl->cursor;
1861 impl->cursor = (cursor ?
1862 gdk_cursor_ref (cursor) : gdk_cursor_new (GDK_LEFT_PTR));
1864 if (gdk_window_at_pointer (NULL, NULL) == window)
1866 /* This is a bit evil but we want to keep all cursor changes in
1867 one place, so let gdk_directfb_window_send_crossing_events
1868 do the work for us. */
1870 gdk_directfb_window_send_crossing_events (window, window,
1871 GDK_CROSSING_NORMAL);
1873 else if (impl->window)
1875 GdkCursorDirectFB *dfb_cursor = (GdkCursorDirectFB *) impl->cursor;
1877 /* this branch takes care of setting the cursor for unmapped windows */
1879 impl->window->SetCursorShape (impl->window,
1881 dfb_cursor->hot_x, dfb_cursor->hot_y);
1885 gdk_cursor_unref (old_cursor);
1889 gdk_window_get_geometry (GdkWindow *window,
1896 GdkWindowObject *private;
1897 GdkDrawableImplDirectFB *impl;
1899 g_return_if_fail (GDK_IS_WINDOW (window));
1901 private = GDK_WINDOW_OBJECT (window);
1902 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1904 if (!GDK_WINDOW_DESTROYED (window))
1913 *width = impl->width;
1916 *height = impl->height;
1919 *depth = DFB_BITS_PER_PIXEL(impl->format);
1924 _gdk_directfb_calc_abs (GdkWindow *window)
1926 GdkWindowObject *private;
1927 GdkDrawableImplDirectFB *impl;
1930 g_return_if_fail (GDK_IS_WINDOW (window));
1932 private = GDK_WINDOW_OBJECT (window);
1933 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1935 impl->abs_x = private->x;
1936 impl->abs_y = private->y;
1938 if (private->parent)
1940 GdkDrawableImplDirectFB *parent_impl =
1941 GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (private->parent)->impl);
1943 impl->abs_x += parent_impl->abs_x;
1944 impl->abs_y += parent_impl->abs_y;
1947 for (list = private->children; list; list = list->next)
1949 _gdk_directfb_calc_abs (list->data);
1954 gdk_window_get_origin (GdkWindow *window,
1958 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
1960 if (!GDK_WINDOW_DESTROYED (window))
1962 GdkDrawableImplDirectFB *impl;
1964 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1978 gdk_window_get_deskrelative_origin (GdkWindow *window,
1982 return gdk_window_get_origin (window, x, y);
1986 gdk_window_get_root_origin (GdkWindow *window,
1990 GdkWindowObject *rover;
1992 g_return_if_fail (GDK_IS_WINDOW (window));
1994 rover = (GdkWindowObject*) window;
2000 if (GDK_WINDOW_DESTROYED (window))
2003 while (rover->parent && ((GdkWindowObject*) rover->parent)->parent)
2004 rover = (GdkWindowObject *) rover->parent;
2005 if (rover->destroyed)
2015 _gdk_windowing_window_get_pointer (GdkDisplay *display,
2019 GdkModifierType *mask)
2021 GdkWindow *retval = NULL;
2022 gint rx, ry, wx, wy;
2023 GdkDrawableImplDirectFB *impl;
2025 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
2028 window = _gdk_parent_root;
2030 gdk_directfb_mouse_get_info (&rx, &ry, mask);
2034 retval = gdk_directfb_child_at (_gdk_parent_root, &wx, &wy);
2036 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2039 *x = rx - impl->abs_x;
2041 *y = ry - impl->abs_y;
2047 _gdk_windowing_window_at_pointer (GdkDisplay *display,
2054 if (!win_x || !win_y)
2055 gdk_directfb_mouse_get_info (&wx, &wy, NULL);
2063 retval = gdk_directfb_child_at (_gdk_parent_root, &wx, &wy);
2075 _gdk_windowing_get_pointer (GdkDisplay *display,
2079 GdkModifierType *mask)
2083 *screen = gdk_display_get_default_screen (display);
2085 _gdk_windowing_window_get_pointer (display,
2086 _gdk_windowing_window_at_pointer(display,NULL,NULL),x,y,mask);
2091 gdk_window_get_events (GdkWindow *window)
2093 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
2095 if (GDK_WINDOW_DESTROYED (window))
2098 return GDK_WINDOW_OBJECT (window)->event_mask;
2102 gdk_window_set_events (GdkWindow *window,
2103 GdkEventMask event_mask)
2105 g_return_if_fail (GDK_IS_WINDOW (window));
2107 if (event_mask & GDK_BUTTON_MOTION_MASK)
2108 event_mask |= (GDK_BUTTON1_MOTION_MASK |
2109 GDK_BUTTON2_MOTION_MASK |
2110 GDK_BUTTON3_MOTION_MASK);
2112 GDK_WINDOW_OBJECT (window)->event_mask = event_mask;
2116 gdk_window_shape_combine_mask (GdkWindow *window,
2124 gdk_window_input_shape_combine_mask (GdkWindow *window,
2132 gdk_window_shape_combine_region (GdkWindow *window,
2133 const GdkRegion *shape_region,
2140 gdk_window_input_shape_combine_region (GdkWindow *window,
2141 const GdkRegion *shape_region,
2148 gdk_window_set_override_redirect (GdkWindow *window,
2149 gboolean override_redirect)
2151 g_return_if_fail (GDK_IS_WINDOW (window));
2153 if (GDK_WINDOW_DESTROYED (window))
2160 gdk_window_set_icon_list (GdkWindow *window,
2163 g_return_if_fail (GDK_IS_WINDOW (window));
2165 if (GDK_WINDOW_DESTROYED (window))
2172 gdk_window_set_icon (GdkWindow *window,
2173 GdkWindow *icon_window,
2177 g_return_if_fail (GDK_IS_WINDOW (window));
2179 if (GDK_WINDOW_DESTROYED (window))
2186 gdk_window_set_icon_name (GdkWindow *window,
2189 g_return_if_fail (GDK_IS_WINDOW (window));
2191 if (GDK_WINDOW_DESTROYED (window))
2198 gdk_window_iconify (GdkWindow *window)
2200 g_return_if_fail (GDK_IS_WINDOW (window));
2202 if (GDK_WINDOW_DESTROYED (window))
2205 gdk_window_hide (window);
2209 gdk_window_deiconify (GdkWindow *window)
2211 g_return_if_fail (GDK_IS_WINDOW (window));
2213 if (GDK_WINDOW_DESTROYED (window))
2216 gdk_window_show (window);
2220 gdk_window_stick (GdkWindow *window)
2222 g_return_if_fail (GDK_IS_WINDOW (window));
2224 if (GDK_WINDOW_DESTROYED (window))
2231 gdk_window_unstick (GdkWindow *window)
2233 g_return_if_fail (GDK_IS_WINDOW (window));
2235 if (GDK_WINDOW_DESTROYED (window))
2242 gdk_directfb_window_set_opacity (GdkWindow *window,
2245 GdkWindowImplDirectFB *impl;
2247 g_return_if_fail (GDK_IS_WINDOW (window));
2249 if (GDK_WINDOW_DESTROYED (window))
2252 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2254 impl->opacity = opacity;
2256 if (impl->window && GDK_WINDOW_IS_MAPPED (window))
2258 if (gdk_directfb_apply_focus_opacity &&
2259 window == gdk_directfb_focused_window)
2260 impl->window->SetOpacity (impl->window,
2261 (impl->opacity >> 1) + (impl->opacity >> 2));
2263 impl->window->SetOpacity (impl->window, impl->opacity);
2268 gdk_window_focus (GdkWindow *window,
2271 GdkWindow *toplevel;
2273 g_return_if_fail (GDK_IS_WINDOW (window));
2275 if (GDK_WINDOW_DESTROYED (window))
2278 toplevel = gdk_directfb_window_find_toplevel (window);
2279 if (toplevel != _gdk_parent_root)
2281 GdkWindowImplDirectFB *impl;
2283 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (toplevel)->impl);
2285 impl->window->RequestFocus (impl->window);
2290 gdk_window_maximize (GdkWindow *window)
2292 g_return_if_fail (GDK_IS_WINDOW (window));
2294 if (GDK_WINDOW_DESTROYED (window))
2301 gdk_window_unmaximize (GdkWindow *window)
2303 g_return_if_fail (GDK_IS_WINDOW (window));
2305 if (GDK_WINDOW_DESTROYED (window))
2312 gdk_window_set_type_hint (GdkWindow *window,
2313 GdkWindowTypeHint hint)
2315 g_return_if_fail (GDK_IS_WINDOW (window));
2317 if (GDK_WINDOW_DESTROYED (window))
2320 GDK_NOTE (MISC, g_print ("gdk_window_set_type_hint: 0x%x: %d\n",
2321 GDK_WINDOW_DFB_ID (window), hint));
2323 ((GdkWindowImplDirectFB *)((GdkWindowObject *)window)->impl)->type_hint = hint;
2330 gdk_window_get_type_hint (GdkWindow *window)
2332 g_return_val_if_fail (GDK_IS_WINDOW (window), GDK_WINDOW_TYPE_HINT_NORMAL);
2334 if (GDK_WINDOW_DESTROYED (window))
2335 return GDK_WINDOW_TYPE_HINT_NORMAL;
2337 return GDK_WINDOW_IMPL_DIRECTFB (((GdkWindowObject *) window)->impl)->type_hint;
2341 gdk_window_set_modal_hint (GdkWindow *window,
2344 GdkWindowImplDirectFB *impl;
2346 g_return_if_fail (GDK_IS_WINDOW (window));
2348 if (GDK_WINDOW_DESTROYED (window))
2351 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2355 impl->window->SetStackingClass (impl->window,
2356 modal ? DWSC_UPPER : DWSC_MIDDLE);
2361 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
2362 gboolean skips_taskbar)
2364 g_return_if_fail (GDK_IS_WINDOW (window));
2368 gdk_window_set_skip_pager_hint (GdkWindow *window,
2369 gboolean skips_pager)
2371 g_return_if_fail (GDK_IS_WINDOW (window));
2376 gdk_window_set_group (GdkWindow *window,
2379 g_return_if_fail (GDK_IS_WINDOW (window));
2380 g_return_if_fail (GDK_IS_WINDOW (leader));
2381 g_warning(" DirectFb set_group groups not supported \n");
2383 if (GDK_WINDOW_DESTROYED (window))
2389 GdkWindow * gdk_window_get_group (GdkWindow *window)
2391 g_warning(" DirectFb get_group groups not supported \n");
2396 gdk_fb_window_set_child_handler (GdkWindow *window,
2397 GdkWindowChildChanged changed,
2398 GdkWindowChildGetPos get_pos,
2401 GdkWindowChildHandlerData *data;
2403 g_return_if_fail (GDK_IS_WINDOW (window));
2405 data = g_new (GdkWindowChildHandlerData, 1);
2406 data->changed = changed;
2407 data->get_pos = get_pos;
2408 data->user_data = user_data;
2410 g_object_set_data_full (G_OBJECT (window), "gdk-window-child-handler",
2411 data, (GDestroyNotify) g_free);
2415 gdk_window_set_decorations (GdkWindow *window,
2416 GdkWMDecoration decorations)
2418 GdkWMDecoration *dec;
2420 g_return_if_fail (GDK_IS_WINDOW (window));
2422 dec = g_new (GdkWMDecoration, 1);
2425 g_object_set_data_full (G_OBJECT (window), "gdk-window-decorations",
2426 dec, (GDestroyNotify) g_free);
2430 gdk_window_get_decorations (GdkWindow *window,
2431 GdkWMDecoration *decorations)
2433 GdkWMDecoration *dec;
2435 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2437 dec = g_object_get_data (G_OBJECT (window), "gdk-window-decorations");
2440 *decorations = *dec;
2447 gdk_window_set_functions (GdkWindow *window,
2448 GdkWMFunction functions)
2450 g_return_if_fail (GDK_IS_WINDOW (window));
2452 if (GDK_WINDOW_DESTROYED (window))
2456 g_message("unimplemented %s", G_GNUC_FUNCTION);
2460 gdk_window_set_child_shapes (GdkWindow *window)
2465 gdk_window_merge_child_shapes (GdkWindow *window)
2470 gdk_window_set_child_input_shapes (GdkWindow *window)
2475 gdk_window_merge_child_input_shapes (GdkWindow *window)
2480 gdk_window_set_static_gravities (GdkWindow *window,
2481 gboolean use_static)
2483 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2485 if (GDK_WINDOW_DESTROYED (window))
2489 g_message("unimplemented %s", G_GNUC_FUNCTION);
2495 gdk_window_begin_resize_drag (GdkWindow *window,
2502 g_return_if_fail (GDK_IS_WINDOW (window));
2504 if (GDK_WINDOW_DESTROYED (window))
2507 g_message("unimplemented %s", G_GNUC_FUNCTION);
2511 gdk_window_begin_move_drag (GdkWindow *window,
2517 g_return_if_fail (GDK_IS_WINDOW (window));
2519 if (GDK_WINDOW_DESTROYED (window))
2522 g_message("unimplemented %s", G_GNUC_FUNCTION);
2526 * gdk_window_get_frame_extents:
2527 * @window: a #GdkWindow
2528 * @rect: rectangle to fill with bounding box of the window frame
2530 * Obtains the bounding box of the window, including window manager
2531 * titlebar/borders if any. The frame position is given in root window
2532 * coordinates. To get the position of the window itself (rather than
2533 * the frame) in root window coordinates, use gdk_window_get_origin().
2537 gdk_window_get_frame_extents (GdkWindow *window,
2540 GdkWindowObject *private;
2541 GdkDrawableImplDirectFB *impl;
2543 g_return_if_fail (GDK_IS_WINDOW (window));
2544 g_return_if_fail (rect != NULL);
2546 if (GDK_WINDOW_DESTROYED (window))
2549 private = GDK_WINDOW_OBJECT (window);
2551 while (private->parent && ((GdkWindowObject*) private->parent)->parent)
2552 private = (GdkWindowObject*) private->parent;
2553 if (GDK_WINDOW_DESTROYED (window))
2556 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
2558 rect->x = impl->abs_x;
2559 rect->y = impl->abs_x;
2560 rect->width = impl->width;
2561 rect->height = impl->height;
2565 * Given a directfb window and a subsurface of that window
2566 * create a gdkwindow child wrapper
2568 #if (DIRECTFB_MAJOR_VERSION >= 1)
2569 GdkWindow *gdk_directfb_create_child_window(GdkWindow *parent,
2570 IDirectFBSurface *subsurface)
2573 GdkWindowObject *private;
2574 GdkWindowObject *parent_private;
2575 GdkWindowImplDirectFB *impl;
2576 GdkWindowImplDirectFB *parent_impl;
2579 g_return_val_if_fail (parent != NULL, NULL);
2581 window = g_object_new (GDK_TYPE_WINDOW, NULL);
2582 private = GDK_WINDOW_OBJECT (window);
2583 parent_private = GDK_WINDOW_OBJECT (parent);
2584 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
2585 private->parent = parent_private;
2587 subsurface->GetPosition(subsurface,&x,&y);
2588 subsurface->GetSize(subsurface,&w,&h);
2590 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2591 impl->drawable.wrapper = GDK_DRAWABLE (window);
2596 _gdk_directfb_calc_abs (window);
2598 impl->drawable.width = w;
2599 impl->drawable.height = h;
2600 private->window_type = GDK_WINDOW_CHILD;
2601 impl->drawable.surface = subsurface;
2602 impl->drawable.format = parent_impl->drawable.format;
2603 private->depth = parent_private->depth;
2604 gdk_drawable_set_colormap (GDK_DRAWABLE (window),
2605 gdk_drawable_get_colormap (parent));
2606 gdk_window_set_cursor (window, NULL);
2607 parent_private->children = g_list_prepend (parent_private->children,window);
2608 /*we hold a reference count on ourselves */
2609 g_object_ref (window);
2617 * The wrapping is not perfect since directfb does not give full access
2618 * to the current state of a window event mask etc need to fix dfb
2621 gdk_window_foreign_new_for_display (GdkDisplay* display,GdkNativeWindow anid)
2623 GdkWindow *window = NULL;
2624 GdkWindow *parent =NULL;
2625 GdkWindowObject *private =NULL;
2626 GdkWindowObject *parent_private =NULL;
2627 GdkWindowImplDirectFB *parent_impl =NULL;
2628 GdkWindowImplDirectFB *impl =NULL;
2629 DFBWindowOptions options;
2631 GdkDisplayDFB * gdkdisplay = _gdk_display;
2632 IDirectFBWindow *dfbwindow;
2634 window = gdk_window_lookup (anid);
2637 g_object_ref (window);
2640 if( display != NULL )
2641 gdkdisplay = GDK_DISPLAY_DFB(display);
2643 ret = gdkdisplay->layer->GetWindow (gdkdisplay->layer,
2644 (DFBWindowID)anid,&dfbwindow);
2646 if (ret != DFB_OK) {
2647 DirectFBError ("gdk_window_new: Layer->GetWindow failed", ret);
2651 parent = _gdk_parent_root;
2654 parent_private = GDK_WINDOW_OBJECT (parent);
2655 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
2658 window = g_object_new (GDK_TYPE_WINDOW, NULL);
2659 /* we hold a reference count on ourselves */
2660 g_object_ref (window);
2661 private = GDK_WINDOW_OBJECT (window);
2662 private->parent = parent_private;
2663 private->window_type = GDK_WINDOW_TOPLEVEL;
2664 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2666 impl->drawable.wrapper = GDK_DRAWABLE (window);
2667 impl->window = dfbwindow;
2668 dfbwindow->GetOptions(dfbwindow,&options);
2669 dfbwindow->GetPosition(dfbwindow,&private->x,&private->y);
2670 dfbwindow->GetSize(dfbwindow,&impl->drawable.width,&impl->drawable.height);
2673 private->input_only = FALSE;
2675 if( dfbwindow->GetSurface (dfbwindow, &impl->drawable.surface) == DFB_UNSUPPORTED ){
2676 private->input_only = TRUE;
2677 impl->drawable.surface = NULL;
2680 * Position ourselevs
2682 _gdk_directfb_calc_abs (window);
2684 /* We default to all events least surprise to the user
2685 * minus the poll for motion events
2687 gdk_window_set_events (window, (GDK_ALL_EVENTS_MASK ^ GDK_POINTER_MOTION_HINT_MASK));
2689 if (impl->drawable.surface)
2691 impl->drawable.surface->GetPixelFormat (impl->drawable.surface,
2692 &impl->drawable.format);
2694 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
2696 gdk_drawable_set_colormap (GDK_DRAWABLE (window), gdk_drawable_get_colormap (parent));
2698 gdk_drawable_set_colormap (GDK_DRAWABLE (window), gdk_colormap_get_system());
2701 //can be null for the soft cursor window itself when
2702 //running a gtk directfb wm
2703 if( gdk_display_get_default() != NULL ) {
2704 gdk_window_set_cursor (window,NULL);
2708 parent_private->children = g_list_prepend (parent_private->children,
2710 impl->dfb_id = (DFBWindowID)anid;
2711 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
2712 gdk_directfb_event_windows_add (window);
2718 gdk_window_lookup_for_display (GdkDisplay *display,GdkNativeWindow anid)
2720 return gdk_directfb_window_id_table_lookup ((DFBWindowID) anid);
2724 gdk_window_lookup (GdkNativeWindow anid)
2726 return gdk_directfb_window_id_table_lookup ((DFBWindowID) anid);
2729 IDirectFBWindow *gdk_directfb_window_lookup(GdkWindow *window )
2731 GdkWindowObject *private;
2732 GdkWindowImplDirectFB *impl;
2733 g_return_val_if_fail (GDK_IS_WINDOW (window),NULL);
2734 private = GDK_WINDOW_OBJECT (window);
2735 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2736 return impl->window;
2739 IDirectFBSurface *gdk_directfb_surface_lookup(GdkWindow *window)
2741 GdkWindowObject *private;
2742 GdkWindowImplDirectFB *impl;
2743 g_return_val_if_fail (GDK_IS_WINDOW (window),NULL);
2744 private = GDK_WINDOW_OBJECT (window);
2745 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2746 return impl->drawable.surface;
2750 gdk_window_fullscreen (GdkWindow *window)
2752 g_return_if_fail (GDK_IS_WINDOW (window));
2753 g_warning ("gdk_window_fullscreen() not implemented.\n");
2757 gdk_window_unfullscreen (GdkWindow *window)
2759 g_return_if_fail (GDK_IS_WINDOW (window));
2760 /* g_warning ("gdk_window_unfullscreen() not implemented.\n");*/
2764 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
2766 g_return_if_fail (GDK_IS_WINDOW (window));
2767 static gboolean first_call = TRUE;
2769 g_warning ("gdk_window_set_keep_above() not implemented.\n");
2776 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
2778 g_return_if_fail (GDK_IS_WINDOW (window));
2779 static gboolean first_call = TRUE;
2781 g_warning ("gdk_window_set_keep_below() not implemented.\n");
2788 gdk_window_enable_synchronized_configure (GdkWindow *window)
2793 gdk_window_configure_finished (GdkWindow *window)
2798 gdk_display_warp_pointer (GdkDisplay *display,
2803 g_warning ("gdk_display_warp_pointer() not implemented.\n");
2807 gdk_window_set_urgency_hint (GdkWindow *window,
2810 g_return_if_fail (GDK_IS_WINDOW (window));
2811 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD);
2813 if (GDK_WINDOW_DESTROYED (window))
2816 g_warning ("gdk_window_set_urgency_hint() not implemented.\n");
2821 gdk_window_impl_directfb_invalidate_maybe_recurse (GdkPaintable *paintable,
2823 gboolean (*child_func) (GdkWindow *, gpointer),
2827 GdkWindowObject *private;
2828 GdkWindowImplDirectFB *wimpl;
2829 GdkDrawableImplDirectFB *impl;
2831 wimpl = GDK_WINDOW_IMPL_DIRECTFB (paintable);
2832 impl = (GdkDrawableImplDirectFB *)wimpl;
2833 window = wimpl->gdkWindow;
2834 private = (GdkWindowObject *)window;
2836 GdkRegion visible_region;
2839 g_return_if_fail (window != NULL);
2840 g_return_if_fail (GDK_IS_WINDOW (window));
2842 if (GDK_WINDOW_DESTROYED (window))
2845 if (private->input_only || !GDK_WINDOW_IS_MAPPED (window))
2848 temp_region_init_rectangle_vals( &visible_region, 0, 0, impl->width, impl->height );
2849 gdk_region_intersect (&visible_region, region);
2851 tmp_list = private->children;
2854 GdkWindowObject *child = tmp_list->data;
2855 GdkDrawableImplDirectFB *cimpl = (GdkDrawableImplDirectFB *) child->impl;
2857 if (!child->input_only)
2859 GdkRegion child_region;
2861 temp_region_init_rectangle_vals( &child_region, child->x, child->y, cimpl->width, cimpl->height );
2863 /* remove child area from the invalid area of the parent */
2864 if (GDK_WINDOW_IS_MAPPED (child) && !child->shaped)
2865 gdk_region_subtract (&visible_region, &child_region);
2867 if (child_func && (*child_func) ((GdkWindow *)child, user_data))
2869 gdk_region_offset (region, - child->x, - child->y);
2870 gdk_region_offset (&child_region, - child->x, - child->y);
2871 gdk_region_intersect (&child_region, region);
2873 gdk_window_invalidate_maybe_recurse ((GdkWindow *)child,
2874 &child_region, child_func, user_data);
2876 gdk_region_offset (region, child->x, child->y);
2879 temp_region_deinit( &child_region );
2882 tmp_list = tmp_list->next;
2885 if (!gdk_region_empty (&visible_region))
2888 if (private->update_area)
2890 gdk_region_union (private->update_area, &visible_region);
2894 update_windows = g_slist_prepend (update_windows, window);
2895 private->update_area = gdk_region_copy (&visible_region);
2896 gdk_window_schedule_update (window);
2900 temp_region_deinit( &visible_region );
2905 gdk_window_impl_directfb_process_updates (GdkPaintable *paintable,
2906 gboolean update_children)
2909 GdkWindowObject *private;
2910 GdkWindowImplDirectFB *wimpl;
2911 GdkDrawableImplDirectFB *impl;
2913 wimpl = GDK_WINDOW_IMPL_DIRECTFB (paintable);
2914 impl = (GdkDrawableImplDirectFB *)wimpl;
2915 window = wimpl->gdkWindow;
2916 private = (GdkWindowObject *)window;
2917 gboolean save_region = FALSE;
2919 /* If an update got queued during update processing, we can get a
2920 * window in the update queue that has an empty update_area.
2923 if (private->update_area)
2925 GdkRegion *update_area = private->update_area;
2926 private->update_area = NULL;
2928 if (_gdk_event_func && gdk_window_is_viewable (window))
2930 GdkRegion *expose_region;
2931 GdkRegion window_region;
2932 save_region = _gdk_windowing_window_queue_antiexpose (window, update_area);
2935 expose_region = gdk_region_copy (update_area);
2937 expose_region = update_area;
2939 temp_region_init_rectangle_vals( &window_region, 0, 0, impl->width, impl->height );
2940 gdk_region_intersect (expose_region,
2942 temp_region_deinit (&window_region);
2944 if (!gdk_region_empty (expose_region) &&
2945 (private->event_mask & GDK_EXPOSURE_MASK))
2949 event.expose.type = GDK_EXPOSE;
2950 event.expose.window = g_object_ref (window);
2951 event.expose.send_event = FALSE;
2952 event.expose.count = 0;
2953 event.expose.region = expose_region;
2954 gdk_region_get_clipbox (expose_region, &event.expose.area);
2955 (*_gdk_event_func) (&event, _gdk_event_data);
2957 g_object_unref (window);
2960 if (expose_region != update_area)
2961 gdk_region_destroy (expose_region);
2964 gdk_region_destroy (update_area);
2970 gdk_window_impl_directfb_begin_paint_region (GdkPaintable *paintable,
2973 GdkDrawableImplDirectFB *impl;
2974 GdkWindowImplDirectFB *wimpl;
2978 g_assert (region != NULL );
2979 wimpl = GDK_WINDOW_IMPL_DIRECTFB (paintable);
2980 impl = (GdkDrawableImplDirectFB *)wimpl;
2985 if (impl->buffered) {
2986 g_assert( impl->paint_depth > 0 );
2988 gdk_region_union (&impl->paint_region, region);
2991 g_assert( impl->paint_depth == 0 );
2993 gdk_directfb_clip_region( GDK_DRAWABLE(paintable), NULL, NULL, &impl->clip_region );
2995 temp_region_init_copy( &impl->paint_region, region );
2997 impl->buffered = TRUE;
3000 gdk_region_intersect (&impl->paint_region, &impl->clip_region);
3002 impl->paint_depth++;
3005 for (i = 0; i < region->numRects; i++)
3007 GdkRegionBox *box = ®ion->rects[i];
3009 _gdk_windowing_window_clear_area (GDK_WINDOW(wimpl->gdkWindow),
3019 gdk_window_impl_directfb_end_paint (GdkPaintable *paintable)
3021 GdkDrawableImplDirectFB *impl;
3023 impl = GDK_DRAWABLE_IMPL_DIRECTFB (paintable);
3025 g_return_if_fail (impl->paint_depth > 0);
3027 g_assert( impl->buffered );
3029 impl->paint_depth--;
3031 #ifdef GDK_DIRECTFB_NO_EXPERIMENTS
3032 if (impl->paint_depth == 0)
3034 impl->buffered = FALSE;
3036 if (impl->paint_region.numRects)
3038 DFBRegion reg = { impl->paint_region.extents.x1,
3039 impl->paint_region.extents.y1,
3040 impl->paint_region.extents.x2 ,
3041 impl->paint_region.extents.y2 };
3043 impl->surface->Flip( impl->surface, ®, 0 );
3045 temp_region_reset( &impl->paint_region );
3049 if (impl->paint_depth == 0) {
3050 impl->buffered = FALSE;
3052 temp_region_deinit( &impl->clip_region );
3054 if (impl->paint_region.numRects) {
3055 GdkWindow *window = GDK_WINDOW( impl->wrapper );
3057 if (GDK_IS_WINDOW(window)) {
3058 GdkWindowObject *top = GDK_WINDOW_OBJECT( gdk_window_get_toplevel( window ) );
3062 GdkWindowImplDirectFB *wimpl = GDK_WINDOW_IMPL_DIRECTFB (top->impl);
3064 reg.x1 = impl->abs_x - top->x + impl->paint_region.extents.x1;
3065 reg.y1 = impl->abs_y - top->y + impl->paint_region.extents.y1;
3066 reg.x2 = impl->abs_x - top->x + impl->paint_region.extents.x2 - 1;
3067 reg.y2 = impl->abs_y - top->y + impl->paint_region.extents.y2 - 1;
3069 //direct_log_printf( NULL, "Adding bounding box of paint: %d,%d - %dx%d (top %p, wimpl %p)\n",
3070 // DFB_RECTANGLE_VALS_FROM_REGION( ® ), top, wimpl );
3072 dfb_updates_add( &wimpl->flips, ® );
3076 temp_region_reset( &impl->paint_region );
3084 gdk_window_impl_directfb_paintable_init (GdkPaintableIface *iface)
3086 iface->begin_paint_region = gdk_window_impl_directfb_begin_paint_region;
3087 iface->end_paint = gdk_window_impl_directfb_end_paint;
3089 iface->invalidate_maybe_recurse = gdk_window_impl_directfb_invalidate_maybe_recurse;
3090 iface->process_updates = gdk_window_impl_directfb_process_updates;
3094 gdk_window_beep (GdkWindow *window)
3096 gdk_display_beep (gdk_display_get_default());
3100 gdk_window_set_opacity (GdkWindow *window,
3103 GdkDisplay *display;
3106 g_return_if_fail (GDK_IS_WINDOW (window));
3108 if (GDK_WINDOW_DESTROYED (window))
3111 display = gdk_drawable_get_display (window);
3115 else if (opacity > 1)
3117 cardinal = opacity * 0xff;
3118 gdk_directfb_window_set_opacity(window,cardinal);
3122 _gdk_windowing_window_set_composited (GdkWindow *window,
3123 gboolean composited)
3128 #define __GDK_WINDOW_X11_C__
3129 #include "gdkaliasdef.c"