http://bugzilla.abisource.com/show_bug.cgi?id=13586 Index: src/text/fmt/gtk/fv_UnixSelectionHandles.cpp =================================================================== --- ./src/text/fmt/gtk/fv_UnixSelectionHandles.cpp (revision 33662) +++ ./src/text/fmt/gtk/fv_UnixSelectionHandles.cpp (revision 33663) @@ -36,42 +36,60 @@ mode = _fv_text_handle_get_mode (handle); - if (pos == FV_TEXT_HANDLE_POSITION_SELECTION_START) + if (pos == FV_TEXT_HANDLE_POSITION_SELECTION_START) { handles->updateSelectionStart ((UT_sint32)x, (UT_sint32)y); + } else { - if (mode == FV_TEXT_HANDLE_MODE_SELECTION) + if (mode == FV_TEXT_HANDLE_MODE_SELECTION) { handles->updateSelectionEnd ((UT_sint32)x, (UT_sint32)y); - else + } + else { handles->updateCursor((UT_sint32)x, (UT_sint32)y); + } } } FV_UnixSelectionHandles::FV_UnixSelectionHandles(FV_View *view, FV_Selection selection) : FV_SelectionHandles (view, selection) + , m_text_handle(NULL) { XAP_Frame * pFrame = static_cast(m_pView->getParentData()); - XAP_UnixFrameImpl * pFrameImpl =static_cast( pFrame->getFrameImpl()); - GtkWidget * pWidget = pFrameImpl->getViewWidget(); + // When saving to PDF (and printing) we don't have a frame + // See bug 13586 + if (pFrame) { + XAP_UnixFrameImpl * pFrameImpl = static_cast(pFrame->getFrameImpl()); + GtkWidget * pWidget = pFrameImpl->getViewWidget(); - m_text_handle = _fv_text_handle_new (pWidget); - _fv_text_handle_set_relative_to (m_text_handle, - gtk_widget_get_window (pWidget)); - g_signal_connect (m_text_handle, "handle-dragged", - G_CALLBACK(handle_dragged_cb), this); + m_text_handle = _fv_text_handle_new (pWidget); + _fv_text_handle_set_relative_to (m_text_handle, + gtk_widget_get_window (pWidget)); + g_signal_connect (m_text_handle, "handle-dragged", + G_CALLBACK(handle_dragged_cb), this); + } } FV_UnixSelectionHandles::~FV_UnixSelectionHandles() { + if(!m_text_handle) { + return; + } g_object_unref (m_text_handle); } void FV_UnixSelectionHandles::hide() { + if(!m_text_handle) { + return; + } _fv_text_handle_set_mode (m_text_handle, FV_TEXT_HANDLE_MODE_NONE); } void FV_UnixSelectionHandles::setCursorCoords(UT_sint32 x, UT_sint32 y, UT_uint32 height, bool visible) { + if(!m_text_handle) { + return; + } + GdkRectangle rect; _fv_text_handle_set_mode(m_text_handle, FV_TEXT_HANDLE_MODE_CURSOR); @@ -92,6 +110,10 @@ void FV_UnixSelectionHandles::setSelectionCoords(UT_sint32 start_x, UT_sint32 start_y, UT_uint32 start_height, bool start_visible, UT_sint32 end_x, UT_sint32 end_y, UT_uint32 end_height, bool end_visible) { + if(!m_text_handle) { + return; + } + GdkRectangle rect; _fv_text_handle_set_mode(m_text_handle, FV_TEXT_HANDLE_MODE_SELECTION);