1. more corrections to file dnd (works with testdnd GTK sample now as well)

2. restored STRING for g_textAtom, not text/plain


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4410 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-11-06 19:35:15 +00:00
parent 61a6d4c23a
commit 74d38ad8e2
3 changed files with 66 additions and 16 deletions

View File

@@ -661,6 +661,10 @@ bool DnDApp::OnInit()
wxImage::AddHandler( new wxPNGHandler ); wxImage::AddHandler( new wxPNGHandler );
#endif #endif
// under X we usually want to use the primary selection by default (which
// is shared with other apps)
wxTheClipboard->UsePrimarySelection();
// create the main frame window // create the main frame window
DnDFrame *frame = new DnDFrame((wxFrame *) NULL, DnDFrame *frame = new DnDFrame((wxFrame *) NULL,
"Drag-and-Drop/Clipboard wxWindows Sample", "Drag-and-Drop/Clipboard wxWindows Sample",

View File

@@ -127,9 +127,14 @@ void wxDataFormat::SetId( const wxChar *id )
void wxDataFormat::PrepareFormats() void wxDataFormat::PrepareFormats()
{ {
// VZ: GNOME included in RedHat 6.1 uses the MIME types below and not the // VZ: GNOME included in RedHat 6.1 uses the MIME types below and not the
// atoms STRING and file:ALL as the old code was // atoms STRING and file:ALL as the old code was, but normal X apps
// use STRING for text selection when transfering the data via
// clipboard, for example, so do use STRING for now (GNOME apps will
// probably support STRING as well for compatibility anyhow), but use
// text/uri-list for file dnd because compatibility is not important
// here (with whom?)
if (!g_textAtom) if (!g_textAtom)
g_textAtom = gdk_atom_intern( "text/plain", FALSE ); g_textAtom = gdk_atom_intern( "STRING" /* "text/plain" */, FALSE );
if (!g_pngAtom) if (!g_pngAtom)
g_pngAtom = gdk_atom_intern( "image/png", FALSE ); g_pngAtom = gdk_atom_intern( "image/png", FALSE );
if (!g_fileAtom) if (!g_fileAtom)
@@ -224,18 +229,36 @@ bool wxFileDataObject::SetData(size_t size, const void *buf)
// "file:" as far as I see) delimited by "\r\n" of total length size // "file:" as far as I see) delimited by "\r\n" of total length size
// (I wonder what happens if the file has '\n' in its filename??) // (I wonder what happens if the file has '\n' in its filename??)
wxString filename; wxString filename;
for ( const char *p = (const char *)buf; *p; p++ ) for ( const char *p = (const char *)buf; ; p++ )
{ {
if ( *p == '\r' && *(p+1) == '\n' ) // some broken programs (testdnd GTK+ sample!) omit the trailing
// "\r\n", so check for '\0' explicitly here instead of doing it in
// the loop statement to account for it
if ( (*p == '\r' && *(p+1) == '\n') || !*p )
{ {
static const int lenPrefix = 5; // strlen("file:") size_t lenPrefix = 5; // strlen("file:")
if ( filename.Left(lenPrefix).MakeLower() == _T("file:") ) if ( filename.Left(lenPrefix).MakeLower() == _T("file:") )
{ {
filename.erase(0, lenPrefix); // sometimes the syntax is "file:filename", sometimes it's
// URL-like: "file://filename" - deal with both
if ( filename[lenPrefix] == _T('/') &&
filename[lenPrefix + 1] == _T('/') )
{
// skip the slashes
lenPrefix += 2;
}
AddFile(filename.c_str() + lenPrefix);
filename.Empty();
}
else
{
wxLogDebug(_T("Unsupported URI '%s' in wxFileDataObject"),
filename.c_str());
} }
AddFile(filename); if ( !*p )
filename.Empty(); break;
// skip '\r' // skip '\r'
p++; p++;

View File

@@ -127,9 +127,14 @@ void wxDataFormat::SetId( const wxChar *id )
void wxDataFormat::PrepareFormats() void wxDataFormat::PrepareFormats()
{ {
// VZ: GNOME included in RedHat 6.1 uses the MIME types below and not the // VZ: GNOME included in RedHat 6.1 uses the MIME types below and not the
// atoms STRING and file:ALL as the old code was // atoms STRING and file:ALL as the old code was, but normal X apps
// use STRING for text selection when transfering the data via
// clipboard, for example, so do use STRING for now (GNOME apps will
// probably support STRING as well for compatibility anyhow), but use
// text/uri-list for file dnd because compatibility is not important
// here (with whom?)
if (!g_textAtom) if (!g_textAtom)
g_textAtom = gdk_atom_intern( "text/plain", FALSE ); g_textAtom = gdk_atom_intern( "STRING" /* "text/plain" */, FALSE );
if (!g_pngAtom) if (!g_pngAtom)
g_pngAtom = gdk_atom_intern( "image/png", FALSE ); g_pngAtom = gdk_atom_intern( "image/png", FALSE );
if (!g_fileAtom) if (!g_fileAtom)
@@ -224,18 +229,36 @@ bool wxFileDataObject::SetData(size_t size, const void *buf)
// "file:" as far as I see) delimited by "\r\n" of total length size // "file:" as far as I see) delimited by "\r\n" of total length size
// (I wonder what happens if the file has '\n' in its filename??) // (I wonder what happens if the file has '\n' in its filename??)
wxString filename; wxString filename;
for ( const char *p = (const char *)buf; *p; p++ ) for ( const char *p = (const char *)buf; ; p++ )
{ {
if ( *p == '\r' && *(p+1) == '\n' ) // some broken programs (testdnd GTK+ sample!) omit the trailing
// "\r\n", so check for '\0' explicitly here instead of doing it in
// the loop statement to account for it
if ( (*p == '\r' && *(p+1) == '\n') || !*p )
{ {
static const int lenPrefix = 5; // strlen("file:") size_t lenPrefix = 5; // strlen("file:")
if ( filename.Left(lenPrefix).MakeLower() == _T("file:") ) if ( filename.Left(lenPrefix).MakeLower() == _T("file:") )
{ {
filename.erase(0, lenPrefix); // sometimes the syntax is "file:filename", sometimes it's
// URL-like: "file://filename" - deal with both
if ( filename[lenPrefix] == _T('/') &&
filename[lenPrefix + 1] == _T('/') )
{
// skip the slashes
lenPrefix += 2;
}
AddFile(filename.c_str() + lenPrefix);
filename.Empty();
}
else
{
wxLogDebug(_T("Unsupported URI '%s' in wxFileDataObject"),
filename.c_str());
} }
AddFile(filename); if ( !*p )
filename.Empty(); break;
// skip '\r' // skip '\r'
p++; p++;