summaryrefslogtreecommitdiff
path: root/libreofficekit
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2015-03-31 12:50:36 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2015-04-07 09:18:06 +0200
commit267fd94a512336f3892110ec8d76cde60b7a61c3 (patch)
treef28f851de428c187696f3bc4f859482244a931ed /libreofficekit
parentf8f30f6bc2cc3b84f26818164d15b94922ae9553 (diff)
lokdocview: GList -> std::vector
Primarily because I'm worried about the untyped GList. Change-Id: I0ae6610019f6e80b0cad12086782fd89ac74943b
Diffstat (limited to 'libreofficekit')
-rw-r--r--libreofficekit/source/gtk/lokdocview.cxx123
1 files changed, 58 insertions, 65 deletions
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index 04a7aeb0c2cc..f5a325764303 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -10,6 +10,7 @@
#include <sal/types.h>
#include <math.h>
#include <string.h>
+#include <vector>
#include <gdk/gdkkeysyms.h>
@@ -61,7 +62,7 @@ struct LOKDocView_Impl
/// Time of the last button release.
guint32 m_nLastButtonReleaseTime;
/// Rectangles of the current text selection.
- GList* m_pTextSelectionRectangles;
+ std::vector<GdkRectangle> m_aTextSelectionRectangles;
/// Position and size of the selection start (as if there would be a cursor caret there).
GdkRectangle m_aTextSelectionStart;
/// Position and size of the selection end.
@@ -155,6 +156,10 @@ struct LOKDocView_Impl
* the tiles that intersect with pPartial.
*/
void renderDocument(GdkRectangle* pPartial);
+ /// Returns the GdkRectangle of a width,height,x,y string.
+ static GdkRectangle payloadToRectangle(const char* pPayload);
+ /// Returns the GdkRectangles of a w,h,x,y;w2,h2,x2,y2;... string.
+ static std::vector<GdkRectangle> payloadToRectangles(const char* pPayload);
};
LOKDocView_Impl::LOKDocView_Impl(LOKDocView* pDocView)
@@ -171,7 +176,6 @@ LOKDocView_Impl::LOKDocView_Impl(LOKDocView* pDocView)
m_bCursorVisible(true),
m_nLastButtonPressTime(0),
m_nLastButtonReleaseTime(0),
- m_pTextSelectionRectangles(0),
m_aTextSelectionStart({0, 0, 0, 0}),
m_aTextSelectionEnd({0, 0, 0, 0}),
m_aGraphicSelection({0, 0, 0, 0}),
@@ -498,7 +502,7 @@ gboolean LOKDocView_Impl::renderOverlayImpl(GtkWidget* pWidget)
cairo_fill(pCairo);
}
- if (m_bEdit && m_bCursorVisible && !isEmptyRectangle(m_aVisibleCursor) && !m_pTextSelectionRectangles)
+ if (m_bEdit && m_bCursorVisible && !isEmptyRectangle(m_aVisibleCursor) && m_aTextSelectionRectangles.empty())
{
// Have a cursor, but no selection: we need the middle handle.
if (!m_pHandleMiddle)
@@ -506,18 +510,17 @@ gboolean LOKDocView_Impl::renderOverlayImpl(GtkWidget* pWidget)
renderHandle(pCairo, m_aVisibleCursor, m_pHandleMiddle, m_aHandleMiddleRect);
}
- if (m_pTextSelectionRectangles)
+ if (!m_aTextSelectionRectangles.empty())
{
- for (GList* i = m_pTextSelectionRectangles; i != NULL; i = i->next)
+ for (GdkRectangle& rRectangle : m_aTextSelectionRectangles)
{
- GdkRectangle* pRectangle = static_cast<GdkRectangle*>(i->data);
// Blue with 75% transparency.
cairo_set_source_rgba(pCairo, ((double)0x43)/255, ((double)0xac)/255, ((double)0xe8)/255, 0.25);
cairo_rectangle(pCairo,
- twipToPixel(pRectangle->x),
- twipToPixel(pRectangle->y),
- twipToPixel(pRectangle->width),
- twipToPixel(pRectangle->height));
+ twipToPixel(rRectangle.x),
+ twipToPixel(rRectangle.y),
+ twipToPixel(rRectangle.width),
+ twipToPixel(rRectangle.height));
cairo_fill(pCairo);
}
@@ -766,6 +769,44 @@ void LOKDocView_Impl::renderDocument(GdkRectangle* pPartial)
}
}
+GdkRectangle LOKDocView_Impl::payloadToRectangle(const char* pPayload)
+{
+ GdkRectangle aRet;
+
+ aRet.width = aRet.height = aRet.x = aRet.y = 0;
+ gchar** ppCoordinates = g_strsplit(pPayload, ", ", 4);
+ gchar** ppCoordinate = ppCoordinates;
+ if (!*ppCoordinate)
+ return aRet;
+ aRet.x = atoi(*ppCoordinate);
+ ++ppCoordinate;
+ if (!*ppCoordinate)
+ return aRet;
+ aRet.y = atoi(*ppCoordinate);
+ ++ppCoordinate;
+ if (!*ppCoordinate)
+ return aRet;
+ aRet.width = atoi(*ppCoordinate);
+ ++ppCoordinate;
+ if (!*ppCoordinate)
+ return aRet;
+ aRet.height = atoi(*ppCoordinate);
+ g_strfreev(ppCoordinates);
+ return aRet;
+}
+
+std::vector<GdkRectangle> LOKDocView_Impl::payloadToRectangles(const char* pPayload)
+{
+ std::vector<GdkRectangle> aRet;
+
+ gchar** ppRectangles = g_strsplit(pPayload, "; ", 0);
+ for (gchar** ppRectangle = ppRectangles; *ppRectangle; ++ppRectangle)
+ aRet.push_back(payloadToRectangle(*ppRectangle));
+ g_strfreev(ppRectangles);
+
+ return aRet;
+}
+
enum
{
EDIT_CHANGED,
@@ -854,51 +895,6 @@ typedef struct
}
LOKDocViewCallbackData;
-/// Returns the GdkRectangle of a width,height,x,y string.
-static GdkRectangle lcl_payloadToRectangle(const char* pPayload)
-{
- GdkRectangle aRet;
-
- aRet.width = aRet.height = aRet.x = aRet.y = 0;
- gchar** ppCoordinates = g_strsplit(pPayload, ", ", 4);
- gchar** ppCoordinate = ppCoordinates;
- if (!*ppCoordinate)
- return aRet;
- aRet.x = atoi(*ppCoordinate);
- ++ppCoordinate;
- if (!*ppCoordinate)
- return aRet;
- aRet.y = atoi(*ppCoordinate);
- ++ppCoordinate;
- if (!*ppCoordinate)
- return aRet;
- aRet.width = atoi(*ppCoordinate);
- ++ppCoordinate;
- if (!*ppCoordinate)
- return aRet;
- aRet.height = atoi(*ppCoordinate);
- g_strfreev(ppCoordinates);
- return aRet;
-}
-
-/// Returns the GdkRectangle list of a w,h,x,y;w2,h2,x2,y2;... string.
-static GList* lcl_payloadToRectangles(const char* pPayload)
-{
- GList* pRet = NULL;
-
- gchar** ppRectangles = g_strsplit(pPayload, "; ", 0);
- for (gchar** ppRectangle = ppRectangles; *ppRectangle; ++ppRectangle)
- {
- GdkRectangle aRect = lcl_payloadToRectangle(*ppRectangle);
- GdkRectangle* pRect = g_new0(GdkRectangle, 1);
- *pRect = aRect;
- pRet = g_list_prepend(pRet, pRect);
- }
- g_strfreev(ppRectangles);
-
- return pRet;
-}
-
static const gchar* lcl_LibreOfficeKitCallbackTypeToString(int nType)
{
switch (nType)
@@ -935,7 +931,7 @@ static gboolean lok_docview_callback(gpointer pData)
{
if (strcmp(pCallback->m_pPayload, "EMPTY") != 0)
{
- GdkRectangle aRectangle = lcl_payloadToRectangle(pCallback->m_pPayload);
+ GdkRectangle aRectangle = LOKDocView_Impl::payloadToRectangle(pCallback->m_pPayload);
pCallback->m_pDocView->m_pImpl->renderDocument(&aRectangle);
}
else
@@ -944,7 +940,7 @@ static gboolean lok_docview_callback(gpointer pData)
break;
case LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR:
{
- pCallback->m_pDocView->m_pImpl->m_aVisibleCursor = lcl_payloadToRectangle(pCallback->m_pPayload);
+ pCallback->m_pDocView->m_pImpl->m_aVisibleCursor = LOKDocView_Impl::payloadToRectangle(pCallback->m_pPayload);
pCallback->m_pDocView->m_pImpl->m_bCursorOverlayVisible = true;
gtk_widget_queue_draw(GTK_WIDGET(pCallback->m_pDocView->m_pImpl->m_pEventBox));
}
@@ -952,13 +948,10 @@ static gboolean lok_docview_callback(gpointer pData)
case LOK_CALLBACK_TEXT_SELECTION:
{
LOKDocView* pDocView = pCallback->m_pDocView;
- GList* pRectangles = lcl_payloadToRectangles(pCallback->m_pPayload);
- if (pDocView->m_pImpl->m_pTextSelectionRectangles)
- g_list_free_full(pDocView->m_pImpl->m_pTextSelectionRectangles, g_free);
- pDocView->m_pImpl->m_pTextSelectionRectangles = pRectangles;
+ pDocView->m_pImpl->m_aTextSelectionRectangles = LOKDocView_Impl::payloadToRectangles(pCallback->m_pPayload);
// In case the selection is empty, then we get no LOK_CALLBACK_TEXT_SELECTION_START/END events.
- if (pRectangles == NULL)
+ if (pDocView->m_pImpl->m_aTextSelectionRectangles.empty())
{
memset(&pDocView->m_pImpl->m_aTextSelectionStart, 0, sizeof(pDocView->m_pImpl->m_aTextSelectionStart));
memset(&pDocView->m_pImpl->m_aHandleStartRect, 0, sizeof(pDocView->m_pImpl->m_aHandleStartRect));
@@ -972,12 +965,12 @@ static gboolean lok_docview_callback(gpointer pData)
break;
case LOK_CALLBACK_TEXT_SELECTION_START:
{
- pCallback->m_pDocView->m_pImpl->m_aTextSelectionStart = lcl_payloadToRectangle(pCallback->m_pPayload);
+ pCallback->m_pDocView->m_pImpl->m_aTextSelectionStart = LOKDocView_Impl::payloadToRectangle(pCallback->m_pPayload);
}
break;
case LOK_CALLBACK_TEXT_SELECTION_END:
{
- pCallback->m_pDocView->m_pImpl->m_aTextSelectionEnd = lcl_payloadToRectangle(pCallback->m_pPayload);
+ pCallback->m_pDocView->m_pImpl->m_aTextSelectionEnd = LOKDocView_Impl::payloadToRectangle(pCallback->m_pPayload);
}
break;
case LOK_CALLBACK_CURSOR_VISIBLE:
@@ -988,7 +981,7 @@ static gboolean lok_docview_callback(gpointer pData)
case LOK_CALLBACK_GRAPHIC_SELECTION:
{
if (strcmp(pCallback->m_pPayload, "EMPTY") != 0)
- pCallback->m_pDocView->m_pImpl->m_aGraphicSelection = lcl_payloadToRectangle(pCallback->m_pPayload);
+ pCallback->m_pDocView->m_pImpl->m_aGraphicSelection = LOKDocView_Impl::payloadToRectangle(pCallback->m_pPayload);
else
memset(&pCallback->m_pDocView->m_pImpl->m_aGraphicSelection, 0, sizeof(pCallback->m_pDocView->m_pImpl->m_aGraphicSelection));
gtk_widget_queue_draw(GTK_WIDGET(pCallback->m_pDocView->m_pImpl->m_pEventBox));