summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/LibreOfficeKit/LibreOfficeKitEnums.h11
-rw-r--r--include/LibreOfficeKit/LibreOfficeKitGtk.h2
-rw-r--r--libreofficekit/source/gtk/lokdocview.c12
-rw-r--r--sw/source/core/crsr/viscrs.cxx6
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;