DnD updates
Clipboard pasting (for wxDF_TEXT) print dialog looks better now font dialog ibid git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1125 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -188,13 +188,13 @@ void wxGenericFontDialog::CreateWidgets(void)
|
||||
{
|
||||
wxBeginBusyCursor();
|
||||
|
||||
fontRect.x = 5;
|
||||
fontRect.x = 10;
|
||||
#ifdef __X__
|
||||
fontRect.y = 125;
|
||||
#else
|
||||
fontRect.y = 115;
|
||||
#endif
|
||||
fontRect.width = 350;
|
||||
fontRect.width = 430;
|
||||
fontRect.height = 100;
|
||||
|
||||
/*
|
||||
@@ -254,10 +254,10 @@ void wxGenericFontDialog::CreateWidgets(void)
|
||||
|
||||
fontRect.y+=y+5; //NL mod
|
||||
|
||||
int by = (fontRect.y + fontRect.height + 5);
|
||||
int by = (fontRect.y + fontRect.height + 10);
|
||||
|
||||
wxButton *okButton = new wxButton(this, wxID_OK, _("OK"), wxPoint(5, by));
|
||||
(void) new wxButton(this, wxID_OK, _("Cancel"), wxPoint(50, by));
|
||||
wxButton *okButton = new wxButton(this, wxID_OK, _("OK"), wxPoint(220, by), wxSize(100,-1));
|
||||
(void) new wxButton(this, wxID_OK, _("Cancel"), wxPoint(340, by), wxSize(100,-1));
|
||||
|
||||
familyChoice->SetStringSelection( wxFontFamilyIntToString(dialogFont.GetFamily()) );
|
||||
styleChoice->SetStringSelection(wxFontStyleIntToString(dialogFont.GetStyle()));
|
||||
|
@@ -30,6 +30,7 @@
|
||||
#include "wx/app.h"
|
||||
#include "wx/frame.h"
|
||||
#include "wx/stattext.h"
|
||||
#include "wx/statbox.h"
|
||||
#include "wx/button.h"
|
||||
#include "wx/checkbox.h"
|
||||
#include "wx/textctrl.h"
|
||||
@@ -300,22 +301,10 @@ wxGenericPrintSetupDialog::wxGenericPrintSetupDialog(wxWindow *parent, wxPrintSe
|
||||
if ( data )
|
||||
printData = *data;
|
||||
|
||||
int buttonWidth = 65;
|
||||
int buttonHeight = 25;
|
||||
int spacing = 5;
|
||||
int yPos = 5;
|
||||
int xPos = 5;
|
||||
|
||||
wxButton *okButton = new wxButton(this, wxID_OK, _("OK"), wxPoint(xPos, yPos), wxSize(buttonWidth, buttonHeight));
|
||||
xPos += buttonWidth + spacing;
|
||||
(void) new wxButton(this, wxID_CANCEL, _("Cancel"), wxPoint(xPos, yPos), wxSize(buttonWidth, buttonHeight));
|
||||
|
||||
okButton->SetDefault();
|
||||
okButton->SetFocus();
|
||||
|
||||
yPos += 35;
|
||||
xPos = 5;
|
||||
(void) new wxStaticBox(this, wxPRINTID_STATIC, _("Paper size"), wxPoint(10, 10), wxSize(200,60) );
|
||||
|
||||
int xPos = 20;
|
||||
int yPos = 30;
|
||||
paperTypeChoice = CreatePaperTypeChoice(&xPos, &yPos);
|
||||
|
||||
wxString *choices = new wxString[2];
|
||||
@@ -323,30 +312,29 @@ wxGenericPrintSetupDialog::wxGenericPrintSetupDialog(wxWindow *parent, wxPrintSe
|
||||
choices[1] = _("Landscape");
|
||||
|
||||
orientationRadioBox = new wxRadioBox(this, wxPRINTID_ORIENTATION, _("Orientation"),
|
||||
wxPoint(xPos, yPos), wxSize(-1, -1), 2, choices, 2);
|
||||
wxPoint(10, 80), wxSize(-1, -1), 2, choices, 2);
|
||||
orientationRadioBox->SetSelection(0);
|
||||
|
||||
xPos += 200;
|
||||
(void) new wxStaticBox(this, wxPRINTID_STATIC, _("Options"), wxPoint(10, 130), wxSize(200,50) );
|
||||
|
||||
colourCheckBox = new wxCheckBox(this, wxPRINTID_PRINTCOLOUR, _("Print in colour"), wxPoint(15, 145));
|
||||
|
||||
|
||||
colourCheckBox = new wxCheckBox(this, wxPRINTID_PRINTCOLOUR, _("Print in colour"), wxPoint(xPos, yPos));
|
||||
(void) new wxStaticBox(this, wxPRINTID_STATIC, _("Print spooling"), wxPoint(230, 10), wxSize(200,170) );
|
||||
|
||||
(void) new wxStaticText(this, wxPRINTID_STATIC, _("Printer command:"), wxPoint(240, 30));
|
||||
|
||||
xPos = 5;
|
||||
yPos += 60;
|
||||
printerCommandText = new wxTextCtrl(this, wxPRINTID_COMMAND, "", wxPoint(260, 55), wxSize(150, -1));
|
||||
|
||||
int staticWidth = 100;
|
||||
int textWidth = 120;
|
||||
spacing = 10;
|
||||
(void) new wxStaticText(this, wxPRINTID_STATIC, _("Printer options:"), wxPoint(240, 110));
|
||||
|
||||
(void) new wxStaticText(this, wxPRINTID_STATIC, _("Printer command:"), wxPoint(xPos, yPos));
|
||||
xPos += staticWidth;
|
||||
printerOptionsText = new wxTextCtrl(this, wxPRINTID_OPTIONS, "", wxPoint(260, 135), wxSize(150, -1));
|
||||
|
||||
printerCommandText = new wxTextCtrl(this, wxPRINTID_COMMAND, "", wxPoint(xPos, yPos), wxSize(textWidth, -1));
|
||||
xPos += textWidth + spacing;
|
||||
wxButton *okButton = new wxButton(this, wxID_OK, _("OK"), wxPoint(240, 200), wxSize(100, -1));
|
||||
(void) new wxButton(this, wxID_CANCEL, _("Cancel"), wxPoint(360, 200), wxSize(100, -1));
|
||||
|
||||
(void) new wxStaticText(this, wxPRINTID_STATIC, _("Printer options:"), wxPoint(xPos, yPos));
|
||||
xPos += staticWidth;
|
||||
|
||||
printerOptionsText = new wxTextCtrl(this, wxPRINTID_OPTIONS, "", wxPoint(xPos, yPos), wxSize(textWidth, -1));
|
||||
okButton->SetDefault();
|
||||
okButton->SetFocus();
|
||||
|
||||
Fit();
|
||||
Centre(wxBOTH);
|
||||
@@ -422,12 +410,9 @@ wxChoice *wxGenericPrintSetupDialog::CreatePaperTypeChoice(int *x, int *y)
|
||||
sel = i;
|
||||
}
|
||||
|
||||
(void) new wxStaticText(this, wxPRINTID_STATIC, _("Paper size"), wxPoint(*x, *y));
|
||||
*y += 25;
|
||||
|
||||
wxChoice *choice = new wxChoice(this, wxPRINTID_PAPERSIZE, wxPoint(*x, *y), wxSize(300, -1), n,
|
||||
wxChoice *choice = new wxChoice(this, wxPRINTID_PAPERSIZE, wxPoint(*x, *y), wxSize(170, -1), n,
|
||||
choices);
|
||||
*y += 35;
|
||||
|
||||
delete[] choices;
|
||||
|
||||
choice->SetSelection(sel);
|
||||
|
@@ -21,30 +21,87 @@ wxClipboard *wxTheClipboard = (wxClipboard*) NULL;
|
||||
|
||||
GdkAtom g_textAtom = 0;
|
||||
GdkAtom g_clipboardAtom = 0;
|
||||
GdkAtom g_targetsAtom = 0;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// functions
|
||||
// reminder
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
void wxInitClipboard()
|
||||
{
|
||||
if (wxTheClipboard) delete wxTheClipboard;
|
||||
wxTheClipboard = new wxClipboard();
|
||||
}
|
||||
/* The contents of a selection are returned in a GtkSelectionData
|
||||
structure. selection/target identify the request.
|
||||
type specifies the type of the return; if length < 0, and
|
||||
the data should be ignored. This structure has object semantics -
|
||||
no fields should be modified directly, they should not be created
|
||||
directly, and pointers to them should not be stored beyond the duration of
|
||||
a callback. (If the last is changed, we'll need to add reference
|
||||
counting)
|
||||
|
||||
void wxDoneClipboard()
|
||||
struct _GtkSelectionData
|
||||
{
|
||||
if (wxTheClipboard) delete wxTheClipboard;
|
||||
wxTheClipboard = (wxClipboard*) NULL;
|
||||
GdkAtom selection;
|
||||
GdkAtom target;
|
||||
GdkAtom type;
|
||||
gint format;
|
||||
guchar *data;
|
||||
gint length;
|
||||
};
|
||||
|
||||
*/
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// "selection_received" for targets
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
static void
|
||||
targets_selection_received( GtkWidget *WXUNUSED(widget),
|
||||
GtkSelectionData *selection_data,
|
||||
wxClipboard *clipboard )
|
||||
{
|
||||
if (!wxTheClipboard) return;
|
||||
|
||||
if (selection_data->length <= 0) return;
|
||||
|
||||
// make sure we got the data in the correct form
|
||||
if (selection_data->type != GDK_SELECTION_TYPE_ATOM) return;
|
||||
|
||||
// the atoms we received, holding a list of targets (= formats)
|
||||
GdkAtom *atoms = (GdkAtom *)selection_data->data;
|
||||
|
||||
for (unsigned int i=0; i<selection_data->length/sizeof(GdkAtom); i++)
|
||||
{
|
||||
if (atoms[i] == clipboard->m_targetRequested)
|
||||
{
|
||||
clipboard->m_formatSupported = TRUE;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// "selection_received"
|
||||
// "selection_received" for the actual data
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
static void
|
||||
selection_received( GtkWidget *widget, GtkSelectionData *selection_data, gpointer data )
|
||||
selection_received( GtkWidget *WXUNUSED(widget),
|
||||
GtkSelectionData *selection_data,
|
||||
wxClipboard *clipboard )
|
||||
{
|
||||
if (!wxTheClipboard) return;
|
||||
|
||||
if (selection_data->length <= 0) return;
|
||||
|
||||
size_t size = (size_t) selection_data->length;
|
||||
|
||||
// make sure we got the data in the correct form
|
||||
if (selection_data->type != GDK_SELECTION_TYPE_STRING) return;
|
||||
|
||||
clipboard->m_receivedSize = size;
|
||||
|
||||
clipboard->m_receivedData = new char[size+1];
|
||||
|
||||
memcpy( clipboard->m_receivedData, selection_data->data, size);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -52,13 +109,13 @@ selection_received( GtkWidget *widget, GtkSelectionData *selection_data, gpointe
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
static gint
|
||||
selection_clear( GtkWidget *widget, GdkEventSelection *event )
|
||||
selection_clear( GtkWidget *WXUNUSED(widget), GdkEventSelection *WXUNUSED(event) )
|
||||
{
|
||||
/* The clipboard is no longer in our hands. We can delete the
|
||||
* clipboard data. I hope I got that one right... */
|
||||
|
||||
if (!wxTheClipboard) return TRUE;
|
||||
|
||||
/* the clipboard is no longer in our hands. we can delete the
|
||||
* clipboard data. I hope I got that one right... */
|
||||
|
||||
wxTheClipboard->SetData( (wxDataObject*) NULL );
|
||||
|
||||
return TRUE;
|
||||
@@ -115,9 +172,22 @@ wxClipboard::wxClipboard()
|
||||
|
||||
if (!g_clipboardAtom) g_clipboardAtom = gdk_atom_intern( "CLIPBOARD", FALSE );
|
||||
if (!g_textAtom) g_textAtom = gdk_atom_intern( "TEXT", FALSE );
|
||||
if (!g_targetsAtom) g_targetsAtom = gdk_atom_intern ("TARGETS", FALSE);
|
||||
|
||||
m_receivedData = (char*)NULL;
|
||||
m_receivedSize = 0;
|
||||
m_formatSupported = FALSE;
|
||||
m_targetRequested = 0;
|
||||
}
|
||||
|
||||
wxClipboard::~wxClipboard()
|
||||
{
|
||||
Clear();
|
||||
|
||||
if (m_clipboardWidget) gtk_widget_destroy( m_clipboardWidget );
|
||||
}
|
||||
|
||||
void wxClipboard::Clear()
|
||||
{
|
||||
/* As we have data we also own the clipboard. Once we no longer own
|
||||
it, clear_selection is called which will set m_data to zero */
|
||||
@@ -127,7 +197,18 @@ wxClipboard::~wxClipboard()
|
||||
delete m_data;
|
||||
gtk_selection_owner_set( (GtkWidget*) NULL, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME );
|
||||
}
|
||||
if (m_clipboardWidget) gtk_widget_destroy( m_clipboardWidget );
|
||||
|
||||
m_receivedSize = 0;
|
||||
|
||||
if (m_receivedData)
|
||||
{
|
||||
delete[] m_receivedData;
|
||||
m_receivedData = (char*) NULL;
|
||||
}
|
||||
|
||||
m_targetRequested = 0;
|
||||
|
||||
m_formatSupported = FALSE;
|
||||
}
|
||||
|
||||
void wxClipboard::SetData( wxDataObject *data )
|
||||
@@ -147,14 +228,6 @@ void wxClipboard::SetData( wxDataObject *data )
|
||||
|
||||
switch (m_data->GetPreferredFormat())
|
||||
{
|
||||
/*
|
||||
case wxDF_STRING:
|
||||
gtk_selection_add_handler( m_clipboardWidget,
|
||||
g_clipboardAtom,
|
||||
GDK_TARGET_STRING,
|
||||
selection_handler,
|
||||
NULL );
|
||||
break;
|
||||
case wxDF_TEXT:
|
||||
gtk_selection_add_handler( m_clipboardWidget,
|
||||
g_clipboardAtom,
|
||||
@@ -162,23 +235,108 @@ void wxClipboard::SetData( wxDataObject *data )
|
||||
selection_handler,
|
||||
NULL );
|
||||
break;
|
||||
*/
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void *wxClipboard::GetData( wxDataFormat format, size_t *length )
|
||||
bool wxClipboard::IsSupportedFormat( wxDataFormat format )
|
||||
{
|
||||
if (!IsAvailable(format))
|
||||
m_targetRequested = 0;
|
||||
|
||||
if (format == wxDF_TEXT)
|
||||
{
|
||||
if (length) *length = 0;
|
||||
return NULL;
|
||||
// m_targetRequested = g_textAtom;
|
||||
m_targetRequested = GDK_TARGET_STRING;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
if (m_targetRequested == 0) return FALSE;
|
||||
|
||||
gtk_signal_connect( GTK_OBJECT(m_clipboardWidget),
|
||||
"selection_received",
|
||||
GTK_SIGNAL_FUNC( targets_selection_received ),
|
||||
(gpointer) this );
|
||||
|
||||
m_formatSupported = FALSE;
|
||||
|
||||
gtk_selection_convert( m_clipboardWidget,
|
||||
g_clipboardAtom,
|
||||
g_targetsAtom,
|
||||
GDK_CURRENT_TIME );
|
||||
|
||||
gtk_signal_disconnect_by_func( GTK_OBJECT(m_clipboardWidget),
|
||||
GTK_SIGNAL_FUNC( targets_selection_received ),
|
||||
(gpointer) this );
|
||||
|
||||
if (!m_formatSupported) return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool wxClipboard::IsAvailable( wxDataFormat WXUNUSED(format) )
|
||||
bool wxClipboard::ObtainData( wxDataFormat format )
|
||||
{
|
||||
return FALSE;
|
||||
m_receivedSize = 0;
|
||||
|
||||
if (m_receivedData)
|
||||
{
|
||||
delete[] m_receivedData;
|
||||
m_receivedData = (char*) NULL;
|
||||
}
|
||||
|
||||
m_targetRequested = 0;
|
||||
|
||||
if (format == wxDF_TEXT)
|
||||
{
|
||||
// m_targetRequested = g_textAtom;
|
||||
m_targetRequested = GDK_TARGET_STRING;
|
||||
}
|
||||
|
||||
if (m_targetRequested == 0) return FALSE;
|
||||
|
||||
gtk_signal_connect( GTK_OBJECT(m_clipboardWidget),
|
||||
"selection_received",
|
||||
GTK_SIGNAL_FUNC( selection_received ),
|
||||
(gpointer) this );
|
||||
|
||||
gtk_selection_convert( m_clipboardWidget,
|
||||
g_clipboardAtom,
|
||||
m_targetRequested,
|
||||
GDK_CURRENT_TIME );
|
||||
|
||||
gtk_signal_disconnect_by_func( GTK_OBJECT(m_clipboardWidget),
|
||||
GTK_SIGNAL_FUNC( selection_received ),
|
||||
(gpointer) this );
|
||||
|
||||
if (m_receivedSize == 0) return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
size_t wxClipboard::GetDataSize() const
|
||||
{
|
||||
return m_receivedSize;
|
||||
}
|
||||
|
||||
void wxClipboard::GetDataHere( void *data ) const
|
||||
{
|
||||
memcpy(data, m_receivedData, m_receivedSize );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxClipboardModule
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxClipboardModule,wxModule)
|
||||
|
||||
bool wxClipboardModule::OnInit()
|
||||
{
|
||||
wxTheClipboard = new wxClipboard();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void wxClipboardModule::OnExit()
|
||||
{
|
||||
if (wxTheClipboard) delete wxTheClipboard;
|
||||
wxTheClipboard = (wxClipboard*) NULL;
|
||||
}
|
||||
|
@@ -15,7 +15,8 @@
|
||||
#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/gdkprivate.h"
|
||||
|
||||
@@ -622,6 +623,10 @@ wxDataFormat wxFileDropTarget::GetFormat(size_t WXUNUSED(n)) const
|
||||
// wxDropSource
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
static void
|
||||
shape_motion (GtkWidget *widget,
|
||||
GdkEventMotion */*event*/);
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// drag request
|
||||
|
||||
@@ -722,8 +727,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 +777,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();
|
||||
@@ -838,15 +849,16 @@ 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,
|
||||
(GdkEventMask)
|
||||
(GDK_BUTTON_RELEASE_MASK |
|
||||
GDK_BUTTON_MOTION_MASK |
|
||||
GDK_POINTER_MOTION_HINT_MASK),
|
||||
NULL, NULL, 0);
|
||||
}
|
||||
|
||||
@@ -860,13 +872,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 +911,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);
|
||||
|
@@ -21,30 +21,87 @@ wxClipboard *wxTheClipboard = (wxClipboard*) NULL;
|
||||
|
||||
GdkAtom g_textAtom = 0;
|
||||
GdkAtom g_clipboardAtom = 0;
|
||||
GdkAtom g_targetsAtom = 0;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// functions
|
||||
// reminder
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
void wxInitClipboard()
|
||||
{
|
||||
if (wxTheClipboard) delete wxTheClipboard;
|
||||
wxTheClipboard = new wxClipboard();
|
||||
}
|
||||
/* The contents of a selection are returned in a GtkSelectionData
|
||||
structure. selection/target identify the request.
|
||||
type specifies the type of the return; if length < 0, and
|
||||
the data should be ignored. This structure has object semantics -
|
||||
no fields should be modified directly, they should not be created
|
||||
directly, and pointers to them should not be stored beyond the duration of
|
||||
a callback. (If the last is changed, we'll need to add reference
|
||||
counting)
|
||||
|
||||
void wxDoneClipboard()
|
||||
struct _GtkSelectionData
|
||||
{
|
||||
if (wxTheClipboard) delete wxTheClipboard;
|
||||
wxTheClipboard = (wxClipboard*) NULL;
|
||||
GdkAtom selection;
|
||||
GdkAtom target;
|
||||
GdkAtom type;
|
||||
gint format;
|
||||
guchar *data;
|
||||
gint length;
|
||||
};
|
||||
|
||||
*/
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// "selection_received" for targets
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
static void
|
||||
targets_selection_received( GtkWidget *WXUNUSED(widget),
|
||||
GtkSelectionData *selection_data,
|
||||
wxClipboard *clipboard )
|
||||
{
|
||||
if (!wxTheClipboard) return;
|
||||
|
||||
if (selection_data->length <= 0) return;
|
||||
|
||||
// make sure we got the data in the correct form
|
||||
if (selection_data->type != GDK_SELECTION_TYPE_ATOM) return;
|
||||
|
||||
// the atoms we received, holding a list of targets (= formats)
|
||||
GdkAtom *atoms = (GdkAtom *)selection_data->data;
|
||||
|
||||
for (unsigned int i=0; i<selection_data->length/sizeof(GdkAtom); i++)
|
||||
{
|
||||
if (atoms[i] == clipboard->m_targetRequested)
|
||||
{
|
||||
clipboard->m_formatSupported = TRUE;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// "selection_received"
|
||||
// "selection_received" for the actual data
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
static void
|
||||
selection_received( GtkWidget *widget, GtkSelectionData *selection_data, gpointer data )
|
||||
selection_received( GtkWidget *WXUNUSED(widget),
|
||||
GtkSelectionData *selection_data,
|
||||
wxClipboard *clipboard )
|
||||
{
|
||||
if (!wxTheClipboard) return;
|
||||
|
||||
if (selection_data->length <= 0) return;
|
||||
|
||||
size_t size = (size_t) selection_data->length;
|
||||
|
||||
// make sure we got the data in the correct form
|
||||
if (selection_data->type != GDK_SELECTION_TYPE_STRING) return;
|
||||
|
||||
clipboard->m_receivedSize = size;
|
||||
|
||||
clipboard->m_receivedData = new char[size+1];
|
||||
|
||||
memcpy( clipboard->m_receivedData, selection_data->data, size);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -52,13 +109,13 @@ selection_received( GtkWidget *widget, GtkSelectionData *selection_data, gpointe
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
static gint
|
||||
selection_clear( GtkWidget *widget, GdkEventSelection *event )
|
||||
selection_clear( GtkWidget *WXUNUSED(widget), GdkEventSelection *WXUNUSED(event) )
|
||||
{
|
||||
/* The clipboard is no longer in our hands. We can delete the
|
||||
* clipboard data. I hope I got that one right... */
|
||||
|
||||
if (!wxTheClipboard) return TRUE;
|
||||
|
||||
/* the clipboard is no longer in our hands. we can delete the
|
||||
* clipboard data. I hope I got that one right... */
|
||||
|
||||
wxTheClipboard->SetData( (wxDataObject*) NULL );
|
||||
|
||||
return TRUE;
|
||||
@@ -115,9 +172,22 @@ wxClipboard::wxClipboard()
|
||||
|
||||
if (!g_clipboardAtom) g_clipboardAtom = gdk_atom_intern( "CLIPBOARD", FALSE );
|
||||
if (!g_textAtom) g_textAtom = gdk_atom_intern( "TEXT", FALSE );
|
||||
if (!g_targetsAtom) g_targetsAtom = gdk_atom_intern ("TARGETS", FALSE);
|
||||
|
||||
m_receivedData = (char*)NULL;
|
||||
m_receivedSize = 0;
|
||||
m_formatSupported = FALSE;
|
||||
m_targetRequested = 0;
|
||||
}
|
||||
|
||||
wxClipboard::~wxClipboard()
|
||||
{
|
||||
Clear();
|
||||
|
||||
if (m_clipboardWidget) gtk_widget_destroy( m_clipboardWidget );
|
||||
}
|
||||
|
||||
void wxClipboard::Clear()
|
||||
{
|
||||
/* As we have data we also own the clipboard. Once we no longer own
|
||||
it, clear_selection is called which will set m_data to zero */
|
||||
@@ -127,7 +197,18 @@ wxClipboard::~wxClipboard()
|
||||
delete m_data;
|
||||
gtk_selection_owner_set( (GtkWidget*) NULL, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME );
|
||||
}
|
||||
if (m_clipboardWidget) gtk_widget_destroy( m_clipboardWidget );
|
||||
|
||||
m_receivedSize = 0;
|
||||
|
||||
if (m_receivedData)
|
||||
{
|
||||
delete[] m_receivedData;
|
||||
m_receivedData = (char*) NULL;
|
||||
}
|
||||
|
||||
m_targetRequested = 0;
|
||||
|
||||
m_formatSupported = FALSE;
|
||||
}
|
||||
|
||||
void wxClipboard::SetData( wxDataObject *data )
|
||||
@@ -147,14 +228,6 @@ void wxClipboard::SetData( wxDataObject *data )
|
||||
|
||||
switch (m_data->GetPreferredFormat())
|
||||
{
|
||||
/*
|
||||
case wxDF_STRING:
|
||||
gtk_selection_add_handler( m_clipboardWidget,
|
||||
g_clipboardAtom,
|
||||
GDK_TARGET_STRING,
|
||||
selection_handler,
|
||||
NULL );
|
||||
break;
|
||||
case wxDF_TEXT:
|
||||
gtk_selection_add_handler( m_clipboardWidget,
|
||||
g_clipboardAtom,
|
||||
@@ -162,23 +235,108 @@ void wxClipboard::SetData( wxDataObject *data )
|
||||
selection_handler,
|
||||
NULL );
|
||||
break;
|
||||
*/
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void *wxClipboard::GetData( wxDataFormat format, size_t *length )
|
||||
bool wxClipboard::IsSupportedFormat( wxDataFormat format )
|
||||
{
|
||||
if (!IsAvailable(format))
|
||||
m_targetRequested = 0;
|
||||
|
||||
if (format == wxDF_TEXT)
|
||||
{
|
||||
if (length) *length = 0;
|
||||
return NULL;
|
||||
// m_targetRequested = g_textAtom;
|
||||
m_targetRequested = GDK_TARGET_STRING;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
if (m_targetRequested == 0) return FALSE;
|
||||
|
||||
gtk_signal_connect( GTK_OBJECT(m_clipboardWidget),
|
||||
"selection_received",
|
||||
GTK_SIGNAL_FUNC( targets_selection_received ),
|
||||
(gpointer) this );
|
||||
|
||||
m_formatSupported = FALSE;
|
||||
|
||||
gtk_selection_convert( m_clipboardWidget,
|
||||
g_clipboardAtom,
|
||||
g_targetsAtom,
|
||||
GDK_CURRENT_TIME );
|
||||
|
||||
gtk_signal_disconnect_by_func( GTK_OBJECT(m_clipboardWidget),
|
||||
GTK_SIGNAL_FUNC( targets_selection_received ),
|
||||
(gpointer) this );
|
||||
|
||||
if (!m_formatSupported) return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool wxClipboard::IsAvailable( wxDataFormat WXUNUSED(format) )
|
||||
bool wxClipboard::ObtainData( wxDataFormat format )
|
||||
{
|
||||
return FALSE;
|
||||
m_receivedSize = 0;
|
||||
|
||||
if (m_receivedData)
|
||||
{
|
||||
delete[] m_receivedData;
|
||||
m_receivedData = (char*) NULL;
|
||||
}
|
||||
|
||||
m_targetRequested = 0;
|
||||
|
||||
if (format == wxDF_TEXT)
|
||||
{
|
||||
// m_targetRequested = g_textAtom;
|
||||
m_targetRequested = GDK_TARGET_STRING;
|
||||
}
|
||||
|
||||
if (m_targetRequested == 0) return FALSE;
|
||||
|
||||
gtk_signal_connect( GTK_OBJECT(m_clipboardWidget),
|
||||
"selection_received",
|
||||
GTK_SIGNAL_FUNC( selection_received ),
|
||||
(gpointer) this );
|
||||
|
||||
gtk_selection_convert( m_clipboardWidget,
|
||||
g_clipboardAtom,
|
||||
m_targetRequested,
|
||||
GDK_CURRENT_TIME );
|
||||
|
||||
gtk_signal_disconnect_by_func( GTK_OBJECT(m_clipboardWidget),
|
||||
GTK_SIGNAL_FUNC( selection_received ),
|
||||
(gpointer) this );
|
||||
|
||||
if (m_receivedSize == 0) return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
size_t wxClipboard::GetDataSize() const
|
||||
{
|
||||
return m_receivedSize;
|
||||
}
|
||||
|
||||
void wxClipboard::GetDataHere( void *data ) const
|
||||
{
|
||||
memcpy(data, m_receivedData, m_receivedSize );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxClipboardModule
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxClipboardModule,wxModule)
|
||||
|
||||
bool wxClipboardModule::OnInit()
|
||||
{
|
||||
wxTheClipboard = new wxClipboard();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void wxClipboardModule::OnExit()
|
||||
{
|
||||
if (wxTheClipboard) delete wxTheClipboard;
|
||||
wxTheClipboard = (wxClipboard*) NULL;
|
||||
}
|
||||
|
@@ -15,7 +15,8 @@
|
||||
#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/gdkprivate.h"
|
||||
|
||||
@@ -622,6 +623,10 @@ wxDataFormat wxFileDropTarget::GetFormat(size_t WXUNUSED(n)) const
|
||||
// wxDropSource
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
static void
|
||||
shape_motion (GtkWidget *widget,
|
||||
GdkEventMotion */*event*/);
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// drag request
|
||||
|
||||
@@ -722,8 +727,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 +777,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();
|
||||
@@ -838,15 +849,16 @@ 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,
|
||||
(GdkEventMask)
|
||||
(GDK_BUTTON_RELEASE_MASK |
|
||||
GDK_BUTTON_MOTION_MASK |
|
||||
GDK_POINTER_MOTION_HINT_MASK),
|
||||
NULL, NULL, 0);
|
||||
}
|
||||
|
||||
@@ -860,13 +872,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 +911,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);
|
||||
|
Reference in New Issue
Block a user