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 static GdkRegion * gdk_window_impl_directfb_get_visible_region (GdkDrawable *drawable);
50 static void gdk_window_impl_directfb_set_colormap (GdkDrawable *drawable,
51 GdkColormap *colormap);
52 static void gdk_window_impl_directfb_init (GdkWindowImplDirectFB *window);
53 static void gdk_window_impl_directfb_class_init (GdkWindowImplDirectFBClass *klass);
54 static void gdk_window_impl_directfb_finalize (GObject *object);
58 GdkWindowChildChanged changed;
59 GdkWindowChildGetPos get_pos;
61 } GdkWindowChildHandlerData;
64 /* Code for dirty-region queueing
66 static GSList *update_windows = NULL;
67 static guint update_idle = 0;
70 gdk_window_directfb_process_all_updates (void)
72 GSList *old_update_windows = update_windows;
73 GSList *tmp_list = update_windows;
76 g_source_remove (update_idle);
78 update_windows = NULL;
81 g_slist_foreach (old_update_windows, (GFunc)g_object_ref, NULL);
85 GdkWindowObject *private = (GdkWindowObject *)tmp_list->data;
87 if (private->update_freeze_count)
88 update_windows = g_slist_prepend (update_windows, private);
90 gdk_window_process_updates(tmp_list->data,TRUE);
92 g_object_unref (tmp_list->data);
93 tmp_list = tmp_list->next;
96 g_slist_free (old_update_windows);
101 gdk_window_update_idle (gpointer data)
103 GDK_THREADS_ENTER ();
104 gdk_window_directfb_process_all_updates ();
105 GDK_THREADS_LEAVE ();
111 gdk_window_schedule_update (GdkWindow *window)
113 if (window && GDK_WINDOW_OBJECT (window)->update_freeze_count)
118 update_idle = g_idle_add_full (GDK_PRIORITY_REDRAW,
119 gdk_window_update_idle, NULL, NULL);
124 static GdkWindow *gdk_directfb_window_containing_pointer = NULL;
125 static GdkWindow *gdk_directfb_focused_window = NULL;
126 static gpointer parent_class = NULL;
127 GdkWindow * _gdk_parent_root = NULL;
129 gdk_window_impl_directfb_paintable_init (GdkPaintableIface *iface);
136 gdk_window_impl_directfb_get_type (void)
138 static GType object_type = 0;
142 static const GTypeInfo object_info =
144 sizeof (GdkWindowImplDirectFBClass),
145 (GBaseInitFunc) NULL,
146 (GBaseFinalizeFunc) NULL,
147 (GClassInitFunc) gdk_window_impl_directfb_class_init,
148 NULL, /* class_finalize */
149 NULL, /* class_data */
150 sizeof (GdkWindowImplDirectFB),
152 (GInstanceInitFunc) gdk_window_impl_directfb_init,
155 static const GInterfaceInfo paintable_info =
157 (GInterfaceInitFunc) gdk_window_impl_directfb_paintable_init,
162 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_DIRECTFB,
163 "GdkWindowImplDirectFB",
165 g_type_add_interface_static (object_type,
175 _gdk_window_impl_get_type (void)
177 return gdk_window_impl_directfb_get_type ();
181 gdk_window_impl_directfb_init (GdkWindowImplDirectFB *impl)
183 impl->drawable.width = 1;
184 impl->drawable.height = 1;
185 //cannot use gdk_cursor_new here since gdk_display_get_default
187 impl->cursor = gdk_cursor_new_for_display (GDK_DISPLAY_OBJECT(_gdk_display),GDK_LEFT_PTR);
192 gdk_window_impl_directfb_class_init (GdkWindowImplDirectFBClass *klass)
194 GObjectClass *object_class = G_OBJECT_CLASS (klass);
195 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
197 parent_class = g_type_class_peek_parent (klass);
199 object_class->finalize = gdk_window_impl_directfb_finalize;
201 drawable_class->set_colormap = gdk_window_impl_directfb_set_colormap;
203 /* Visible and clip regions are the same */
205 drawable_class->get_clip_region =
206 gdk_window_impl_directfb_get_visible_region;
208 drawable_class->get_visible_region =
209 gdk_window_impl_directfb_get_visible_region;
213 g_free_2nd (gpointer a,
221 gdk_window_impl_directfb_finalize (GObject *object)
223 GdkWindowImplDirectFB *impl = GDK_WINDOW_IMPL_DIRECTFB (object);
225 if (GDK_WINDOW_IS_MAPPED (impl->drawable.wrapper))
226 gdk_window_hide (impl->drawable.wrapper);
229 gdk_cursor_unref (impl->cursor);
231 if (impl->properties)
233 g_hash_table_foreach (impl->properties, g_free_2nd, NULL);
234 g_hash_table_destroy (impl->properties);
238 gdk_directfb_window_id_table_remove (impl->dfb_id);
239 /* native window resource must be release before we can finalize !*/
243 if (G_OBJECT_CLASS (parent_class)->finalize)
244 G_OBJECT_CLASS (parent_class)->finalize (object);
248 gdk_window_impl_directfb_get_visible_region (GdkDrawable *drawable)
250 GdkDrawableImplDirectFB *priv = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
251 GdkRectangle rect = { 0, 0, 0, 0 };
252 DFBRectangle drect = { 0, 0, 0, 0 };
255 priv->surface->GetVisibleRectangle (priv->surface, &drect);
260 return gdk_region_rectangle (&rect);
264 gdk_window_impl_directfb_set_colormap (GdkDrawable *drawable,
265 GdkColormap *colormap)
267 GDK_DRAWABLE_CLASS (parent_class)->set_colormap (drawable, colormap);
271 GdkDrawableImplDirectFB *priv = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
275 IDirectFBPalette *palette = gdk_directfb_colormap_get_palette (colormap);
278 priv->surface->SetPalette (priv->surface, palette);
285 create_directfb_window (GdkWindowImplDirectFB *impl,
286 DFBWindowDescription *desc,
287 DFBWindowOptions window_options)
290 IDirectFBWindow *window;
292 ret = _gdk_display->layer->CreateWindow (_gdk_display->layer, desc, &window);
296 DirectFBError ("gdk_window_new: Layer->CreateWindow failed", ret);
301 if ((desc->flags & DWDESC_CAPS) && (desc->caps & DWCAPS_INPUTONLY))
303 impl->drawable.surface = NULL;
305 window->GetSurface (window, &impl->drawable.surface);
309 DFBWindowOptions options;
310 window->GetOptions (window, &options);
311 window->SetOptions (window, options | window_options);
314 impl->window = window;
320 _gdk_windowing_window_init (void)
322 GdkWindowObject *private;
323 GdkWindowImplDirectFB *impl;
324 DFBDisplayLayerConfig dlc;
326 g_assert (_gdk_parent_root == NULL);
328 _gdk_display->layer->GetConfiguration(
329 _gdk_display->layer, &dlc );
331 _gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL);
332 private = GDK_WINDOW_OBJECT (_gdk_parent_root);
333 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
335 private->window_type = GDK_WINDOW_ROOT;
337 private->children = NULL;
338 impl->drawable.paint_region = NULL;
339 impl->gdkWindow = _gdk_parent_root;
341 impl->drawable.abs_x = 0;
342 impl->drawable.abs_y = 0;
343 impl->drawable.width = dlc.width;
344 impl->drawable.height = dlc.height;
345 impl->drawable.wrapper = GDK_DRAWABLE (private);
346 /* custom root window init */
348 DFBWindowDescription desc;
350 /*XXX I must do this now its a bug ALPHA ROOT*/
352 desc.flags = DWDESC_CAPS;
354 desc.caps |= DWCAPS_NODECORATION;
355 desc.caps |= DWCAPS_ALPHACHANNEL;
356 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
357 DWDESC_POSX | DWDESC_POSY );
360 desc.width = dlc.width;
361 desc.height = dlc.height;
362 create_directfb_window (impl,&desc,0);
363 g_assert(impl->window != NULL);
364 g_assert(impl->drawable.surface != NULL );
366 impl->drawable.surface->GetPixelFormat(impl->drawable.surface,&impl->drawable.format);
367 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
369 Now we can set up the system colormap
371 gdk_drawable_set_colormap (GDK_DRAWABLE (_gdk_parent_root),gdk_colormap_get_system());
377 gdk_directfb_window_new (GdkWindow *parent,
378 GdkWindowAttr *attributes,
379 gint attributes_mask,
380 DFBWindowCapabilities window_caps,
381 DFBWindowOptions window_options,
382 DFBSurfaceCapabilities surface_caps)
385 GdkWindowObject *private;
386 GdkWindowObject *parent_private;
387 GdkWindowImplDirectFB *impl;
388 GdkWindowImplDirectFB *parent_impl;
390 DFBWindowDescription desc;
393 g_return_val_if_fail (attributes != NULL, NULL);
395 if (!parent || attributes->window_type != GDK_WINDOW_CHILD)
396 parent = _gdk_parent_root;
398 window = g_object_new (GDK_TYPE_WINDOW, NULL);
399 private = GDK_WINDOW_OBJECT (window);
401 parent_private = GDK_WINDOW_OBJECT (parent);
402 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
403 private->parent = parent_private;
405 x = (attributes_mask & GDK_WA_X) ? attributes->x : 0;
406 y = (attributes_mask & GDK_WA_Y) ? attributes->y : 0;
408 gdk_window_set_events (window, attributes->event_mask | GDK_STRUCTURE_MASK);
410 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
411 impl->drawable.wrapper = GDK_DRAWABLE (window);
412 impl->gdkWindow = window;
417 _gdk_directfb_calc_abs (window);
419 impl->drawable.width = MAX (1, attributes->width);
420 impl->drawable.height = MAX (1, attributes->height);
422 private->window_type = attributes->window_type;
426 if (attributes_mask & GDK_WA_VISUAL)
427 visual = attributes->visual;
429 visual = gdk_drawable_get_visual (parent);
431 switch (attributes->wclass)
433 case GDK_INPUT_OUTPUT:
434 private->input_only = FALSE;
436 desc.flags |= DWDESC_PIXELFORMAT;
437 desc.pixelformat = ((GdkVisualDirectFB *) visual)->format;
439 if (DFB_PIXELFORMAT_HAS_ALPHA (desc.pixelformat))
441 desc.flags |= DWDESC_CAPS;
442 desc.caps = DWCAPS_ALPHACHANNEL;
447 private->input_only = TRUE;
448 desc.flags |= DWDESC_CAPS;
449 desc.caps = DWCAPS_INPUTONLY;
453 g_warning ("gdk_window_new: unsupported window class\n");
454 _gdk_window_destroy (window, FALSE);
458 switch (private->window_type)
460 case GDK_WINDOW_TOPLEVEL:
461 case GDK_WINDOW_DIALOG:
462 case GDK_WINDOW_TEMP:
463 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
464 DWDESC_POSX | DWDESC_POSY );
467 desc.width = impl->drawable.width;
468 desc.height = impl->drawable.height;
472 if (! (desc.flags & DWDESC_CAPS))
474 desc.flags |= DWDESC_CAPS;
475 desc.caps = DWCAPS_NONE;
478 desc.caps |= window_caps;
483 desc.flags |= DWDESC_SURFACE_CAPS;
484 desc.surface_caps = surface_caps;
488 if (!create_directfb_window (impl, &desc, window_options))
491 _gdk_window_destroy (window, FALSE);
494 if( desc.caps != DWCAPS_INPUTONLY )
495 impl->window->SetOpacity(impl->window, 0x00 );
498 case GDK_WINDOW_CHILD:
500 if (!private->input_only && parent_impl->drawable.surface)
504 { x, y, impl->drawable.width, impl->drawable.height };
505 parent_impl->drawable.surface->GetSubSurface (parent_impl->drawable.surface,
507 &impl->drawable.surface);
512 g_warning ("gdk_window_new: unsupported window type: %d",
513 private->window_type);
514 _gdk_window_destroy (window, FALSE);
518 if (impl->drawable.surface)
520 GdkColormap *colormap;
522 impl->drawable.surface->GetPixelFormat (impl->drawable.surface,
523 &impl->drawable.format);
525 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
527 if ((attributes_mask & GDK_WA_COLORMAP) && attributes->colormap)
529 colormap = attributes->colormap;
533 if (gdk_visual_get_system () == visual)
534 colormap = gdk_colormap_get_system ();
536 colormap =gdk_drawable_get_colormap (parent);
539 gdk_drawable_set_colormap (GDK_DRAWABLE (window), colormap);
543 impl->drawable.format = ((GdkVisualDirectFB *)visual)->format;
544 private->depth = visual->depth;
547 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
548 (attributes->cursor) : NULL));
551 parent_private->children = g_list_prepend (parent_private->children,
554 /* we hold a reference count on ourselves */
555 g_object_ref (window);
559 impl->window->GetID (impl->window, &impl->dfb_id);
560 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
561 gdk_directfb_event_windows_add (window);
568 gdk_window_new (GdkWindow *parent,
569 GdkWindowAttr *attributes,
570 gint attributes_mask)
572 g_return_val_if_fail (attributes != NULL, NULL);
574 return gdk_directfb_window_new (parent, attributes, attributes_mask,
575 DWCAPS_NONE, DWOP_NONE, DSCAPS_NONE);
578 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
580 /* It's somebody else's window, but in our heirarchy,
581 * so reparent it to the root window, and then send
582 * it a delete event, as if we were a WM
584 _gdk_windowing_window_destroy (window,TRUE,TRUE);
589 _gdk_windowing_window_destroy (GdkWindow *window,
591 gboolean foreign_destroy)
593 GdkWindowObject *private;
594 GdkWindowImplDirectFB *impl;
596 g_return_if_fail (GDK_IS_WINDOW (window));
598 private = GDK_WINDOW_OBJECT (window);
599 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
601 _gdk_selection_window_destroyed (window);
603 if (window == _gdk_directfb_pointer_grab_window)
604 gdk_pointer_ungrab (GDK_CURRENT_TIME);
605 if (window == _gdk_directfb_keyboard_grab_window)
606 gdk_keyboard_ungrab (GDK_CURRENT_TIME);
608 if (window == gdk_directfb_focused_window)
609 gdk_directfb_change_focus (NULL);
611 if (!recursing && !foreign_destroy && impl->window ) {
612 impl->window->SetOpacity (impl->window,0);
613 impl->window->Close(impl->window);
614 impl->window->Release(impl->window);
617 #if 0 /* let the finalizer kill it */
618 if (!recursing && !foreign_destroy)
621 impl->window->Destroy (impl->window);
627 /* This function is called when the window is really gone.
630 gdk_window_destroy_notify (GdkWindow *window)
632 g_return_if_fail (GDK_IS_WINDOW (window));
634 if (!GDK_WINDOW_DESTROYED (window))
636 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
637 g_warning ("GdkWindow %p unexpectedly destroyed", window);
639 _gdk_window_destroy (window, TRUE);
641 g_object_unref (window);
644 /* Focus follows pointer */
646 gdk_directfb_window_find_toplevel (GdkWindow *window)
648 while (window && window != _gdk_parent_root)
650 GdkWindow *parent = (GdkWindow *) (GDK_WINDOW_OBJECT (window))->parent;
652 if ((parent == _gdk_parent_root) && GDK_WINDOW_IS_MAPPED (window))
658 return _gdk_parent_root;
662 gdk_directfb_window_find_focus (void)
664 if (_gdk_directfb_keyboard_grab_window)
665 return _gdk_directfb_keyboard_grab_window;
667 if (!gdk_directfb_focused_window)
668 gdk_directfb_focused_window = g_object_ref (_gdk_parent_root);
670 return gdk_directfb_focused_window;
674 gdk_directfb_change_focus (GdkWindow *new_focus_window)
676 GdkEventFocus *event;
679 GdkWindow *event_win;
682 /* No focus changes while the pointer is grabbed */
683 if (_gdk_directfb_pointer_grab_window)
686 old_win = gdk_directfb_focused_window;
687 new_win = gdk_directfb_window_find_toplevel (new_focus_window);
689 if (old_win == new_win)
694 event_win = gdk_directfb_keyboard_event_window (old_win,
698 event = (GdkEventFocus *) gdk_directfb_event_make (event_win,
704 event_win = gdk_directfb_keyboard_event_window (new_win,
708 event = (GdkEventFocus *) gdk_directfb_event_make (event_win,
713 if (gdk_directfb_focused_window)
714 g_object_unref (gdk_directfb_focused_window);
715 gdk_directfb_focused_window = g_object_ref (new_win);
719 gdk_window_set_accept_focus (GdkWindow *window,
720 gboolean accept_focus)
722 GdkWindowObject *private;
723 g_return_if_fail (window != NULL);
724 g_return_if_fail (GDK_IS_WINDOW (window));
726 private = (GdkWindowObject *)window;
728 accept_focus = accept_focus != FALSE;
730 if (private->accept_focus != accept_focus)
731 private->accept_focus = accept_focus;
736 gdk_window_set_focus_on_map (GdkWindow *window,
737 gboolean focus_on_map)
739 GdkWindowObject *private;
740 g_return_if_fail (window != NULL);
741 g_return_if_fail (GDK_IS_WINDOW (window));
743 private = (GdkWindowObject *)window;
745 focus_on_map = focus_on_map != FALSE;
747 if (private->focus_on_map != focus_on_map)
748 private->focus_on_map = focus_on_map;
752 gdk_directfb_window_raise (GdkWindow *window)
754 GdkWindowObject *parent;
756 parent = GDK_WINDOW_OBJECT (window)->parent;
758 if (parent->children->data == window)
761 parent->children = g_list_remove (parent->children, window);
762 parent->children = g_list_prepend (parent->children, window);
768 gdk_directfb_window_lower (GdkWindow *window)
770 GdkWindowObject *parent;
772 parent = GDK_WINDOW_OBJECT (window)->parent;
774 parent->children = g_list_remove (parent->children, window);
775 parent->children = g_list_append (parent->children, window);
779 all_parents_shown (GdkWindowObject *private)
781 while (GDK_WINDOW_IS_MAPPED (private))
784 private = GDK_WINDOW_OBJECT (private)->parent;
793 send_map_events (GdkWindowObject *private)
796 GdkWindow *event_win;
798 if (!GDK_WINDOW_IS_MAPPED (private))
801 event_win = gdk_directfb_other_event_window ((GdkWindow *) private, GDK_MAP);
803 gdk_directfb_event_make (event_win, GDK_MAP);
805 for (list = private->children; list; list = list->next)
806 send_map_events (list->data);
810 gdk_directfb_find_common_ancestor (GdkWindow *win1,
816 for (a = GDK_WINDOW_OBJECT (win1); a; a = a->parent)
817 for (b = GDK_WINDOW_OBJECT (win2); b; b = b->parent)
820 return GDK_WINDOW (a);
827 gdk_directfb_window_send_crossing_events (GdkWindow *src,
829 GdkCrossingMode mode)
832 GdkWindow *win, *last, *next;
834 gint x, y, x_int, y_int;
835 GdkModifierType modifiers;
840 GdkWindow *event_win;
842 /* Do a possible cursor change before checking if we need to
843 generate crossing events so cursor changes due to pointer
844 grabs work correctly. */
846 static GdkCursorDirectFB *last_cursor = NULL;
848 GdkWindowObject *private = GDK_WINDOW_OBJECT (dest);
849 GdkWindowImplDirectFB *impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
850 GdkCursorDirectFB *cursor;
852 if (_gdk_directfb_pointer_grab_cursor)
853 cursor = (GdkCursorDirectFB*) _gdk_directfb_pointer_grab_cursor;
855 cursor = (GdkCursorDirectFB*) impl->cursor;
857 if (cursor != last_cursor)
859 win = gdk_directfb_window_find_toplevel (dest);
860 private = GDK_WINDOW_OBJECT (win);
861 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
864 impl->window->SetCursorShape (impl->window,
866 cursor->hot_x, cursor->hot_y);
867 last_cursor = cursor;
871 if (dest == gdk_directfb_window_containing_pointer)
874 if (gdk_directfb_window_containing_pointer == NULL)
875 gdk_directfb_window_containing_pointer = g_object_ref (_gdk_parent_root);
880 a = gdk_directfb_window_containing_pointer;
887 /* gdk_directfb_window_containing_pointer might have been destroyed.
888 * The refcount we hold on it should keep it, but it's parents
891 if (GDK_WINDOW_DESTROYED (a))
892 a = _gdk_parent_root;
894 gdk_directfb_mouse_get_info (&x, &y, &modifiers);
896 c = gdk_directfb_find_common_ancestor (a, b);
898 non_linear = (c != a) && (c != b);
900 event_win = gdk_directfb_pointer_event_window (a, GDK_LEAVE_NOTIFY);
903 event = gdk_directfb_event_make (event_win, GDK_LEAVE_NOTIFY);
904 event->crossing.subwindow = NULL;
906 gdk_window_get_origin (a, &x_int, &y_int);
908 event->crossing.x = x - x_int;
909 event->crossing.y = y - y_int;
910 event->crossing.x_root = x;
911 event->crossing.y_root = y;
912 event->crossing.mode = mode;
915 event->crossing.detail = GDK_NOTIFY_NONLINEAR;
917 event->crossing.detail = GDK_NOTIFY_INFERIOR;
919 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
921 event->crossing.focus = FALSE;
922 event->crossing.state = modifiers;
925 /* Traverse up from a to (excluding) c */
929 win = GDK_WINDOW (GDK_WINDOW_OBJECT (a)->parent);
933 gdk_directfb_pointer_event_window (win, GDK_LEAVE_NOTIFY);
937 event = gdk_directfb_event_make (event_win, GDK_LEAVE_NOTIFY);
939 event->crossing.subwindow = g_object_ref (last);
941 gdk_window_get_origin (win, &x_int, &y_int);
943 event->crossing.x = x - x_int;
944 event->crossing.y = y - y_int;
945 event->crossing.x_root = x;
946 event->crossing.y_root = y;
947 event->crossing.mode = mode;
950 event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
952 event->crossing.detail = GDK_NOTIFY_VIRTUAL;
954 event->crossing.focus = FALSE;
955 event->crossing.state = modifiers;
959 win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent);
963 /* Traverse down from c to b */
967 win = GDK_WINDOW (GDK_WINDOW_OBJECT (b)->parent);
970 path = g_slist_prepend (path, win);
971 win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent);
977 win = GDK_WINDOW (list->data);
978 list = g_slist_next (list);
981 next = GDK_WINDOW (list->data);
986 gdk_directfb_pointer_event_window (win, GDK_ENTER_NOTIFY);
990 event = gdk_directfb_event_make (event_win, GDK_ENTER_NOTIFY);
992 event->crossing.subwindow = g_object_ref (next);
994 gdk_window_get_origin (win, &x_int, &y_int);
996 event->crossing.x = x - x_int;
997 event->crossing.y = y - y_int;
998 event->crossing.x_root = x;
999 event->crossing.y_root = y;
1000 event->crossing.mode = mode;
1003 event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
1005 event->crossing.detail = GDK_NOTIFY_VIRTUAL;
1007 event->crossing.focus = FALSE;
1008 event->crossing.state = modifiers;
1012 g_slist_free (path);
1015 event_win = gdk_directfb_pointer_event_window (b, GDK_ENTER_NOTIFY);
1018 event = gdk_directfb_event_make (event_win, GDK_ENTER_NOTIFY);
1020 event->crossing.subwindow = NULL;
1022 gdk_window_get_origin (b, &x_int, &y_int);
1024 event->crossing.x = x - x_int;
1025 event->crossing.y = y - y_int;
1026 event->crossing.x_root = x;
1027 event->crossing.y_root = y;
1028 event->crossing.mode = mode;
1031 event->crossing.detail = GDK_NOTIFY_NONLINEAR;
1033 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
1035 event->crossing.detail = GDK_NOTIFY_INFERIOR;
1037 event->crossing.focus = FALSE;
1038 event->crossing.state = modifiers;
1041 if (mode != GDK_CROSSING_GRAB)
1043 //this seems to cause focus to change as the pointer moves yuck
1044 //gdk_directfb_change_focus (b);
1045 if (b != gdk_directfb_window_containing_pointer)
1047 g_object_unref (gdk_directfb_window_containing_pointer);
1048 gdk_directfb_window_containing_pointer = g_object_ref (b);
1054 show_window_internal (GdkWindow *window,
1057 GdkWindowObject *private;
1058 GdkWindowImplDirectFB *impl;
1059 GdkWindow *mousewin;
1061 private = GDK_WINDOW_OBJECT (window);
1062 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1064 if (!private->destroyed && !GDK_WINDOW_IS_MAPPED (private))
1066 private->state &= ~GDK_WINDOW_STATE_WITHDRAWN;
1069 gdk_window_raise (window);
1071 if (all_parents_shown (GDK_WINDOW_OBJECT (private)->parent))
1073 send_map_events (private);
1075 mousewin = gdk_window_at_pointer (NULL, NULL);
1076 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1077 GDK_CROSSING_NORMAL);
1079 if (private->input_only)
1082 gdk_window_invalidate_rect (window, NULL, TRUE);
1088 if (gdk_directfb_apply_focus_opacity)
1089 impl->window->SetOpacity (impl->window,
1090 (impl->opacity >> 1) + (impl->opacity >> 2));
1092 impl->window->SetOpacity (impl->window, impl->opacity);
1093 /* if its the first window focus it */
1098 gdk_window_show_unraised (GdkWindow *window)
1100 g_return_if_fail (GDK_IS_WINDOW (window));
1102 show_window_internal (window, FALSE);
1106 gdk_window_show (GdkWindow *window)
1108 g_return_if_fail (GDK_IS_WINDOW (window));
1110 show_window_internal (window, TRUE);
1114 gdk_window_hide (GdkWindow *window)
1116 GdkWindowObject *private;
1117 GdkWindowImplDirectFB *impl;
1118 GdkWindow *mousewin;
1119 GdkWindow *event_win;
1121 g_return_if_fail (GDK_IS_WINDOW (window));
1123 private = GDK_WINDOW_OBJECT (window);
1124 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1127 impl->window->SetOpacity (impl->window, 0);
1129 if (!private->destroyed && GDK_WINDOW_IS_MAPPED (private))
1133 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
1135 if (!private->input_only && private->parent)
1137 _gdk_windowing_window_clear_area (GDK_WINDOW (private->parent),
1140 impl->drawable.width,
1141 impl->drawable.height);
1144 event_win = gdk_directfb_other_event_window (window, GDK_UNMAP);
1146 event = gdk_directfb_event_make (event_win, GDK_UNMAP);
1148 mousewin = gdk_window_at_pointer (NULL, NULL);
1149 gdk_directfb_window_send_crossing_events (NULL,
1151 GDK_CROSSING_NORMAL);
1153 if (window == _gdk_directfb_pointer_grab_window)
1154 gdk_pointer_ungrab (GDK_CURRENT_TIME);
1155 if (window == _gdk_directfb_keyboard_grab_window)
1156 gdk_keyboard_ungrab (GDK_CURRENT_TIME);
1161 gdk_window_withdraw (GdkWindow *window)
1163 g_return_if_fail (GDK_IS_WINDOW (window));
1165 /* for now this should be enough */
1166 gdk_window_hide (window);
1170 gdk_window_move (GdkWindow *window,
1174 GdkWindowObject *private;
1175 GdkWindowImplDirectFB *impl;
1177 g_return_if_fail (GDK_IS_WINDOW (window));
1179 private = GDK_WINDOW_OBJECT (window);
1180 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1186 impl->window->MoveTo (impl->window, x, y);
1190 gint width=impl->drawable.width;
1191 gint height=impl->drawable.height;
1193 { private->x, private->y,width,height };
1195 _gdk_directfb_move_resize_child (window, x, y, width, height);
1196 _gdk_directfb_calc_abs (window);
1198 if (GDK_WINDOW_IS_MAPPED (private))
1200 GdkWindow *mousewin;
1201 GdkRectangle new = { x, y, width, height };
1203 gdk_rectangle_union (&new, &old, &new);
1204 gdk_window_invalidate_rect (GDK_WINDOW (private->parent), &new,TRUE);
1206 /* The window the pointer is in might have changed */
1207 mousewin = gdk_window_at_pointer (NULL, NULL);
1208 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1209 GDK_CROSSING_NORMAL);
1215 gdk_window_resize (GdkWindow *window,
1219 GdkWindowObject *private;
1222 g_return_if_fail (GDK_IS_WINDOW (window));
1224 private = GDK_WINDOW_OBJECT (window);
1229 if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD))
1231 GdkWindowChildHandlerData *data;
1233 data = g_object_get_data (G_OBJECT (private->parent),
1234 "gdk-window-child-handler");
1237 (*data->get_pos) (window, &x, &y, data->user_data);
1240 gdk_window_move_resize (window, x, y, width, height);
1244 _gdk_directfb_move_resize_child (GdkWindow *window,
1250 GdkWindowObject *private;
1251 GdkWindowImplDirectFB *impl;
1252 GdkWindowImplDirectFB *parent_impl;
1255 g_return_if_fail (GDK_IS_WINDOW (window));
1257 private = GDK_WINDOW_OBJECT (window);
1258 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1263 impl->drawable.width = width;
1264 impl->drawable.height = height;
1266 if (!private->input_only)
1268 if (impl->drawable.surface)
1270 GdkDrawableImplDirectFB *dimpl;
1271 dimpl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1272 impl->drawable.surface->Release (impl->drawable.surface);
1273 impl->drawable.surface = NULL;
1274 cairo_surface_destroy(dimpl->cairo_surface);
1275 dimpl->cairo_surface= NULL;
1278 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (private->parent)->impl);
1280 if (parent_impl->drawable.surface)
1282 DFBRectangle rect = { x, y, width, height };
1284 parent_impl->drawable.surface->GetSubSurface (parent_impl->drawable.surface,
1286 &impl->drawable.surface);
1290 for (list = private->children; list; list = list->next)
1292 private = GDK_WINDOW_OBJECT (list->data);
1293 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1294 _gdk_directfb_move_resize_child (list->data,
1295 private->x, private->y,
1296 impl->drawable.width, impl->drawable.height);
1301 gdk_window_move_resize (GdkWindow *window,
1307 GdkWindowObject *private;
1308 GdkWindowImplDirectFB *impl;
1310 g_return_if_fail (GDK_IS_WINDOW (window));
1312 private = GDK_WINDOW_OBJECT (window);
1313 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1320 if (private->destroyed ||
1321 (private->x == x && private->y == y &&
1322 impl->drawable.width == width && impl->drawable.height == height))
1325 if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD))
1327 GdkWindowChildHandlerData *data;
1329 data = g_object_get_data (G_OBJECT (private->parent),
1330 "gdk-window-child-handler");
1333 (*data->changed) (window, x, y, width, height, data->user_data))
1337 if (impl->drawable.width == width && impl->drawable.height == height)
1339 gdk_window_move (window, x, y);
1341 else if (impl->window)
1345 impl->window->MoveTo (impl->window, x, y);
1346 impl->window->Resize (impl->window, width, height);
1351 { private->x, private->y, impl->drawable.width, impl->drawable.height };
1352 _gdk_directfb_move_resize_child (window, x, y, width, height);
1353 _gdk_directfb_calc_abs (window);
1355 if (GDK_WINDOW_IS_MAPPED (private))
1357 GdkWindow *mousewin;
1358 GdkRectangle new = { x, y, width, height };
1360 gdk_rectangle_union (&new, &old, &new);
1361 gdk_window_invalidate_rect (GDK_WINDOW (private->parent), &new,TRUE);
1363 /* The window the pointer is in might have changed */
1364 mousewin = gdk_window_at_pointer (NULL, NULL);
1365 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1366 GDK_CROSSING_NORMAL);
1372 gdk_window_reparent (GdkWindow *window,
1373 GdkWindow *new_parent,
1377 GdkWindowObject *window_private;
1378 GdkWindowObject *parent_private;
1379 GdkWindowObject *old_parent_private;
1380 GdkWindowImplDirectFB *impl;
1381 GdkWindowImplDirectFB *parent_impl;
1384 g_return_if_fail (GDK_IS_WINDOW (window));
1386 if (GDK_WINDOW_DESTROYED (window))
1390 new_parent = _gdk_parent_root;
1392 window_private = (GdkWindowObject *) window;
1393 old_parent_private = (GdkWindowObject *) window_private->parent;
1394 parent_private = (GdkWindowObject *) new_parent;
1395 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
1396 visual = gdk_drawable_get_visual (window);
1398 /* already parented */
1399 if( window_private->parent == (GdkWindowObject *)new_parent )
1402 window_private->parent = (GdkWindowObject *) new_parent;
1404 if (old_parent_private)
1406 old_parent_private->children =
1407 g_list_remove (old_parent_private->children, window);
1410 parent_private->children = g_list_prepend (parent_private->children, window);
1412 impl = GDK_WINDOW_IMPL_DIRECTFB (window_private->impl);
1414 if( impl->drawable.surface ) {
1415 impl->drawable.surface->Release (impl->drawable.surface);
1416 impl->drawable.surface = NULL;
1419 if( impl->window != NULL ) {
1420 gdk_directfb_window_id_table_remove (impl->dfb_id);
1421 impl->window->SetOpacity (impl->window,0);
1422 impl->window->Close(impl->window);
1423 impl->window->Release(impl->window);
1424 impl->window = NULL;
1427 //create window were a child of the root now
1428 if( window_private->parent == (GdkWindowObject *)_gdk_parent_root) {
1429 DFBWindowDescription desc;
1430 DFBWindowOptions window_options = DWOP_NONE;
1431 desc.flags = DWDESC_CAPS;
1432 if( window_private->input_only ) {
1433 desc.caps = DWCAPS_INPUTONLY;
1435 desc.flags |= DWDESC_PIXELFORMAT;
1436 desc.pixelformat = ((GdkVisualDirectFB *) visual)->format;
1437 if (DFB_PIXELFORMAT_HAS_ALPHA (desc.pixelformat)) {
1438 desc.flags |= DWDESC_CAPS;
1439 desc.caps = DWCAPS_ALPHACHANNEL;
1442 if( window_private->window_type == GDK_WINDOW_CHILD )
1443 window_private->window_type = GDK_WINDOW_TOPLEVEL;
1444 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
1445 DWDESC_POSX | DWDESC_POSY );
1448 desc.width = impl->drawable.width;
1449 desc.height = impl->drawable.height;
1450 if (!create_directfb_window (impl, &desc, window_options))
1453 _gdk_window_destroy (window, FALSE);
1456 /* we hold a reference count on ourselves */
1457 g_object_ref (window);
1458 impl->window->GetID (impl->window, &impl->dfb_id);
1459 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
1460 gdk_directfb_event_windows_add (window);
1462 DFBRectangle rect = { x, y, impl->drawable.width,
1463 impl->drawable.height};
1464 impl->window = NULL;
1465 parent_impl->drawable.surface->GetSubSurface (
1466 parent_impl->drawable.surface,
1468 &impl->drawable.surface);
1473 _gdk_windowing_window_clear_area (GdkWindow *window,
1479 GdkWindowObject *private;
1480 GdkDrawableImplDirectFB *impl;
1481 GdkPixmap *bg_pixmap;
1482 GdkWindowObject *relative_to;
1487 g_return_if_fail (GDK_IS_WINDOW (window));
1489 if (GDK_WINDOW_DESTROYED (window))
1492 private = GDK_WINDOW_OBJECT (window);
1494 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1497 Follow XClearArea definition for zero height width
1500 width = impl->width-x;
1502 height = impl->height-y;
1504 bg_pixmap = private->bg_pixmap;
1506 for (relative_to = private;
1507 relative_to && bg_pixmap == GDK_PARENT_RELATIVE_BG;
1508 relative_to = relative_to->parent)
1510 bg_pixmap = relative_to->bg_pixmap;
1511 dx += relative_to->x;
1512 dy += relative_to->y;
1515 if (bg_pixmap == GDK_NO_BG)
1518 if (bg_pixmap && bg_pixmap != GDK_PARENT_RELATIVE_BG)
1522 values.fill = GDK_TILED;
1523 values.tile = bg_pixmap;
1524 values.ts_x_origin = - dx;
1525 values.ts_y_origin = - dy;
1527 gc = gdk_gc_new_with_values (GDK_DRAWABLE (impl), &values,
1528 GDK_GC_FILL | GDK_GC_TILE |
1529 GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN);
1533 /* GDK_PARENT_RELATIVE_BG, but no pixmap,
1534 get the color from the parent window. */
1538 values.foreground = relative_to->bg_color;
1540 gc = gdk_gc_new_with_values (GDK_DRAWABLE (impl), &values,
1544 gdk_draw_rectangle (GDK_DRAWABLE (impl),
1545 gc, TRUE, x, y, width, height);
1548 g_object_unref (gc);
1552 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1559 GdkWindowObject *private;
1560 GdkWindowImplDirectFB *impl;
1562 g_return_if_fail (GDK_IS_WINDOW (window));
1564 private = GDK_WINDOW_OBJECT (window);
1565 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1568 Follow XClearArea definition for zero height width
1571 width = impl->drawable.width-x;
1573 height = impl->drawable.height-y;
1578 rect.height = height;
1580 g_return_if_fail (GDK_IS_WINDOW (window));
1582 if (GDK_WINDOW_DESTROYED (window))
1585 _gdk_windowing_window_clear_area (window, x, y, width, height);
1587 gdk_window_invalidate_rect (window, &rect, TRUE);
1591 gdk_window_raise (GdkWindow *window)
1593 GdkWindowImplDirectFB *impl;
1595 g_return_if_fail (GDK_IS_WINDOW (window));
1597 if (GDK_WINDOW_DESTROYED (window))
1600 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1606 ret = impl->window->RaiseToTop (impl->window);
1608 DirectFBError ("gdkwindow-directfb.c: RaiseToTop", ret);
1610 gdk_directfb_window_raise (window);
1614 if (gdk_directfb_window_raise (window))
1615 gdk_window_invalidate_rect (window, NULL, TRUE);
1620 gdk_window_lower (GdkWindow *window)
1622 GdkWindowImplDirectFB *impl;
1624 g_return_if_fail (GDK_IS_WINDOW (window));
1626 if (GDK_WINDOW_DESTROYED (window))
1629 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1635 ret = impl->window->LowerToBottom (impl->window);
1637 DirectFBError ("gdkwindow-directfb.c: LowerToBottom", ret);
1639 gdk_directfb_window_lower (window);
1643 gdk_directfb_window_lower (window);
1644 gdk_window_invalidate_rect (window, NULL, TRUE);
1649 gdk_window_set_hints (GdkWindow *window,
1658 g_return_if_fail (GDK_IS_WINDOW (window));
1660 if (GDK_WINDOW_DESTROYED (window))
1667 gdk_window_set_geometry_hints (GdkWindow *window,
1668 GdkGeometry *geometry,
1669 GdkWindowHints geom_mask)
1671 g_return_if_fail (GDK_IS_WINDOW (window));
1673 if (GDK_WINDOW_DESTROYED (window))
1680 gdk_window_set_title (GdkWindow *window,
1683 g_return_if_fail (GDK_IS_WINDOW (window));
1685 if (GDK_WINDOW_DESTROYED (window))
1692 gdk_window_set_role (GdkWindow *window,
1695 g_return_if_fail (GDK_IS_WINDOW (window));
1697 if (GDK_WINDOW_DESTROYED (window))
1704 gdk_window_set_transient_for (GdkWindow *window,
1707 GdkWindowObject *private;
1708 GdkWindowObject *root;
1711 g_return_if_fail (GDK_IS_WINDOW (window));
1712 g_return_if_fail (GDK_IS_WINDOW (parent));
1714 private = GDK_WINDOW_OBJECT (window);
1715 root = GDK_WINDOW_OBJECT (_gdk_parent_root);
1717 g_return_if_fail (GDK_WINDOW (private->parent) == _gdk_parent_root);
1718 g_return_if_fail (GDK_WINDOW (GDK_WINDOW_OBJECT (parent)->parent) == _gdk_parent_root);
1720 root->children = g_list_remove (root->children, window);
1722 i = g_list_index (root->children, parent);
1724 root->children = g_list_prepend (root->children, window);
1726 root->children = g_list_insert (root->children, window, i);
1730 gdk_window_set_background (GdkWindow *window,
1731 const GdkColor *color)
1733 GdkWindowObject *private;
1735 g_return_if_fail (GDK_IS_WINDOW (window));
1737 g_return_if_fail (color != NULL);
1739 private = GDK_WINDOW_OBJECT (window);
1740 private->bg_color = *color;
1742 if (private->bg_pixmap &&
1743 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1744 private->bg_pixmap != GDK_NO_BG)
1745 g_object_unref (private->bg_pixmap);
1747 private->bg_pixmap = NULL;
1751 gdk_window_set_back_pixmap (GdkWindow *window,
1753 gint parent_relative)
1755 GdkWindowObject *private;
1756 GdkPixmap *old_pixmap;
1758 g_return_if_fail (GDK_IS_WINDOW (window));
1759 g_return_if_fail (pixmap == NULL || !parent_relative);
1761 private = GDK_WINDOW_OBJECT (window);
1762 old_pixmap = private->bg_pixmap;
1764 if (private->bg_pixmap &&
1765 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1766 private->bg_pixmap != GDK_NO_BG)
1768 g_object_unref (private->bg_pixmap);
1771 if (parent_relative)
1773 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1777 if (pixmap && pixmap != GDK_NO_BG && pixmap != GDK_PARENT_RELATIVE_BG)
1778 g_object_ref (pixmap);
1780 private->bg_pixmap = pixmap;
1785 gdk_window_set_cursor (GdkWindow *window,
1788 GdkWindowImplDirectFB *impl;
1789 GdkCursor *old_cursor;
1791 g_return_if_fail (GDK_IS_WINDOW (window));
1793 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1794 old_cursor = impl->cursor;
1796 impl->cursor = (cursor ?
1797 gdk_cursor_ref (cursor) : gdk_cursor_new (GDK_LEFT_PTR));
1799 if (gdk_window_at_pointer (NULL, NULL) == window)
1801 /* This is a bit evil but we want to keep all cursor changes in
1802 one place, so let gdk_directfb_window_send_crossing_events
1803 do the work for us. */
1805 gdk_directfb_window_send_crossing_events (window, window,
1806 GDK_CROSSING_NORMAL);
1808 else if (impl->window)
1810 GdkCursorDirectFB *dfb_cursor = (GdkCursorDirectFB *) impl->cursor;
1812 /* this branch takes care of setting the cursor for unmapped windows */
1814 impl->window->SetCursorShape (impl->window,
1816 dfb_cursor->hot_x, dfb_cursor->hot_y);
1820 gdk_cursor_unref (old_cursor);
1824 gdk_window_get_geometry (GdkWindow *window,
1831 GdkWindowObject *private;
1832 GdkDrawableImplDirectFB *impl;
1834 g_return_if_fail (GDK_IS_WINDOW (window));
1836 private = GDK_WINDOW_OBJECT (window);
1837 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1839 if (!GDK_WINDOW_DESTROYED (window))
1848 *width = impl->width;
1851 *height = impl->height;
1854 *depth = DFB_BITS_PER_PIXEL(impl->format);
1859 _gdk_directfb_calc_abs (GdkWindow *window)
1861 GdkWindowObject *private;
1862 GdkDrawableImplDirectFB *impl;
1865 g_return_if_fail (GDK_IS_WINDOW (window));
1867 private = GDK_WINDOW_OBJECT (window);
1868 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1870 impl->abs_x = private->x;
1871 impl->abs_y = private->y;
1873 if (private->parent)
1875 GdkDrawableImplDirectFB *parent_impl =
1876 GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (private->parent)->impl);
1878 impl->abs_x += parent_impl->abs_x;
1879 impl->abs_y += parent_impl->abs_y;
1882 for (list = private->children; list; list = list->next)
1884 _gdk_directfb_calc_abs (list->data);
1889 gdk_window_get_origin (GdkWindow *window,
1893 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
1895 if (!GDK_WINDOW_DESTROYED (window))
1897 GdkDrawableImplDirectFB *impl;
1899 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1913 gdk_window_get_deskrelative_origin (GdkWindow *window,
1917 return gdk_window_get_origin (window, x, y);
1921 gdk_window_get_root_origin (GdkWindow *window,
1925 GdkWindowObject *rover;
1927 g_return_if_fail (GDK_IS_WINDOW (window));
1929 rover = (GdkWindowObject*) window;
1935 if (GDK_WINDOW_DESTROYED (window))
1938 while (rover->parent && ((GdkWindowObject*) rover->parent)->parent)
1939 rover = (GdkWindowObject *) rover->parent;
1940 if (rover->destroyed)
1950 _gdk_windowing_window_get_pointer (GdkDisplay *display,
1954 GdkModifierType *mask)
1956 GdkWindow *retval = NULL;
1957 gint rx, ry, wx, wy;
1958 GdkDrawableImplDirectFB *impl;
1960 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1963 window = _gdk_parent_root;
1965 gdk_directfb_mouse_get_info (&rx, &ry, mask);
1969 retval = gdk_directfb_child_at (_gdk_parent_root, &wx, &wy);
1971 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1974 *x = rx - impl->abs_x;
1976 *y = ry - impl->abs_y;
1982 _gdk_windowing_window_at_pointer (GdkDisplay *display,
1989 if (!win_x || !win_y)
1990 gdk_directfb_mouse_get_info (&wx, &wy, NULL);
1998 retval = gdk_directfb_child_at (_gdk_parent_root, &wx, &wy);
2010 _gdk_windowing_get_pointer (GdkDisplay *display,
2014 GdkModifierType *mask)
2018 *screen = gdk_display_get_default_screen (display);
2020 _gdk_windowing_window_get_pointer (display,
2021 _gdk_windowing_window_at_pointer(display,NULL,NULL),x,y,mask);
2026 gdk_window_get_events (GdkWindow *window)
2028 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
2030 if (GDK_WINDOW_DESTROYED (window))
2033 return GDK_WINDOW_OBJECT (window)->event_mask;
2037 gdk_window_set_events (GdkWindow *window,
2038 GdkEventMask event_mask)
2040 g_return_if_fail (GDK_IS_WINDOW (window));
2042 if (event_mask & GDK_BUTTON_MOTION_MASK)
2043 event_mask |= (GDK_BUTTON1_MOTION_MASK |
2044 GDK_BUTTON2_MOTION_MASK |
2045 GDK_BUTTON3_MOTION_MASK);
2047 GDK_WINDOW_OBJECT (window)->event_mask = event_mask;
2051 gdk_window_shape_combine_mask (GdkWindow *window,
2059 gdk_window_input_shape_combine_mask (GdkWindow *window,
2067 gdk_window_shape_combine_region (GdkWindow *window,
2068 GdkRegion *shape_region,
2075 gdk_window_input_shape_combine_region (GdkWindow *window,
2076 GdkRegion *shape_region,
2083 gdk_window_set_override_redirect (GdkWindow *window,
2084 gboolean override_redirect)
2086 g_return_if_fail (GDK_IS_WINDOW (window));
2088 if (GDK_WINDOW_DESTROYED (window))
2095 gdk_window_set_icon_list (GdkWindow *window,
2098 g_return_if_fail (GDK_IS_WINDOW (window));
2100 if (GDK_WINDOW_DESTROYED (window))
2107 gdk_window_set_icon (GdkWindow *window,
2108 GdkWindow *icon_window,
2112 g_return_if_fail (GDK_IS_WINDOW (window));
2114 if (GDK_WINDOW_DESTROYED (window))
2121 gdk_window_set_icon_name (GdkWindow *window,
2124 g_return_if_fail (GDK_IS_WINDOW (window));
2126 if (GDK_WINDOW_DESTROYED (window))
2133 gdk_window_iconify (GdkWindow *window)
2135 g_return_if_fail (GDK_IS_WINDOW (window));
2137 if (GDK_WINDOW_DESTROYED (window))
2140 gdk_window_hide (window);
2144 gdk_window_deiconify (GdkWindow *window)
2146 g_return_if_fail (GDK_IS_WINDOW (window));
2148 if (GDK_WINDOW_DESTROYED (window))
2151 gdk_window_show (window);
2155 gdk_window_stick (GdkWindow *window)
2157 g_return_if_fail (GDK_IS_WINDOW (window));
2159 if (GDK_WINDOW_DESTROYED (window))
2166 gdk_window_unstick (GdkWindow *window)
2168 g_return_if_fail (GDK_IS_WINDOW (window));
2170 if (GDK_WINDOW_DESTROYED (window))
2177 gdk_directfb_window_set_opacity (GdkWindow *window,
2180 GdkWindowImplDirectFB *impl;
2182 g_return_if_fail (GDK_IS_WINDOW (window));
2184 if (GDK_WINDOW_DESTROYED (window))
2187 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2189 impl->opacity = opacity;
2191 if (impl->window && GDK_WINDOW_IS_MAPPED (window))
2193 if (gdk_directfb_apply_focus_opacity &&
2194 window == gdk_directfb_focused_window)
2195 impl->window->SetOpacity (impl->window,
2196 (impl->opacity >> 1) + (impl->opacity >> 2));
2198 impl->window->SetOpacity (impl->window, impl->opacity);
2203 gdk_window_focus (GdkWindow *window,
2206 GdkWindow *toplevel;
2208 g_return_if_fail (GDK_IS_WINDOW (window));
2210 if (GDK_WINDOW_DESTROYED (window))
2213 toplevel = gdk_directfb_window_find_toplevel (window);
2214 if (toplevel != _gdk_parent_root)
2216 GdkWindowImplDirectFB *impl;
2218 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (toplevel)->impl);
2220 impl->window->RequestFocus (impl->window);
2225 gdk_window_maximize (GdkWindow *window)
2227 g_return_if_fail (GDK_IS_WINDOW (window));
2229 if (GDK_WINDOW_DESTROYED (window))
2236 gdk_window_unmaximize (GdkWindow *window)
2238 g_return_if_fail (GDK_IS_WINDOW (window));
2240 if (GDK_WINDOW_DESTROYED (window))
2247 gdk_window_set_type_hint (GdkWindow *window,
2248 GdkWindowTypeHint hint)
2250 g_return_if_fail (GDK_IS_WINDOW (window));
2252 if (GDK_WINDOW_DESTROYED (window))
2255 GDK_NOTE (MISC, g_print ("gdk_window_set_type_hint: 0x%x: %d\n",
2256 GDK_WINDOW_DFB_ID (window), hint));
2258 ((GdkWindowImplDirectFB *)((GdkWindowObject *)window)->impl)->type_hint = hint;
2265 gdk_window_get_type_hint (GdkWindow *window)
2267 g_return_val_if_fail (GDK_IS_WINDOW (window), GDK_WINDOW_TYPE_HINT_NORMAL);
2269 if (GDK_WINDOW_DESTROYED (window))
2270 return GDK_WINDOW_TYPE_HINT_NORMAL;
2272 return GDK_WINDOW_IMPL_DIRECTFB (((GdkWindowObject *) window)->impl)->type_hint;
2276 gdk_window_set_modal_hint (GdkWindow *window,
2279 GdkWindowImplDirectFB *impl;
2281 g_return_if_fail (GDK_IS_WINDOW (window));
2283 if (GDK_WINDOW_DESTROYED (window))
2286 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2290 impl->window->SetStackingClass (impl->window,
2291 modal ? DWSC_UPPER : DWSC_MIDDLE);
2296 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
2297 gboolean skips_taskbar)
2299 g_return_if_fail (GDK_IS_WINDOW (window));
2303 gdk_window_set_skip_pager_hint (GdkWindow *window,
2304 gboolean skips_pager)
2306 g_return_if_fail (GDK_IS_WINDOW (window));
2311 gdk_window_set_group (GdkWindow *window,
2314 g_return_if_fail (GDK_IS_WINDOW (window));
2315 g_return_if_fail (GDK_IS_WINDOW (leader));
2316 g_warning(" DirectFb set_group groups not supported \n");
2318 if (GDK_WINDOW_DESTROYED (window))
2324 GdkWindow * gdk_window_get_group (GdkWindow *window)
2326 g_warning(" DirectFb get_group groups not supported \n");
2331 gdk_fb_window_set_child_handler (GdkWindow *window,
2332 GdkWindowChildChanged changed,
2333 GdkWindowChildGetPos get_pos,
2336 GdkWindowChildHandlerData *data;
2338 g_return_if_fail (GDK_IS_WINDOW (window));
2340 data = g_new (GdkWindowChildHandlerData, 1);
2341 data->changed = changed;
2342 data->get_pos = get_pos;
2343 data->user_data = user_data;
2345 g_object_set_data_full (G_OBJECT (window), "gdk-window-child-handler",
2346 data, (GDestroyNotify) g_free);
2350 gdk_window_set_decorations (GdkWindow *window,
2351 GdkWMDecoration decorations)
2353 GdkWMDecoration *dec;
2355 g_return_if_fail (GDK_IS_WINDOW (window));
2357 dec = g_new (GdkWMDecoration, 1);
2360 g_object_set_data_full (G_OBJECT (window), "gdk-window-decorations",
2361 dec, (GDestroyNotify) g_free);
2365 gdk_window_get_decorations (GdkWindow *window,
2366 GdkWMDecoration *decorations)
2368 GdkWMDecoration *dec;
2370 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2372 dec = g_object_get_data (G_OBJECT (window), "gdk-window-decorations");
2375 *decorations = *dec;
2382 gdk_window_set_functions (GdkWindow *window,
2383 GdkWMFunction functions)
2385 g_return_if_fail (GDK_IS_WINDOW (window));
2387 if (GDK_WINDOW_DESTROYED (window))
2391 g_message("unimplemented %s", G_GNUC_FUNCTION);
2395 gdk_window_set_child_shapes (GdkWindow *window)
2400 gdk_window_merge_child_shapes (GdkWindow *window)
2405 gdk_window_set_child_input_shapes (GdkWindow *window)
2410 gdk_window_merge_child_input_shapes (GdkWindow *window)
2415 gdk_window_set_static_gravities (GdkWindow *window,
2416 gboolean use_static)
2418 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2420 if (GDK_WINDOW_DESTROYED (window))
2424 g_message("unimplemented %s", G_GNUC_FUNCTION);
2430 gdk_window_begin_resize_drag (GdkWindow *window,
2437 g_return_if_fail (GDK_IS_WINDOW (window));
2439 if (GDK_WINDOW_DESTROYED (window))
2442 g_message("unimplemented %s", G_GNUC_FUNCTION);
2446 gdk_window_begin_move_drag (GdkWindow *window,
2452 g_return_if_fail (GDK_IS_WINDOW (window));
2454 if (GDK_WINDOW_DESTROYED (window))
2457 g_message("unimplemented %s", G_GNUC_FUNCTION);
2461 * gdk_window_get_frame_extents:
2462 * @window: a #GdkWindow
2463 * @rect: rectangle to fill with bounding box of the window frame
2465 * Obtains the bounding box of the window, including window manager
2466 * titlebar/borders if any. The frame position is given in root window
2467 * coordinates. To get the position of the window itself (rather than
2468 * the frame) in root window coordinates, use gdk_window_get_origin().
2472 gdk_window_get_frame_extents (GdkWindow *window,
2475 GdkWindowObject *private;
2476 GdkDrawableImplDirectFB *impl;
2478 g_return_if_fail (GDK_IS_WINDOW (window));
2479 g_return_if_fail (rect != NULL);
2481 if (GDK_WINDOW_DESTROYED (window))
2484 private = GDK_WINDOW_OBJECT (window);
2486 while (private->parent && ((GdkWindowObject*) private->parent)->parent)
2487 private = (GdkWindowObject*) private->parent;
2488 if (GDK_WINDOW_DESTROYED (window))
2491 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
2493 rect->x = impl->abs_x;
2494 rect->y = impl->abs_x;
2495 rect->width = impl->width;
2496 rect->height = impl->height;
2500 * Given a directfb window and a subsurface of that window
2501 * create a gdkwindow child wrapper
2503 #if (DIRECTFB_MICRO_VERSION > 25)
2504 GdkWindow *gdk_directfb_create_child_window(GdkWindow *parent,
2505 IDirectFBSurface *subsurface)
2508 GdkWindowObject *private;
2509 GdkWindowObject *parent_private;
2510 GdkWindowImplDirectFB *impl;
2511 GdkWindowImplDirectFB *parent_impl;
2514 g_return_val_if_fail (parent != NULL, NULL);
2516 window = g_object_new (GDK_TYPE_WINDOW, NULL);
2517 private = GDK_WINDOW_OBJECT (window);
2518 parent_private = GDK_WINDOW_OBJECT (parent);
2519 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
2520 private->parent = parent_private;
2522 subsurface->GetPosition(subsurface,&x,&y);
2523 subsurface->GetSize(subsurface,&w,&h);
2525 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2526 impl->drawable.wrapper = GDK_DRAWABLE (window);
2531 _gdk_directfb_calc_abs (window);
2533 impl->drawable.width = w;
2534 impl->drawable.height = h;
2535 private->window_type = GDK_WINDOW_CHILD;
2536 impl->drawable.surface = subsurface;
2537 impl->drawable.format = parent_impl->drawable.format;
2538 private->depth = parent_private->depth;
2539 gdk_drawable_set_colormap (GDK_DRAWABLE (window),
2540 gdk_drawable_get_colormap (parent));
2541 gdk_window_set_cursor (window, NULL);
2542 parent_private->children = g_list_prepend (parent_private->children,window);
2543 /*we hold a reference count on ourselves */
2544 g_object_ref (window);
2552 * The wrapping is not perfect since directfb does not give full access
2553 * to the current state of a window event mask etc need to fix dfb
2556 gdk_window_foreign_new_for_display (GdkDisplay* display,GdkNativeWindow anid)
2558 GdkWindow *window = NULL;
2559 GdkWindow *parent =NULL;
2560 GdkWindowObject *private =NULL;
2561 GdkWindowObject *parent_private =NULL;
2562 GdkWindowImplDirectFB *parent_impl =NULL;
2563 GdkWindowImplDirectFB *impl =NULL;
2564 DFBWindowOptions options;
2566 GdkDisplayDFB * gdkdisplay = _gdk_display;
2567 IDirectFBWindow *dfbwindow;
2569 window = gdk_window_lookup (anid);
2572 g_object_ref (window);
2575 if( display != NULL )
2576 gdkdisplay = GDK_DISPLAY_DFB(display);
2578 ret = gdkdisplay->layer->GetWindow (gdkdisplay->layer,
2579 (DFBWindowID)anid,&dfbwindow);
2581 if (ret != DFB_OK) {
2582 DirectFBError ("gdk_window_new: Layer->GetWindow failed", ret);
2586 parent = _gdk_parent_root;
2589 parent_private = GDK_WINDOW_OBJECT (parent);
2590 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
2593 window = g_object_new (GDK_TYPE_WINDOW, NULL);
2594 /* we hold a reference count on ourselves */
2595 g_object_ref (window);
2596 private = GDK_WINDOW_OBJECT (window);
2597 private->parent = parent_private;
2598 private->window_type = GDK_WINDOW_TOPLEVEL;
2599 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2601 impl->drawable.wrapper = GDK_DRAWABLE (window);
2602 impl->window = dfbwindow;
2603 dfbwindow->GetOptions(dfbwindow,&options);
2604 dfbwindow->GetPosition(dfbwindow,&private->x,&private->y);
2605 dfbwindow->GetSize(dfbwindow,&impl->drawable.width,&impl->drawable.height);
2608 private->input_only = FALSE;
2610 if( dfbwindow->GetSurface (dfbwindow, &impl->drawable.surface) == DFB_UNSUPPORTED ){
2611 private->input_only = TRUE;
2612 impl->drawable.surface = NULL;
2615 * Position ourselevs
2617 _gdk_directfb_calc_abs (window);
2619 /* We default to all events least surprise to the user
2620 * minus the poll for motion events
2622 gdk_window_set_events (window, (GDK_ALL_EVENTS_MASK ^ GDK_POINTER_MOTION_HINT_MASK));
2624 if (impl->drawable.surface)
2626 impl->drawable.surface->GetPixelFormat (impl->drawable.surface,
2627 &impl->drawable.format);
2629 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
2631 gdk_drawable_set_colormap (GDK_DRAWABLE (window), gdk_drawable_get_colormap (parent));
2633 gdk_drawable_set_colormap (GDK_DRAWABLE (window), gdk_colormap_get_system());
2636 //can be null for the soft cursor window itself when
2637 //running a gtk directfb wm
2638 if( gdk_display_get_default() != NULL ) {
2639 gdk_window_set_cursor (window,NULL);
2643 parent_private->children = g_list_prepend (parent_private->children,
2645 impl->dfb_id = (DFBWindowID)anid;
2646 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
2647 gdk_directfb_event_windows_add (window);
2653 gdk_window_lookup_for_display (GdkDisplay *display,GdkNativeWindow anid)
2655 return gdk_directfb_window_id_table_lookup ((DFBWindowID) anid);
2659 gdk_window_lookup (GdkNativeWindow anid)
2661 return gdk_directfb_window_id_table_lookup ((DFBWindowID) anid);
2664 IDirectFBWindow *gdk_directfb_window_lookup(GdkWindow *window )
2666 GdkWindowObject *private;
2667 GdkWindowImplDirectFB *impl;
2668 g_return_val_if_fail (GDK_IS_WINDOW (window),NULL);
2669 private = GDK_WINDOW_OBJECT (window);
2670 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2671 return impl->window;
2674 IDirectFBSurface *gdk_directfb_surface_lookup(GdkWindow *window)
2676 GdkWindowObject *private;
2677 GdkWindowImplDirectFB *impl;
2678 g_return_val_if_fail (GDK_IS_WINDOW (window),NULL);
2679 private = GDK_WINDOW_OBJECT (window);
2680 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2681 return impl->drawable.surface;
2685 gdk_window_fullscreen (GdkWindow *window)
2687 g_return_if_fail (GDK_IS_WINDOW (window));
2688 g_warning ("gdk_window_fullscreen() not implemented.\n");
2692 gdk_window_unfullscreen (GdkWindow *window)
2694 g_return_if_fail (GDK_IS_WINDOW (window));
2695 /* g_warning ("gdk_window_unfullscreen() not implemented.\n");*/
2699 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
2701 g_return_if_fail (GDK_IS_WINDOW (window));
2702 static gboolean first_call = TRUE;
2704 g_warning ("gdk_window_set_keep_above() not implemented.\n");
2711 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
2713 g_return_if_fail (GDK_IS_WINDOW (window));
2714 static gboolean first_call = TRUE;
2716 g_warning ("gdk_window_set_keep_below() not implemented.\n");
2723 gdk_window_enable_synchronized_configure (GdkWindow *window)
2728 gdk_window_configure_finished (GdkWindow *window)
2733 gdk_display_warp_pointer (GdkDisplay *display,
2738 g_warning ("gdk_display_warp_pointer() not implemented.\n");
2742 gdk_window_set_urgency_hint (GdkWindow *window,
2745 g_return_if_fail (GDK_IS_WINDOW (window));
2746 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD);
2748 if (GDK_WINDOW_DESTROYED (window))
2751 g_warning ("gdk_window_set_urgency_hint() not implemented.\n");
2756 gdk_window_impl_directfb_invalidate_maybe_recurse (GdkPaintable *paintable,
2758 gboolean (*child_func) (GdkWindow *, gpointer),
2762 GdkWindowObject *private;
2763 GdkWindowImplDirectFB *wimpl;
2764 GdkDrawableImplDirectFB *impl;
2766 wimpl = GDK_WINDOW_IMPL_DIRECTFB (paintable);
2767 impl = (GdkDrawableImplDirectFB *)wimpl;
2768 window = wimpl->gdkWindow;
2769 private = (GdkWindowObject *)window;
2771 GdkRegion *visible_region;
2774 g_return_if_fail (window != NULL);
2775 g_return_if_fail (GDK_IS_WINDOW (window));
2777 if (GDK_WINDOW_DESTROYED (window))
2780 if (private->input_only || !GDK_WINDOW_IS_MAPPED (window))
2783 visible_region = gdk_drawable_get_visible_region (window);
2784 gdk_region_intersect (visible_region, region);
2786 tmp_list = private->children;
2789 GdkWindowObject *child = tmp_list->data;
2791 if (!child->input_only)
2793 GdkRegion *child_region;
2794 GdkRectangle child_rect;
2796 gdk_window_get_position ((GdkWindow *)child,
2797 &child_rect.x, &child_rect.y);
2798 gdk_drawable_get_size ((GdkDrawable *)child,
2799 &child_rect.width, &child_rect.height);
2801 child_region = gdk_region_rectangle (&child_rect);
2803 /* remove child area from the invalid area of the parent */
2804 if (GDK_WINDOW_IS_MAPPED (child) && !child->shaped)
2805 gdk_region_subtract (visible_region, child_region);
2807 if (child_func && (*child_func) ((GdkWindow *)child, user_data))
2809 gdk_region_offset (region, - child_rect.x, - child_rect.y);
2810 gdk_region_offset (child_region, - child_rect.x, - child_rect.y);
2811 gdk_region_intersect (child_region, region);
2813 gdk_window_invalidate_maybe_recurse ((GdkWindow *)child,
2814 child_region, child_func, user_data);
2816 gdk_region_offset (region, child_rect.x, child_rect.y);
2819 gdk_region_destroy (child_region);
2822 tmp_list = tmp_list->next;
2825 if (!gdk_region_empty (visible_region))
2828 if (private->update_area)
2830 gdk_region_union (private->update_area, visible_region);
2834 update_windows = g_slist_prepend (update_windows, window);
2835 private->update_area = gdk_region_copy (visible_region);
2836 gdk_window_schedule_update (window);
2839 gdk_region_destroy (visible_region);
2844 gdk_window_impl_directfb_process_updates (GdkPaintable *paintable,
2845 gboolean update_children)
2848 GdkWindowObject *private;
2849 GdkWindowImplDirectFB *wimpl;
2850 GdkDrawableImplDirectFB *impl;
2852 wimpl = GDK_WINDOW_IMPL_DIRECTFB (paintable);
2853 impl = (GdkDrawableImplDirectFB *)wimpl;
2854 window = wimpl->gdkWindow;
2855 private = (GdkWindowObject *)window;
2856 gboolean save_region = FALSE;
2858 /* If an update got queued during update processing, we can get a
2859 * window in the update queue that has an empty update_area.
2862 if (private->update_area)
2864 GdkRegion *update_area = private->update_area;
2865 private->update_area = NULL;
2867 if (_gdk_event_func && gdk_window_is_viewable (window))
2869 GdkRectangle window_rect;
2870 GdkRegion *expose_region;
2871 GdkRegion *window_region;
2873 save_region = _gdk_windowing_window_queue_antiexpose (window, update_area);
2876 expose_region = gdk_region_copy (update_area);
2878 expose_region = update_area;
2880 gdk_drawable_get_size (GDK_DRAWABLE (private), &width, &height);
2884 window_rect.width = width;
2885 window_rect.height = height;
2887 window_region = gdk_region_rectangle (&window_rect);
2888 gdk_region_intersect (expose_region,
2890 gdk_region_destroy (window_region);
2892 if (!gdk_region_empty (expose_region) &&
2893 (private->event_mask & GDK_EXPOSURE_MASK))
2897 event.expose.type = GDK_EXPOSE;
2898 event.expose.window = g_object_ref (window);
2899 event.expose.send_event = FALSE;
2900 event.expose.count = 0;
2901 event.expose.region = expose_region;
2902 gdk_region_get_clipbox (expose_region, &event.expose.area);
2903 (*_gdk_event_func) (&event, _gdk_event_data);
2905 g_object_unref (window);
2908 if (expose_region != update_area)
2909 gdk_region_destroy (expose_region);
2912 gdk_region_destroy (update_area);
2918 gdk_window_impl_directfb_begin_paint_region (GdkPaintable *paintable,
2921 GdkDrawableImplDirectFB *impl;
2922 GdkWindowImplDirectFB *wimpl;
2926 g_assert (region != NULL );
2927 wimpl = GDK_WINDOW_IMPL_DIRECTFB (paintable);
2928 impl = (GdkDrawableImplDirectFB *)wimpl;
2929 impl->buffered = TRUE;
2930 impl->paint_depth++;
2935 if (impl->paint_region)
2936 gdk_region_union (impl->paint_region, region);
2938 impl->paint_region = gdk_region_copy (region);
2940 for (i = 0; i < region->numRects; i++)
2942 GdkRegionBox *box = ®ion->rects[i];
2944 _gdk_windowing_window_clear_area (GDK_WINDOW(wimpl->gdkWindow),
2954 gdk_window_impl_directfb_end_paint (GdkPaintable *paintable)
2956 GdkDrawableImplDirectFB *impl;
2958 impl = GDK_DRAWABLE_IMPL_DIRECTFB (paintable);
2960 g_return_if_fail (impl->paint_depth > 0);
2962 impl->paint_depth--;
2964 if (impl->paint_depth == 0)
2966 impl->buffered = FALSE;
2968 if (impl->paint_region)
2970 DFBRegion reg = { impl->paint_region->extents.x1,
2971 impl->paint_region->extents.y1,
2972 impl->paint_region->extents.x2 ,
2973 impl->paint_region->extents.y2 };
2975 impl->surface->Flip(impl->surface, ®,0);
2976 gdk_region_destroy (impl->paint_region);
2977 impl->paint_region = NULL;
2984 gdk_window_impl_directfb_paintable_init (GdkPaintableIface *iface)
2986 iface->begin_paint_region = gdk_window_impl_directfb_begin_paint_region;
2987 iface->end_paint = gdk_window_impl_directfb_end_paint;
2989 iface->invalidate_maybe_recurse = gdk_window_impl_directfb_invalidate_maybe_recurse;
2990 iface->process_updates = gdk_window_impl_directfb_process_updates;
2993 #define __GDK_WINDOW_X11_C__
2994 #include "gdkaliasdef.c"