1b6fc5261ca50150655fa3c6d39479cce6bb4e7a
[platform/core/uifw/dali-adaptor.git] / adaptors / x11 / key-impl-x.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include "key-impl.h"
20
21 // EXTERNAL INCLUDES
22 #include <utilX.h>
23 #include <map>
24 #include <string.h>
25 #include <iostream>
26
27 #include <dali/integration-api/debug.h>
28
29 namespace Dali
30 {
31
32 const KEY DALI_KEY_INVALID          = -1;
33 const KEY DALI_KEY_ESCAPE           = 9;
34 const KEY DALI_KEY_BACKSPACE        = 22;
35 const KEY DALI_KEY_CURSOR_UP        = 111;
36 const KEY DALI_KEY_CURSOR_LEFT      = 113;
37 const KEY DALI_KEY_CURSOR_RIGHT     = 114;
38 const KEY DALI_KEY_CURSOR_DOWN      = 116;
39 const KEY DALI_KEY_BACK             = 166;
40 const KEY DALI_KEY_CAMERA           = 167;
41 const KEY DALI_KEY_CONFIG           = 168;
42 const KEY DALI_KEY_POWER            = 169;
43 const KEY DALI_KEY_PAUSE            = 170;
44 const KEY DALI_KEY_CANCEL           = 171;
45 const KEY DALI_KEY_PLAY_CD          = 172;
46 const KEY DALI_KEY_STOP_CD          = 173;
47 const KEY DALI_KEY_PAUSE_CD         = 174;
48 const KEY DALI_KEY_NEXT_SONG        = 175;
49 const KEY DALI_KEY_PREVIOUS_SONG    = 176;
50 const KEY DALI_KEY_REWIND           = 177;
51 const KEY DALI_KEY_FASTFORWARD      = 178;
52 const KEY DALI_KEY_MEDIA            = 179;
53 const KEY DALI_KEY_PLAY_PAUSE       = 180;
54 const KEY DALI_KEY_MUTE             = 181;
55 const KEY DALI_KEY_SEND             = 182;
56 const KEY DALI_KEY_SELECT           = 183;
57 const KEY DALI_KEY_END              = DALI_KEY_BACK;
58 const KEY DALI_KEY_MENU             = DALI_KEY_SEND;
59 const KEY DALI_KEY_HOME             = DALI_KEY_SELECT;
60 const KEY DALI_KEY_HOMEPAGE         = 187;
61 const KEY DALI_KEY_WEBPAGE          = 188;
62 const KEY DALI_KEY_MAIL             = 189;
63 const KEY DALI_KEY_SCREENSAVER      = 190;
64 const KEY DALI_KEY_BRIGHTNESS_UP    = 191;
65 const KEY DALI_KEY_BRIGHTNESS_DOWN  = 192;
66 const KEY DALI_KEY_SOFT_KBD         = 193;
67 const KEY DALI_KEY_QUICK_PANEL      = 194;
68 const KEY DALI_KEY_TASK_SWITCH      = 195;
69 const KEY DALI_KEY_APPS             = 196;
70 const KEY DALI_KEY_SEARCH           = 197;
71 const KEY DALI_KEY_VOICE            = 198;
72 const KEY DALI_KEY_LANGUAGE         = 199;
73 const KEY DALI_KEY_VOLUME_UP        = 200;
74 const KEY DALI_KEY_VOLUME_DOWN      = 201;
75
76 namespace Internal
77 {
78
79 namespace Adaptor
80 {
81
82 namespace KeyLookup
83 {
84
85 namespace
86 {
87
88 struct KeyLookup
89 {
90   const char* keyName;      ///< X string representation
91   const int   daliKeyCode;  ///< Dali Enum Representation
92   const bool  deviceButton; ///< Whether the key is from a button on the device
93 };
94
95 // matches a DALI_KEY enum, to a X key name
96 KeyLookup KeyLookupTable[]=
97 {
98   // more than one key name can be assigned to a single dali-key code
99   // e.g. Menu and KEY_MENU("FS86KeyMenu") are both assigned to  DALI_KEY_MENU
100
101   { "Escape",                DALI_KEY_ESCAPE,          false },  // item not defined in utilX
102   { "Menu",                  DALI_KEY_MENU,            false },  // item not defined in utilX
103
104   // Now the key names are used as literal string not defined symbols,
105   // since these definition in utilX.h is deprecated and we're guided not to use them
106   { "XF86Camera",            DALI_KEY_CAMERA,          false },
107   { "XF86Camera_Full",       DALI_KEY_CONFIG,          false },
108   { "XF86PowerOff",          DALI_KEY_POWER,           true  },
109   { "XF86Standby",           DALI_KEY_PAUSE,           false },
110   { "Cancel",                DALI_KEY_CANCEL,          false },
111   { "XF86AudioPlay",         DALI_KEY_PLAY_CD,         false },
112   { "XF86AudioStop",         DALI_KEY_STOP_CD,         false },
113   { "XF86AudioPause",        DALI_KEY_PAUSE_CD,        false },
114   { "XF86AudioNext",         DALI_KEY_NEXT_SONG,       false },
115   { "XF86AudioPrev",         DALI_KEY_PREVIOUS_SONG,   false },
116   { "XF86AudioRewind",       DALI_KEY_REWIND,          false },
117   { "XF86AudioForward",      DALI_KEY_FASTFORWARD,     false },
118   { "XF86AudioMedia",        DALI_KEY_MEDIA,           false },
119   { "XF86AudioPlayPause",    DALI_KEY_PLAY_PAUSE,      false },
120   { "XF86AudioMute",         DALI_KEY_MUTE,            false },
121   { "XF86Send",              DALI_KEY_SEND,            true  },
122   { "XF86Phone",             DALI_KEY_SELECT,          true  },
123   { "XF86Stop",              DALI_KEY_END,             true  },
124   { "XF86Menu",              DALI_KEY_MENU,            true  },
125   { "XF86Home",              DALI_KEY_HOME,            true  },
126   { "XF86Back",              DALI_KEY_BACK,            true  },
127   { "XF86HomePage",          DALI_KEY_HOMEPAGE,        false },
128   { "XF86WWW",               DALI_KEY_WEBPAGE,         false },
129   { "XF86Mail",              DALI_KEY_MAIL,            false },
130   { "XF86ScreenSaver",       DALI_KEY_SCREENSAVER,     false },
131   { "XF86MonBrightnessUp",   DALI_KEY_BRIGHTNESS_UP,   false },
132   { "XF86MonBrightnessDown", DALI_KEY_BRIGHTNESS_DOWN, false },
133   { "XF86SoftKBD",           DALI_KEY_SOFT_KBD,        false },
134   { "XF86QuickPanel",        DALI_KEY_QUICK_PANEL,     false },
135   { "XF86TaskPane",          DALI_KEY_TASK_SWITCH,     false },
136   { "XF86Apps",              DALI_KEY_APPS,            false },
137   { "XF86Search",            DALI_KEY_SEARCH,          false },
138   { "XF86Voice",             DALI_KEY_VOICE,           false },
139   { "Hangul",                DALI_KEY_LANGUAGE,        false },
140   { "XF86AudioRaiseVolume",  DALI_KEY_VOLUME_UP,       true  },
141   { "XF86AudioLowerVolume",  DALI_KEY_VOLUME_DOWN,     true  },
142
143   { "BackSpace",             DALI_KEY_BACKSPACE,       false },
144   { "Left",                  DALI_KEY_CURSOR_LEFT,     false },
145   { "Right",                 DALI_KEY_CURSOR_RIGHT,    false }
146 };
147
148 const std::size_t KEY_LOOKUP_COUNT = (sizeof( KeyLookupTable))/ (sizeof(KeyLookup));
149
150 class KeyMap
151 {
152   public:
153
154   KeyMap():
155   mLookup( cmpString )
156   {
157     // create the lookup
158     for( size_t i = 0; i < KEY_LOOKUP_COUNT ; ++i )
159     {
160       const KeyLookup&  keyLookup( KeyLookupTable[i] );
161       mLookup[ keyLookup.keyName  ] = DaliKeyType( keyLookup.daliKeyCode, keyLookup.deviceButton );
162     }
163   }
164
165   int GetDaliKeyEnum( const char* keyName ) const
166   {
167     Lookup::const_iterator i = mLookup.find( keyName );
168     if( i == mLookup.end() )
169     {
170       return -1;
171     }
172     else
173     {
174       return (*i).second.first;
175     }
176   }
177
178   const char* GetKeyName( int daliKeyCode ) const
179   {
180     for( size_t i = 0; i < KEY_LOOKUP_COUNT ; ++i )
181     {
182       const KeyLookup& keyLookup( KeyLookupTable[i] );
183       if( keyLookup.daliKeyCode == daliKeyCode )
184       {
185         return keyLookup.keyName;
186       }
187     }
188     return "";
189   }
190
191   bool IsDeviceButton( const char* keyName ) const
192   {
193     Lookup::const_iterator i = mLookup.find( keyName );
194     if ( i != mLookup.end() )
195     {
196       return (*i).second.second;
197     }
198     return false;
199   }
200
201   private:
202
203   /**
204    * compare function, to compare string by pointer
205    */
206   static bool cmpString( const char* a, const char* b)
207   {
208     return strcmp(a, b) < 0;
209   }
210
211   typedef std::pair< int, bool > DaliKeyType;
212   typedef std::map<const char* /* key name */, DaliKeyType /* key code */, bool(*) ( char const* a, char const* b) > Lookup;
213   Lookup mLookup;
214
215 };
216 const KeyMap globalKeyLookup;
217
218 } // un-named name space
219
220 bool IsKey( const Dali::KeyEvent& keyEvent, Dali::KEY daliKey)
221 {
222   int key = globalKeyLookup.GetDaliKeyEnum( keyEvent.keyPressedName.c_str() );
223   return daliKey == key;
224 }
225
226 bool IsDeviceButton( const char* keyName )
227 {
228   return globalKeyLookup.IsDeviceButton( keyName );
229 }
230
231 const char* GetKeyName( Dali::KEY daliKey )
232 {
233   return globalKeyLookup.GetKeyName( daliKey );
234 }
235
236 } // namespace KeyLookup
237
238 } // namespace Adaptor
239
240 } // namespace Internal
241
242 } // namespace Dali