Kaydet (Commit) 522a9c0a authored tarafından Pranav Kant's avatar Pranav Kant

lokdialog: gtv: Forward key events on dialog to core

Change-Id: Icfc210b08c7f1d8ebaf9c731ed64bb128cfc4356
üst fb09d4aa
...@@ -8,9 +8,11 @@ ...@@ -8,9 +8,11 @@
*/ */
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <cmath> #include <cmath>
#include <iostream> #include <iostream>
#include <sstream>
#include <LibreOfficeKit/LibreOfficeKitGtk.h> #include <LibreOfficeKit/LibreOfficeKitGtk.h>
#include <LibreOfficeKit/LibreOfficeKitEnums.h> #include <LibreOfficeKit/LibreOfficeKitEnums.h>
...@@ -136,7 +138,7 @@ gtv_lok_dialog_signal_button(GtkWidget* pDialogDrawingArea, GdkEventButton* pEve ...@@ -136,7 +138,7 @@ gtv_lok_dialog_signal_button(GtkWidget* pDialogDrawingArea, GdkEventButton* pEve
(pEvent->y), (pEvent->y),
nCount, nCount,
nEventButton, nEventButton,
0/* Modifier */); priv->m_nKeyModifier);
break; break;
} }
...@@ -167,7 +169,7 @@ gtv_lok_dialog_signal_button(GtkWidget* pDialogDrawingArea, GdkEventButton* pEve ...@@ -167,7 +169,7 @@ gtv_lok_dialog_signal_button(GtkWidget* pDialogDrawingArea, GdkEventButton* pEve
(pEvent->y), (pEvent->y),
nCount, nCount,
nEventButton, nEventButton,
0/* Modifier */); priv->m_nKeyModifier);
break; break;
} }
default: default:
...@@ -198,7 +200,119 @@ gtv_lok_dialog_signal_motion(GtkWidget* pDialogDrawingArea, GdkEventButton* pEve ...@@ -198,7 +200,119 @@ gtv_lok_dialog_signal_motion(GtkWidget* pDialogDrawingArea, GdkEventButton* pEve
(pEvent->y), (pEvent->y),
1, 1,
priv->m_nLastButtonPressed, priv->m_nLastButtonPressed,
0/* Modifier */); priv->m_nKeyModifier);
return FALSE;
}
static gboolean
gtv_lok_dialog_signal_key(GtkWidget* pDialogDrawingArea, GdkEventKey* 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));
int nCharCode = 0;
int nKeyCode = 0;
priv->m_nKeyModifier &= KEY_MOD2;
switch (pEvent->keyval)
{
case GDK_KEY_BackSpace:
nKeyCode = com::sun::star::awt::Key::BACKSPACE;
break;
case GDK_KEY_Delete:
nKeyCode = com::sun::star::awt::Key::DELETE;
break;
case GDK_KEY_Return:
case GDK_KEY_KP_Enter:
nKeyCode = com::sun::star::awt::Key::RETURN;
break;
case GDK_KEY_Escape:
nKeyCode = com::sun::star::awt::Key::ESCAPE;
break;
case GDK_KEY_Tab:
nKeyCode = com::sun::star::awt::Key::TAB;
break;
case GDK_KEY_Down:
nKeyCode = com::sun::star::awt::Key::DOWN;
break;
case GDK_KEY_Up:
nKeyCode = com::sun::star::awt::Key::UP;
break;
case GDK_KEY_Left:
nKeyCode = com::sun::star::awt::Key::LEFT;
break;
case GDK_KEY_Right:
nKeyCode = com::sun::star::awt::Key::RIGHT;
break;
case GDK_KEY_Page_Down:
nKeyCode = com::sun::star::awt::Key::PAGEDOWN;
break;
case GDK_KEY_Page_Up:
nKeyCode = com::sun::star::awt::Key::PAGEUP;
break;
case GDK_KEY_Insert:
nKeyCode = com::sun::star::awt::Key::INSERT;
break;
case GDK_KEY_Shift_L:
case GDK_KEY_Shift_R:
if (pEvent->type == GDK_KEY_PRESS)
priv->m_nKeyModifier |= KEY_SHIFT;
break;
case GDK_KEY_Control_L:
case GDK_KEY_Control_R:
if (pEvent->type == GDK_KEY_PRESS)
priv->m_nKeyModifier |= KEY_MOD1;
break;
case GDK_KEY_Alt_L:
case GDK_KEY_Alt_R:
if (pEvent->type == GDK_KEY_PRESS)
priv->m_nKeyModifier |= KEY_MOD2;
else
priv->m_nKeyModifier &= ~KEY_MOD2;
break;
default:
if (pEvent->keyval >= GDK_KEY_F1 && pEvent->keyval <= GDK_KEY_F26)
nKeyCode = com::sun::star::awt::Key::F1 + (pEvent->keyval - GDK_KEY_F1);
else
nCharCode = gdk_keyval_to_unicode(pEvent->keyval);
}
// rsc is not public API, but should be good enough for debugging purposes.
// If this is needed for real, then probably a new param of type
// css::awt::KeyModifier is needed in postKeyEvent().
if (pEvent->state & GDK_SHIFT_MASK)
nKeyCode |= KEY_SHIFT;
if (pEvent->state & GDK_CONTROL_MASK)
nKeyCode |= KEY_MOD1;
if (priv->m_nKeyModifier & KEY_MOD2)
nKeyCode |= KEY_MOD2;
if (nKeyCode & (KEY_SHIFT | KEY_MOD1 | KEY_MOD2)) {
if (pEvent->keyval >= GDK_KEY_a && pEvent->keyval <= GDK_KEY_z)
{
nKeyCode |= 512 + (pEvent->keyval - GDK_KEY_a);
}
else if (pEvent->keyval >= GDK_KEY_A && pEvent->keyval <= GDK_KEY_Z) {
nKeyCode |= 512 + (pEvent->keyval - GDK_KEY_A);
}
else if (pEvent->keyval >= GDK_KEY_0 && pEvent->keyval <= GDK_KEY_9) {
nKeyCode |= 256 + (pEvent->keyval - GDK_KEY_0);
}
}
std::stringstream ss;
ss << "gtv_lok_dialog::postKey(" << pEvent->type << ", " << nCharCode << ", " << nKeyCode << ")";
g_info("%s", ss.str().c_str());
pDocument->pClass->postDialogKeyEvent(pDocument,
priv->dialogid,
pEvent->type == GDK_KEY_RELEASE ? LOK_KEYEVENT_KEYUP : LOK_KEYEVENT_KEYINPUT,
nCharCode,
nKeyCode);
return FALSE; return FALSE;
} }
...@@ -219,12 +333,16 @@ gtv_lok_dialog_init(GtvLokDialog* dialog) ...@@ -219,12 +333,16 @@ gtv_lok_dialog_init(GtvLokDialog* dialog)
gtk_widget_add_events(GTK_WIDGET(priv->pDialogDrawingArea), gtk_widget_add_events(GTK_WIDGET(priv->pDialogDrawingArea),
GDK_BUTTON_PRESS_MASK GDK_BUTTON_PRESS_MASK
|GDK_BUTTON_RELEASE_MASK |GDK_BUTTON_RELEASE_MASK
|GDK_BUTTON_MOTION_MASK); |GDK_BUTTON_MOTION_MASK
|GDK_KEY_PRESS_MASK
|GDK_KEY_RELEASE_MASK);
g_signal_connect(G_OBJECT(priv->pDialogDrawingArea), "draw", G_CALLBACK(gtv_lok_dialog_draw), nullptr); 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), nullptr); 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), "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); g_signal_connect(G_OBJECT(priv->pDialogDrawingArea), "motion-notify-event", G_CALLBACK(gtv_lok_dialog_signal_motion), nullptr);
g_signal_connect(G_OBJECT(priv->pDialogDrawingArea), "key-press-event", G_CALLBACK(gtv_lok_dialog_signal_key), nullptr);
g_signal_connect(G_OBJECT(priv->pDialogDrawingArea), "key-release-event", G_CALLBACK(gtv_lok_dialog_signal_key), nullptr);
gtk_container_add(GTK_CONTAINER(pContentArea), priv->pDialogDrawingArea); gtk_container_add(GTK_CONTAINER(pContentArea), priv->pDialogDrawingArea);
} }
......
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