summaryrefslogtreecommitdiff
path: root/libreofficekit
diff options
context:
space:
mode:
authorPranav Kant <pranavk@collabora.co.uk>2017-07-28 23:45:25 +0530
committerPranav Kant <pranavk@collabora.co.uk>2017-10-02 10:57:41 +0530
commitddac37b94f03a906c541350e9e8e225fa808dabd (patch)
treeb62483c43a68402fe769bb63c2e412c192ff939c /libreofficekit
parent686ac83f4028cc0bc96d23780654f45db2a9a347 (diff)
lokdialog: Queue a redraw on invalidation in gtktiledviewer
Change-Id: I081508674a71c3beb89175e4f8ac3256e6bc6c6a
Diffstat (limited to 'libreofficekit')
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx48
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx6
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx17
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx2
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx11
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx1
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx10
-rw-r--r--libreofficekit/source/gtk/lokdocview.cxx18
8 files changed, 109 insertions, 4 deletions
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx b/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx
index fbe5746ddf1e..ab28f23578ec 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx
@@ -36,6 +36,8 @@ struct GtvApplicationWindowPrivate
gboolean toolbarBroadcast;
gboolean partSelectorBroadcast;
+ GList* m_pChildWindows;
+
// Rendering args; options with which lokdocview was rendered in this window
GtvRenderingArgs* m_pRenderingArgs;
};
@@ -105,6 +107,7 @@ gtv_application_window_init(GtvApplicationWindow* win)
gtk_container_add(GTK_CONTAINER(win), priv->container);
+ priv->m_pChildWindows = nullptr;
priv->m_pRenderingArgs = new GtvRenderingArgs();
}
@@ -311,6 +314,7 @@ static void setupDocView(GtvApplicationWindow* window)
g_signal_connect(window->lokdocview, "formula-changed", G_CALLBACK(LOKDocViewSigHandlers::formulaChanged), nullptr);
g_signal_connect(window->lokdocview, "password-required", G_CALLBACK(LOKDocViewSigHandlers::passwordRequired), nullptr);
g_signal_connect(window->lokdocview, "comment", G_CALLBACK(LOKDocViewSigHandlers::comment), nullptr);
+ g_signal_connect(window->lokdocview, "dialog-invalidate", G_CALLBACK(LOKDocViewSigHandlers::dialogInvalidate), nullptr);
g_signal_connect(window->lokdocview, "configure-event", G_CALLBACK(LOKDocViewSigHandlers::configureEvent), nullptr);
}
@@ -394,6 +398,50 @@ gtv_application_window_get_part_broadcast(GtvApplicationWindow* window)
return priv->partSelectorBroadcast;
}
+void
+gtv_application_window_register_child_window(GtvApplicationWindow* window, GtkWindow* pChildWin)
+{
+ GtvApplicationWindowPrivate* priv = getPrivate(window);
+ if (pChildWin)
+ priv->m_pChildWindows = g_list_append(priv->m_pChildWindows, pChildWin);
+}
+
+void
+gtv_application_window_unregister_child_window(GtvApplicationWindow* window, GtkWindow* pChildWin)
+{
+ GtvApplicationWindowPrivate* priv = getPrivate(window);
+ if (pChildWin)
+ priv->m_pChildWindows = g_list_remove(priv->m_pChildWindows, pChildWin);
+}
+
+GtkWindow*
+gtv_application_window_get_child_window_by_id(GtvApplicationWindow* window, const gchar* pWinId)
+{
+ GtvApplicationWindowPrivate* priv = getPrivate(window);
+ GList* pIt = nullptr;
+ GtkWindow* ret = nullptr;
+ // For now, only dialogs are registered as child window
+ for (pIt = priv->m_pChildWindows; pIt != nullptr; pIt = pIt->next)
+ {
+ gchar* dialogId = nullptr;
+ g_object_get(G_OBJECT(pIt->data), "dialogid", &dialogId, nullptr);
+
+ // prepend .uno:
+ gchar* completeWinId = nullptr;
+ if (pWinId != nullptr)
+ {
+ completeWinId = g_strconcat(".uno:", pWinId, nullptr);
+ }
+
+ if (dialogId != nullptr && g_str_equal(dialogId, completeWinId))
+ {
+ ret = GTK_WINDOW(pIt->data);
+ break;
+ }
+ }
+ return ret;
+}
+
GtvApplicationWindow*
gtv_application_window_new(GtkApplication* app)
{
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx b/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx
index ec3b0666d76d..c16425566967 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx
@@ -99,6 +99,12 @@ void gtv_application_window_set_part_broadcast(GtvApplicationWindow* window, boo
gboolean gtv_application_window_get_part_broadcast(GtvApplicationWindow* window);
+void gtv_application_window_register_child_window(GtvApplicationWindow* window, GtkWindow* pChildWin);
+
+void gtv_application_window_unregister_child_window(GtvApplicationWindow* window, GtkWindow* pChildWin);
+
+GtkWindow* gtv_application_window_get_child_window_by_id(GtvApplicationWindow* window, const gchar* pWinId);
+
G_END_DECLS
#endif /* GTV_APPLICATION_WINDOW_H */
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx
index 5b48bd1b9ed7..a073198e5db3 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx
@@ -23,6 +23,7 @@
struct GtvLokDialogPrivate
{
LOKDocView* lokdocview;
+ GtkWidget* pDialogDrawingArea;
gchar* dialogid;
};
@@ -68,11 +69,13 @@ gtv_lok_dialog_draw(GtkWidget* pDialogDrawingArea, cairo_t* pCairo, gpointer)
static void
gtv_lok_dialog_init(GtvLokDialog* dialog)
{
+ GtvLokDialogPrivate* priv = getPrivate(dialog);
+
GtkWidget* pContentArea = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
- GtkWidget* pDialogDrawingArea = gtk_drawing_area_new();
+ priv->pDialogDrawingArea = gtk_drawing_area_new();
- g_signal_connect(G_OBJECT(pDialogDrawingArea), "draw", G_CALLBACK(gtv_lok_dialog_draw), nullptr);
- gtk_container_add(GTK_CONTAINER(pContentArea), pDialogDrawingArea);
+ g_signal_connect(G_OBJECT(priv->pDialogDrawingArea), "draw", G_CALLBACK(gtv_lok_dialog_draw), nullptr);
+ gtk_container_add(GTK_CONTAINER(pContentArea), priv->pDialogDrawingArea);
}
static void
@@ -150,6 +153,14 @@ gtv_lok_dialog_class_init(GtvLokDialogClass* klass)
g_object_class_install_properties (G_OBJECT_CLASS(klass), PROP_LAST, properties);
}
+void
+gtv_lok_dialog_invalidate(GtvLokDialog* dialog)
+{
+ // trigger a draw on the drawing area
+ GtvLokDialogPrivate* priv = getPrivate(dialog);
+ gtk_widget_queue_draw(priv->pDialogDrawingArea);
+}
+
GtkWidget*
gtv_lok_dialog_new(LOKDocView* pDocView, const gchar* dialogId)
{
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx
index 650d816e7e4a..0205f2ede3f4 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx
@@ -37,6 +37,8 @@ GType gtv_lok_dialog_get_type (void) G_GNUC_CONST;
GtkWidget* gtv_lok_dialog_new(LOKDocView* pDocView, const gchar* dialogId);
+void gtv_lok_dialog_invalidate(GtvLokDialog* dialog);
+
G_END_DECLS
#endif /* GTV_LOK_DIALOG_H */
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx
index 33f705262808..a549d852c786 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx
@@ -15,6 +15,7 @@
#include <gtv-calc-header-bar.hxx>
#include <gtv-comments-sidebar.hxx>
#include <gtv-lokdocview-signal-handlers.hxx>
+#include <gtv-lok-dialog.hxx>
#include <boost/property_tree/json_parser.hpp>
#include <boost/optional.hpp>
@@ -280,6 +281,16 @@ void LOKDocViewSigHandlers::comment(LOKDocView* pDocView, gchar* pComment, gpoin
}
}
+void LOKDocViewSigHandlers::dialogInvalidate(LOKDocView* pDocView, gchar* pDialogId, gpointer)
+{
+ GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pDocView)));
+ GtkWindow* pDialog = gtv_application_window_get_child_window_by_id(window, pDialogId);
+ if (pDialog)
+ {
+ gtv_lok_dialog_invalidate(GTV_LOK_DIALOG(pDialog));
+ }
+}
+
gboolean LOKDocViewSigHandlers::configureEvent(GtkWidget* pWidget, GdkEventConfigure* /*pEvent*/, gpointer /*pData*/)
{
GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pWidget)));
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx
index 724f2031d4f5..73bf9c2860ad 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx
@@ -25,6 +25,7 @@ namespace LOKDocViewSigHandlers {
void formulaChanged(LOKDocView* pDocView, char* pPayload, gpointer);
void passwordRequired(LOKDocView* pDocView, char* pUrl, gboolean bModify, gpointer);
void comment(LOKDocView* pDocView, gchar* pComment, gpointer);
+ void dialogInvalidate(LOKDocView* pDocView, gchar* pDialogId, gpointer);
gboolean configureEvent(GtkWidget* pWidget, GdkEventConfigure* pEvent, gpointer pData);
}
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx b/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx
index e009fe215ce7..b871d93667f9 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx
@@ -290,11 +290,21 @@ void changePartMode( GtkWidget* pSelector, gpointer /* pItem */ )
}
}
+static gboolean deleteLokDialog(GtkWidget* pWidget, GdkEvent* /*event*/, gpointer userdata)
+{
+ GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(userdata);
+ gtv_application_window_unregister_child_window(window, GTK_WINDOW(pWidget));
+
+ return FALSE;
+}
+
void openLokDialog( GtkWidget* pSelector, gpointer /*pItem*/ )
{
GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(pSelector));
gchar* pDialogId = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(pSelector));
GtkWidget* pDialog = gtv_lok_dialog_new(LOK_DOC_VIEW(window->lokdocview), pDialogId);
+ gtv_application_window_register_child_window(window, GTK_WINDOW(pDialog));
+ g_signal_connect(pDialog, "delete-event", G_CALLBACK(deleteLokDialog), window);
g_free(pDialogId);
gtk_window_set_resizable(GTK_WINDOW(pDialog), false);
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index 4700cffadab6..9dd83bf518f5 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -279,6 +279,7 @@ enum
PASSWORD_REQUIRED,
COMMENT,
RULER,
+ DIALOG_INVALIDATE,
LAST_SIGNAL
};
@@ -1430,7 +1431,7 @@ callback (gpointer pData)
case LOK_CALLBACK_RULER_UPDATE:
g_signal_emit(pCallback->m_pDocView, doc_view_signals[RULER], 0, pCallback->m_aPayload.c_str());
case LOK_CALLBACK_DIALOG_INVALIDATE:
- // TODO: Register the signal with lokdocview and emit it
+ g_signal_emit(pCallback->m_pDocView, doc_view_signals[DIALOG_INVALIDATE], 0, pCallback->m_aPayload.c_str());
break;
default:
g_assert(false);
@@ -3228,6 +3229,21 @@ static void lok_doc_view_class_init (LOKDocViewClass* pClass)
g_cclosure_marshal_generic,
G_TYPE_NONE, 1,
G_TYPE_STRING);
+
+ /**
+ * LOKDocView::dialog-invalidate:
+ * @pDocView: the #LOKDocView on which the signal is emitted
+ * @pDialogId: The uno command for the dialog (dialog ID)
+ */
+ doc_view_signals[DIALOG_INVALIDATE] =
+ g_signal_new("dialog-invalidate",
+ G_TYPE_FROM_CLASS(pGObjectClass),
+ G_SIGNAL_RUN_FIRST,
+ 0,
+ nullptr, nullptr,
+ g_cclosure_marshal_generic,
+ G_TYPE_NONE, 1,
+ G_TYPE_STRING);
}
SAL_DLLPUBLIC_EXPORT GtkWidget*