summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorMichael Emmel <mike.emmel@gmail.com>2006-06-14 21:54:25 +0000
committerMichael David Emmel <memmel@src.gnome.org>2006-06-14 21:54:25 +0000
commit0799004f58324d67b637e85c98c50f97624e98cd (patch)
tree2db8445d5e2359c8175f15c54c5516fcc9f3f618 /gdk
parent67b0b6465335de810f184bde31b35854ad9f22d5 (diff)
downloadgtk+-0799004f58324d67b637e85c98c50f97624e98cd.tar.gz
updated mininum dfb to 0.9.24 added more directfb wrapper functions
2006-06-14 Michael Emmel <mike.emmel@gmail.com> * configure.in: updated mininum dfb to 0.9.24 * gdk/directfb/gdkdirectfb.h: added more directfb wrapper functions * gdk/directfb/gdkdrawable-directfb.c: wrapper functions and patch from Claudio Ciccani <klan@users.sf.net> to use a subsurface for cairo * gdk/directfb/gdkvisual-directfb.c: changed initalization sequence * gdk/directfb/gdkwindow-directfb.c: corrected reparent for toplevels * gdk/directfb/gdkdisplay-directfb.c: changed initilization sequence to a more rational order
Diffstat (limited to 'gdk')
-rw-r--r--gdk/directfb/gdkdirectfb.h7
-rw-r--r--gdk/directfb/gdkdisplay-directfb.c9
-rw-r--r--gdk/directfb/gdkdrawable-directfb.c16
-rw-r--r--gdk/directfb/gdkvisual-directfb.c33
-rw-r--r--gdk/directfb/gdkwindow-directfb.c254
5 files changed, 274 insertions, 45 deletions
diff --git a/gdk/directfb/gdkdirectfb.h b/gdk/directfb/gdkdirectfb.h
index 091e9ff0fb..0db9ec9173 100644
--- a/gdk/directfb/gdkdirectfb.h
+++ b/gdk/directfb/gdkdirectfb.h
@@ -36,8 +36,6 @@
#include <cairo.h>
#include <directfb.h>
#include "gdk/gdkprivate.h"
-//#include "gdk/gdkwindow.h"
-#include "gdkdisplay-directfb.h"
/* macro for a safe call to DirectFB functions */
#define DFBCHECK(x...) \
@@ -85,6 +83,11 @@ GdkWindow * gdk_directfb_window_new (GdkWindow *parent,
GdkVisual * gdk_directfb_visual_by_format (DFBSurfacePixelFormat pixel_format);
+IDirectFBWindow *gdk_directfb_window_lookup(GdkWindow *window);
+IDirectFBSurface *gdk_directfb_surface_lookup(GdkWindow *window);
+GdkWindow *gdk_directfb_create_child_window(GdkWindow *parent,
+ IDirectFBSurface *subsurface);
+
G_END_DECLS
#endif /* __GDK_DIRECTFB_H__ */
diff --git a/gdk/directfb/gdkdisplay-directfb.c b/gdk/directfb/gdkdisplay-directfb.c
index 209bf1dc2e..770cf515c1 100644
--- a/gdk/directfb/gdkdisplay-directfb.c
+++ b/gdk/directfb/gdkdisplay-directfb.c
@@ -104,7 +104,6 @@ GdkDisplay * gdk_display_open (const gchar *display_name)
}
_gdk_display = g_object_new(GDK_TYPE_DISPLAY_DFB,NULL);
_gdk_display->directfb=directfb;
- _gdk_events_init ();
ret = directfb->GetDisplayLayer (directfb, DLID_PRIMARY, &layer);
if (ret != DFB_OK)
@@ -115,7 +114,6 @@ GdkDisplay * gdk_display_open (const gchar *display_name)
return NULL;
}
- layer->EnableCursor (layer, 1);
ret=directfb->GetInputDevice (directfb, DIDID_KEYBOARD, &keyboard);
@@ -131,16 +129,19 @@ GdkDisplay * gdk_display_open (const gchar *display_name)
_gdk_screen = g_object_new (GDK_TYPE_SCREEN, NULL);
- _gdk_windowing_window_init ();
-
_gdk_visual_init ();
+
gdk_screen_set_default_colormap (_gdk_screen,
gdk_screen_get_system_colormap (_gdk_screen));
+ _gdk_windowing_window_init ();
_gdk_windowing_image_init ();
_gdk_input_init ();
_gdk_dnd_init ();
+ _gdk_events_init ();
+ layer->EnableCursor (layer, 1);
+
g_signal_emit_by_name (gdk_display_manager_get (),
"display_opened", _gdk_display);
diff --git a/gdk/directfb/gdkdrawable-directfb.c b/gdk/directfb/gdkdrawable-directfb.c
index 9a8f7097ee..0f476e6b0d 100644
--- a/gdk/directfb/gdkdrawable-directfb.c
+++ b/gdk/directfb/gdkdrawable-directfb.c
@@ -1076,14 +1076,16 @@ gdk_directfb_ref_cairo_surface (GdkDrawable *drawable)
g_return_val_if_fail (GDK_IS_DRAWABLE_IMPL_DIRECTFB (drawable), NULL);
GdkDrawableImplDirectFB *impl = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
- IDirectFB *dfb = GDK_DISPLAY_DFB(gdk_drawable_get_display(drawable))->directfb;
+ IDirectFB *dfb = GDK_DISPLAY_DFB(gdk_drawable_get_display(drawable))->directfb;
if (!impl->cairo_surface) {
- impl->cairo_surface = cairo_directfb_surface_create(dfb ,impl->surface);
- cairo_surface_set_user_data (impl->cairo_surface,
- &gdk_directfb_cairo_key,drawable,
- gdk_directfb_cairo_surface_destroy);
- //XXX!!! MAJOR HACK so cairo coexists with direct drawing
- //impl->surface->Unlock( impl->surface );
+ IDirectFBSurface *surface;
+ if (impl->surface->GetSubSurface (impl->surface, NULL, &surface) == DFB_OK) {
+ impl->cairo_surface = cairo_directfb_surface_create (dfb, surface);
+ cairo_surface_set_user_data (impl->cairo_surface,
+ &gdk_directfb_cairo_key, drawable,
+ gdk_directfb_cairo_surface_destroy);
+ surface->Release (surface);
+ }
} else {
cairo_surface_reference (impl->cairo_surface);
}
diff --git a/gdk/directfb/gdkvisual-directfb.c b/gdk/directfb/gdkvisual-directfb.c
index e8618dc77b..e9830fe786 100644
--- a/gdk/directfb/gdkvisual-directfb.c
+++ b/gdk/directfb/gdkvisual-directfb.c
@@ -63,7 +63,7 @@ static DFBSurfacePixelFormat formats[] =
DSPF_RGB332
};
-static GdkVisual * system_visual = NULL;
+GdkVisual * system_visual = NULL;
static GdkVisualDirectFB * visuals[G_N_ELEMENTS (formats) + 1] = { NULL };
static gint available_depths[G_N_ELEMENTS (formats) + 1] = {0};
static GdkVisualType available_types[G_N_ELEMENTS (formats) + 1] = {0};
@@ -110,7 +110,7 @@ gdk_visual_get_type (void)
}
void
-_gdk_visual_init (void)
+_gdk_visual_init ()
{
DFBResult ret;
DFBDisplayLayerConfig dlc;
@@ -118,11 +118,10 @@ _gdk_visual_init (void)
IDirectFBSurface *dest;
gint i, c;
- GdkWindowImplDirectFB *root_impl = GDK_WINDOW_IMPL_DIRECTFB (
- GDK_WINDOW_OBJECT(_gdk_parent_root)->impl);
_gdk_display->layer->GetConfiguration (_gdk_display->layer, &dlc);
-
+ g_assert( dlc.pixelformat != DSPF_UNKNOWN);
+
dest = gdk_display_dfb_create_surface(_gdk_display,dlc.pixelformat,8,8);
g_assert (dest != NULL);
@@ -152,13 +151,9 @@ _gdk_visual_init (void)
dest->GetAccelerationMask (dest, src, &acc);
- if (acc & DFXL_BLIT)
+ if (acc & DFXL_BLIT || formats[i] == dlc.pixelformat)
{
- visuals[c] = gdk_directfb_visual_create (formats[i]);
-
- if (formats[i] == root_impl->drawable.format)
system_visual = GDK_VISUAL (visuals[c]);
-
c++;
}
@@ -167,17 +162,20 @@ _gdk_visual_init (void)
dest->Release (dest);
+ //fallback to ARGB
if (!system_visual)
{
- visuals[c] = gdk_directfb_visual_create (root_impl->drawable.format);
- system_visual = GDK_VISUAL (visuals[c]);
+ for (i = 0; i < G_N_ELEMENTS (formats); i++) {
+ if (formats[i] == DSPF_ARGB ) {
+ if( visuals[i] == NULL )
+ visuals[i] = gdk_directfb_visual_create (formats[i]);
+ system_visual = visuals[i];
+ break;
+ }
+ }
}
- g_assert (system_visual);
- /*
- Now we can set up the system colormap
- */
- gdk_drawable_set_colormap (GDK_DRAWABLE (_gdk_parent_root),gdk_colormap_get_system());
+ g_assert (system_visual != NULL);
}
gint
@@ -195,6 +193,7 @@ gdk_visual_get_best_type (void)
GdkVisual*
gdk_screen_get_system_visual (GdkScreen *screen)
{
+ g_assert( system_visual);
return system_visual;
}
diff --git a/gdk/directfb/gdkwindow-directfb.c b/gdk/directfb/gdkwindow-directfb.c
index 0394934075..e4d802eafa 100644
--- a/gdk/directfb/gdkwindow-directfb.c
+++ b/gdk/directfb/gdkwindow-directfb.c
@@ -37,6 +37,7 @@
#include "gdkdirectfb.h"
#include "gdkprivate-directfb.h"
+#include "gdkdisplay-directfb.h"
#include "gdkregion-generic.h"
@@ -160,7 +161,6 @@ gdk_window_impl_directfb_finalize (GObject *object)
{
gdk_directfb_window_id_table_remove (impl->dfb_id);
/* native window resource must be release before we can finalize !*/
- /*impl->window->Release (impl->window);*/
impl->window = NULL;
}
@@ -218,6 +218,7 @@ create_directfb_window (GdkWindowImplDirectFB *impl,
if (ret != DFB_OK)
{
DirectFBError ("gdk_window_new: Layer->CreateWindow failed", ret);
+ g_assert (0);
return FALSE;
}
@@ -269,10 +270,11 @@ _gdk_windowing_window_init (void)
DFBWindowDescription desc;
desc.flags = 0;
/*XXX I must do this now its a bug ALPHA ROOT*/
-#if 1
- desc.flags |= DWDESC_CAPS;
- desc.caps = DWCAPS_ALPHACHANNEL;
-#endif
+
+ desc.flags = DWDESC_CAPS;
+ desc.caps = 0;
+ desc.caps |= DWCAPS_NODECORATION;
+ desc.caps |= DWCAPS_ALPHACHANNEL;
desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
DWDESC_POSX | DWDESC_POSY );
desc.posx = 0;
@@ -285,6 +287,10 @@ _gdk_windowing_window_init (void)
}
impl->drawable.surface->GetPixelFormat(impl->drawable.surface,&impl->drawable.format);
private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
+ /*
+ Now we can set up the system colormap
+ */
+ gdk_drawable_set_colormap (GDK_DRAWABLE (_gdk_parent_root),gdk_colormap_get_system());
}
@@ -1281,7 +1287,7 @@ gdk_window_move_resize (GdkWindow *window,
}
}
}
-
+//XXX BROKE if top LEVEL WINDOW ~~~
void
gdk_window_reparent (GdkWindow *window,
GdkWindow *new_parent,
@@ -1291,6 +1297,9 @@ gdk_window_reparent (GdkWindow *window,
GdkWindowObject *window_private;
GdkWindowObject *parent_private;
GdkWindowObject *old_parent_private;
+ GdkWindowImplDirectFB *impl;
+ GdkWindowImplDirectFB *parent_impl;
+ GdkVisual *visual;
g_return_if_fail (GDK_IS_WINDOW (window));
@@ -1303,6 +1312,12 @@ gdk_window_reparent (GdkWindow *window,
window_private = (GdkWindowObject *) window;
old_parent_private = (GdkWindowObject *) window_private->parent;
parent_private = (GdkWindowObject *) new_parent;
+ parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
+ visual = gdk_drawable_get_visual (window);
+
+ /* already parented */
+ if( window_private->parent == (GdkWindowObject *)new_parent )
+ return;
window_private->parent = (GdkWindowObject *) new_parent;
@@ -1312,9 +1327,66 @@ gdk_window_reparent (GdkWindow *window,
g_list_remove (old_parent_private->children, window);
}
- parent_private->children = g_list_prepend (parent_private->children, window);
+ parent_private->children = g_list_prepend (parent_private->children, window);
+
+ impl = GDK_WINDOW_IMPL_DIRECTFB (window_private->impl);
+
+ if( impl->drawable.surface ) {
+ impl->drawable.surface->Release (impl->drawable.surface);
+ impl->drawable.surface = NULL;
+ }
+
+ if( impl->window != NULL ) {
+ gdk_directfb_window_id_table_remove (impl->dfb_id);
+ impl->window->SetOpacity (impl->window,0);
+ impl->window->Close(impl->window);
+ impl->window->Release(impl->window);
+ impl->window = NULL;
+ }
- gdk_window_move_resize (window, x, y, -1, -1);
+ //create window were a child of the root now
+ if( window_private->parent == (GdkWindowObject *)_gdk_parent_root) {
+ DFBWindowDescription desc;
+ DFBWindowOptions window_options = DWOP_NONE;
+ desc.flags = DWDESC_CAPS;
+ if( window_private->input_only ) {
+ desc.caps = DWCAPS_INPUTONLY;
+ } else {
+ desc.flags |= DWDESC_PIXELFORMAT;
+ desc.pixelformat = ((GdkVisualDirectFB *) visual)->format;
+ if (DFB_PIXELFORMAT_HAS_ALPHA (desc.pixelformat)) {
+ desc.flags |= DWDESC_CAPS;
+ desc.caps = DWCAPS_ALPHACHANNEL;
+ }
+ }
+ if( window_private->window_type == GDK_WINDOW_CHILD )
+ window_private->window_type = GDK_WINDOW_TOPLEVEL;
+ desc.flags |= ( DWDESC_WIDTH | DWDESC_HEIGHT |
+ DWDESC_POSX | DWDESC_POSY );
+ desc.posx = x;
+ desc.posy = y;
+ desc.width = impl->drawable.width;
+ desc.height = impl->drawable.height;
+ if (!create_directfb_window (impl, &desc, window_options))
+ {
+ g_assert(0);
+ _gdk_window_destroy (window, FALSE);
+ return;
+ }
+ /* we hold a reference count on ourselves */
+ g_object_ref (window);
+ impl->window->GetID (impl->window, &impl->dfb_id);
+ gdk_directfb_window_id_table_insert (impl->dfb_id, window);
+ gdk_directfb_event_windows_add (window);
+ } else {
+ DFBRectangle rect = { x, y, impl->drawable.width,
+ impl->drawable.height};
+ impl->window = NULL;
+ parent_impl->drawable.surface->GetSubSurface (
+ parent_impl->drawable.surface,
+ &rect,
+ &impl->drawable.surface);
+ }
}
void
@@ -2411,19 +2483,155 @@ gdk_window_get_frame_extents (GdkWindow *window,
rect->height = impl->height;
}
+/**
+ * Given a directfb window and a subsurface of that window
+ * create a gdkwindow chaild wrapper
+ */
+GdkWindow *gdk_directfb_create_child_window(GdkWindow *parent,
+ IDirectFBSurface *subsurface)
+{
+ GdkWindow *window;
+ GdkWindowObject *private;
+ GdkWindowObject *parent_private;
+ GdkWindowImplDirectFB *impl;
+ GdkWindowImplDirectFB *parent_impl;
+ gint x,y,w,h;
+
+ g_return_val_if_fail (parent != NULL, NULL);
+
+ window = g_object_new (GDK_TYPE_WINDOW, NULL);
+ private = GDK_WINDOW_OBJECT (window);
+ parent_private = GDK_WINDOW_OBJECT (parent);
+ parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
+ private->parent = parent_private;
+
+ subsurface->GetPosition(subsurface,&x,&y);
+ subsurface->GetSize(subsurface,&w,&h);
+
+ impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
+ impl->drawable.wrapper = GDK_DRAWABLE (window);
+
+ private->x = x;
+ private->y = y;
+
+ _gdk_directfb_calc_abs (window);
+
+ impl->drawable.width = w;
+ impl->drawable.height = h;
+ private->window_type = GDK_WINDOW_CHILD;
+ impl->drawable.surface = subsurface;
+ impl->drawable.format = parent_impl->drawable.format;
+ private->depth = parent_private->depth;
+ gdk_drawable_set_colormap (GDK_DRAWABLE (window),
+ gdk_drawable_get_colormap (parent));
+ gdk_window_set_cursor (window, NULL);
+ parent_private->children = g_list_prepend (parent_private->children,window);
+ /*we hold a reference count on ourselves */
+ g_object_ref (window);
+
+ return window;
+}
+/*
+ * The wrapping is not perfect since directfb does not give full access
+ * to the current state of a window event mask etc need to fix dfb
+ */
GdkWindow *
gdk_window_foreign_new_for_display (GdkDisplay* display,GdkNativeWindow anid)
{
- GdkWindow *window;
+ GdkWindow *window = NULL;
+ GdkWindow *parent =NULL;
+ GdkWindowObject *private =NULL;
+ GdkWindowObject *parent_private =NULL;
+ GdkWindowImplDirectFB *parent_impl =NULL;
+ GdkWindowImplDirectFB *impl =NULL;
+ DFBWindowOptions options;
+ DFBResult ret;
+ GdkDisplayDFB * gdkdisplay = _gdk_display;
+ IDirectFBWindow *dfbwindow;
+
+ window = gdk_window_lookup (anid);
+
+ if (window) {
+ g_object_ref (window);
+ return window;
+ }
+ if( display != NULL )
+ gdkdisplay = GDK_DISPLAY_DFB(display);
+
+ ret = gdkdisplay->layer->GetWindow (gdkdisplay->layer,
+ (DFBWindowID)anid,&dfbwindow);
+
+ if (ret != DFB_OK) {
+ DirectFBError ("gdk_window_new: Layer->GetWindow failed", ret);
+ return NULL;
+ }
+
+ parent = _gdk_parent_root;
- window = gdk_window_lookup (anid);
+ if(parent) {
+ parent_private = GDK_WINDOW_OBJECT (parent);
+ parent_impl = GDK_WINDOW_IMPL_DIRECTFB (parent_private->impl);
+ }
- if (window)
+ window = g_object_new (GDK_TYPE_WINDOW, NULL);
+ /* we hold a reference count on ourselves */
g_object_ref (window);
+ private = GDK_WINDOW_OBJECT (window);
+ private->parent = parent_private;
+ private->window_type = GDK_WINDOW_TOPLEVEL;
+ impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
- return window;
+ impl->drawable.wrapper = GDK_DRAWABLE (window);
+ impl->window = dfbwindow;
+ dfbwindow->GetOptions(dfbwindow,&options);
+ dfbwindow->GetPosition(dfbwindow,&private->x,&private->y);
+ dfbwindow->GetSize(dfbwindow,&impl->drawable.width,&impl->drawable.height);
+
+
+ private->input_only = FALSE;
+
+ if( dfbwindow->GetSurface (dfbwindow, &impl->drawable.surface) == DFB_UNSUPPORTED ){
+ private->input_only = TRUE;
+ impl->drawable.surface = NULL;
+ }
+ /*
+ * Position ourselevs
+ */
+ _gdk_directfb_calc_abs (window);
+
+ /* We default to all events least surprise to the user
+ * minus the poll for motion events
+ */
+ gdk_window_set_events (window, (GDK_ALL_EVENTS_MASK ^ GDK_POINTER_MOTION_HINT_MASK));
+
+ if (impl->drawable.surface)
+ {
+ impl->drawable.surface->GetPixelFormat (impl->drawable.surface,
+ &impl->drawable.format);
+
+ private->depth = DFB_BITS_PER_PIXEL(impl->drawable.format);
+ if( parent )
+ gdk_drawable_set_colormap (GDK_DRAWABLE (window), gdk_drawable_get_colormap (parent));
+ else
+ gdk_drawable_set_colormap (GDK_DRAWABLE (window), gdk_colormap_get_system());
+ }
+
+ //can be null for the soft cursor window itself when
+ //running a gtk directfb wm
+ if( gdk_display_get_default() != NULL ) {
+ gdk_window_set_cursor (window,NULL);
+ }
+
+ if (parent_private)
+ parent_private->children = g_list_prepend (parent_private->children,
+ window);
+ impl->dfb_id = (DFBWindowID)anid;
+ gdk_directfb_window_id_table_insert (impl->dfb_id, window);
+ gdk_directfb_event_windows_add (window);
+
+ return window;
}
GdkWindow *
@@ -2438,13 +2646,30 @@ gdk_window_lookup (GdkNativeWindow anid)
return gdk_directfb_window_id_table_lookup ((DFBWindowID) anid);
}
+IDirectFBWindow *gdk_directfb_window_lookup(GdkWindow *window )
+{
+ GdkWindowObject *private;
+ GdkWindowImplDirectFB *impl;
+ g_return_val_if_fail (GDK_IS_WINDOW (window),NULL);
+ private = GDK_WINDOW_OBJECT (window);
+ impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
+ return impl->window;
+}
+IDirectFBSurface *gdk_directfb_surface_lookup(GdkWindow *window)
+{
+ GdkWindowObject *private;
+ GdkWindowImplDirectFB *impl;
+ g_return_val_if_fail (GDK_IS_WINDOW (window),NULL);
+ private = GDK_WINDOW_OBJECT (window);
+ impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
+ return impl->drawable.surface;
+}
void
gdk_window_fullscreen (GdkWindow *window)
{
g_return_if_fail (GDK_IS_WINDOW (window));
-
g_warning ("gdk_window_fullscreen() not implemented.\n");
}
@@ -2452,8 +2677,7 @@ void
gdk_window_unfullscreen (GdkWindow *window)
{
g_return_if_fail (GDK_IS_WINDOW (window));
-
- /* g_warning ("gdk_window_unfullscreen() not implemented.\n");*/
+ /* g_warning ("gdk_window_unfullscreen() not implemented.\n");*/
}
void