X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/865bb3251ecf83ddac350b734f4fed1d258e250b..1de8d512b7c844d67b2dab36addc89868e68c9b6:/src/gtk1/clipbrd.cpp?ds=sidebyside diff --git a/src/gtk1/clipbrd.cpp b/src/gtk1/clipbrd.cpp index a8fc2c7ee0..9f06257b3d 100644 --- a/src/gtk1/clipbrd.cpp +++ b/src/gtk1/clipbrd.cpp @@ -7,10 +7,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "clipbrd.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -39,10 +35,7 @@ GdkAtom g_clipboardAtom = 0; GdkAtom g_targetsAtom = 0; - -#if defined(__WXGTK20__) && wxUSE_UNICODE -extern GdkAtom g_altTextAtom; -#endif +GdkAtom g_timestampAtom = 0; // the trace mask we use with wxLogTrace() - call // wxLog::AddTraceMask(TRACE_CLIPBOARD) to enable the trace messages from here @@ -91,14 +84,17 @@ targets_selection_received( GtkWidget *WXUNUSED(widget), GdkAtom type = selection_data->type; if ( type != GDK_SELECTION_TYPE_ATOM ) { - if ( strcmp(gdk_atom_name(type), "TARGETS") ) + gchar* atom_name = gdk_atom_name(type); + if ( strcmp(atom_name, "TARGETS") ) { wxLogTrace( TRACE_CLIPBOARD, _T("got unsupported clipboard target") ); clipboard->m_waiting = FALSE; + g_free(atom_name); return; } + g_free(atom_name); } #ifdef __WXDEBUG__ @@ -119,7 +115,7 @@ targets_selection_received( GtkWidget *WXUNUSED(widget), wxT("selection received for targets, format %s"), format.GetId().c_str() ); -// printf( "format %s requested %s\n", +// printf( "format %s requested %s\n", // gdk_atom_name( atoms[i] ), // gdk_atom_name( clipboard->m_targetRequested ) ); @@ -247,7 +243,7 @@ selection_handler( GtkWidget *WXUNUSED(widget), GtkSelectionData *selection_data, guint WXUNUSED(info), guint WXUNUSED(time), - gpointer WXUNUSED(data) ) + gpointer signal_data ) { if (!wxTheClipboard) return; @@ -255,18 +251,37 @@ selection_handler( GtkWidget *WXUNUSED(widget), wxDataObject *data = wxTheClipboard->m_data; + // ICCCM says that TIMESTAMP is a required atom. + // In particular, it satisfies Klipper, which polls + // TIMESTAMP to see if the clipboards content has changed. + // It shall return the time which was used to set the data. + if (selection_data->target == g_timestampAtom) + { + guint timestamp = GPOINTER_TO_UINT (signal_data); + gtk_selection_data_set(selection_data, + GDK_SELECTION_TYPE_INTEGER, + 32, + (guchar*)&(timestamp), + sizeof(timestamp)); + wxLogTrace(TRACE_CLIPBOARD, + _T("Clipboard TIMESTAMP requested, returning timestamp=%u"), + timestamp); + return; + } + wxDataFormat format( selection_data->target ); #ifdef __WXDEBUG__ wxLogTrace(TRACE_CLIPBOARD, - _T("clipboard data in format %s, GtkSelectionData is target=%s type=%s selection=%s"), + _T("clipboard data in format %s, GtkSelectionData is target=%s type=%s selection=%s timestamp=%u"), format.GetId().c_str(), wxString::FromAscii(gdk_atom_name(selection_data->target)).c_str(), wxString::FromAscii(gdk_atom_name(selection_data->type)).c_str(), - wxString::FromAscii(gdk_atom_name(selection_data->selection)).c_str() + wxString::FromAscii(gdk_atom_name(selection_data->selection)).c_str(), + GPOINTER_TO_UINT( signal_data ) ); #endif - + if (!data->IsSupportedFormat( format )) return; int size = data->GetDataSize( format ); @@ -278,27 +293,12 @@ selection_handler( GtkWidget *WXUNUSED(widget), // Text data will be in UTF8 in Unicode mode. data->GetDataHere( selection_data->target, d ); -#ifdef __WXGTK20__ - // NB: GTK+ requires special treatment of UTF8_STRING data, the text - // would show as UTF-8 data interpreted as latin1 (?) in other - // GTK+ apps if we used gtk_selection_data_set() - if (format == wxDataFormat(wxDF_UNICODETEXT)) - { - gtk_selection_data_set_text( - selection_data, - (const gchar*)d, - size); - } - else -#endif - { - gtk_selection_data_set( + gtk_selection_data_set( selection_data, GDK_SELECTION_TYPE_STRING, - 8*sizeof(gchar), + 8 * sizeof(gchar), (unsigned char*) d, size ); - } free(d); } @@ -348,6 +348,7 @@ wxClipboard::wxClipboard() if (!g_clipboardAtom) g_clipboardAtom = gdk_atom_intern( "CLIPBOARD", FALSE ); if (!g_targetsAtom) g_targetsAtom = gdk_atom_intern ("TARGETS", FALSE); + if (!g_timestampAtom) g_timestampAtom = gdk_atom_intern ("TIMESTAMP", FALSE); m_formatSupported = FALSE; m_targetRequested = 0; @@ -447,6 +448,11 @@ bool wxClipboard::AddData( wxDataObject *data ) GdkAtom clipboard = m_usePrimary ? (GdkAtom)GDK_SELECTION_PRIMARY : g_clipboardAtom; + // by default provide TIMESTAMP as a target + gtk_selection_add_target( GTK_WIDGET(m_clipboardWidget), + clipboard, + g_timestampAtom, + 0 ); for (size_t i = 0; i < m_data->GetFormatCount(); i++) { @@ -454,9 +460,9 @@ bool wxClipboard::AddData( wxDataObject *data ) wxT("wxClipboard now supports atom %s"), array[i].GetId().c_str() ); -// printf( "added %s\n", +// printf( "added %s\n", // gdk_atom_name( array[i].GetFormatId() ) ); - + gtk_selection_add_target( GTK_WIDGET(m_clipboardWidget), clipboard, array[i], @@ -468,7 +474,7 @@ bool wxClipboard::AddData( wxDataObject *data ) gtk_signal_connect( GTK_OBJECT(m_clipboardWidget), "selection_get", GTK_SIGNAL_FUNC(selection_handler), - (gpointer) NULL ); + GUINT_TO_POINTER( gdk_event_get_time(gtk_get_current_event()) ) ); #if wxUSE_THREADS /* disable GUI threads */ @@ -537,15 +543,6 @@ bool wxClipboard::IsSupported( const wxDataFormat& format ) while (m_waiting) gtk_main_iteration(); -#if defined(__WXGTK20__) && wxUSE_UNICODE - if (!m_formatSupported && format == wxDataFormat(wxDF_UNICODETEXT)) - { - // Another try with plain STRING format - extern GdkAtom g_altTextAtom; - return IsSupported(g_altTextAtom); - } -#endif - return m_formatSupported; }