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"
48 static GdkRegion * gdk_window_impl_directfb_get_visible_region (GdkDrawable *drawable);
49 static void gdk_window_impl_directfb_set_colormap (GdkDrawable *drawable,
50 GdkColormap *colormap);
51 static void gdk_window_impl_directfb_init (GdkWindowImplDirectFB *window);
52 static void gdk_window_impl_directfb_class_init (GdkWindowImplDirectFBClass *klass);
53 static void gdk_window_impl_directfb_finalize (GObject *object);
57 GdkWindowChildChanged changed;
58 GdkWindowChildGetPos get_pos;
60 } GdkWindowChildHandlerData;
64 static GdkWindow *gdk_directfb_window_containing_pointer = NULL;
65 static GdkWindow *gdk_directfb_focused_window = NULL;
66 static gpointer parent_class = NULL;
67 GdkWindow * _gdk_parent_root = NULL;
71 gdk_window_impl_directfb_get_type (void)
73 static GType object_type = 0;
77 static const GTypeInfo object_info =
79 sizeof (GdkWindowImplDirectFBClass),
81 (GBaseFinalizeFunc) NULL,
82 (GClassInitFunc) gdk_window_impl_directfb_class_init,
83 NULL, /* class_finalize */
84 NULL, /* class_data */
85 sizeof (GdkWindowImplDirectFB),
87 (GInstanceInitFunc) gdk_window_impl_directfb_init,
90 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_DIRECTFB,
91 "GdkWindowImplDirectFB",
99 _gdk_window_impl_get_type (void)
101 return gdk_window_impl_directfb_get_type ();
105 gdk_window_impl_directfb_init (GdkWindowImplDirectFB *impl)
107 impl->drawable.width = 1;
108 impl->drawable.height = 1;
109 //cannot use gdk_cursor_new here since gdk_display_get_default
111 impl->cursor = gdk_cursor_new_for_display (GDK_DISPLAY_OBJECT(_gdk_display),GDK_LEFT_PTR);
116 gdk_window_impl_directfb_class_init (GdkWindowImplDirectFBClass *klass)
118 GObjectClass *object_class = G_OBJECT_CLASS (klass);
119 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
121 parent_class = g_type_class_peek_parent (klass);
123 object_class->finalize = gdk_window_impl_directfb_finalize;
125 drawable_class->set_colormap = gdk_window_impl_directfb_set_colormap;
127 /* Visible and clip regions are the same */
129 drawable_class->get_clip_region =
130 gdk_window_impl_directfb_get_visible_region;
132 drawable_class->get_visible_region =
133 gdk_window_impl_directfb_get_visible_region;
137 g_free_2nd (gpointer a,
145 gdk_window_impl_directfb_finalize (GObject *object)
147 GdkWindowImplDirectFB *impl = GDK_WINDOW_IMPL_DIRECTFB (object);
149 if (GDK_WINDOW_IS_MAPPED (impl->drawable.wrapper))
150 gdk_window_hide (impl->drawable.wrapper);
153 gdk_cursor_unref (impl->cursor);
155 if (impl->properties)
157 g_hash_table_foreach (impl->properties, g_free_2nd, NULL);
158 g_hash_table_destroy (impl->properties);
162 gdk_directfb_window_id_table_remove (impl->dfb_id);
163 /* native window resource must be release before we can finalize !*/
167 if (G_OBJECT_CLASS (parent_class)->finalize)
168 G_OBJECT_CLASS (parent_class)->finalize (object);
172 gdk_window_impl_directfb_get_visible_region (GdkDrawable *drawable)
174 GdkDrawableImplDirectFB *priv = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
175 GdkRectangle rect = { 0, 0, 0, 0 };
176 DFBRectangle drect = { 0, 0, 0, 0 };
179 priv->surface->GetVisibleRectangle (priv->surface, &drect);
184 return gdk_region_rectangle (&rect);
188 gdk_window_impl_directfb_set_colormap (GdkDrawable *drawable,
189 GdkColormap *colormap)
191 GDK_DRAWABLE_CLASS (parent_class)->set_colormap (drawable, colormap);
195 GdkDrawableImplDirectFB *priv = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
199 IDirectFBPalette *palette = gdk_directfb_colormap_get_palette (colormap);
202 priv->surface->SetPalette (priv->surface, palette);
209 create_directfb_window (GdkWindowImplDirectFB *impl,
210 DFBWindowDescription *desc,
211 DFBWindowOptions window_options)
214 IDirectFBWindow *window;
216 ret = _gdk_display->layer->CreateWindow (_gdk_display->layer, desc, &window);
220 DirectFBError ("gdk_window_new: Layer->CreateWindow failed", ret);
225 if ((desc->flags & DWDESC_CAPS) && (desc->caps & DWCAPS_INPUTONLY))
226 impl->drawable.surface = NULL;
228 window->GetSurface (window, &impl->drawable.surface);
232 DFBWindowOptions options;
233 window->GetOptions (window, &options);
234 window->SetOptions (window, options | window_options);
237 impl->window = window;
243 _gdk_windowing_window_init (void)
245 GdkWindowObject *private;
246 GdkWindowImplDirectFB *impl;
247 DFBDisplayLayerConfig dlc;
249 g_assert (_gdk_parent_root == NULL);
251 _gdk_display->layer->GetConfiguration(
252 _gdk_display->layer, &dlc );
254 _gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL);
255 private = GDK_WINDOW_OBJECT (_gdk_parent_root);
256 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
258 private->window_type = GDK_WINDOW_ROOT;
260 private->children = NULL;
263 impl->drawable.abs_x = 0;
264 impl->drawable.abs_y = 0;
265 impl->drawable.width = dlc.width;
266 impl->drawable.height = dlc.height;
267 impl->drawable.wrapper = GDK_DRAWABLE (private);
268 /* custom root window init */
270 DFBWindowDescription desc;
272 /*XXX I must do this now its a bug ALPHA ROOT*/
274 desc.flags = DWDESC_CAPS;
276 desc.caps |= DWCAPS_NODECORATION;
277 desc.caps |= DWCAPS_ALPHACHANNEL;
278 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
279 DWDESC_POSX | DWDESC_POSY );
282 desc.width = dlc.width;
283 desc.height = dlc.height;
284 create_directfb_window (impl,&desc,0);
285 g_assert(impl->window != NULL);
286 g_assert(impl->drawable.surface != NULL );
288 impl->drawable.surface->GetPixelFormat(impl->drawable.surface,&impl->drawable.format);
289 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
291 Now we can set up the system colormap
293 gdk_drawable_set_colormap (GDK_DRAWABLE (_gdk_parent_root),gdk_colormap_get_system());
299 gdk_directfb_window_new (GdkWindow *parent,
300 GdkWindowAttr *attributes,
301 gint attributes_mask,
302 DFBWindowCapabilities window_caps,
303 DFBWindowOptions window_options,
304 DFBSurfaceCapabilities surface_caps)
307 GdkWindowObject *private;
308 GdkWindowObject *parent_private;
309 GdkWindowImplDirectFB *impl;
310 GdkWindowImplDirectFB *parent_impl;
312 DFBWindowDescription desc;
315 g_return_val_if_fail (attributes != NULL, NULL);
317 if (!parent || attributes->window_type != GDK_WINDOW_CHILD)
318 parent = _gdk_parent_root;
320 window = g_object_new (GDK_TYPE_WINDOW, NULL);
321 private = GDK_WINDOW_OBJECT (window);
323 parent_private = GDK_WINDOW_OBJECT (parent);
324 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
325 private->parent = parent_private;
327 x = (attributes_mask & GDK_WA_X) ? attributes->x : 0;
328 y = (attributes_mask & GDK_WA_Y) ? attributes->y : 0;
330 gdk_window_set_events (window, attributes->event_mask | GDK_STRUCTURE_MASK);
332 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
333 impl->drawable.wrapper = GDK_DRAWABLE (window);
338 _gdk_directfb_calc_abs (window);
340 impl->drawable.width = MAX (1, attributes->width);
341 impl->drawable.height = MAX (1, attributes->height);
343 private->window_type = attributes->window_type;
347 if (attributes_mask & GDK_WA_VISUAL)
348 visual = attributes->visual;
350 visual = gdk_drawable_get_visual (parent);
352 switch (attributes->wclass)
354 case GDK_INPUT_OUTPUT:
355 private->input_only = FALSE;
357 desc.flags |= DWDESC_PIXELFORMAT;
358 desc.pixelformat = ((GdkVisualDirectFB *) visual)->format;
360 if (DFB_PIXELFORMAT_HAS_ALPHA (desc.pixelformat))
362 desc.flags |= DWDESC_CAPS;
363 desc.caps = DWCAPS_ALPHACHANNEL;
368 private->input_only = TRUE;
369 desc.flags |= DWDESC_CAPS;
370 desc.caps = DWCAPS_INPUTONLY;
374 g_warning ("gdk_window_new: unsupported window class\n");
375 _gdk_window_destroy (window, FALSE);
379 switch (private->window_type)
381 case GDK_WINDOW_TOPLEVEL:
382 case GDK_WINDOW_DIALOG:
383 case GDK_WINDOW_TEMP:
384 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
385 DWDESC_POSX | DWDESC_POSY );
388 desc.width = impl->drawable.width;
389 desc.height = impl->drawable.height;
393 if (! (desc.flags & DWDESC_CAPS))
395 desc.flags |= DWDESC_CAPS;
396 desc.caps = DWCAPS_NONE;
399 desc.caps |= window_caps;
404 desc.flags |= DWDESC_SURFACE_CAPS;
405 desc.surface_caps = surface_caps;
409 if (!create_directfb_window (impl, &desc, window_options))
412 _gdk_window_destroy (window, FALSE);
415 if( desc.caps != DWCAPS_INPUTONLY )
416 impl->window->SetOpacity(impl->window, 0x00 );
419 case GDK_WINDOW_CHILD:
421 if (!private->input_only && parent_impl->drawable.surface)
424 { x, y, impl->drawable.width, impl->drawable.height };
426 parent_impl->drawable.surface->GetSubSurface (parent_impl->drawable.surface,
428 &impl->drawable.surface);
433 g_warning ("gdk_window_new: unsupported window type: %d",
434 private->window_type);
435 _gdk_window_destroy (window, FALSE);
439 if (impl->drawable.surface)
441 GdkColormap *colormap;
443 impl->drawable.surface->GetPixelFormat (impl->drawable.surface,
444 &impl->drawable.format);
446 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
448 if ((attributes_mask & GDK_WA_COLORMAP) && attributes->colormap)
450 colormap = attributes->colormap;
454 if (gdk_visual_get_system () == visual)
455 colormap = gdk_colormap_get_system ();
457 colormap =gdk_drawable_get_colormap (parent);
460 gdk_drawable_set_colormap (GDK_DRAWABLE (window), colormap);
464 impl->drawable.format = ((GdkVisualDirectFB *)visual)->format;
465 private->depth = visual->depth;
468 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
469 (attributes->cursor) : NULL));
472 parent_private->children = g_list_prepend (parent_private->children,
475 /* we hold a reference count on ourselves */
476 g_object_ref (window);
480 impl->window->GetID (impl->window, &impl->dfb_id);
481 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
482 gdk_directfb_event_windows_add (window);
489 gdk_window_new (GdkWindow *parent,
490 GdkWindowAttr *attributes,
491 gint attributes_mask)
493 g_return_val_if_fail (attributes != NULL, NULL);
495 return gdk_directfb_window_new (parent, attributes, attributes_mask,
496 DWCAPS_NONE, DWOP_NONE, DSCAPS_NONE);
499 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
501 /* It's somebody else's window, but in our heirarchy,
502 * so reparent it to the root window, and then send
503 * it a delete event, as if we were a WM
505 _gdk_windowing_window_destroy (window,TRUE,TRUE);
510 _gdk_windowing_window_destroy (GdkWindow *window,
512 gboolean foreign_destroy)
514 GdkWindowObject *private;
515 GdkWindowImplDirectFB *impl;
517 g_return_if_fail (GDK_IS_WINDOW (window));
519 private = GDK_WINDOW_OBJECT (window);
520 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
522 _gdk_selection_window_destroyed (window);
524 if (window == _gdk_directfb_pointer_grab_window)
525 gdk_pointer_ungrab (GDK_CURRENT_TIME);
526 if (window == _gdk_directfb_keyboard_grab_window)
527 gdk_keyboard_ungrab (GDK_CURRENT_TIME);
529 if (window == gdk_directfb_focused_window)
530 gdk_directfb_change_focus (NULL);
533 printf( " DESTROYING WINDOW %p %p %d parent=%p\n",window,impl->window,recursing,(GDK_WINDOW_OBJECT (window))->parent);
535 if (!recursing && !foreign_destroy && impl->window ) {
536 impl->window->SetOpacity (impl->window,0);
537 impl->window->Close(impl->window);
538 impl->window->Release(impl->window);
541 #if 0 /* let the finalizer kill it */
542 if (!recursing && !foreign_destroy)
545 impl->window->Destroy (impl->window);
551 /* This function is called when the window is really gone.
554 gdk_window_destroy_notify (GdkWindow *window)
556 g_return_if_fail (GDK_IS_WINDOW (window));
558 if (!GDK_WINDOW_DESTROYED (window))
560 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
561 g_warning ("GdkWindow %p unexpectedly destroyed", window);
563 _gdk_window_destroy (window, TRUE);
565 g_object_unref (window);
568 /* Focus follows pointer */
570 gdk_directfb_window_find_toplevel (GdkWindow *window)
572 while (window && window != _gdk_parent_root)
574 GdkWindow *parent = (GdkWindow *) (GDK_WINDOW_OBJECT (window))->parent;
576 if ((parent == _gdk_parent_root) && GDK_WINDOW_IS_MAPPED (window))
582 return _gdk_parent_root;
586 gdk_directfb_window_find_focus (void)
588 if (_gdk_directfb_keyboard_grab_window)
589 return _gdk_directfb_keyboard_grab_window;
591 if (!gdk_directfb_focused_window)
592 gdk_directfb_focused_window = g_object_ref (_gdk_parent_root);
594 return gdk_directfb_focused_window;
598 gdk_directfb_change_focus (GdkWindow *new_focus_window)
600 GdkEventFocus *event;
603 GdkWindow *event_win;
606 /* No focus changes while the pointer is grabbed */
607 if (_gdk_directfb_pointer_grab_window)
610 old_win = gdk_directfb_focused_window;
611 new_win = gdk_directfb_window_find_toplevel (new_focus_window);
613 if (old_win == new_win)
618 event_win = gdk_directfb_keyboard_event_window (old_win,
622 event = (GdkEventFocus *) gdk_directfb_event_make (event_win,
628 event_win = gdk_directfb_keyboard_event_window (new_win,
632 event = (GdkEventFocus *) gdk_directfb_event_make (event_win,
637 if (gdk_directfb_focused_window)
638 g_object_unref (gdk_directfb_focused_window);
639 gdk_directfb_focused_window = g_object_ref (new_win);
643 gdk_window_set_accept_focus (GdkWindow *window,
644 gboolean accept_focus)
646 GdkWindowObject *private;
647 g_return_if_fail (window != NULL);
648 g_return_if_fail (GDK_IS_WINDOW (window));
650 private = (GdkWindowObject *)window;
652 accept_focus = accept_focus != FALSE;
654 if (private->accept_focus != accept_focus)
655 private->accept_focus = accept_focus;
660 gdk_window_set_focus_on_map (GdkWindow *window,
661 gboolean focus_on_map)
663 GdkWindowObject *private;
664 g_return_if_fail (window != NULL);
665 g_return_if_fail (GDK_IS_WINDOW (window));
667 private = (GdkWindowObject *)window;
669 focus_on_map = focus_on_map != FALSE;
671 if (private->focus_on_map != focus_on_map)
672 private->focus_on_map = focus_on_map;
676 gdk_directfb_window_raise (GdkWindow *window)
678 GdkWindowObject *parent;
680 parent = GDK_WINDOW_OBJECT (window)->parent;
682 if (parent->children->data == window)
685 parent->children = g_list_remove (parent->children, window);
686 parent->children = g_list_prepend (parent->children, window);
692 gdk_directfb_window_lower (GdkWindow *window)
694 GdkWindowObject *parent;
696 parent = GDK_WINDOW_OBJECT (window)->parent;
698 parent->children = g_list_remove (parent->children, window);
699 parent->children = g_list_append (parent->children, window);
703 all_parents_shown (GdkWindowObject *private)
705 while (GDK_WINDOW_IS_MAPPED (private))
708 private = GDK_WINDOW_OBJECT (private)->parent;
717 send_map_events (GdkWindowObject *private)
720 GdkWindow *event_win;
722 if (!GDK_WINDOW_IS_MAPPED (private))
725 event_win = gdk_directfb_other_event_window ((GdkWindow *) private, GDK_MAP);
727 gdk_directfb_event_make (event_win, GDK_MAP);
729 for (list = private->children; list; list = list->next)
730 send_map_events (list->data);
734 gdk_directfb_find_common_ancestor (GdkWindow *win1,
740 for (a = GDK_WINDOW_OBJECT (win1); a; a = a->parent)
741 for (b = GDK_WINDOW_OBJECT (win2); b; b = b->parent)
744 return GDK_WINDOW (a);
751 gdk_directfb_window_send_crossing_events (GdkWindow *src,
753 GdkCrossingMode mode)
756 GdkWindow *win, *last, *next;
758 gint x, y, x_int, y_int;
759 GdkModifierType modifiers;
764 GdkWindow *event_win;
766 /* Do a possible cursor change before checking if we need to
767 generate crossing events so cursor changes due to pointer
768 grabs work correctly. */
770 static GdkCursorDirectFB *last_cursor = NULL;
772 GdkWindowObject *private = GDK_WINDOW_OBJECT (dest);
773 GdkWindowImplDirectFB *impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
774 GdkCursorDirectFB *cursor;
776 if (_gdk_directfb_pointer_grab_cursor)
777 cursor = (GdkCursorDirectFB*) _gdk_directfb_pointer_grab_cursor;
779 cursor = (GdkCursorDirectFB*) impl->cursor;
781 if (cursor != last_cursor)
783 win = gdk_directfb_window_find_toplevel (dest);
784 private = GDK_WINDOW_OBJECT (win);
785 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
788 impl->window->SetCursorShape (impl->window,
790 cursor->hot_x, cursor->hot_y);
791 last_cursor = cursor;
795 if (dest == gdk_directfb_window_containing_pointer)
798 if (gdk_directfb_window_containing_pointer == NULL)
799 gdk_directfb_window_containing_pointer = g_object_ref (_gdk_parent_root);
804 a = gdk_directfb_window_containing_pointer;
811 /* gdk_directfb_window_containing_pointer might have been destroyed.
812 * The refcount we hold on it should keep it, but it's parents
815 if (GDK_WINDOW_DESTROYED (a))
816 a = _gdk_parent_root;
818 gdk_directfb_mouse_get_info (&x, &y, &modifiers);
820 c = gdk_directfb_find_common_ancestor (a, b);
822 non_linear = (c != a) && (c != b);
824 event_win = gdk_directfb_pointer_event_window (a, GDK_LEAVE_NOTIFY);
827 event = gdk_directfb_event_make (event_win, GDK_LEAVE_NOTIFY);
828 event->crossing.subwindow = NULL;
830 gdk_window_get_origin (a, &x_int, &y_int);
832 event->crossing.x = x - x_int;
833 event->crossing.y = y - y_int;
834 event->crossing.x_root = x;
835 event->crossing.y_root = y;
836 event->crossing.mode = mode;
839 event->crossing.detail = GDK_NOTIFY_NONLINEAR;
841 event->crossing.detail = GDK_NOTIFY_INFERIOR;
843 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
845 event->crossing.focus = FALSE;
846 event->crossing.state = modifiers;
849 /* Traverse up from a to (excluding) c */
853 win = GDK_WINDOW (GDK_WINDOW_OBJECT (a)->parent);
857 gdk_directfb_pointer_event_window (win, GDK_LEAVE_NOTIFY);
861 event = gdk_directfb_event_make (event_win, GDK_LEAVE_NOTIFY);
863 event->crossing.subwindow = g_object_ref (last);
865 gdk_window_get_origin (win, &x_int, &y_int);
867 event->crossing.x = x - x_int;
868 event->crossing.y = y - y_int;
869 event->crossing.x_root = x;
870 event->crossing.y_root = y;
871 event->crossing.mode = mode;
874 event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
876 event->crossing.detail = GDK_NOTIFY_VIRTUAL;
878 event->crossing.focus = FALSE;
879 event->crossing.state = modifiers;
883 win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent);
887 /* Traverse down from c to b */
891 win = GDK_WINDOW (GDK_WINDOW_OBJECT (b)->parent);
894 path = g_slist_prepend (path, win);
895 win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent);
901 win = GDK_WINDOW (list->data);
902 list = g_slist_next (list);
905 next = GDK_WINDOW (list->data);
910 gdk_directfb_pointer_event_window (win, GDK_ENTER_NOTIFY);
914 event = gdk_directfb_event_make (event_win, GDK_ENTER_NOTIFY);
916 event->crossing.subwindow = g_object_ref (next);
918 gdk_window_get_origin (win, &x_int, &y_int);
920 event->crossing.x = x - x_int;
921 event->crossing.y = y - y_int;
922 event->crossing.x_root = x;
923 event->crossing.y_root = y;
924 event->crossing.mode = mode;
927 event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
929 event->crossing.detail = GDK_NOTIFY_VIRTUAL;
931 event->crossing.focus = FALSE;
932 event->crossing.state = modifiers;
939 event_win = gdk_directfb_pointer_event_window (b, GDK_ENTER_NOTIFY);
942 event = gdk_directfb_event_make (event_win, GDK_ENTER_NOTIFY);
944 event->crossing.subwindow = NULL;
946 gdk_window_get_origin (b, &x_int, &y_int);
948 event->crossing.x = x - x_int;
949 event->crossing.y = y - y_int;
950 event->crossing.x_root = x;
951 event->crossing.y_root = y;
952 event->crossing.mode = mode;
955 event->crossing.detail = GDK_NOTIFY_NONLINEAR;
957 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
959 event->crossing.detail = GDK_NOTIFY_INFERIOR;
961 event->crossing.focus = FALSE;
962 event->crossing.state = modifiers;
965 if (mode != GDK_CROSSING_GRAB)
967 //this seems to cause focus to change as the pointer moves yuck
968 //gdk_directfb_change_focus (b);
969 if (b != gdk_directfb_window_containing_pointer)
971 g_object_unref (gdk_directfb_window_containing_pointer);
972 gdk_directfb_window_containing_pointer = g_object_ref (b);
978 show_window_internal (GdkWindow *window,
981 GdkWindowObject *private;
982 GdkWindowImplDirectFB *impl;
985 private = GDK_WINDOW_OBJECT (window);
986 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
988 if (!private->destroyed && !GDK_WINDOW_IS_MAPPED (private))
990 private->state &= ~GDK_WINDOW_STATE_WITHDRAWN;
993 gdk_window_raise (window);
995 if (all_parents_shown (GDK_WINDOW_OBJECT (private)->parent))
997 send_map_events (private);
999 mousewin = gdk_window_at_pointer (NULL, NULL);
1000 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1001 GDK_CROSSING_NORMAL);
1003 if (private->input_only)
1006 gdk_window_invalidate_rect (window, NULL, TRUE);
1012 if (gdk_directfb_apply_focus_opacity)
1013 impl->window->SetOpacity (impl->window,
1014 (impl->opacity >> 1) + (impl->opacity >> 2));
1016 impl->window->SetOpacity (impl->window, impl->opacity);
1017 /* if its the first window focus it */
1022 gdk_window_show_unraised (GdkWindow *window)
1024 g_return_if_fail (GDK_IS_WINDOW (window));
1026 show_window_internal (window, FALSE);
1030 gdk_window_show (GdkWindow *window)
1032 g_return_if_fail (GDK_IS_WINDOW (window));
1034 show_window_internal (window, TRUE);
1038 gdk_window_hide (GdkWindow *window)
1040 GdkWindowObject *private;
1041 GdkWindowImplDirectFB *impl;
1042 GdkWindow *mousewin;
1043 GdkWindow *event_win;
1045 g_return_if_fail (GDK_IS_WINDOW (window));
1047 private = GDK_WINDOW_OBJECT (window);
1048 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1051 impl->window->SetOpacity (impl->window, 0);
1053 if (!private->destroyed && GDK_WINDOW_IS_MAPPED (private))
1057 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
1059 if (!private->input_only && private->parent)
1061 _gdk_windowing_window_clear_area (GDK_WINDOW (private->parent),
1064 impl->drawable.width,
1065 impl->drawable.height);
1068 event_win = gdk_directfb_other_event_window (window, GDK_UNMAP);
1070 event = gdk_directfb_event_make (event_win, GDK_UNMAP);
1072 mousewin = gdk_window_at_pointer (NULL, NULL);
1073 gdk_directfb_window_send_crossing_events (NULL,
1075 GDK_CROSSING_NORMAL);
1077 if (window == _gdk_directfb_pointer_grab_window)
1078 gdk_pointer_ungrab (GDK_CURRENT_TIME);
1079 if (window == _gdk_directfb_keyboard_grab_window)
1080 gdk_keyboard_ungrab (GDK_CURRENT_TIME);
1085 gdk_window_withdraw (GdkWindow *window)
1087 g_return_if_fail (GDK_IS_WINDOW (window));
1089 /* for now this should be enough */
1090 gdk_window_hide (window);
1094 gdk_window_move (GdkWindow *window,
1098 GdkWindowObject *private;
1099 GdkWindowImplDirectFB *impl;
1101 g_return_if_fail (GDK_IS_WINDOW (window));
1103 private = GDK_WINDOW_OBJECT (window);
1104 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1110 impl->window->MoveTo (impl->window, x, y);
1114 gint width=impl->drawable.width;
1115 gint height=impl->drawable.height;
1117 { private->x, private->y,width,height };
1119 _gdk_directfb_move_resize_child (window, x, y, width, height);
1120 _gdk_directfb_calc_abs (window);
1122 if (GDK_WINDOW_IS_MAPPED (private))
1124 GdkWindow *mousewin;
1125 GdkRectangle new = { x, y, width, height };
1127 gdk_rectangle_union (&new, &old, &new);
1128 gdk_window_invalidate_rect (GDK_WINDOW (private->parent), &new,TRUE);
1130 /* The window the pointer is in might have changed */
1131 mousewin = gdk_window_at_pointer (NULL, NULL);
1132 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1133 GDK_CROSSING_NORMAL);
1139 gdk_window_resize (GdkWindow *window,
1143 GdkWindowObject *private;
1146 g_return_if_fail (GDK_IS_WINDOW (window));
1148 private = GDK_WINDOW_OBJECT (window);
1153 if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD))
1155 GdkWindowChildHandlerData *data;
1157 data = g_object_get_data (G_OBJECT (private->parent),
1158 "gdk-window-child-handler");
1161 (*data->get_pos) (window, &x, &y, data->user_data);
1164 gdk_window_move_resize (window, x, y, width, height);
1168 _gdk_directfb_move_resize_child (GdkWindow *window,
1174 GdkWindowObject *private;
1175 GdkWindowImplDirectFB *impl;
1176 GdkWindowImplDirectFB *parent_impl;
1179 g_return_if_fail (GDK_IS_WINDOW (window));
1181 private = GDK_WINDOW_OBJECT (window);
1182 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1187 impl->drawable.width = width;
1188 impl->drawable.height = height;
1190 if (!private->input_only)
1192 if (impl->drawable.surface)
1194 impl->drawable.surface->Release (impl->drawable.surface);
1195 impl->drawable.surface = NULL;
1198 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (private->parent)->impl);
1200 if (parent_impl->drawable.surface)
1202 DFBRectangle rect = { x, y, width, height };
1204 parent_impl->drawable.surface->GetSubSurface (parent_impl->drawable.surface,
1206 &impl->drawable.surface);
1210 for (list = private->children; list; list = list->next)
1212 private = GDK_WINDOW_OBJECT (list->data);
1213 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1214 _gdk_directfb_move_resize_child (list->data,
1215 private->x, private->y,
1216 impl->drawable.width, impl->drawable.height);
1221 gdk_window_move_resize (GdkWindow *window,
1227 GdkWindowObject *private;
1228 GdkWindowImplDirectFB *impl;
1230 g_return_if_fail (GDK_IS_WINDOW (window));
1232 private = GDK_WINDOW_OBJECT (window);
1233 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1240 if (private->destroyed ||
1241 (private->x == x && private->y == y &&
1242 impl->drawable.width == width && impl->drawable.height == height))
1245 if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD))
1247 GdkWindowChildHandlerData *data;
1249 data = g_object_get_data (G_OBJECT (private->parent),
1250 "gdk-window-child-handler");
1253 (*data->changed) (window, x, y, width, height, data->user_data))
1257 if (impl->drawable.width == width && impl->drawable.height == height)
1259 gdk_window_move (window, x, y);
1261 else if (impl->window)
1265 impl->window->MoveTo (impl->window, x, y);
1266 impl->window->Resize (impl->window, width, height);
1271 { private->x, private->y, impl->drawable.width, impl->drawable.height };
1272 _gdk_directfb_move_resize_child (window, x, y, width, height);
1273 _gdk_directfb_calc_abs (window);
1275 if (GDK_WINDOW_IS_MAPPED (private))
1277 GdkWindow *mousewin;
1278 GdkRectangle new = { x, y, width, height };
1280 gdk_rectangle_union (&new, &old, &new);
1281 gdk_window_invalidate_rect (GDK_WINDOW (private->parent), &new,TRUE);
1283 /* The window the pointer is in might have changed */
1284 mousewin = gdk_window_at_pointer (NULL, NULL);
1285 gdk_directfb_window_send_crossing_events (NULL, mousewin,
1286 GDK_CROSSING_NORMAL);
1290 //XXX BROKE if top LEVEL WINDOW ~~~
1292 gdk_window_reparent (GdkWindow *window,
1293 GdkWindow *new_parent,
1297 GdkWindowObject *window_private;
1298 GdkWindowObject *parent_private;
1299 GdkWindowObject *old_parent_private;
1300 GdkWindowImplDirectFB *impl;
1301 GdkWindowImplDirectFB *parent_impl;
1304 g_return_if_fail (GDK_IS_WINDOW (window));
1306 if (GDK_WINDOW_DESTROYED (window))
1310 new_parent = _gdk_parent_root;
1312 window_private = (GdkWindowObject *) window;
1313 old_parent_private = (GdkWindowObject *) window_private->parent;
1314 parent_private = (GdkWindowObject *) new_parent;
1315 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
1316 visual = gdk_drawable_get_visual (window);
1318 /* already parented */
1319 if( window_private->parent == (GdkWindowObject *)new_parent )
1322 window_private->parent = (GdkWindowObject *) new_parent;
1324 if (old_parent_private)
1326 old_parent_private->children =
1327 g_list_remove (old_parent_private->children, window);
1330 parent_private->children = g_list_prepend (parent_private->children, window);
1332 impl = GDK_WINDOW_IMPL_DIRECTFB (window_private->impl);
1334 if( impl->drawable.surface ) {
1335 impl->drawable.surface->Release (impl->drawable.surface);
1336 impl->drawable.surface = NULL;
1339 if( impl->window != NULL ) {
1340 gdk_directfb_window_id_table_remove (impl->dfb_id);
1341 impl->window->SetOpacity (impl->window,0);
1342 impl->window->Close(impl->window);
1343 impl->window->Release(impl->window);
1344 impl->window = NULL;
1347 //create window were a child of the root now
1348 if( window_private->parent == (GdkWindowObject *)_gdk_parent_root) {
1349 DFBWindowDescription desc;
1350 DFBWindowOptions window_options = DWOP_NONE;
1351 desc.flags = DWDESC_CAPS;
1352 if( window_private->input_only ) {
1353 desc.caps = DWCAPS_INPUTONLY;
1355 desc.flags |= DWDESC_PIXELFORMAT;
1356 desc.pixelformat = ((GdkVisualDirectFB *) visual)->format;
1357 if (DFB_PIXELFORMAT_HAS_ALPHA (desc.pixelformat)) {
1358 desc.flags |= DWDESC_CAPS;
1359 desc.caps = DWCAPS_ALPHACHANNEL;
1362 if( window_private->window_type == GDK_WINDOW_CHILD )
1363 window_private->window_type = GDK_WINDOW_TOPLEVEL;
1364 desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
1365 DWDESC_POSX | DWDESC_POSY );
1368 desc.width = impl->drawable.width;
1369 desc.height = impl->drawable.height;
1370 if (!create_directfb_window (impl, &desc, window_options))
1373 _gdk_window_destroy (window, FALSE);
1376 /* we hold a reference count on ourselves */
1377 g_object_ref (window);
1378 impl->window->GetID (impl->window, &impl->dfb_id);
1379 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
1380 gdk_directfb_event_windows_add (window);
1382 DFBRectangle rect = { x, y, impl->drawable.width,
1383 impl->drawable.height};
1384 impl->window = NULL;
1385 parent_impl->drawable.surface->GetSubSurface (
1386 parent_impl->drawable.surface,
1388 &impl->drawable.surface);
1393 _gdk_windowing_window_clear_area (GdkWindow *window,
1399 GdkWindowObject *private;
1400 GdkDrawableImplDirectFB *impl;
1401 GdkPixmap *bg_pixmap;
1402 GdkWindowObject *relative_to;
1407 g_return_if_fail (GDK_IS_WINDOW (window));
1409 if (GDK_WINDOW_DESTROYED (window))
1412 private = GDK_WINDOW_OBJECT (window);
1414 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1417 Follow XClearArea definition for zero height width
1420 width = impl->width-x;
1422 height = impl->height-y;
1424 bg_pixmap = private->bg_pixmap;
1426 for (relative_to = private;
1427 relative_to && bg_pixmap == GDK_PARENT_RELATIVE_BG;
1428 relative_to = relative_to->parent)
1430 bg_pixmap = relative_to->bg_pixmap;
1431 dx += relative_to->x;
1432 dy += relative_to->y;
1435 if (bg_pixmap == GDK_NO_BG)
1438 if (bg_pixmap && bg_pixmap != GDK_PARENT_RELATIVE_BG)
1442 values.fill = GDK_TILED;
1443 values.tile = bg_pixmap;
1444 values.ts_x_origin = - dx;
1445 values.ts_y_origin = - dy;
1447 gc = gdk_gc_new_with_values (GDK_DRAWABLE (impl), &values,
1448 GDK_GC_FILL | GDK_GC_TILE |
1449 GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN);
1453 /* GDK_PARENT_RELATIVE_BG, but no pixmap,
1454 get the color from the parent window. */
1458 values.foreground = relative_to->bg_color;
1460 gc = gdk_gc_new_with_values (GDK_DRAWABLE (impl), &values,
1464 gdk_draw_rectangle (GDK_DRAWABLE (impl),
1465 gc, TRUE, x, y, width, height);
1468 g_object_unref (gc);
1472 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1479 GdkWindowObject *private;
1480 GdkWindowImplDirectFB *impl;
1482 g_return_if_fail (GDK_IS_WINDOW (window));
1484 private = GDK_WINDOW_OBJECT (window);
1485 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
1488 Follow XClearArea definition for zero height width
1491 width = impl->drawable.width-x;
1493 height = impl->drawable.height-y;
1498 rect.height = height;
1500 g_return_if_fail (GDK_IS_WINDOW (window));
1502 if (GDK_WINDOW_DESTROYED (window))
1505 _gdk_windowing_window_clear_area (window, x, y, width, height);
1507 gdk_window_invalidate_rect (window, &rect, TRUE);
1511 gdk_window_raise (GdkWindow *window)
1513 GdkWindowImplDirectFB *impl;
1515 g_return_if_fail (GDK_IS_WINDOW (window));
1517 if (GDK_WINDOW_DESTROYED (window))
1520 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1526 ret = impl->window->RaiseToTop (impl->window);
1528 DirectFBError ("gdkwindow-directfb.c: RaiseToTop", ret);
1530 gdk_directfb_window_raise (window);
1534 if (gdk_directfb_window_raise (window))
1535 gdk_window_invalidate_rect (window, NULL, TRUE);
1540 gdk_window_lower (GdkWindow *window)
1542 GdkWindowImplDirectFB *impl;
1544 g_return_if_fail (GDK_IS_WINDOW (window));
1546 if (GDK_WINDOW_DESTROYED (window))
1549 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1555 ret = impl->window->LowerToBottom (impl->window);
1557 DirectFBError ("gdkwindow-directfb.c: LowerToBottom", ret);
1559 gdk_directfb_window_lower (window);
1563 gdk_directfb_window_lower (window);
1564 gdk_window_invalidate_rect (window, NULL, TRUE);
1569 gdk_window_set_hints (GdkWindow *window,
1578 g_return_if_fail (GDK_IS_WINDOW (window));
1580 if (GDK_WINDOW_DESTROYED (window))
1587 gdk_window_set_geometry_hints (GdkWindow *window,
1588 GdkGeometry *geometry,
1589 GdkWindowHints geom_mask)
1591 g_return_if_fail (GDK_IS_WINDOW (window));
1593 if (GDK_WINDOW_DESTROYED (window))
1600 gdk_window_set_title (GdkWindow *window,
1603 g_return_if_fail (GDK_IS_WINDOW (window));
1605 if (GDK_WINDOW_DESTROYED (window))
1612 gdk_window_set_role (GdkWindow *window,
1615 g_return_if_fail (GDK_IS_WINDOW (window));
1617 if (GDK_WINDOW_DESTROYED (window))
1624 gdk_window_set_transient_for (GdkWindow *window,
1627 GdkWindowObject *private;
1628 GdkWindowObject *root;
1631 g_return_if_fail (GDK_IS_WINDOW (window));
1632 g_return_if_fail (GDK_IS_WINDOW (parent));
1634 private = GDK_WINDOW_OBJECT (window);
1635 root = GDK_WINDOW_OBJECT (_gdk_parent_root);
1637 g_return_if_fail (GDK_WINDOW (private->parent) == _gdk_parent_root);
1638 g_return_if_fail (GDK_WINDOW (GDK_WINDOW_OBJECT (parent)->parent) == _gdk_parent_root);
1640 root->children = g_list_remove (root->children, window);
1642 i = g_list_index (root->children, parent);
1644 root->children = g_list_prepend (root->children, window);
1646 root->children = g_list_insert (root->children, window, i);
1650 gdk_window_set_background (GdkWindow *window,
1651 const GdkColor *color)
1653 GdkWindowObject *private;
1655 g_return_if_fail (GDK_IS_WINDOW (window));
1657 g_return_if_fail (color != NULL);
1659 private = GDK_WINDOW_OBJECT (window);
1660 private->bg_color = *color;
1662 if (private->bg_pixmap &&
1663 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1664 private->bg_pixmap != GDK_NO_BG)
1665 g_object_unref (private->bg_pixmap);
1667 private->bg_pixmap = NULL;
1671 gdk_window_set_back_pixmap (GdkWindow *window,
1673 gint parent_relative)
1675 GdkWindowObject *private;
1676 GdkPixmap *old_pixmap;
1678 g_return_if_fail (GDK_IS_WINDOW (window));
1679 g_return_if_fail (pixmap == NULL || !parent_relative);
1681 private = GDK_WINDOW_OBJECT (window);
1682 old_pixmap = private->bg_pixmap;
1684 if (private->bg_pixmap &&
1685 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1686 private->bg_pixmap != GDK_NO_BG)
1688 g_object_unref (private->bg_pixmap);
1691 if (parent_relative)
1693 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1697 if (pixmap && pixmap != GDK_NO_BG && pixmap != GDK_PARENT_RELATIVE_BG)
1698 g_object_ref (pixmap);
1700 private->bg_pixmap = pixmap;
1705 gdk_window_set_cursor (GdkWindow *window,
1708 GdkWindowImplDirectFB *impl;
1709 GdkCursor *old_cursor;
1711 g_return_if_fail (GDK_IS_WINDOW (window));
1713 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1714 old_cursor = impl->cursor;
1716 impl->cursor = (cursor ?
1717 gdk_cursor_ref (cursor) : gdk_cursor_new (GDK_LEFT_PTR));
1719 if (gdk_window_at_pointer (NULL, NULL) == window)
1721 /* This is a bit evil but we want to keep all cursor changes in
1722 one place, so let gdk_directfb_window_send_crossing_events
1723 do the work for us. */
1725 gdk_directfb_window_send_crossing_events (window, window,
1726 GDK_CROSSING_NORMAL);
1728 else if (impl->window)
1730 GdkCursorDirectFB *dfb_cursor = (GdkCursorDirectFB *) impl->cursor;
1732 /* this branch takes care of setting the cursor for unmapped windows */
1734 impl->window->SetCursorShape (impl->window,
1736 dfb_cursor->hot_x, dfb_cursor->hot_y);
1740 gdk_cursor_unref (old_cursor);
1744 gdk_window_get_geometry (GdkWindow *window,
1751 GdkWindowObject *private;
1752 GdkDrawableImplDirectFB *impl;
1754 g_return_if_fail (GDK_IS_WINDOW (window));
1756 private = GDK_WINDOW_OBJECT (window);
1757 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1759 if (!GDK_WINDOW_DESTROYED (window))
1768 *width = impl->width;
1771 *height = impl->height;
1774 *depth = DFB_BITS_PER_PIXEL(impl->format);
1779 _gdk_directfb_calc_abs (GdkWindow *window)
1781 GdkWindowObject *private;
1782 GdkDrawableImplDirectFB *impl;
1785 g_return_if_fail (GDK_IS_WINDOW (window));
1787 private = GDK_WINDOW_OBJECT (window);
1788 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
1790 impl->abs_x = private->x;
1791 impl->abs_y = private->y;
1793 if (private->parent)
1795 GdkDrawableImplDirectFB *parent_impl =
1796 GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (private->parent)->impl);
1798 impl->abs_x += parent_impl->abs_x;
1799 impl->abs_y += parent_impl->abs_y;
1802 for (list = private->children; list; list = list->next)
1804 _gdk_directfb_calc_abs (list->data);
1809 gdk_window_get_origin (GdkWindow *window,
1813 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
1815 if (!GDK_WINDOW_DESTROYED (window))
1817 GdkDrawableImplDirectFB *impl;
1819 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1833 gdk_window_get_deskrelative_origin (GdkWindow *window,
1837 return gdk_window_get_origin (window, x, y);
1841 gdk_window_get_root_origin (GdkWindow *window,
1845 GdkWindowObject *rover;
1847 g_return_if_fail (GDK_IS_WINDOW (window));
1849 rover = (GdkWindowObject*) window;
1855 if (GDK_WINDOW_DESTROYED (window))
1858 while (rover->parent && ((GdkWindowObject*) rover->parent)->parent)
1859 rover = (GdkWindowObject *) rover->parent;
1860 if (rover->destroyed)
1870 _gdk_windowing_window_get_pointer (GdkDisplay *display,
1874 GdkModifierType *mask)
1876 GdkWindow *retval = NULL;
1877 gint rx, ry, wx, wy;
1878 GdkDrawableImplDirectFB *impl;
1880 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1883 window = _gdk_parent_root;
1885 gdk_directfb_mouse_get_info (&rx, &ry, mask);
1889 retval = gdk_directfb_child_at (_gdk_parent_root, &wx, &wy);
1891 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
1894 *x = rx - impl->abs_x;
1896 *y = ry - impl->abs_y;
1902 _gdk_windowing_window_at_pointer (GdkDisplay *display,
1909 if (!win_x || !win_y)
1910 gdk_directfb_mouse_get_info (&wx, &wy, NULL);
1918 retval = gdk_directfb_child_at (_gdk_parent_root, &wx, &wy);
1930 _gdk_windowing_get_pointer (GdkDisplay *display,
1934 GdkModifierType *mask)
1938 *screen = gdk_display_get_default_screen (display);
1940 _gdk_windowing_window_get_pointer (display,
1941 _gdk_windowing_window_at_pointer(display,NULL,NULL),x,y,mask);
1946 gdk_window_get_events (GdkWindow *window)
1948 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
1950 if (GDK_WINDOW_DESTROYED (window))
1953 return GDK_WINDOW_OBJECT (window)->event_mask;
1957 gdk_window_set_events (GdkWindow *window,
1958 GdkEventMask event_mask)
1960 g_return_if_fail (GDK_IS_WINDOW (window));
1962 if (event_mask & GDK_BUTTON_MOTION_MASK)
1963 event_mask |= (GDK_BUTTON1_MOTION_MASK |
1964 GDK_BUTTON2_MOTION_MASK |
1965 GDK_BUTTON3_MOTION_MASK);
1967 GDK_WINDOW_OBJECT (window)->event_mask = event_mask;
1971 gdk_window_shape_combine_mask (GdkWindow *window,
1979 gdk_window_input_shape_combine_mask (GdkWindow *window,
1987 gdk_window_shape_combine_region (GdkWindow *window,
1988 GdkRegion *shape_region,
1995 gdk_window_input_shape_combine_region (GdkWindow *window,
1996 GdkRegion *shape_region,
2003 gdk_window_set_override_redirect (GdkWindow *window,
2004 gboolean override_redirect)
2006 g_return_if_fail (GDK_IS_WINDOW (window));
2008 if (GDK_WINDOW_DESTROYED (window))
2015 gdk_window_set_icon_list (GdkWindow *window,
2018 g_return_if_fail (GDK_IS_WINDOW (window));
2020 if (GDK_WINDOW_DESTROYED (window))
2027 gdk_window_set_icon (GdkWindow *window,
2028 GdkWindow *icon_window,
2032 g_return_if_fail (GDK_IS_WINDOW (window));
2034 if (GDK_WINDOW_DESTROYED (window))
2041 gdk_window_set_icon_name (GdkWindow *window,
2044 g_return_if_fail (GDK_IS_WINDOW (window));
2046 if (GDK_WINDOW_DESTROYED (window))
2053 gdk_window_iconify (GdkWindow *window)
2055 g_return_if_fail (GDK_IS_WINDOW (window));
2057 if (GDK_WINDOW_DESTROYED (window))
2060 gdk_window_hide (window);
2064 gdk_window_deiconify (GdkWindow *window)
2066 g_return_if_fail (GDK_IS_WINDOW (window));
2068 if (GDK_WINDOW_DESTROYED (window))
2071 gdk_window_show (window);
2075 gdk_window_stick (GdkWindow *window)
2077 g_return_if_fail (GDK_IS_WINDOW (window));
2079 if (GDK_WINDOW_DESTROYED (window))
2086 gdk_window_unstick (GdkWindow *window)
2088 g_return_if_fail (GDK_IS_WINDOW (window));
2090 if (GDK_WINDOW_DESTROYED (window))
2097 gdk_directfb_window_set_opacity (GdkWindow *window,
2100 GdkWindowImplDirectFB *impl;
2102 g_return_if_fail (GDK_IS_WINDOW (window));
2104 if (GDK_WINDOW_DESTROYED (window))
2107 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2109 impl->opacity = opacity;
2111 if (impl->window && GDK_WINDOW_IS_MAPPED (window))
2113 if (gdk_directfb_apply_focus_opacity &&
2114 window == gdk_directfb_focused_window)
2115 impl->window->SetOpacity (impl->window,
2116 (impl->opacity >> 1) + (impl->opacity >> 2));
2118 impl->window->SetOpacity (impl->window, impl->opacity);
2123 gdk_window_focus (GdkWindow *window,
2126 GdkWindow *toplevel;
2128 g_return_if_fail (GDK_IS_WINDOW (window));
2130 if (GDK_WINDOW_DESTROYED (window))
2133 toplevel = gdk_directfb_window_find_toplevel (window);
2134 if (toplevel != _gdk_parent_root)
2136 GdkWindowImplDirectFB *impl;
2138 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (toplevel)->impl);
2140 impl->window->RequestFocus (impl->window);
2145 gdk_window_maximize (GdkWindow *window)
2147 g_return_if_fail (GDK_IS_WINDOW (window));
2149 if (GDK_WINDOW_DESTROYED (window))
2156 gdk_window_unmaximize (GdkWindow *window)
2158 g_return_if_fail (GDK_IS_WINDOW (window));
2160 if (GDK_WINDOW_DESTROYED (window))
2167 gdk_window_set_type_hint (GdkWindow *window,
2168 GdkWindowTypeHint hint)
2170 g_return_if_fail (GDK_IS_WINDOW (window));
2172 if (GDK_WINDOW_DESTROYED (window))
2175 GDK_NOTE (MISC, g_print ("gdk_window_set_type_hint: 0x%x: %d\n",
2176 GDK_WINDOW_DFB_ID (window), hint));
2178 ((GdkWindowImplDirectFB *)((GdkWindowObject *)window)->impl)->type_hint = hint;
2185 gdk_window_get_type_hint (GdkWindow *window)
2187 g_return_val_if_fail (GDK_IS_WINDOW (window), GDK_WINDOW_TYPE_HINT_NORMAL);
2189 if (GDK_WINDOW_DESTROYED (window))
2190 return GDK_WINDOW_TYPE_HINT_NORMAL;
2192 return GDK_WINDOW_IMPL_DIRECTFB (((GdkWindowObject *) window)->impl)->type_hint;
2196 gdk_window_set_modal_hint (GdkWindow *window,
2199 GdkWindowImplDirectFB *impl;
2201 g_return_if_fail (GDK_IS_WINDOW (window));
2203 if (GDK_WINDOW_DESTROYED (window))
2206 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2210 impl->window->SetStackingClass (impl->window,
2211 modal ? DWSC_UPPER : DWSC_MIDDLE);
2216 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
2217 gboolean skips_taskbar)
2219 g_return_if_fail (GDK_IS_WINDOW (window));
2223 gdk_window_set_skip_pager_hint (GdkWindow *window,
2224 gboolean skips_pager)
2226 g_return_if_fail (GDK_IS_WINDOW (window));
2231 gdk_window_set_group (GdkWindow *window,
2234 g_return_if_fail (GDK_IS_WINDOW (window));
2235 g_return_if_fail (GDK_IS_WINDOW (leader));
2236 g_warning(" DirectFb set_group groups not supported \n");
2238 if (GDK_WINDOW_DESTROYED (window))
2244 GdkWindow * gdk_window_get_group (GdkWindow *window)
2246 g_warning(" DirectFb get_group groups not supported \n");
2251 gdk_fb_window_set_child_handler (GdkWindow *window,
2252 GdkWindowChildChanged changed,
2253 GdkWindowChildGetPos get_pos,
2256 GdkWindowChildHandlerData *data;
2258 g_return_if_fail (GDK_IS_WINDOW (window));
2260 data = g_new (GdkWindowChildHandlerData, 1);
2261 data->changed = changed;
2262 data->get_pos = get_pos;
2263 data->user_data = user_data;
2265 g_object_set_data_full (G_OBJECT (window), "gdk-window-child-handler",
2266 data, (GDestroyNotify) g_free);
2270 gdk_window_set_decorations (GdkWindow *window,
2271 GdkWMDecoration decorations)
2273 GdkWMDecoration *dec;
2275 g_return_if_fail (GDK_IS_WINDOW (window));
2277 dec = g_new (GdkWMDecoration, 1);
2280 g_object_set_data_full (G_OBJECT (window), "gdk-window-decorations",
2281 dec, (GDestroyNotify) g_free);
2285 gdk_window_get_decorations (GdkWindow *window,
2286 GdkWMDecoration *decorations)
2288 GdkWMDecoration *dec;
2290 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2292 dec = g_object_get_data (G_OBJECT (window), "gdk-window-decorations");
2295 *decorations = *dec;
2302 gdk_window_set_functions (GdkWindow *window,
2303 GdkWMFunction functions)
2305 g_return_if_fail (GDK_IS_WINDOW (window));
2307 if (GDK_WINDOW_DESTROYED (window))
2311 g_message("unimplemented %s", G_GNUC_FUNCTION);
2315 gdk_window_set_child_shapes (GdkWindow *window)
2320 gdk_window_merge_child_shapes (GdkWindow *window)
2325 gdk_window_set_child_input_shapes (GdkWindow *window)
2330 gdk_window_merge_child_input_shapes (GdkWindow *window)
2335 gdk_window_set_static_gravities (GdkWindow *window,
2336 gboolean use_static)
2338 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2340 if (GDK_WINDOW_DESTROYED (window))
2344 g_message("unimplemented %s", G_GNUC_FUNCTION);
2350 gdk_window_begin_paint_region (GdkWindow *window,
2353 GdkDrawableImplDirectFB *impl;
2356 g_return_if_fail (GDK_IS_WINDOW (window));
2358 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2360 impl->buffered = TRUE;
2361 impl->paint_depth++;
2366 if (impl->paint_region)
2367 gdk_region_union (impl->paint_region, region);
2369 impl->paint_region = gdk_region_copy (region);
2371 for (i = 0; i < region->numRects; i++)
2373 GdkRegionBox *box = ®ion->rects[i];
2375 _gdk_windowing_window_clear_area (window,
2384 gdk_window_end_paint (GdkWindow *window)
2386 GdkDrawableImplDirectFB *impl;
2388 g_return_if_fail (GDK_IS_WINDOW (window));
2390 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
2392 g_return_if_fail (impl->paint_depth > 0);
2394 impl->paint_depth--;
2396 if (impl->paint_depth == 0)
2398 impl->buffered = FALSE;
2400 if (impl->paint_region)
2402 DFBRegion reg = { impl->paint_region->extents.x1,
2403 impl->paint_region->extents.y1,
2404 impl->paint_region->extents.x2 - 1,
2405 impl->paint_region->extents.y2 - 1 };
2407 _gdk_directfb_update (impl, ®);
2409 gdk_region_destroy (impl->paint_region);
2410 impl->paint_region = NULL;
2417 gdk_window_begin_resize_drag (GdkWindow *window,
2424 g_return_if_fail (GDK_IS_WINDOW (window));
2426 if (GDK_WINDOW_DESTROYED (window))
2429 g_message("unimplemented %s", G_GNUC_FUNCTION);
2433 gdk_window_begin_move_drag (GdkWindow *window,
2439 g_return_if_fail (GDK_IS_WINDOW (window));
2441 if (GDK_WINDOW_DESTROYED (window))
2444 g_message("unimplemented %s", G_GNUC_FUNCTION);
2448 * gdk_window_get_frame_extents:
2449 * @window: a #GdkWindow
2450 * @rect: rectangle to fill with bounding box of the window frame
2452 * Obtains the bounding box of the window, including window manager
2453 * titlebar/borders if any. The frame position is given in root window
2454 * coordinates. To get the position of the window itself (rather than
2455 * the frame) in root window coordinates, use gdk_window_get_origin().
2459 gdk_window_get_frame_extents (GdkWindow *window,
2462 GdkWindowObject *private;
2463 GdkDrawableImplDirectFB *impl;
2465 g_return_if_fail (GDK_IS_WINDOW (window));
2466 g_return_if_fail (rect != NULL);
2468 if (GDK_WINDOW_DESTROYED (window))
2471 private = GDK_WINDOW_OBJECT (window);
2473 while (private->parent && ((GdkWindowObject*) private->parent)->parent)
2474 private = (GdkWindowObject*) private->parent;
2475 if (GDK_WINDOW_DESTROYED (window))
2478 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
2480 rect->x = impl->abs_x;
2481 rect->y = impl->abs_x;
2482 rect->width = impl->width;
2483 rect->height = impl->height;
2487 * Given a directfb window and a subsurface of that window
2488 * create a gdkwindow child wrapper
2490 #if (DIRECTFB_MICRO_VERSION > 25)
2491 GdkWindow *gdk_directfb_create_child_window(GdkWindow *parent,
2492 IDirectFBSurface *subsurface)
2495 GdkWindowObject *private;
2496 GdkWindowObject *parent_private;
2497 GdkWindowImplDirectFB *impl;
2498 GdkWindowImplDirectFB *parent_impl;
2501 g_return_val_if_fail (parent != NULL, NULL);
2503 window = g_object_new (GDK_TYPE_WINDOW, NULL);
2504 private = GDK_WINDOW_OBJECT (window);
2505 parent_private = GDK_WINDOW_OBJECT (parent);
2506 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
2507 private->parent = parent_private;
2509 subsurface->GetPosition(subsurface,&x,&y);
2510 subsurface->GetSize(subsurface,&w,&h);
2512 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2513 impl->drawable.wrapper = GDK_DRAWABLE (window);
2518 _gdk_directfb_calc_abs (window);
2520 impl->drawable.width = w;
2521 impl->drawable.height = h;
2522 private->window_type = GDK_WINDOW_CHILD;
2523 impl->drawable.surface = subsurface;
2524 impl->drawable.format = parent_impl->drawable.format;
2525 private->depth = parent_private->depth;
2526 gdk_drawable_set_colormap (GDK_DRAWABLE (window),
2527 gdk_drawable_get_colormap (parent));
2528 gdk_window_set_cursor (window, NULL);
2529 parent_private->children = g_list_prepend (parent_private->children,window);
2530 /*we hold a reference count on ourselves */
2531 g_object_ref (window);
2539 * The wrapping is not perfect since directfb does not give full access
2540 * to the current state of a window event mask etc need to fix dfb
2543 gdk_window_foreign_new_for_display (GdkDisplay* display,GdkNativeWindow anid)
2545 GdkWindow *window = NULL;
2546 GdkWindow *parent =NULL;
2547 GdkWindowObject *private =NULL;
2548 GdkWindowObject *parent_private =NULL;
2549 GdkWindowImplDirectFB *parent_impl =NULL;
2550 GdkWindowImplDirectFB *impl =NULL;
2551 DFBWindowOptions options;
2553 GdkDisplayDFB * gdkdisplay = _gdk_display;
2554 IDirectFBWindow *dfbwindow;
2556 window = gdk_window_lookup (anid);
2559 g_object_ref (window);
2562 if( display != NULL )
2563 gdkdisplay = GDK_DISPLAY_DFB(display);
2565 ret = gdkdisplay->layer->GetWindow (gdkdisplay->layer,
2566 (DFBWindowID)anid,&dfbwindow);
2568 if (ret != DFB_OK) {
2569 DirectFBError ("gdk_window_new: Layer->GetWindow failed", ret);
2573 parent = _gdk_parent_root;
2576 parent_private = GDK_WINDOW_OBJECT (parent);
2577 parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
2580 window = g_object_new (GDK_TYPE_WINDOW, NULL);
2581 /* we hold a reference count on ourselves */
2582 g_object_ref (window);
2583 private = GDK_WINDOW_OBJECT (window);
2584 private->parent = parent_private;
2585 private->window_type = GDK_WINDOW_TOPLEVEL;
2586 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2588 impl->drawable.wrapper = GDK_DRAWABLE (window);
2589 impl->window = dfbwindow;
2590 dfbwindow->GetOptions(dfbwindow,&options);
2591 dfbwindow->GetPosition(dfbwindow,&private->x,&private->y);
2592 dfbwindow->GetSize(dfbwindow,&impl->drawable.width,&impl->drawable.height);
2595 private->input_only = FALSE;
2597 if( dfbwindow->GetSurface (dfbwindow, &impl->drawable.surface) == DFB_UNSUPPORTED ){
2598 private->input_only = TRUE;
2599 impl->drawable.surface = NULL;
2602 * Position ourselevs
2604 _gdk_directfb_calc_abs (window);
2606 /* We default to all events least surprise to the user
2607 * minus the poll for motion events
2609 gdk_window_set_events (window, (GDK_ALL_EVENTS_MASK ^ GDK_POINTER_MOTION_HINT_MASK));
2611 if (impl->drawable.surface)
2613 impl->drawable.surface->GetPixelFormat (impl->drawable.surface,
2614 &impl->drawable.format);
2616 private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
2618 gdk_drawable_set_colormap (GDK_DRAWABLE (window), gdk_drawable_get_colormap (parent));
2620 gdk_drawable_set_colormap (GDK_DRAWABLE (window), gdk_colormap_get_system());
2623 //can be null for the soft cursor window itself when
2624 //running a gtk directfb wm
2625 if( gdk_display_get_default() != NULL ) {
2626 gdk_window_set_cursor (window,NULL);
2630 parent_private->children = g_list_prepend (parent_private->children,
2632 impl->dfb_id = (DFBWindowID)anid;
2633 gdk_directfb_window_id_table_insert (impl->dfb_id, window);
2634 gdk_directfb_event_windows_add (window);
2640 gdk_window_lookup_for_display (GdkDisplay *display,GdkNativeWindow anid)
2642 return gdk_directfb_window_id_table_lookup ((DFBWindowID) anid);
2646 gdk_window_lookup (GdkNativeWindow anid)
2648 return gdk_directfb_window_id_table_lookup ((DFBWindowID) anid);
2651 IDirectFBWindow *gdk_directfb_window_lookup(GdkWindow *window )
2653 GdkWindowObject *private;
2654 GdkWindowImplDirectFB *impl;
2655 g_return_val_if_fail (GDK_IS_WINDOW (window),NULL);
2656 private = GDK_WINDOW_OBJECT (window);
2657 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2658 return impl->window;
2661 IDirectFBSurface *gdk_directfb_surface_lookup(GdkWindow *window)
2663 GdkWindowObject *private;
2664 GdkWindowImplDirectFB *impl;
2665 g_return_val_if_fail (GDK_IS_WINDOW (window),NULL);
2666 private = GDK_WINDOW_OBJECT (window);
2667 impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
2668 return impl->drawable.surface;
2672 gdk_window_fullscreen (GdkWindow *window)
2674 g_return_if_fail (GDK_IS_WINDOW (window));
2675 g_warning ("gdk_window_fullscreen() not implemented.\n");
2679 gdk_window_unfullscreen (GdkWindow *window)
2681 g_return_if_fail (GDK_IS_WINDOW (window));
2682 /* g_warning ("gdk_window_unfullscreen() not implemented.\n");*/
2686 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
2688 g_return_if_fail (GDK_IS_WINDOW (window));
2689 static gboolean first_call = TRUE;
2691 g_warning ("gdk_window_set_keep_above() not implemented.\n");
2698 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
2700 g_return_if_fail (GDK_IS_WINDOW (window));
2701 static gboolean first_call = TRUE;
2703 g_warning ("gdk_window_set_keep_below() not implemented.\n");
2710 gdk_window_enable_synchronized_configure (GdkWindow *window)
2715 gdk_window_configure_finished (GdkWindow *window)
2720 gdk_display_warp_pointer (GdkDisplay *display,
2725 g_warning ("gdk_display_warp_pointer() not implemented.\n");
2729 gdk_window_set_urgency_hint (GdkWindow *window,
2732 g_return_if_fail (GDK_IS_WINDOW (window));
2733 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD);
2735 if (GDK_WINDOW_DESTROYED (window))
2738 g_warning ("gdk_window_set_urgency_hint() not implemented.\n");
2743 #define __GDK_WINDOW_X11_C__
2744 #include "gdkaliasdef.c"