Kaydet (Commit) 9f6bf0c0 authored tarafından Pranav Kant's avatar Pranav Kant

lokdialog: Forward mouse events to vcl; enable mouse move

The current implementation works well - the mouse events are properly
handled by the opened dialog changing the dialog states.

However, since the uno commands (dialog IDs) are different from what is
returned by LOK_CALLBACK_DIALOG_INVALIDATE, the invalidation doesn't
instantaneously, so one have to make the dialog window out-of-focus and
then again back to focus to trigger the paint and see the updated dialog
state.

The mouse coordinates are forwarded in pixels as of now.

Enable mouse GDK Motion mask too for mouse move operation.

Change-Id: Ia915f734e8cbf4586da2b70da5840fe1568b39bd
üst 47111c3a
......@@ -82,7 +82,7 @@ public:
void paintDialog(VirtualDevice& rDevice);
void LogicMouseButtonDown(const MouseEvent& rMouseEvent);
void LogicMouseButtonUp(const MouseEvent& rMouseEvent);
void LogicMouseButtonMove(const MouseEvent& rMouseEvent);
void LogicMouseMove(const MouseEvent& rMouseEvent);
protected:
explicit Dialog( WindowType nType );
......
......@@ -34,6 +34,7 @@ struct GtvLokDialogPrivate
guint32 m_nLastButtonPressTime;
guint32 m_nLastButtonReleaseTime;
guint32 m_nKeyModifier;
guint32 m_nLastButtonPressed;
gchar* dialogid;
};
......@@ -125,11 +126,12 @@ gtv_lok_dialog_signal_button(GtkWidget* pDialogDrawingArea, GdkEventButton* pEve
nEventButton = MOUSE_RIGHT;
break;
}
priv->m_nLastButtonPressed = nEventButton;
pDocument->pClass->postDialogMouseEvent(pDocument,
priv->dialogid,
LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
pixelToTwip(pEvent->x),
pixelToTwip(pEvent->y),
(pEvent->x),
(pEvent->y),
nCount,
nEventButton,
0/* Modifier */);
......@@ -155,12 +157,12 @@ gtv_lok_dialog_signal_button(GtkWidget* pDialogDrawingArea, GdkEventButton* pEve
nEventButton = MOUSE_RIGHT;
break;
}
priv->m_nLastButtonPressed = nEventButton;
pDocument->pClass->postDialogMouseEvent(pDocument,
priv->dialogid,
LOK_MOUSEEVENT_MOUSEBUTTONUP,
pixelToTwip(pEvent->x),
pixelToTwip(pEvent->y),
(pEvent->x),
(pEvent->y),
nCount,
nEventButton,
0/* Modifier */);
......@@ -172,6 +174,33 @@ gtv_lok_dialog_signal_button(GtkWidget* pDialogDrawingArea, GdkEventButton* pEve
return FALSE;
}
static gboolean
gtv_lok_dialog_signal_motion(GtkWidget* pDialogDrawingArea, GdkEventButton* pEvent)
{
GtvLokDialog* pDialog = GTV_LOK_DIALOG(gtk_widget_get_toplevel(pDialogDrawingArea));
GtvLokDialogPrivate* priv = getPrivate(pDialog);
GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_window_get_transient_for(GTK_WINDOW(pDialog)));
LibreOfficeKitDocument* pDocument = lok_doc_view_get_document(LOK_DOC_VIEW(window->lokdocview));
g_info("lok_dialog_signal_button: %d, %d (in twips: %d, %d)",
(int)pEvent->x, (int)pEvent->y,
(int)pixelToTwip(pEvent->x),
(int)pixelToTwip(pEvent->y));
gtk_widget_grab_focus(GTK_WIDGET(pDialog));
pDocument->pClass->postDialogMouseEvent(pDocument,
priv->dialogid,
LOK_MOUSEEVENT_MOUSEMOVE,
(pEvent->x),
(pEvent->y),
1,
priv->m_nLastButtonPressed,
0/* Modifier */);
return FALSE;
}
static void
gtv_lok_dialog_init(GtvLokDialog* dialog)
{
......@@ -183,14 +212,17 @@ gtv_lok_dialog_init(GtvLokDialog* dialog)
priv->m_nLastButtonPressTime = 0;
priv->m_nLastButtonReleaseTime = 0;
priv->m_nKeyModifier = 0;
priv->m_nLastButtonPressed = 0;
gtk_widget_add_events(GTK_WIDGET(priv->pDialogDrawingArea),
GDK_BUTTON_PRESS_MASK
|GDK_BUTTON_RELEASE_MASK);
|GDK_BUTTON_RELEASE_MASK
|GDK_BUTTON_MOTION_MASK);
g_signal_connect(G_OBJECT(priv->pDialogDrawingArea), "draw", G_CALLBACK(gtv_lok_dialog_draw), nullptr);
g_signal_connect(G_OBJECT(priv->pDialogDrawingArea), "button-press-event", G_CALLBACK(gtv_lok_dialog_signal_button), dialog);
g_signal_connect(G_OBJECT(priv->pDialogDrawingArea), "button-release-event", G_CALLBACK(gtv_lok_dialog_signal_button), dialog);
g_signal_connect(G_OBJECT(priv->pDialogDrawingArea), "button-press-event", G_CALLBACK(gtv_lok_dialog_signal_button), nullptr);
g_signal_connect(G_OBJECT(priv->pDialogDrawingArea), "button-release-event", G_CALLBACK(gtv_lok_dialog_signal_button), nullptr);
g_signal_connect(G_OBJECT(priv->pDialogDrawingArea), "motion-notify-event", G_CALLBACK(gtv_lok_dialog_signal_motion), nullptr);
gtk_container_add(GTK_CONTAINER(pContentArea), priv->pDialogDrawingArea);
}
......
......@@ -3702,7 +3702,7 @@ void SwXTextDocument::postDialogMouseEvent(const vcl::DialogID& rDialogID, int n
pDialog->LogicMouseButtonUp(aEvent);
break;
case LOK_MOUSEEVENT_MOUSEMOVE:
//pDialog->LogicMouseMove(aEvent);
pDialog->LogicMouseMove(aEvent);
break;
default:
assert(false);
......
......@@ -36,6 +36,8 @@
#include <rtl/strbuf.hxx>
#include <sal/log.hxx>
#include "window.h"
#include <vcl/builder.hxx>
#include <vcl/layout.hxx>
#include <vcl/svapp.hxx>
......@@ -877,12 +879,7 @@ void Dialog::LogicMouseButtonDown(const MouseEvent& rMouseEvent)
// When we're not doing tiled rendering, then positions must be passed as pixels.
assert(comphelper::LibreOfficeKit::isActive());
Point aPoint = GetPointerPosPixel();
SetLastMousePos(rMouseEvent.GetPosPixel());
MouseButtonDown(rMouseEvent);
SetPointerPosPixel(aPoint);
ImplWindowFrameProc(this, SalEvent::ExternalMouseButtonDown, &rMouseEvent);
}
void Dialog::LogicMouseButtonUp(const MouseEvent& rMouseEvent)
......@@ -890,25 +887,15 @@ void Dialog::LogicMouseButtonUp(const MouseEvent& rMouseEvent)
// When we're not doing tiled rendering, then positions must be passed as pixels.
assert(comphelper::LibreOfficeKit::isActive());
Point aPoint = GetPointerPosPixel();
SetLastMousePos(rMouseEvent.GetPosPixel());
MouseButtonUp(rMouseEvent);
SetPointerPosPixel(aPoint);
ImplWindowFrameProc(this, SalEvent::ExternalMouseButtonUp, &rMouseEvent);
}
void Dialog::LogicMouseButtonMove(const MouseEvent& rMouseEvent)
void Dialog::LogicMouseMove(const MouseEvent& rMouseEvent)
{
// When we're not doing tiled rendering, then positions must be passed as pixels.
assert(comphelper::LibreOfficeKit::isActive());
Point aPoint = GetPointerPosPixel();
SetLastMousePos(rMouseEvent.GetPosPixel());
MouseMove(rMouseEvent);
SetPointerPosPixel(aPoint);
ImplWindowFrameProc(this, SalEvent::ExternalMouseMove, &rMouseEvent);
}
void Dialog::ensureRepaint()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment