[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-5.3' - 14 commits - desktop/source include/LibreOfficeKit include/sfx2 include/vcl libreofficekit/qa libreofficekit/source sc/source sfx2/source vcl/source
Pranav Kant
pranavk at collabora.co.uk
Tue Dec 5 11:12:27 UTC 2017
desktop/source/lib/init.cxx | 110 +-----
include/LibreOfficeKit/LibreOfficeKit.h | 32 -
include/LibreOfficeKit/LibreOfficeKit.hxx | 58 ---
include/LibreOfficeKit/LibreOfficeKitEnums.h | 27 -
include/sfx2/lokhelper.hxx | 7
include/sfx2/viewsh.hxx | 1
include/vcl/IDialogRenderable.hxx | 2
include/vcl/dialog.hxx | 5
include/vcl/floatwin.hxx | 2
include/vcl/window.hxx | 9
libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx | 60 +--
libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx | 4
libreofficekit/qa/gtktiledviewer/gtv-helpers.cxx | 19 -
libreofficekit/qa/gtktiledviewer/gtv-helpers.hxx | 23 +
libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx | 179 +++++-----
libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx | 6
libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx | 111 ++----
libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx | 3
libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.cxx | 60 +++
libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.hxx | 8
libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx | 34 +
libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.hxx | 2
libreofficekit/qa/gtktiledviewer/gtv.ui | 49 ++
libreofficekit/source/gtk/lokdocview.cxx | 55 ---
sc/source/ui/view/gridwin.cxx | 3
sfx2/source/appl/workwin.cxx | 7
sfx2/source/dialog/basedlgs.cxx | 12
sfx2/source/dialog/tabdlg.cxx | 3
sfx2/source/view/lokhelper.cxx | 26 -
sfx2/source/view/viewsh.cxx | 7
vcl/source/control/ctrl.cxx | 22 -
vcl/source/window/dialog.cxx | 23 -
vcl/source/window/floatwin.cxx | 49 +-
vcl/source/window/window.cxx | 83 ----
34 files changed, 507 insertions(+), 594 deletions(-)
New commits:
commit bcff1e08212f60d7bd38f357636cf6e12d006932
Author: Pranav Kant <pranavk at collabora.co.uk>
Date: Tue Dec 5 02:20:13 2017 +0530
lokdialog: Don't hide dialogs in case of LOK
We change views (using setView) a lot in case of LOK. Changing the view,
without this patch, leads to InitShow on the dialog which means
invalidation of the whole dialog even though there is nothing to
invalidate. This decreases performance as it increases the dialog paint
traffic through the LOK API. We don't need to hide the dialog once it's
opened in case of LOK.
This patch improves the multiview dialog performance considerably
(can easily be noticed in GTV).
Change-Id: If2b4ceb945ccd86da3d90bbbb0a0b9fbade43f30
diff --git a/sfx2/source/appl/workwin.cxx b/sfx2/source/appl/workwin.cxx
index a030bb88e6bb..38e99da09612 100644
--- a/sfx2/source/appl/workwin.cxx
+++ b/sfx2/source/appl/workwin.cxx
@@ -18,6 +18,7 @@
*/
#include <config_features.h>
+#include <comphelper/lok.hxx>
#include <comphelper/processfactory.hxx>
#include "workwin.hrc"
@@ -1499,6 +1500,9 @@ bool SfxWorkWindow::IsVisible_Impl()
void SfxWorkWindow::HidePopups_Impl(bool bHide, bool bParent, sal_uInt16 nId )
{
+ if (comphelper::LibreOfficeKit::isActive() && bHide)
+ return;
+
for (SfxChildWin_Impl* i : aChildWins)
{
SfxChildWindow *pCW = i->pWin;
@@ -1511,7 +1515,8 @@ void SfxWorkWindow::HidePopups_Impl(bool bHide, bool bParent, sal_uInt16 nId )
pChild->nVisible &= ~SfxChildVisibility::ACTIVE;
pCW->Hide();
}
- else
+ else if ( !comphelper::LibreOfficeKit::isActive() ||
+ SfxChildVisibility::ACTIVE != (pChild->nVisible & SfxChildVisibility::ACTIVE) )
{
pChild->nVisible |= SfxChildVisibility::ACTIVE;
if ( SfxChildVisibility::VISIBLE == (pChild->nVisible & SfxChildVisibility::VISIBLE) )
commit c24bfdbff68f52d65ca56cc4ff7d8377898180d7
Author: Pranav Kant <pranavk at collabora.co.uk>
Date: Tue Dec 5 01:24:21 2017 +0530
lokdialog: InitShow can happen multiple times
Change-Id: I120a49f8a3fa96eb93d6de6de1d0715134520678
diff --git a/sfx2/source/dialog/basedlgs.cxx b/sfx2/source/dialog/basedlgs.cxx
index c7755d3b8ff1..bc0968f67f67 100644
--- a/sfx2/source/dialog/basedlgs.cxx
+++ b/sfx2/source/dialog/basedlgs.cxx
@@ -180,7 +180,7 @@ void SfxModalDialog::dispose()
short SfxModalDialog::Execute()
{
SfxViewShell* pViewShell = SfxViewShell::Current();
- if (comphelper::LibreOfficeKit::isActive() && pViewShell)
+ if (comphelper::LibreOfficeKit::isActive() && pViewShell && !GetLOKNotifier())
{
SetLOKNotifier(pViewShell);
const Size aSize = GetOptimalSize();
@@ -273,7 +273,7 @@ void SfxModelessDialog::StateChanged( StateChangedType nStateChange )
}
SfxViewShell* pViewShell = SfxViewShell::Current();
- if (comphelper::LibreOfficeKit::isActive() && pViewShell)
+ if (comphelper::LibreOfficeKit::isActive() && pViewShell && !GetLOKNotifier())
{
SetLOKNotifier(pViewShell);
std::vector<vcl::LOKPayloadItem> aItems;
diff --git a/sfx2/source/dialog/tabdlg.cxx b/sfx2/source/dialog/tabdlg.cxx
index c9f1577f691b..db07a8ff380d 100644
--- a/sfx2/source/dialog/tabdlg.cxx
+++ b/sfx2/source/dialog/tabdlg.cxx
@@ -521,7 +521,7 @@ short SfxTabDialog::Execute()
Start_Impl();
SfxViewShell* pViewShell = SfxViewShell::Current();
- if (comphelper::LibreOfficeKit::isActive() && pViewShell)
+ if (comphelper::LibreOfficeKit::isActive() && pViewShell && !GetLOKNotifier())
{
SetLOKNotifier(pViewShell);
const Size aSize = GetOptimalSize();
commit 623437e30c002fbb8e00fc4ff02578c3b934fde4
Author: Jan Holesovsky <kendy at collabora.com>
Date: Mon Dec 4 17:55:21 2017 +0100
lokdialog: Window* -> VclPtr<Window>, and a small simplification.
Change-Id: I853e2d6ec2e55c78894a9942aa201763a57fe195
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index c17c8ab3b108..b4323c185e93 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -1208,13 +1208,15 @@ public:
void SetLOKNotifier(const vcl::ILibreOfficeKitNotifier* pNotifier);
const vcl::ILibreOfficeKitNotifier* GetLOKNotifier() const;
vcl::LOKWindowId GetLOKWindowId() const;
- vcl::Window* GetParentWithLOKNotifier();
+
+ /// Find the nearest parent with LOK Notifier; can be itself if this Window has LOK notifier set.
+ VclPtr<vcl::Window> GetParentWithLOKNotifier();
/// Indicate that LOK is not going to use this dialog any more.
void ReleaseLOKNotifier();
/// Find an existing Window based on the LOKWindowId.
- static VclPtr<Window> FindLOKWindow(vcl::LOKWindowId nWindowId);
+ static VclPtr<vcl::Window> FindLOKWindow(vcl::LOKWindowId nWindowId);
/// Dialog / window tunneling related methods.
Size PaintActiveFloatingWindow(VirtualDevice& rDevice) const;
diff --git a/vcl/source/control/ctrl.cxx b/vcl/source/control/ctrl.cxx
index 9b5b16a7509a..b2adcb1d7ccf 100644
--- a/vcl/source/control/ctrl.cxx
+++ b/vcl/source/control/ctrl.cxx
@@ -425,7 +425,7 @@ void Control::LogicInvalidate(const Rectangle* /*pRectangle*/)
// ignore all of those
if (comphelper::LibreOfficeKit::isActive() && !comphelper::LibreOfficeKit::isDialogPainting())
{
- if (vcl::Window* pParent = GetParentWithLOKNotifier())
+ if (VclPtr<vcl::Window> pParent = GetParentWithLOKNotifier())
{
// invalidate the complete floating window for now
if (pParent->ImplIsFloatingWindow())
diff --git a/vcl/source/window/floatwin.cxx b/vcl/source/window/floatwin.cxx
index 4c2eae984c54..676c3f0dbb06 100644
--- a/vcl/source/window/floatwin.cxx
+++ b/vcl/source/window/floatwin.cxx
@@ -597,7 +597,7 @@ bool FloatingWindow::Notify( NotifyEvent& rNEvt )
void FloatingWindow::LogicInvalidate(const Rectangle* /*pRectangle*/)
{
- if (vcl::Window* pParent = GetParentWithLOKNotifier())
+ if (VclPtr<vcl::Window> pParent = GetParentWithLOKNotifier())
{
const vcl::ILibreOfficeKitNotifier* pNotifier = pParent->GetLOKNotifier();
pNotifier->notifyWindow(GetLOKWindowId(), "invalidate");
@@ -613,7 +613,7 @@ void FloatingWindow::StateChanged( StateChangedType nType )
SystemWindow::StateChanged( nType );
- if (vcl::Window* pParent = GetParentWithLOKNotifier())
+ if (VclPtr<vcl::Window> pParent = GetParentWithLOKNotifier())
{
const vcl::ILibreOfficeKitNotifier* pNotifier = pParent->GetLOKNotifier();
if (nType == StateChangedType::InitShow && IsVisible())
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 0bc0fe7bd33b..962c90904c43 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -3240,19 +3240,14 @@ vcl::LOKWindowId Window::GetLOKWindowId() const
return mpWindowImpl->mnLOKWindowId;
}
-vcl::Window* Window::GetParentWithLOKNotifier()
+VclPtr<vcl::Window> Window::GetParentWithLOKNotifier()
{
- vcl::Window* pWindow = this;
- bool found = false;
- while (pWindow && !found)
- {
- if (pWindow->GetLOKNotifier())
- found = true;
- else
- pWindow = pWindow->GetParent();
- }
+ VclPtr<vcl::Window> pWindow(this);
+
+ while (pWindow && !pWindow->GetLOKNotifier())
+ pWindow = pWindow->GetParent();
- return found ? pWindow : nullptr;
+ return pWindow;
}
void Window::LogicMouseButtonDown(const MouseEvent& rMouseEvent)
commit 6e0edb50a1eb786dbb4f0339b2a879aa248cb979
Author: Jan Holesovsky <kendy at collabora.com>
Date: Mon Dec 4 17:30:45 2017 +0100
lokdialog: Make the Autofilter popup work in Calc.
For the moment we treat it as a 'dialog', but maybe we'll need a separate
window type for this later.
Change-Id: I21bff0b50b5f3e9f51d323600f7ba6d37c16bc9b
diff --git a/vcl/source/window/floatwin.cxx b/vcl/source/window/floatwin.cxx
index ce289a804e50..4c2eae984c54 100644
--- a/vcl/source/window/floatwin.cxx
+++ b/vcl/source/window/floatwin.cxx
@@ -621,8 +621,18 @@ void FloatingWindow::StateChanged( StateChangedType nType )
SetLOKNotifier(pNotifier);
std::vector<vcl::LOKPayloadItem> aItems;
- aItems.emplace_back(std::make_pair("type", "child"));
- aItems.emplace_back(std::make_pair("parentId", OString::number(pParent->GetLOKWindowId())));
+ if (pParent == this)
+ {
+ // we are a toplevel window, let's so far pretend to be a
+ // dialog - but maybe we'll need a separate type for this
+ // later
+ aItems.emplace_back(std::make_pair("type", "dialog"));
+ }
+ else
+ {
+ aItems.emplace_back(std::make_pair("type", "child"));
+ aItems.emplace_back(std::make_pair("parentId", OString::number(pParent->GetLOKWindowId())));
+ }
aItems.emplace_back(std::make_pair("size", GetSizePixel().toString()));
aItems.emplace_back(std::make_pair("position", mpImplData->maPos.toString()));
pNotifier->notifyWindow(GetLOKWindowId(), "created", aItems);
commit d7a900e7998a3412306b439876e8edd2cdbffb3b
Author: Pranav Kant <pranavk at collabora.co.uk>
Date: Mon Dec 4 13:58:44 2017 +0530
lokdialog: sc: Guard autofilter popup's LOK notification
Change-Id: I8d39a701618926e35c84f200ac7e2ce66e62b8b7
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index bfea6b18804c..d285f6c05287 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -681,7 +681,8 @@ void ScGridWindow::LaunchAutoFilterMenu(SCCOL nCol, SCROW nRow)
mpAutoFilterPopup.disposeAndClear();
mpAutoFilterPopup.reset(VclPtr<ScCheckListMenuWindow>::Create(this, pDoc));
- mpAutoFilterPopup->SetLOKNotifier(SfxViewShell::Current());
+ if (comphelper::LibreOfficeKit::isActive())
+ mpAutoFilterPopup->SetLOKNotifier(SfxViewShell::Current());
mpAutoFilterPopup->setOKAction(new AutoFilterAction(this, Normal));
mpAutoFilterPopup->setPopupEndAction(
new AutoFilterPopupEndAction(this, ScAddress(nCol, nRow, nTab)));
commit e31af027faf462c94cf7341ccda979a263a9f834
Author: Pranav Kant <pranavk at collabora.co.uk>
Date: Sat Dec 2 02:47:38 2017 +0530
lokdialog: multiview: Do not mix one view with other
In GTV, use correct application window object to fetch the dialog
object.
Use correct view shell to notify window (dialogs, etc.) callbacks.
Change-Id: I7d82b39d4522a4b4904e156757a032c342c71efb
diff --git a/include/sfx2/lokhelper.hxx b/include/sfx2/lokhelper.hxx
index eff40dd2f4ee..b7600f015163 100644
--- a/include/sfx2/lokhelper.hxx
+++ b/include/sfx2/lokhelper.hxx
@@ -42,7 +42,8 @@ public:
/// Same as notifyOtherViews(), but works on a selected "other" view, not on all of them.
static void notifyOtherView(SfxViewShell* pThisView, SfxViewShell* pOtherView, int nType, const OString& rKey, const OString& rPayload);
/// Emits a LOK_CALLBACK_WINDOW
- static void notifyWindow(vcl::LOKWindowId nWindowId,
+ static void notifyWindow(const SfxViewShell* pThisView,
+ vcl::LOKWindowId nWindowId,
const OUString& rAction,
const std::vector<vcl::LOKPayloadItem>& rPayload = std::vector<vcl::LOKPayloadItem>());
/// Emits a LOK_CALLBACK_INVALIDATE_TILES, but tweaks it according to setOptionalFeatures() if needed.
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx b/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx
index efe9b3da7061..d67b6afd61d3 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx
@@ -315,7 +315,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, "window", G_CALLBACK(LOKDocViewSigHandlers::window), nullptr);
+ g_signal_connect(window->lokdocview, "window", G_CALLBACK(LOKDocViewSigHandlers::window), window);
g_signal_connect(window->lokdocview, "configure-event", G_CALLBACK(LOKDocViewSigHandlers::configureEvent), nullptr);
}
@@ -402,6 +402,9 @@ gtv_application_window_get_part_broadcast(GtvApplicationWindow* window)
void
gtv_application_window_register_child_window(GtvApplicationWindow* window, GtkWindow* pChildWin)
{
+ guint dialogid = 0;
+ g_object_get(G_OBJECT(pChildWin), "dialogid", &dialogid, nullptr);
+ g_debug("Register child window: dialogid [%d] in window[%p]", dialogid, window);
GtvApplicationWindowPrivate* priv = getPrivate(window);
if (pChildWin)
priv->m_pChildWindows = g_list_append(priv->m_pChildWindows, pChildWin);
@@ -410,6 +413,9 @@ gtv_application_window_register_child_window(GtvApplicationWindow* window, GtkWi
void
gtv_application_window_unregister_child_window(GtvApplicationWindow* window, GtkWindow* pChildWin)
{
+ guint dialogid = 0;
+ g_object_get(G_OBJECT(pChildWin), "dialogid", &dialogid, nullptr);
+ g_debug("Unregister child window: dialogid [%d] in window[%p]", dialogid, window);
GtvApplicationWindowPrivate* priv = getPrivate(window);
if (pChildWin)
{
@@ -432,7 +438,6 @@ gtv_application_window_get_child_window_by_id(GtvApplicationWindow* window, guin
{
guint dialogId = 0;
g_object_get(G_OBJECT(pIt->data), "dialogid", &dialogId, nullptr);
-
if (dialogId == nWinId)
{
ret = GTK_WINDOW(pIt->data);
@@ -443,7 +448,8 @@ gtv_application_window_get_child_window_by_id(GtvApplicationWindow* window, guin
return ret;
}
-GtkWidget* gtv_application_window_get_parent(GtvApplicationWindow* window, guint nWinId)
+GtkWidget*
+gtv_application_window_get_parent(GtvApplicationWindow* window, guint nWinId)
{
GtvApplicationWindowPrivate* priv = getPrivate(window);
GList* pIt = nullptr;
@@ -455,17 +461,6 @@ GtkWidget* gtv_application_window_get_parent(GtvApplicationWindow* window, guint
return nullptr;
}
-
-// temporary function to invalidate all opened dialogs
-// because currently the dialog id returned in dialog invalidation payload
-// doesn't match our hard-coded list of dialog ids (uno commands) for some dialogs
-GList*
-gtv_application_window_get_all_child_windows(GtvApplicationWindow* window)
-{
- GtvApplicationWindowPrivate* priv = getPrivate(window);
- return priv->m_pChildWindows;
-}
-
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 b6aac5466133..01fd01837dd7 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx
@@ -105,8 +105,6 @@ void gtv_application_window_unregister_child_window(GtvApplicationWindow* window
GtkWindow* gtv_application_window_get_child_window_by_id(GtvApplicationWindow* window, guint nWinId);
-GList* gtv_application_window_get_all_child_windows(GtvApplicationWindow* window);
-
GtkWidget* gtv_application_window_get_parent(GtvApplicationWindow* window, guint nWinId);
G_END_DECLS
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx
index 8d3a116df97e..75d511c53f94 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx
@@ -301,9 +301,9 @@ void LOKDocViewSigHandlers::comment(LOKDocView* pDocView, gchar* pComment, gpoin
}
}
-void LOKDocViewSigHandlers::window(LOKDocView* pDocView, gchar* pPayload, gpointer)
+void LOKDocViewSigHandlers::window(LOKDocView* pDocView, gchar* pPayload, gpointer pData)
{
- GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pDocView)));
+ GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(pData);
std::stringstream aStream(pPayload);
boost::property_tree::ptree aRoot;
@@ -350,9 +350,8 @@ void LOKDocViewSigHandlers::window(LOKDocView* pDocView, gchar* pPayload, gpoint
else if (aAction == "close")
gtv_lok_dialog_child_close(GTV_LOK_DIALOG(pParent));
}
- else // it's the dialog window itself
- {
- GtkWindow* pDialog = gtv_application_window_get_child_window_by_id(window, nWinId);
+ else if (GtkWindow* pDialog = gtv_application_window_get_child_window_by_id(window, nWinId))
+ { // it's the dialog window itself
if (aAction == "close")
gtk_widget_destroy(GTK_WIDGET(pDialog));
else if (aAction == "size_changed")
diff --git a/sfx2/source/dialog/basedlgs.cxx b/sfx2/source/dialog/basedlgs.cxx
index 0fd2abc9ba8e..c7755d3b8ff1 100644
--- a/sfx2/source/dialog/basedlgs.cxx
+++ b/sfx2/source/dialog/basedlgs.cxx
@@ -276,12 +276,9 @@ void SfxModelessDialog::StateChanged( StateChangedType nStateChange )
if (comphelper::LibreOfficeKit::isActive() && pViewShell)
{
SetLOKNotifier(pViewShell);
- // Below method doesn't really give the exact dimensions,
- // Check GetSizePixel() ?
- const Size aOptimalSize = GetOptimalSize();
std::vector<vcl::LOKPayloadItem> aItems;
aItems.emplace_back(std::make_pair("type", "dialog"));
- aItems.emplace_back(std::make_pair("size", aOptimalSize.toString()));
+ aItems.emplace_back(std::make_pair("size", GetOptimalSize().toString()));
pViewShell->notifyWindow(GetLOKWindowId(), "created", aItems);
}
diff --git a/sfx2/source/view/lokhelper.cxx b/sfx2/source/view/lokhelper.cxx
index d28e5a835dd6..73e7a170412c 100644
--- a/sfx2/source/view/lokhelper.cxx
+++ b/sfx2/source/view/lokhelper.cxx
@@ -132,10 +132,13 @@ void SfxLokHelper::notifyOtherViews(SfxViewShell* pThisView, int nType, const OS
}
}
-void SfxLokHelper::notifyWindow(vcl::LOKWindowId nLOKWindowId,
+void SfxLokHelper::notifyWindow(const SfxViewShell* pThisView,
+ vcl::LOKWindowId nLOKWindowId,
const OUString& rAction,
const std::vector<vcl::LOKPayloadItem>& rPayload)
{
+ assert(pThisView);
+
if (SfxLokHelper::getViewsCount() <= 0 || nLOKWindowId == 0)
return;
@@ -152,8 +155,7 @@ void SfxLokHelper::notifyWindow(vcl::LOKWindowId nLOKWindowId,
}
aPayload += "}";
- if (SfxViewShell* pViewShell = SfxViewShell::Current())
- pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_WINDOW, aPayload.getStr());
+ pThisView->libreOfficeKitViewCallback(LOK_CALLBACK_WINDOW, aPayload.getStr());
}
void SfxLokHelper::notifyInvalidation(SfxViewShell* pThisView, const OString& rPayload)
diff --git a/sfx2/source/view/viewsh.cxx b/sfx2/source/view/viewsh.cxx
index 23b3237e4c83..1dcc439f291c 100644
--- a/sfx2/source/view/viewsh.cxx
+++ b/sfx2/source/view/viewsh.cxx
@@ -2038,7 +2038,7 @@ Reference< view::XRenderable > SfxViewShell::GetRenderable()
void SfxViewShell::notifyWindow(vcl::LOKWindowId nDialogId, const OUString& rAction, const std::vector<vcl::LOKPayloadItem>& rPayload) const
{
- SfxLokHelper::notifyWindow(nDialogId, rAction, rPayload);
+ SfxLokHelper::notifyWindow(this, nDialogId, rAction, rPayload);
}
uno::Reference< datatransfer::clipboard::XClipboardNotifier > SfxViewShell::GetClipboardNotifier()
commit 98973b61b124ae20905985e2c9707c7036bd0e26
Author: Pranav Kant <pranavk at collabora.co.uk>
Date: Fri Dec 1 14:27:21 2017 +0530
lokdialog: Merge dialog & dialog child mouse event APIs into one
Change-Id: I91aaa6a58f33dd2d817e02533de96e0c8191f2ca
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 849b2e516b53..76748a87a317 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -576,7 +576,7 @@ static void doc_postMouseEvent (LibreOfficeKitDocument* pThis,
int nCount,
int nButtons,
int nModifier);
-static void doc_postDialogMouseEvent (LibreOfficeKitDocument* pThis,
+static void doc_postWindowMouseEvent (LibreOfficeKitDocument* pThis,
unsigned nLOKWindowId,
int nType,
int nX,
@@ -584,14 +584,6 @@ static void doc_postDialogMouseEvent (LibreOfficeKitDocument* pThis,
int nCount,
int nButtons,
int nModifier);
-static void doc_postDialogChildMouseEvent (LibreOfficeKitDocument* pThis,
- unsigned nLOKWindowId,
- int nType,
- int nX,
- int nY,
- int nCount,
- int nButtons,
- int nModifier);
static void doc_postUnoCommand(LibreOfficeKitDocument* pThis,
const char* pCommand,
const char* pArguments,
@@ -666,8 +658,7 @@ LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XCompone
m_pDocumentClass->postKeyEvent = doc_postKeyEvent;
m_pDocumentClass->postWindowKeyEvent = doc_postWindowKeyEvent;
m_pDocumentClass->postMouseEvent = doc_postMouseEvent;
- m_pDocumentClass->postDialogMouseEvent = doc_postDialogMouseEvent;
- m_pDocumentClass->postDialogChildMouseEvent = doc_postDialogChildMouseEvent;
+ m_pDocumentClass->postWindowMouseEvent = doc_postWindowMouseEvent;
m_pDocumentClass->postUnoCommand = doc_postUnoCommand;
m_pDocumentClass->setTextSelection = doc_setTextSelection;
m_pDocumentClass->getTextSelection = doc_getTextSelection;
@@ -2456,7 +2447,7 @@ static void doc_postMouseEvent(LibreOfficeKitDocument* pThis, int nType, int nX,
}
}
-static void doc_postDialogMouseEvent(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWindowId, int nType, int nX, int nY, int nCount, int nButtons, int nModifier)
+static void doc_postWindowMouseEvent(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWindowId, int nType, int nX, int nY, int nCount, int nButtons, int nModifier)
{
SolarMutexGuard aGuard;
@@ -2487,37 +2478,6 @@ static void doc_postDialogMouseEvent(LibreOfficeKitDocument* /*pThis*/, unsigned
}
}
-static void doc_postDialogChildMouseEvent(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWindowId, int nType, int nX, int nY, int nCount, int nButtons, int nModifier)
-{
- SolarMutexGuard aGuard;
-
- VclPtr<Window> pWindow = vcl::Window::FindLOKWindow(nLOKWindowId);
- if (!pWindow)
- {
- gImpl->maLastExceptionMsg = "Document doesn't support dialog rendering, or window not found.";
- return;
- }
-
- Point aPos(nX, nY);
- MouseEvent aEvent(aPos, nCount, MouseEventModifiers::SIMPLECLICK, nButtons, nModifier);
-
- switch (nType)
- {
- case LOK_MOUSEEVENT_MOUSEBUTTONDOWN:
- pWindow->LogicMouseButtonDownChild(aEvent);
- break;
- case LOK_MOUSEEVENT_MOUSEBUTTONUP:
- pWindow->LogicMouseButtonUpChild(aEvent);
- break;
- case LOK_MOUSEEVENT_MOUSEMOVE:
- pWindow->LogicMouseMoveChild(aEvent);
- break;
- default:
- assert(false);
- break;
- }
-}
-
static void doc_setTextSelection(LibreOfficeKitDocument* pThis, int nType, int nX, int nY)
{
SolarMutexGuard aGuard;
diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h
index 9af42a1e3e5c..69b20106314c 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.h
+++ b/include/LibreOfficeKit/LibreOfficeKit.h
@@ -259,7 +259,7 @@ struct _LibreOfficeKitDocumentClass
int* pArray,
size_t nSize);
- /// Paints dialog with given dialog id to the buffer
+ /// Paints window with given id to the buffer
/// @see lok::Document::paintWindow().
void (*paintWindow) (LibreOfficeKitDocument* pThis, unsigned nWindowId,
unsigned char* pBuffer,
@@ -271,14 +271,14 @@ struct _LibreOfficeKitDocumentClass
/// @see lok::Document::postWindowKeyEvent().
void (*postWindowKeyEvent) (LibreOfficeKitDocument* pThis,
- unsigned nDialogId,
+ unsigned nWindowId,
int nType,
int nCharCode,
int nKeyCode);
- /// @see lok::Document::postDialogMouseEvent().
- void (*postDialogMouseEvent) (LibreOfficeKitDocument* pThis,
- unsigned nDialogId,
+ /// @see lok::Document::postWindowMouseEvent().
+ void (*postWindowMouseEvent) (LibreOfficeKitDocument* pThis,
+ unsigned nWindowId,
int nType,
int nX,
int nY,
@@ -286,16 +286,6 @@ struct _LibreOfficeKitDocumentClass
int nButtons,
int nModifier);
- /// @see lok::Document::postDialogChildMouseEvent().
- void (*postDialogChildMouseEvent) (LibreOfficeKitDocument* pThis,
- unsigned nDialogId,
- int nType,
- int nX,
- int nY,
- int nCount,
- int nButtons,
- int nModifier);
-
#endif // defined LOK_USE_UNSTABLE_API || defined LIBO_INTERNAL_ONLY
};
diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx
index 4f3d4751b46c..7bdd2c470092 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.hxx
+++ b/include/LibreOfficeKit/LibreOfficeKit.hxx
@@ -253,14 +253,14 @@ public:
/**
* Posts a keyboard event to the dialog
*
- * @param nDialogId Dialog id on which key event should be posted
+ * @param nWindowId
* @param nType Event type, like press or release.
* @param nCharCode contains the Unicode character generated by this event or 0
* @param nKeyCode contains the integer code representing the key of the event (non-zero for control keys)
*/
- void postWindowKeyEvent(unsigned nDialogId, int nType, int nCharCode, int nKeyCode)
+ void postWindowKeyEvent(unsigned nWindowId, int nType, int nCharCode, int nKeyCode)
{
- mpDoc->pClass->postWindowKeyEvent(mpDoc, nDialogId, nType, nCharCode, nKeyCode);
+ mpDoc->pClass->postWindowKeyEvent(mpDoc, nWindowId, nType, nCharCode, nKeyCode);
}
/**
@@ -279,25 +279,9 @@ public:
}
/**
- * Posts a mouse event to the dialog with given id.
+ * Posts a mouse event to the window with given id.
*
- * @param nDialogId Dialog id where mouse event is to be posted
- * @param nType Event type, like down, move or up.
- * @param nX horizontal position in document coordinates
- * @param nY vertical position in document coordinates
- * @param nCount number of clicks: 1 for single click, 2 for double click
- * @param nButtons: which mouse buttons: 1 for left, 2 for middle, 4 right
- * @param nModifier: which keyboard modifier: (see include/vcl/vclenum.hxx for possible values)
- */
- void postDialogMouseEvent(unsigned nDialogId, int nType, int nX, int nY, int nCount, int nButtons, int nModifier)
- {
- mpDoc->pClass->postDialogMouseEvent(mpDoc, nDialogId, nType, nX, nY, nCount, nButtons, nModifier);
- }
-
- /**
- * Posts a mouse event to the child of a dialog with given id.
- *
- * @param nDialogId Dialog id
+ * @param nWindowId
* @param nType Event type, like down, move or up.
* @param nX horizontal position in document coordinates
* @param nY vertical position in document coordinates
@@ -305,12 +289,11 @@ public:
* @param nButtons: which mouse buttons: 1 for left, 2 for middle, 4 right
* @param nModifier: which keyboard modifier: (see include/vcl/vclenum.hxx for possible values)
*/
- void postDialogChildMouseEvent(unsigned nDialogId, int nType, int nX, int nY, int nCount, int nButtons, int nModifier)
+ void postWindowMouseEvent(unsigned nWindowId, int nType, int nX, int nY, int nCount, int nButtons, int nModifier)
{
- mpDoc->pClass->postDialogChildMouseEvent(mpDoc, nDialogId, nType, nX, nY, nCount, nButtons, nModifier);
+ mpDoc->pClass->postWindowMouseEvent(mpDoc, nWindowId, nType, nX, nY, nCount, nButtons, nModifier);
}
-
/**
* Posts an UNO command to the document.
*
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index 9b52a4da7810..c17c8ab3b108 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -1222,9 +1222,6 @@ public:
void LogicMouseButtonDown(const MouseEvent& rMouseEvent);
void LogicMouseButtonUp(const MouseEvent& rMouseEvent);
void LogicMouseMove(const MouseEvent& rMouseEvent);
- void LogicMouseButtonDownChild(const MouseEvent& rMouseEvent);
- void LogicMouseButtonUpChild(const MouseEvent& rMouseEvent);
- void LogicMouseMoveChild(const MouseEvent& rMouseEvent);
void LOKKeyInput(const KeyEvent& rKeyEvent);
void LOKKeyUp(const KeyEvent& rKeyEvent);
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx
index b5d97805f9bc..5770e1349305 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx
@@ -162,7 +162,7 @@ gtv_lok_dialog_signal_button(GtkWidget* pDialogDrawingArea, GdkEventButton* pEve
break;
}
priv->m_nLastButtonPressed = nEventButton;
- pDocument->pClass->postDialogMouseEvent(pDocument,
+ pDocument->pClass->postWindowMouseEvent(pDocument,
priv->dialogid,
LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
(pEvent->x),
@@ -193,7 +193,7 @@ gtv_lok_dialog_signal_button(GtkWidget* pDialogDrawingArea, GdkEventButton* pEve
break;
}
priv->m_nLastButtonPressed = nEventButton;
- pDocument->pClass->postDialogMouseEvent(pDocument,
+ pDocument->pClass->postWindowMouseEvent(pDocument,
priv->dialogid,
LOK_MOUSEEVENT_MOUSEBUTTONUP,
(pEvent->x),
@@ -223,7 +223,7 @@ gtv_lok_dialog_signal_motion(GtkWidget* pDialogDrawingArea, GdkEventButton* pEve
(int)pixelToTwip(pEvent->x),
(int)pixelToTwip(pEvent->y));
- pDocument->pClass->postDialogMouseEvent(pDocument,
+ pDocument->pClass->postWindowMouseEvent(pDocument,
priv->dialogid,
LOK_MOUSEEVENT_MOUSEMOVE,
(pEvent->x),
@@ -541,14 +541,14 @@ gtv_lok_dialog_floating_win_signal_button(GtkWidget* /*pDialogChildDrawingArea*/
break;
}
priv->m_nChildLastButtonPressed = nEventButton;
- pDocument->pClass->postDialogChildMouseEvent(pDocument,
- priv->m_nChildId,
- LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
- (pEvent->x),
- (pEvent->y),
- nCount,
- nEventButton,
- priv->m_nChildKeyModifier);
+ pDocument->pClass->postWindowMouseEvent(pDocument,
+ priv->m_nChildId,
+ LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
+ (pEvent->x),
+ (pEvent->y),
+ nCount,
+ nEventButton,
+ priv->m_nChildKeyModifier);
break;
}
@@ -572,14 +572,14 @@ gtv_lok_dialog_floating_win_signal_button(GtkWidget* /*pDialogChildDrawingArea*/
break;
}
priv->m_nChildLastButtonPressed = nEventButton;
- pDocument->pClass->postDialogChildMouseEvent(pDocument,
- priv->m_nChildId,
- LOK_MOUSEEVENT_MOUSEBUTTONUP,
- (pEvent->x),
- (pEvent->y),
- nCount,
- nEventButton,
- priv->m_nChildKeyModifier);
+ pDocument->pClass->postWindowMouseEvent(pDocument,
+ priv->m_nChildId,
+ LOK_MOUSEEVENT_MOUSEBUTTONUP,
+ (pEvent->x),
+ (pEvent->y),
+ nCount,
+ nEventButton,
+ priv->m_nChildKeyModifier);
break;
}
default:
@@ -602,14 +602,14 @@ gtv_lok_dialog_floating_win_signal_motion(GtkWidget* /*pDialogDrawingArea*/, Gdk
(int)pixelToTwip(pEvent->x),
(int)pixelToTwip(pEvent->y));
- pDocument->pClass->postDialogChildMouseEvent(pDocument,
- priv->m_nChildId,
- LOK_MOUSEEVENT_MOUSEMOVE,
- (pEvent->x),
- (pEvent->y),
- 1,
- priv->m_nChildLastButtonPressed,
- priv->m_nChildKeyModifier);
+ pDocument->pClass->postWindowMouseEvent(pDocument,
+ priv->m_nChildId,
+ LOK_MOUSEEVENT_MOUSEMOVE,
+ (pEvent->x),
+ (pEvent->y),
+ 1,
+ priv->m_nChildLastButtonPressed,
+ priv->m_nChildKeyModifier);
return FALSE;
}
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 36faa9a32f20..0bc0fe7bd33b 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -3260,7 +3260,10 @@ void Window::LogicMouseButtonDown(const MouseEvent& rMouseEvent)
// When we're not doing tiled rendering, then positions must be passed as pixels.
assert(comphelper::LibreOfficeKit::isActive());
- ImplWindowFrameProc(this, SalEvent::ExternalMouseButtonDown, &rMouseEvent);
+ if (dynamic_cast<FloatingWindow*>(this) != nullptr)
+ ImplWindowFrameProc(ImplGetBorderWindow(), SalEvent::ExternalMouseButtonDown, &rMouseEvent);
+ else
+ ImplWindowFrameProc(this, SalEvent::ExternalMouseButtonDown, &rMouseEvent);
}
void Window::LogicMouseButtonUp(const MouseEvent& rMouseEvent)
@@ -3268,7 +3271,10 @@ void Window::LogicMouseButtonUp(const MouseEvent& rMouseEvent)
// When we're not doing tiled rendering, then positions must be passed as pixels.
assert(comphelper::LibreOfficeKit::isActive());
- ImplWindowFrameProc(this, SalEvent::ExternalMouseButtonUp, &rMouseEvent);
+ if (dynamic_cast<FloatingWindow*>(this) != nullptr)
+ ImplWindowFrameProc(ImplGetBorderWindow(), SalEvent::ExternalMouseButtonUp, &rMouseEvent);
+ else
+ ImplWindowFrameProc(this, SalEvent::ExternalMouseButtonUp, &rMouseEvent);
}
void Window::LogicMouseMove(const MouseEvent& rMouseEvent)
@@ -3276,28 +3282,10 @@ void Window::LogicMouseMove(const MouseEvent& rMouseEvent)
// When we're not doing tiled rendering, then positions must be passed as pixels.
assert(comphelper::LibreOfficeKit::isActive());
- ImplWindowFrameProc(this, SalEvent::ExternalMouseMove, &rMouseEvent);
-}
-
-void Window::LogicMouseButtonDownChild(const MouseEvent& rMouseEvent)
-{
- assert(comphelper::LibreOfficeKit::isActive());
-
- ImplWindowFrameProc(ImplGetBorderWindow(), SalEvent::ExternalMouseButtonDown, &rMouseEvent);
-}
-
-void Window::LogicMouseButtonUpChild(const MouseEvent& rMouseEvent)
-{
- assert(comphelper::LibreOfficeKit::isActive());
-
- ImplWindowFrameProc(ImplGetBorderWindow(), SalEvent::ExternalMouseButtonUp, &rMouseEvent);
-}
-
-void Window::LogicMouseMoveChild(const MouseEvent& rMouseEvent)
-{
- assert(comphelper::LibreOfficeKit::isActive());
-
- ImplWindowFrameProc(ImplGetBorderWindow(), SalEvent::ExternalMouseMove, &rMouseEvent);
+ if (dynamic_cast<FloatingWindow*>(this) != nullptr)
+ ImplWindowFrameProc(ImplGetBorderWindow(), SalEvent::ExternalMouseMove, &rMouseEvent);
+ else
+ ImplWindowFrameProc(this, SalEvent::ExternalMouseMove, &rMouseEvent);
}
void Window::LOKKeyInput(const KeyEvent& rKeyEvent)
commit e7cc1b8c21d6161932220286b16968a831a652cb
Author: Pranav Kant <pranavk at collabora.co.uk>
Date: Fri Dec 1 14:19:30 2017 +0530
lokdialog: Rename postDialogKeyEvent -> postWindowKeyEvent
Change-Id: I78b434106fbef153adde255d4fcc8f74a7169175
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index ef2d45dce173..849b2e516b53 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -564,7 +564,7 @@ static void doc_postKeyEvent(LibreOfficeKitDocument* pThis,
int nType,
int nCharCode,
int nKeyCode);
-static void doc_postDialogKeyEvent(LibreOfficeKitDocument* pThis,
+static void doc_postWindowKeyEvent(LibreOfficeKitDocument* pThis,
unsigned nLOKWindowId,
int nType,
int nCharCode,
@@ -664,7 +664,7 @@ LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XCompone
m_pDocumentClass->initializeForRendering = doc_initializeForRendering;
m_pDocumentClass->registerCallback = doc_registerCallback;
m_pDocumentClass->postKeyEvent = doc_postKeyEvent;
- m_pDocumentClass->postDialogKeyEvent = doc_postDialogKeyEvent;
+ m_pDocumentClass->postWindowKeyEvent = doc_postWindowKeyEvent;
m_pDocumentClass->postMouseEvent = doc_postMouseEvent;
m_pDocumentClass->postDialogMouseEvent = doc_postDialogMouseEvent;
m_pDocumentClass->postDialogChildMouseEvent = doc_postDialogChildMouseEvent;
@@ -2272,7 +2272,7 @@ static void doc_postKeyEvent(LibreOfficeKitDocument* pThis, int nType, int nChar
pDoc->postKeyEvent(nType, nCharCode, nKeyCode);
}
-static void doc_postDialogKeyEvent(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWindowId, int nType, int nCharCode, int nKeyCode)
+static void doc_postWindowKeyEvent(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWindowId, int nType, int nCharCode, int nKeyCode)
{
SolarMutexGuard aGuard;
diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h
index cc8d77a54ade..9af42a1e3e5c 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.h
+++ b/include/LibreOfficeKit/LibreOfficeKit.h
@@ -269,8 +269,8 @@ struct _LibreOfficeKitDocumentClass
/// @see lok::Document::postWindow().
void (*postWindow) (LibreOfficeKitDocument* pThis, unsigned nWindowId, int nAction);
- /// @see lok::Document::postDialogKeyEvent().
- void (*postDialogKeyEvent) (LibreOfficeKitDocument* pThis,
+ /// @see lok::Document::postWindowKeyEvent().
+ void (*postWindowKeyEvent) (LibreOfficeKitDocument* pThis,
unsigned nDialogId,
int nType,
int nCharCode,
diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx
index 51b08f2bd151..4f3d4751b46c 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.hxx
+++ b/include/LibreOfficeKit/LibreOfficeKit.hxx
@@ -258,9 +258,9 @@ public:
* @param nCharCode contains the Unicode character generated by this event or 0
* @param nKeyCode contains the integer code representing the key of the event (non-zero for control keys)
*/
- void postDialogKeyEvent(unsigned nDialogId, int nType, int nCharCode, int nKeyCode)
+ void postWindowKeyEvent(unsigned nDialogId, int nType, int nCharCode, int nKeyCode)
{
- mpDoc->pClass->postDialogKeyEvent(mpDoc, nDialogId, nType, nCharCode, nKeyCode);
+ mpDoc->pClass->postWindowKeyEvent(mpDoc, nDialogId, nType, nCharCode, nKeyCode);
}
/**
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx
index 4d5ce9ca7ec9..b5d97805f9bc 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx
@@ -339,7 +339,7 @@ gtv_lok_dialog_signal_key(GtkWidget* pDialogDrawingArea, GdkEventKey* pEvent)
ss << "gtv_lok_dialog::postKey(" << pEvent->type << ", " << nCharCode << ", " << nKeyCode << ")";
g_info("%s", ss.str().c_str());
- pDocument->pClass->postDialogKeyEvent(pDocument,
+ pDocument->pClass->postWindowKeyEvent(pDocument,
priv->dialogid,
pEvent->type == GDK_KEY_RELEASE ? LOK_KEYEVENT_KEYUP : LOK_KEYEVENT_KEYINPUT,
nCharCode,
commit 6d9db952e8b3cff75ace140a4d51e41e975861d5
Author: Pranav Kant <pranavk at collabora.co.uk>
Date: Fri Dec 1 13:54:45 2017 +0530
lokdialog: Simplify; make the LOK dialog API more generic
Merge the dialog floating window callbacks and function calls into one.
Unique window ids across vcl::Window is enough to distinguish between
them.
Floating windows don't have a LOK notifier as they are created in the
vcl itself (so we can't access them from sfx2). Use the parent LOK
notifier in that case (which would be a dialog).
This API should also help in autopopup filter tunneling later.
Change-Id: I63a2c97ffdd84695dc967e14c793089a7c50b41b
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 98d3ac7c86a7..ef2d45dce173 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -637,8 +637,6 @@ static void doc_paintWindow(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId
const int nX, const int nY,
const int nWidth, const int nHeight);
-static void doc_paintActiveFloatingWindow(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId, unsigned char* pBuffer, int* nWidth, int* nHeight);
-
static void doc_postWindow(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId, int nAction);
LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XComponent> &xComponent)
@@ -692,7 +690,6 @@ LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XCompone
m_pDocumentClass->getPartHash = doc_getPartHash;
m_pDocumentClass->paintWindow = doc_paintWindow;
- m_pDocumentClass->paintActiveFloatingWindow = doc_paintActiveFloatingWindow;
m_pDocumentClass->postWindow = doc_postWindow;
gDocumentClass = m_pDocumentClass;
@@ -812,8 +809,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
case LOK_CALLBACK_SET_PART:
case LOK_CALLBACK_TEXT_VIEW_SELECTION:
case LOK_CALLBACK_INVALIDATE_HEADER:
- case LOK_CALLBACK_DIALOG:
- case LOK_CALLBACK_DIALOG_CHILD:
+ case LOK_CALLBACK_WINDOW:
{
const auto& pos = std::find_if(m_queue.rbegin(), m_queue.rend(),
[type] (const queue_type::value_type& elem) { return (elem.first == type); });
@@ -1046,27 +1042,27 @@ void CallbackFlushHandler::queue(const int type, const char* data)
}
break;
- case LOK_CALLBACK_DIALOG:
+ case LOK_CALLBACK_WINDOW:
{
// reading JSON by boost might be slow?
boost::property_tree::ptree aTree;
std::stringstream aStream(payload);
boost::property_tree::read_json(aStream, aTree);
- const unsigned nLOKWindowId = aTree.get<unsigned>("dialogId", 0);
+ const unsigned nLOKWindowId = aTree.get<unsigned>("id", 0);
if (aTree.get<std::string>("action", "") == "invalidate")
{
std::string aRectStr = aTree.get<std::string>("rectangle", "");
- // no 'rectangle' field => invalidate all of the dialog =>
- // remove all previous dialog part invalidations
+ // no 'rectangle' field => invalidate all of the window =>
+ // remove all previous window part invalidations
if (aRectStr.empty())
{
removeAll([&nLOKWindowId] (const queue_type::value_type& elem) {
- if (elem.first == LOK_CALLBACK_DIALOG)
+ if (elem.first == LOK_CALLBACK_WINDOW)
{
boost::property_tree::ptree aOldTree;
std::stringstream aOldStream(elem.second);
boost::property_tree::read_json(aOldStream, aOldTree);
- const unsigned nOldDialogId = aOldTree.get<unsigned>("dialogId", 0);
+ const unsigned nOldDialogId = aOldTree.get<unsigned>("id", 0);
if (aOldTree.get<std::string>("action", "") == "invalidate" &&
nLOKWindowId == nOldDialogId)
{
@@ -1078,18 +1074,18 @@ void CallbackFlushHandler::queue(const int type, const char* data)
}
else
{
- // if we have to invalidate all of the dialog, ignore
+ // if we have to invalidate all of the window, ignore
// any part invalidation message
const auto& pos = std::find_if(m_queue.rbegin(), m_queue.rend(),
[&nLOKWindowId] (const queue_type::value_type& elem)
{
- if (elem.first != LOK_CALLBACK_DIALOG)
+ if (elem.first != LOK_CALLBACK_WINDOW)
return false;
boost::property_tree::ptree aOldTree;
std::stringstream aOldStream(elem.second);
boost::property_tree::read_json(aOldStream, aOldTree);
- const unsigned nOldDialogId = aOldTree.get<unsigned>("dialogId", 0);
+ const unsigned nOldDialogId = aOldTree.get<unsigned>("id", 0);
if (aOldTree.get<std::string>("action", "") == "invalidate" &&
nLOKWindowId == nOldDialogId &&
aOldTree.get<std::string>("rectangle", "").empty())
@@ -1099,10 +1095,10 @@ void CallbackFlushHandler::queue(const int type, const char* data)
return false;
});
- // we found a invalidate-all dialog callback
+ // we found a invalidate-all window callback
if (pos != m_queue.rend())
{
- SAL_INFO("lok.dialog", "Skipping queue [" << type << "]: [" << payload << "] since whole dialog needs to be invalidated.");
+ SAL_INFO("lok.dialog", "Skipping queue [" << type << "]: [" << payload << "] since whole window needs to be invalidated.");
return;
}
@@ -1113,7 +1109,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
Rectangle aNewRect = Rectangle(nLeft, nTop, nLeft + nWidth, nTop + nHeight);
bool currentIsRedundant = false;
removeAll([&aNewRect, &nLOKWindowId, ¤tIsRedundant] (const queue_type::value_type& elem) {
- if (elem.first != LOK_CALLBACK_DIALOG)
+ if (elem.first != LOK_CALLBACK_WINDOW)
return false;
boost::property_tree::ptree aOldTree;
@@ -1121,7 +1117,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
boost::property_tree::read_json(aOldStream, aOldTree);
if (aOldTree.get<std::string>("action", "") == "invalidate")
{
- const unsigned nOldDialogId = aOldTree.get<unsigned>("dialogId", 0);
+ const unsigned nOldDialogId = aOldTree.get<unsigned>("id", 0);
std::string aOldRectStr = aOldTree.get<std::string>("rectangle", "");
// not possible that we encounter an empty
// rectangle here; we already handled this
@@ -3341,29 +3337,6 @@ static void doc_paintWindow(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWind
comphelper::LibreOfficeKit::setDialogPainting(false);
}
-static void doc_paintActiveFloatingWindow(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWindowId, unsigned char* pBuffer, int* nWidth, int* nHeight)
-{
- SolarMutexGuard aGuard;
-
- VclPtr<Window> pWindow = vcl::Window::FindLOKWindow(nLOKWindowId);
- if (!pWindow)
- {
- gImpl->maLastExceptionMsg = "Document doesn't support dialog rendering, or window not found.";
- return;
- }
-
- ScopedVclPtrInstance<VirtualDevice> pDevice(nullptr, Size(1, 1), DeviceFormat::DEFAULT);
- pDevice->SetBackground(Wallpaper(Color(COL_TRANSPARENT)));
-
- pDevice->SetOutputSizePixelScaleOffsetAndBuffer(Size(*nWidth, *nHeight), Fraction(1.0), Point(), pBuffer);
-
- comphelper::LibreOfficeKit::setDialogPainting(true);
- const Size aSize = pWindow->PaintActiveFloatingWindow(*pDevice.get());
- *nWidth = aSize.getWidth();
- *nHeight = aSize.getHeight();
- comphelper::LibreOfficeKit::setDialogPainting(false);
-}
-
static void doc_postWindow(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWindowId, int nAction)
{
SolarMutexGuard aGuard;
diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h
index 2a5f2cd43e49..cc8d77a54ade 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.h
+++ b/include/LibreOfficeKit/LibreOfficeKit.h
@@ -266,9 +266,6 @@ struct _LibreOfficeKitDocumentClass
const int x, const int y,
const int width, const int height);
- /// @see lok::Document::paintActiveFloatingWindow().
- void (*paintActiveFloatingWindow) (LibreOfficeKitDocument* pThis, unsigned nDialogId, unsigned char* pBuffer, int* nWidth, int* nHeight);
-
/// @see lok::Document::postWindow().
void (*postWindow) (LibreOfficeKitDocument* pThis, unsigned nWindowId, int nAction);
diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx
index ae48b6ac5242..51b08f2bd151 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.hxx
+++ b/include/LibreOfficeKit/LibreOfficeKit.hxx
@@ -176,25 +176,6 @@ public:
}
/**
- * Renders the active floating window of a dialog
- *
- * Client must truncate pBuffer according to the nWidth and nHeight returned after the call.
- *
- * @param nDialogId Unique dialog id
- * @param pBuffer Buffer with enough memory allocated to render any dialog
- * @param nWidth output parameter returning the width of the rendered dialog.
- * @param nHeight output parameter returning the height of the rendered dialog
- */
- void paintActiveFloatingWindow(unsigned nDialogId,
- unsigned char* pBuffer,
- int& nWidth,
- int& nHeight)
- {
- return mpDoc->pClass->paintActiveFloatingWindow(mpDoc, nDialogId, pBuffer,
- &nWidth, &nHeight);
- }
-
- /**
* Posts a command to the window (dialog, popup, etc.) with given id
*
* @param nWindowid
diff --git a/include/LibreOfficeKit/LibreOfficeKitEnums.h b/include/LibreOfficeKit/LibreOfficeKitEnums.h
index facbd351633d..cf85d7c6b592 100644
--- a/include/LibreOfficeKit/LibreOfficeKitEnums.h
+++ b/include/LibreOfficeKit/LibreOfficeKitEnums.h
@@ -531,26 +531,7 @@ typedef enum
/**
* Dialog invalidation
*/
- LOK_CALLBACK_DIALOG = 36,
-
- /**
- * Invalidation corresponding to dialog's children.
- * Eg: Floating window etc.
- *
- * Payload example:
- * {
- * "dialogID": "SpellDialog",
- * "action": "close"
- * }
- *
- * - dialogID is the UNO command of the dialog
- * - action can be
- * - close, means dialog child window is closed now
- * - invalidate, means dialog child window is invalidated
- * It also means that dialog child window is created if it's the first
- * invalidate
- */
- LOK_CALLBACK_DIALOG_CHILD = 37
+ LOK_CALLBACK_WINDOW = 36,
}
LibreOfficeKitCallbackType;
diff --git a/include/sfx2/lokhelper.hxx b/include/sfx2/lokhelper.hxx
index 810d537c1bed..eff40dd2f4ee 100644
--- a/include/sfx2/lokhelper.hxx
+++ b/include/sfx2/lokhelper.hxx
@@ -41,12 +41,10 @@ public:
static void notifyOtherViews(SfxViewShell* pThisView, int nType, const OString& rKey, const OString& rPayload);
/// Same as notifyOtherViews(), but works on a selected "other" view, not on all of them.
static void notifyOtherView(SfxViewShell* pThisView, SfxViewShell* pOtherView, int nType, const OString& rKey, const OString& rPayload);
- /// Emits a LOK_CALLBACK_DIALOG
- static void notifyWindow(vcl::LOKWindowId nDialogId,
+ /// Emits a LOK_CALLBACK_WINDOW
+ static void notifyWindow(vcl::LOKWindowId nWindowId,
const OUString& rAction,
const std::vector<vcl::LOKPayloadItem>& rPayload = std::vector<vcl::LOKPayloadItem>());
- /// Emits a LOK_CALLBACK_DIALOG_CHILD
- static void notifyWindowChild(vcl::LOKWindowId nDialogId, const OUString& rAction, const Point& rPos);
/// Emits a LOK_CALLBACK_INVALIDATE_TILES, but tweaks it according to setOptionalFeatures() if needed.
static void notifyInvalidation(SfxViewShell* pThisView, const OString& rPayload);
/// A special value to signify 'infinity'.
diff --git a/include/sfx2/viewsh.hxx b/include/sfx2/viewsh.hxx
index 5bfea3a81dcf..256f499f8547 100644
--- a/include/sfx2/viewsh.hxx
+++ b/include/sfx2/viewsh.hxx
@@ -228,7 +228,6 @@ public:
// ILibreOfficeKitNotifier
virtual void notifyWindow(vcl::LOKWindowId nLOKWindowId, const OUString& rAction, const std::vector<vcl::LOKPayloadItem>& rPayload = std::vector<vcl::LOKPayloadItem>()) const override;
- virtual void notifyWindowChild(vcl::LOKWindowId nLOKWindowId, const OUString& rAction, const Point& rPos) const override;
// Focus, KeyInput, Cursor
virtual void ShowCursor( bool bOn = true );
diff --git a/include/vcl/IDialogRenderable.hxx b/include/vcl/IDialogRenderable.hxx
index 281d04385aee..ef8d42a4a46c 100644
--- a/include/vcl/IDialogRenderable.hxx
+++ b/include/vcl/IDialogRenderable.hxx
@@ -34,8 +34,6 @@ public:
virtual void notifyWindow(vcl::LOKWindowId nLOKWindowId,
const OUString& rAction,
const std::vector<LOKPayloadItem>& rPayload = std::vector<LOKPayloadItem>()) const = 0;
-
- virtual void notifyWindowChild(vcl::LOKWindowId nLOKWindowId, const OUString& rAction, const Point& rPos) const = 0;
};
} // namespace vcl
diff --git a/include/vcl/dialog.hxx b/include/vcl/dialog.hxx
index 83a80eed84e6..c396fe766c29 100644
--- a/include/vcl/dialog.hxx
+++ b/include/vcl/dialog.hxx
@@ -65,8 +65,6 @@ protected:
public:
SAL_DLLPRIVATE bool IsInClose() const { return mbInClose; }
virtual void doDeferredInit(WinBits nBits) override;
- void InvalidateFloatingWindow(const Point& rPos);
- void CloseFloatingWindow();
protected:
explicit Dialog( WindowType nType );
diff --git a/include/vcl/floatwin.hxx b/include/vcl/floatwin.hxx
index da69f7b9cbe7..a5d780c23c6f 100644
--- a/include/vcl/floatwin.hxx
+++ b/include/vcl/floatwin.hxx
@@ -129,7 +129,7 @@ public:
SAL_DLLPRIVATE Rectangle& ImplGetItemEdgeClipRect();
SAL_DLLPRIVATE bool ImplIsInPrivatePopupMode() const { return mbInPopupMode; }
virtual void doDeferredInit(WinBits nBits) override;
- virtual void LogicInvalidate(const Rectangle* pRectangle) override;
+ void LogicInvalidate(const Rectangle* pRectangle) override;
public:
explicit FloatingWindow(vcl::Window* pParent, WinBits nStyle);
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index 489a200b5cbf..9b52a4da7810 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -1208,6 +1208,7 @@ public:
void SetLOKNotifier(const vcl::ILibreOfficeKitNotifier* pNotifier);
const vcl::ILibreOfficeKitNotifier* GetLOKNotifier() const;
vcl::LOKWindowId GetLOKWindowId() const;
+ vcl::Window* GetParentWithLOKNotifier();
/// Indicate that LOK is not going to use this dialog any more.
void ReleaseLOKNotifier();
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx b/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx
index 64d79e4c3d9c..efe9b3da7061 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx
@@ -14,13 +14,14 @@
#include <LibreOfficeKit/LibreOfficeKitGtk.h>
#include <LibreOfficeKit/LibreOfficeKitEnums.h>
-#include <gtv-application-window.hxx>
-#include <gtv-main-toolbar.hxx>
-#include <gtv-helpers.hxx>
-#include <gtv-signal-handlers.hxx>
-#include <gtv-lokdocview-signal-handlers.hxx>
-#include <gtv-calc-header-bar.hxx>
-#include <gtv-comments-sidebar.hxx>
+#include "gtv-application-window.hxx"
+#include "gtv-main-toolbar.hxx"
+#include "gtv-helpers.hxx"
+#include "gtv-signal-handlers.hxx"
+#include "gtv-lokdocview-signal-handlers.hxx"
+#include "gtv-calc-header-bar.hxx"
+#include "gtv-comments-sidebar.hxx"
+#include "gtv-lok-dialog.hxx"
#include <boost/property_tree/json_parser.hpp>
#include <boost/optional.hpp>
@@ -314,8 +315,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", G_CALLBACK(LOKDocViewSigHandlers::dialog), nullptr);
- g_signal_connect(window->lokdocview, "dialog-child", G_CALLBACK(LOKDocViewSigHandlers::dialogChild), nullptr);
+ g_signal_connect(window->lokdocview, "window", G_CALLBACK(LOKDocViewSigHandlers::window), nullptr);
g_signal_connect(window->lokdocview, "configure-event", G_CALLBACK(LOKDocViewSigHandlers::configureEvent), nullptr);
}
@@ -422,7 +422,7 @@ gtv_application_window_unregister_child_window(GtvApplicationWindow* window, Gtk
}
GtkWindow*
-gtv_application_window_get_child_window_by_id(GtvApplicationWindow* window, const gchar* pWinId)
+gtv_application_window_get_child_window_by_id(GtvApplicationWindow* window, guint nWinId)
{
GtvApplicationWindowPrivate* priv = getPrivate(window);
GList* pIt = nullptr;
@@ -430,25 +430,32 @@ gtv_application_window_get_child_window_by_id(GtvApplicationWindow* window, cons
// For now, only dialogs are registered as child window
for (pIt = priv->m_pChildWindows; pIt != nullptr; pIt = pIt->next)
{
- gchar* dialogId = nullptr;
+ guint dialogId = 0;
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))
+ if (dialogId == nWinId)
{
ret = GTK_WINDOW(pIt->data);
break;
}
}
+
return ret;
}
+GtkWidget* gtv_application_window_get_parent(GtvApplicationWindow* window, guint nWinId)
+{
+ GtvApplicationWindowPrivate* priv = getPrivate(window);
+ GList* pIt = nullptr;
+ for (pIt = priv->m_pChildWindows; pIt != nullptr; pIt = pIt->next)
+ {
+ if (gtv_lok_dialog_is_parent_of(GTV_LOK_DIALOG(pIt->data), nWinId))
+ return GTK_WIDGET(pIt->data);
+ }
+ return nullptr;
+}
+
+
// temporary function to invalidate all opened dialogs
// because currently the dialog id returned in dialog invalidation payload
// doesn't match our hard-coded list of dialog ids (uno commands) for some dialogs
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx b/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx
index 239471ae4ac8..b6aac5466133 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx
@@ -103,10 +103,12 @@ void gtv_application_window_register_child_window(GtvApplicationWindow* window,
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);
+GtkWindow* gtv_application_window_get_child_window_by_id(GtvApplicationWindow* window, guint nWinId);
GList* gtv_application_window_get_all_child_windows(GtvApplicationWindow* window);
+GtkWidget* gtv_application_window_get_parent(GtvApplicationWindow* window, guint nWinId);
+
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 15e67cf7a967..4d5ce9ca7ec9 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx
@@ -43,6 +43,9 @@ struct GtvLokDialogPrivate
guint32 m_nHeight;
// state for child floating windows
+ guint32 m_nChildId;
+ guint32 m_nChildWidth;
+ guint32 m_nChildHeight;
guint32 m_nChildLastButtonPressTime;
guint32 m_nChildLastButtonReleaseTime;
guint32 m_nChildKeyModifier;
@@ -132,11 +135,9 @@ gtv_lok_dialog_signal_button(GtkWidget* pDialogDrawingArea, GdkEventButton* pEve
else if (pEvent->type == GDK_BUTTON_RELEASE)
aEventType = "BUTTON_RELEASE";
- g_info("lok_dialog_signal_button (type: %s): %d, %d (in twips: %d, %d)",
+ g_info("lok_dialog_signal_button (type: %s): %d, %d",
aEventType.c_str(),
- (int)pEvent->x, (int)pEvent->y,
- (int)pixelToTwip(pEvent->x),
- (int)pixelToTwip(pEvent->y));
+ (int)pEvent->x, (int)pEvent->y);
gtk_widget_grab_focus(pDialogDrawingArea);
switch (pEvent->type)
@@ -355,6 +356,9 @@ gtv_lok_dialog_init(GtvLokDialog* dialog)
GtkWidget* pContentArea = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
priv->pDialogDrawingArea = gtk_drawing_area_new();
priv->pFloatingWin = nullptr;
+ priv->m_nChildId = 0;
+ priv->m_nChildWidth = 0;
+ priv->m_nChildHeight = 0;
priv->m_nLastButtonPressTime = 0;
priv->m_nLastButtonReleaseTime = 0;
@@ -478,17 +482,14 @@ gtv_lok_dialog_floating_win_draw(GtkWidget* pDrawingArea, cairo_t* pCairo, gpoin
GtvLokDialogPrivate* priv = getPrivate(pDialog);
g_info("gtv_lok_dialog_floating_win_draw triggered");
- int nWidth = 800;
- int nHeight = 600;
- cairo_surface_t* pSurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, nWidth, nHeight);
+ cairo_surface_t* pSurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, priv->m_nChildWidth, priv->m_nChildHeight);
unsigned char* pBuffer = cairo_image_surface_get_data(pSurface);
LibreOfficeKitDocument* pDocument = lok_doc_view_get_document(LOK_DOC_VIEW(priv->lokdocview));
- pDocument->pClass->paintActiveFloatingWindow(pDocument, priv->dialogid, pBuffer, &nWidth, &nHeight);
- g_info("Size of floating window: %d x %d", nWidth, nHeight);
+ pDocument->pClass->paintWindow(pDocument, priv->m_nChildId, pBuffer, 0, 0, priv->m_nChildWidth, priv->m_nChildHeight);
- gtk_widget_set_size_request(GTK_WIDGET(pDrawingArea), nWidth, nHeight);
- gtk_widget_set_size_request(GTK_WIDGET(pDialog), nWidth, nHeight);
- gtk_window_resize(GTK_WINDOW(pDialog), nWidth, nHeight);
+ gtk_widget_set_size_request(GTK_WIDGET(pDrawingArea), priv->m_nChildWidth, priv->m_nChildHeight);
+ //gtk_widget_set_size_request(GTK_WIDGET(pDialog), nWidth, nHeight);
+ //gtk_window_resize(GTK_WINDOW(pDialog), nWidth, nHeight);
cairo_surface_flush(pSurface);
cairo_surface_mark_dirty(pSurface);
@@ -497,16 +498,6 @@ gtv_lok_dialog_floating_win_draw(GtkWidget* pDrawingArea, cairo_t* pCairo, gpoin
cairo_paint(pCairo);
}
-void
-gtv_lok_dialog_invalidate(GtvLokDialog* dialog, const GdkRectangle& aRectangle)
-{
- GtvLokDialogPrivate* priv = getPrivate(dialog);
- if (aRectangle.width != 0 && aRectangle.height != 0)
- gtk_widget_queue_draw_area(priv->pDialogDrawingArea, aRectangle.x, aRectangle.y, aRectangle.width, aRectangle.height);
- else
- gtk_widget_queue_draw(priv->pDialogDrawingArea);
-}
-
static gboolean
gtv_lok_dialog_floating_win_signal_button(GtkWidget* /*pDialogChildDrawingArea*/, GdkEventButton* pEvent, gpointer userdata)
{
@@ -551,13 +542,13 @@ gtv_lok_dialog_floating_win_signal_button(GtkWidget* /*pDialogChildDrawingArea*/
}
priv->m_nChildLastButtonPressed = nEventButton;
pDocument->pClass->postDialogChildMouseEvent(pDocument,
- priv->dialogid,
- LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
- (pEvent->x),
- (pEvent->y),
- nCount,
- nEventButton,
- priv->m_nChildKeyModifier);
+ priv->m_nChildId,
+ LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
+ (pEvent->x),
+ (pEvent->y),
+ nCount,
+ nEventButton,
+ priv->m_nChildKeyModifier);
break;
}
@@ -582,7 +573,7 @@ gtv_lok_dialog_floating_win_signal_button(GtkWidget* /*pDialogChildDrawingArea*/
}
priv->m_nChildLastButtonPressed = nEventButton;
pDocument->pClass->postDialogChildMouseEvent(pDocument,
- priv->dialogid,
+ priv->m_nChildId,
LOK_MOUSEEVENT_MOUSEBUTTONUP,
(pEvent->x),
(pEvent->y),
@@ -612,7 +603,7 @@ gtv_lok_dialog_floating_win_signal_motion(GtkWidget* /*pDialogDrawingArea*/, Gdk
(int)pixelToTwip(pEvent->y));
pDocument->pClass->postDialogChildMouseEvent(pDocument,
- priv->dialogid,
+ priv->m_nChildId,
LOK_MOUSEEVENT_MOUSEMOVE,
(pEvent->x),
(pEvent->y),
@@ -623,40 +614,58 @@ gtv_lok_dialog_floating_win_signal_motion(GtkWidget* /*pDialogDrawingArea*/, Gdk
return FALSE;
}
-void gtv_lok_dialog_child_invalidate(GtvLokDialog* dialog, int nX, int nY)
+// Public methods below
+
+void gtv_lok_dialog_invalidate(GtvLokDialog* dialog, const GdkRectangle& aRectangle)
+{
+ GtvLokDialogPrivate* priv = getPrivate(dialog);
+ if (aRectangle.width != 0 && aRectangle.height != 0)
+ gtk_widget_queue_draw_area(priv->pDialogDrawingArea, aRectangle.x, aRectangle.y, aRectangle.width, aRectangle.height);
+ else
+ gtk_widget_queue_draw(priv->pDialogDrawingArea);
+}
+
+// checks if we are the parent of given childId
+gboolean gtv_lok_dialog_is_parent_of(GtvLokDialog* dialog, guint childId)
{
- g_info("Dialog's floating window invalidate");
+ GtvLokDialogPrivate* priv = getPrivate(dialog);
+
+ return priv->m_nChildId == childId;
+}
+void gtv_lok_dialog_child_create(GtvLokDialog* dialog, guint childId, guint nX, guint nY, guint width, guint height)
+{
GtvLokDialogPrivate* priv = getPrivate(dialog);
- // create new if doesn't exist
- if (!priv->pFloatingWin)
- {
- priv->pFloatingWin = gtk_window_new(GTK_WINDOW_POPUP);
- GtkWidget* pDrawingArea = gtk_drawing_area_new();
- gtk_container_add(GTK_CONTAINER(priv->pFloatingWin), pDrawingArea);
-
- gtk_window_set_transient_for(GTK_WINDOW(priv->pFloatingWin), GTK_WINDOW(dialog));
- gtk_window_set_destroy_with_parent(GTK_WINDOW(priv->pFloatingWin), true);
-
- gtk_widget_add_events(pDrawingArea,
- GDK_BUTTON_PRESS_MASK
- |GDK_POINTER_MOTION_MASK
- |GDK_BUTTON_RELEASE_MASK
- |GDK_BUTTON_MOTION_MASK);
-
- g_signal_connect(G_OBJECT(pDrawingArea), "draw", G_CALLBACK(gtv_lok_dialog_floating_win_draw), dialog);
- g_signal_connect(G_OBJECT(pDrawingArea), "button-press-event", G_CALLBACK(gtv_lok_dialog_floating_win_signal_button), dialog);
- g_signal_connect(G_OBJECT(pDrawingArea), "button-release-event", G_CALLBACK(gtv_lok_dialog_floating_win_signal_button), dialog);
- g_signal_connect(G_OBJECT(pDrawingArea), "motion-notify-event", G_CALLBACK(gtv_lok_dialog_floating_win_signal_motion), dialog);
-
- gtk_widget_set_size_request(priv->pFloatingWin, 1, 1);
- gtk_window_set_type_hint(GTK_WINDOW(priv->pFloatingWin), GDK_WINDOW_TYPE_HINT_POPUP_MENU);
- gtk_window_set_screen(GTK_WINDOW(priv->pFloatingWin), gtk_window_get_screen(GTK_WINDOW(dialog)));
-
- gtk_widget_show_all(priv->pFloatingWin);
- gtk_window_present(GTK_WINDOW(priv->pFloatingWin));
- gtk_widget_grab_focus(pDrawingArea);
- }
+
+ g_debug("Dialog [ %d ] child window [ %d] being created, with dimensions [%dx%d]@(%d,%d)", priv->dialogid, childId, width, height, nX, nY);
+ priv->pFloatingWin = gtk_window_new(GTK_WINDOW_POPUP);
+ priv->m_nChildId = childId;
+ priv->m_nChildWidth = width;
+ priv->m_nChildHeight = height;
+ GtkWidget* pDrawingArea = gtk_drawing_area_new();
+ gtk_container_add(GTK_CONTAINER(priv->pFloatingWin), pDrawingArea);
+
+ gtk_window_set_transient_for(GTK_WINDOW(priv->pFloatingWin), GTK_WINDOW(dialog));
+ gtk_window_set_destroy_with_parent(GTK_WINDOW(priv->pFloatingWin), true);
+
+ gtk_widget_add_events(pDrawingArea,
+ GDK_BUTTON_PRESS_MASK
+ |GDK_POINTER_MOTION_MASK
+ |GDK_BUTTON_RELEASE_MASK
+ |GDK_BUTTON_MOTION_MASK);
+
+ g_signal_connect(G_OBJECT(pDrawingArea), "draw", G_CALLBACK(gtv_lok_dialog_floating_win_draw), dialog);
+ g_signal_connect(G_OBJECT(pDrawingArea), "button-press-event", G_CALLBACK(gtv_lok_dialog_floating_win_signal_button), dialog);
+ g_signal_connect(G_OBJECT(pDrawingArea), "button-release-event", G_CALLBACK(gtv_lok_dialog_floating_win_signal_button), dialog);
+ g_signal_connect(G_OBJECT(pDrawingArea), "motion-notify-event", G_CALLBACK(gtv_lok_dialog_floating_win_signal_motion), dialog);
+
+ gtk_widget_set_size_request(priv->pFloatingWin, 1, 1);
+ gtk_window_set_type_hint(GTK_WINDOW(priv->pFloatingWin), GDK_WINDOW_TYPE_HINT_POPUP_MENU);
+ gtk_window_set_screen(GTK_WINDOW(priv->pFloatingWin), gtk_window_get_screen(GTK_WINDOW(dialog)));
+
+ gtk_widget_show_all(priv->pFloatingWin);
+ gtk_window_present(GTK_WINDOW(priv->pFloatingWin));
+ gtk_widget_grab_focus(pDrawingArea);
// Get the root coords of our new floating window
GdkWindow* pGdkWin = gtk_widget_get_window(GTK_WIDGET(dialog));
@@ -664,7 +673,12 @@ void gtv_lok_dialog_child_invalidate(GtvLokDialog* dialog, int nX, int nY)
int nrY = 0;
gdk_window_get_root_coords(pGdkWin, nX, nY, &nrX, &nrY);
gtk_window_move(GTK_WINDOW(priv->pFloatingWin), nrX, nrY);
+}
+void gtv_lok_dialog_child_invalidate(GtvLokDialog* dialog)
+{
+ GtvLokDialogPrivate* priv = getPrivate(dialog);
+ g_debug("Dialog [ %d ] child invalidate request", priv->dialogid);
gtk_widget_queue_draw(priv->pFloatingWin);
}
@@ -677,12 +691,13 @@ void gtv_lok_dialog_child_close(GtvLokDialog* dialog)
{
gtk_widget_destroy(priv->pFloatingWin);
priv->pFloatingWin = nullptr;
+ priv->m_nChildId = 0;
+ priv->m_nChildWidth = 0;
+ priv->m_nChildHeight = 0;
}
}
-
-GtkWidget*
-gtv_lok_dialog_new(LOKDocView* pDocView, guint dialogId, guint width, guint height)
+GtkWidget* gtv_lok_dialog_new(LOKDocView* pDocView, guint dialogId, guint width, guint height)
{
g_debug("Dialog [ %d ] of size: %d x %d created", dialogId, width, height);
GtkWindow* pWindow = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pDocView)));
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx
index 0f7002c359d7..2a5bfb5957f8 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx
@@ -39,10 +39,14 @@ GtkWidget* gtv_lok_dialog_new(LOKDocView* pDocView, guint dialogId, guint width,
void gtv_lok_dialog_invalidate(GtvLokDialog* dialog, const GdkRectangle& aRectangle);
-void gtv_lok_dialog_child_invalidate(GtvLokDialog* dialog, int nX, int nY);
+void gtv_lok_dialog_child_create(GtvLokDialog* dialog, guint childId, guint nX, guint nY, guint width, guint height);
+
+void gtv_lok_dialog_child_invalidate(GtvLokDialog* dialog);
void gtv_lok_dialog_child_close(GtvLokDialog* dialog);
+gboolean gtv_lok_dialog_is_parent_of(GtvLokDialog* dialog, guint childId);
+
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 41d332d30fc7..8d3a116df97e 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx
@@ -301,47 +301,60 @@ void LOKDocViewSigHandlers::comment(LOKDocView* pDocView, gchar* pComment, gpoin
}
}
-void LOKDocViewSigHandlers::dialog(LOKDocView* pDocView, gchar* pPayload, gpointer)
+void LOKDocViewSigHandlers::window(LOKDocView* pDocView, gchar* pPayload, gpointer)
{
GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pDocView)));
std::stringstream aStream(pPayload);
boost::property_tree::ptree aRoot;
boost::property_tree::read_json(aStream, aRoot);
- const unsigned nDialogId = aRoot.get<unsigned>("dialogId");
+ const unsigned nWinId = aRoot.get<unsigned>("id");
const std::string aAction = aRoot.get<std::string>("action");
if (aAction == "created")
{
+ const std::string aType = aRoot.get<std::string>("type");
const std::string aSize = aRoot.get<std::string>("size");
- std::vector<int> aPoints = GtvHelpers::split<int>(aSize, ", ", 2);
- GtkWidget* pDialog = gtv_lok_dialog_new(pDocView, nDialogId, aPoints[0], aPoints[1]);
- g_info("created dialog, for dialogid: %d with size: %s", nDialogId, aSize.c_str());
+ std::vector<int> aSizePoints = GtvHelpers::split<int>(aSize, ", ", 2);
- gtv_application_window_register_child_window(window, GTK_WINDOW(pDialog));
- g_signal_connect(pDialog, "destroy", G_CALLBACK(destroyLokDialog), window);
- g_signal_connect(pDialog, "delete-event", G_CALLBACK(deleteLokDialog), window);
+ if (aType == "dialog")
+ {
+ GtkWidget* pDialog = gtv_lok_dialog_new(pDocView, nWinId, aSizePoints[0], aSizePoints[1]);
+ g_info("created dialog, for dialogid: %d with size: %s", nWinId, aSize.c_str());
- gtk_window_set_resizable(GTK_WINDOW(pDialog), false);
- gtk_widget_show_all(GTK_WIDGET(pDialog));
- gtk_window_present(GTK_WINDOW(pDialog));
+ gtv_application_window_register_child_window(window, GTK_WINDOW(pDialog));
+ g_signal_connect(pDialog, "destroy", G_CALLBACK(destroyLokDialog), window);
+ g_signal_connect(pDialog, "delete-event", G_CALLBACK(deleteLokDialog), window);
- return;
+ gtk_window_set_resizable(GTK_WINDOW(pDialog), false);
+ gtk_widget_show_all(GTK_WIDGET(pDialog));
+ gtk_window_present(GTK_WINDOW(pDialog));
+ }
+ else if (aType == "child")
+ {
+ const unsigned nParentId = std::atoi(aRoot.get<std::string>("parentId").c_str());
+ GtkWindow* pDialog = gtv_application_window_get_child_window_by_id(window, nParentId);
+ const std::string aPos = aRoot.get<std::string>("position");
+ std::vector<int> aPosPoints = GtvHelpers::split<int>(aPos, ", ", 2);
+ gtv_lok_dialog_child_create(GTV_LOK_DIALOG(pDialog), nWinId, aPosPoints[0], aPosPoints[1], aSizePoints[0], aSizePoints[1]);
+ }
}
-
- GList* pChildWins = gtv_application_window_get_all_child_windows(window);
- GList* pIt = nullptr;
- bool found = false;
- for (pIt = pChildWins; !found && pIt != nullptr; pIt = pIt->next)
+ else
{
- guint nChildDialogId = 0;
- g_object_get(pIt->data, "dialogid", &nChildDialogId, nullptr);
- if (nDialogId == nChildDialogId)
+ // check if it's a child window
+ GtkWidget* pParent = gtv_application_window_get_parent(window, nWinId);
+ if (pParent) // it's a floating window in the dialog
{
- found = true;
-
+ if (aAction == "invalidate")
+ gtv_lok_dialog_child_invalidate(GTV_LOK_DIALOG(pParent));
+ else if (aAction == "close")
+ gtv_lok_dialog_child_close(GTV_LOK_DIALOG(pParent));
+ }
+ else // it's the dialog window itself
+ {
+ GtkWindow* pDialog = gtv_application_window_get_child_window_by_id(window, nWinId);
if (aAction == "close")
- gtk_widget_destroy(GTK_WIDGET(pIt->data));
+ gtk_widget_destroy(GTK_WIDGET(pDialog));
else if (aAction == "size_changed")
{
const std::string aSize = aRoot.get<std::string>("size");
@@ -349,16 +362,16 @@ void LOKDocViewSigHandlers::dialog(LOKDocView* pDocView, gchar* pPayload, gpoint
if (aSizePoints.size() != 2)
{
g_error("Malformed size_changed callback");
- break;
+ return;
}
- g_object_set(G_OBJECT(pIt->data),
+ g_object_set(G_OBJECT(pDialog),
"width", aSizePoints[0],
"height", aSizePoints[1],
nullptr);
GdkRectangle aGdkRectangle = {0, 0, 0, 0};
- gtv_lok_dialog_invalidate(GTV_LOK_DIALOG(pIt->data), aGdkRectangle);
+ gtv_lok_dialog_invalidate(GTV_LOK_DIALOG(pDialog), aGdkRectangle);
}
else if (aAction == "invalidate")
{
@@ -373,51 +386,12 @@ void LOKDocViewSigHandlers::dialog(LOKDocView* pDocView, gchar* pPayload, gpoint
catch(const std::exception& e)
{}
- gtv_lok_dialog_invalidate(GTV_LOK_DIALOG(pIt->data), aGdkRectangle);
+ gtv_lok_dialog_invalidate(GTV_LOK_DIALOG(pDialog), aGdkRectangle);
}
}
}
}
-void LOKDocViewSigHandlers::dialogChild(LOKDocView* pDocView, gchar* pPayload, gpointer)
-{
- GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pDocView)));
-
- std::stringstream aStream(pPayload);
- boost::property_tree::ptree aRoot;
- boost::property_tree::read_json(aStream, aRoot);
- const unsigned nDialogId = aRoot.get<unsigned>("dialogId");
- const std::string aAction = aRoot.get<std::string>("action");
- const std::string aPos = aRoot.get<std::string>("position");
- gchar** ppCoordinates = g_strsplit(aPos.c_str(), ", ", 2);
- gchar** ppCoordinate = ppCoordinates;
- int nX = 0;
- int nY = 0;
-
- if (*ppCoordinate)
- nX = atoi(*ppCoordinate);
- ++ppCoordinate;
- if (*ppCoordinate)
- nY = atoi(*ppCoordinate);
-
- g_strfreev(ppCoordinates);
-
- GList* pChildWins = gtv_application_window_get_all_child_windows(window);
- GList* pIt = nullptr;
- for (pIt = pChildWins; pIt != nullptr; pIt = pIt->next)
- {
- guint nChildDialogId = 0;
- g_object_get(pIt->data, "dialogid", &nChildDialogId, nullptr);
- if (nDialogId == nChildDialogId)
- {
- if (aAction == "invalidate")
- gtv_lok_dialog_child_invalidate(GTV_LOK_DIALOG(pIt->data), nX, nY);
- else if (aAction == "close")
- gtv_lok_dialog_child_close(GTV_LOK_DIALOG(pIt->data));
- }
- }
-}
-
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 54f54b396bf3..aedc8d216ad0 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx
@@ -25,8 +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 dialog(LOKDocView* pDocView, gchar* pDialogId, gpointer);
- void dialogChild(LOKDocView* pDocView, gchar* pPayload, gpointer);
+ void window(LOKDocView* pDocView, gchar* pPayload, gpointer);
gboolean configureEvent(GtkWidget* pWidget, GdkEventConfigure* pEvent, gpointer pData);
}
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index 69644d287cde..6414e2fa5892 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -279,8 +279,7 @@ enum
PASSWORD_REQUIRED,
COMMENT,
RULER,
- DIALOG,
- DIALOG_CHILD,
+ WINDOW,
LAST_SIGNAL
};
@@ -438,10 +437,8 @@ callbackTypeToString (int nType)
return "LOK_CALLBACK_COMMENT";
case LOK_CALLBACK_RULER_UPDATE:
return "LOK_CALLBACK_RULER_UPDATE";
- case LOK_CALLBACK_DIALOG:
- return "LOK_CALLBACK_DIALOG";
- case LOK_CALLBACK_DIALOG_CHILD:
- return "LOK_CALLBACK_DIALOG_CHILD";
+ case LOK_CALLBACK_WINDOW:
+ return "LOK_CALLBACK_WINDOW";
}
g_assert(false);
return nullptr;
@@ -1416,11 +1413,8 @@ callback (gpointer pData)
case LOK_CALLBACK_RULER_UPDATE:
g_signal_emit(pCallback->m_pDocView, doc_view_signals[RULER], 0, pCallback->m_aPayload.c_str());
break;
- case LOK_CALLBACK_DIALOG:
- g_signal_emit(pCallback->m_pDocView, doc_view_signals[DIALOG], 0, pCallback->m_aPayload.c_str());
- break;
- case LOK_CALLBACK_DIALOG_CHILD:
- g_signal_emit(pCallback->m_pDocView, doc_view_signals[DIALOG_CHILD], 0, pCallback->m_aPayload.c_str());
+ case LOK_CALLBACK_WINDOW:
+ g_signal_emit(pCallback->m_pDocView, doc_view_signals[WINDOW], 0, pCallback->m_aPayload.c_str());
break;
default:
g_assert(false);
@@ -3199,43 +3193,12 @@ static void lok_doc_view_class_init (LOKDocViewClass* pClass)
G_TYPE_STRING);
/**
- * LOKDocView::dialog-invalidate:
+ * LOKDocView::window
* @pDocView: the #LOKDocView on which the signal is emitted
- * @pDialogId: The uno command for the dialog (dialog ID)
- */
- doc_view_signals[DIALOG] =
- g_signal_new("dialog",
- G_TYPE_FROM_CLASS(pGObjectClass),
- G_SIGNAL_RUN_FIRST,
- 0,
- nullptr, nullptr,
- g_cclosure_marshal_generic,
- G_TYPE_NONE, 1,
- G_TYPE_STRING);
-
- /**
- * LOKDocView::dialog-child:
- * @pDocView: the #LOKDocView on which the signal is emitted
- * @pPayload: JSON described below:
- *
- * Invalidation corresponding to dialog's children.
- * Eg: Floating window etc.
- *
- * Payload example:
- * {
- * "dialogID": "SpellDialog",
- * "action": "close"
- * }
- *
- * - dialogID is the UNO command of the dialog
- * - action can be
- * - close, means dialog child window is closed now
- * - invalidate, means dialog child window is invalidated
- * It also means that dialog child window is created if it's the first
- * invalidate
+ * @pPayload: JSON containing the information, including id, about the window
*/
- doc_view_signals[DIALOG_CHILD] =
- g_signal_new("dialog-child",
+ doc_view_signals[WINDOW] =
+ g_signal_new("window",
G_TYPE_FROM_CLASS(pGObjectClass),
G_SIGNAL_RUN_FIRST,
0,
diff --git a/sfx2/source/dialog/basedlgs.cxx b/sfx2/source/dialog/basedlgs.cxx
index 97d3c1c8b45e..0fd2abc9ba8e 100644
--- a/sfx2/source/dialog/basedlgs.cxx
+++ b/sfx2/source/dialog/basedlgs.cxx
@@ -185,6 +185,7 @@ short SfxModalDialog::Execute()
SetLOKNotifier(pViewShell);
const Size aSize = GetOptimalSize();
std::vector<vcl::LOKPayloadItem> aItems;
+ aItems.emplace_back(std::make_pair("type", "dialog"));
aItems.emplace_back(std::make_pair("size", aSize.toString()));
pViewShell->notifyWindow(GetLOKWindowId(), "created", aItems);
}
@@ -279,6 +280,7 @@ void SfxModelessDialog::StateChanged( StateChangedType nStateChange )
// Check GetSizePixel() ?
const Size aOptimalSize = GetOptimalSize();
std::vector<vcl::LOKPayloadItem> aItems;
+ aItems.emplace_back(std::make_pair("type", "dialog"));
aItems.emplace_back(std::make_pair("size", aOptimalSize.toString()));
pViewShell->notifyWindow(GetLOKWindowId(), "created", aItems);
}
@@ -545,6 +547,7 @@ bool SfxFloatingWindow::Close()
pBindings->GetDispatcher_Impl()->ExecuteList(
pImpl->pMgr->GetType(),
SfxCallMode::RECORD|SfxCallMode::SYNCHRON, { &aValue });
+
return true;
}
diff --git a/sfx2/source/dialog/tabdlg.cxx b/sfx2/source/dialog/tabdlg.cxx
index 23113c7836ea..c9f1577f691b 100644
--- a/sfx2/source/dialog/tabdlg.cxx
+++ b/sfx2/source/dialog/tabdlg.cxx
@@ -526,6 +526,7 @@ short SfxTabDialog::Execute()
SetLOKNotifier(pViewShell);
const Size aSize = GetOptimalSize();
std::vector<vcl::LOKPayloadItem> aItems;
+ aItems.emplace_back(std::make_pair("type", "dialog"));
aItems.emplace_back(std::make_pair("size", aSize.toString()));
pViewShell->notifyWindow(GetLOKWindowId(), "created", aItems);
}
diff --git a/sfx2/source/view/lokhelper.cxx b/sfx2/source/view/lokhelper.cxx
index d39c3ac2cacb..d28e5a835dd6 100644
--- a/sfx2/source/view/lokhelper.cxx
+++ b/sfx2/source/view/lokhelper.cxx
@@ -139,8 +139,7 @@ void SfxLokHelper::notifyWindow(vcl::LOKWindowId nLOKWindowId,
if (SfxLokHelper::getViewsCount() <= 0 || nLOKWindowId == 0)
return;
-
- OString aPayload = OString("{ \"dialogId\": \"") + OString::number(nLOKWindowId) + OString("\"");
+ OString aPayload = OString("{ \"id\": \"") + OString::number(nLOKWindowId) + OString("\"");
aPayload += OString(", \"action\": \"") + OUStringToOString(rAction, RTL_TEXTENCODING_UTF8).getStr() + OString("\"");
for (const auto& rItem: rPayload)
@@ -154,22 +153,7 @@ void SfxLokHelper::notifyWindow(vcl::LOKWindowId nLOKWindowId,
aPayload += "}";
if (SfxViewShell* pViewShell = SfxViewShell::Current())
- pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_DIALOG, aPayload.getStr());
-}
-
-void SfxLokHelper::notifyWindowChild(vcl::LOKWindowId nLOKWindowId, const OUString& rAction, const Point& rPos)
-{
- if (SfxLokHelper::getViewsCount() <= 0 || nLOKWindowId == 0)
- return;
-
-
- const OString aPayload = OString("{ \"dialogId\": \"") + OString::number(nLOKWindowId) +
- OString("\", \"action\": \"") + OUStringToOString(rAction, RTL_TEXTENCODING_UTF8).getStr() +
- OString("\", \"position\": \"") + OString::number(rPos.getX()) + OString(", ") + OString::number(rPos.getY()) +
- + "\" }";
-
- if (SfxViewShell* pViewShell = SfxViewShell::Current())
- pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_DIALOG_CHILD, aPayload.getStr());
+ pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_WINDOW, aPayload.getStr());
}
void SfxLokHelper::notifyInvalidation(SfxViewShell* pThisView, const OString& rPayload)
diff --git a/sfx2/source/view/viewsh.cxx b/sfx2/source/view/viewsh.cxx
index 78c43ed863f2..23b3237e4c83 100644
--- a/sfx2/source/view/viewsh.cxx
+++ b/sfx2/source/view/viewsh.cxx
@@ -2041,11 +2041,6 @@ void SfxViewShell::notifyWindow(vcl::LOKWindowId nDialogId, const OUString& rAct
SfxLokHelper::notifyWindow(nDialogId, rAction, rPayload);
}
-void SfxViewShell::notifyWindowChild(vcl::LOKWindowId nDialogId, const OUString& rAction, const Point& rPos) const
-{
- SfxLokHelper::notifyWindowChild(nDialogId, rAction, rPos);
-}
-
uno::Reference< datatransfer::clipboard::XClipboardNotifier > SfxViewShell::GetClipboardNotifier()
{
uno::Reference< datatransfer::clipboard::XClipboardNotifier > xClipboardNotifier;
diff --git a/vcl/source/control/ctrl.cxx b/vcl/source/control/ctrl.cxx
index b3d67d438961..9b5b16a7509a 100644
--- a/vcl/source/control/ctrl.cxx
+++ b/vcl/source/control/ctrl.cxx
@@ -425,25 +425,15 @@ void Control::LogicInvalidate(const Rectangle* /*pRectangle*/)
// ignore all of those
if (comphelper::LibreOfficeKit::isActive() && !comphelper::LibreOfficeKit::isDialogPainting())
{
- // If parent is a floating window, trigger an invalidate there
- vcl::Window* pWindow = this;
- while (pWindow)
+ if (vcl::Window* pParent = GetParentWithLOKNotifier())
{
- if (pWindow->ImplIsFloatingWindow())
- {
- dynamic_cast<FloatingWindow*>(pWindow)->LogicInvalidate(nullptr);
- return;
- }
+ // invalidate the complete floating window for now
+ if (pParent->ImplIsFloatingWindow())
+ return pParent->LogicInvalidate(nullptr);
- pWindow = pWindow->GetParent();
+ const Rectangle aRect(Point(GetOutOffXPixel(), GetOutOffYPixel()), Size(GetOutputWidthPixel(), GetOutputHeightPixel()));
+ pParent->LogicInvalidate(&aRect);
}
-
- // otherwise, for now, just invalidate the whole dialog
- Dialog* pParentDlg = GetParentDialog();
-
- const Rectangle aRect(Point(GetOutOffXPixel(), GetOutOffYPixel()), Size(GetOutputWidthPixel(), GetOutputHeightPixel()));
- if (pParentDlg)
- pParentDlg->LogicInvalidate(&aRect);
}
}
diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx
index 976e26751a07..aae947c805c0 100644
--- a/vcl/source/window/dialog.cxx
+++ b/vcl/source/window/dialog.cxx
@@ -883,18 +883,6 @@ bool Dialog::selectPageByUIXMLDescription(const OString& /*rUIXMLDescription*/)
return true;
}
-void Dialog::InvalidateFloatingWindow(const Point& rPos)
-{
- if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
- pNotifier->notifyWindowChild(GetLOKWindowId(), "invalidate", rPos);
-}
-
-void Dialog::CloseFloatingWindow()
-{
- if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
- pNotifier->notifyWindowChild(GetLOKWindowId(), "close", Point(0, 0));
-}
-
void Dialog::ensureRepaint()
{
// ensure repaint
diff --git a/vcl/source/window/floatwin.cxx b/vcl/source/window/floatwin.cxx
index 6a3385360ed7..ce289a804e50 100644
--- a/vcl/source/window/floatwin.cxx
+++ b/vcl/source/window/floatwin.cxx
@@ -597,10 +597,10 @@ bool FloatingWindow::Notify( NotifyEvent& rNEvt )
void FloatingWindow::LogicInvalidate(const Rectangle* /*pRectangle*/)
{
- Dialog* pParentDlg = GetParentDialog();
- if (pParentDlg)
+ if (vcl::Window* pParent = GetParentWithLOKNotifier())
{
- pParentDlg->InvalidateFloatingWindow(mpImplData->maPos);
+ const vcl::ILibreOfficeKitNotifier* pNotifier = pParent->GetLOKNotifier();
+ pNotifier->notifyWindow(GetLOKWindowId(), "invalidate");
}
}
@@ -612,14 +612,26 @@ void FloatingWindow::StateChanged( StateChangedType nType )
}
SystemWindow::StateChanged( nType );
- Dialog* pParentDlg = GetParentDialog();
- if (pParentDlg && nType == StateChangedType::InitShow && IsVisible())
- {
- pParentDlg->InvalidateFloatingWindow(mpImplData->maPos);
- }
- else if (pParentDlg && !IsVisible())
+
+ if (vcl::Window* pParent = GetParentWithLOKNotifier())
{
- pParentDlg->CloseFloatingWindow();
+ const vcl::ILibreOfficeKitNotifier* pNotifier = pParent->GetLOKNotifier();
+ if (nType == StateChangedType::InitShow && IsVisible())
+ {
+ SetLOKNotifier(pNotifier);
+
+ std::vector<vcl::LOKPayloadItem> aItems;
+ aItems.emplace_back(std::make_pair("type", "child"));
+ aItems.emplace_back(std::make_pair("parentId", OString::number(pParent->GetLOKWindowId())));
+ aItems.emplace_back(std::make_pair("size", GetSizePixel().toString()));
+ aItems.emplace_back(std::make_pair("position", mpImplData->maPos.toString()));
+ pNotifier->notifyWindow(GetLOKWindowId(), "created", aItems);
+ }
+ else if (!IsVisible())
+ {
+ pNotifier->notifyWindow(GetLOKWindowId(), "close");
+ ReleaseLOKNotifier();
+ }
}
if ( nType == StateChangedType::ControlBackground )
@@ -729,13 +741,6 @@ void FloatingWindow::StartPopupMode( const Rectangle& rRect, FloatWinPopupFlags
GrabFocus();
}
Show( true, ShowFlags::NoActivate );
-
- if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
- {
- std::vector<vcl::LOKPayloadItem> aItems;
- aItems.emplace_back(std::make_pair("size", rRect.GetSize().toString()));
- pNotifier->notifyWindow(GetLOKWindowId(), "created", aItems);
- }
}
void FloatingWindow::StartPopupMode( ToolBox* pBox, FloatWinPopupFlags nFlags )
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index be2855057397..36faa9a32f20 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -3240,27 +3240,19 @@ vcl::LOKWindowId Window::GetLOKWindowId() const
return mpWindowImpl->mnLOKWindowId;
}
-Size Window::PaintActiveFloatingWindow(VirtualDevice& rDevice) const
... etc. - the rest is truncated
More information about the Libreoffice-commits
mailing list