From 80bd29066be627d5c1cccfe04cdd4e163c76cc11 Mon Sep 17 00:00:00 2001 From: Pranav Kant Date: Sat, 29 Jul 2017 17:53:11 +0530 Subject: 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 --- .../qa/gtktiledviewer/gtv-lok-dialog.cxx | 48 ++++++++++++++++++---- 1 file changed, 40 insertions(+), 8 deletions(-) (limited to 'libreofficekit') diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx index 24773ebfc9a0..2a620b58000d 100644 --- a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx @@ -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); } -- cgit