35ca23b014d45f9c4a5d9110d50f84708992c07f
[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 "FocusController.h"
24 #include "Frame.h"
25 #include "PlatformKeyboardEvent.h"
26 #include "webkitwebviewprivate.h"
27 #include <wtf/text/CString.h>
28
29 using namespace WebCore;
30
31 namespace WebKit {
32
33 Frame* WebViewInputMethodFilter::focusedOrMainFrame()
34 {
35     ASSERT(m_webView);
36     Page* page = core(m_webView);
37     if (!page)
38         return 0;
39
40     return page->focusController()->focusedOrMainFrame();
41 }
42
43 void WebViewInputMethodFilter::setWebView(WebKitWebView* webView)
44 {
45     m_webView = webView;
46     GtkInputMethodFilter::setWidget(GTK_WIDGET(webView));
47 }
48
49 bool WebViewInputMethodFilter::canEdit()
50 {
51     Frame* frame = focusedOrMainFrame();
52     return frame && frame->editor()->canEdit();
53 }
54
55 bool WebViewInputMethodFilter::sendSimpleKeyEvent(GdkEventKey* event, WTF::String simpleString)
56 {
57     PlatformKeyboardEvent platformEvent(event, CompositionResults(simpleString));
58     return focusedOrMainFrame()->eventHandler()->keyEvent(platformEvent);
59 }
60
61 bool WebViewInputMethodFilter::sendKeyEventWithCompositionResults(GdkEventKey* event, ResultsToSend resultsToSend)
62 {
63     PlatformKeyboardEvent platformEvent(event, CompositionResults(resultsToSend & Composition ? m_confirmedComposition : String(),
64                                                                   resultsToSend & Preedit ? m_preedit : String(),
65                                                                   m_cursorOffset));
66     return focusedOrMainFrame()->eventHandler()->keyEvent(platformEvent);
67 }
68
69 void WebViewInputMethodFilter::confirmCompositionText(String text)
70 {
71     Frame* frame = focusedOrMainFrame();
72     if (!frame || !frame->editor()->canEdit())
73         return;
74
75     if (text.isNull()) {
76         confirmCurrentComposition();
77         return;
78     }
79     frame->editor()->confirmComposition(m_confirmedComposition);
80 }
81
82 void WebViewInputMethodFilter::confirmCurrentComposition()
83 {
84     Frame* frame = focusedOrMainFrame();
85     if (!frame || !frame->editor()->canEdit())
86         return;
87     frame->editor()->confirmComposition();
88 }
89
90 void WebViewInputMethodFilter::cancelCurrentComposition()
91 {
92     Frame* frame = focusedOrMainFrame();
93     if (!frame || !frame->editor()->canEdit())
94         return;
95     frame->editor()->cancelComposition();
96 }
97
98 void WebViewInputMethodFilter::setPreedit(String newPreedit, int cursorOffset)
99 {
100     Frame* frame = focusedOrMainFrame();
101     if (!frame || !frame->editor()->canEdit())
102         return;
103
104     // TODO: We should parse the PangoAttrList that we get from the IM context here.
105     Vector<CompositionUnderline> underlines;
106     underlines.append(CompositionUnderline(0, newPreedit.length(), Color(1, 1, 1), false));
107     frame->editor()->setComposition(newPreedit, underlines, m_cursorOffset, m_cursorOffset);
108 }
109
110 } // namespace WebKit