implemented Freeze/Thaw in wxGTK
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52305 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -326,6 +326,12 @@ protected:
|
|||||||
virtual void DoCaptureMouse();
|
virtual void DoCaptureMouse();
|
||||||
virtual void DoReleaseMouse();
|
virtual void DoReleaseMouse();
|
||||||
|
|
||||||
|
virtual void DoFreeze();
|
||||||
|
virtual void DoThaw();
|
||||||
|
|
||||||
|
static void GTKFreezeWidget(GtkWidget *w);
|
||||||
|
static void GTKThawWidget(GtkWidget *w);
|
||||||
|
|
||||||
#if wxUSE_TOOLTIPS
|
#if wxUSE_TOOLTIPS
|
||||||
virtual void DoSetToolTip( wxToolTip *tip );
|
virtual void DoSetToolTip( wxToolTip *tip );
|
||||||
#endif // wxUSE_TOOLTIPS
|
#endif // wxUSE_TOOLTIPS
|
||||||
|
@@ -557,21 +557,6 @@ gtk_paste_clipboard_callback( GtkWidget *widget, wxTextCtrl *win )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// "expose_event" from scrolled window and textview
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
static gboolean
|
|
||||||
gtk_text_exposed_callback( GtkWidget * WXUNUSED(widget),
|
|
||||||
GdkEventExpose * WXUNUSED(event),
|
|
||||||
wxTextCtrl * WXUNUSED(win) )
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// wxTextCtrl
|
// wxTextCtrl
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -1722,14 +1707,13 @@ void wxTextCtrl::DoFreeze()
|
|||||||
{
|
{
|
||||||
wxCHECK_RET(m_text != NULL, wxT("invalid text ctrl"));
|
wxCHECK_RET(m_text != NULL, wxT("invalid text ctrl"));
|
||||||
|
|
||||||
|
wxWindow::DoFreeze();
|
||||||
|
|
||||||
if ( HasFlag(wxTE_MULTILINE) )
|
if ( HasFlag(wxTE_MULTILINE) )
|
||||||
{
|
{
|
||||||
// freeze textview updates and remove buffer
|
GTKFreezeWidget(m_text);
|
||||||
g_signal_connect (m_text, "expose_event",
|
|
||||||
G_CALLBACK (gtk_text_exposed_callback), this);
|
// removing buffer dramatically speeds up insertion:
|
||||||
g_signal_connect (m_widget, "expose_event",
|
|
||||||
G_CALLBACK (gtk_text_exposed_callback), this);
|
|
||||||
gtk_widget_set_sensitive(m_widget, false);
|
|
||||||
g_object_ref(m_buffer);
|
g_object_ref(m_buffer);
|
||||||
GtkTextBuffer* buf_new = gtk_text_buffer_new(NULL);
|
GtkTextBuffer* buf_new = gtk_text_buffer_new(NULL);
|
||||||
GtkTextMark* mark = GTK_TEXT_VIEW(m_text)->first_para_mark;
|
GtkTextMark* mark = GTK_TEXT_VIEW(m_text)->first_para_mark;
|
||||||
@@ -1749,21 +1733,22 @@ void wxTextCtrl::DoThaw()
|
|||||||
{
|
{
|
||||||
if ( HasFlag(wxTE_MULTILINE) )
|
if ( HasFlag(wxTE_MULTILINE) )
|
||||||
{
|
{
|
||||||
// Reattach buffer and thaw textview updates
|
// reattach buffer:
|
||||||
gtk_text_view_set_buffer(GTK_TEXT_VIEW(m_text), m_buffer);
|
gtk_text_view_set_buffer(GTK_TEXT_VIEW(m_text), m_buffer);
|
||||||
g_object_unref(m_buffer);
|
g_object_unref(m_buffer);
|
||||||
gtk_widget_set_sensitive(m_widget, true);
|
|
||||||
g_signal_handlers_disconnect_by_func (m_widget,
|
|
||||||
(gpointer) gtk_text_exposed_callback, this);
|
|
||||||
g_signal_handlers_disconnect_by_func (m_text,
|
|
||||||
(gpointer) gtk_text_exposed_callback, this);
|
|
||||||
if (m_showPositionOnThaw != NULL)
|
if (m_showPositionOnThaw != NULL)
|
||||||
{
|
{
|
||||||
gtk_text_view_scroll_mark_onscreen(
|
gtk_text_view_scroll_mark_onscreen(
|
||||||
GTK_TEXT_VIEW(m_text), m_showPositionOnThaw);
|
GTK_TEXT_VIEW(m_text), m_showPositionOnThaw);
|
||||||
m_showPositionOnThaw = NULL;
|
m_showPositionOnThaw = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// and thaw the window
|
||||||
|
GTKThawWidget(m_text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxWindow::DoThaw();
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@@ -4205,3 +4205,33 @@ GdkWindow* wxWindowGTK::GTKGetDrawingWindow() const
|
|||||||
window = m_wxwindow->window;
|
window = m_wxwindow->window;
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// freeze/thaw
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void wxWindowGTK::GTKFreezeWidget(GtkWidget *w)
|
||||||
|
{
|
||||||
|
if ( w && !GTK_WIDGET_NO_WINDOW(w) )
|
||||||
|
gdk_window_freeze_updates(w->window);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWindowGTK::GTKThawWidget(GtkWidget *w)
|
||||||
|
{
|
||||||
|
if ( w && !GTK_WIDGET_NO_WINDOW(w) )
|
||||||
|
gdk_window_thaw_updates(w->window);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWindowGTK::DoFreeze()
|
||||||
|
{
|
||||||
|
GTKFreezeWidget(m_widget);
|
||||||
|
if ( m_wxwindow && m_widget != m_wxwindow )
|
||||||
|
GTKFreezeWidget(m_wxwindow);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWindowGTK::DoThaw()
|
||||||
|
{
|
||||||
|
GTKThawWidget(m_widget);
|
||||||
|
if ( m_wxwindow && m_widget != m_wxwindow )
|
||||||
|
GTKThawWidget(m_wxwindow);
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user