kbrown / rpms / libreoffice

Forked from rpms/libreoffice 2 years ago
Clone

Blame SOURCES/0126-gtktiledviewer-allow-multiple-DocView-instances.patch

f325b2
From f5e3ccb7b5ccdc9b1064938cc4ce65b677255e3e Mon Sep 17 00:00:00 2001
f325b2
From: Miklos Vajna <vmiklos@collabora.co.uk>
f325b2
Date: Tue, 15 Sep 2015 11:55:09 +0200
f325b2
Subject: [PATCH 126/398] gtktiledviewer: allow multiple DocView instances
f325b2
f325b2
Change-Id: I4e8a08d71a94445e8fd30563867a2741cad862e5
f325b2
(cherry picked from commit f6ef6af23db8b718ef75f66680f696396fa74eaf)
f325b2
---
f325b2
 .../qa/gtktiledviewer/gtktiledviewer.cxx           | 109 +++++++++++++--------
f325b2
 1 file changed, 70 insertions(+), 39 deletions(-)
f325b2
f325b2
diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
f325b2
index 2bafd24f8b08..096458a93dce 100644
f325b2
--- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
f325b2
+++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
f325b2
@@ -30,7 +30,6 @@ static int help()
f325b2
     return 1;
f325b2
 }
f325b2
 
f325b2
-static GtkWidget* pDocView;
f325b2
 static GtkWidget* pStatusBar;
f325b2
 static GtkToolItem* pEnableEditing;
f325b2
 static GtkToolItem* pBold;
f325b2
@@ -50,6 +49,24 @@ static GtkWidget* pFindbar;
f325b2
 static GtkWidget* pFindbarEntry;
f325b2
 static GtkWidget* pFindbarLabel;
f325b2
 
f325b2
+class TiledWindow
f325b2
+{
f325b2
+public:
f325b2
+    GtkWidget* m_pDocView;
f325b2
+
f325b2
+    TiledWindow()
f325b2
+        : m_pDocView(0)
f325b2
+    {
f325b2
+    }
f325b2
+};
f325b2
+
f325b2
+static std::map<GtkWidget*, TiledWindow> g_aWindows;
f325b2
+
f325b2
+static TiledWindow& lcl_getTiledWindow(GtkWidget* pWidget)
f325b2
+{
f325b2
+    return g_aWindows[gtk_widget_get_toplevel(pWidget)];
f325b2
+}
f325b2
+
f325b2
 static void lcl_registerToolItem(GtkToolItem* pItem, const std::string& rName)
f325b2
 {
f325b2
     g_aToolItemCommandNames[pItem] = rName;
f325b2
@@ -60,7 +77,7 @@ const float fZooms[] = { 0.25, 0.5, 0.75, 1.0, 1.5, 2.0, 3.0, 5.0 };
f325b2
 
f325b2
 
f325b2
 /// Get the visible area of the scrolled window
f325b2
-static void getVisibleAreaTwips(GdkRectangle* pArea)
f325b2
+static void getVisibleAreaTwips(GtkWidget* pDocView, GdkRectangle* pArea)
f325b2
 {
f325b2
 #if GTK_CHECK_VERSION(2,14,0) // we need gtk_adjustment_get_page_size()
f325b2
     GtkAdjustment* pHAdjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(pScrolledWindow));
f325b2
@@ -79,6 +96,9 @@ static void getVisibleAreaTwips(GdkRectangle* pArea)
f325b2
 
f325b2
 static void changeZoom( GtkWidget* pButton, gpointer /* pItem */ )
f325b2
 {
f325b2
+    TiledWindow& rWindow = lcl_getTiledWindow(pButton);
f325b2
+    GtkWidget* pDocView = rWindow.m_pDocView;
f325b2
+
f325b2
     const char *sName = gtk_tool_button_get_icon_name( GTK_TOOL_BUTTON(pButton) );
f325b2
 
f325b2
     float fZoom = 0;
f325b2
@@ -125,9 +145,11 @@ static void changeZoom( GtkWidget* pButton, gpointer /* pItem */ )
f325b2
 }
f325b2
 
f325b2
 /// User clicked on the button -> inform LOKDocView.
f325b2
-static void toggleEditing(GtkWidget* /*pButton*/, gpointer /*pItem*/)
f325b2
+static void toggleEditing(GtkWidget* pButton, gpointer /*pItem*/)
f325b2
 {
f325b2
-    LOKDocView* pLOKDocView = LOK_DOC_VIEW(pDocView);
f325b2
+    TiledWindow& rWindow = lcl_getTiledWindow(pButton);
f325b2
+
f325b2
+    LOKDocView* pLOKDocView = LOK_DOC_VIEW(rWindow.m_pDocView);
f325b2
     bool bActive = gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(pEnableEditing));
f325b2
     if (bool(lok_doc_view_get_edit(pLOKDocView)) != bActive)
f325b2
         lok_doc_view_set_edit(pLOKDocView, bActive);
f325b2
@@ -148,9 +170,10 @@ static void toggleFindbar(GtkWidget* /*pButton*/, gpointer /*pItem*/)
f325b2
 }
f325b2
 
f325b2
 /// Calls lok::Document::createView().
f325b2
-static void createView(GtkWidget* /*pButton*/, gpointer /*pItem*/)
f325b2
+static void createView(GtkWidget* pButton, gpointer /*pItem*/)
f325b2
 {
f325b2
-    LOKDocView* pLOKDocView = LOK_DOC_VIEW(pDocView);
f325b2
+    TiledWindow& rWindow = lcl_getTiledWindow(pButton);
f325b2
+    LOKDocView* pLOKDocView = LOK_DOC_VIEW(rWindow.m_pDocView);
f325b2
     LibreOfficeKitDocument* pDocument = lok_doc_view_get_document(pLOKDocView);
f325b2
     pDocument->pClass->createView(pDocument);
f325b2
 }
f325b2
@@ -185,14 +208,15 @@ static void clipboardSetHtml(GtkClipboard* pClipboard, const char* pSelection)
f325b2
 }
f325b2
 
f325b2
 /// Handler for the copy button: write clipboard.
f325b2
-static void doCopy(GtkWidget* /*pButton*/, gpointer /*pItem*/)
f325b2
+static void doCopy(GtkWidget* pButton, gpointer /*pItem*/)
f325b2
 {
f325b2
-    LOKDocView* pLOKDocView = LOK_DOC_VIEW(pDocView);
f325b2
+    TiledWindow& rWindow = lcl_getTiledWindow(pButton);
f325b2
+    LOKDocView* pLOKDocView = LOK_DOC_VIEW(rWindow.m_pDocView);
f325b2
     LibreOfficeKitDocument* pDocument = lok_doc_view_get_document(pLOKDocView);
f325b2
     char* pUsedFormat = 0;
f325b2
     char* pSelection = pDocument->pClass->getTextSelection(pDocument, "text/html", &pUsedFormat);
f325b2
 
f325b2
-    GtkClipboard* pClipboard = gtk_clipboard_get_for_display(gtk_widget_get_display(pDocView), GDK_SELECTION_CLIPBOARD);
f325b2
+    GtkClipboard* pClipboard = gtk_clipboard_get_for_display(gtk_widget_get_display(rWindow.m_pDocView), GDK_SELECTION_CLIPBOARD);
f325b2
     std::string aUsedFormat(pUsedFormat);
f325b2
     if (aUsedFormat == "text/plain;charset=utf-8")
f325b2
         gtk_clipboard_set_text(pClipboard, pSelection, -1);
f325b2
@@ -204,7 +228,7 @@ static void doCopy(GtkWidget* /*pButton*/, gpointer /*pItem*/)
f325b2
 
f325b2
 
f325b2
 /// Searches for the next or previous text of pFindbarEntry.
f325b2
-static void doSearch(bool bBackwards)
f325b2
+static void doSearch(GtkWidget* pButton, bool bBackwards)
f325b2
 {
f325b2
     GtkEntry* pEntry = GTK_ENTRY(pFindbarEntry);
f325b2
     const char* pText = gtk_entry_get_text(pEntry);
f325b2
@@ -214,9 +238,10 @@ static void doSearch(bool bBackwards)
f325b2
     aTree.put(boost::property_tree::ptree::path_type("SearchItem.Backward/type", '/'), "boolean");
f325b2
     aTree.put(boost::property_tree::ptree::path_type("SearchItem.Backward/value", '/'), bBackwards);
f325b2
 
f325b2
-    LOKDocView* pLOKDocView = LOK_DOC_VIEW(pDocView);
f325b2
+    TiledWindow& rWindow = lcl_getTiledWindow(pButton);
f325b2
+    LOKDocView* pLOKDocView = LOK_DOC_VIEW(rWindow.m_pDocView);
f325b2
     GdkRectangle aArea;
f325b2
-    getVisibleAreaTwips(&aArea);
f325b2
+    getVisibleAreaTwips(rWindow.m_pDocView, &aArea);
f325b2
     aTree.put(boost::property_tree::ptree::path_type("SearchItem.SearchStartPointX/type", '/'), "long");
f325b2
     aTree.put(boost::property_tree::ptree::path_type("SearchItem.SearchStartPointX/value", '/'), aArea.x);
f325b2
     aTree.put(boost::property_tree::ptree::path_type("SearchItem.SearchStartPointY/type", '/'), "long");
f325b2
@@ -229,19 +254,19 @@ static void doSearch(bool bBackwards)
f325b2
 }
f325b2
 
f325b2
 /// Click handler for the search next button.
f325b2
-static void signalSearchNext(GtkWidget* /*pButton*/, gpointer /*pItem*/)
f325b2
+static void signalSearchNext(GtkWidget* pButton, gpointer /*pItem*/)
f325b2
 {
f325b2
-    doSearch(/*bBackwards=*/false);
f325b2
+    doSearch(pButton, /*bBackwards=*/false);
f325b2
 }
f325b2
 
f325b2
 /// Click handler for the search previous button.
f325b2
-static void signalSearchPrev(GtkWidget* /*pButton*/, gpointer /*pItem*/)
f325b2
+static void signalSearchPrev(GtkWidget* pButton, gpointer /*pItem*/)
f325b2
 {
f325b2
-    doSearch(/*bBackwards=*/true);
f325b2
+    doSearch(pButton, /*bBackwards=*/true);
f325b2
 }
f325b2
 
f325b2
 /// Handles the key-press-event of the search entry widget.
f325b2
-static gboolean signalFindbar(GtkWidget* /*pWidget*/, GdkEventKey* pEvent, gpointer /*pData*/)
f325b2
+static gboolean signalFindbar(GtkWidget* pWidget, GdkEventKey* pEvent, gpointer /*pData*/)
f325b2
 {
f325b2
     gtk_label_set_text(GTK_LABEL(pFindbarLabel), "");
f325b2
     switch(pEvent->keyval)
f325b2
@@ -249,7 +274,7 @@ static gboolean signalFindbar(GtkWidget* /*pWidget*/, GdkEventKey* pEvent, gpoin
f325b2
         case GDK_KEY_Return:
f325b2
         {
f325b2
             // Search forward.
f325b2
-            doSearch(/*bBackwards=*/false);
f325b2
+            doSearch(pWidget, /*bBackwards=*/false);
f325b2
             return TRUE;
f325b2
         }
f325b2
         case GDK_KEY_Escape:
f325b2
@@ -330,7 +355,7 @@ static void signalHyperlink(LOKDocView* /*pLOKDocView*/, char* pPayload, gpointe
f325b2
 }
f325b2
 
f325b2
 /// Cursor position changed
f325b2
-static void cursorChanged(LOKDocView* /*pDocView*/, gint nX, gint nY,
f325b2
+static void cursorChanged(LOKDocView* pDocView, gint nX, gint nY,
f325b2
                           gint /*nWidth*/, gint /*nHeight*/, gpointer /*pData*/)
f325b2
 {
f325b2
     GtkAdjustment* vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(pScrolledWindow));
f325b2
@@ -339,7 +364,7 @@ static void cursorChanged(LOKDocView* /*pDocView*/, gint nX, gint nY,
f325b2
     gdouble upper;
f325b2
     gint x = -1, y = -1;
f325b2
 
f325b2
-    getVisibleAreaTwips(&visArea);
f325b2
+    getVisibleAreaTwips(GTK_WIDGET(pDocView), &visArea);
f325b2
 
f325b2
     // check vertically
f325b2
     if (nY < visArea.y)
f325b2
@@ -381,7 +406,8 @@ static void toggleToolItem(GtkWidget* pWidget, gpointer /*pData*/)
f325b2
 {
f325b2
     if (g_bToolItemBroadcast)
f325b2
     {
f325b2
-        LOKDocView* pLOKDocView = LOK_DOC_VIEW(pDocView);
f325b2
+        TiledWindow& rWindow = lcl_getTiledWindow(pWidget);
f325b2
+        LOKDocView* pLOKDocView = LOK_DOC_VIEW(rWindow.m_pDocView);
f325b2
         GtkToolItem* pItem = GTK_TOOL_ITEM(pWidget);
f325b2
         const std::string& rString = g_aToolItemCommandNames[pItem];
f325b2
         g_info("toggleToolItem: lok_doc_view_post_command('%s')", rString.c_str());
f325b2
@@ -389,13 +415,13 @@ static void toggleToolItem(GtkWidget* pWidget, gpointer /*pData*/)
f325b2
     }
f325b2
 }
f325b2
 
f325b2
-static void populatePartSelector()
f325b2
+static void populatePartSelector(LOKDocView* pLOKDocView)
f325b2
 {
f325b2
     gtk_list_store_clear( GTK_LIST_STORE(
f325b2
                               gtk_combo_box_get_model(
f325b2
                                   GTK_COMBO_BOX(pPartSelector) )) );
f325b2
 
f325b2
-    if ( !pDocView )
f325b2
+    if (!pLOKDocView)
f325b2
     {
f325b2
         return;
f325b2
     }
f325b2
@@ -403,35 +429,35 @@ static void populatePartSelector()
f325b2
     const int nMaxLength = 50;
f325b2
     char sText[nMaxLength];
f325b2
 
f325b2
-    int nParts = lok_doc_view_get_parts( LOK_DOC_VIEW(pDocView) );
f325b2
+    int nParts = lok_doc_view_get_parts(pLOKDocView);
f325b2
     for ( int i = 0; i < nParts; i++ )
f325b2
     {
f325b2
-        char* pName = lok_doc_view_get_part_name( LOK_DOC_VIEW(pDocView), i );
f325b2
+        char* pName = lok_doc_view_get_part_name(pLOKDocView, i);
f325b2
         assert( pName );
f325b2
         snprintf( sText, nMaxLength, "%i (%s)", i+1, pName );
f325b2
         free( pName );
f325b2
 
f325b2
         gtk_combo_box_text_append_text( pPartSelector, sText );
f325b2
     }
f325b2
-    gtk_combo_box_set_active( GTK_COMBO_BOX(pPartSelector),
f325b2
-                              lok_doc_view_get_part( LOK_DOC_VIEW(pDocView) ) );
f325b2
+    gtk_combo_box_set_active(GTK_COMBO_BOX(pPartSelector), lok_doc_view_get_part(pLOKDocView));
f325b2
 }
f325b2
 
f325b2
-static void signalSize(LOKDocView* /*pLOKDocView*/, gpointer /*pData*/)
f325b2
+static void signalSize(LOKDocView* pLOKDocView, gpointer /*pData*/)
f325b2
 {
f325b2
     g_bPartSelectorBroadcast = false;
f325b2
-    populatePartSelector();
f325b2
+    populatePartSelector(pLOKDocView);
f325b2
     g_bPartSelectorBroadcast = true;
f325b2
 }
f325b2
 
f325b2
 static void changePart( GtkWidget* pSelector, gpointer /* pItem */ )
f325b2
 {
f325b2
     int nPart = gtk_combo_box_get_active( GTK_COMBO_BOX(pSelector) );
f325b2
+    TiledWindow& rWindow = lcl_getTiledWindow(pSelector);
f325b2
 
f325b2
-    if (g_bPartSelectorBroadcast && pDocView)
f325b2
+    if (g_bPartSelectorBroadcast && rWindow.m_pDocView)
f325b2
     {
f325b2
-        lok_doc_view_set_part( LOK_DOC_VIEW(pDocView), nPart );
f325b2
-        lok_doc_view_reset_view( LOK_DOC_VIEW(pDocView) );
f325b2
+        lok_doc_view_set_part( LOK_DOC_VIEW(rWindow.m_pDocView), nPart );
f325b2
+        lok_doc_view_reset_view( LOK_DOC_VIEW(rWindow.m_pDocView) );
f325b2
     }
f325b2
 }
f325b2
 
f325b2
@@ -453,32 +479,33 @@ static void changePartMode( GtkWidget* pSelector, gpointer /* pItem */ )
f325b2
     // I.e. the ordering above should match the enum member ordering.
f325b2
     LibreOfficeKitPartMode ePartMode =
f325b2
         LibreOfficeKitPartMode( gtk_combo_box_get_active( GTK_COMBO_BOX(pSelector) ) );
f325b2
+    TiledWindow& rWindow = lcl_getTiledWindow(pSelector);
f325b2
 
f325b2
-    if ( pDocView )
f325b2
+    if ( rWindow.m_pDocView )
f325b2
     {
f325b2
-        lok_doc_view_set_partmode( LOK_DOC_VIEW(pDocView), ePartMode );
f325b2
+        lok_doc_view_set_partmode( LOK_DOC_VIEW(rWindow.m_pDocView), ePartMode );
f325b2
     }
f325b2
 }
f325b2
 
f325b2
 static void openDocumentCallback (GObject* source_object, GAsyncResult* res, gpointer /*userdata*/)
f325b2
 {
f325b2
-    LOKDocView* pDocView1 = LOK_DOC_VIEW (source_object);
f325b2
+    LOKDocView* pDocView = LOK_DOC_VIEW (source_object);
f325b2
     GError* error = NULL;
f325b2
     GList *focusChain = NULL;
f325b2
 
f325b2
-    if (!lok_doc_view_open_document_finish(pDocView1, res, &error))
f325b2
+    if (!lok_doc_view_open_document_finish(pDocView, res, &error))
f325b2
     {
f325b2
         g_warning ("Error occurred while opening the document : %s", error->message);
f325b2
         g_error_free (error);
f325b2
     }
f325b2
 
f325b2
-    populatePartSelector();
f325b2
+    populatePartSelector(pDocView);
f325b2
     populatePartModeSelector( GTK_COMBO_BOX_TEXT(pPartModeComboBox) );
f325b2
     // Connect these signals after populating the selectors, to avoid re-rendering on setting the default part/partmode.
f325b2
     g_signal_connect(G_OBJECT(pPartModeComboBox), "changed", G_CALLBACK(changePartMode), 0);
f325b2
     g_signal_connect(G_OBJECT(pPartSelector), "changed", G_CALLBACK(changePart), 0);
f325b2
 
f325b2
-    focusChain = g_list_append( focusChain, pDocView1 );
f325b2
+    focusChain = g_list_append( focusChain, pDocView );
f325b2
     gtk_container_set_focus_chain ( GTK_CONTAINER (pVBox), focusChain );
f325b2
 
f325b2
     gtk_widget_hide (pStatusBar);
f325b2
@@ -639,7 +666,7 @@ int main( int argc, char* argv[] )
f325b2
     gtk_box_pack_end(GTK_BOX(pVBox), pFindbar, FALSE, FALSE, 0);
f325b2
 
f325b2
     // Docview
f325b2
-    pDocView = lok_doc_view_new (argv[1], NULL, NULL);
f325b2
+    GtkWidget* pDocView = lok_doc_view_new (argv[1], NULL, NULL);
f325b2
 #if GLIB_CHECK_VERSION(2,40,0)
f325b2
     g_assert_nonnull(pDocView);
f325b2
 #endif
f325b2
@@ -674,6 +701,10 @@ int main( int argc, char* argv[] )
f325b2
     // Hide the findbar by default.
f325b2
     gtk_widget_hide(pFindbar);
f325b2
 
f325b2
+    TiledWindow aWindow;
f325b2
+    aWindow.m_pDocView = pDocView;
f325b2
+    g_aWindows[pWindow] = aWindow;
f325b2
+
f325b2
     lok_doc_view_open_document( LOK_DOC_VIEW(pDocView), argv[2], NULL, openDocumentCallback, pDocView );
f325b2
 
f325b2
     gtk_main();
f325b2
-- 
f325b2
2.12.0
f325b2