Doc corrections,
made wxHTML a chapter GUI thread work git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3211 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
dfa13ec8d7
commit
b453e1b24b
@ -26,11 +26,11 @@ For example:
|
||||
// Read some text
|
||||
if (wxTheClipboard->Open())
|
||||
{
|
||||
wxTextDataObject data;
|
||||
if (wxTheClipboard->IsSupported(data))
|
||||
if (wxTheClipboard->IsSupported( "STRING" ))
|
||||
{
|
||||
wxTheClipboard->GetData(data);
|
||||
wxMessageBox(data.GetText());
|
||||
wxTextDataObject data;
|
||||
wxTheClipboard->GetData( &data );
|
||||
wxMessageBox( data.GetText() );
|
||||
}
|
||||
wxTheClipboard->Close();
|
||||
}
|
||||
@ -83,14 +83,14 @@ Call this function to close the clipboard, having opened it with \helpref{wxClip
|
||||
|
||||
\membersection{wxClipboard::GetData}\label{wxclipboardgetdata}
|
||||
|
||||
\func{bool}{GetData}{\param{wxDataObject\&}{ data}}
|
||||
\func{bool}{GetData}{\param{wxDataObject*}{ data}}
|
||||
|
||||
Call this function to fill {\it data} with data on the clipboard, if available in the required
|
||||
format. Returns TRUE on success.
|
||||
|
||||
\membersection{wxClipboard::IsSupported}\label{wxclipboardissupported}
|
||||
|
||||
\func{bool}{IsSupported}{\param{wxDataObject\&}{ data}}
|
||||
\func{bool}{IsSupported}{\param{wxDataFormat}{ format}}
|
||||
|
||||
Returns TRUE if the format of the given data object is available on the clipboard.
|
||||
|
||||
@ -114,3 +114,12 @@ Call this function to set the data object to the clipboard. This function will
|
||||
clear all previous contents in the clipboard, so calling it several times
|
||||
does not make any sense.
|
||||
|
||||
\membersection{wxClipboard::UsePrimarySelection}\label{wxclipboaruseprimary}
|
||||
|
||||
\func{void}{UsePrimarySelection}{\param(bool}{ primary = TRUE}
|
||||
|
||||
On platforms supporting it (currently only GTK), selects the so called
|
||||
PRIMARY SELECTION as the clipboard as opposed to the normal clipboard,
|
||||
if primary is TRUE.
|
||||
|
||||
|
||||
|
@ -1,24 +1,24 @@
|
||||
\section{File Systems}\label{fs}
|
||||
|
||||
The wxHTML library uses {\bf virtual file systems} mechanism
|
||||
similar to the one used in Midnight Commander or Dos Navigator or
|
||||
The wxHTML library uses a {\bf virtual file systems} mechanism
|
||||
similar to the one used in Midnight Commander, Dos Navigator,
|
||||
FAR or almost any modern file manager. (Do you remember? You can
|
||||
press enter on ZIP file and it's content is displayed like it's
|
||||
a directory...)
|
||||
press enter on ZIP file and its contents is displayed as if it
|
||||
were a local directory...)
|
||||
|
||||
\wxheading{Classes}
|
||||
|
||||
Three classes are used in order to provide full VFS:
|
||||
|
||||
\begin{itemize}
|
||||
\item \helpref{wxFSFile}{wxfsfile} class provides information
|
||||
\item The \helpref{wxFSFile}{wxfsfile} class provides information
|
||||
on opened file (name, input stream, mime type and anchor).
|
||||
|
||||
\item \helpref{wxFileSystem}{wxfilesystem} class is interface.
|
||||
It's main methods are ChangePathTo() and OpenFile(). This class
|
||||
\item The \helpref{wxFileSystem}{wxfilesystem} class is the interface.
|
||||
Its main methods are ChangePathTo() and OpenFile(). This class
|
||||
is most often used by the end user.
|
||||
|
||||
\item \helpref{wxFileSystemHandler}{wxfilesystemhandler} is the core
|
||||
\item The \helpref{wxFileSystemHandler}{wxfilesystemhandler} is the core
|
||||
if VFS mechanism. You can derive your own handler and pass it to
|
||||
wxFileSystem's AddHandler() method. In the new handler you only need to
|
||||
overwrite OpenFile() and CanOpen() methods.
|
||||
@ -29,16 +29,16 @@ overwrite OpenFile() and CanOpen() methods.
|
||||
Locations (aka filenames aka addresses) are constructed from 4 parts:
|
||||
|
||||
\begin{itemize}
|
||||
\item {\bf protocol} - handler can regonize if it is able to open some
|
||||
file by checking it's protocol. Examples are "http", "file" or "ftp"
|
||||
\item {\bf protocol} - handler can recognize if it is able to open a
|
||||
file by checking its protocol. Examples are "http", "file" or "ftp".
|
||||
|
||||
\item {\bf right location} - is the name of file within the protocol.
|
||||
In "http://www.wxwindows.org/index.html" the right location is "//www.wxwindows.org/index.html"
|
||||
In "http://www.wxwindows.org/index.html" the right location is "//www.wxwindows.org/index.html".
|
||||
|
||||
\item {\bf anchor} - anchor is optional and is usually not present.
|
||||
In "index.htm\#chapter2" the anchor is "chapter2"
|
||||
In "index.htm\#chapter2" the anchor is "chapter2".
|
||||
|
||||
\item {\bf left location} - this is usually empty string.
|
||||
\item {\bf left location} - this is usually an empty string.
|
||||
It is used by 'local' protocols such as ZIP.
|
||||
See Combined Protocols paragraph for details.
|
||||
\end{itemize}
|
||||
@ -56,13 +56,13 @@ In this example, protocol is "zip", left location is
|
||||
is "file:archives/cpp_doc.zip". It is used by zip handler
|
||||
to determine in what file this particular zip VFS is stored.
|
||||
|
||||
In fact there are two protocols used in this example : zip and file.
|
||||
In fact there are two protocols used in this example: zip and file.
|
||||
You can construct even more complicated addresses like this one:
|
||||
|
||||
http://www.archives.org/myarchive.zip\#zip:local/docs/cpp/stdio.zip\#zip:index.htm
|
||||
|
||||
In this example you access zip VFS stdio.zip stored in another zip (myarchive.zip)
|
||||
which is at WWW. Enjoy it :-)
|
||||
which is at WWW.
|
||||
|
||||
\wxheading{File Systems Included in wxHTML}
|
||||
|
||||
|
@ -97,6 +97,7 @@ licendoc.txt) for conditions of software and documentation use.
|
||||
\helpinput{classes.tex}
|
||||
\helpinput{category.tex}
|
||||
\helpinput{topics.tex}
|
||||
\helpinput{wxhtml.tex}
|
||||
\helpinput{wxPython.tex}
|
||||
|
||||
\begin{comment}
|
||||
|
@ -44,4 +44,3 @@ This chapter contains a selection of topic overviews.
|
||||
\input tusage.tex
|
||||
\input ttips.tex
|
||||
\input fs.tex
|
||||
\input wxhtml.tex
|
||||
|
@ -6,10 +6,15 @@
|
||||
This class provides functions that read text datas using an input stream.
|
||||
So, you can read \it{text} floats, integers.
|
||||
|
||||
Operator >> is overloaded and you can use this class a C++ std-iostream.
|
||||
Operator >> is overloaded and you can use this class like a standard C++ iostream.
|
||||
Note, however, that the arguments are the fixed size types wxUint32, wxInt32 etc
|
||||
and on a typical 32-bit computer, none of these match to the "long" type (wxInt32
|
||||
is defined as int on 32-bit architectures) so that you cannot use long. To avoid
|
||||
problems (here and elsewhere), make use of the wxInt32, wxUint32, etc types.
|
||||
|
||||
For example:
|
||||
\begin{verbatim}
|
||||
wxFileInputStream input( "mytext.txt" );
|
||||
wxTextInputStream text( input );
|
||||
wxUint8 i1;
|
||||
float f2;
|
||||
@ -45,19 +50,19 @@ Destroys the wxTextInputStream object.
|
||||
|
||||
\membersection{wxTextInputStream::Read8}
|
||||
|
||||
\func{unsigned char}{Read8}{\void}
|
||||
\func{wxUint8}{Read8}{\void}
|
||||
|
||||
Reads a single byte from the stream.
|
||||
|
||||
\membersection{wxTextInputStream::Read16}
|
||||
|
||||
\func{unsigned short}{Read16}{\void}
|
||||
\func{wxUint16}{Read16}{\void}
|
||||
|
||||
Reads a 16 bit integer from the stream.
|
||||
|
||||
\membersection{wxTextInputStream::Read32}
|
||||
|
||||
\func{unsigned long}{Read32}{\void}
|
||||
\func{wxUint16}{Read32}{\void}
|
||||
|
||||
Reads a 32 bit integer from the stream.
|
||||
|
||||
@ -85,6 +90,7 @@ So, you can write \it{text} floats, integers.
|
||||
|
||||
For example:
|
||||
\begin{verbatim}
|
||||
wxFileOutputStream output( "mytext.txt" );
|
||||
wxTextOutputStream text( output );
|
||||
|
||||
output << "This is a text line\n";
|
||||
@ -113,19 +119,19 @@ Destroys the wxTextOutputStream object.
|
||||
|
||||
\membersection{wxTextOutputStream::Write8}
|
||||
|
||||
\func{void}{wxTextOutputStream::Write8}{{\param unsigned char }{i8}}
|
||||
\func{void}{wxTextOutputStream::Write8}{{\param wxUint8 }{i8}}
|
||||
|
||||
Writes the single byte {\it i8} to the stream.
|
||||
|
||||
\membersection{wxTextOutputStream::Write16}
|
||||
|
||||
\func{void}{wxTextOutputStream::Write16}{{\param unsigned short }{i16}}
|
||||
\func{void}{wxTextOutputStream::Write16}{{\param wxUint16 }{i16}}
|
||||
|
||||
Writes the 16 bit integer {\it i16} to the stream.
|
||||
|
||||
\membersection{wxTextOutputStream::Write32}
|
||||
|
||||
\func{void}{wxTextOutputStream::Write32}{{\param unsigned long }{i32}}
|
||||
\func{void}{wxTextOutputStream::Write32}{{\param wxUint32 }{i32}}
|
||||
|
||||
Writes the 32 bit integer {\it i32} to the stream.
|
||||
|
||||
|
@ -1,3 +1,8 @@
|
||||
\chapter{wxHTML Notes}\label{wxHTML}
|
||||
\pagenumbering{arabic}%
|
||||
\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
|
||||
\setfooter{\thepage}{}{}{}{}{\thepage}%
|
||||
|
||||
\section{wxHTML Sub-library Overview}\label{wxhtmloverview}
|
||||
|
||||
This library provides classes for parsing and displaying HTML.
|
||||
|
@ -226,12 +226,29 @@ void wxapp_install_idle_handler()
|
||||
g_isIdle = FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
#if wxUSE_THREADS
|
||||
static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) )
|
||||
|
||||
/* forward declaration */
|
||||
static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) );
|
||||
|
||||
void wxapp_install_thread_wakeup()
|
||||
{
|
||||
if (wxTheApp->m_wakeUpTimerTag) return;
|
||||
|
||||
wxTheApp->m_wakeUpTimerTag = gtk_timeout_add( 100, wxapp_wakeup_timerout_callback, (gpointer) NULL );
|
||||
}
|
||||
|
||||
void wxapp_uninstall_thread_wakeup()
|
||||
{
|
||||
if (!wxTheApp->m_wakeUpTimerTag) return;
|
||||
|
||||
gtk_timeout_remove( wxTheApp->m_wakeUpTimerTag );
|
||||
wxTheApp->m_wakeUpTimerTag = 0;
|
||||
}
|
||||
|
||||
static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) )
|
||||
{
|
||||
wxapp_uninstall_thread_wakeup();
|
||||
|
||||
#if (GTK_MINOR_VERSION > 0)
|
||||
// when getting called from GDK's time-out handler
|
||||
@ -254,12 +271,11 @@ static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) )
|
||||
GDK_THREADS_LEAVE ();
|
||||
#endif
|
||||
|
||||
wxTheApp->m_wakeUpTimerTag = gtk_timeout_add( 20, wxapp_wakeup_timerout_callback, (gpointer) NULL );
|
||||
wxapp_install_thread_wakeup();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
*/
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxApp
|
||||
@ -280,11 +296,10 @@ wxApp::wxApp()
|
||||
|
||||
m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
|
||||
|
||||
/*
|
||||
#if wxUSE_THREADS
|
||||
m_wakeUpTimerTag = gtk_timeout_add( 20, wxapp_wakeup_timerout_callback, (gpointer) NULL );
|
||||
m_wakeUpTimerTag = 0;
|
||||
wxapp_install_thread_wakeup();
|
||||
#endif
|
||||
*/
|
||||
|
||||
m_colorCube = (unsigned char*) NULL;
|
||||
}
|
||||
@ -293,11 +308,9 @@ wxApp::~wxApp()
|
||||
{
|
||||
if (m_idleTag) gtk_idle_remove( m_idleTag );
|
||||
|
||||
/*
|
||||
#if wxUSE_THREADS
|
||||
if (m_wakeUpTimerTag) gtk_timeout_remove( m_wakeUpTimerTag );
|
||||
wxapp_uninstall_thread_wakeup();
|
||||
#endif
|
||||
*/
|
||||
|
||||
if (m_colorCube) free(m_colorCube);
|
||||
}
|
||||
|
@ -21,6 +21,15 @@
|
||||
#include "gdk/gdk.h"
|
||||
#include "gtk/gtk.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// thread system
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#if wxUSE_THREADS
|
||||
extern void wxapp_install_thread_wakeup();
|
||||
extern void wxapp_uninstall_thread_wakeup();
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// data
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -386,9 +395,13 @@ void wxClipboard::Clear()
|
||||
{
|
||||
if (m_dataBroker)
|
||||
{
|
||||
#if wxUSE_THREADS
|
||||
/* disable GUI threads */
|
||||
wxapp_uninstall_thread_wakeup();
|
||||
#endif
|
||||
|
||||
/* 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 */
|
||||
|
||||
if (gdk_selection_owner_get( g_clipboardAtom ) == m_clipboardWidget->window)
|
||||
{
|
||||
m_waiting = TRUE;
|
||||
@ -412,6 +425,11 @@ void wxClipboard::Clear()
|
||||
delete m_dataBroker;
|
||||
m_dataBroker = (wxDataBroker*) NULL;
|
||||
}
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* re-enable GUI threads */
|
||||
wxapp_install_thread_wakeup();
|
||||
#endif
|
||||
}
|
||||
|
||||
m_targetRequested = 0;
|
||||
@ -494,11 +512,20 @@ bool wxClipboard::AddData( wxDataObject *data )
|
||||
(gpointer) NULL );
|
||||
#endif
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* disable GUI threads */
|
||||
wxapp_uninstall_thread_wakeup();
|
||||
#endif
|
||||
|
||||
/* Tell the world we offer clipboard data */
|
||||
if (!gtk_selection_owner_set( m_clipboardWidget,
|
||||
g_clipboardAtom,
|
||||
GDK_CURRENT_TIME ))
|
||||
{
|
||||
#if wxUSE_THREADS
|
||||
/* re-enable GUI threads */
|
||||
wxapp_install_thread_wakeup();
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
m_ownsClipboard = TRUE;
|
||||
@ -507,9 +534,18 @@ bool wxClipboard::AddData( wxDataObject *data )
|
||||
GDK_SELECTION_PRIMARY,
|
||||
GDK_CURRENT_TIME ))
|
||||
{
|
||||
#if wxUSE_THREADS
|
||||
/* re-enable GUI threads */
|
||||
wxapp_install_thread_wakeup();
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
m_ownsPrimarySelection = TRUE;
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* re-enable GUI threads */
|
||||
wxapp_install_thread_wakeup();
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -35,6 +35,15 @@
|
||||
extern void wxapp_install_idle_handler();
|
||||
extern bool g_isIdle;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// thread system
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#if wxUSE_THREADS
|
||||
extern void wxapp_install_thread_wakeup();
|
||||
extern void wxapp_uninstall_thread_wakeup();
|
||||
#endif
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// global data
|
||||
//----------------------------------------------------------------------------
|
||||
@ -363,12 +372,22 @@ bool wxDropTarget::RequestData( wxDataFormat format )
|
||||
if (format.GetType() == wxDF_TEXT) wxPrintf( _T("text data.\n") );
|
||||
*/
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* disable GUI threads */
|
||||
wxapp_uninstall_thread_wakeup();
|
||||
#endif
|
||||
|
||||
/* this should trigger an "drag_data_received" event */
|
||||
gtk_drag_get_data( m_dragWidget,
|
||||
m_dragContext,
|
||||
format.GetAtom(),
|
||||
m_dragTime );
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* re-enable GUI threads */
|
||||
wxapp_install_thread_wakeup();
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -617,23 +636,32 @@ source_drag_data_get (GtkWidget *WXUNUSED(widget),
|
||||
wxDataObject *data_object = (wxDataObject*) node->Data();
|
||||
if (data_object->GetFormat().GetAtom() == selection_data->target)
|
||||
{
|
||||
// printf( "format found.\n" );
|
||||
// printf( "format found.\n" );
|
||||
|
||||
size_t data_size = data_object->GetSize();
|
||||
|
||||
if (data_size > 0)
|
||||
{
|
||||
// printf( "data size: %d.\n", (int)data_size );
|
||||
// printf( "data size: %d.\n", (int)data_size );
|
||||
|
||||
guchar *buffer = new guchar[data_size];
|
||||
data_object->WriteData( buffer );
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* disable GUI threads */
|
||||
wxapp_uninstall_thread_wakeup();
|
||||
#endif
|
||||
|
||||
gtk_selection_data_set( selection_data,
|
||||
selection_data->target,
|
||||
8, // 8-bit
|
||||
buffer,
|
||||
data_size );
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* enable GUI threads */
|
||||
wxapp_install_thread_wakeup();
|
||||
#endif
|
||||
free( buffer );
|
||||
|
||||
/* so far only copy, no moves. TODO. */
|
||||
@ -659,7 +687,7 @@ static void source_drag_data_delete( GtkWidget *WXUNUSED(widget),
|
||||
{
|
||||
if (g_isIdle) wxapp_install_idle_handler();
|
||||
|
||||
// printf( "Delete the data!\n" );
|
||||
// printf( "Delete the data!\n" );
|
||||
|
||||
drop_source->m_retValue = wxDragMove;
|
||||
}
|
||||
@ -674,7 +702,7 @@ static void source_drag_begin( GtkWidget *WXUNUSED(widget),
|
||||
{
|
||||
if (g_isIdle) wxapp_install_idle_handler();
|
||||
|
||||
// printf( "drag_begin.\n" );
|
||||
// printf( "drag_begin.\n" );
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@ -687,7 +715,7 @@ static void source_drag_end( GtkWidget *WXUNUSED(widget),
|
||||
{
|
||||
if (g_isIdle) wxapp_install_idle_handler();
|
||||
|
||||
// printf( "drag_end.\n" );
|
||||
// printf( "drag_end.\n" );
|
||||
|
||||
drop_source->m_waiting = FALSE;
|
||||
}
|
||||
@ -800,7 +828,7 @@ wxDragResult wxDropSource::DoDragDrop( bool WXUNUSED(bAllowMove) )
|
||||
m_waiting = TRUE;
|
||||
|
||||
GdkAtom atom = gdk_atom_intern( "STRING", FALSE );
|
||||
// wxPrintf( _T("atom id: %d.\n"), (int)atom );
|
||||
// printf( "atom id: %d.\n", (int)atom );
|
||||
|
||||
GtkTargetList *target_list = gtk_target_list_new( (GtkTargetEntry*) NULL, 0 );
|
||||
gtk_target_list_add( target_list, atom, 0, 0 );
|
||||
@ -822,6 +850,11 @@ wxDragResult wxDropSource::DoDragDrop( bool WXUNUSED(bAllowMove) )
|
||||
else if (event.state & GDK_BUTTON2_MASK) button_number = 2;
|
||||
else if (event.state & GDK_BUTTON3_MASK) button_number = 3;
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* disable GUI threads */
|
||||
wxapp_uninstall_thread_wakeup();
|
||||
#endif
|
||||
|
||||
/* don't start dragging if no button is down */
|
||||
if (button_number)
|
||||
{
|
||||
@ -846,6 +879,11 @@ wxDragResult wxDropSource::DoDragDrop( bool WXUNUSED(bAllowMove) )
|
||||
while (m_waiting) gtk_main_iteration();;
|
||||
}
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* re-enable GUI threads */
|
||||
wxapp_install_thread_wakeup();
|
||||
#endif
|
||||
|
||||
g_blockEventsOnDrag = FALSE;
|
||||
|
||||
UnregisterWindow();
|
||||
|
@ -226,12 +226,29 @@ void wxapp_install_idle_handler()
|
||||
g_isIdle = FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
#if wxUSE_THREADS
|
||||
static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) )
|
||||
|
||||
/* forward declaration */
|
||||
static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) );
|
||||
|
||||
void wxapp_install_thread_wakeup()
|
||||
{
|
||||
if (wxTheApp->m_wakeUpTimerTag) return;
|
||||
|
||||
wxTheApp->m_wakeUpTimerTag = gtk_timeout_add( 100, wxapp_wakeup_timerout_callback, (gpointer) NULL );
|
||||
}
|
||||
|
||||
void wxapp_uninstall_thread_wakeup()
|
||||
{
|
||||
if (!wxTheApp->m_wakeUpTimerTag) return;
|
||||
|
||||
gtk_timeout_remove( wxTheApp->m_wakeUpTimerTag );
|
||||
wxTheApp->m_wakeUpTimerTag = 0;
|
||||
}
|
||||
|
||||
static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) )
|
||||
{
|
||||
wxapp_uninstall_thread_wakeup();
|
||||
|
||||
#if (GTK_MINOR_VERSION > 0)
|
||||
// when getting called from GDK's time-out handler
|
||||
@ -254,12 +271,11 @@ static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) )
|
||||
GDK_THREADS_LEAVE ();
|
||||
#endif
|
||||
|
||||
wxTheApp->m_wakeUpTimerTag = gtk_timeout_add( 20, wxapp_wakeup_timerout_callback, (gpointer) NULL );
|
||||
wxapp_install_thread_wakeup();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
*/
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxApp
|
||||
@ -280,11 +296,10 @@ wxApp::wxApp()
|
||||
|
||||
m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
|
||||
|
||||
/*
|
||||
#if wxUSE_THREADS
|
||||
m_wakeUpTimerTag = gtk_timeout_add( 20, wxapp_wakeup_timerout_callback, (gpointer) NULL );
|
||||
m_wakeUpTimerTag = 0;
|
||||
wxapp_install_thread_wakeup();
|
||||
#endif
|
||||
*/
|
||||
|
||||
m_colorCube = (unsigned char*) NULL;
|
||||
}
|
||||
@ -293,11 +308,9 @@ wxApp::~wxApp()
|
||||
{
|
||||
if (m_idleTag) gtk_idle_remove( m_idleTag );
|
||||
|
||||
/*
|
||||
#if wxUSE_THREADS
|
||||
if (m_wakeUpTimerTag) gtk_timeout_remove( m_wakeUpTimerTag );
|
||||
wxapp_uninstall_thread_wakeup();
|
||||
#endif
|
||||
*/
|
||||
|
||||
if (m_colorCube) free(m_colorCube);
|
||||
}
|
||||
|
@ -21,6 +21,15 @@
|
||||
#include "gdk/gdk.h"
|
||||
#include "gtk/gtk.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// thread system
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#if wxUSE_THREADS
|
||||
extern void wxapp_install_thread_wakeup();
|
||||
extern void wxapp_uninstall_thread_wakeup();
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// data
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -386,9 +395,13 @@ void wxClipboard::Clear()
|
||||
{
|
||||
if (m_dataBroker)
|
||||
{
|
||||
#if wxUSE_THREADS
|
||||
/* disable GUI threads */
|
||||
wxapp_uninstall_thread_wakeup();
|
||||
#endif
|
||||
|
||||
/* 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 */
|
||||
|
||||
if (gdk_selection_owner_get( g_clipboardAtom ) == m_clipboardWidget->window)
|
||||
{
|
||||
m_waiting = TRUE;
|
||||
@ -412,6 +425,11 @@ void wxClipboard::Clear()
|
||||
delete m_dataBroker;
|
||||
m_dataBroker = (wxDataBroker*) NULL;
|
||||
}
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* re-enable GUI threads */
|
||||
wxapp_install_thread_wakeup();
|
||||
#endif
|
||||
}
|
||||
|
||||
m_targetRequested = 0;
|
||||
@ -494,11 +512,20 @@ bool wxClipboard::AddData( wxDataObject *data )
|
||||
(gpointer) NULL );
|
||||
#endif
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* disable GUI threads */
|
||||
wxapp_uninstall_thread_wakeup();
|
||||
#endif
|
||||
|
||||
/* Tell the world we offer clipboard data */
|
||||
if (!gtk_selection_owner_set( m_clipboardWidget,
|
||||
g_clipboardAtom,
|
||||
GDK_CURRENT_TIME ))
|
||||
{
|
||||
#if wxUSE_THREADS
|
||||
/* re-enable GUI threads */
|
||||
wxapp_install_thread_wakeup();
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
m_ownsClipboard = TRUE;
|
||||
@ -507,9 +534,18 @@ bool wxClipboard::AddData( wxDataObject *data )
|
||||
GDK_SELECTION_PRIMARY,
|
||||
GDK_CURRENT_TIME ))
|
||||
{
|
||||
#if wxUSE_THREADS
|
||||
/* re-enable GUI threads */
|
||||
wxapp_install_thread_wakeup();
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
m_ownsPrimarySelection = TRUE;
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* re-enable GUI threads */
|
||||
wxapp_install_thread_wakeup();
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -35,6 +35,15 @@
|
||||
extern void wxapp_install_idle_handler();
|
||||
extern bool g_isIdle;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// thread system
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#if wxUSE_THREADS
|
||||
extern void wxapp_install_thread_wakeup();
|
||||
extern void wxapp_uninstall_thread_wakeup();
|
||||
#endif
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// global data
|
||||
//----------------------------------------------------------------------------
|
||||
@ -363,12 +372,22 @@ bool wxDropTarget::RequestData( wxDataFormat format )
|
||||
if (format.GetType() == wxDF_TEXT) wxPrintf( _T("text data.\n") );
|
||||
*/
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* disable GUI threads */
|
||||
wxapp_uninstall_thread_wakeup();
|
||||
#endif
|
||||
|
||||
/* this should trigger an "drag_data_received" event */
|
||||
gtk_drag_get_data( m_dragWidget,
|
||||
m_dragContext,
|
||||
format.GetAtom(),
|
||||
m_dragTime );
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* re-enable GUI threads */
|
||||
wxapp_install_thread_wakeup();
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -617,23 +636,32 @@ source_drag_data_get (GtkWidget *WXUNUSED(widget),
|
||||
wxDataObject *data_object = (wxDataObject*) node->Data();
|
||||
if (data_object->GetFormat().GetAtom() == selection_data->target)
|
||||
{
|
||||
// printf( "format found.\n" );
|
||||
// printf( "format found.\n" );
|
||||
|
||||
size_t data_size = data_object->GetSize();
|
||||
|
||||
if (data_size > 0)
|
||||
{
|
||||
// printf( "data size: %d.\n", (int)data_size );
|
||||
// printf( "data size: %d.\n", (int)data_size );
|
||||
|
||||
guchar *buffer = new guchar[data_size];
|
||||
data_object->WriteData( buffer );
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* disable GUI threads */
|
||||
wxapp_uninstall_thread_wakeup();
|
||||
#endif
|
||||
|
||||
gtk_selection_data_set( selection_data,
|
||||
selection_data->target,
|
||||
8, // 8-bit
|
||||
buffer,
|
||||
data_size );
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* enable GUI threads */
|
||||
wxapp_install_thread_wakeup();
|
||||
#endif
|
||||
free( buffer );
|
||||
|
||||
/* so far only copy, no moves. TODO. */
|
||||
@ -659,7 +687,7 @@ static void source_drag_data_delete( GtkWidget *WXUNUSED(widget),
|
||||
{
|
||||
if (g_isIdle) wxapp_install_idle_handler();
|
||||
|
||||
// printf( "Delete the data!\n" );
|
||||
// printf( "Delete the data!\n" );
|
||||
|
||||
drop_source->m_retValue = wxDragMove;
|
||||
}
|
||||
@ -674,7 +702,7 @@ static void source_drag_begin( GtkWidget *WXUNUSED(widget),
|
||||
{
|
||||
if (g_isIdle) wxapp_install_idle_handler();
|
||||
|
||||
// printf( "drag_begin.\n" );
|
||||
// printf( "drag_begin.\n" );
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@ -687,7 +715,7 @@ static void source_drag_end( GtkWidget *WXUNUSED(widget),
|
||||
{
|
||||
if (g_isIdle) wxapp_install_idle_handler();
|
||||
|
||||
// printf( "drag_end.\n" );
|
||||
// printf( "drag_end.\n" );
|
||||
|
||||
drop_source->m_waiting = FALSE;
|
||||
}
|
||||
@ -800,7 +828,7 @@ wxDragResult wxDropSource::DoDragDrop( bool WXUNUSED(bAllowMove) )
|
||||
m_waiting = TRUE;
|
||||
|
||||
GdkAtom atom = gdk_atom_intern( "STRING", FALSE );
|
||||
// wxPrintf( _T("atom id: %d.\n"), (int)atom );
|
||||
// printf( "atom id: %d.\n", (int)atom );
|
||||
|
||||
GtkTargetList *target_list = gtk_target_list_new( (GtkTargetEntry*) NULL, 0 );
|
||||
gtk_target_list_add( target_list, atom, 0, 0 );
|
||||
@ -822,6 +850,11 @@ wxDragResult wxDropSource::DoDragDrop( bool WXUNUSED(bAllowMove) )
|
||||
else if (event.state & GDK_BUTTON2_MASK) button_number = 2;
|
||||
else if (event.state & GDK_BUTTON3_MASK) button_number = 3;
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* disable GUI threads */
|
||||
wxapp_uninstall_thread_wakeup();
|
||||
#endif
|
||||
|
||||
/* don't start dragging if no button is down */
|
||||
if (button_number)
|
||||
{
|
||||
@ -846,6 +879,11 @@ wxDragResult wxDropSource::DoDragDrop( bool WXUNUSED(bAllowMove) )
|
||||
while (m_waiting) gtk_main_iteration();;
|
||||
}
|
||||
|
||||
#if wxUSE_THREADS
|
||||
/* re-enable GUI threads */
|
||||
wxapp_install_thread_wakeup();
|
||||
#endif
|
||||
|
||||
g_blockEventsOnDrag = FALSE;
|
||||
|
||||
UnregisterWindow();
|
||||
|
Loading…
Reference in New Issue
Block a user