]> git.saurik.com Git - wxWidgets.git/commitdiff
use C++ wrappers around DirectFB API for easier use
authorVáclav Slavík <vslavik@fastmail.fm>
Wed, 6 Sep 2006 09:40:31 +0000 (09:40 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Wed, 6 Sep 2006 09:40:31 +0000 (09:40 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41029 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

24 files changed:
Makefile.in
build/bakefiles/files.bkl
include/wx/dfb/app.h
include/wx/dfb/bitmap.h
include/wx/dfb/dc.h
include/wx/dfb/dfbptr.h [new file with mode: 0644]
include/wx/dfb/evtloop.h
include/wx/dfb/font.h
include/wx/dfb/ifacehelpers.h [deleted file]
include/wx/dfb/private.h
include/wx/dfb/toplevel.h
include/wx/dfb/window.h
include/wx/dfb/wrapdfb.h [new file with mode: 0644]
src/dfb/app.cpp
src/dfb/bitmap.cpp
src/dfb/dc.cpp
src/dfb/dcclient.cpp
src/dfb/evtloop.cpp
src/dfb/font.cpp
src/dfb/ifacehelpers.cpp [deleted file]
src/dfb/toplevel.cpp
src/dfb/utils.cpp
src/dfb/window.cpp
src/dfb/wrapdfb.cpp [new file with mode: 0644]

index 29fe0f80945930f74cc8fa772af245062ef4e441..151057b0747a21e0b45a6a960d2ccecdce31a982 100644 (file)
@@ -1669,15 +1669,16 @@ COND_TOOLKIT_DFB_LOWLEVEL_HDR =  \
        wx/dfb/dcclient.h \
        wx/dfb/dcmemory.h \
        wx/dfb/dcscreen.h \
+       wx/dfb/dfbptr.h \
        wx/dfb/evtloop.h \
        wx/dfb/font.h \
-       wx/dfb/ifacehelpers.h \
        wx/dfb/pen.h \
        wx/dfb/popupwin.h \
        wx/dfb/private.h \
        wx/dfb/region.h \
        wx/dfb/toplevel.h \
        wx/dfb/window.h \
+       wx/dfb/wrapdfb.h \
        wx/generic/caret.h \
        wx/generic/colour.h \
        wx/generic/icon.h \
@@ -3570,13 +3571,13 @@ COND_TOOLKIT_DFB___LOWLEVEL_SRC_OBJECTS =  \
        monodll_evtloop.o \
        monodll_font.o \
        monodll_fontenum.o \
-       monodll_ifacehelpers.o \
        monodll_pen.o \
        monodll_region.o \
        monodll_settings.o \
        monodll_toplevel.o \
        monodll_utils.o \
        monodll_window.o \
+       monodll_wrapdfb.o \
        monodll_caret.o \
        monodll_colour.o \
        monodll_icon.o \
@@ -4386,13 +4387,13 @@ COND_TOOLKIT_DFB___LOWLEVEL_SRC_OBJECTS_1 =  \
        monodll_evtloop.o \
        monodll_font.o \
        monodll_fontenum.o \
-       monodll_ifacehelpers.o \
        monodll_pen.o \
        monodll_region.o \
        monodll_settings.o \
        monodll_toplevel.o \
        monodll_utils.o \
        monodll_window.o \
+       monodll_wrapdfb.o \
        monodll_caret.o \
        monodll_colour.o \
        monodll_icon.o \
@@ -5269,13 +5270,13 @@ COND_TOOLKIT_DFB___LOWLEVEL_SRC_OBJECTS_2 =  \
        monolib_evtloop.o \
        monolib_font.o \
        monolib_fontenum.o \
-       monolib_ifacehelpers.o \
        monolib_pen.o \
        monolib_region.o \
        monolib_settings.o \
        monolib_toplevel.o \
        monolib_utils.o \
        monolib_window.o \
+       monolib_wrapdfb.o \
        monolib_caret.o \
        monolib_colour.o \
        monolib_icon.o \
@@ -6086,13 +6087,13 @@ COND_TOOLKIT_DFB___LOWLEVEL_SRC_OBJECTS_3 =  \
        monolib_evtloop.o \
        monolib_font.o \
        monolib_fontenum.o \
-       monolib_ifacehelpers.o \
        monolib_pen.o \
        monolib_region.o \
        monolib_settings.o \
        monolib_toplevel.o \
        monolib_utils.o \
        monolib_window.o \
+       monolib_wrapdfb.o \
        monolib_caret.o \
        monolib_colour.o \
        monolib_icon.o \
@@ -7187,13 +7188,13 @@ COND_TOOLKIT_DFB___LOWLEVEL_SRC_OBJECTS_4 =  \
        coredll_evtloop.o \
        coredll_font.o \
        coredll_fontenum.o \
-       coredll_ifacehelpers.o \
        coredll_pen.o \
        coredll_region.o \
        coredll_settings.o \
        coredll_toplevel.o \
        coredll_utils.o \
        coredll_window.o \
+       coredll_wrapdfb.o \
        coredll_caret.o \
        coredll_colour.o \
        coredll_icon.o \
@@ -8004,13 +8005,13 @@ COND_TOOLKIT_DFB___LOWLEVEL_SRC_OBJECTS_5 =  \
        coredll_evtloop.o \
        coredll_font.o \
        coredll_fontenum.o \
-       coredll_ifacehelpers.o \
        coredll_pen.o \
        coredll_region.o \
        coredll_settings.o \
        coredll_toplevel.o \
        coredll_utils.o \
        coredll_window.o \
+       coredll_wrapdfb.o \
        coredll_caret.o \
        coredll_colour.o \
        coredll_icon.o \
@@ -8583,13 +8584,13 @@ COND_TOOLKIT_DFB___LOWLEVEL_SRC_OBJECTS_6 =  \
        corelib_evtloop.o \
        corelib_font.o \
        corelib_fontenum.o \
-       corelib_ifacehelpers.o \
        corelib_pen.o \
        corelib_region.o \
        corelib_settings.o \
        corelib_toplevel.o \
        corelib_utils.o \
        corelib_window.o \
+       corelib_wrapdfb.o \
        corelib_caret.o \
        corelib_colour.o \
        corelib_icon.o \
@@ -9400,13 +9401,13 @@ COND_TOOLKIT_DFB___LOWLEVEL_SRC_OBJECTS_7 =  \
        corelib_evtloop.o \
        corelib_font.o \
        corelib_fontenum.o \
-       corelib_ifacehelpers.o \
        corelib_pen.o \
        corelib_region.o \
        corelib_settings.o \
        corelib_toplevel.o \
        corelib_utils.o \
        corelib_window.o \
+       corelib_wrapdfb.o \
        corelib_caret.o \
        corelib_colour.o \
        corelib_icon.o \
@@ -13938,8 +13939,8 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
 @COND_TOOLKIT_MGL_USE_GUI_1@monodll_dirmgl.o: $(srcdir)/src/mgl/dirmgl.cpp $(MONODLL_ODEP)
 @COND_TOOLKIT_MGL_USE_GUI_1@   $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/mgl/dirmgl.cpp
 
-@COND_TOOLKIT_DFB_USE_GUI_1@monodll_ifacehelpers.o: $(srcdir)/src/dfb/ifacehelpers.cpp $(MONODLL_ODEP)
-@COND_TOOLKIT_DFB_USE_GUI_1@   $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/dfb/ifacehelpers.cpp
+@COND_TOOLKIT_DFB_USE_GUI_1@monodll_wrapdfb.o: $(srcdir)/src/dfb/wrapdfb.cpp $(MONODLL_ODEP)
+@COND_TOOLKIT_DFB_USE_GUI_1@   $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/dfb/wrapdfb.cpp
 
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@monodll_accel.o: $(srcdir)/src/generic/accel.cpp $(MONODLL_ODEP)
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@        $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/accel.cpp
@@ -17868,8 +17869,8 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
 @COND_TOOLKIT_MGL_USE_GUI_1@monolib_dirmgl.o: $(srcdir)/src/mgl/dirmgl.cpp $(MONOLIB_ODEP)
 @COND_TOOLKIT_MGL_USE_GUI_1@   $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/mgl/dirmgl.cpp
 
-@COND_TOOLKIT_DFB_USE_GUI_1@monolib_ifacehelpers.o: $(srcdir)/src/dfb/ifacehelpers.cpp $(MONOLIB_ODEP)
-@COND_TOOLKIT_DFB_USE_GUI_1@   $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/dfb/ifacehelpers.cpp
+@COND_TOOLKIT_DFB_USE_GUI_1@monolib_wrapdfb.o: $(srcdir)/src/dfb/wrapdfb.cpp $(MONOLIB_ODEP)
+@COND_TOOLKIT_DFB_USE_GUI_1@   $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/dfb/wrapdfb.cpp
 
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@monolib_accel.o: $(srcdir)/src/generic/accel.cpp $(MONOLIB_ODEP)
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@        $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/accel.cpp
@@ -22179,8 +22180,8 @@ coredll_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(COREDLL_ODEP)
 @COND_TOOLKIT_MGL_USE_GUI_1@coredll_dirmgl.o: $(srcdir)/src/mgl/dirmgl.cpp $(COREDLL_ODEP)
 @COND_TOOLKIT_MGL_USE_GUI_1@   $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/mgl/dirmgl.cpp
 
-@COND_TOOLKIT_DFB_USE_GUI_1@coredll_ifacehelpers.o: $(srcdir)/src/dfb/ifacehelpers.cpp $(COREDLL_ODEP)
-@COND_TOOLKIT_DFB_USE_GUI_1@   $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/dfb/ifacehelpers.cpp
+@COND_TOOLKIT_DFB_USE_GUI_1@coredll_wrapdfb.o: $(srcdir)/src/dfb/wrapdfb.cpp $(COREDLL_ODEP)
+@COND_TOOLKIT_DFB_USE_GUI_1@   $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/dfb/wrapdfb.cpp
 
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@coredll_accel.o: $(srcdir)/src/generic/accel.cpp $(COREDLL_ODEP)
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@        $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/generic/accel.cpp
@@ -25044,8 +25045,8 @@ corelib_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(CORELIB_ODEP)
 @COND_TOOLKIT_MGL_USE_GUI_1@corelib_dirmgl.o: $(srcdir)/src/mgl/dirmgl.cpp $(CORELIB_ODEP)
 @COND_TOOLKIT_MGL_USE_GUI_1@   $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/mgl/dirmgl.cpp
 
-@COND_TOOLKIT_DFB_USE_GUI_1@corelib_ifacehelpers.o: $(srcdir)/src/dfb/ifacehelpers.cpp $(CORELIB_ODEP)
-@COND_TOOLKIT_DFB_USE_GUI_1@   $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/dfb/ifacehelpers.cpp
+@COND_TOOLKIT_DFB_USE_GUI_1@corelib_wrapdfb.o: $(srcdir)/src/dfb/wrapdfb.cpp $(CORELIB_ODEP)
+@COND_TOOLKIT_DFB_USE_GUI_1@   $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/dfb/wrapdfb.cpp
 
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@corelib_accel.o: $(srcdir)/src/generic/accel.cpp $(CORELIB_ODEP)
 @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@        $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/generic/accel.cpp
index f7a731c74512f8abce25da0eef66b869f86775a5..dc1e645a3125e27d5feafe35695b2316efc5cc77 100644 (file)
@@ -1790,13 +1790,13 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     src/dfb/evtloop.cpp
     src/dfb/font.cpp
     src/dfb/fontenum.cpp
-    src/dfb/ifacehelpers.cpp
     src/dfb/pen.cpp
     src/dfb/region.cpp
     src/dfb/settings.cpp
     src/dfb/toplevel.cpp
     src/dfb/utils.cpp
     src/dfb/window.cpp
+    src/dfb/wrapdfb.cpp
     src/generic/caret.cpp
     src/generic/colour.cpp
     src/generic/icon.cpp
@@ -1812,15 +1812,16 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     wx/dfb/dcclient.h
     wx/dfb/dcmemory.h
     wx/dfb/dcscreen.h
+    wx/dfb/dfbptr.h
     wx/dfb/evtloop.h
     wx/dfb/font.h
-    wx/dfb/ifacehelpers.h
     wx/dfb/pen.h
     wx/dfb/popupwin.h
     wx/dfb/private.h
     wx/dfb/region.h
     wx/dfb/toplevel.h
     wx/dfb/window.h
+    wx/dfb/wrapdfb.h
     wx/generic/caret.h
     wx/generic/colour.h
     wx/generic/icon.h
index f1e8041ab60c7ca1c083479038bde5ca6a232133..04db9f53e95574bce4dad403b43dad25b43f6916 100644 (file)
@@ -11,7 +11,7 @@
 #ifndef _WX_DFB_APP_H_
 #define _WX_DFB_APP_H_
 
-#include "wx/dfb/ifacehelpers.h"
+#include "wx/dfb/dfbptr.h"
 
 wxDFB_DECLARE_INTERFACE(IDirectFB);
 
@@ -35,11 +35,7 @@ public:
     virtual wxVideoMode GetDisplayMode() const;
     virtual bool SetDisplayMode(const wxVideoMode& mode);
 
-    // implementation - get singleton DirectFB interface
-    IDirectFBPtr GetDirectFBInterface();
-
 private:
-    IDirectFBPtr m_dfb;
     wxVideoMode m_videoMode;
 
     DECLARE_DYNAMIC_CLASS(wxApp)
index 751535c87b5d823a2eeb0b754ae866b7bc3db473..7b64a06e964b97fc7d3214632b11a3204d0fa0be 100644 (file)
@@ -11,7 +11,7 @@
 #ifndef _WX_DFB_BITMAP_H_
 #define _WX_DFB_BITMAP_H_
 
-#include "wx/dfb/ifacehelpers.h"
+#include "wx/dfb/dfbptr.h"
 
 wxDFB_DECLARE_INTERFACE(IDirectFBSurface);
 
@@ -110,7 +110,7 @@ public:
     virtual void SetDepth(int depth);
 
     // get underlying native representation:
-    IDirectFBSurfacePtr GetDirectFBSurface() const;
+    wxIDirectFBSurfacePtr GetDirectFBSurface() const;
 
 protected:
     bool CreateFromXpm(const char **bits);
index daf39357d81ba358966a5c4a91b205cd3df677fe..6eb1bac90224b4f1cfb78183022ef098238ca20e 100644 (file)
@@ -13,7 +13,7 @@
 
 #include "wx/defs.h"
 #include "wx/region.h"
-#include "wx/dfb/ifacehelpers.h"
+#include "wx/dfb/dfbptr.h"
 
 wxDFB_DECLARE_INTERFACE(IDirectFBSurface);
 
@@ -27,7 +27,7 @@ public:
     wxDC();
 
     // Ctor.
-    wxDC(const IDirectFBSurfacePtr& surface);
+    wxDC(const wxIDirectFBSurfacePtr& surface);
 
 public:
     // implement base class pure virtuals
@@ -140,12 +140,12 @@ public:
     }
 
     // Returns the surface (and increases its ref count)
-    IDirectFBSurfacePtr GetDirectFBSurface() const { return m_surface; }
+    wxIDirectFBSurfacePtr GetDirectFBSurface() const { return m_surface; }
 
 protected:
     // initializes the DC from a surface, must be called if default ctor
     // was used
-    void Init(const IDirectFBSurfacePtr& surface);
+    void Init(const wxIDirectFBSurfacePtr& surface);
 
     virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col,
                              int style = wxFLOOD_SURFACE);
@@ -208,7 +208,7 @@ private:
     void SelectColour(const wxColour& clr);
 
 protected:
-    IDirectFBSurfacePtr m_surface;
+    wxIDirectFBSurfacePtr m_surface;
 
     double            m_mm_to_pix_x, m_mm_to_pix_y;
 
diff --git a/include/wx/dfb/dfbptr.h b/include/wx/dfb/dfbptr.h
new file mode 100644 (file)
index 0000000..5f19dee
--- /dev/null
@@ -0,0 +1,110 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/dfb/dfbptr.h
+// Purpose:     wxDfbPtr<T> for holding objects declared in wrapdfb.h
+// Author:      Vaclav Slavik
+// Created:     2006-08-09
+// RCS-ID:      $Id$
+// Copyright:   (c) 2006 REA Elektronik GmbH
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_DFB_DFBPTR_H_
+#define _WX_DFB_DFBPTR_H_
+
+//-----------------------------------------------------------------------------
+// wxDFB_DECLARE_INTERFACE
+//-----------------------------------------------------------------------------
+
+/**
+    Forward declares wx wrapper around DirectFB interface @a name.
+
+    Also declares wx##name##Ptr typedef for wxDfbPtr<wx##name> pointer.
+
+    @param name  name of the DirectFB interface
+ */
+#define wxDFB_DECLARE_INTERFACE(name)            \
+    class wx##name;                              \
+    typedef wxDfbPtr<wx##name> wx##name##Ptr;
+
+
+//-----------------------------------------------------------------------------
+// wxDfbPtr<T>
+//-----------------------------------------------------------------------------
+
+class wxDfbWrapperBase;
+
+class wxDfbPtrBase
+{
+protected:
+    static void DoAddRef(wxDfbWrapperBase *ptr);
+    static void DoRelease(wxDfbWrapperBase *ptr);
+};
+
+/**
+    This template implements smart pointer for keeping pointers to DirectFB
+    wrappers (i.e. wxIFoo classes derived from wxDfbWrapper<T>). Interface's
+    reference count is increased on copying and the interface is released when
+    the pointer is deleted.
+ */
+template<typename T>
+class wxDfbPtr : private wxDfbPtrBase
+{
+public:
+    /**
+        Creates the pointer from raw pointer to the wrapper.
+
+        Takes ownership of @a ptr, i.e. AddRef() is @em not called on it.
+     */
+    wxDfbPtr(T *ptr = NULL) : m_ptr(ptr) {}
+
+    /// Copy ctor
+    wxDfbPtr(const wxDfbPtr& ptr) { InitFrom(ptr); }
+
+    /// Dtor. Releases the interface
+    ~wxDfbPtr() { Reset(); }
+
+    /// Resets the pointer to NULL, decreasing reference count of the interface.
+    void Reset()
+    {
+        if ( m_ptr )
+        {
+            this->DoRelease((wxDfbWrapperBase*)m_ptr);
+            m_ptr = NULL;
+        }
+    }
+
+    /// Cast to the wrapper pointer
+    operator T*() const { return m_ptr; }
+
+    // standard operators:
+
+    wxDfbPtr& operator=(T *ptr)
+    {
+        Reset();
+        m_ptr = ptr;
+        return *this;
+    }
+
+    wxDfbPtr& operator=(const wxDfbPtr& ptr)
+    {
+        Reset();
+        InitFrom(ptr);
+        return *this;
+    }
+
+    T& operator*() const { return *m_ptr; }
+    T* operator->() const { return m_ptr; }
+
+private:
+    void InitFrom(const wxDfbPtr& ptr)
+    {
+        m_ptr = ptr.m_ptr;
+        if ( m_ptr )
+            this->DoAddRef((wxDfbWrapperBase*)m_ptr);
+    }
+
+private:
+    T *m_ptr;
+};
+
+#endif // _WX_DFB_DFBPTR_H_
index 05a08f87ea173f758330bb8b6c9b33f74ba9f2f8..11366e70a3c0adf658b470aabc61c345977f90ce 100644 (file)
@@ -11,7 +11,7 @@
 #ifndef _WX_DFB_EVTLOOP_H_
 #define _WX_DFB_EVTLOOP_H_
 
-#include "wx/dfb/ifacehelpers.h"
+#include "wx/dfb/dfbptr.h"
 
 wxDFB_DECLARE_INTERFACE(IDirectFBEventBuffer);
 struct wxDFBEvent;
@@ -29,7 +29,7 @@ public:
     virtual bool Dispatch();
 
     // returns DirectFB event buffer used by wx
-    static IDirectFBEventBufferPtr GetDirectFBEventBuffer();
+    static wxIDirectFBEventBufferPtr GetDirectFBEventBuffer();
 
 protected:
     virtual void WakeUp();
@@ -41,7 +41,7 @@ private:
     static void InitBuffer();
 
 private:
-    static IDirectFBEventBufferPtr ms_buffer;
+    static wxIDirectFBEventBufferPtr ms_buffer;
 
     friend class wxApp; // calls WakeUp()
 
index 04909177db47128a8f28ef637c2c46c45b0cf93f..b9d54786ac45dd8e479dc9d785dad80ac5d17bf0 100644 (file)
@@ -11,7 +11,7 @@
 #ifndef _WX_DFB_FONT_H_
 #define _WX_DFB_FONT_H_
 
-#include "wx/dfb/ifacehelpers.h"
+#include "wx/dfb/dfbptr.h"
 
 wxDFB_DECLARE_INTERFACE(IDirectFBFont);
 
@@ -64,7 +64,7 @@ public:
     virtual void SetEncoding(wxFontEncoding encoding);
 
     // implementation from now on:
-    IDirectFBFontPtr GetDirectFBFont() const;
+    wxIDirectFBFontPtr GetDirectFBFont() const;
 
 protected:
     // ref counting code
diff --git a/include/wx/dfb/ifacehelpers.h b/include/wx/dfb/ifacehelpers.h
deleted file mode 100644 (file)
index 56a8808..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Name:        wx/dfb/ifacehelpers.h
-// Purpose:     helpers for dealing with DFB interfaces
-// Author:      Vaclav Slavik
-// Created:     2006-08-09
-// RCS-ID:      $Id$
-// Copyright:   (c) 2006 REA Elektronik GmbH
-// Licence:     wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef _WX_DFB_IFACEHELPERS_H_
-#define _WX_DFB_IFACEHELPERS_H_
-
-//-----------------------------------------------------------------------------
-// wxDFB_DECLARE_INTERFACE
-//-----------------------------------------------------------------------------
-
-/**
-    Forward declares DirectFB interface @a name.
-
-    Also declares name##Ptr typedef for wxDfbPtr<name> pointer.
-
-    @param name  name of the DirectFB interface
- */
-#define wxDFB_DECLARE_INTERFACE(name)            \
-    struct _##name;                              \
-    typedef _##name name;                        \
-    typedef wxDfbPtr<name> name##Ptr;
-
-
-//-----------------------------------------------------------------------------
-// wxDfbPtr
-//-----------------------------------------------------------------------------
-
-// base class for wxDfbPtr
-class wxDfbPtrBase
-{
-protected:
-    // increment/decrement refcount; see ifacehelpers.cpp for why using
-    // void* is safe
-    static void DoAddRef(void *ptr);
-    static void DoRelease(void *ptr);
-};
-
-/**
-    This template implements smart pointer for keeping pointers to DirectFB
-    interfaces. Interface's reference count is increased on copying and the
-    interface is released when the pointer is deleted.
- */
-template<typename T>
-class wxDfbPtr : private wxDfbPtrBase
-{
-public:
-    /**
-        Creates the pointer from raw interface pointer.
-
-        Takes ownership of @a ptr, i.e. AddRef() is @em not called on it.
-     */
-    wxDfbPtr(T *ptr = NULL) : m_ptr(ptr) {}
-
-    /// Copy ctor
-    wxDfbPtr(const wxDfbPtr& ptr) { InitFrom(ptr); }
-
-    /// Dtor. Releases the interface
-    ~wxDfbPtr() { Reset(); }
-
-    /// Resets the pointer to NULL, decreasing reference count of the interface.
-    void Reset()
-    {
-        if ( m_ptr )
-        {
-            DoRelease(m_ptr);
-            m_ptr = NULL;
-        }
-    }
-
-    /// Cast to raw pointer
-    operator T*() const { return m_ptr; }
-
-    /**
-        Cast to @em writeable raw pointer so that code like
-        "dfb->CreateFont(dfb, NULL, &desc, &fontPtr)" works.
-
-        Note that this operator calls Reset(), so using it looses the value.
-     */
-    T** operator&()
-    {
-        Reset();
-        return &m_ptr;
-    }
-
-    // standard operators:
-
-    wxDfbPtr& operator=(const wxDfbPtr& ptr)
-    {
-        Reset();
-        InitFrom(ptr);
-        return *this;
-    }
-
-    T& operator*() const { return *m_ptr; }
-    T* operator->() const { return m_ptr; }
-
-private:
-    void InitFrom(const wxDfbPtr& ptr)
-    {
-        m_ptr = ptr.m_ptr;
-        if ( m_ptr )
-            DoAddRef(m_ptr);
-    }
-
-private:
-    T *m_ptr;
-};
-
-#endif // _WX_DFB_IFACEHELPERS_H_
index a613c53b4ab1e1e49e8475401e531233cd13cbd6..23c6d830acaaa855af89431604aeed8341240648 100644 (file)
 #include "wx/intl.h"
 #include "wx/log.h"
 
-#include <directfb.h>
+#include "wx/dfb/wrapdfb.h"
 #include <directfb_version.h>
 
-#include "wx/dfb/ifacehelpers.h"
-
-wxDFB_DECLARE_INTERFACE(IDirectFB);
-wxDFB_DECLARE_INTERFACE(IDirectFBDisplayLayer);
-wxDFB_DECLARE_INTERFACE(IDirectFBSurface);
-wxDFB_DECLARE_INTERFACE(IDirectFBPalette);
-
 //-----------------------------------------------------------------------------
 // strings conversion
 //-----------------------------------------------------------------------------
@@ -35,59 +28,6 @@ wxDFB_DECLARE_INTERFACE(IDirectFBPalette);
     #define wxSTR_TO_DFB(s)    wxConvUTF8.cWC2MB((s).wc_str(*wxConvUI))
 #endif
 
-//-----------------------------------------------------------------------------
-// error checking
-//-----------------------------------------------------------------------------
-
-inline bool wxDfbCheckReturn(DFBResult code)
-{
-    switch ( code )
-    {
-        case DFB_OK:
-            return true;
-
-        // these are programming errors, assert:
-        #define DFB_ASSERT(code)                                        \
-            case code:                                                  \
-                wxFAIL_MSG( _T("DirectFB error: ") _T(#code) );         \
-                return false                                            \
-
-        DFB_ASSERT(DFB_DEAD);
-        DFB_ASSERT(DFB_UNSUPPORTED);
-        DFB_ASSERT(DFB_UNIMPLEMENTED);
-        DFB_ASSERT(DFB_INVARG);
-        DFB_ASSERT(DFB_NOIMPL);
-        DFB_ASSERT(DFB_MISSINGFONT);
-        DFB_ASSERT(DFB_THIZNULL);
-        DFB_ASSERT(DFB_INVAREA);
-        DFB_ASSERT(DFB_DESTROYED);
-        DFB_ASSERT(DFB_NOSUCHMETHOD);
-        DFB_ASSERT(DFB_NOSUCHINSTANCE);
-        DFB_ASSERT(DFB_VERSIONMISMATCH);
-
-        #undef  DFB_ASSERT
-
-        // these are not errors, but valid return codes:
-        case DFB_INTERRUPTED:
-        case DFB_BUFFEREMPTY:
-            return true;
-
-        default:
-            // FIXME: should handle the errors individually
-            wxLogError(_("DirectFB error %d occured."), (int)code);
-            return false;
-    }
-}
-
-/**
-    Wrap all calls to DirectFB in this macro so that the return value is
-    checked and errors reported as appropriate.
-
-    Returns true if the call succeeded, false otherwise.
- */
-#define DFB_CALL(call)      (wxDfbCheckReturn(call))
-
-
 //-----------------------------------------------------------------------------
 // surface manipulation helpers
 //-----------------------------------------------------------------------------
@@ -106,49 +46,22 @@ enum wxDfbCloneSurfaceMode
     either makes exact copy (wxDfbCloneSurface_CopyPixels) or only creates a
     new surface with the same size and attributes (wxDfbCloneSurface_NoPixels).
  */
-IDirectFBSurfacePtr wxDfbCloneSurface(const IDirectFBSurfacePtr& s,
-                                      wxDfbCloneSurfaceMode mode);
+wxIDirectFBSurfacePtr wxDfbCloneSurface(const wxIDirectFBSurfacePtr& s,
+                                        wxDfbCloneSurfaceMode mode);
 
 /// Returns bit depth used by the surface
-int wxDfbGetSurfaceDepth(const IDirectFBSurfacePtr& s);
+int wxDfbGetSurfaceDepth(const wxIDirectFBSurfacePtr& s);
 
 /// Returns interface to the primary display layer:
-IDirectFBDisplayLayerPtr wxDfbGetDisplayLayer();
+wxIDirectFBDisplayLayerPtr wxDfbGetDisplayLayer();
 
 /// Returns interface to the primary surface:
-IDirectFBSurfacePtr wxDfbGetPrimarySurface();
-
+wxIDirectFBSurfacePtr wxDfbGetPrimarySurface();
 
 //-----------------------------------------------------------------------------
-// wxDfbEvent
+// misc helpers
 //-----------------------------------------------------------------------------
 
-/**
-    The struct defined by this macro is a thin wrapper around DFB*Event type.
-    It is needed because DFB*Event are typedefs and so we can't forward declare
-    them, but we need to pass them to methods declared in public headers where
-    <directfb.h> cannot be included. So this struct just holds the event value,
-    it's sole purpose is that it can be forward declared.
- */
-#define WXDFB_DEFINE_EVENT_WRAPPER(T)                                       \
-    struct wx##T                                                            \
-    {                                                                       \
-        wx##T() {}                                                          \
-        wx##T(const T& event) : m_event(event) {}                           \
-                                                                            \
-        operator T&() { return m_event; }                                   \
-        operator const T&() const { return m_event; }                       \
-        T* operator&() { return &m_event; }                                 \
-                                                                            \
-        DFBEventClass GetClass() const { return m_event.clazz; }            \
-                                                                            \
-    private:                                                                \
-        T m_event;                                                          \
-    };
-
-WXDFB_DEFINE_EVENT_WRAPPER(DFBEvent)
-WXDFB_DEFINE_EVENT_WRAPPER(DFBWindowEvent)
-
 /// Convert DirectFB timestamp to wxEvent one:
 #define wxDFB_EVENT_TIMESTAMP(event) \
         ((event).timestamp.tv_sec * 1000 + (event).timestamp.tv_usec / 1000)
@@ -156,7 +69,7 @@ WXDFB_DEFINE_EVENT_WRAPPER(DFBWindowEvent)
 /**
     Check if DirectFB library version is at least @a major.@a minor.@a release.
 
-    @sa wxCHECK_VERSION
+    @see wxCHECK_VERSION
  */
 #define wxCHECK_DFB_VERSION(major,minor,release) \
     (DIRECTFB_MAJOR_VERSION > (major) || \
index 82e797b7abc86c2e47dd8851a7d3f89d96f4aa72..d35f257c1bd62150b080e97fecab2cfb27a093d5 100644 (file)
@@ -11,7 +11,7 @@
 #ifndef _WX_DFB_TOPLEVEL_H_
 #define _WX_DFB_TOPLEVEL_H_
 
-#include "wx/dfb/ifacehelpers.h"
+#include "wx/dfb/dfbptr.h"
 
 wxDFB_DECLARE_INTERFACE(IDirectFBWindow);
 
@@ -75,13 +75,13 @@ public:
 
     void OnInternalIdle();
 
-    IDirectFBWindowPtr GetDirectFBWindow() const { return m_dfbwin; }
+    wxIDirectFBWindowPtr GetDirectFBWindow() const { return m_dfbwin; }
 
 protected:
     // common part of all ctors
     void Init();
 
-    virtual IDirectFBSurfacePtr ObtainDfbSurface() const;
+    virtual wxIDirectFBSurfacePtr ObtainDfbSurface() const;
 
     // overriden wxWindow methods
     virtual void DoGetPosition(int *x, int *y) const;
@@ -116,7 +116,7 @@ protected:
     wxByte        m_opacity;
 
     // interface to the underlying DirectFB window
-    IDirectFBWindowPtr m_dfbwin;
+    wxIDirectFBWindowPtr m_dfbwin;
 
 private:
     wxDfbQueuedPaintRequests *m_toPaint;
index 98b10a49c8e345bd11d5823c9588674c86371990..e30d2ae436db5ca7e2d2ccf43324ba21eafd909b 100644 (file)
@@ -15,7 +15,7 @@
 // headers
 // ---------------------------------------------------------------------------
 
-#include "wx/dfb/ifacehelpers.h"
+#include "wx/dfb/dfbptr.h"
 
 wxDFB_DECLARE_INTERFACE(IDirectFBSurface);
 struct wxDFBWindowEvent;
@@ -102,7 +102,7 @@ public:
     // --------------------------
 
     // Returns DirectFB surface used for rendering of this window
-    IDirectFBSurfacePtr GetDfbSurface();
+    wxIDirectFBSurfacePtr GetDfbSurface();
 
     // returns toplevel window the window belongs to
     wxTopLevelWindowDFB *GetTLW() const { return m_tlw; }
@@ -132,7 +132,7 @@ protected:
 
     // return DFB surface used to render this window (will be assigned to
     // m_surface if the window is visible)
-    virtual IDirectFBSurfacePtr ObtainDfbSurface() const;
+    virtual wxIDirectFBSurfacePtr ObtainDfbSurface() const;
 
     // this method must be called when window's position, size or visibility
     // changes; it resets m_surface so that ObtainDfbSurface has to be called
@@ -161,7 +161,7 @@ protected:
 
 private:
     // subsurface of TLW's surface covered by this window
-    IDirectFBSurfacePtr m_surface;
+    wxIDirectFBSurfacePtr m_surface;
 
     // position of the window (relative to the parent, not used by wxTLW, so
     // don't access it directly)
diff --git a/include/wx/dfb/wrapdfb.h b/include/wx/dfb/wrapdfb.h
new file mode 100644 (file)
index 0000000..626de03
--- /dev/null
@@ -0,0 +1,462 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/dfb/wrapdfb.h
+// Purpose:     wx wrappers for DirectFB interfaces
+// Author:      Vaclav Slavik
+// Created:     2006-08-23
+// RCS-ID:      $Id$
+// Copyright:   (c) 2006 REA Elektronik GmbH
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_DFB_WRAPDFB_H_
+#define _WX_DFB_WRAPDFB_H_
+
+#include "wx/dfb/dfbptr.h"
+
+#include <directfb.h>
+
+wxDFB_DECLARE_INTERFACE(IDirectFB);
+wxDFB_DECLARE_INTERFACE(IDirectFBDisplayLayer);
+wxDFB_DECLARE_INTERFACE(IDirectFBWindow);
+wxDFB_DECLARE_INTERFACE(IDirectFBSurface);
+wxDFB_DECLARE_INTERFACE(IDirectFBPalette);
+wxDFB_DECLARE_INTERFACE(IDirectFBEventBuffer);
+
+
+/**
+    Checks the @a code of a DirectFB call and returns true if it was
+    successful and false if it failed, logging the errors as appropriate
+    (asserts for programming errors, wxLogError for runtime failures).
+ */
+bool wxDfbCheckReturn(DFBResult code);
+
+//-----------------------------------------------------------------------------
+// wxDfbEvent
+//-----------------------------------------------------------------------------
+
+/**
+    The struct defined by this macro is a thin wrapper around DFB*Event type.
+    It is needed because DFB*Event are typedefs and so we can't forward declare
+    them, but we need to pass them to methods declared in public headers where
+    <directfb.h> cannot be included. So this struct just holds the event value,
+    it's sole purpose is that it can be forward declared.
+ */
+#define WXDFB_DEFINE_EVENT_WRAPPER(T)                                       \
+    struct wx##T                                                            \
+    {                                                                       \
+        wx##T() {}                                                          \
+        wx##T(const T& event) : m_event(event) {}                           \
+                                                                            \
+        operator T&() { return m_event; }                                   \
+        operator const T&() const { return m_event; }                       \
+        T* operator&() { return &m_event; }                                 \
+                                                                            \
+        DFBEventClass GetClass() const { return m_event.clazz; }            \
+                                                                            \
+    private:                                                                \
+        T m_event;                                                          \
+    };
+
+WXDFB_DEFINE_EVENT_WRAPPER(DFBEvent)
+WXDFB_DEFINE_EVENT_WRAPPER(DFBWindowEvent)
+
+
+//-----------------------------------------------------------------------------
+// wxDfbWrapper<T>
+//-----------------------------------------------------------------------------
+
+/// Base class for wxDfbWrapper<T>
+class wxDfbWrapperBase
+{
+public:
+    /// Increases reference count of the object
+    void AddRef()
+    {
+        m_refCnt++;
+    }
+
+    /// Decreases reference count and if it reaches zero, deletes the object
+    void Release()
+    {
+        if ( --m_refCnt == 0 )
+            delete this;
+    }
+
+    /// Returns result code of the last call
+    DFBResult GetLastResult() const { return m_lastResult; }
+
+protected:
+    wxDfbWrapperBase() : m_refCnt(1), m_lastResult(DFB_OK) {}
+
+    /// Dtor may only be called from Release()
+    virtual ~wxDfbWrapperBase() {}
+
+    /**
+        Checks the @a result of a DirectFB call and returns true if it was
+        successful and false if it failed. Also stores result of the call
+        so that it can be obtained by calling GetLastResult().
+     */
+    bool Check(DFBResult result)
+    {
+        m_lastResult = result;
+        return wxDfbCheckReturn(result);
+    }
+
+protected:
+    /// Reference count
+    unsigned m_refCnt;
+
+    /// Result of the last DirectFB call
+    DFBResult m_lastResult;
+};
+
+/**
+    This template is base class for friendly C++ wrapper around DirectFB
+    interface T.
+
+    The wrapper provides same API as DirectFB, with a few exceptions:
+     - methods return true/false instead of error code
+     - methods that return or create another interface return pointer to the
+       interface (or NULL on failure) instead of storing it in the last
+       argument
+     - interface arguments use wxFooPtr type instead of raw DirectFB pointer
+     - methods taking flags use int type instead of an enum when the flags
+       can be or-combination of enum elements (this is workaround for
+       C++-unfriendly DirectFB API)
+ */
+template<typename T>
+class wxDfbWrapper : public wxDfbWrapperBase
+{
+public:
+    /// "Raw" DirectFB interface type
+    typedef T DirectFBIface;
+
+    /// Returns raw DirectFB pointer
+    T *GetRaw() const { return m_ptr; }
+
+protected:
+    /// To be called from ctor. Takes ownership of raw object.
+    void Init(T *ptr) { m_ptr = ptr; }
+
+    /// Dtor may only be used from Release
+    ~wxDfbWrapper()
+    {
+        if ( m_ptr )
+            m_ptr->Release(m_ptr);
+    }
+
+protected:
+    // pointer to DirectFB object
+    T *m_ptr;
+};
+
+
+//-----------------------------------------------------------------------------
+// wxIDirectFBFont
+//-----------------------------------------------------------------------------
+
+struct wxIDirectFBFont : public wxDfbWrapper<IDirectFBFont>
+{
+    wxIDirectFBFont(IDirectFBFont *s) { Init(s); }
+
+    bool GetStringWidth(const char *text, int bytes, int *w)
+        { return Check(m_ptr->GetStringWidth(m_ptr, text, bytes, w)); }
+
+    bool GetStringExtents(const char *text, int bytes,
+                          DFBRectangle *logicalRect, DFBRectangle *inkRect)
+    {
+        return Check(m_ptr->GetStringExtents(m_ptr, text, bytes,
+                                               logicalRect, inkRect));
+    }
+
+    bool GetHeight(int *h)
+        { return Check(m_ptr->GetHeight(m_ptr, h)); }
+
+    bool GetDescender(int *descender)
+        { return Check(m_ptr->GetDescender(m_ptr, descender)); }
+};
+
+
+//-----------------------------------------------------------------------------
+// wxIDirectFBPalette
+//-----------------------------------------------------------------------------
+
+struct wxIDirectFBPalette : public wxDfbWrapper<IDirectFBPalette>
+{
+    wxIDirectFBPalette(IDirectFBPalette *s) { Init(s); }
+};
+
+
+//-----------------------------------------------------------------------------
+// wxIDirectFBSurface
+//-----------------------------------------------------------------------------
+
+struct wxIDirectFBSurface : public wxDfbWrapper<IDirectFBSurface>
+{
+    wxIDirectFBSurface(IDirectFBSurface *s) { Init(s); }
+
+    bool GetSize(int *w, int *h)
+        { return Check(m_ptr->GetSize(m_ptr, w, h)); }
+
+    bool GetCapabilities(DFBSurfaceCapabilities *caps)
+        { return Check(m_ptr->GetCapabilities(m_ptr, caps)); }
+
+    bool GetPixelFormat(DFBSurfacePixelFormat *caps)
+        { return Check(m_ptr->GetPixelFormat(m_ptr, caps)); }
+
+    bool SetClip(const DFBRegion *clip)
+        { return Check(m_ptr->SetClip(m_ptr, clip)); }
+
+    bool SetColor(__u8 r, __u8 g, __u8 b, __u8 a)
+        { return Check(m_ptr->SetColor(m_ptr, r, g, b, a)); }
+
+    bool Clear(__u8 r, __u8 g, __u8 b, __u8 a)
+        { return Check(m_ptr->Clear(m_ptr, r, g, b, a)); }
+
+    bool DrawLine(int x1, int y1, int x2, int y2)
+        { return Check(m_ptr->DrawLine(m_ptr, x1, y1, x2, y2)); }
+
+    bool DrawRectangle(int x, int y, int w, int h)
+        { return Check(m_ptr->DrawRectangle(m_ptr, x, y, w, h)); }
+
+    bool FillRectangle(int x, int y, int w, int h)
+        { return Check(m_ptr->FillRectangle(m_ptr, x, y, w, h)); }
+
+    bool SetFont(const wxIDirectFBFontPtr& font)
+        { return Check(m_ptr->SetFont(m_ptr, font->GetRaw())); }
+
+    bool DrawString(const char *text, int bytes, int x, int y, int flags)
+    {
+        return Check(m_ptr->DrawString(m_ptr, text, bytes, x, y,
+                                         (DFBSurfaceTextFlags)flags));
+    }
+
+    bool Flip(const DFBRegion *region, int flags)
+    {
+        return Check(m_ptr->Flip(m_ptr, region, (DFBSurfaceFlipFlags)flags));
+    }
+
+    wxIDirectFBSurfacePtr GetSubSurface(const DFBRectangle *rect)
+    {
+        IDirectFBSurface *s;
+        if ( Check(m_ptr->GetSubSurface(m_ptr, rect, &s)) )
+            return new wxIDirectFBSurface(s);
+        else
+            return NULL;
+    }
+
+    wxIDirectFBPalettePtr GetPalette()
+    {
+        IDirectFBPalette *s;
+        if ( Check(m_ptr->GetPalette(m_ptr, &s)) )
+            return new wxIDirectFBPalette(s);
+        else
+            return NULL;
+    }
+
+    bool SetPalette(const wxIDirectFBPalettePtr& pal)
+        { return Check(m_ptr->SetPalette(m_ptr, pal->GetRaw())); }
+
+    bool SetBlittingFlags(int flags)
+    {
+        return Check(
+            m_ptr->SetBlittingFlags(m_ptr, (DFBSurfaceBlittingFlags)flags));
+    }
+
+    bool Blit(const wxIDirectFBSurfacePtr& source,
+              const DFBRectangle *source_rect,
+              int x, int y)
+    {
+        return Check(
+                m_ptr->Blit(m_ptr, source->GetRaw(), source_rect, x, y));
+    }
+};
+
+
+//-----------------------------------------------------------------------------
+// wxIDirectFBEventBuffer
+//-----------------------------------------------------------------------------
+
+struct wxIDirectFBEventBuffer : public wxDfbWrapper<IDirectFBEventBuffer>
+{
+    wxIDirectFBEventBuffer(IDirectFBEventBuffer *s) { Init(s); }
+
+    bool WakeUp()
+    {
+        return Check(m_ptr->WakeUp(m_ptr));
+    }
+
+    bool HasEvent()
+    {
+        // returns DFB_OK if there is >=1 event, DFB_BUFFEREMPTY otherwise
+        DFBResult r = m_ptr->HasEvent(m_ptr);
+
+        // NB: Check() also returns true for DFB_BUFFEREMPTY, so we can't just
+        //     return it's return value:
+        Check(r);
+        return (r == DFB_OK);
+    }
+
+    bool WaitForEventWithTimeout(unsigned secs, unsigned millisecs)
+    {
+        return Check(m_ptr->WaitForEventWithTimeout(m_ptr, secs, millisecs));
+    }
+
+    bool GetEvent(wxDFBEvent& event)
+    {
+        return Check(m_ptr->GetEvent(m_ptr, &event));
+    }
+};
+
+
+//-----------------------------------------------------------------------------
+// wxIDirectFBWindow
+//-----------------------------------------------------------------------------
+
+struct wxIDirectFBWindow : public wxDfbWrapper<IDirectFBWindow>
+{
+    wxIDirectFBWindow(IDirectFBWindow *s) { Init(s); }
+
+    bool GetID(DFBWindowID *id)
+        { return Check(m_ptr->GetID(m_ptr, id)); }
+
+    bool GetPosition(int *x, int *y)
+        { return Check(m_ptr->GetPosition(m_ptr, x, y)); }
+
+    bool GetSize(int *w, int *h)
+        { return Check(m_ptr->GetSize(m_ptr, w, h)); }
+
+    bool MoveTo(int x, int y)
+        { return Check(m_ptr->MoveTo(m_ptr, x, y)); }
+
+    bool Resize(int w, int h)
+        { return Check(m_ptr->Resize(m_ptr, w, h)); }
+
+    bool SetOpacity(__u8 opacity)
+        { return Check(m_ptr->SetOpacity(m_ptr, opacity)); }
+
+    bool SetStackingClass(DFBWindowStackingClass klass)
+        { return Check(m_ptr->SetStackingClass(m_ptr, klass)); }
+
+    wxIDirectFBSurfacePtr GetSurface()
+    {
+        IDirectFBSurface *s;
+        if ( Check(m_ptr->GetSurface(m_ptr, &s)) )
+            return new wxIDirectFBSurface(s);
+        else
+            return NULL;
+    }
+
+    bool AttachEventBuffer(const wxIDirectFBEventBufferPtr& buffer)
+        { return Check(m_ptr->AttachEventBuffer(m_ptr, buffer->GetRaw())); }
+
+    bool RequestFocus()
+        { return Check(m_ptr->RequestFocus(m_ptr)); }
+};
+
+
+//-----------------------------------------------------------------------------
+// wxIDirectFBDisplayLayer
+//-----------------------------------------------------------------------------
+
+struct wxIDirectFBDisplayLayer : public wxDfbWrapper<IDirectFBDisplayLayer>
+{
+    wxIDirectFBDisplayLayer(IDirectFBDisplayLayer *s) { Init(s); }
+
+    wxIDirectFBWindowPtr CreateWindow(const DFBWindowDescription *desc)
+    {
+        IDirectFBWindow *w;
+        if ( Check(m_ptr->CreateWindow(m_ptr, desc, &w)) )
+            return new wxIDirectFBWindow(w);
+        else
+            return NULL;
+    }
+
+    wxIDirectFBSurfacePtr GetSurface()
+    {
+        IDirectFBSurface *s;
+        if ( Check(m_ptr->GetSurface(m_ptr, &s)) )
+            return new wxIDirectFBSurface(s);
+        else
+            return NULL;
+    }
+
+    bool GetCursorPosition(int *x, int *y)
+        { return Check(m_ptr->GetCursorPosition(m_ptr, x, y)); }
+
+    bool WarpCursor(int x, int y)
+        { return Check(m_ptr->WarpCursor(m_ptr, x, y)); }
+};
+
+
+//-----------------------------------------------------------------------------
+// wxIDirectFB
+//-----------------------------------------------------------------------------
+
+struct wxIDirectFB : public wxDfbWrapper<IDirectFB>
+{
+    /**
+        Returns pointer to DirectFB singleton object, it never returns NULL
+        after wxApp was initialized. The object is cached, so calling this
+        method is cheap.
+     */
+    static wxIDirectFBPtr Get()
+    {
+        if ( !ms_ptr ) CreateDirectFB();
+        return ms_ptr;
+    }
+
+    bool SetVideoMode(int w, int h, int bpp)
+        { return Check(m_ptr->SetVideoMode(m_ptr, w, h, bpp)); }
+
+    wxIDirectFBSurfacePtr CreateSurface(const DFBSurfaceDescription *desc)
+    {
+        IDirectFBSurface *s;
+        if ( Check(m_ptr->CreateSurface(m_ptr, desc, &s)) )
+            return new wxIDirectFBSurface(s);
+        else
+            return NULL;
+    }
+
+    wxIDirectFBEventBufferPtr CreateEventBuffer()
+    {
+        IDirectFBEventBuffer *b;
+        if ( Check(m_ptr->CreateEventBuffer(m_ptr, &b)) )
+            return new wxIDirectFBEventBuffer(b);
+        else
+            return NULL;
+    }
+
+    wxIDirectFBFontPtr CreateFont(const char *filename,
+                                  const DFBFontDescription *desc)
+    {
+        IDirectFBFont *f;
+        if ( Check(m_ptr->CreateFont(m_ptr, filename, desc, &f)) )
+            return new wxIDirectFBFont(f);
+        else
+            return NULL;
+    }
+
+    wxIDirectFBDisplayLayerPtr GetDisplayLayer(DFBDisplayLayerID id)
+    {
+        IDirectFBDisplayLayer *l;
+        if ( Check(m_ptr->GetDisplayLayer(m_ptr, id, &l)) )
+            return new wxIDirectFBDisplayLayer(l);
+        else
+            return NULL;
+    }
+
+private:
+    wxIDirectFB(IDirectFB *ptr) { Init(ptr); }
+
+    // creates ms_ptr instance
+    static void CreateDirectFB();
+
+    static void CleanUp();
+    friend class wxApp; // calls CleanUp
+
+    // pointer to the singleton IDirectFB object
+    static wxIDirectFBPtr ms_ptr;
+};
+
+#endif // _WX_DFB_WRAPDFB_H_
index 31bdf0f3504a7b599004917702787e1c2ddcf38e..65d2be4478e8e6e398bc3f52c6c16694656d93ab 100644 (file)
@@ -39,20 +39,15 @@ wxApp::~wxApp()
 {
 }
 
-IDirectFBPtr wxApp::GetDirectFBInterface()
-{
-    return m_dfb;
-}
-
 bool wxApp::Initialize(int& argc, wxChar **argv)
 {
     if ( !wxAppBase::Initialize(argc, argv) )
         return false;
 
-    if ( !DFB_CALL( DirectFBInit(&argc, &argv) ) )
+    if ( !wxDfbCheckReturn(DirectFBInit(&argc, &argv)) )
         return false;
 
-    if ( !DFB_CALL( DirectFBCreate(&m_dfb) ) )
+    if ( !wxIDirectFB::Get() )
         return false;
 
     #warning "FIXME: theme override is temporary"
@@ -65,7 +60,7 @@ void wxApp::CleanUp()
 {
     wxAppBase::CleanUp();
 
-    m_dfb.Reset();
+    wxIDirectFB::CleanUp();
 }
 
 //-----------------------------------------------------------------------------
@@ -76,11 +71,11 @@ static wxVideoMode GetCurrentVideoMode()
 {
     wxVideoMode m;
 
-    IDirectFBSurfacePtr surface(wxDfbGetPrimarySurface());
+    wxIDirectFBSurfacePtr surface(wxDfbGetPrimarySurface());
     if ( !surface )
         return m; // invalid
 
-    DFB_CALL( surface->GetSize(surface, &m.w, &m.h) );
+    surface->GetSize(&m.w, &m.h);
     m.bpp = wxDfbGetSurfaceDepth(surface);
 
     return m;
@@ -96,7 +91,7 @@ wxVideoMode wxApp::GetDisplayMode() const
 
 bool wxApp::SetDisplayMode(const wxVideoMode& mode)
 {
-    if ( !DFB_CALL( m_dfb->SetVideoMode(m_dfb, mode.w, mode.h, mode.bpp) ) )
+    if ( !wxIDirectFB::Get()->SetVideoMode(mode.w, mode.h, mode.bpp) )
         return false;
 
     m_videoMode = mode;
index 691898dc8e656a5a67c670e47619c0e19bf8ddb4..dbb25257a504630ed9ea6214d4631a06d258a0d1 100644 (file)
@@ -174,10 +174,10 @@ public:
 #endif
     }
 
-    IDirectFBSurfacePtr m_surface;
-    wxMask             *m_mask;
+    wxIDirectFBSurfacePtr m_surface;
+    wxMask               *m_mask;
 #if wxUSE_PALETTE
-    wxPalette          *m_palette;
+    wxPalette            *m_palette;
 #endif
 };
 
@@ -208,9 +208,8 @@ bool wxBitmap::Create(int width, int height, int depth)
     desc.width = width;
     desc.height = height;
 
-    IDirectFBSurfacePtr surface;
-    IDirectFBPtr dfb(wxTheApp->GetDirectFBInterface());
-    if ( !DFB_CALL( dfb->CreateSurface(dfb, &desc, &surface) ) )
+    wxIDirectFBSurfacePtr surface(wxIDirectFB::Get()->CreateSurface(&desc));
+    if ( !surface )
         return false;
 
     m_refData = new wxBitmapRefData();
@@ -278,7 +277,7 @@ int wxBitmap::GetHeight() const
     wxCHECK_MSG( Ok(), -1, wxT("invalid bitmap") );
 
     int h = -1;
-    DFB_CALL( M_BITMAP->m_surface->GetSize(M_BITMAP->m_surface, NULL, &h) );
+    M_BITMAP->m_surface->GetSize(NULL, &h);
     return h;
 }
 
@@ -287,7 +286,7 @@ int wxBitmap::GetWidth() const
     wxCHECK_MSG( Ok(), -1, wxT("invalid bitmap") );
 
     int w = -1;
-    DFB_CALL( M_BITMAP->m_surface->GetSize(M_BITMAP->m_surface, &w, NULL) );
+    M_BITMAP->m_surface->GetSize(&w, NULL);
     return w;
 }
 
@@ -424,7 +423,7 @@ void wxBitmap::SetDepth(int depth)
 #warning "todo"
 }
 
-IDirectFBSurfacePtr wxBitmap::GetDirectFBSurface() const
+wxIDirectFBSurfacePtr wxBitmap::GetDirectFBSurface() const
 {
     wxCHECK_MSG( Ok(), NULL, wxT("invalid bitmap") );
 
index 44dc6d99cab00eabacf16c2d9cff05e37d61fd69..60afcaa00e93df56717e5ab39065abff2a3115a5 100644 (file)
@@ -46,12 +46,12 @@ wxDC::wxDC()
     m_ok = false;
 }
 
-wxDC::wxDC(const IDirectFBSurfacePtr& surface)
+wxDC::wxDC(const wxIDirectFBSurfacePtr& surface)
 {
     Init(surface);
 }
 
-void wxDC::Init(const IDirectFBSurfacePtr& surface)
+void wxDC::Init(const wxIDirectFBSurfacePtr& surface)
 {
     m_ok = (surface != NULL);
     wxCHECK_RET( surface != NULL, _T("invalid surface") );
@@ -93,7 +93,7 @@ void wxDC::DoSetClippingRegion(wxCoord cx, wxCoord cy, wxCoord cw, wxCoord ch)
     r.x2 = r.x1 + XLOG2DEVREL(cw) - 1;
     r.y2 = r.y1 + XLOG2DEVREL(ch) - 1;
 
-    if ( !DFB_CALL( m_surface->SetClip(m_surface, &r) ) )
+    if ( !m_surface->SetClip(&r) )
         return;
 
     m_clipX1 = cx;
@@ -114,7 +114,7 @@ void wxDC::DestroyClippingRegion()
 {
     wxCHECK_RET( Ok(), wxT("invalid dc") );
 
-    DFB_CALL( m_surface->SetClip(m_surface, NULL) );
+    m_surface->SetClip(NULL);
 
     ResetClipping();
 }
@@ -140,8 +140,7 @@ void wxDC::Clear()
         return;
 
     wxColour clr = m_backgroundBrush.GetColour();
-    DFB_CALL( m_surface->Clear(m_surface,
-                               clr.Red(), clr.Green(), clr.Blue(), clr.Alpha()) );
+    m_surface->Clear(clr.Red(), clr.Green(), clr.Blue(), clr.Alpha());
 }
 
 extern bool wxDoFloodFill(wxDC *dc, wxCoord x, wxCoord y,
@@ -175,9 +174,8 @@ void wxDC::DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
     if ( m_pen.GetStyle() == wxTRANSPARENT )
         return;
 
-    DFB_CALL( m_surface->DrawLine(m_surface,
-                                  XLOG2DEV(x1), YLOG2DEV(y1),
-                                  XLOG2DEV(x2), YLOG2DEV(y2)) );
+    m_surface->DrawLine(XLOG2DEV(x1), YLOG2DEV(y1),
+                        XLOG2DEV(x2), YLOG2DEV(y2));
 
     CalcBoundingBox(x1, y1);
     CalcBoundingBox(x2, y2);
@@ -241,14 +239,14 @@ void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
     if ( m_brush.GetStyle() != wxTRANSPARENT )
     {
         SelectColour(m_brush.GetColour());
-        DFB_CALL( m_surface->FillRectangle(m_surface, xx, yy, ww, hh) );
+        m_surface->FillRectangle(xx, yy, ww, hh);
         // restore pen's colour
         SelectColour(m_pen.GetColour());
     }
 
     if ( m_pen.GetStyle() != wxTRANSPARENT )
     {
-        DFB_CALL( m_surface->DrawRectangle(m_surface, xx, yy, ww, hh) );
+        m_surface->DrawRectangle(xx, yy, ww, hh);
     }
 
     CalcBoundingBox(x, y);
@@ -295,18 +293,13 @@ void wxDC::DoDrawText(const wxString& text, wxCoord x, wxCoord y)
         wxCHECK_RET( m_backgroundBrush.Ok(), wxT("invalid background brush") );
 
         SelectColour(m_backgroundBrush.GetColour());
-        DFB_CALL( m_surface->FillRectangle(m_surface,
-                                           xx, yy,
-                                           XLOG2DEVREL(w), YLOG2DEVREL(h)) );
+        m_surface->FillRectangle(xx, yy, XLOG2DEVREL(w), YLOG2DEVREL(h));
         // restore pen's colour
         SelectColour(m_pen.GetColour());
     }
 
     // finally draw the text itself:
-    DFB_CALL(m_surface->DrawString(m_surface,
-                                   wxSTR_TO_DFB(text), -1,
-                                   xx, yy,
-                                   DFBSurfaceTextFlags(DSTF_LEFT | DSTF_TOP)));
+    m_surface->DrawString(wxSTR_TO_DFB(text), -1, xx, yy, DSTF_LEFT | DSTF_TOP);
 }
 
 void wxDC::DoDrawRotatedText(const wxString& text,
@@ -338,8 +331,7 @@ void wxDC::SetBrush(const wxBrush& brush)
 
 void wxDC::SelectColour(const wxColour& clr)
 {
-    DFB_CALL( m_surface->SetColor(m_surface,
-                                  clr.Red(), clr.Green(), clr.Blue(), clr.Alpha()) );
+    m_surface->SetColor(clr.Red(), clr.Green(), clr.Blue(), clr.Alpha());
     #warning "use SetColorIndex?"
 }
 
@@ -359,7 +351,7 @@ void wxDC::SetFont(const wxFont& font)
     if ( !font.Ok() )
         return;
 
-    if ( !DFB_CALL( m_surface->SetFont(m_surface, font.GetDirectFBFont()) ) )
+    if ( !m_surface->SetFont(font.GetDirectFBFont()) )
         return;
 
     m_font = font;
@@ -416,8 +408,7 @@ wxCoord wxDC::GetCharHeight() const
     wxCHECK_MSG( m_font.Ok(), -1, wxT("no font selected") );
 
     int h = -1;
-    IDirectFBFontPtr f = m_font.GetDirectFBFont();
-    DFB_CALL( f->GetHeight(f, &h) );
+    m_font.GetDirectFBFont()->GetHeight(&h);
     return YDEV2LOGREL(h);
 }
 
@@ -427,8 +418,7 @@ wxCoord wxDC::GetCharWidth() const
     wxCHECK_MSG( m_font.Ok(), -1, wxT("no font selected") );
 
     int w = -1;
-    IDirectFBFontPtr f = m_font.GetDirectFBFont();
-    DFB_CALL( f->GetStringWidth(f, "H", 1, &w) );
+    m_font.GetDirectFBFont()->GetStringWidth("H", 1, &w);
     // VS: YDEV is corrent, it should *not* be XDEV, because font's are only
     //     scaled according to m_scaleY
     return YDEV2LOGREL(w);
@@ -451,9 +441,9 @@ void wxDC::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y,
 
     wxCoord xx = 0, yy = 0;
     DFBRectangle rect;
-    IDirectFBFontPtr f = m_font.GetDirectFBFont();
+    wxIDirectFBFontPtr f = m_font.GetDirectFBFont();
 
-    if (DFB_CALL(f->GetStringExtents(f, wxSTR_TO_DFB(string), -1, &rect, NULL)))
+    if ( f->GetStringExtents(wxSTR_TO_DFB(string), -1, &rect, NULL) )
     {
         // VS: YDEV is corrent, it should *not* be XDEV, because font's are
         //     only scaled according to m_scaleY
@@ -463,7 +453,7 @@ void wxDC::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y,
         if ( descent )
         {
             int d;
-            if ( DFB_CALL( f->GetDescender(f, &d) ) )
+            if ( f->GetDescender(&d) )
                 *descent = YDEV2LOGREL(-d);
             else
                 *descent = 0;
@@ -614,7 +604,7 @@ void wxDC::DoGetSize(int *w, int *h) const
 {
     wxCHECK_RET( Ok(), wxT("invalid dc") );
 
-    DFB_CALL( m_surface->GetSize(m_surface, w, h) );
+    m_surface->GetSize(w, h);
 }
 
 void wxDC::DoGetSizeMM(int *width, int *height) const
index 257d73b45b8487112c0fcb6c3da87df00f017c01..7f02fbeddea73cf042a483654aacd21413f98696 100644 (file)
@@ -65,9 +65,9 @@ wxClientDCBase::wxClientDCBase(wxWindow *win)
     wxRect rect = win->GetClientRect();
     DFBRectangle dfbrect = { rect.x, rect.y, rect.width, rect.height };
 
-    IDirectFBSurfacePtr winsurf(win->GetDfbSurface());
-    IDirectFBSurfacePtr subsurf;
-    if ( !DFB_CALL( winsurf->GetSubSurface(winsurf, &dfbrect, &subsurf) ) )
+    wxIDirectFBSurfacePtr subsurf(
+            win->GetDfbSurface()->GetSubSurface(&dfbrect));
+    if ( !subsurf )
         return;
 
     Init(subsurf);
@@ -86,9 +86,9 @@ IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC)
 wxClientDC::~wxClientDC()
 {
     // flip to surface so that the changes become visible
-    IDirectFBSurfacePtr surface(GetDirectFBSurface());
+    wxIDirectFBSurfacePtr surface(GetDirectFBSurface());
     if ( surface )
-        surface->Flip(surface, NULL, DSFLIP_NONE);
+        surface->Flip(NULL, DSFLIP_NONE);
 }
 
 //-----------------------------------------------------------------------------
index 647e52ec7b0fe5b4565b620bab68bb82a5f91c03..78bca48df8a374dd731db0c736f013e9f647b9a6 100644 (file)
@@ -38,7 +38,7 @@
 // wxEventLoop initialization
 //-----------------------------------------------------------------------------
 
-IDirectFBEventBufferPtr wxEventLoop::ms_buffer;
+wxIDirectFBEventBufferPtr wxEventLoop::ms_buffer;
 
 wxEventLoop::wxEventLoop()
 {
@@ -49,12 +49,11 @@ wxEventLoop::wxEventLoop()
 /* static */
 void wxEventLoop::InitBuffer()
 {
-    IDirectFBPtr dfb(wxTheApp->GetDirectFBInterface());
-    DFB_CALL( dfb->CreateEventBuffer(dfb, &ms_buffer) );
+    ms_buffer = wxIDirectFB::Get()->CreateEventBuffer();
 }
 
 /* static */
-IDirectFBEventBufferPtr wxEventLoop::GetDirectFBEventBuffer()
+wxIDirectFBEventBufferPtr wxEventLoop::GetDirectFBEventBuffer()
 {
     if ( !ms_buffer )
         InitBuffer();
@@ -70,8 +69,7 @@ bool wxEventLoop::Pending() const
 {
     wxCHECK_MSG( ms_buffer, false, _T("invalid event buffer") );
 
-    // returns DFB_OK if there is >=1 event, DFB_BUFFER_EMPTY otherwise
-    return ms_buffer->HasEvent(ms_buffer) == DFB_OK;
+    return ms_buffer->HasEvent();
 }
 
 bool wxEventLoop::Dispatch()
@@ -85,27 +83,28 @@ bool wxEventLoop::Dispatch()
     //     FIXME: call NotifyTimers() from here (and loop) instead?
     const int TIMEOUT = 100;
 
-    DFBResult ret = ms_buffer->WaitForEventWithTimeout(ms_buffer, 0, TIMEOUT);
-
-    switch ( ret )
+    if ( ms_buffer->WaitForEventWithTimeout(0, TIMEOUT) )
     {
-        case DFB_OK:
+        switch ( ms_buffer->GetLastResult() )
         {
-            wxDFBEvent e;
-            ms_buffer->GetEvent(ms_buffer, &e);
-            HandleDFBEvent(e);
-            break;
+            case DFB_OK:
+            {
+                wxDFBEvent e;
+                ms_buffer->GetEvent(e);
+                HandleDFBEvent(e);
+                break;
+            }
+
+            case DFB_TIMEOUT:
+                // timed out, pretend we processed an event so that
+                // OnNextIteration is called
+                break;
+
+            default:
+                // don't terminate the loop due to errors (they were reported
+                // already by ms_buffer)
+                break;
         }
-
-        case DFB_TIMEOUT:
-            // timed out, pretend we processed an event so that OnNextIteration
-            // is called
-            break;
-
-        default:
-            // report any errors, but don't terminate the loop due to them
-            wxDfbCheckReturn(ret);
-            break;
     }
 
     return true;
@@ -115,7 +114,7 @@ void wxEventLoop::WakeUp()
 {
     wxCHECK_RET( ms_buffer, _T("invalid event buffer") );
 
-    DFB_CALL( ms_buffer->WakeUp(ms_buffer) );
+    ms_buffer->WakeUp();
 }
 
 void wxEventLoop::OnNextIteration()
index e954b9faf356ceaef5b8934bf82fa8a6871f3aeb..e17ff385fda1fc7d8f86e7a7bbf7157decc35b2f 100644 (file)
@@ -37,7 +37,7 @@
 // ----------------------------------------------------------------------------
 
 // FIXME: for now, always use single font
-static IDirectFBFontPtr gs_font = NULL;
+static wxIDirectFBFontPtr gs_font = NULL;
 static unsigned gs_fontRefCnt = 0;
 
 class wxFontRefData : public wxObjectRefData
@@ -71,12 +71,10 @@ public:
         // FIXME: always use default font for now
         if ( !gs_font )
         {
-            IDirectFBPtr dfb(wxTheApp->GetDirectFBInterface());
-
             DFBFontDescription desc;
             desc.flags = (DFBFontDescriptionFlags)0;
-            IDirectFBFontPtr f;
-            if ( DFB_CALL( dfb->CreateFont(dfb, NULL, &desc, &f) ) )
+            wxIDirectFBFontPtr f(wxIDirectFB::Get()->CreateFont(NULL, &desc));
+            if ( f )
                 gs_font = f;
         }
         if ( gs_font ) // the above may fail
@@ -104,7 +102,7 @@ public:
     }
 
     wxNativeFontInfo m_info;
-    IDirectFBFontPtr m_font;
+    wxIDirectFBFontPtr m_font;
 };
 
 
@@ -148,7 +146,7 @@ wxObjectRefData *wxFont::CloneRefData(const wxObjectRefData *data) const
 // accessors
 // ----------------------------------------------------------------------------
 
-IDirectFBFontPtr wxFont::GetDirectFBFont() const
+wxIDirectFBFontPtr wxFont::GetDirectFBFont() const
 {
     wxCHECK_MSG( Ok(), NULL, wxT("invalid font") );
 
diff --git a/src/dfb/ifacehelpers.cpp b/src/dfb/ifacehelpers.cpp
deleted file mode 100644 (file)
index 954a016..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Name:        src/dfb/ifacehelpers.cpp
-// Purpose:     helpers for dealing with DFB interfaces
-// Author:      Vaclav Slavik
-// Created:     2006-08-09
-// RCS-ID:      $Id$
-// Copyright:   (c) 2006 REA Elektronik GmbH
-// Licence:     wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-// For compilers that support precompilation, includes "wx.h".
-#include "wx/wxprec.h"
-
-#ifdef __BORLANDC__
-    #pragma hdrstop
-#endif
-
-#include "wx/dfb/ifacehelpers.h"
-#include <directfb.h>
-
-//-----------------------------------------------------------------------------
-// wxDfbPtr
-//-----------------------------------------------------------------------------
-
-// NB: We can't call AddRef() and Release() directly from wxDfbPtr<T> because
-//     we don't have full type declarations for them if we don't include
-//     <directfb.h> (which user wx headers can't). Fortunately, all DirectFB
-//     interfaces are structs with common beginning that contains pointers to
-//     AddRef and Release, so we can safely cast interface pointer to void* and
-//     then back to arbitrary interface pointer and these calls will still work
-//     correctly. For this purpose, we declare a dummy DFB interface here.
-
-DECLARE_INTERFACE(wxDummyDFBInterface)
-DEFINE_INTERFACE(wxDummyDFBInterface, )
-
-/* static */
-void wxDfbPtrBase::DoAddRef(void *ptr)
-{
-    wxDummyDFBInterface *p = (wxDummyDFBInterface*)ptr;
-    p->AddRef(p);
-}
-
-/* static */
-void wxDfbPtrBase::DoRelease(void *ptr)
-{
-    wxDummyDFBInterface *p = (wxDummyDFBInterface*)ptr;
-    p->Release(p);
-}
index 98b77b9ea27ac0579ee759cd10b8d3ebbd8729f8..2a115daad182dabd3ba8b0fa806764ec86ead7be 100644 (file)
@@ -99,7 +99,7 @@ bool wxTopLevelWindowDFB::Create(wxWindow *parent,
         pos.y = 0;
 
     // create DirectFB window:
-    IDirectFBDisplayLayerPtr layer = wxDfbGetDisplayLayer();
+    wxIDirectFBDisplayLayerPtr layer = wxDfbGetDisplayLayer();
     wxCHECK_MSG( layer, false, _T("no display layer") );
 
     DFBWindowDescription desc;
@@ -111,17 +111,18 @@ bool wxTopLevelWindowDFB::Create(wxWindow *parent,
     desc.posy = pos.y;
     desc.width = size.x;
     desc.height = size.y;
-    if ( !DFB_CALL( layer->CreateWindow(layer, &desc, &m_dfbwin) ) )
+    m_dfbwin = layer->CreateWindow(&desc);
+    if ( !layer )
         return false;
 
     // add the new TLW to DFBWindowID->wxTLW map:
     DFBWindowID winid;
-    if ( !DFB_CALL( m_dfbwin->GetID(m_dfbwin, &winid) ) )
+    if ( !m_dfbwin->GetID(&winid) )
         return false;
     gs_dfbWindowsMap[winid] = this;
 
     // TLWs are created initially hidden:
-    if ( !DFB_CALL( m_dfbwin->SetOpacity(m_dfbwin, 0) ) )
+    if ( !m_dfbwin->SetOpacity(wxALPHA_TRANSPARENT) )
         return false;
 
     wxWindow::Create(NULL, id, pos, size, style, name);
@@ -135,12 +136,11 @@ bool wxTopLevelWindowDFB::Create(wxWindow *parent,
 
     if ( style & (wxSTAY_ON_TOP | wxPOPUP_WINDOW) )
     {
-        DFB_CALL( m_dfbwin->SetStackingClass(m_dfbwin, DWSC_UPPER) );
+        m_dfbwin->SetStackingClass(DWSC_UPPER);
     }
 
     // direct events in this window to the global event buffer:
-    DFB_CALL( m_dfbwin->AttachEventBuffer(
-                            m_dfbwin, wxEventLoop::GetDirectFBEventBuffer()) );
+    m_dfbwin->AttachEventBuffer(wxEventLoop::GetDirectFBEventBuffer());
 
     return true;
 }
@@ -164,7 +164,7 @@ wxTopLevelWindowDFB::~wxTopLevelWindowDFB()
 
     // remove the TLW from DFBWindowID->wxTLW map:
     DFBWindowID winid;
-    if ( DFB_CALL( m_dfbwin->GetID(m_dfbwin, &winid) ) )
+    if ( m_dfbwin->GetID(&winid) )
         gs_dfbWindowsMap.erase(winid);
 }
 
@@ -174,12 +174,12 @@ wxTopLevelWindowDFB::~wxTopLevelWindowDFB()
 
 void wxTopLevelWindowDFB::DoGetPosition(int *x, int *y) const
 {
-    DFB_CALL( m_dfbwin->GetPosition(m_dfbwin, x, y) );
+    m_dfbwin->GetPosition(x, y);
 }
 
 void wxTopLevelWindowDFB::DoGetSize(int *width, int *height) const
 {
-    DFB_CALL( m_dfbwin->GetSize(m_dfbwin, width, height) );
+    m_dfbwin->GetSize(width, height);
 }
 
 void wxTopLevelWindowDFB::DoMoveWindow(int x, int y, int width, int height)
@@ -187,13 +187,13 @@ void wxTopLevelWindowDFB::DoMoveWindow(int x, int y, int width, int height)
     wxPoint curpos = GetPosition();
     if ( curpos.x != x || curpos.y != y )
     {
-        DFB_CALL( m_dfbwin->MoveTo(m_dfbwin, x, y) );
+        m_dfbwin->MoveTo(x, y);
     }
 
     wxSize cursize = GetSize();
     if ( cursize.x != width || cursize.y != height )
     {
-        DFB_CALL( m_dfbwin->Resize(m_dfbwin, width, height) );
+        m_dfbwin->Resize(width, height);
         // we must repaint the window after it changed size:
         Refresh();
     }
@@ -242,7 +242,7 @@ bool wxTopLevelWindowDFB::Show(bool show)
         return false;
 
     // hide/show the window by setting its opacity to 0/full:
-    DFB_CALL( m_dfbwin->SetOpacity(m_dfbwin, show ? m_opacity : 0) );
+    m_dfbwin->SetOpacity(show ? m_opacity : 0);
 
     // If this is the first time Show was called, send size event,
     // so that the frame can adjust itself (think auto layout or single child)
@@ -266,7 +266,7 @@ bool wxTopLevelWindowDFB::SetTransparent(wxByte alpha)
 {
     if ( IsShown() )
     {
-        if ( !DFB_CALL( m_dfbwin->SetOpacity(m_dfbwin, alpha) ) )
+        if ( !m_dfbwin->SetOpacity(alpha) )
             return false;
     }
 
@@ -328,11 +328,9 @@ bool wxTopLevelWindowDFB::IsIconized() const
 // surfaces and painting
 // ----------------------------------------------------------------------------
 
-IDirectFBSurfacePtr wxTopLevelWindowDFB::ObtainDfbSurface() const
+wxIDirectFBSurfacePtr wxTopLevelWindowDFB::ObtainDfbSurface() const
 {
-    IDirectFBSurfacePtr surface;
-    DFB_CALL( m_dfbwin->GetSurface(m_dfbwin, &surface) );
-    return surface;
+    return m_dfbwin->GetSurface();
 }
 
 void wxTopLevelWindowDFB::HandleQueuedPaintRequests()
@@ -380,8 +378,7 @@ void wxTopLevelWindowDFB::HandleQueuedPaintRequests()
                    paintedRect.GetRight(), paintedRect.GetBottom()};
     DFBRegion *rptr = (winRect == paintedRect) ? NULL : &r;
 
-    IDirectFBSurfacePtr surface(GetDfbSurface());
-    DFB_CALL( surface->Flip(surface, rptr, DSFLIP_NONE) );
+    GetDfbSurface()->Flip(rptr, DSFLIP_NONE);
 }
 
 void wxTopLevelWindowDFB::DoRefreshRect(const wxRect& rect, bool eraseBack)
index e9e8d8ebbee36c21d802c25c6a77d5215b3e07b8..b3ab8d5b257a39edb2f85d65647ffd56d04b9e31 100644 (file)
@@ -87,8 +87,8 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height)
 // surface manipulation helpers
 //-----------------------------------------------------------------------------
 
-IDirectFBSurfacePtr wxDfbCloneSurface(const IDirectFBSurfacePtr& s,
-                                      wxDfbCloneSurfaceMode mode)
+wxIDirectFBSurfacePtr wxDfbCloneSurface(const wxIDirectFBSurfacePtr& s,
+                                        wxDfbCloneSurfaceMode mode)
 {
     if ( !s )
         return NULL;
@@ -96,63 +96,56 @@ IDirectFBSurfacePtr wxDfbCloneSurface(const IDirectFBSurfacePtr& s,
     DFBSurfaceDescription desc;
     desc.flags = (DFBSurfaceDescriptionFlags)(
             DSDESC_CAPS | DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT);
-    s->GetCapabilities(s, &desc.caps);
-    s->GetSize(s, &desc.width, &desc.height);
-    s->GetPixelFormat(s, &desc.pixelformat);
+    s->GetCapabilities(&desc.caps);
+    s->GetSize(&desc.width, &desc.height);
+    s->GetPixelFormat(&desc.pixelformat);
 
-    IDirectFBPtr dfb(wxTheApp->GetDirectFBInterface());
-
-    IDirectFBSurfacePtr snew;
-    if ( !DFB_CALL( dfb->CreateSurface(dfb, &desc, &snew) ) )
+    wxIDirectFBSurfacePtr snew(wxIDirectFB::Get()->CreateSurface(&desc));
+    if ( !snew )
         return NULL;
 
-    IDirectFBPalettePtr pal;
-    if ( s->GetPalette(s, &pal) == DFB_OK )
+    if ( desc.pixelformat == DSPF_LUT8 )
     {
-        if ( !DFB_CALL( snew->SetPalette(snew, pal) ) )
-            return NULL;
+        wxIDirectFBPalettePtr pal(s->GetPalette());
+        if ( s )
+        {
+            if ( !snew->SetPalette(pal) )
+                return NULL;
+        }
     }
 
     if ( mode == wxDfbCloneSurface_CopyPixels )
     {
-        if ( !DFB_CALL( snew->SetBlittingFlags(snew, DSBLIT_NOFX) ) )
+        if ( !snew->SetBlittingFlags(DSBLIT_NOFX) )
             return NULL;
-        if ( !DFB_CALL( snew->Blit(snew, s, NULL, 0, 0) ) )
+        if ( !snew->Blit(s, NULL, 0, 0) )
             return NULL;
     }
 
     return snew;
 }
 
-int wxDfbGetSurfaceDepth(const IDirectFBSurfacePtr& s)
+int wxDfbGetSurfaceDepth(const wxIDirectFBSurfacePtr& s)
 {
     wxCHECK_MSG( s, -1, _T("invalid surface") );
 
     DFBSurfacePixelFormat format = DSPF_UNKNOWN;
 
-    if ( !DFB_CALL( s->GetPixelFormat(s, &format) ) )
+    if ( !s->GetPixelFormat(&format) )
         return -1;
 
     return DFB_BITS_PER_PIXEL(format);
 }
 
-IDirectFBDisplayLayerPtr wxDfbGetDisplayLayer()
+wxIDirectFBDisplayLayerPtr wxDfbGetDisplayLayer()
 {
-    IDirectFBPtr dfb(wxTheApp->GetDirectFBInterface());
-
-    IDirectFBDisplayLayerPtr layer;
-    if ( !DFB_CALL( dfb->GetDisplayLayer(dfb, DLID_PRIMARY, &layer) ) )
-        return NULL;
-
-    return layer;
+    return wxIDirectFB::Get()->GetDisplayLayer(DLID_PRIMARY);
 }
 
-IDirectFBSurfacePtr wxDfbGetPrimarySurface()
+wxIDirectFBSurfacePtr wxDfbGetPrimarySurface()
 {
-    IDirectFBDisplayLayerPtr layer(wxDfbGetDisplayLayer());
-    IDirectFBSurfacePtr surface;
-    DFB_CALL( layer->GetSurface(layer, &surface) );
-    return surface;
+    wxIDirectFBDisplayLayerPtr layer(wxDfbGetDisplayLayer());
+    return layer ? layer->GetSurface() : NULL;
 }
 
 
@@ -162,8 +155,9 @@ IDirectFBSurfacePtr wxDfbGetPrimarySurface()
 
 void wxGetMousePosition(int *x, int *y)
 {
-    IDirectFBDisplayLayerPtr layer(wxDfbGetDisplayLayer());
-    DFB_CALL( layer->GetCursorPosition(layer, x, y) );
+    wxIDirectFBDisplayLayerPtr layer(wxDfbGetDisplayLayer());
+    if ( layer )
+        layer->GetCursorPosition(x, y);
 }
 
 wxPoint wxGetMousePosition()
index 532bf24b929d55819a465eeb713d9786a1763e8a..d79093378a3bfd13b2f994f0a16061adf69dac6b 100644 (file)
@@ -141,23 +141,21 @@ bool wxWindowDFB::Create(wxWindow *parent,
 // surface access
 // ---------------------------------------------------------------------------
 
-IDirectFBSurfacePtr wxWindowDFB::ObtainDfbSurface() const
+wxIDirectFBSurfacePtr wxWindowDFB::ObtainDfbSurface() const
 {
     wxCHECK_MSG( m_parent, NULL, _T("parentless window?") );
 
-    IDirectFBSurfacePtr parentSurface(m_parent->GetDfbSurface());
+    wxIDirectFBSurfacePtr parentSurface(m_parent->GetDfbSurface());
     wxCHECK_MSG( parentSurface, NULL, _T("invalid parent surface") );
 
     wxRect r(GetRect());
     AdjustForParentClientOrigin(r.x, r.y, 0);
     DFBRectangle rect = { r.x, r.y, r.width, r.height };
 
-    IDirectFBSurfacePtr surface;
-    DFB_CALL( parentSurface->GetSubSurface(parentSurface, &rect, &surface) );
-    return surface;
+    return parentSurface->GetSubSurface(&rect);
 }
 
-IDirectFBSurfacePtr wxWindowDFB::GetDfbSurface()
+wxIDirectFBSurfacePtr wxWindowDFB::GetDfbSurface()
 {
     if ( !m_surface )
     {
@@ -192,9 +190,9 @@ void wxWindowDFB::SetFocus()
 
 #warning "FIXME: implement in terms of DWET_{GOT,LOST}FOCUS"
 
-    IDirectFBWindowPtr dfbwin(m_tlw->GetDirectFBWindow());
+    wxIDirectFBWindowPtr dfbwin(m_tlw->GetDirectFBWindow());
 #warning "FIXME: RequestFocus() may only be called on visible TLW"
-    if ( !DFB_CALL( dfbwin->RequestFocus(dfbwin) ) )
+    if ( !dfbwin->RequestFocus() )
         return;
 
     gs_focusedWindow = this;
@@ -368,10 +366,10 @@ void wxWindowDFB::WarpPointer(int x, int y)
     if ( x >= w ) x = w-1;
     if ( y >= h ) y = h-1;
 
-    IDirectFBDisplayLayerPtr layer = wxDfbGetDisplayLayer();
+    wxIDirectFBDisplayLayerPtr layer(wxDfbGetDisplayLayer());
     wxCHECK_RET( layer, _T("no display layer") );
 
-    layer->WarpCursor(layer, x, y);
+    layer->WarpCursor(x, y);
 }
 
 // Set this window to be the child of 'parent'.
diff --git a/src/dfb/wrapdfb.cpp b/src/dfb/wrapdfb.cpp
new file mode 100644 (file)
index 0000000..406d7a6
--- /dev/null
@@ -0,0 +1,97 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        src/dfb/wrapdfb.cpp
+// Purpose:     wx wrappers for DirectFB interfaces
+// Author:      Vaclav Slavik
+// Created:     2006-09-04
+// RCS-ID:      $Id$
+// Copyright:   (c) 2006 REA Elektronik GmbH
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#include "wx/dfb/wrapdfb.h"
+
+//-----------------------------------------------------------------------------
+// wxDfbCheckReturn
+//-----------------------------------------------------------------------------
+
+bool wxDfbCheckReturn(DFBResult code)
+{
+    switch ( code )
+    {
+        case DFB_OK:
+            return true;
+
+        // these are programming errors, assert:
+        #define DFB_ASSERT(code)                                        \
+            case code:                                                  \
+                wxFAIL_MSG( _T("DirectFB error: ") _T(#code) );         \
+                return false                                            \
+
+        DFB_ASSERT(DFB_DEAD);
+        DFB_ASSERT(DFB_UNSUPPORTED);
+        DFB_ASSERT(DFB_UNIMPLEMENTED);
+        DFB_ASSERT(DFB_INVARG);
+        DFB_ASSERT(DFB_NOIMPL);
+        DFB_ASSERT(DFB_MISSINGFONT);
+        DFB_ASSERT(DFB_THIZNULL);
+        DFB_ASSERT(DFB_INVAREA);
+        DFB_ASSERT(DFB_DESTROYED);
+        DFB_ASSERT(DFB_NOSUCHMETHOD);
+        DFB_ASSERT(DFB_NOSUCHINSTANCE);
+        DFB_ASSERT(DFB_VERSIONMISMATCH);
+
+        #undef  DFB_ASSERT
+
+        // these are not errors, but valid return codes:
+        case DFB_INTERRUPTED:
+        case DFB_BUFFEREMPTY:
+            return true;
+
+        default:
+            // FIXME: should handle the errors individually
+            wxLogError(_("DirectFB error %d occured."), (int)code);
+            return false;
+    }
+}
+
+//-----------------------------------------------------------------------------
+// wxDfbPtrBase
+//-----------------------------------------------------------------------------
+
+/* static */
+void wxDfbPtrBase::DoAddRef(wxDfbWrapperBase *ptr)
+{
+    ptr->AddRef();
+}
+
+void wxDfbPtrBase::DoRelease(wxDfbWrapperBase *ptr)
+{
+    ptr->Release();
+}
+
+//-----------------------------------------------------------------------------
+// wxIDirectFB
+//-----------------------------------------------------------------------------
+
+wxIDirectFBPtr wxIDirectFB::ms_ptr;
+
+/* static */
+void wxIDirectFB::CreateDirectFB()
+{
+    IDirectFB *dfb;
+    if ( wxDfbCheckReturn(DirectFBCreate(&dfb)) )
+        ms_ptr = new wxIDirectFB(dfb);
+}
+
+/* static */
+void wxIDirectFB::CleanUp()
+{
+    ms_ptr.Reset();
+}