From 68be9f090f422450d333385cf62c9b4d350674be Mon Sep 17 00:00:00 2001
From: Julian Smart <julian@anthemion.co.uk>
Date: Wed, 1 Mar 2000 11:05:49 +0000
Subject: [PATCH] Added wxDragImage generic implementation and sample; added
 mask handling to Motif's wxImage::ConvertToBitmap

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6372 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 configure.in                   |   2 +-
 distrib/msw/generic.rsp        |  10 +
 distrib/msw/makefile.rsp       |   1 +
 distrib/msw/tmake/filelist.txt |   2 +
 distrib/msw/vc.rsp             |   3 +
 docs/latex/wx/classes.tex      |   1 +
 docs/latex/wx/dragimag.tex     | 155 ++++++++++
 include/wx/dragimag.h          |  35 ++-
 include/wx/generic/dragimgg.h  | 211 ++++++++++++++
 include/wx/motif/bitmap.h      |   3 +-
 include/wx/msw/dragimag.h      |  46 ++-
 samples/configure              |   1 +
 samples/configure.in           |   1 +
 samples/dragimag/Makefile.in   |  21 ++
 samples/dragimag/backgrnd.png  | Bin 0 -> 16672 bytes
 samples/dragimag/dragicon.ico  | Bin 0 -> 766 bytes
 samples/dragimag/dragicon.xpm  |  44 +++
 samples/dragimag/makefile.b32  |  16 ++
 samples/dragimag/makefile.bcc  |  19 ++
 samples/dragimag/makefile.dos  |  17 ++
 samples/dragimag/makefile.g95  |  16 ++
 samples/dragimag/makefile.sc   |  36 +++
 samples/dragimag/makefile.sl   |  18 ++
 samples/dragimag/makefile.twn  |  43 +++
 samples/dragimag/makefile.unx  |  35 +++
 samples/dragimag/makefile.va   |  25 ++
 samples/dragimag/makefile.vc   |  18 ++
 samples/dragimag/makefile.wat  |  15 +
 samples/dragimag/mondrian.ico  | Bin 0 -> 766 bytes
 samples/dragimag/mondrian.xpm  |  44 +++
 samples/dragimag/shape01.png   | Bin 0 -> 2784 bytes
 samples/dragimag/shape02.png   | Bin 0 -> 2333 bytes
 samples/dragimag/shape03.png   | Bin 0 -> 2501 bytes
 samples/dragimag/test.cpp      | 512 +++++++++++++++++++++++++++++++++
 samples/dragimag/test.def      |   7 +
 samples/dragimag/test.h        | 156 ++++++++++
 samples/dragimag/test.rc       |   5 +
 src/common/image.cpp           |  60 ++--
 src/generic/dragimgg.cpp       | 462 +++++++++++++++++++++++++++++
 src/gtk/files.lst              |   3 +
 src/gtk1/files.lst             |   3 +
 src/html/htmprint.cpp          |  22 +-
 src/motif/dcscreen.cpp         |   4 +-
 src/motif/files.lst            |   3 +
 src/msw/dragimag.cpp           | 140 +++++++--
 src/msw/makefile.b32           |   5 +-
 src/msw/makefile.bcc           |   5 +-
 src/msw/makefile.dos           |  19 +-
 src/msw/makefile.g95           |   1 +
 src/msw/makefile.vc            |   3 +-
 src/msw/makefile.wat           |   1 +
 src/msw/treectrl.cpp           |  17 +-
 src/wxvc.dsp                   |   4 +
 src/wxvc_dll.dsp               |   4 +
 utils/projgen/makeproj.cpp     |   1 +
 55 files changed, 2177 insertions(+), 98 deletions(-)
 create mode 100644 docs/latex/wx/dragimag.tex
 create mode 100644 include/wx/generic/dragimgg.h
 create mode 100644 samples/dragimag/Makefile.in
 create mode 100644 samples/dragimag/backgrnd.png
 create mode 100644 samples/dragimag/dragicon.ico
 create mode 100644 samples/dragimag/dragicon.xpm
 create mode 100644 samples/dragimag/makefile.b32
 create mode 100644 samples/dragimag/makefile.bcc
 create mode 100644 samples/dragimag/makefile.dos
 create mode 100644 samples/dragimag/makefile.g95
 create mode 100644 samples/dragimag/makefile.sc
 create mode 100644 samples/dragimag/makefile.sl
 create mode 100644 samples/dragimag/makefile.twn
 create mode 100644 samples/dragimag/makefile.unx
 create mode 100644 samples/dragimag/makefile.va
 create mode 100644 samples/dragimag/makefile.vc
 create mode 100644 samples/dragimag/makefile.wat
 create mode 100644 samples/dragimag/mondrian.ico
 create mode 100644 samples/dragimag/mondrian.xpm
 create mode 100644 samples/dragimag/shape01.png
 create mode 100644 samples/dragimag/shape02.png
 create mode 100644 samples/dragimag/shape03.png
 create mode 100644 samples/dragimag/test.cpp
 create mode 100644 samples/dragimag/test.def
 create mode 100644 samples/dragimag/test.h
 create mode 100644 samples/dragimag/test.rc
 create mode 100644 src/generic/dragimgg.cpp

diff --git a/configure.in b/configure.in
index a6a88b32f8..faa58f106f 100644
--- a/configure.in
+++ b/configure.in
@@ -3397,7 +3397,7 @@ if test "$wxUSE_GUI" = "yes"; then
 
     dnl TODO some samples are never built so far:
     dnl      ipc, mfc, nativdlg, oleauto, ownerdrw, proplist
-    SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS controls dialogs drawing dynamic \
+    SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS controls dialogs dragimag drawing dynamic \
                      font fractal image minimal richedit"
 
     dnl this is needed to be able to find AFM files
diff --git a/distrib/msw/generic.rsp b/distrib/msw/generic.rsp
index 9dc78798cb..a980f6cd88 100644
--- a/distrib/msw/generic.rsp
+++ b/distrib/msw/generic.rsp
@@ -1035,6 +1035,16 @@ samples/rotate/*.xpm
 samples/rotate/*.txt
 samples/rotate/*.bmp
 
+samples/dragimag/*.cpp
+samples/dragimag/*.h
+samples/dragimag/makefile*
+samples/dragimag/*.rc
+samples/dragimag/*.def
+samples/dragimag/*.ico
+samples/dragimag/*.xpm
+samples/dragimag/*.png
+samples/dragimag/*.bmp
+
 samples/treelay/*.cpp
 samples/treelay/*.h
 samples/treelay/makefile*
diff --git a/distrib/msw/makefile.rsp b/distrib/msw/makefile.rsp
index 35b2761e03..9c309552b9 100644
--- a/distrib/msw/makefile.rsp
+++ b/distrib/msw/makefile.rsp
@@ -12,6 +12,7 @@ samples/dialogs/Makefile.in
 samples/dnd/Makefile.in
 samples/docview/Makefile.in
 samples/docvwmdi/Makefile.in
+samples/dragimag/Makefile.in
 samples/drawing/Makefile.in
 samples/dynamic/Makefile.in
 samples/exec/Makefile.in
diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt
index 801e92b7a2..74623a3143 100644
--- a/distrib/msw/tmake/filelist.txt
+++ b/distrib/msw/tmake/filelist.txt
@@ -66,6 +66,7 @@ choicdgg.cpp	G
 colrdlgg.cpp	G	G
 dcpsg.cpp	G	U
 dirdlgg.cpp	G	16,P
+dragimgg.cpp	G	P
 fontdlgg.cpp	G	G,R,P
 filedlgg.cpp	G	U,X,P
 grid.cpp	G
@@ -1078,6 +1079,7 @@ choicdgg.h	N
 colrdlgg.h	N
 dcpsg.h	N
 dirdlgg.h	N	16
+dragimgg.h	N	16
 fontdlgg.h	N
 filedlgg.h	N
 grid.h	N
diff --git a/distrib/msw/vc.rsp b/distrib/msw/vc.rsp
index b990f4aabd..b97ffdd0da 100644
--- a/distrib/msw/vc.rsp
+++ b/distrib/msw/vc.rsp
@@ -39,6 +39,9 @@ samples/dialup/DialupVC.dsw
 samples/dnd/DndVC.dsp
 samples/dnd/DndVC.dsw
 
+samples/dragimag/DragimagVC.dsp
+samples/dragimag/DragimagVC.dsw
+
 samples/docview/DocviewVC.dsp
 samples/docview/DocviewVC.dsw
 
diff --git a/docs/latex/wx/classes.tex b/docs/latex/wx/classes.tex
index 3705f9fd10..867e0c2c15 100644
--- a/docs/latex/wx/classes.tex
+++ b/docs/latex/wx/classes.tex
@@ -63,6 +63,7 @@
 \input docprfrm.tex
 \input doctempl.tex
 \input document.tex
+\input dragimag.tex
 \input dropevt.tex
 \input dropsrc.tex
 \input droptrgt.tex
diff --git a/docs/latex/wx/dragimag.tex b/docs/latex/wx/dragimag.tex
new file mode 100644
index 0000000000..3f36e0c06e
--- /dev/null
+++ b/docs/latex/wx/dragimag.tex
@@ -0,0 +1,155 @@
+\section{\class{wxDragImage}}\label{wxdragimage}
+
+This class is used when you wish to drag an object on the screen,
+and a simple cursor is not enough.
+
+On Windows, the WIN32 API is used to do achieve smooth dragging. On other platforms,
+wxGenericDragImage is used. Applications may also prefer to use
+wxGenericDragImage on Windows, too.
+
+To use this class, when you wish to start dragging an image, create a wxDragImage
+object and store it somewhere you can access it as the drag progresses.
+Call BeginDrag to start, and EndDrag to stop the drag. To move the image,
+initially call Show and then Move. If you wish to update the screen contents
+during the drag (for example, highlight an item as in the dragimag sample), first call Hide,
+update the screen, call Move, and then call Show.
+
+Please see {\tt samples/dragimag} for an example.
+
+\wxheading{Derived from}
+
+\helpref{wxObject}{wxobject}
+
+\wxheading{Include files}
+
+<wx/dragimag.h>\\
+<wx/generic/dragimgg.h>
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+\membersection{wxDragImage::wxDragImage}\label{wxdragimageconstr}
+
+\func{}{wxDragImage}{\void}
+
+Default constructor.
+
+\func{}{wxDragImage}{\param{const wxBitmap\& }{image}, \param{const wxCursor\& }{cursor = wxNullCursor},
+ \param{const wxPoint& }{hotspot = wxPoint(0, 0)}}
+
+Constructs a drag image from a bitmap and optional cursor.
+
+\func{}{wxDragImage}{\param{const wxIcon\& }{image}, \param{const wxCursor\& }{cursor = wxNullCursor},
+ \param{const wxPoint& }{hotspot = wxPoint(0, 0)}}
+
+Constructs a drag image from an icon and optional cursor.
+
+\func{}{wxDragImage}{\param{const wxString\& }{text}, \param{const wxCursor\& }{cursor = wxNullCursor},
+ \param{const wxPoint& }{hotspot = wxPoint(0, 0)}}
+
+Constructs a drag image from a text string and optional cursor.
+
+\func{}{wxDragImage}{\param{const wxTreeCtrl\& }{treeCtrl}, \param{wxTreeItemId\& }{id}}
+
+Constructs a drag image from the text in the given tree control item, and optional cursor.
+
+\func{}{wxDragImage}{\param{const wxListCtrl\& }{treeCtrl}, \param{long }{id}}
+
+Constructs a drag image from the text in the given tree control item, and optional cursor.
+
+\wxheading{Parameters}
+
+\docparam{image}{Icon or bitmap to be used as the drag image. The bitmap can
+have a mask.}
+
+\docparam{text}{Text used to construct a drag image.}
+
+\docparam{cursor}{Optional cursor to combine with the image.}
+
+\docparam{hotspot}{Position of the hotspot within the new image.}
+
+\docparam{treeCtrl}{Tree control for constructing a tree drag image.}
+
+\docparam{listCtrl}{List control for constructing a list drag image.}
+
+\docparam{id}{Tree or list control item id.}
+
+\membersection{wxDragImage::BeginDrag}\label{wxdragimagebegindrag}
+
+\func{bool}{BeginDrag}{\param{const wxPoint\& }{hotspot}, \param{wxWindow* }{window}, \param{bool}{ fullScreen = FALSE}, \param{wxRect*}{ rect = NULL}}
+
+Start dragging the image, in a window or full screen.
+
+\func{bool}{BeginDrag}{\param{const wxPoint\& }{hotspot}, \param{wxWindow* }{window}, \param{wxWindow*}{ boundingWindow}}
+
+Start dragging the image, using the first window to capture the mouse and the second
+to specify the bounding area. This form is equivalent to using the first form,
+but more convenient than working out the bounding rectangle explicitly.
+
+You need to then call \helpref{wxDragImage::Show}{wxdragimageshow} 
+and \helpref{wxDragImage::Move}{wxdragimagemove} to show the image on the screen.
+
+Call \helpref{wxDragImage::EndDrag}{wxdragimageenddrag} when the drag has finished.
+
+Note that this call automatically calls CaptureMouse.
+
+\wxheading{Parameters}
+
+\docparam{hotspot}{The location of the drag position relative to the upper-left corner
+of the image.}
+
+\docparam{window}{The window that captures the mouse, and within which the dragging
+is limited unless {\it fullScreen} is TRUE.}
+
+\docparam{boundingWindow}{In the second form of the function, specifies the
+area within which the drag occurs.}
+
+\docparam{fullScreen}{If TRUE, specifies that the drag will be visible over the full
+screen, or over as much of the screen as is specified by {\it rect}. Note that the mouse will
+still be captured in {\it window}.}
+
+\docparam{rect}{If non-NULL, specifies the rectangle (in screen coordinates) that
+bounds the dragging operation. Specifying this can make the operation more efficient
+by cutting down on the area under consideration, and it can also make a visual difference
+since the drag is clipped to this area.}
+
+{\bf Please note:} full screen dragging only works on Windows at present,
+because on Motif and GTK, the wxScreenDC used to implement full screen dragging only looks at the X root window and not
+the windows on top, when copying from the screen to the backing bitmap.
+Suggestions for solving this one are welcome!
+
+\membersection{wxDragImage::EndDrag}\label{wxdragimageenddrag}
+
+\func{bool}{EndDrag}{\void}
+
+Call this when the drag has finished.
+
+Note that this call automatically calls ReleaseMouse.
+
+\membersection{wxDragImage::Hide}\label{wxdragimagehide}
+
+\func{bool}{Hide}{\void}
+
+Hides the image. You may wish to call this before updating the window
+contents (perhaps highlighting an item). Then call \helpref{wxDragImage::Move}{wxdragimagemove} 
+and \helpref{wxDragImage::Show}{wxdragimageshow}.
+
+\membersection{wxDragImage::Move}\label{wxdragimagemove}
+
+\func{bool}{Move}{\param{const wxPoint\& }{pt}}
+
+Call this to move the image to a new position. The image will only be shown if 
+\helpref{wxDragImage::Show}{wxdragimageshow} has been called previously (for example
+at the start of the drag).
+
+{\it pt} is the position in window coordinates (or screen coordinates if no
+window was specified to BeginDrag.
+
+You can move the image either when the image is hidden or shown, but in general dragging
+will be smoother if you move the image when it is shown.
+
+\membersection{wxDragImage::Show}\label{wxdragimageshow}
+
+\func{bool}{Show}{\void}
+
+Shows the image. Call this at least once when dragging.
+
diff --git a/include/wx/dragimag.h b/include/wx/dragimag.h
index 02da2e77dd..d137c02f21 100644
--- a/include/wx/dragimag.h
+++ b/include/wx/dragimag.h
@@ -3,22 +3,43 @@
 
 #if defined(__WXMSW__)
 #ifdef __WIN16__
-#include "wx/generic/dragimag.h"
+#include "wx/generic/dragimgg.h"
+#define wxDragImage wxGenericDragImage
+#define sm_classwxDragImage sm_classwxGenericDragImage
+
 #else
 #include "wx/msw/dragimag.h"
 #endif
 #elif defined(__WXMOTIF__)
-#include "wx/generic/dragimag.h"
+#include "wx/generic/dragimgg.h"
+#define wxDragImage wxGenericDragImage
+#define sm_classwxDragImage sm_classwxGenericDragImage
+
 #elif defined(__WXGTK__)
-#include "wx/generic/dragimag.h"
+#include "wx/generic/dragimgg.h"
+#define wxDragImage wxGenericDragImage
+#define sm_classwxDragImage sm_classwxGenericDragImage
+
 #elif defined(__WXQT__)
-#include "wx/generic/dragimag.h"
+#include "wx/generic/dragimgg.h"
+#define wxDragImage wxGenericDragImage
+#define sm_classwxDragImage sm_classwxGenericDragImage
+
 #elif defined(__WXMAC__)
-#include "wx/generic/dragimag.h"
+#include "wx/generic/dragimgg.h"
+#define wxDragImage wxGenericDragImage
+#define sm_classwxDragImage sm_classwxGenericDragImage
+
 #elif defined(__WXPM__)
-#include "wx/generic/dragimag.h"
+#include "wx/generic/dragimgg.h"
+#define wxDragImage wxGenericDragImage
+#define sm_classwxDragImage sm_classwxGenericDragImage
+
 #elif defined(__WXSTUBS__)
-#include "wx/generic/dragimag.h"
+#include "wx/generic/dragimgg.h"
+#define wxDragImage wxGenericDragImage
+#define sm_classwxDragImage sm_classwxGenericDragImage
+
 #endif
 
 #endif
diff --git a/include/wx/generic/dragimgg.h b/include/wx/generic/dragimgg.h
new file mode 100644
index 0000000000..f35a28cc6f
--- /dev/null
+++ b/include/wx/generic/dragimgg.h
@@ -0,0 +1,211 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/generic/dragimgg.h
+// Purpose:     wxDragImage class: a kind of a cursor, that can cope
+//              with more sophisticated images
+// Author:      Julian Smart
+// Modified by:
+// Created:     29/2/2000
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_DRAGIMGG_H_
+#define _WX_DRAGIMGG_H_
+
+#ifdef __GNUG__
+#pragma interface "dragimgg.h"
+#endif
+
+#include "wx/bitmap.h"
+#include "wx/icon.h"
+#include "wx/cursor.h"
+#include "wx/treectrl.h"
+#include "wx/listctrl.h"
+
+/*
+  To use this class, create a wxDragImage when you start dragging, for example:
+
+  void MyTreeCtrl::OnBeginDrag(wxTreeEvent& event)
+  {
+#ifdef __WXMSW__
+    ::UpdateWindow((HWND) GetHWND()); // We need to implement this in wxWindows
+#endif
+
+    CaptureMouse();
+
+    m_dragImage = new wxDragImage(* this, itemId);
+    m_dragImage->BeginDrag(wxPoint(0, 0), this);
+    m_dragImage->Move(pt, this);
+    m_dragImage->Show(this);
+    ...
+  }
+
+  In your OnMouseMove function, hide the image, do any display updating required,
+  then move and show the image again:
+
+  void MyTreeCtrl::OnMouseMove(wxMouseEvent& event)
+  {
+    if (m_dragMode == MY_TREE_DRAG_NONE)
+    {
+        event.Skip();
+        return;
+    }
+
+    // Prevent screen corruption by hiding the image
+    if (m_dragImage)
+        m_dragImage->Hide(this);
+
+    // Do some updating of the window, such as highlighting the drop target
+    ...
+
+#ifdef __WXMSW__
+    if (updateWindow)
+        ::UpdateWindow((HWND) GetHWND());
+#endif
+
+    // Move and show the image again
+    m_dragImage->Move(event.GetPosition(), this);
+    m_dragImage->Show(this);
+ }
+
+ Eventually we end the drag and delete the drag image.
+
+ void MyTreeCtrl::OnLeftUp(wxMouseEvent& event)
+ {
+    ...
+
+    // End the drag and delete the drag image
+    if (m_dragImage)
+    {
+        m_dragImage->EndDrag(this);
+        delete m_dragImage;
+        m_dragImage = NULL;
+    }
+    ReleaseMouse();
+ }
+*/
+
+/*
+ * wxGenericDragImage
+ */
+
+class WXDLLEXPORT wxGenericDragImage: public wxObject
+{
+public:
+
+    // Ctors & dtor
+    ////////////////////////////////////////////////////////////////////////////
+
+    wxGenericDragImage();
+    wxGenericDragImage(const wxBitmap& image, const wxCursor& cursor = wxNullCursor, const wxPoint& hotspot = wxPoint(0, 0))
+    {
+        Init();
+
+        Create(image, cursor, hotspot);
+    }
+    wxGenericDragImage(const wxIcon& image, const wxCursor& cursor = wxNullCursor, const wxPoint& hotspot = wxPoint(0, 0))
+    {
+        Init();
+
+        Create(image, cursor, hotspot);
+    }
+    wxGenericDragImage(const wxString& str, const wxCursor& cursor = wxNullCursor, const wxPoint& hotspot = wxPoint(0, 0))
+    {
+        Init();
+
+        Create(str, cursor, hotspot);
+    }
+    wxGenericDragImage(const wxTreeCtrl& treeCtrl, wxTreeItemId& id)
+    {
+        Init();
+
+        Create(treeCtrl, id);
+    }
+    wxGenericDragImage(const wxListCtrl& listCtrl, long id)
+    {
+        Init();
+
+        Create(listCtrl, id);
+    }
+    ~wxGenericDragImage();
+
+    // Attributes
+    ////////////////////////////////////////////////////////////////////////////
+
+    // Operations
+    ////////////////////////////////////////////////////////////////////////////
+
+    // Create a drag image from a bitmap and optional cursor
+    bool Create(const wxBitmap& image, const wxCursor& cursor = wxNullCursor, const wxPoint& hotspot = wxPoint(0, 0));
+
+    // Create a drag image from an icon and optional cursor
+    bool Create(const wxIcon& image, const wxCursor& cursor = wxNullCursor, const wxPoint& hotspot = wxPoint(0, 0));
+
+    // Create a drag image from a string and optional cursor
+    bool Create(const wxString& str, const wxCursor& cursor = wxNullCursor, const wxPoint& hotspot = wxPoint(0, 0));
+
+    // Create a drag image for the given tree control item
+    bool Create(const wxTreeCtrl& treeCtrl, wxTreeItemId& id);
+
+    // Create a drag image for the given list control item
+    bool Create(const wxListCtrl& listCtrl, long id);
+
+    // Begin drag. hotspot is the location of the drag position relative to the upper-left
+    // corner of the image.
+    bool BeginDrag(const wxPoint& hotspot, wxWindow* window, bool fullScreen = FALSE, wxRect* rect = (wxRect*) NULL);
+
+    // Begin drag. hotspot is the location of the drag position relative to the upper-left
+    // corner of the image. This is full screen only. fullScreenRect gives the
+    // position of the window on the screen, to restrict the drag to.
+    bool BeginDrag(const wxPoint& hotspot, wxWindow* window, wxWindow* fullScreenRect);
+
+    // End drag
+    bool EndDrag();
+
+    // Move the image: call from OnMouseMove. Pt is in window client coordinates if window
+    // is non-NULL, or in screen coordinates if NULL.
+    bool Move(const wxPoint& pt);
+
+    // Show the image
+    bool Show();
+
+    // Hide the image
+    bool Hide();
+
+    // Implementation
+    ////////////////////////////////////////////////////////////////////////////
+
+    void Init();
+
+    wxRect GetImageRect(const wxPoint& pos) const;
+
+    // Erase and redraw simultaneously if possible
+    bool RedrawImage(const wxPoint& oldPos, const wxPoint& newPos, bool eraseOld, bool drawNew);
+
+protected:
+    wxBitmap        m_bitmap;
+    wxIcon          m_icon;
+    wxCursor        m_cursor;
+    wxCursor        m_oldCursor;
+    wxPoint         m_hotspot;
+    wxPoint         m_position;
+    bool            m_isDirty;
+    bool            m_isShown;
+    wxWindow*       m_window;
+    wxDC*           m_windowDC;
+
+    // Stores the window contents while we're dragging the image around
+    wxBitmap        m_backingBitmap;
+    // A temporary bitmap for repairing/redrawing
+    wxBitmap        m_repairBitmap;
+
+    wxRect          m_boundingRect;
+    bool            m_fullScreen;
+
+private:
+    DECLARE_DYNAMIC_CLASS(wxGenericDragImage)
+};
+
+#endif
+    // _WX_DRAGIMGG_H_
diff --git a/include/wx/motif/bitmap.h b/include/wx/motif/bitmap.h
index 17b7142ce7..c673a408fa 100644
--- a/include/wx/motif/bitmap.h
+++ b/include/wx/motif/bitmap.h
@@ -201,10 +201,11 @@ public:
   // Motif implementation
 public:
   WXDisplay* GetDisplay() const { return M_BITMAPDATA->m_display; }
-  WXDisplay* GetPixmap() const { return M_BITMAPDATA->m_pixmap; }
+  WXPixmap GetPixmap() const { return (WXPixmap) M_BITMAPDATA->m_pixmap; }
   virtual WXPixmap GetLabelPixmap(WXWidget w) ;
   virtual WXPixmap GetArmPixmap(WXWidget w) ;
   virtual WXPixmap GetInsensPixmap(WXWidget w = (WXWidget) 0) ;
+  void SetPixmapNull() { M_BITMAPDATA->m_pixmap = 0; }
 
 protected:
   static wxList sm_handlers;
diff --git a/include/wx/msw/dragimag.h b/include/wx/msw/dragimag.h
index ac37bff488..1228132514 100644
--- a/include/wx/msw/dragimag.h
+++ b/include/wx/msw/dragimag.h
@@ -108,27 +108,32 @@ public:
     wxDragImage();
     wxDragImage(const wxBitmap& image, const wxCursor& cursor = wxNullCursor, const wxPoint& hotspot = wxPoint(0, 0))
     {
-        m_hImageList = 0;
-        Create(image, cursor);
+        Init();
+
+        Create(image, cursor, hotspot);
     }
     wxDragImage(const wxIcon& image, const wxCursor& cursor = wxNullCursor, const wxPoint& hotspot = wxPoint(0, 0))
     {
-        m_hImageList = 0;
-        Create(image, cursor);
+        Init();
+
+        Create(image, cursor, hotspot);
     }
     wxDragImage(const wxString& str, const wxCursor& cursor = wxNullCursor, const wxPoint& hotspot = wxPoint(0, 0))
     {
-        m_hImageList = 0;
-        Create(str, cursor);
+        Init();
+
+        Create(str, cursor, hotspot);
     }
     wxDragImage(const wxTreeCtrl& treeCtrl, wxTreeItemId& id)
     {
-        m_hImageList = 0;
+        Init();
+
         Create(treeCtrl, id);
     }
     wxDragImage(const wxListCtrl& listCtrl, long id)
     {
-        m_hImageList = 0;
+        Init();
+
         Create(listCtrl, id);
     }
     ~wxDragImage();
@@ -156,32 +161,47 @@ public:
 
     // Begin drag. hotspot is the location of the drag position relative to the upper-left
     // corner of the image.
-    bool BeginDrag(const wxPoint& hotspot, wxWindow* window);
+    bool BeginDrag(const wxPoint& hotspot, wxWindow* window, bool fullScreen = FALSE, wxRect* rect = (wxRect*) NULL);
+
+    // Begin drag. hotspot is the location of the drag position relative to the upper-left
+    // corner of the image. This is full screen only. fullScreenRect gives the
+    // position of the window on the screen, to restrict the drag to.
+    bool BeginDrag(const wxPoint& hotspot, wxWindow* window, wxWindow* fullScreenRect);
 
     // End drag
-    bool EndDrag(wxWindow* window);
+    bool EndDrag();
 
     // Move the image: call from OnMouseMove. Pt is in window client coordinates if window
     // is non-NULL, or in screen coordinates if NULL.
-    bool Move(const wxPoint& pt, wxWindow* window);
+    bool Move(const wxPoint& pt);
 
     // Show the image
-    bool Show(wxWindow* window);
+    bool Show();
 
     // Hide the image
-    bool Hide(wxWindow* window);
+    bool Hide();
 
     // Implementation
     ////////////////////////////////////////////////////////////////////////////
 
+    // Initialize variables
+    void Init();
+
     // Returns the native image list handle
     WXHIMAGELIST GetHIMAGELIST() const { return m_hImageList; }
 
+    // Returns the native image list handle for the cursor
+    WXHIMAGELIST GetCursorHIMAGELIST() const { return m_hCursorImageList; }
+
 protected:
     WXHIMAGELIST    m_hImageList;
+    WXHIMAGELIST    m_hCursorImageList;
     wxCursor        m_cursor;
     wxPoint         m_hotspot;
     wxPoint         m_position;
+    wxWindow*       m_window;
+    wxRect          m_boundingRect;
+    bool            m_fullScreen;
 
 private:
     DECLARE_DYNAMIC_CLASS(wxDragImage)
diff --git a/samples/configure b/samples/configure
index 59f6f4652d..07c762adf7 100755
--- a/samples/configure
+++ b/samples/configure
@@ -652,6 +652,7 @@ trap 'rm -fr `echo "
             docview/Makefile
             docvwmdi/Makefile
             dnd/Makefile
+            dragimag/Makefile
             drawing/Makefile
             exec/Makefile
             font/Makefile
diff --git a/samples/configure.in b/samples/configure.in
index feb575b071..5e3d529a70 100644
--- a/samples/configure.in
+++ b/samples/configure.in
@@ -20,6 +20,7 @@ AC_OUTPUT([
             docview/Makefile
             docvwmdi/Makefile
             dnd/Makefile
+            dragimag/Makefile
             drawing/Makefile
             exec/Makefile
             font/Makefile
diff --git a/samples/dragimag/Makefile.in b/samples/dragimag/Makefile.in
new file mode 100644
index 0000000000..6affd074ee
--- /dev/null
+++ b/samples/dragimag/Makefile.in
@@ -0,0 +1,21 @@
+#
+# File:		makefile.unx
+# Author:	Julian Smart
+# Created:	1998
+# Updated:	
+# Copyright:	(c) 1998 Julian Smart
+#
+# "%W% %G%"
+#
+# Makefile for dragimag  example (UNIX).
+
+top_srcdir = @top_srcdir@/..
+top_builddir = ../..
+program_dir = samples/dragimag
+
+PROGRAM=test
+
+OBJECTS=$(PROGRAM).o
+
+include ../../src/makeprog.env
+
diff --git a/samples/dragimag/backgrnd.png b/samples/dragimag/backgrnd.png
new file mode 100644
index 0000000000000000000000000000000000000000..59349aa8d1d1c2a0bd49f44a58d3875043ef49d4
GIT binary patch
literal 16672
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

literal 0
HcmV?d00001

diff --git a/samples/dragimag/dragicon.ico b/samples/dragimag/dragicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..2310c5d275a87af295d5ea8dc79ea417a5e74c53
GIT binary patch
literal 766
zcmZQzU<5)11px*Sc)`TLAO@s0fLH;D9e|jTfdxnc0Z<M**w4TKL=5})Lnt5#WHKB$
zaDbtqp#doIAB-6O{|B*v7zjZ^AOa2W|NsACHyAJ}De?dRKnp(HN~rljcR;{k;{zQE
i@;}UZ|9Q?Fpp*~yJCwmWbLIrN`9Qm9%}2L?p!oo$cZ4ed

literal 0
HcmV?d00001

diff --git a/samples/dragimag/dragicon.xpm b/samples/dragimag/dragicon.xpm
new file mode 100644
index 0000000000..87a76ea3f5
--- /dev/null
+++ b/samples/dragimag/dragicon.xpm
@@ -0,0 +1,44 @@
+/* XPM */
+static char *dragicon_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 6 1",
+"  c Black",
+". c Blue",
+"X c #00bf00",
+"o c Red",
+"O c Yellow",
+"+ c Gray100",
+/* pixels */
+"                                ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+"                                ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++      ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++                    ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+"                                "
+};
diff --git a/samples/dragimag/makefile.b32 b/samples/dragimag/makefile.b32
new file mode 100644
index 0000000000..95ddc80d76
--- /dev/null
+++ b/samples/dragimag/makefile.b32
@@ -0,0 +1,16 @@
+#
+# File:		makefile.b32
+# Author:	Julian Smart
+# Created:	1999
+# Updated:	
+# Copyright:
+#
+# Makefile : Builds sample for 32-bit BC++
+
+WXDIR = $(WXWIN)
+
+TARGET=test
+OBJECTS = $(TARGET).obj
+
+!include $(WXDIR)\src\makeprog.b32
+
diff --git a/samples/dragimag/makefile.bcc b/samples/dragimag/makefile.bcc
new file mode 100644
index 0000000000..669f01905a
--- /dev/null
+++ b/samples/dragimag/makefile.bcc
@@ -0,0 +1,19 @@
+#
+# File:		makefile.bcc
+# Author:	Julian Smart
+# Created:	1998
+# Updated:	
+#
+# Builds a BC++ 16-bit sample
+
+!if "$(WXWIN)" == ""
+!error You must define the WXWIN variable in autoexec.bat, e.g. WXWIN=c:\wx
+!endif
+
+WXDIR = $(WXWIN)
+
+TARGET=test
+OBJECTS=$(TARGET).obj
+
+!include $(WXDIR)\src\makeprog.bcc
+
diff --git a/samples/dragimag/makefile.dos b/samples/dragimag/makefile.dos
new file mode 100644
index 0000000000..983ef2da8b
--- /dev/null
+++ b/samples/dragimag/makefile.dos
@@ -0,0 +1,17 @@
+#
+# File:		makefile.dos
+# Author:	Julian Smart
+# Created:	1998
+# Updated:	
+#
+# Makefile : Builds 16-bit sample, VC++ 1.5
+# Use FINAL=1 argument to nmake to build final version with no debugging
+# info
+
+WXDIR = $(WXWIN)
+
+TARGET=test
+OBJECTS=$(TARGET).obj
+
+!include $(WXDIR)\src\makeprog.msc
+
diff --git a/samples/dragimag/makefile.g95 b/samples/dragimag/makefile.g95
new file mode 100644
index 0000000000..b4a920f047
--- /dev/null
+++ b/samples/dragimag/makefile.g95
@@ -0,0 +1,16 @@
+#
+# File:         makefile.g95
+# Author:       Julian Smart
+# Created:      1999
+# Updated:
+# Copyright:    (c) Julian Smart, 1999
+#
+# Makefile for wxWindows sample (Cygwin/Mingw32).
+
+WXDIR = ../..
+
+TARGET=test
+OBJECTS = $(TARGET).o
+
+include $(WXDIR)/src/makeprog.g95
+
diff --git a/samples/dragimag/makefile.sc b/samples/dragimag/makefile.sc
new file mode 100644
index 0000000000..9f70cf6b36
--- /dev/null
+++ b/samples/dragimag/makefile.sc
@@ -0,0 +1,36 @@
+# Symantec C++ makefile
+
+WXDIR = $(WXWIN)
+WXLIB = $(WXDIR)\lib\wx.lib
+INCDIR = $(WXDIR)\include
+INCLUDE=$(INCDIR)
+TARGET=test
+
+include $(WXDIR)\src\makesc.env
+
+test.exe: test.obj $(DEFFILE) test.res
+	*$(CC) $(LDFLAGS) -o$@ $** $(LIBS)
+    *$(RC) -k test.res
+
+sc32.def:
+     echo EXETYPE NT > sc32.def
+     echo SUBSYSTEM WINDOWS >> sc32.def
+
+sc16.def:
+     echo NAME $(TARGET) > sc16.def
+     echo EXETYPE WINDOWS >> sc16.def
+     echo STUB         'WINSTUB.EXE' >> sc16.def
+     echo CODE         PRELOAD MOVEABLE DISCARDABLE >> sc16.def
+     echo DATA         PRELOAD MOVEABLE MULTIPLE >> sc16.def
+     echo HEAPSIZE     1024 >> sc16.def
+     echo STACKSIZE    8192 >> sc16.def
+
+clean:
+    -del *.obj
+	-del *.exe
+	-del *.res
+	-del *.map
+	-del *.rws
+    -del sc32.def
+    -del sc16.def
+
diff --git a/samples/dragimag/makefile.sl b/samples/dragimag/makefile.sl
new file mode 100644
index 0000000000..c604d39654
--- /dev/null
+++ b/samples/dragimag/makefile.sl
@@ -0,0 +1,18 @@
+#
+# File:		makefile.sl
+# Author:	Julian Smart
+# Created:	1998
+#
+# Makefile : Builds a wxWindows sample for Salford C++, WIN32
+
+PROGRAM = test
+OBJECTS = $(PROGRAM).obj
+
+include ..\..\src\makeprog.sl
+
+all:        wx $(TARGET)
+
+wx:
+    cd $(WXDIR)\src\msw ^ mk32 -f makefile.sl all
+    cd $(WXDIR)\samples\test
+
diff --git a/samples/dragimag/makefile.twn b/samples/dragimag/makefile.twn
new file mode 100644
index 0000000000..76ab72b692
--- /dev/null
+++ b/samples/dragimag/makefile.twn
@@ -0,0 +1,43 @@
+#
+# File:		makefile.unx
+# Author:	Julian Smart
+# Created:	1993
+# Updated:	
+# Copyright:	(c) 1993, AIAI, University of Edinburgh
+#
+# "%W% %G%"
+#
+# Makefile for test example (UNIX).
+
+WXDIR = ../..
+
+# All common UNIX compiler flags and options are now in
+# this central makefile.
+include $(WXDIR)/src/maketwin.env
+
+OBJECTS = $(OBJDIR)/test.$(OBJSUFF) $(OBJDIR)/test_resources.$(OBJSUFF)
+
+all:    $(OBJDIR) test$(GUISUFFIX)$(EXESUFF)
+
+wx:
+
+$(OBJDIR):
+	mkdir $(OBJDIR)
+
+test$(GUISUFFIX)$(EXESUFF):	$(OBJECTS) $(WXLIB)
+	$(CC) $(LDFLAGS) -o test$(GUISUFFIX)$(EXESUFF) $(OBJECTS) $(LDLIBS)
+
+$(OBJDIR)/test.$(OBJSUFF):	test.$(SRCSUFF)
+	$(CC) -c $(CPPFLAGS) -o $@ test.$(SRCSUFF)
+
+test_resources.c:  test.rc
+	$(RESCOMP) $(RCINPUTSWITCH) test.rc $(RCOUTPUTSWITCH) test_resources.c $(RESFLAGS)
+
+$(OBJDIR)/test_resources.$(OBJSUFF):	test_resources.c
+	$(CC) -c $(CPPFLAGS) -o $@ test_resources.c
+
+#$(OBJDIR)/test_resources.o:  test.rc
+#	$(RESCOMP) $(RCINPUTSWITCH) test.rc $(RCOUTPUTSWITCH) $(OBJDIR)/test_resources.o $(RESFLAGS)
+
+clean:
+	rm -f $(OBJECTS) test$(GUISUFFIX).exe core *.rsc *.res
diff --git a/samples/dragimag/makefile.unx b/samples/dragimag/makefile.unx
new file mode 100644
index 0000000000..21cab3c677
--- /dev/null
+++ b/samples/dragimag/makefile.unx
@@ -0,0 +1,35 @@
+#
+# File:		Makefile for samples
+# Author:	Robert Roebling
+# Created:	1999
+# Updated:	
+# Copyright:	(c) 1998 Robert Roebling
+#
+# This makefile requires a Unix version of wxWindows
+# to be installed on your system. This is most often
+# done typing "make install" when using the complete
+# sources of wxWindows or by installing the two
+# RPM packages wxGTK.XXX.rpm and wxGTK-devel.XXX.rpm
+# under Linux.
+#
+
+CC = gcc
+
+PROGRAM = test
+
+OBJECTS = $(PROGRAM).o
+
+# implementation
+
+.SUFFIXES:	.o .cpp
+
+.cpp.o :
+	$(CC) -c `wx-config --cflags` -o $@ $<
+
+all:    $(PROGRAM)
+
+$(PROGRAM):	$(OBJECTS)
+	$(CC) -o $(PROGRAM) $(OBJECTS) `wx-config --libs`
+
+clean: 
+	rm -f *.o $(PROGRAM)
diff --git a/samples/dragimag/makefile.va b/samples/dragimag/makefile.va
new file mode 100644
index 0000000000..3cfa8cb8a8
--- /dev/null
+++ b/samples/dragimag/makefile.va
@@ -0,0 +1,25 @@
+#
+# File:     makefile.va
+# Author:   David Webster
+# Created:  1999
+# Updated:
+# Copyright:    (c) David Webster
+#
+# Makefile : Builds sample (VisualAgeC++ V3.0, OS/2 PM)
+# Use FINAL=1 argument to nmake to build final version with no debug info.
+
+# Set WXDIR for your system
+WXDIR = $(WXWIN)
+
+WXUSINGDLL=0
+
+!include $(WXDIR)\src\makeva.env
+
+PROGRAM=$D\test
+OBJECTS = $(PROGRAM).obj
+
+!if [md $D]
+!endif
+
+!include $(WXDIR)\src\makeprog.va
+
diff --git a/samples/dragimag/makefile.vc b/samples/dragimag/makefile.vc
new file mode 100644
index 0000000000..4ada748eda
--- /dev/null
+++ b/samples/dragimag/makefile.vc
@@ -0,0 +1,18 @@
+#
+# File:		makefile.vc
+# Author:	Julian Smart
+# Created:	1999
+# Updated:	
+# Copyright:	(c) Julian Smart
+#
+# Makefile : Builds sample (VC++, WIN32)
+# Use FINAL=1 argument to nmake to build final version with no debug info.
+
+# Set WXDIR for your system
+WXDIR = $(WXWIN)
+
+PROGRAM=test
+OBJECTS = $(PROGRAM).obj
+
+!include $(WXDIR)\src\makeprog.vc
+
diff --git a/samples/dragimag/makefile.wat b/samples/dragimag/makefile.wat
new file mode 100644
index 0000000000..81a83e42a9
--- /dev/null
+++ b/samples/dragimag/makefile.wat
@@ -0,0 +1,15 @@
+#
+# Makefile for WATCOM
+#
+# Created by Julian Smart, January 1999
+# 
+#
+
+WXDIR = $(%WXWIN)
+
+PROGRAM = test
+OBJECTS = $(PROGRAM).obj
+
+!include $(WXDIR)\src\makeprog.wat
+
+
diff --git a/samples/dragimag/mondrian.ico b/samples/dragimag/mondrian.ico
new file mode 100644
index 0000000000000000000000000000000000000000..2310c5d275a87af295d5ea8dc79ea417a5e74c53
GIT binary patch
literal 766
zcmZQzU<5)11px*Sc)`TLAO@s0fLH;D9e|jTfdxnc0Z<M**w4TKL=5})Lnt5#WHKB$
zaDbtqp#doIAB-6O{|B*v7zjZ^AOa2W|NsACHyAJ}De?dRKnp(HN~rljcR;{k;{zQE
i@;}UZ|9Q?Fpp*~yJCwmWbLIrN`9Qm9%}2L?p!oo$cZ4ed

literal 0
HcmV?d00001

diff --git a/samples/dragimag/mondrian.xpm b/samples/dragimag/mondrian.xpm
new file mode 100644
index 0000000000..409f27a843
--- /dev/null
+++ b/samples/dragimag/mondrian.xpm
@@ -0,0 +1,44 @@
+/* XPM */
+static char *mondrian_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 6 1",
+"  c Black",
+". c Blue",
+"X c #00bf00",
+"o c Red",
+"O c Yellow",
+"+ c Gray100",
+/* pixels */
+"                                ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+"                                ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++      ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++                    ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+"                                "
+};
diff --git a/samples/dragimag/shape01.png b/samples/dragimag/shape01.png
new file mode 100644
index 0000000000000000000000000000000000000000..a54b1d252f78761072014d06e5538c1cf550f2da
GIT binary patch
literal 2784
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
E52nFe00000

literal 0
HcmV?d00001

diff --git a/samples/dragimag/shape02.png b/samples/dragimag/shape02.png
new file mode 100644
index 0000000000000000000000000000000000000000..aafd08e18a3318736b2b18c557a6f4c75504b273
GIT binary patch
literal 2333
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
K8<lS1S^opN<ea4d

literal 0
HcmV?d00001

diff --git a/samples/dragimag/shape03.png b/samples/dragimag/shape03.png
new file mode 100644
index 0000000000000000000000000000000000000000..992deb053dad35b1a6e9b25de7c79d8a77b37f2d
GIT binary patch
literal 2501
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

literal 0
HcmV?d00001

diff --git a/samples/dragimag/test.cpp b/samples/dragimag/test.cpp
new file mode 100644
index 0000000000..08acf09f1d
--- /dev/null
+++ b/samples/dragimag/test.cpp
@@ -0,0 +1,512 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        test.cpp
+// Purpose:     wxDragImage sample
+// Author:      Julian Smart
+// Modified by:
+// Created:     28/2/2000
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+#include <wx/image.h>
+
+// Under Windows, change this to 1
+// to use wxGenericDragImage
+
+#define wxUSE_GENERIC_DRAGIMAGE 0
+
+#if wxUSE_GENERIC_DRAGIMAGE
+#include <wx/generic/dragimgg.h>
+#define wxDragImage wxGenericDragImage
+#else
+#include <wx/dragimag.h>
+#endif
+
+#include "test.h"
+
+#if defined(__WXGTK__) || defined(__WXMOTIF__)
+#include "mondrian.xpm"
+#include "dragicon.xpm"
+#endif
+
+// main program
+
+IMPLEMENT_APP(MyApp)
+
+// MyCanvas
+
+IMPLEMENT_CLASS(MyCanvas, wxScrolledWindow)
+
+BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
+  EVT_PAINT(MyCanvas::OnPaint)
+  EVT_ERASE_BACKGROUND(MyCanvas::OnEraseBackground)
+  EVT_MOUSE_EVENTS(MyCanvas::OnMouseEvent)
+END_EVENT_TABLE()
+
+MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id,
+                    const wxPoint &pos, const wxSize &size )
+        : wxScrolledWindow( parent, id, pos, size, wxSUNKEN_BORDER )
+{
+    SetBackgroundColour(* wxWHITE);
+
+    SetCursor(wxCursor(wxCURSOR_ARROW));
+
+    m_dragMode = TEST_DRAG_NONE;
+    m_draggedShape = (DragShape*) NULL;
+    m_dragImage = (wxDragImage*) NULL;
+    m_currentlyHighlighted = (DragShape*) NULL;
+}
+
+MyCanvas::~MyCanvas()
+{
+    ClearShapes();
+
+    if (m_dragImage)
+        delete m_dragImage;
+}
+
+void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
+{
+    wxPaintDC dc( this );
+    PrepareDC( dc );
+
+    DrawShapes(dc);
+
+}
+
+void MyCanvas::OnEraseBackground(wxEraseEvent& event)
+{
+    if (wxGetApp().GetBackgroundBitmap().Ok())
+    {
+        wxSize sz = GetClientSize();
+        wxRect rect(0, 0, sz.x, sz.y);
+        
+        if (event.GetDC())
+        {
+            wxGetApp().TileBitmap(rect, *(event.GetDC()), wxGetApp().GetBackgroundBitmap());
+        }
+        else
+        {
+            wxClientDC dc(this);
+            wxGetApp().TileBitmap(rect, dc, wxGetApp().GetBackgroundBitmap());
+        }
+    }
+    else
+        event.Skip(); // The official way of doing it
+}
+
+void MyCanvas::OnMouseEvent(wxMouseEvent& event)
+{
+    if (event.LeftDown())
+    {
+        DragShape* shape = FindShape(event.GetPosition());
+        if (shape)
+        {
+            // We tentatively start dragging, but wait for
+            // mouse movement before dragging properly.
+
+            m_dragMode = TEST_DRAG_START;
+            m_dragStartPos = event.GetPosition();
+            m_draggedShape = shape;
+        }
+    }
+    else if (event.LeftUp() && m_dragMode != TEST_DRAG_NONE)
+    {
+        // Finish dragging
+
+        m_dragMode = TEST_DRAG_NONE;
+
+        if (!m_draggedShape || !m_dragImage)
+            return;
+
+        wxPoint newPos(m_draggedShape->GetPosition().x + (event.GetPosition().x - m_dragStartPos.x),
+                           m_draggedShape->GetPosition().y + (event.GetPosition().y - m_dragStartPos.y));
+
+        m_draggedShape->SetPosition(newPos);
+
+        m_dragImage->Hide();
+        m_dragImage->EndDrag();
+        delete m_dragImage;
+        m_dragImage = NULL;
+
+        wxClientDC dc(this);
+        if (m_currentlyHighlighted)
+        {
+            m_currentlyHighlighted->Draw(dc);
+        }
+        m_draggedShape->SetShow(TRUE);
+        m_draggedShape->Draw(dc);
+
+        m_currentlyHighlighted = (DragShape*) NULL;
+
+        m_draggedShape = (DragShape*) NULL;
+    }
+    else if (event.Dragging() && m_dragMode != TEST_DRAG_NONE)
+    {
+        if (m_dragMode == TEST_DRAG_START)
+        {
+            // We will start dragging if we've moved beyond a couple of pixels
+
+            int tolerance = 2;
+            int dx = abs(event.GetPosition().x - m_dragStartPos.x);
+            int dy = abs(event.GetPosition().y - m_dragStartPos.y);
+            if (dx <= tolerance && dy <= tolerance)
+                return;
+
+            wxPoint newPos(m_draggedShape->GetPosition().x + (event.GetPosition().x - m_dragStartPos.x),
+                           m_draggedShape->GetPosition().y + (event.GetPosition().y - m_dragStartPos.y));
+
+            // Start the drag.
+            m_dragMode = TEST_DRAG_DRAGGING;
+
+            if (m_dragImage)
+                delete m_dragImage;
+
+            // Erase the dragged shape from the canvas
+            m_draggedShape->SetShow(FALSE);
+            wxClientDC dc(this);
+            EraseShape(m_draggedShape, dc);
+            DrawShapes(dc);
+
+            switch (m_draggedShape->GetDragMethod())
+            {
+                case SHAPE_DRAG_BITMAP:
+                {
+                    wxPoint hotSpot(event.GetPosition().x - newPos.x, event.GetPosition().y - newPos.y);
+                    m_dragImage = new wxDragImage(m_draggedShape->GetBitmap(), wxCursor(wxCURSOR_HAND), hotSpot);
+                    break;
+                }
+                case SHAPE_DRAG_TEXT:
+                {
+                    wxPoint hotSpot(event.GetPosition().x - newPos.x, event.GetPosition().y - newPos.y);
+                    m_dragImage = new wxDragImage("Dragging some test text", wxCursor(wxCURSOR_HAND), hotSpot);
+                    break;
+                }
+                case SHAPE_DRAG_ICON:
+                {
+                    wxPoint hotSpot(event.GetPosition().x - newPos.x, event.GetPosition().y - newPos.y);
+
+                    // Can anyone explain why this test is necessary,
+                    // to prevent a gcc error?
+#ifdef __WXMOTIF__
+		    wxIcon icon(dragicon_xpm);
+#else
+		    wxIcon icon(wxICON(dragicon));
+#endif
+
+                    m_dragImage = new wxDragImage(icon, wxCursor(wxCURSOR_HAND), hotSpot);
+                    break;
+                }
+            }
+
+            bool fullScreen = FALSE;
+            if (wxGetApp().GetUseScreen())
+            {
+                newPos = ClientToScreen(newPos);
+                fullScreen = TRUE;
+            }
+
+            bool retValue;
+
+            if (fullScreen)
+                // This line uses the whole screen...
+                retValue = m_dragImage->BeginDrag(wxPoint(0, 0), this, TRUE);
+                // while this line restricts dragging to the parent frame.
+                // retValue = m_dragImage->BeginDrag(wxPoint(0, 0), this, GetParent());
+            else
+                retValue = m_dragImage->BeginDrag(wxPoint(0, 0), this);
+
+            if (!retValue)
+            {
+                delete m_dragImage;
+                m_dragImage = (wxDragImage*) NULL;
+                m_dragMode = TEST_DRAG_NONE;
+            }
+            m_dragImage->Move(newPos);
+            m_dragImage->Show();
+        }
+        else if (m_dragMode == TEST_DRAG_DRAGGING)
+        {
+            // We're currently dragging. See if we're over another shape.
+            DragShape* onShape = FindShape(event.GetPosition());
+
+            bool mustUnhighlightOld = FALSE;
+            bool mustHighlightNew = FALSE;
+
+            if (m_currentlyHighlighted)
+            {
+                if ((onShape == (DragShape*) NULL) || (m_currentlyHighlighted != onShape))
+                    mustUnhighlightOld = TRUE;
+            }
+
+            if (onShape && (onShape != m_currentlyHighlighted) && onShape->IsShown())
+                mustHighlightNew = TRUE;
+
+            if (mustUnhighlightOld || mustHighlightNew)
+                m_dragImage->Hide();
+
+            // Now with the drag image switched off, we can change the window contents.
+
+            if (mustUnhighlightOld)
+            {
+                wxClientDC clientDC(this);
+                m_currentlyHighlighted->Draw(clientDC);
+                m_currentlyHighlighted = (DragShape*) NULL;
+            }
+            if (mustHighlightNew)
+            {
+                wxClientDC clientDC(this);
+                m_currentlyHighlighted = onShape;
+                m_currentlyHighlighted->Draw(clientDC, wxINVERT);
+            }
+
+            wxPoint newPos(m_draggedShape->GetPosition().x + (event.GetPosition().x - m_dragStartPos.x),
+                           m_draggedShape->GetPosition().y + (event.GetPosition().y - m_dragStartPos.y));
+
+            if (wxGetApp().GetUseScreen())
+            {
+                newPos = ClientToScreen(newPos);
+            }
+
+            // Move and show the image again
+            m_dragImage->Move(newPos);
+
+            if (mustUnhighlightOld || mustHighlightNew)
+                 m_dragImage->Show();
+        }
+    }
+}
+
+void MyCanvas::DrawShapes(wxDC& dc)
+{
+    wxNode* node = m_displayList.First();
+    while (node)
+    {
+        DragShape* shape = (DragShape*) node->Data();
+        if (shape->IsShown())
+          shape->Draw(dc);
+        node = node->Next();
+    }
+}
+
+void MyCanvas::EraseShape(DragShape* shape, wxDC& dc)
+{
+    wxSize sz = GetClientSize();
+    wxRect rect(0, 0, sz.x, sz.y);
+
+    wxRect rect2(shape->GetRect());
+    dc.SetClippingRegion(rect2.x, rect2.y, rect2.width, rect2.height);
+        
+    wxGetApp().TileBitmap(rect, dc, wxGetApp().GetBackgroundBitmap());
+
+    dc.DestroyClippingRegion();
+}
+
+void MyCanvas::ClearShapes()
+{
+    wxNode* node = m_displayList.First();
+    while (node)
+    {
+        DragShape* shape = (DragShape*) node->Data();
+        delete shape;
+        node = node->Next();
+    }
+    m_displayList.Clear();
+}
+
+DragShape* MyCanvas::FindShape(const wxPoint& pt) const
+{
+    wxNode* node = m_displayList.First();
+    while (node)
+    {
+        DragShape* shape = (DragShape*) node->Data();
+        if (shape->HitTest(pt))
+            return shape;
+        node = node->Next();
+    }
+    return (DragShape*) NULL;
+}
+
+// MyFrame
+
+IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
+
+BEGIN_EVENT_TABLE(MyFrame,wxFrame)
+  EVT_MENU    (wxID_ABOUT, MyFrame::OnAbout)
+  EVT_MENU    (wxID_EXIT,  MyFrame::OnQuit)
+END_EVENT_TABLE()
+
+MyFrame::MyFrame()
+       : wxFrame( (wxFrame *)NULL, -1, "wxDragImage sample",
+                  wxPoint(20,20), wxSize(470,360) )
+{
+  wxMenu *file_menu = new wxMenu();
+  file_menu->Append( wxID_ABOUT, "&About...");
+  file_menu->Append( TEST_USE_SCREEN, "&Use whole screen for dragging", "Use whole screen", TRUE);
+  file_menu->Append( wxID_EXIT, "E&xit");
+
+  wxMenuBar *menu_bar = new wxMenuBar();
+  menu_bar->Append(file_menu, "&File");
+
+  SetMenuBar( menu_bar );
+
+  CreateStatusBar(2);
+  int widths[] = { -1, 100 };
+  SetStatusWidths( 2, widths );
+
+  m_canvas = new MyCanvas( this, -1, wxPoint(0,0), wxSize(10,10) );
+}
+
+void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) )
+{
+  Close( TRUE );
+}
+
+void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) )
+{
+  (void)wxMessageBox( "wxDragImage demo\n"
+                      "Julian Smart (c) 2000",
+                      "About wxDragImage Demo", wxICON_INFORMATION | wxOK );
+}
+
+//-----------------------------------------------------------------------------
+// MyApp
+//-----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(MyApp, wxApp)
+    EVT_MENU(TEST_USE_SCREEN, MyApp::OnUseScreen)
+END_EVENT_TABLE()
+
+MyApp::MyApp()
+{
+    // Drag across whole screen
+    m_useScreen = FALSE;
+}
+
+bool MyApp::OnInit()
+{
+#if wxUSE_LIBPNG
+    wxImage::AddHandler( new wxPNGHandler );
+#endif
+
+    wxImage image;
+    if (image.LoadFile("backgrnd.png", wxBITMAP_TYPE_PNG))
+    {
+        m_background = image.ConvertToBitmap();
+    }
+
+
+    MyFrame *frame = new MyFrame();
+
+    wxString rootName("shape0");
+
+    int i;
+    for (i = 1; i < 4; i++)
+    {
+        wxString filename;
+        filename.Printf("%s%d.png", (const char*) rootName, i);
+        if (image.LoadFile(filename, wxBITMAP_TYPE_PNG))
+        {
+            DragShape* newShape = new DragShape(image.ConvertToBitmap());
+            newShape->SetPosition(wxPoint(i*50, i*50));
+
+            if (i == 2)
+                newShape->SetDragMethod(SHAPE_DRAG_TEXT);
+            else if (i == 3)
+                newShape->SetDragMethod(SHAPE_DRAG_ICON);
+            else
+                newShape->SetDragMethod(SHAPE_DRAG_BITMAP);
+            frame->GetCanvas()->GetDisplayList().Append(newShape);
+        }
+    }
+
+#if 0
+    // Under Motif or GTK, this demonstrates that
+    // wxScreenDC only gets the root window content.
+    // We need to be able to copy the overall content
+    // for full-screen dragging to work.
+    int w, h;
+    wxDisplaySize(& w, & h);
+    wxBitmap bitmap(w, h);
+
+    wxScreenDC dc;
+    wxMemoryDC memDC;
+    memDC.SelectObject(bitmap);
+    memDC.Blit(0, 0, w, h, & dc, 0, 0);
+    memDC.SelectObject(wxNullBitmap);
+    m_background = bitmap;
+#endif
+
+    frame->Show( TRUE );
+
+    return TRUE;
+}
+
+bool MyApp::TileBitmap(const wxRect& rect, wxDC& dc, wxBitmap& bitmap)
+{
+    int w = bitmap.GetWidth();
+    int h = bitmap.GetHeight();
+    
+    int i, j;
+    for (i = rect.x; i < rect.x + rect.width; i += w)
+    {
+        for (j = rect.y; j < rect.y + rect.height; j+= h)
+            dc.DrawBitmap(bitmap, i, j);
+    }
+    return TRUE;
+}
+
+void MyApp::OnUseScreen(wxCommandEvent& event)
+{
+    m_useScreen = !m_useScreen;
+}
+
+// DragShape
+
+DragShape::DragShape(const wxBitmap& bitmap)
+{
+    m_bitmap = bitmap;
+    m_pos.x = 0;
+    m_pos.y = 0;
+    m_dragMethod = SHAPE_DRAG_BITMAP;
+    m_show = TRUE;
+}
+
+DragShape::~DragShape()
+{
+}
+
+bool DragShape::HitTest(const wxPoint& pt) const
+{
+    wxRect rect(GetRect());
+    return rect.Inside(pt.x, pt.y);
+}
+
+bool DragShape::Draw(wxDC& dc, int op)
+{
+    if (m_bitmap.Ok())
+    {
+        wxMemoryDC memDC;
+        memDC.SelectObject(m_bitmap);
+    
+        dc.Blit(m_pos.x, m_pos.y, m_bitmap.GetWidth(), m_bitmap.GetHeight(),
+            & memDC, 0, 0, op, TRUE);
+
+        return TRUE;
+    }
+    else
+        return FALSE;
+}
+
diff --git a/samples/dragimag/test.def b/samples/dragimag/test.def
new file mode 100644
index 0000000000..59f0db711d
--- /dev/null
+++ b/samples/dragimag/test.def
@@ -0,0 +1,7 @@
+NAME         Minimal
+DESCRIPTION  'Minimal wxWindows application'
+EXETYPE      WINDOWS
+CODE         PRELOAD MOVEABLE DISCARDABLE
+DATA         PRELOAD MOVEABLE MULTIPLE
+HEAPSIZE     4048
+STACKSIZE    16000
diff --git a/samples/dragimag/test.h b/samples/dragimag/test.h
new file mode 100644
index 0000000000..6d94bf49bf
--- /dev/null
+++ b/samples/dragimag/test.h
@@ -0,0 +1,156 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        test.h
+// Purpose:     wxDragImage sample
+// Author:      Julian Smart
+// Modified by:
+// Created:     28/2/2000
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_DRAGIMAGSAMPLE_
+#define _WX_DRAGIMAGSAMPLE_
+
+// derived classes
+
+class MyFrame;
+class MyApp;
+class MyCanvas;
+class DragShape;
+
+// MyFrame
+
+class MyFrame: public wxFrame
+{
+public:
+    MyFrame();
+
+    void OnAbout( wxCommandEvent &event );
+    void OnQuit( wxCommandEvent &event );
+
+    MyCanvas* GetCanvas() const { return m_canvas; }
+    void SetCanvas(MyCanvas* canvas) { m_canvas = canvas; }
+
+private:
+    MyCanvas*       m_canvas;
+
+    DECLARE_DYNAMIC_CLASS(MyFrame)
+    DECLARE_EVENT_TABLE()
+};
+
+// MyApp
+
+class MyApp: public wxApp
+{
+public:
+    MyApp();
+    virtual bool OnInit();
+
+//// Operations
+
+    // Tile the bitmap
+    bool TileBitmap(const wxRect& rect, wxDC& dc, wxBitmap& bitmap);
+
+//// Accessors
+    wxBitmap& GetBackgroundBitmap() const { return (wxBitmap&) m_background; }
+
+    bool GetUseScreen() const { return m_useScreen; }
+    void SetUseScreen(bool useScreen) { m_useScreen = useScreen; }
+
+    void OnUseScreen(wxCommandEvent& event);
+
+protected:
+    wxBitmap    m_background;
+    bool        m_useScreen;
+
+DECLARE_EVENT_TABLE()
+};
+
+DECLARE_APP(MyApp)
+
+#define TEST_USE_SCREEN   100
+
+// MyCanvas
+
+// Dragging modes
+#define TEST_DRAG_NONE     0
+#define TEST_DRAG_START    1
+#define TEST_DRAG_DRAGGING 2
+
+class MyCanvas: public wxScrolledWindow
+{
+public:
+    MyCanvas( wxWindow *parent, wxWindowID, const wxPoint &pos, const wxSize &size );
+    ~MyCanvas();
+
+    void OnPaint( wxPaintEvent &event );
+    void OnEraseBackground(wxEraseEvent& event);
+    void OnMouseEvent(wxMouseEvent& event);
+
+    void DrawShapes(wxDC& dc);
+    void EraseShape(DragShape* shape, wxDC& dc);
+    void ClearShapes();
+    DragShape* FindShape(const wxPoint& pt) const;
+
+    wxList& GetDisplayList() { return m_displayList; }
+
+protected:
+
+private:
+    wxList          m_displayList; // A list of DragShapes
+    int             m_dragMode;
+    DragShape*      m_draggedShape;
+    DragShape*      m_currentlyHighlighted; // The shape that's being highlighted
+    wxPoint         m_dragStartPos;
+    wxDragImage*    m_dragImage;
+
+    DECLARE_CLASS(MyCanvas)
+    DECLARE_EVENT_TABLE()
+};
+
+
+// Ways to drag a shape
+
+#define SHAPE_DRAG_BITMAP       1
+#define SHAPE_DRAG_TEXT         2
+#define SHAPE_DRAG_ICON         3
+
+// Shape
+
+class DragShape: public wxObject
+{
+public:
+    DragShape(const wxBitmap& bitmap);
+    ~DragShape();
+
+//// Operations
+
+    bool HitTest(const wxPoint& pt) const;
+    bool Draw(wxDC& dc, int op = wxCOPY);
+
+//// Accessors
+
+    wxPoint GetPosition() const { return m_pos; }
+    void SetPosition(const wxPoint& pos) { m_pos = pos; }
+
+    wxRect GetRect() const { return wxRect(m_pos.x, m_pos.y, m_bitmap.GetWidth(), m_bitmap.GetHeight()); }
+
+    wxBitmap& GetBitmap() const { return (wxBitmap&) m_bitmap; }
+    void SetBitmap(const wxBitmap& bitmap) { m_bitmap = bitmap; }
+
+    int GetDragMethod() const { return m_dragMethod; }
+    void SetDragMethod(int method) { m_dragMethod = method; }
+
+    bool IsShown() const { return m_show; }
+    void SetShow(bool show) { m_show = show; }
+
+protected:
+    wxPoint     m_pos;
+    wxBitmap    m_bitmap;
+    int         m_dragMethod;
+    bool        m_show;
+};
+
+#endif
+    // _WX_DRAGIMAGSAMPLE_
diff --git a/samples/dragimag/test.rc b/samples/dragimag/test.rc
new file mode 100644
index 0000000000..754a072235
--- /dev/null
+++ b/samples/dragimag/test.rc
@@ -0,0 +1,5 @@
+mondrian ICON "mondrian.ico"
+dragicon ICON "dragicon.ico"
+
+#include "wx/msw/wx.rc"
+
diff --git a/src/common/image.cpp b/src/common/image.cpp
index 908e1f89a3..5f61154db2 100644
--- a/src/common/image.cpp
+++ b/src/common/image.cpp
@@ -1945,23 +1945,14 @@ wxBitmap wxImage::ConvertToBitmap() const
 
     bitmap.Create( width, height, bpp );
 
-    /*
     // Create mask
 
-      GdkImage *mask_image = (GdkImage*) NULL;
-
-        if (HasMask())
-        {
-        unsigned char *mask_data = (unsigned char*)malloc( ((width >> 3)+8) * height );
-
-          mask_image =  gdk_image_new_bitmap( gdk_visual_get_system(), mask_data, width, height );
-
-            wxMask *mask = new wxMask();
-            mask->m_bitmap = gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, 1 );
-
-              bitmap.SetMask( mask );
-              }
-    */
+    XImage *mask_image = (XImage*) NULL;
+    if (HasMask())
+    {
+        mask_image = XCreateImage( dpy, vis, 1, ZPixmap, 0, 0, width, height, 32, 0 );
+        mask_image->data = (char*) malloc( mask_image->bytes_per_line * mask_image->height );
+    }
 
     // Retrieve depth info
 
@@ -1997,11 +1988,9 @@ wxBitmap wxImage::ConvertToBitmap() const
         else if ((vi->green_mask > vi->blue_mask) && (vi->blue_mask > vi->red_mask))  b_o = GBR;
     }
 
-    /*
     int r_mask = GetMaskRed();
     int g_mask = GetMaskGreen();
     int b_mask = GetMaskBlue();
-    */
 
     XColor colors[256];
     if (bpp == 8)
@@ -2015,6 +2004,8 @@ wxBitmap wxImage::ConvertToBitmap() const
     wxSearchColor scolor( 256, colors );
     unsigned char* data = GetData();
 
+    bool hasMask = HasMask();
+
     int index = 0;
     for (int y = 0; y < height; y++)
     {
@@ -2027,15 +2018,13 @@ wxBitmap wxImage::ConvertToBitmap() const
             int b = data[index];
             index++;
 
-            /*
-            if (HasMask())
+            if (hasMask)
             {
-            if ((r == r_mask) && (b == b_mask) && (g == g_mask))
-            gdk_image_put_pixel( mask_image, x, y, 1 );
-            else
-            gdk_image_put_pixel( mask_image, x, y, 0 );
+              if ((r == r_mask) && (b == b_mask) && (g == g_mask))
+                XPutPixel( mask_image, x, y, 0 );
+              else
+                XPutPixel( mask_image, x, y, 1 );
             }
-            */
 
             switch (bpp)
             {
@@ -2113,19 +2102,24 @@ wxBitmap wxImage::ConvertToBitmap() const
     XDestroyImage( data_image );
     XFreeGC( dpy, gc );
 
-    /*
     // Blit mask
+    if (HasMask())
+    {
+        wxBitmap maskBitmap(width, height, 1);
 
-      if (HasMask())
-      {
-      GdkGC *mask_gc = gdk_gc_new( bitmap.GetMask()->GetBitmap() );
+        GC gcMask = XCreateGC( dpy, (Pixmap) maskBitmap.GetPixmap(), (XtGCMask) 0, (XGCValues*)NULL );
+        XPutImage( dpy, (Drawable)maskBitmap.GetPixmap(), gcMask, mask_image, 0, 0, 0, 0, width, height );
 
-        gdk_draw_image( bitmap.GetMask()->GetBitmap(), mask_gc, mask_image, 0, 0, 0, 0, width, height );
+        XDestroyImage( mask_image );
+        XFreeGC( dpy, gcMask );
 
-          gdk_image_destroy( mask_image );
-          gdk_gc_unref( mask_gc );
-          }
-    */
+        wxMask* mask = new wxMask;
+        mask->SetPixmap(maskBitmap.GetPixmap());
+
+        bitmap.SetMask(mask);
+
+        maskBitmap.SetPixmapNull();
+    }
 
     return bitmap;
 }
diff --git a/src/generic/dragimgg.cpp b/src/generic/dragimgg.cpp
new file mode 100644
index 0000000000..747b155153
--- /dev/null
+++ b/src/generic/dragimgg.cpp
@@ -0,0 +1,462 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        dragimgg.cpp
+// Purpose:     Generic wxDragImage implementation
+// Author:      Julian Smart
+// Modified by:
+// Created:     29/2/2000
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+#ifdef __GNUG__
+#pragma implementation "dragimgg.h"
+#endif
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include <stdio.h>
+#include "wx/setup.h"
+#include "wx/window.h"
+#include "wx/frame.h"
+#include "wx/dcclient.h"
+#include "wx/dcscreen.h"
+#include "wx/dcmemory.h"
+#include "wx/settings.h"
+#endif
+
+#include "wx/log.h"
+#include "wx/intl.h"
+
+#ifdef __WIN16__
+#define wxUSE_IMAGE_IN_DRAGIMAGE 0
+#else
+#define wxUSE_IMAGE_IN_DRAGIMAGE 1
+#endif
+
+#if wxUSE_IMAGE_IN_DRAGIMAGE
+#include "wx/image.h"
+#endif
+
+#include "wx/generic/dragimgg.h"
+
+// ----------------------------------------------------------------------------
+// macros
+// ----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxGenericDragImage, wxObject)
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wxGenericDragImage ctors/dtor
+// ----------------------------------------------------------------------------
+
+wxGenericDragImage::wxGenericDragImage()
+{
+    Init();
+}
+
+wxGenericDragImage::~wxGenericDragImage()
+{
+    if (m_windowDC)
+    {
+        delete m_windowDC;
+    }
+}
+
+void wxGenericDragImage::Init()
+{
+    m_isDirty = FALSE;
+    m_isShown = FALSE;
+    m_windowDC = (wxDC*) NULL;
+    m_window = (wxWindow*) NULL;
+    m_fullScreen = FALSE;
+}
+
+// Attributes
+////////////////////////////////////////////////////////////////////////////
+
+
+// Operations
+////////////////////////////////////////////////////////////////////////////
+
+// Create a drag image from a bitmap and optional cursor
+bool wxGenericDragImage::Create(const wxBitmap& image, const wxCursor& cursor, const wxPoint& hotspot)
+{
+    // We don't have to combine the cursor explicitly since we simply show the cursor
+    // as we drag. This currently will only work within one window.
+
+    m_cursor = cursor;
+    m_hotspot = hotspot;
+    m_bitmap = image;
+
+    return TRUE ;
+}
+
+// Create a drag image from an icon and optional cursor
+bool wxGenericDragImage::Create(const wxIcon& image, const wxCursor& cursor, const wxPoint& hotspot)
+{
+    // We don't have to combine the cursor explicitly since we simply show the cursor
+    // as we drag. This currently will only work within one window.
+
+    m_cursor = cursor;
+    m_hotspot = hotspot;
+    m_icon = image;
+
+    return TRUE ;
+}
+
+// Create a drag image from a string and optional cursor
+bool wxGenericDragImage::Create(const wxString& str, const wxCursor& cursor, const wxPoint& hotspot)
+{
+    wxFont font(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
+
+    long w, h;
+    wxScreenDC dc;
+    dc.SetFont(font);
+    dc.GetTextExtent(str, & w, & h);
+    dc.SetFont(wxNullFont);
+
+    wxMemoryDC dc2;
+    dc2.SetFont(font);
+
+    // Sometimes GetTextExtent isn't accurate enough, so make it longer
+    wxBitmap bitmap((int) ((w+2) * 1.5), (int) h+2);
+    dc2.SelectObject(bitmap);
+
+    dc2.SetBackground(* wxWHITE_BRUSH);
+    dc2.Clear();
+    dc2.SetBackgroundMode(wxTRANSPARENT);
+    dc2.SetTextForeground(* wxLIGHT_GREY);
+    dc2.DrawText(str, 0, 0);
+    dc2.DrawText(str, 1, 0);
+    dc2.DrawText(str, 2, 0);
+    dc2.DrawText(str, 1, 1);
+    dc2.DrawText(str, 2, 1);
+    dc2.DrawText(str, 1, 2);
+    dc2.DrawText(str, 2, 2);
+
+    dc2.SetTextForeground(* wxBLACK);
+    dc2.DrawText(str, 1, 1);
+
+    dc2.SelectObject(wxNullBitmap);
+
+#if wxUSE_IMAGE_IN_DRAGIMAGE
+    // Make the bitmap masked
+    wxImage image(bitmap);
+    image.SetMaskColour(255, 255, 255);
+    bitmap = image.ConvertToBitmap();
+#endif
+
+    return Create(bitmap, cursor, hotspot);
+}
+
+// Create a drag image for the given tree control item
+bool wxGenericDragImage::Create(const wxTreeCtrl& treeCtrl, wxTreeItemId& id)
+{
+    wxString str = treeCtrl.GetItemText(id);
+    return Create(str);
+}
+
+// Create a drag image for the given list control item
+bool wxGenericDragImage::Create(const wxListCtrl& listCtrl, long id)
+{
+    wxString str = listCtrl.GetItemText(id);
+    return Create(str);
+}
+
+// Begin drag
+bool wxGenericDragImage::BeginDrag(const wxPoint& hotspot, wxWindow* window, bool fullScreen, wxRect* rect)
+{
+    wxASSERT_MSG( (window != 0), wxT("Window must not be null in BeginDrag."));
+
+    m_window = window;
+    m_fullScreen = fullScreen;
+
+    if (rect)
+        m_boundingRect = * rect;
+
+    m_isDirty = FALSE;
+    m_isDirty = FALSE;
+
+    if (window)
+    {
+        window->CaptureMouse();
+
+        if (m_cursor.Ok())
+        {
+            m_oldCursor = window->GetCursor();
+            window->SetCursor(m_cursor);
+        }
+    }
+
+    // Make a copy of the window so we can repair damage done as the image is
+    // dragged.
+
+    wxSize clientSize;
+    wxPoint pt(0, 0);
+    if (!m_fullScreen)
+    {
+        clientSize = window->GetClientSize();
+        m_boundingRect.x = 0; m_boundingRect.y = 0;
+        m_boundingRect.width = clientSize.x; m_boundingRect.height = clientSize.y;
+    }
+    else
+    {
+        int w, h;
+        wxDisplaySize(& w, & h);
+        clientSize.x = w; clientSize.y = h;
+        if (rect)
+        {
+            pt.x = m_boundingRect.x; pt.y = m_boundingRect.y;
+            clientSize.x = m_boundingRect.width; clientSize.y = m_boundingRect.height;
+        }
+        else
+        {
+            m_boundingRect.x = 0; m_boundingRect.y = 0;
+            m_boundingRect.width = w; m_boundingRect.height = h;
+        }
+    }
+
+    if (!m_backingBitmap.Ok() || (m_backingBitmap.GetWidth() < clientSize.x || m_backingBitmap.GetHeight() < clientSize.y))
+        m_backingBitmap = wxBitmap(clientSize.x, clientSize.y);
+
+    if (!m_fullScreen)
+        m_windowDC = new wxClientDC(window);
+    else
+    {
+        m_windowDC = new wxScreenDC;
+
+#if 0
+        // Use m_boundingRect to limit the area considered.
+        ((wxScreenDC*) m_windowDC)->StartDrawingOnTop(rect);
+#endif
+
+        m_windowDC->SetClippingRegion(m_boundingRect.x, m_boundingRect.y,
+            m_boundingRect.width, m_boundingRect.height);
+    }
+
+    return TRUE;
+}
+
+// Begin drag. hotspot is the location of the drag position relative to the upper-left
+// corner of the image. This is full screen only. fullScreenRect gives the
+// position of the window on the screen, to restrict the drag to.
+bool wxGenericDragImage::BeginDrag(const wxPoint& hotspot, wxWindow* window, wxWindow* fullScreenRect)
+{
+    wxRect rect;
+
+    int x = fullScreenRect->GetPosition().x;
+    int y = fullScreenRect->GetPosition().y;
+    
+    wxSize sz = fullScreenRect->GetSize();
+
+    if (fullScreenRect->GetParent() && !fullScreenRect->IsKindOf(CLASSINFO(wxFrame)))
+        fullScreenRect->GetParent()->ClientToScreen(& x, & y);
+
+    rect.x = x; rect.y = y;
+    rect.width = sz.x; rect.height = sz.y;
+
+    return BeginDrag(hotspot, window, TRUE, & rect);
+}
+
+// End drag
+bool wxGenericDragImage::EndDrag()
+{
+    if (m_window)
+    {
+        m_window->ReleaseMouse();
+        if (m_cursor.Ok() && m_oldCursor.Ok())
+        {
+            m_window->SetCursor(m_oldCursor);
+        }
+    }
+
+    if (m_windowDC)
+    {
+        m_windowDC->DestroyClippingRegion();
+        delete m_windowDC;
+        m_windowDC = (wxDC*) NULL;
+    }
+
+    m_repairBitmap = wxNullBitmap;
+
+    return TRUE;
+}
+
+// Move the image: call from OnMouseMove. Pt is in window client coordinates if window
+// is non-NULL, or in screen coordinates if NULL.
+bool wxGenericDragImage::Move(const wxPoint& pt)
+{
+    wxASSERT_MSG( (m_windowDC != (wxDC*) NULL), "No window DC in wxGenericDragImage::Move()" );
+
+    // Erase at old position, then show at the current position
+    wxPoint oldPos = m_position;
+
+    bool eraseOldImage = (m_isDirty && m_isShown);
+    
+    if (m_isShown)
+        RedrawImage(oldPos, pt, eraseOldImage, TRUE);
+
+    m_position = pt;
+
+    if (m_isShown)
+        m_isDirty = TRUE;
+
+    return TRUE;
+}
+
+bool wxGenericDragImage::Show()
+{
+    wxASSERT_MSG( (m_windowDC != (wxDC*) NULL), "No window DC in wxGenericDragImage::Show()" );
+    
+    // Show at the current position
+
+    if (!m_isShown)
+    {
+        // This is where we restore the backing bitmap, in case
+        // something has changed on the window.
+
+        wxMemoryDC memDC;
+        memDC.SelectObject(m_backingBitmap);
+        memDC.Blit(0, 0, m_boundingRect.width, m_boundingRect.height, m_windowDC, m_boundingRect.x, m_boundingRect.y);
+        memDC.SelectObject(wxNullBitmap);
+
+        RedrawImage(m_position, m_position, FALSE, TRUE);
+    }
+
+    m_isShown = TRUE;
+    m_isDirty = TRUE;
+
+    return TRUE;
+}
+
+bool wxGenericDragImage::Hide()
+{
+    wxASSERT_MSG( (m_windowDC != (wxDC*) NULL), "No window DC in wxGenericDragImage::Hide()" );
+
+    // Repair the old position
+
+    if (m_isShown && m_isDirty)
+    {
+        RedrawImage(m_position, m_position, TRUE, FALSE);
+    }
+
+    m_isShown = FALSE;
+    m_isDirty = FALSE;
+
+    return TRUE;
+}
+
+// More efficient: erase and redraw simultaneously if possible
+bool wxGenericDragImage::RedrawImage(const wxPoint& oldPos, const wxPoint& newPos,
+                                     bool eraseOld, bool drawNew)
+{
+    if (!m_windowDC)
+        return FALSE;
+
+    if (!m_backingBitmap.Ok())
+        return FALSE;
+
+    wxRect oldRect(GetImageRect(oldPos));
+    wxRect newRect(GetImageRect(newPos));
+
+    wxRect fullRect;
+
+    // Full rect: the combination of both rects
+    if (eraseOld && drawNew)
+    {
+        int oldRight = oldRect.GetRight();
+        int oldBottom = oldRect.GetBottom();
+        int newRight = newRect.GetRight();
+        int newBottom = newRect.GetBottom();
+
+        wxPoint topLeft = wxPoint(wxMin(oldPos.x, newPos.x), wxMin(oldPos.y, newPos.y));
+        wxPoint bottomRight = wxPoint(wxMax(oldRight, newRight), wxMax(oldBottom, newBottom));
+
+        fullRect.x = topLeft.x; fullRect.y = topLeft.y;
+        fullRect.SetRight(bottomRight.x);
+        fullRect.SetBottom(bottomRight.y);
+    }
+    else if (eraseOld)
+        fullRect = oldRect;
+    else if (drawNew)
+        fullRect = newRect;
+
+    // Make the bitmap bigger than it need be, so we don't
+    // keep reallocating all the time.
+    int excess = 50;
+
+    if (!m_repairBitmap.Ok() || (m_repairBitmap.GetWidth() < fullRect.GetWidth() || m_repairBitmap.GetHeight() < fullRect.GetHeight()))
+    {
+        m_repairBitmap = wxBitmap(fullRect.GetWidth() + excess, fullRect.GetHeight() + excess);
+    }
+
+    wxMemoryDC memDC;
+    memDC.SelectObject(m_backingBitmap);
+
+    wxMemoryDC memDCTemp;
+    memDCTemp.SelectObject(m_repairBitmap);
+
+    // Draw the backing bitmap onto the repair bitmap.
+    // If full-screen, we may have specified the rect on the
+    // screen that we're using for our backing bitmap.
+    // So subtract this when we're blitting from the backing bitmap
+    // (translate from screen to backing-bitmap coords).
+
+    memDCTemp.Blit(0, 0, fullRect.GetWidth(), fullRect.GetHeight(), & memDC, fullRect.x - m_boundingRect.x, fullRect.y - m_boundingRect.y);
+
+    // If drawing, draw the image onto the mem DC
+    if (drawNew)
+    {
+        int x = newPos.x - fullRect.x;
+        int y = newPos.y - fullRect.y;
+        if (m_bitmap.Ok())
+            memDCTemp.DrawBitmap(m_bitmap, x, y, (m_bitmap.GetMask() != 0));
+        else if (m_icon.Ok())
+            memDCTemp.DrawIcon(m_icon, x, y);
+    }
+
+    // Now blit to the window
+    // Finally, blit the temp mem DC to the window.
+    m_windowDC->Blit(fullRect.x, fullRect.y, fullRect.width, fullRect.height, & memDCTemp, 0, 0);
+
+    memDCTemp.SelectObject(wxNullBitmap);
+    memDC.SelectObject(wxNullBitmap);
+
+    return TRUE;
+}
+
+wxRect wxGenericDragImage::GetImageRect(const wxPoint& pos) const
+{
+    if (m_bitmap.Ok())
+    {
+        return wxRect(pos.x, pos.y, m_bitmap.GetWidth(), m_bitmap.GetHeight());
+    }
+    else if (m_icon.Ok())
+    {
+        return wxRect(pos.x, pos.y, m_icon.GetWidth(), m_icon.GetHeight());
+    }
+    else
+    {
+        return wxRect(pos.x, pos.y, 0, 0);
+    }
+}
+
diff --git a/src/gtk/files.lst b/src/gtk/files.lst
index 7748558b13..9ccf047918 100644
--- a/src/gtk/files.lst
+++ b/src/gtk/files.lst
@@ -8,6 +8,7 @@ ALL_SOURCES = \
 		generic/colrdlgg.cpp \
 		generic/dcpsg.cpp \
 		generic/dirdlgg.cpp \
+		generic/dragimgg.cpp \
 		generic/filedlgg.cpp \
 		generic/grid.cpp \
 		generic/helpext.cpp \
@@ -748,6 +749,7 @@ GENERICOBJS = \
 		caret.o \
 		choicdgg.o \
 		colrdlgg.o \
+		dragimgg.o \
 		dcpsg.o \
 		dirdlgg.o \
 		filedlgg.o \
@@ -788,6 +790,7 @@ GENERICDEPS = \
 		colrdlgg.d \
 		dcpsg.d \
 		dirdlgg.d \
+		dragimgg.d \
 		filedlgg.d \
 		grid.d \
 		helpext.d \
diff --git a/src/gtk1/files.lst b/src/gtk1/files.lst
index 7748558b13..9ccf047918 100644
--- a/src/gtk1/files.lst
+++ b/src/gtk1/files.lst
@@ -8,6 +8,7 @@ ALL_SOURCES = \
 		generic/colrdlgg.cpp \
 		generic/dcpsg.cpp \
 		generic/dirdlgg.cpp \
+		generic/dragimgg.cpp \
 		generic/filedlgg.cpp \
 		generic/grid.cpp \
 		generic/helpext.cpp \
@@ -748,6 +749,7 @@ GENERICOBJS = \
 		caret.o \
 		choicdgg.o \
 		colrdlgg.o \
+		dragimgg.o \
 		dcpsg.o \
 		dirdlgg.o \
 		filedlgg.o \
@@ -788,6 +790,7 @@ GENERICDEPS = \
 		colrdlgg.d \
 		dcpsg.d \
 		dirdlgg.d \
+		dragimgg.d \
 		filedlgg.d \
 		grid.d \
 		helpext.d \
diff --git a/src/html/htmprint.cpp b/src/html/htmprint.cpp
index ef8c0b5a23..e552d63d80 100644
--- a/src/html/htmprint.cpp
+++ b/src/html/htmprint.cpp
@@ -191,8 +191,8 @@ bool wxHtmlPrintout::OnBeginDocument(int startPage, int endPage)
     /* prepare headers/footers renderer: */
     
     m_RendererHdr -> SetDC(GetDC(), (double)ppiPrinterY / (double)ppiScreenY);
-    m_RendererHdr -> SetSize(ppmm_h * (mm_w - m_MarginLeft - m_MarginTop), 
-                          ppmm_v * (mm_h - m_MarginTop - m_MarginBottom));
+    m_RendererHdr -> SetSize((int) (ppmm_h * (mm_w - m_MarginLeft - m_MarginTop)), 
+                          (int) (ppmm_v * (mm_h - m_MarginTop - m_MarginBottom)));
     if (m_Headers[0] != wxEmptyString) {
         m_RendererHdr -> SetHtmlText(TranslateHeader(m_Headers[0], 1));
         m_HeaderHeight = m_RendererHdr -> GetTotalHeight();
@@ -212,12 +212,12 @@ bool wxHtmlPrintout::OnBeginDocument(int startPage, int endPage)
     
     /* prepare main renderer: */
     m_Renderer -> SetDC(GetDC(), (double)ppiPrinterY / (double)ppiScreenY);
-    m_Renderer -> SetSize(ppmm_h * (mm_w - m_MarginLeft - m_MarginTop), 
-                          ppmm_v * (mm_h - m_MarginTop - m_MarginBottom) - 
+    m_Renderer -> SetSize((int) (ppmm_h * (mm_w - m_MarginLeft - m_MarginTop)), 
+                          (int) (ppmm_v * (mm_h - m_MarginTop - m_MarginBottom) - 
                           m_FooterHeight - m_HeaderHeight -
                           ((m_HeaderHeight == 0) ? 0 : m_MarginSpace * ppmm_v) -
                           ((m_FooterHeight == 0) ? 0 : m_MarginSpace * ppmm_v)
-                          );
+                          ));
     m_Renderer -> SetHtmlText(m_Document, m_BasePath, m_BasePathIsDir);
     CountPages();
     return TRUE;
@@ -317,8 +317,8 @@ void wxHtmlPrintout::CountPages()
     
     m_PageBreaks[0] = 0;
     do {
-        pos = m_Renderer -> Render(ppmm_h * m_MarginLeft, 
-                                   ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight,
+        pos = m_Renderer -> Render((int)( ppmm_h * m_MarginLeft), 
+                                   (int) (ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight),
                                    pos, TRUE);
         m_PageBreaks[++m_NumPages] = pos;
     } while (pos < m_Renderer -> GetTotalHeight());
@@ -351,18 +351,18 @@ void wxHtmlPrintout::RenderPage(wxDC *dc, int page)
     
     dc -> SetBackgroundMode(wxTRANSPARENT);
 
-    m_Renderer -> Render(ppmm_h * m_MarginLeft, 
-                         ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight,
+    m_Renderer -> Render((int) (ppmm_h * m_MarginLeft), 
+                         (int) (ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight),
                          m_PageBreaks[page-1]);
     
     m_RendererHdr -> SetDC(dc, (double)ppiPrinterY / (double)ppiScreenY);
     if (m_Headers[page % 2] != wxEmptyString) {
         m_RendererHdr -> SetHtmlText(TranslateHeader(m_Headers[page % 2], page));
-        m_RendererHdr -> Render(ppmm_h * m_MarginLeft, ppmm_v * m_MarginTop);
+        m_RendererHdr -> Render((int) (ppmm_h * m_MarginLeft), (int) (ppmm_v * m_MarginTop));
     }
     if (m_Footers[page % 2] != wxEmptyString) {
         m_RendererHdr -> SetHtmlText(TranslateHeader(m_Footers[page % 2], page));
-        m_RendererHdr -> Render(ppmm_h * m_MarginLeft, pageHeight - ppmm_v * m_MarginBottom - m_FooterHeight);
+        m_RendererHdr -> Render((int) (ppmm_h * m_MarginLeft), (int) (pageHeight - ppmm_v * m_MarginBottom - m_FooterHeight));
     }
 }
 
diff --git a/src/motif/dcscreen.cpp b/src/motif/dcscreen.cpp
index 1b0597df23..1da45d5e39 100644
--- a/src/motif/dcscreen.cpp
+++ b/src/motif/dcscreen.cpp
@@ -14,6 +14,7 @@
 #endif
 
 #include "wx/window.h"
+#include "wx/frame.h"
 #include "wx/dcscreen.h"
 #include "wx/utils.h"
 
@@ -64,6 +65,7 @@ wxScreenDC::wxScreenDC()
 
 wxScreenDC::~wxScreenDC()
 {
+    EndDrawingOnTop();
 }
 
 bool wxScreenDC::StartDrawingOnTop(wxWindow* window)
@@ -71,7 +73,7 @@ bool wxScreenDC::StartDrawingOnTop(wxWindow* window)
     wxRect rect;
     int x, y, width, height;
     window->GetPosition(& x, & y);
-    if (window->GetParent())
+    if (window->GetParent() && !window->IsKindOf(CLASSINFO(wxFrame)))
         window->GetParent()->ClientToScreen(& x, & y);
     window->GetSize(& width, & height);
     rect.x = x; rect.y = y;
diff --git a/src/motif/files.lst b/src/motif/files.lst
index cb9ff4bff6..c26d29d564 100644
--- a/src/motif/files.lst
+++ b/src/motif/files.lst
@@ -8,6 +8,7 @@ ALL_SOURCES = \
 		generic/colrdlgg.cpp \
 		generic/dcpsg.cpp \
 		generic/dirdlgg.cpp \
+		generic/dragimgg.cpp \
 		generic/fontdlgg.cpp \
 		generic/grid.cpp \
 		generic/helpext.cpp \
@@ -745,6 +746,7 @@ GENERICOBJS = \
 		caret.o \
 		choicdgg.o \
 		colrdlgg.o \
+		dragimgg.o \
 		dcpsg.o \
 		dirdlgg.o \
 		fontdlgg.o \
@@ -785,6 +787,7 @@ GENERICDEPS = \
 		calctrl.d \
 		caret.d \
 		choicdgg.d \
+		dragimgg.d \
 		colrdlgg.d \
 		dcpsg.d \
 		dirdlgg.d \
diff --git a/src/msw/dragimag.cpp b/src/msw/dragimag.cpp
index 1ce8b4e548..b5aca15c51 100644
--- a/src/msw/dragimag.cpp
+++ b/src/msw/dragimag.cpp
@@ -43,6 +43,8 @@
 
 #include "wx/log.h"
 #include "wx/intl.h"
+#include "wx/frame.h"
+#include "wx/image.h"
 
 #include "wx/msw/dragimag.h"
 #include "wx/msw/private.h"
@@ -69,15 +71,24 @@ IMPLEMENT_DYNAMIC_CLASS(wxDragImage, wxObject)
 
 wxDragImage::wxDragImage()
 {
-    m_hImageList = 0;
+    Init();
 }
 
 wxDragImage::~wxDragImage()
 {
     if ( m_hImageList )
         ImageList_Destroy(GetHimageList());
+    if ( m_hCursorImageList )
+        ImageList_Destroy((HIMAGELIST) m_hCursorImageList);
 }
 
+void wxDragImage::Init()
+{
+    m_hImageList = 0;
+    m_hCursorImageList = 0;
+    m_window = (wxWindow*) NULL;
+    m_fullScreen = FALSE;
+}
 
 // Attributes
 ////////////////////////////////////////////////////////////////////////////
@@ -93,24 +104,43 @@ bool wxDragImage::Create(const wxBitmap& image, const wxCursor& cursor, const wx
         ImageList_Destroy(GetHimageList());
     m_hImageList = 0;
 
-    UINT flags = 0;
-    bool mask = TRUE; // ?
+    UINT flags = 0 ;
+    if (image.GetDepth() <= 4)
+        flags = ILC_COLOR4;
+    else if (image.GetDepth() <= 8)
+        flags = ILC_COLOR8;
+    else if (image.GetDepth() <= 16)
+        flags = ILC_COLOR16;
+    else if (image.GetDepth() <= 24)
+        flags = ILC_COLOR24;
+    else
+        flags = ILC_COLOR32;
+
+    bool mask = (image.GetMask() != 0);
     if ( mask )
         flags |= ILC_MASK;
 
     m_hImageList = (WXHIMAGELIST) ImageList_Create(image.GetWidth(), image.GetHeight(), flags, 1, 1);
 
-    HBITMAP hBitmap1 = (HBITMAP) image.GetHBITMAP();
-    HBITMAP hBitmap2 = 0;
-    if ( image.GetMask() )
-        hBitmap2 = (HBITMAP) image.GetMask()->GetMaskBitmap();
+    int index;
+    if (!mask)
+    {
+        HBITMAP hBitmap1 = (HBITMAP) image.GetHBITMAP();
+        index = ImageList_Add(GetHimageList(), hBitmap1, 0);
+    }
+    else
+    {
+        HBITMAP hBitmap1 = (HBITMAP) image.GetHBITMAP();
+        HBITMAP hBitmap2 = (HBITMAP) image.GetMask()->GetMaskBitmap();
+        HBITMAP hbmpMask = wxInvertMask(hBitmap2);
 
-    int index = ImageList_Add(GetHimageList(), hBitmap1, hBitmap2);
+        index = ImageList_Add(GetHimageList(), hBitmap1, hbmpMask);
+        ::DeleteObject(hbmpMask);
+    }
     if ( index == -1 )
     {
         wxLogError(_("Couldn't add an image to the image list."));
     }
-
     m_cursor = cursor; // Can only combine with drag image after calling BeginDrag.
     m_hotspot = hotspot;
 
@@ -124,8 +154,18 @@ bool wxDragImage::Create(const wxIcon& image, const wxCursor& cursor, const wxPo
         ImageList_Destroy(GetHimageList());
     m_hImageList = 0;
 
-    UINT flags = 0;
-    bool mask = TRUE; // ?
+    UINT flags = 0 ;
+    if (image.GetDepth() <= 4)
+        flags = ILC_COLOR4;
+    else if (image.GetDepth() <= 8)
+        flags = ILC_COLOR8;
+    else if (image.GetDepth() <= 16)
+        flags = ILC_COLOR16;
+    else if (image.GetDepth() <= 24)
+        flags = ILC_COLOR24;
+    else
+        flags = ILC_COLOR32;
+    bool mask = TRUE;
     if ( mask )
         flags |= ILC_MASK;
 
@@ -154,18 +194,34 @@ bool wxDragImage::Create(const wxString& str, const wxCursor& cursor, const wxPo
     wxScreenDC dc;
     dc.SetFont(font);
     dc.GetTextExtent(str, & w, & h);
+    dc.SetFont(wxNullFont);
 
     wxMemoryDC dc2;
     dc2.SetFont(font);
-    wxBitmap bitmap((int) w, (int) h);
+    wxBitmap bitmap((int) w+2, (int) h+2);
     dc2.SelectObject(bitmap);
 
     dc2.SetBackground(* wxWHITE_BRUSH);
     dc2.Clear();
+    dc2.SetBackgroundMode(wxTRANSPARENT);
+    dc2.SetTextForeground(* wxLIGHT_GREY);
     dc2.DrawText(str, 0, 0);
+    dc2.DrawText(str, 1, 0);
+    dc2.DrawText(str, 2, 0);
+    dc2.DrawText(str, 1, 1);
+    dc2.DrawText(str, 2, 1);
+    dc2.DrawText(str, 1, 2);
+    dc2.DrawText(str, 2, 2);
+    dc2.SetTextForeground(* wxBLACK);
+    dc2.DrawText(str, 1, 1);
 
     dc2.SelectObject(wxNullBitmap);
 
+    // Make the bitmap masked
+    wxImage image(bitmap);
+    image.SetMaskColour(255, 255, 255);
+    bitmap = image.ConvertToBitmap();
+
     return Create(bitmap, cursor, hotspot);
 }
 
@@ -190,9 +246,14 @@ bool wxDragImage::Create(const wxListCtrl& listCtrl, long id)
 }
 
 // Begin drag
-bool wxDragImage::BeginDrag(const wxPoint& hotspot, wxWindow* window)
+bool wxDragImage::BeginDrag(const wxPoint& hotspot, wxWindow* window, bool fullScreen, wxRect* rect)
 {
     wxASSERT_MSG( (m_hImageList != 0), wxT("Image list must not be null in BeginDrag."));
+    wxASSERT_MSG( (window != 0), wxT("Window must not be null in BeginDrag."));
+
+    m_fullScreen = fullScreen;
+    if (rect)
+        m_boundingRect = * rect;
 
     bool ret = (ImageList_BeginDrag(GetHimageList(), 0, hotspot.x, hotspot.y) != 0);
 
@@ -205,25 +266,57 @@ bool wxDragImage::BeginDrag(const wxPoint& hotspot, wxWindow* window)
 
     if (m_cursor.Ok())
     {
+        if (!m_hCursorImageList)
+        {           
+            int cxCursor = GetSystemMetrics(SM_CXCURSOR); 
+            int cyCursor = GetSystemMetrics(SM_CYCURSOR); 
+ 
+            m_hCursorImageList = (WXHIMAGELIST) ImageList_Create(cxCursor, cyCursor, ILC_MASK, 1, 1);
+        }
+
         // First add the cursor to the image list
-        int cursorIndex = ImageList_AddIcon(GetHimageList(), (HICON) m_cursor.GetHCURSOR());
+        HCURSOR hCursor = (HCURSOR) m_cursor.GetHCURSOR();
+        int cursorIndex = ImageList_AddIcon((HIMAGELIST) m_hCursorImageList, (HICON) hCursor);
 
         wxASSERT_MSG( (cursorIndex != -1), wxT("ImageList_AddIcon failed in BeginDrag."));
 
         if (cursorIndex != -1)
         {
-            ImageList_SetDragCursorImage(GetHimageList(), cursorIndex, m_hotspot.x, m_hotspot.y);
+            ImageList_SetDragCursorImage((HIMAGELIST) m_hCursorImageList, cursorIndex, m_hotspot.x, m_hotspot.y);
         }
     }
 
+    m_window = window;
     ::ShowCursor(FALSE);
+
     ::SetCapture(GetHwndOf(window));
 
     return TRUE;
 }
 
+// Begin drag. hotspot is the location of the drag position relative to the upper-left
+// corner of the image. This is full screen only. fullScreenRect gives the
+// position of the window on the screen, to restrict the drag to.
+bool wxDragImage::BeginDrag(const wxPoint& hotspot, wxWindow* window, wxWindow* fullScreenRect)
+{
+    wxRect rect;
+
+    int x = fullScreenRect->GetPosition().x;
+    int y = fullScreenRect->GetPosition().y;
+    
+    wxSize sz = fullScreenRect->GetSize();
+
+    if (fullScreenRect->GetParent() && !fullScreenRect->IsKindOf(CLASSINFO(wxFrame)))
+        fullScreenRect->GetParent()->ClientToScreen(& x, & y);
+
+    rect.x = x; rect.y = y;
+    rect.width = sz.x; rect.height = sz.y;
+
+    return BeginDrag(hotspot, window, TRUE, & rect);
+}
+
 // End drag
-bool wxDragImage::EndDrag(wxWindow* WXUNUSED(window))
+bool wxDragImage::EndDrag()
 {
     wxASSERT_MSG( (m_hImageList != 0), wxT("Image list must not be null in EndDrag."));
 
@@ -235,13 +328,14 @@ bool wxDragImage::EndDrag(wxWindow* WXUNUSED(window))
     }
 
     ::ShowCursor(TRUE);
+    m_window = (wxWindow*) NULL;
 
     return TRUE;
 }
 
 // Move the image: call from OnMouseMove. Pt is in window client coordinates if window
 // is non-NULL, or in screen coordinates if NULL.
-bool wxDragImage::Move(const wxPoint& pt, wxWindow* window)
+bool wxDragImage::Move(const wxPoint& pt)
 {
     wxASSERT_MSG( (m_hImageList != 0), wxT("Image list must not be null in Move."));
 
@@ -253,26 +347,26 @@ bool wxDragImage::Move(const wxPoint& pt, wxWindow* window)
     return ret;
 }
 
-bool wxDragImage::Show(wxWindow* window)
+bool wxDragImage::Show()
 {
     wxASSERT_MSG( (m_hImageList != 0), wxT("Image list must not be null in Show."));
 
     HWND hWnd = 0;
-    if (window)
-        hWnd = (HWND) window->GetHWND();
+    if (m_window && !m_fullScreen)
+        hWnd = (HWND) m_window->GetHWND();
 
     bool ret = (ImageList_DragEnter( hWnd, m_position.x, m_position.y ) != 0);
 
     return ret;
 }
 
-bool wxDragImage::Hide(wxWindow* window)
+bool wxDragImage::Hide()
 {
     wxASSERT_MSG( (m_hImageList != 0), wxT("Image list must not be null in Hide."));
 
     HWND hWnd = 0;
-    if (window)
-        hWnd = (HWND) window->GetHWND();
+    if (m_window && !m_fullScreen)
+        hWnd = (HWND) m_window->GetHWND();
 
     bool ret = (ImageList_DragLeave( hWnd ) != 0);
 
diff --git a/src/msw/makefile.b32 b/src/msw/makefile.b32
index 9429f461a0..a6db54f787 100644
--- a/src/msw/makefile.b32
+++ b/src/msw/makefile.b32
@@ -1,6 +1,6 @@
 
 
-# This file was automatically generated by tmake at 12:24, 2000/02/28
+# This file was automatically generated by tmake at 16:52, 2000/02/29
 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE B32.T!
 
 #
@@ -81,6 +81,7 @@ DOCDIR = $(WXDIR)\docs
 GENERICOBJS= $(MSWDIR)\busyinfo.obj \
 		$(MSWDIR)\calctrl.obj \
 		$(MSWDIR)\choicdgg.obj \
+		$(MSWDIR)\dragimgg.obj \
 		$(MSWDIR)\grid.obj \
 		$(MSWDIR)\laywin.obj \
 		$(MSWDIR)\logg.obj \
@@ -794,6 +795,8 @@ $(MSWDIR)\calctrl.obj: $(GENDIR)\calctrl.$(SRCSUFF)
 
 $(MSWDIR)\choicdgg.obj: $(GENDIR)\choicdgg.$(SRCSUFF)
 
+$(MSWDIR)\dragimgg.obj: $(GENDIR)\dragimgg.$(SRCSUFF)
+
 $(MSWDIR)\grid.obj: $(GENDIR)\grid.$(SRCSUFF)
 
 $(MSWDIR)\laywin.obj: $(GENDIR)\laywin.$(SRCSUFF)
diff --git a/src/msw/makefile.bcc b/src/msw/makefile.bcc
index d647a8395b..5075d23e13 100644
--- a/src/msw/makefile.bcc
+++ b/src/msw/makefile.bcc
@@ -1,6 +1,6 @@
 
 
-# This file was automatically generated by tmake at 12:24, 2000/02/28
+# This file was automatically generated by tmake at 16:52, 2000/02/29
 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE BCC.T!
 
 #
@@ -77,6 +77,7 @@ GENERICOBJS= $(MSWDIR)\busyinfo.obj \
 		$(MSWDIR)\calctrl.obj \
 		$(MSWDIR)\choicdgg.obj \
 		$(MSWDIR)\dirdlgg.obj \
+		$(MSWDIR)\dragimgg.obj \
 		$(MSWDIR)\grid.obj \
 		$(MSWDIR)\imaglist.obj \
 		$(MSWDIR)\laywin.obj \
@@ -649,6 +650,8 @@ $(MSWDIR)\choicdgg.obj: $(GENDIR)\choicdgg.$(SRCSUFF)
 
 $(MSWDIR)\dirdlgg.obj: $(GENDIR)\dirdlgg.$(SRCSUFF)
 
+$(MSWDIR)\dragimgg.obj: $(GENDIR)\dragimgg.$(SRCSUFF)
+
 $(MSWDIR)\grid.obj: $(GENDIR)\grid.$(SRCSUFF)
 
 $(MSWDIR)\imaglist.obj: $(GENDIR)\imaglist.$(SRCSUFF)
diff --git a/src/msw/makefile.dos b/src/msw/makefile.dos
index 970f679626..07a1334b3c 100644
--- a/src/msw/makefile.dos
+++ b/src/msw/makefile.dos
@@ -1,4 +1,4 @@
-# This file was automatically generated by tmake at 18:32, 2000/02/17
+# This file was automatically generated by tmake at 15:56, 2000/02/29
 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE DOS.T!
 
 #
@@ -61,6 +61,7 @@ GENERICOBJS= $(GENDIR)\busyinfo.obj \
 		$(GENDIR)\calctrl.obj \
 		$(GENDIR)\choicdgg.obj \
 		$(GENDIR)\dirdlgg.obj \
+		$(GENDIR)\dragimgg.obj \
 		$(GENDIR)\grid.obj \
 		$(GENDIR)\imaglist.obj \
 		$(GENDIR)\laywin.obj \
@@ -216,6 +217,7 @@ MSWOBJS1 = $(MSWDIR)\accel.obj \
 		$(MSWDIR)\gaugemsw.obj \
 		$(MSWDIR)\gdiimage.obj \
 		$(MSWDIR)\gdiobj.obj \
+		$(MSWDIR)\glcanvas.obj \
 		$(MSWDIR)\gsocket.obj \
 		$(MSWDIR)\helpwin.obj \
 		$(MSWDIR)\icon.obj \
@@ -529,6 +531,11 @@ $(MSWDIR)/gdiobj.obj:     $*.$(SRCSUFF)
 $(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
 <<
 
+$(MSWDIR)/glcanvas.obj:     $*.$(SRCSUFF)
+        cl @<<
+$(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
+<<
+
 $(MSWDIR)/gsocket.obj:     $*.c
         cl @<<
 $(CPPFLAGS2) /Fo$@ /c /Tc $*.c
@@ -1169,6 +1176,11 @@ $(GENDIR)/dirdlgg.obj:     $*.$(SRCSUFF)
 $(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
 <<
 
+$(GENDIR)/dragimgg.obj:     $*.$(SRCSUFF)
+        cl @<<
+$(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
+<<
+
 $(GENDIR)/grid.obj:     $*.$(SRCSUFF)
         cl @<<
 $(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
@@ -1284,6 +1296,11 @@ $(GENDIR)/treectrl.obj:     $*.$(SRCSUFF)
 $(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
 <<
 
+$(GENDIR)/treelay.obj:     $*.$(SRCSUFF)
+        cl @<<
+$(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
+<<
+
 $(GENDIR)/wizard.obj:     $*.$(SRCSUFF)
         cl @<<
 $(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
diff --git a/src/msw/makefile.g95 b/src/msw/makefile.g95
index 1004d5662f..df4e156f6b 100644
--- a/src/msw/makefile.g95
+++ b/src/msw/makefile.g95
@@ -72,6 +72,7 @@ GENERICOBJS = \
                 $(GENDIR)/busyinfo.$(OBJSUFF) \
 		$(GENDIR)/calctrl.$(OBJSUFF) \
 		$(GENDIR)/choicdgg.$(OBJSUFF) \
+		$(GENDIR)/dragimgg.$(OBJSUFF) \
 		$(GENDIR)/grid.$(OBJSUFF) \
 		$(GENDIR)/laywin.$(OBJSUFF) \
 		$(GENDIR)/logg.$(OBJSUFF) \
diff --git a/src/msw/makefile.vc b/src/msw/makefile.vc
index b5f724b0d0..36afd2f14c 100644
--- a/src/msw/makefile.vc
+++ b/src/msw/makefile.vc
@@ -1,4 +1,4 @@
-# This file was automatically generated by tmake at 12:24, 2000/02/28
+# This file was automatically generated by tmake at 16:52, 2000/02/29
 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE VC.T!
 
 # File:     makefile.vc
@@ -86,6 +86,7 @@ $(CPPFLAGS) /Fo$@ /c /Tp $<
 GENERICOBJS= ..\generic\$D\busyinfo.obj \
 		..\generic\$D\calctrl.obj \
 		..\generic\$D\choicdgg.obj \
+		..\generic\$D\dragimgg.obj \
 		..\generic\$D\grid.obj \
 		..\generic\$D\laywin.obj \
 		..\generic\$D\logg.obj \
diff --git a/src/msw/makefile.wat b/src/msw/makefile.wat
index fbda5947ab..4fad98fd22 100644
--- a/src/msw/makefile.wat
+++ b/src/msw/makefile.wat
@@ -42,6 +42,7 @@ DOCDIR = $(WXDIR)\docs
 GENERICOBJS= busyinfo.obj &
 	calctrl.obj &
 	choicdgg.obj &
+	dragimgg.obj &
 	grid.obj &
 	laywin.obj &
 	logg.obj &
diff --git a/src/msw/treectrl.cpp b/src/msw/treectrl.cpp
index c6c1cd6d35..c0eb3fd506 100644
--- a/src/msw/treectrl.cpp
+++ b/src/msw/treectrl.cpp
@@ -1725,6 +1725,15 @@ long wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
             case WM_LBUTTONDOWN:
                 if ( htItem && isMultiple )
                 {
+<<<<<<< treectrl.cpp
+                    int x = GET_X_LPARAM(lParam),
+                        y = GET_Y_LPARAM(lParam);
+
+                    m_dragImage->Move(wxPoint(x, y));
+
+                    HTREEITEM htiTarget = GetItemFromPoint(GetHwnd(), x, y);
+                    if ( htiTarget )
+=======
                     if ( wParam & MK_CONTROL )
                     {
                         SetFocus();
@@ -1783,9 +1792,9 @@ long wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
                     {
                         // highlight the item as target (hiding drag image is
                         // necessary - otherwise the display will be corrupted)
-                        m_dragImage->Hide(this);
+                        m_dragImage->Hide();
                         TreeView_SelectDropTarget(GetHwnd(), htItem);
-                        m_dragImage->Show(this);
+                        m_dragImage->Show();
                     }
                 }
                 break;
@@ -1794,7 +1803,7 @@ long wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
             case WM_RBUTTONUP:
                 if ( m_dragImage )
                 {
-                    m_dragImage->EndDrag(this);
+                    m_dragImage->EndDrag();
                     delete m_dragImage;
                     m_dragImage = NULL;
 
@@ -2202,7 +2211,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
 
                 m_dragImage = new wxDragImage(*this, event.m_item);
                 m_dragImage->BeginDrag(wxPoint(0, 0), this);
-                m_dragImage->Show(this);
+                m_dragImage->Show();
             }
             break;
 
diff --git a/src/wxvc.dsp b/src/wxvc.dsp
index 6270077de3..2e41ab5337 100644
--- a/src/wxvc.dsp
+++ b/src/wxvc.dsp
@@ -512,6 +512,10 @@ SOURCE=.\generic\choicdgg.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\generic\dragimgg.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=.\generic\grid.cpp
 # End Source File
 # Begin Source File
diff --git a/src/wxvc_dll.dsp b/src/wxvc_dll.dsp
index 4a2ff43239..0121b5f25c 100644
--- a/src/wxvc_dll.dsp
+++ b/src/wxvc_dll.dsp
@@ -514,6 +514,10 @@ SOURCE=.\generic\choicdgg.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\generic\dragimgg.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=.\generic\grid.cpp
 # End Source File
 # Begin Source File
diff --git a/utils/projgen/makeproj.cpp b/utils/projgen/makeproj.cpp
index 63c8ce205c..5b0bd73740 100644
--- a/utils/projgen/makeproj.cpp
+++ b/utils/projgen/makeproj.cpp
@@ -304,6 +304,7 @@ void MyApp::GenerateSamples(const wxString& dir)
     GenerateSample("FontVC", "font", dir + wxString("/samples/font"), wxStringList("font.cpp", 0));
     GenerateSample("MenuVC", "menu", dir + wxString("/samples/menu"), wxStringList("menu.cpp", 0));
     GenerateSample("TreelayVC", "test", dir + wxString("/samples/treelay"), wxStringList("test.cpp", "test.h", 0));
+    GenerateSample("DragimagVC", "test", dir + wxString("/samples/dragimag"), wxStringList("test.cpp", "test.h", 0));
 
     //// Demos
 
-- 
2.50.0

