Merge lp:~3v1n0/unity/search-bar-modifiers-filter-5.0 into lp:unity/5.0

Proposed by Marco Trevisan (Treviño)
Status: Merged
Approved by: Marco Trevisan (Treviño)
Approved revision: no longer in the source branch.
Merged at revision: 2367
Proposed branch: lp:~3v1n0/unity/search-bar-modifiers-filter-5.0
Merge into: lp:unity/5.0
Diff against target: 345 lines (+244/-32)
4 files modified
plugins/unityshell/src/IMTextEntry.cpp (+34/-26)
plugins/unityshell/src/IMTextEntry.h (+7/-6)
tests/CMakeLists.txt (+1/-0)
tests/test_im_text_entry.cpp (+202/-0)
To merge this branch: bzr merge lp:~3v1n0/unity/search-bar-modifiers-filter-5.0
Reviewer Review Type Date Requested Status
Unity Team Pending
Review via email: mp+111064@code.launchpad.net

Commit message

IMTextEntry: ignore invalid keypress when using modifiers keys.

All the key pressure when pressing the Alt or Super key should be ignored.
When pressing Ctrl key we should only allow: A key, arrow keys, Backspace or Delete keys and Home or Delete keys.

Description of the change

To post a comment you must log in.
Revision history for this message
Unity Merger (unity-merger) wrote :

The Jenkins job https://jenkins.qa.ubuntu.com/job/automerge-unity/829/console reported an error when processing this lp:~3v1n0/unity/search-bar-modifiers-filter-5.0 branch.
Not merging it.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'plugins/unityshell/src/IMTextEntry.cpp'
2--- plugins/unityshell/src/IMTextEntry.cpp 2012-03-23 07:31:01 +0000
3+++ plugins/unityshell/src/IMTextEntry.cpp 2012-06-20 12:31:20 +0000
4@@ -44,52 +44,60 @@
5 unsigned int keysym,
6 const char* character)
7 {
8- bool need_to_filter_event = TryHandleSpecial(event_type, keysym, character);
9-
10+ nux::Event const& event = nux::GetGraphicsDisplay()->GetCurrentEvent();
11+ bool need_to_filter_event = TryHandleSpecial(event);
12+
13 if (need_to_filter_event)
14 need_to_filter_event = TextEntry::InspectKeyEvent(event_type, keysym, character);
15-
16+
17 return need_to_filter_event;
18 }
19
20-bool IMTextEntry::TryHandleSpecial(unsigned int eventType, unsigned int keysym, const char* character)
21+bool IMTextEntry::TryHandleSpecial(nux::Event const& event)
22 {
23- nux::Event event = nux::GetWindowThread()->GetGraphicsDisplay().GetCurrentEvent();
24- unsigned int keyval = keysym;
25- bool shift = (event.GetKeyState() & NUX_STATE_SHIFT);
26- bool ctrl = (event.GetKeyState() & NUX_STATE_CTRL);
27-
28 /* If there is preedit, handle the event else where, but we
29 want to be able to copy/paste while ibus is active */
30 if (!preedit_.empty())
31 return true;
32
33- if (eventType != NUX_KEYDOWN)
34+ if (event.type != NUX_KEYDOWN)
35 return false;
36
37- if (((keyval == NUX_VK_x) && ctrl && !shift) ||
38- ((keyval == NUX_VK_DELETE) && shift && !ctrl))
39+ unsigned int keyval = event.GetKeySym();
40+ bool shift = event.GetKeyModifierState(KEY_MODIFIER_SHIFT);
41+ bool ctrl = event.GetKeyModifierState(KEY_MODIFIER_CTRL);
42+ bool super = event.GetKeyModifierState(KEY_MODIFIER_SUPER);
43+ bool alt = event.GetKeyModifierState(KEY_MODIFIER_ALT);
44+
45+ if ((ctrl && !shift && keyval == NUX_VK_x) || // Ctrl + X
46+ (shift && !ctrl && keyval == NUX_VK_DELETE)) // Shift + Del
47 {
48 Cut();
49 }
50- else if (((keyval == NUX_VK_c) && ctrl && (!shift)) ||
51- ((keyval == NUX_VK_INSERT) && ctrl && (!shift)))
52+ else if (ctrl && !shift && (keyval == NUX_VK_c || keyval == NUX_VK_INSERT)) // Ctrl + C / Ins
53 {
54 Copy();
55 }
56- else if (((keyval == NUX_VK_v) && ctrl && (!shift)) ||
57- ((keyval == NUX_VK_INSERT) && shift && (!ctrl)))
58+ else if ((ctrl && !shift && keyval == NUX_VK_v) || // Ctrl + V
59+ (shift && !ctrl && keyval == NUX_VK_INSERT)) // Shift + Ins
60 {
61 Paste();
62 }
63- else if (keyval == NUX_VK_TAB || keyval == NUX_VK_LEFT_TAB)
64- {
65- return true;
66- }
67- else
68- {
69- return true;
70- }
71+ else if (ctrl)
72+ {
73+ if (keyval == NUX_VK_LEFT || keyval == NUX_VK_RIGHT || // Ctrl + Move keys
74+ keyval == NUX_VK_HOME || keyval == NUX_VK_END || // Ctrl + Home / End
75+ keyval == NUX_VK_BACKSPACE || keyval == NUX_VK_DELETE || // Ctrl + Backspace / Delete
76+ keyval == NUX_VK_a) // Ctrl + A
77+ {
78+ return true;
79+ }
80+ }
81+ else if (!alt && !super)
82+ {
83+ return true;
84+ }
85+
86 return false;
87 }
88
89@@ -146,10 +154,10 @@
90 int button = nux::GetEventButton(bflags);
91
92 if (button == 2)
93- {
94+ {
95 SetCursor(XYToTextIndex(x,y));
96 Paste(true);
97- }
98+ }
99 }
100
101 bool IMTextEntry::im_preedit()
102
103=== modified file 'plugins/unityshell/src/IMTextEntry.h'
104--- plugins/unityshell/src/IMTextEntry.h 2012-03-23 07:31:01 +0000
105+++ plugins/unityshell/src/IMTextEntry.h 2012-06-20 12:31:20 +0000
106@@ -43,13 +43,14 @@
107
108 private:
109 bool InspectKeyEvent(unsigned int eventType, unsigned int keysym, const char* character);
110- bool TryHandleSpecial(unsigned int eventType, unsigned int keysym, const char* character);
111- void InsertText(std::string const& text);
112- void Cut();
113- void Copy();
114- void Paste(bool primary = false);
115-
116 void OnMouseButtonUp(int x, int y, unsigned long bflags, unsigned long kflags);
117+
118+protected:
119+ bool TryHandleSpecial(nux::Event const& event);
120+ virtual void InsertText(std::string const& text);
121+ virtual void Cut();
122+ virtual void Copy();
123+ virtual void Paste(bool primary = false);
124 };
125
126 }
127
128=== modified file 'tests/CMakeLists.txt'
129--- tests/CMakeLists.txt 2012-06-15 18:09:57 +0000
130+++ tests/CMakeLists.txt 2012-06-20 12:31:20 +0000
131@@ -203,6 +203,7 @@
132 test_main.cpp
133 test_lensview_impl.cpp
134 test_icon_loader.cpp
135+ test_im_text_entry.cpp
136 test_hud_view.cpp
137 test_resultviewgrid.cpp
138 test_single_monitor_launcher_icon.cpp
139
140=== added file 'tests/test_im_text_entry.cpp'
141--- tests/test_im_text_entry.cpp 1970-01-01 00:00:00 +0000
142+++ tests/test_im_text_entry.cpp 2012-06-20 12:31:20 +0000
143@@ -0,0 +1,202 @@
144+/*
145+ * Copyright 2012 Canonical Ltd.
146+ *
147+ * This program is free software: you can redistribute it and/or modify it
148+ * under the terms of the GNU Lesser General Public License version 3, as
149+ * published by the Free Software Foundation.
150+ *
151+ * This program is distributed in the hope that it will be useful, but
152+ * WITHOUT ANY WARRANTY; without even the implied warranties of
153+ * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
154+ * PURPOSE. See the applicable version of the GNU Lesser General Public
155+ * License for more details.
156+ *
157+ * You should have received a copy of both the GNU Lesser General Public
158+ * License version 3 along with this program. If not, see
159+ * <http://www.gnu.org/licenses/>
160+ *
161+ * Authored by: Marco Trevisan (Treviño) <3v1n0@ubuntu.com>
162+ *
163+ */
164+
165+#include <gmock/gmock.h>
166+#include "IMTextEntry.h"
167+
168+using namespace testing;
169+using namespace unity;
170+
171+namespace
172+{
173+
174+class TestEvent : public nux::Event
175+{
176+public:
177+ TestEvent(nux::KeyModifier keymod, unsigned long keysym)
178+ {
179+ type = NUX_KEYDOWN;
180+ key_modifiers = keymod;
181+ x11_keysym = keysym;
182+ }
183+
184+ TestEvent(unsigned long keysym)
185+ {
186+ type = NUX_KEYDOWN;
187+ x11_keysym = keysym;
188+ }
189+};
190+
191+class MockTextEntry : public IMTextEntry
192+{
193+public:
194+ MOCK_METHOD1(InsertText, void(std::string const&));
195+ MOCK_METHOD0(Cut, void());
196+ MOCK_METHOD0(Copy, void());
197+ MOCK_METHOD1(Paste, void(bool));
198+
199+ bool TryHandleSpecial(nux::Event const& event)
200+ {
201+ return IMTextEntry::TryHandleSpecial(event);
202+ }
203+};
204+
205+
206+TEST(TestIMTextEntry, CopyCtrlC)
207+{
208+ MockTextEntry text_entry;
209+
210+ TestEvent event(KEY_MODIFIER_CTRL, NUX_VK_c);
211+
212+ EXPECT_CALL(text_entry, Copy());
213+ EXPECT_FALSE(text_entry.TryHandleSpecial(event));
214+}
215+
216+TEST(TestIMTextEntry, CopyCtrlIns)
217+{
218+ MockTextEntry text_entry;
219+
220+ TestEvent event(KEY_MODIFIER_CTRL, NUX_VK_INSERT);
221+
222+ EXPECT_CALL(text_entry, Copy());
223+ EXPECT_FALSE(text_entry.TryHandleSpecial(event));
224+}
225+
226+TEST(TestIMTextEntry, PasteCtrlV)
227+{
228+ MockTextEntry text_entry;
229+
230+ TestEvent event(KEY_MODIFIER_CTRL, NUX_VK_v);
231+
232+ EXPECT_CALL(text_entry, Paste(false));
233+ EXPECT_FALSE(text_entry.TryHandleSpecial(event));
234+}
235+
236+TEST(TestIMTextEntry, PasteShiftIns)
237+{
238+ MockTextEntry text_entry;
239+
240+ TestEvent event(KEY_MODIFIER_SHIFT, NUX_VK_INSERT);
241+
242+ EXPECT_CALL(text_entry, Paste(false));
243+ EXPECT_FALSE(text_entry.TryHandleSpecial(event));
244+}
245+
246+TEST(TestIMTextEntry, CutCtrlX)
247+{
248+ MockTextEntry text_entry;
249+
250+ TestEvent event(KEY_MODIFIER_CTRL, NUX_VK_x);
251+
252+ EXPECT_CALL(text_entry, Cut());
253+ EXPECT_FALSE(text_entry.TryHandleSpecial(event));
254+}
255+
256+TEST(TestIMTextEntry, CutShiftDel)
257+{
258+ MockTextEntry text_entry;
259+
260+ TestEvent event(KEY_MODIFIER_SHIFT, NUX_VK_DELETE);
261+
262+ EXPECT_CALL(text_entry, Cut());
263+ EXPECT_FALSE(text_entry.TryHandleSpecial(event));
264+}
265+
266+TEST(TestIMTextEntry, CtrlMoveKeys)
267+{
268+ MockTextEntry text_entry;
269+
270+ TestEvent left(KEY_MODIFIER_CTRL, NUX_VK_LEFT);
271+ EXPECT_TRUE(text_entry.TryHandleSpecial(left));
272+
273+ TestEvent right(KEY_MODIFIER_CTRL, NUX_VK_RIGHT);
274+ EXPECT_TRUE(text_entry.TryHandleSpecial(right));
275+
276+ TestEvent home(KEY_MODIFIER_CTRL, NUX_VK_HOME);
277+ EXPECT_TRUE(text_entry.TryHandleSpecial(home));
278+
279+ TestEvent end(KEY_MODIFIER_CTRL, NUX_VK_END);
280+ EXPECT_TRUE(text_entry.TryHandleSpecial(end));
281+}
282+
283+TEST(TestIMTextEntry, CtrlDeleteKeys)
284+{
285+ MockTextEntry text_entry;
286+
287+ TestEvent del(KEY_MODIFIER_CTRL, NUX_VK_DELETE);
288+ EXPECT_TRUE(text_entry.TryHandleSpecial(del));
289+
290+ TestEvent backspace(KEY_MODIFIER_CTRL, NUX_VK_BACKSPACE);
291+ EXPECT_TRUE(text_entry.TryHandleSpecial(backspace));
292+}
293+
294+TEST(TestIMTextEntry, CtrlA)
295+{
296+ MockTextEntry text_entry;
297+
298+ TestEvent selectall(KEY_MODIFIER_CTRL, NUX_VK_a);
299+ EXPECT_TRUE(text_entry.TryHandleSpecial(selectall));
300+}
301+
302+TEST(TestIMTextEntry, CtrlKeybindings)
303+{
304+ MockTextEntry text_entry;
305+
306+ std::vector<unsigned long> allowed_keys { NUX_VK_a, NUX_VK_BACKSPACE,
307+ NUX_VK_LEFT, NUX_VK_RIGHT,
308+ NUX_VK_HOME, NUX_VK_END,
309+ NUX_VK_BACKSPACE, NUX_VK_DELETE };
310+
311+ for (unsigned long keysym = 0; keysym < XK_VoidSymbol; ++keysym)
312+ {
313+ bool should_be_handled = false;
314+
315+ if (std::find(allowed_keys.begin(), allowed_keys.end(), keysym) != allowed_keys.end())
316+ should_be_handled = true;
317+
318+ TestEvent event(KEY_MODIFIER_CTRL, keysym);
319+ EXPECT_EQ(text_entry.TryHandleSpecial(event), should_be_handled);
320+ }
321+}
322+
323+TEST(TestIMTextEntry, AltKeybindings)
324+{
325+ MockTextEntry text_entry;
326+
327+ for (unsigned long keysym = 0; keysym < XK_VoidSymbol; ++keysym)
328+ {
329+ TestEvent event(KEY_MODIFIER_ALT, keysym);
330+ EXPECT_FALSE(text_entry.TryHandleSpecial(event));
331+ }
332+}
333+
334+TEST(TestIMTextEntry, SuperKeybindings)
335+{
336+ MockTextEntry text_entry;
337+
338+ for (unsigned long keysym = 0; keysym < XK_VoidSymbol; ++keysym)
339+ {
340+ TestEvent event(KEY_MODIFIER_SUPER, keysym);
341+ EXPECT_FALSE(text_entry.TryHandleSpecial(event));
342+ }
343+}
344+
345+}

Subscribers

People subscribed via source and target branches