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
=== modified file 'plugins/unityshell/src/IMTextEntry.cpp'
--- plugins/unityshell/src/IMTextEntry.cpp 2012-03-23 07:31:01 +0000
+++ plugins/unityshell/src/IMTextEntry.cpp 2012-06-20 12:31:20 +0000
@@ -44,52 +44,60 @@
44 unsigned int keysym,44 unsigned int keysym,
45 const char* character)45 const char* character)
46{46{
47 bool need_to_filter_event = TryHandleSpecial(event_type, keysym, character);47 nux::Event const& event = nux::GetGraphicsDisplay()->GetCurrentEvent();
48 48 bool need_to_filter_event = TryHandleSpecial(event);
49
49 if (need_to_filter_event)50 if (need_to_filter_event)
50 need_to_filter_event = TextEntry::InspectKeyEvent(event_type, keysym, character);51 need_to_filter_event = TextEntry::InspectKeyEvent(event_type, keysym, character);
51 52
52 return need_to_filter_event;53 return need_to_filter_event;
53}54}
5455
55bool IMTextEntry::TryHandleSpecial(unsigned int eventType, unsigned int keysym, const char* character)56bool IMTextEntry::TryHandleSpecial(nux::Event const& event)
56{57{
57 nux::Event event = nux::GetWindowThread()->GetGraphicsDisplay().GetCurrentEvent();
58 unsigned int keyval = keysym;
59 bool shift = (event.GetKeyState() & NUX_STATE_SHIFT);
60 bool ctrl = (event.GetKeyState() & NUX_STATE_CTRL);
61
62 /* If there is preedit, handle the event else where, but we58 /* If there is preedit, handle the event else where, but we
63 want to be able to copy/paste while ibus is active */59 want to be able to copy/paste while ibus is active */
64 if (!preedit_.empty())60 if (!preedit_.empty())
65 return true;61 return true;
6662
67 if (eventType != NUX_KEYDOWN)63 if (event.type != NUX_KEYDOWN)
68 return false;64 return false;
6965
70 if (((keyval == NUX_VK_x) && ctrl && !shift) ||66 unsigned int keyval = event.GetKeySym();
71 ((keyval == NUX_VK_DELETE) && shift && !ctrl))67 bool shift = event.GetKeyModifierState(KEY_MODIFIER_SHIFT);
68 bool ctrl = event.GetKeyModifierState(KEY_MODIFIER_CTRL);
69 bool super = event.GetKeyModifierState(KEY_MODIFIER_SUPER);
70 bool alt = event.GetKeyModifierState(KEY_MODIFIER_ALT);
71
72 if ((ctrl && !shift && keyval == NUX_VK_x) || // Ctrl + X
73 (shift && !ctrl && keyval == NUX_VK_DELETE)) // Shift + Del
72 {74 {
73 Cut();75 Cut();
74 }76 }
75 else if (((keyval == NUX_VK_c) && ctrl && (!shift)) ||77 else if (ctrl && !shift && (keyval == NUX_VK_c || keyval == NUX_VK_INSERT)) // Ctrl + C / Ins
76 ((keyval == NUX_VK_INSERT) && ctrl && (!shift)))
77 {78 {
78 Copy();79 Copy();
79 }80 }
80 else if (((keyval == NUX_VK_v) && ctrl && (!shift)) ||81 else if ((ctrl && !shift && keyval == NUX_VK_v) || // Ctrl + V
81 ((keyval == NUX_VK_INSERT) && shift && (!ctrl)))82 (shift && !ctrl && keyval == NUX_VK_INSERT)) // Shift + Ins
82 {83 {
83 Paste();84 Paste();
84 }85 }
85 else if (keyval == NUX_VK_TAB || keyval == NUX_VK_LEFT_TAB)86 else if (ctrl)
86 {87 {
87 return true;88 if (keyval == NUX_VK_LEFT || keyval == NUX_VK_RIGHT || // Ctrl + Move keys
88 }89 keyval == NUX_VK_HOME || keyval == NUX_VK_END || // Ctrl + Home / End
89 else90 keyval == NUX_VK_BACKSPACE || keyval == NUX_VK_DELETE || // Ctrl + Backspace / Delete
90 {91 keyval == NUX_VK_a) // Ctrl + A
91 return true;92 {
92 }93 return true;
94 }
95 }
96 else if (!alt && !super)
97 {
98 return true;
99 }
100
93 return false;101 return false;
94}102}
95103
@@ -146,10 +154,10 @@
146 int button = nux::GetEventButton(bflags);154 int button = nux::GetEventButton(bflags);
147155
148 if (button == 2)156 if (button == 2)
149 { 157 {
150 SetCursor(XYToTextIndex(x,y));158 SetCursor(XYToTextIndex(x,y));
151 Paste(true);159 Paste(true);
152 } 160 }
153}161}
154162
155bool IMTextEntry::im_preedit()163bool IMTextEntry::im_preedit()
156164
=== modified file 'plugins/unityshell/src/IMTextEntry.h'
--- plugins/unityshell/src/IMTextEntry.h 2012-03-23 07:31:01 +0000
+++ plugins/unityshell/src/IMTextEntry.h 2012-06-20 12:31:20 +0000
@@ -43,13 +43,14 @@
4343
44private:44private:
45 bool InspectKeyEvent(unsigned int eventType, unsigned int keysym, const char* character);45 bool InspectKeyEvent(unsigned int eventType, unsigned int keysym, const char* character);
46 bool TryHandleSpecial(unsigned int eventType, unsigned int keysym, const char* character);
47 void InsertText(std::string const& text);
48 void Cut();
49 void Copy();
50 void Paste(bool primary = false);
51
52 void OnMouseButtonUp(int x, int y, unsigned long bflags, unsigned long kflags);46 void OnMouseButtonUp(int x, int y, unsigned long bflags, unsigned long kflags);
47
48protected:
49 bool TryHandleSpecial(nux::Event const& event);
50 virtual void InsertText(std::string const& text);
51 virtual void Cut();
52 virtual void Copy();
53 virtual void Paste(bool primary = false);
53};54};
5455
55}56}
5657
=== modified file 'tests/CMakeLists.txt'
--- tests/CMakeLists.txt 2012-06-15 18:09:57 +0000
+++ tests/CMakeLists.txt 2012-06-20 12:31:20 +0000
@@ -203,6 +203,7 @@
203 test_main.cpp203 test_main.cpp
204 test_lensview_impl.cpp204 test_lensview_impl.cpp
205 test_icon_loader.cpp205 test_icon_loader.cpp
206 test_im_text_entry.cpp
206 test_hud_view.cpp207 test_hud_view.cpp
207 test_resultviewgrid.cpp208 test_resultviewgrid.cpp
208 test_single_monitor_launcher_icon.cpp209 test_single_monitor_launcher_icon.cpp
209210
=== added file 'tests/test_im_text_entry.cpp'
--- tests/test_im_text_entry.cpp 1970-01-01 00:00:00 +0000
+++ tests/test_im_text_entry.cpp 2012-06-20 12:31:20 +0000
@@ -0,0 +1,202 @@
1/*
2 * Copyright 2012 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License version 3, as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranties of
10 * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
11 * PURPOSE. See the applicable version of the GNU Lesser General Public
12 * License for more details.
13 *
14 * You should have received a copy of both the GNU Lesser General Public
15 * License version 3 along with this program. If not, see
16 * <http://www.gnu.org/licenses/>
17 *
18 * Authored by: Marco Trevisan (Treviño) <3v1n0@ubuntu.com>
19 *
20 */
21
22#include <gmock/gmock.h>
23#include "IMTextEntry.h"
24
25using namespace testing;
26using namespace unity;
27
28namespace
29{
30
31class TestEvent : public nux::Event
32{
33public:
34 TestEvent(nux::KeyModifier keymod, unsigned long keysym)
35 {
36 type = NUX_KEYDOWN;
37 key_modifiers = keymod;
38 x11_keysym = keysym;
39 }
40
41 TestEvent(unsigned long keysym)
42 {
43 type = NUX_KEYDOWN;
44 x11_keysym = keysym;
45 }
46};
47
48class MockTextEntry : public IMTextEntry
49{
50public:
51 MOCK_METHOD1(InsertText, void(std::string const&));
52 MOCK_METHOD0(Cut, void());
53 MOCK_METHOD0(Copy, void());
54 MOCK_METHOD1(Paste, void(bool));
55
56 bool TryHandleSpecial(nux::Event const& event)
57 {
58 return IMTextEntry::TryHandleSpecial(event);
59 }
60};
61
62
63TEST(TestIMTextEntry, CopyCtrlC)
64{
65 MockTextEntry text_entry;
66
67 TestEvent event(KEY_MODIFIER_CTRL, NUX_VK_c);
68
69 EXPECT_CALL(text_entry, Copy());
70 EXPECT_FALSE(text_entry.TryHandleSpecial(event));
71}
72
73TEST(TestIMTextEntry, CopyCtrlIns)
74{
75 MockTextEntry text_entry;
76
77 TestEvent event(KEY_MODIFIER_CTRL, NUX_VK_INSERT);
78
79 EXPECT_CALL(text_entry, Copy());
80 EXPECT_FALSE(text_entry.TryHandleSpecial(event));
81}
82
83TEST(TestIMTextEntry, PasteCtrlV)
84{
85 MockTextEntry text_entry;
86
87 TestEvent event(KEY_MODIFIER_CTRL, NUX_VK_v);
88
89 EXPECT_CALL(text_entry, Paste(false));
90 EXPECT_FALSE(text_entry.TryHandleSpecial(event));
91}
92
93TEST(TestIMTextEntry, PasteShiftIns)
94{
95 MockTextEntry text_entry;
96
97 TestEvent event(KEY_MODIFIER_SHIFT, NUX_VK_INSERT);
98
99 EXPECT_CALL(text_entry, Paste(false));
100 EXPECT_FALSE(text_entry.TryHandleSpecial(event));
101}
102
103TEST(TestIMTextEntry, CutCtrlX)
104{
105 MockTextEntry text_entry;
106
107 TestEvent event(KEY_MODIFIER_CTRL, NUX_VK_x);
108
109 EXPECT_CALL(text_entry, Cut());
110 EXPECT_FALSE(text_entry.TryHandleSpecial(event));
111}
112
113TEST(TestIMTextEntry, CutShiftDel)
114{
115 MockTextEntry text_entry;
116
117 TestEvent event(KEY_MODIFIER_SHIFT, NUX_VK_DELETE);
118
119 EXPECT_CALL(text_entry, Cut());
120 EXPECT_FALSE(text_entry.TryHandleSpecial(event));
121}
122
123TEST(TestIMTextEntry, CtrlMoveKeys)
124{
125 MockTextEntry text_entry;
126
127 TestEvent left(KEY_MODIFIER_CTRL, NUX_VK_LEFT);
128 EXPECT_TRUE(text_entry.TryHandleSpecial(left));
129
130 TestEvent right(KEY_MODIFIER_CTRL, NUX_VK_RIGHT);
131 EXPECT_TRUE(text_entry.TryHandleSpecial(right));
132
133 TestEvent home(KEY_MODIFIER_CTRL, NUX_VK_HOME);
134 EXPECT_TRUE(text_entry.TryHandleSpecial(home));
135
136 TestEvent end(KEY_MODIFIER_CTRL, NUX_VK_END);
137 EXPECT_TRUE(text_entry.TryHandleSpecial(end));
138}
139
140TEST(TestIMTextEntry, CtrlDeleteKeys)
141{
142 MockTextEntry text_entry;
143
144 TestEvent del(KEY_MODIFIER_CTRL, NUX_VK_DELETE);
145 EXPECT_TRUE(text_entry.TryHandleSpecial(del));
146
147 TestEvent backspace(KEY_MODIFIER_CTRL, NUX_VK_BACKSPACE);
148 EXPECT_TRUE(text_entry.TryHandleSpecial(backspace));
149}
150
151TEST(TestIMTextEntry, CtrlA)
152{
153 MockTextEntry text_entry;
154
155 TestEvent selectall(KEY_MODIFIER_CTRL, NUX_VK_a);
156 EXPECT_TRUE(text_entry.TryHandleSpecial(selectall));
157}
158
159TEST(TestIMTextEntry, CtrlKeybindings)
160{
161 MockTextEntry text_entry;
162
163 std::vector<unsigned long> allowed_keys { NUX_VK_a, NUX_VK_BACKSPACE,
164 NUX_VK_LEFT, NUX_VK_RIGHT,
165 NUX_VK_HOME, NUX_VK_END,
166 NUX_VK_BACKSPACE, NUX_VK_DELETE };
167
168 for (unsigned long keysym = 0; keysym < XK_VoidSymbol; ++keysym)
169 {
170 bool should_be_handled = false;
171
172 if (std::find(allowed_keys.begin(), allowed_keys.end(), keysym) != allowed_keys.end())
173 should_be_handled = true;
174
175 TestEvent event(KEY_MODIFIER_CTRL, keysym);
176 EXPECT_EQ(text_entry.TryHandleSpecial(event), should_be_handled);
177 }
178}
179
180TEST(TestIMTextEntry, AltKeybindings)
181{
182 MockTextEntry text_entry;
183
184 for (unsigned long keysym = 0; keysym < XK_VoidSymbol; ++keysym)
185 {
186 TestEvent event(KEY_MODIFIER_ALT, keysym);
187 EXPECT_FALSE(text_entry.TryHandleSpecial(event));
188 }
189}
190
191TEST(TestIMTextEntry, SuperKeybindings)
192{
193 MockTextEntry text_entry;
194
195 for (unsigned long keysym = 0; keysym < XK_VoidSymbol; ++keysym)
196 {
197 TestEvent event(KEY_MODIFIER_SUPER, keysym);
198 EXPECT_FALSE(text_entry.TryHandleSpecial(event));
199 }
200}
201
202}

Subscribers

People subscribed via source and target branches