]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dnd.cpp
The usual amount of trash over my telephone fixed
[wxWidgets.git] / src / gtk / dnd.cpp
index 2b894ea99552c3b9e344ccd6e5bfa98e8fa0b0c9..d34741208940cc1876cf7bb1a65bd1901efe1966 100644 (file)
 #endif
 
 #include "wx/dnd.h"
+
+#if wxUSE_DRAG_AND_DROP
+
 #include "wx/window.h"
 #include "wx/app.h"
 #include "wx/gdicmn.h"
-#include <wx/intl.h>
+#include "wx/intl.h"
+#include "wx/utils.h"
 
+#include "gdk/gdk.h"
+#include "gtk/gtk.h"
 #include "gdk/gdkprivate.h"
 
 #include <X11/Xlib.h>
@@ -622,20 +628,56 @@ wxDataFormat wxFileDropTarget::GetFormat(size_t WXUNUSED(n)) const
 // wxDropSource
 //-------------------------------------------------------------------------
 
+static void
+shape_motion (GtkWidget      *widget, 
+             GdkEventMotion */*event*/);
+             
 //-----------------------------------------------------------------------------
 // drag request
 
 void gtk_drag_callback( GtkWidget *widget, GdkEvent *event, wxDropSource *source )
 {
-  wxDataObject *data = source->m_data;
-  
-  size_t size = data->GetDataSize();
-  char *ptr = new char[size];
-  data->GetDataHere( ptr );
-  
-  gtk_widget_dnd_data_set( widget, event, ptr, size );
-  
-  delete ptr;
+    wxDataObject *data = source->m_data;
+
+    switch (data->GetFormat())
+    {
+        case wxDF_TEXT:
+       {
+           wxTextDataObject *text_object = (wxTextDataObject*) data;
+           
+           wxString text = text_object->GetText();
+           
+           char *s = WXSTRINGCAST text;
+           
+            gtk_widget_dnd_data_set( widget, 
+                                    event, 
+                                    (unsigned char*) s, 
+                                    (int) text.Length()+1 );
+       
+           break;
+       }
+       
+        case wxDF_FILENAME:
+       {
+           wxFileDataObject *file_object = (wxFileDataObject*) data;
+           
+           wxString text = file_object->GetFiles();
+           
+           char *s = WXSTRINGCAST text;
+           
+            gtk_widget_dnd_data_set( widget, 
+                                    event, 
+                                    (unsigned char*) s, 
+                                    (int) text.Length()+1 );
+       
+           break;
+       }
+       
+       default:
+       {
+           return;
+       }
+   }
   
   source->m_retValue = wxDragCopy;
 }
@@ -690,10 +732,9 @@ wxDragResult wxDropSource::DoDragDrop( bool WXUNUSED(bAllowMove) )
   wxASSERT_MSG( m_data, "wxDragSource: no data" );
   
   if (!m_data) return (wxDragResult) wxDragNone;
-  if (m_data->GetDataSize() == 0) return (wxDragResult) wxDragNone;
   
-  static GtkWidget *drag_icon = NULL;
-  static GtkWidget *drop_icon = NULL;
+  static GtkWidget *drag_icon = (GtkWidget*) NULL;
+  static GtkWidget *drop_icon = (GtkWidget*) NULL;
 
   GdkPoint hotspot_1 = {0,-5 };
       
@@ -722,8 +763,9 @@ wxDragResult wxDropSource::DoDragDrop( bool WXUNUSED(bAllowMove) )
 
          gtk_widget_hide (drop_icon);
        }
+       
 
-      gdk_dnd_set_drag_shape(drag_icon->window,
+    gdk_dnd_set_drag_shape( drag_icon->window,
                             &hotspot_1,
                             drop_icon->window,
                             &hotspot_2);
@@ -771,10 +813,15 @@ wxDragResult wxDropSource::DoDragDrop( bool WXUNUSED(bAllowMove) )
   
   int x = 0;
   int y = 0;
-  gdk_window_get_pointer( m_widget->window, &x, &y, (GdkModifierType *) NULL );
+  wxGetMousePosition( &x, &y );  
   
   gdk_dnd_display_drag_cursor( x, y, FALSE, TRUE );
   
+/*
+    shape_motion( drag_icon, (GdkEventMotion *)NULL );
+    shape_motion( drop_icon, (GdkEventMotion *)NULL );
+*/
+
   while (gdk_dnd.drag_really || gdk_dnd.drag_perhaps) wxYield();
   
   UnregisterWindow();
@@ -790,7 +837,7 @@ void wxDropSource::RegisterWindow(void)
 
   wxString formats;
     
-  wxDataFormat df = m_data->GetPreferredFormat();
+  wxDataFormat df = m_data->GetFormat();
   
     switch (df) 
     {
@@ -825,7 +872,7 @@ void wxDropSource::UnregisterWindow(void)
 /*
  * Shaped Windows
  */
-static GdkWindow *root_win = NULL;
+static GdkWindow *root_win = (GdkWindow*) NULL;
 
 typedef struct _cursoroffset {gint x,y;} CursorOffset;
 
@@ -838,16 +885,18 @@ shape_pressed (GtkWidget *widget, GdkEventButton *event)
   if (event->type != GDK_BUTTON_PRESS)
     return;
 
-  p = gtk_object_get_user_data (GTK_OBJECT(widget));
+  p = (CursorOffset *)gtk_object_get_user_data (GTK_OBJECT(widget));
   p->x = (int) event->x;
   p->y = (int) event->y;
 
   gtk_grab_add (widget);
   gdk_pointer_grab (widget->window, TRUE,
-                   GDK_BUTTON_RELEASE_MASK |
-                   GDK_BUTTON_MOTION_MASK |
-                   GDK_POINTER_MOTION_HINT_MASK,
-                   NULL, NULL, 0);
+                   (GdkEventMask)
+                     (GDK_BUTTON_RELEASE_MASK |
+                      GDK_BUTTON_MOTION_MASK |
+                      GDK_POINTER_MOTION_HINT_MASK),
+                   (GdkWindow*)NULL, 
+                   (GdkCursor*) NULL, 0);
 }
 
 
@@ -860,13 +909,13 @@ shape_released (GtkWidget *widget)
 
 static void
 shape_motion (GtkWidget      *widget, 
-             GdkEventMotion *event)
+             GdkEventMotion */*event*/)
 {
   gint xp, yp;
   CursorOffset * p;
   GdkModifierType mask;
 
-  p = gtk_object_get_user_data (GTK_OBJECT (widget));
+  p = (CursorOffset *)gtk_object_get_user_data (GTK_OBJECT (widget));
 
   /*
    * Can't use event->x / event->y here 
@@ -899,7 +948,7 @@ shape_create_icon (char     **data,
   /*
    * GDK_WINDOW_TOPLEVEL works also, giving you a title border
    */
-  window = gtk_window_new (window_type);
+  window = gtk_window_new ((GtkWindowType)window_type);
   
   fixed = gtk_fixed_new ();
   gtk_widget_set_usize (fixed, 100,100);
@@ -941,9 +990,9 @@ shape_create_icon (char     **data,
   return window;
 }
 
-
-
-
 #endif 
        // NEW_GTK_DND_CODE
        
+#endif
+
+      // wxUSE_DRAG_AND_DROP
\ No newline at end of file