diff options
-rw-r--r-- | include/LibreOfficeKit/LibreOfficeKitEnums.h | 11 | ||||
-rw-r--r-- | include/LibreOfficeKit/LibreOfficeKitGtk.h | 2 | ||||
-rw-r--r-- | libreofficekit/source/gtk/lokdocview.c | 12 | ||||
-rw-r--r-- | sw/source/core/crsr/viscrs.cxx | 6 |
4 files changed, 28 insertions, 3 deletions
diff --git a/include/LibreOfficeKit/LibreOfficeKitEnums.h b/include/LibreOfficeKit/LibreOfficeKitEnums.h index a8aca2f7abec..aed96d64a7c5 100644 --- a/include/LibreOfficeKit/LibreOfficeKitEnums.h +++ b/include/LibreOfficeKit/LibreOfficeKitEnums.h @@ -78,7 +78,16 @@ typedef enum * LOK_CALLBACK_TEXT_SELECTION one. Rectangle format is the same as * LOK_CALLBACK_INVALIDATE_TILES. */ - LOK_CALLBACK_TEXT_SELECTION_END + LOK_CALLBACK_TEXT_SELECTION_END, + /** + * The blinking text cursor is now visible or not. + * + * Clients should assume that this is false initially and are expected to + * show a blinking cursor at the rectangle described by + * LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR once it becomes true. Payload is + * either the "true" or the "false" string. + */ + LOK_CALLBACK_CURSOR_VISIBLE } LibreOfficeKitCallbackType; diff --git a/include/LibreOfficeKit/LibreOfficeKitGtk.h b/include/LibreOfficeKit/LibreOfficeKitGtk.h index dbd2f8d9ff69..c98b61271691 100644 --- a/include/LibreOfficeKit/LibreOfficeKitGtk.h +++ b/include/LibreOfficeKit/LibreOfficeKitGtk.h @@ -46,6 +46,8 @@ struct _LOKDocView GdkRectangle m_aVisibleCursor; /// Cursor overlay is visible or hidden (for blinking). gboolean m_bCursorOverlayVisible; + /// Cursor is visible or hidden (e.g. for graphic selection). + gboolean m_bCursorVisible; /// Time of the last button press. guint32 m_nLastButtonPressTime; /// Time of the last button release. diff --git a/libreofficekit/source/gtk/lokdocview.c b/libreofficekit/source/gtk/lokdocview.c index 23adab27941c..93ed764b8cf0 100644 --- a/libreofficekit/source/gtk/lokdocview.c +++ b/libreofficekit/source/gtk/lokdocview.c @@ -247,6 +247,7 @@ static void lok_docview_init( LOKDocView* pDocView ) pDocView->m_bEdit = FALSE; memset(&pDocView->m_aVisibleCursor, 0, sizeof(pDocView->m_aVisibleCursor)); pDocView->m_bCursorOverlayVisible = FALSE; + pDocView->m_bCursorVisible = FALSE; pDocView->m_nLastButtonPressTime = 0; pDocView->m_nLastButtonReleaseTime = 0; pDocView->m_pTextSelectionRectangles = NULL; @@ -355,7 +356,7 @@ static gboolean renderOverlay(GtkWidget* pWidget, GdkEventExpose* pEvent, gpoint (void)pEvent; pCairo = gdk_cairo_create(gtk_widget_get_window(pWidget)); - if (pDocView->m_bCursorOverlayVisible && !lcl_isEmptyRectangle(&pDocView->m_aVisibleCursor)) + if (pDocView->m_bCursorVisible && pDocView->m_bCursorOverlayVisible && !lcl_isEmptyRectangle(&pDocView->m_aVisibleCursor)) { if (pDocView->m_aVisibleCursor.width == 0) // Set a minimal width if it would be 0. @@ -371,7 +372,7 @@ static gboolean renderOverlay(GtkWidget* pWidget, GdkEventExpose* pEvent, gpoint } - if (!lcl_isEmptyRectangle(&pDocView->m_aVisibleCursor) && !pDocView->m_pTextSelectionRectangles) + if (pDocView->m_bCursorVisible && !lcl_isEmptyRectangle(&pDocView->m_aVisibleCursor) && !pDocView->m_pTextSelectionRectangles) { // Have a cursor, but no selection: we need the middle handle. if (!pDocView->m_pHandleMiddle) @@ -603,6 +604,8 @@ static const gchar* lcl_LibreOfficeKitCallbackTypeToString(int nType) return "LOK_CALLBACK_TEXT_SELECTION_START"; case LOK_CALLBACK_TEXT_SELECTION_END: return "LOK_CALLBACK_TEXT_SELECTION_END"; + case LOK_CALLBACK_CURSOR_VISIBLE: + return "LOK_CALLBACK_CURSOR_VISIBLE"; } return 0; } @@ -664,6 +667,11 @@ static gboolean lok_docview_callback(gpointer pData) pCallback->m_pDocView->m_aTextSelectionEnd = lcl_payloadToRectangle(pCallback->m_pPayload); } break; + case LOK_CALLBACK_CURSOR_VISIBLE: + { + pCallback->m_pDocView->m_bCursorVisible = strcmp(pCallback->m_pPayload, "true") == 0; + } + break; default: break; } diff --git a/sw/source/core/crsr/viscrs.cxx b/sw/source/core/crsr/viscrs.cxx index cbb55e89f77d..5a30a8280382 100644 --- a/sw/source/core/crsr/viscrs.cxx +++ b/sw/source/core/crsr/viscrs.cxx @@ -93,10 +93,16 @@ void SwVisCrsr::Show() if( m_pCrsrShell->VisArea().IsOver( m_pCrsrShell->m_aCharRect ) || m_pCrsrShell->isTiledRendering() ) _SetPosAndShow(); } + + if (m_pCrsrShell->isTiledRendering()) + m_pCrsrShell->libreOfficeKitCallback(LOK_CALLBACK_CURSOR_VISIBLE, OString::boolean(true).getStr()); } void SwVisCrsr::Hide() { + if (m_pCrsrShell->isTiledRendering()) + m_pCrsrShell->libreOfficeKitCallback(LOK_CALLBACK_CURSOR_VISIBLE, OString::boolean(false).getStr()); + if( m_bIsVisible ) { m_bIsVisible = false; |