fbe8f363e0c3c4a8d702a80320a1fe257c9a1cd8
[WebKit-https.git] / Source / WebKit / gtk / WebCoreSupport / WebViewInputMethodFilter.cpp
1 /*
2  * Copyright (C) 2012 Igalia S.L.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #include "config.h"
21 #include "WebViewInputMethodFilter.h"
22
23 #include "Editor.h"
24 #include "FocusController.h"
25 #include "Frame.h"
26 #include "PlatformKeyboardEvent.h"
27 #include "webkitwebviewprivate.h"
28 #include <wtf/text/CString.h>
29
30 using namespace WebCore;
31
32 namespace WebKit {
33
34 Frame* WebViewInputMethodFilter::focusedOrMainFrame()
35 {
36     ASSERT(m_webView);
37     Page* page = core(m_webView);
38     if (!page)
39         return 0;
40
41     return page->focusController()->focusedOrMainFrame();
42 }
43
44 void WebViewInputMethodFilter::setWebView(WebKitWebView* webView)
45 {
46     m_webView = webView;
47     GtkInputMethodFilter::setWidget(GTK_WIDGET(webView));
48 }
49
50 bool WebViewInputMethodFilter::canEdit()
51 {
52     Frame* frame = focusedOrMainFrame();
53     return frame && frame->editor()->canEdit();
54 }
55
56 bool WebViewInputMethodFilter::sendSimpleKeyEvent(GdkEventKey* event, WTF::String simpleString, EventFakedForComposition)
57 {
58     PlatformKeyboardEvent platformEvent(event, CompositionResults(simpleString));
59     return focusedOrMainFrame()->eventHandler()->keyEvent(platformEvent);
60 }
61
62 bool WebViewInputMethodFilter::sendKeyEventWithCompositionResults(GdkEventKey* event, ResultsToSend resultsToSend, EventFakedForComposition)
63 {
64     PlatformKeyboardEvent platformEvent(event, CompositionResults(CompositionResults::WillSendCompositionResultsSoon));
65     if (!focusedOrMainFrame()->eventHandler()->keyEvent(platformEvent))
66         return false;
67
68     if (resultsToSend & Composition && !m_confirmedComposition.isNull())
69         confirmCompositionText(m_confirmedComposition);
70     if (resultsToSend & Preedit && !m_preedit.isNull())
71         setPreedit(m_preedit, m_cursorOffset);
72     return true;
73 }
74
75 void WebViewInputMethodFilter::confirmCompositionText(String text)
76 {
77     Frame* frame = focusedOrMainFrame();
78     if (!frame || !frame->editor()->canEdit())
79         return;
80
81     if (text.isNull()) {
82         confirmCurrentComposition();
83         return;
84     }
85     frame->editor()->confirmComposition(m_confirmedComposition);
86 }
87
88 void WebViewInputMethodFilter::confirmCurrentComposition()
89 {
90     Frame* frame = focusedOrMainFrame();
91     if (!frame || !frame->editor()->canEdit())
92         return;
93     frame->editor()->confirmComposition();
94 }
95
96 void WebViewInputMethodFilter::cancelCurrentComposition()
97 {
98     Frame* frame = focusedOrMainFrame();
99     if (!frame || !frame->editor()->canEdit())
100         return;
101     frame->editor()->cancelComposition();
102 }
103
104 void WebViewInputMethodFilter::setPreedit(String newPreedit, int cursorOffset)
105 {
106     Frame* frame = focusedOrMainFrame();
107     if (!frame || !frame->editor()->canEdit())
108         return;
109
110     // TODO: We should parse the PangoAttrList that we get from the IM context here.
111     Vector<CompositionUnderline> underlines;
112     underlines.append(CompositionUnderline(0, newPreedit.length(), Color(1, 1, 1), false));
113     frame->editor()->setComposition(newPreedit, underlines, m_cursorOffset, m_cursorOffset);
114 }
115
116 } // namespace WebKit