00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "CKeyState.h"
00016 #include "IEventQueue.h"
00017 #include "CLog.h"
00018 #include <cstring>
00019 #include <algorithm>
00020
00021 static const KeyButton kButtonMask = (KeyButton)(IKeyState::kNumButtons - 1);
00022
00023 static const KeyID s_decomposeTable[] = {
00024
00025 0x0060, 0x0300, 0x0020, 0,
00026 0x00b4, 0x0301, 0x0020, 0,
00027 0x005e, 0x0302, 0x0020, 0,
00028 0x007e, 0x0303, 0x0020, 0,
00029 0x00a8, 0x0308, 0x0020, 0,
00030 0x00b0, 0x030a, 0x0020, 0,
00031 0x00b8, 0x0327, 0x0020, 0,
00032 0x02db, 0x0328, 0x0020, 0,
00033 0x02c7, 0x030c, 0x0020, 0,
00034 0x02d9, 0x0307, 0x0020, 0,
00035 0x02dd, 0x030b, 0x0020, 0,
00036 0x02d8, 0x0306, 0x0020, 0,
00037 0x00af, 0x0304, 0x0020, 0,
00038
00039
00040 0x00c0, 0x0300, 0x0041, 0,
00041 0x00c1, 0x0301, 0x0041, 0,
00042 0x00c2, 0x0302, 0x0041, 0,
00043 0x00c3, 0x0303, 0x0041, 0,
00044 0x00c4, 0x0308, 0x0041, 0,
00045 0x00c5, 0x030a, 0x0041, 0,
00046 0x00c7, 0x0327, 0x0043, 0,
00047 0x00c8, 0x0300, 0x0045, 0,
00048 0x00c9, 0x0301, 0x0045, 0,
00049 0x00ca, 0x0302, 0x0045, 0,
00050 0x00cb, 0x0308, 0x0045, 0,
00051 0x00cc, 0x0300, 0x0049, 0,
00052 0x00cd, 0x0301, 0x0049, 0,
00053 0x00ce, 0x0302, 0x0049, 0,
00054 0x00cf, 0x0308, 0x0049, 0,
00055 0x00d1, 0x0303, 0x004e, 0,
00056 0x00d2, 0x0300, 0x004f, 0,
00057 0x00d3, 0x0301, 0x004f, 0,
00058 0x00d4, 0x0302, 0x004f, 0,
00059 0x00d5, 0x0303, 0x004f, 0,
00060 0x00d6, 0x0308, 0x004f, 0,
00061 0x00d9, 0x0300, 0x0055, 0,
00062 0x00da, 0x0301, 0x0055, 0,
00063 0x00db, 0x0302, 0x0055, 0,
00064 0x00dc, 0x0308, 0x0055, 0,
00065 0x00dd, 0x0301, 0x0059, 0,
00066 0x00e0, 0x0300, 0x0061, 0,
00067 0x00e1, 0x0301, 0x0061, 0,
00068 0x00e2, 0x0302, 0x0061, 0,
00069 0x00e3, 0x0303, 0x0061, 0,
00070 0x00e4, 0x0308, 0x0061, 0,
00071 0x00e5, 0x030a, 0x0061, 0,
00072 0x00e7, 0x0327, 0x0063, 0,
00073 0x00e8, 0x0300, 0x0065, 0,
00074 0x00e9, 0x0301, 0x0065, 0,
00075 0x00ea, 0x0302, 0x0065, 0,
00076 0x00eb, 0x0308, 0x0065, 0,
00077 0x00ec, 0x0300, 0x0069, 0,
00078 0x00ed, 0x0301, 0x0069, 0,
00079 0x00ee, 0x0302, 0x0069, 0,
00080 0x00ef, 0x0308, 0x0069, 0,
00081 0x00f1, 0x0303, 0x006e, 0,
00082 0x00f2, 0x0300, 0x006f, 0,
00083 0x00f3, 0x0301, 0x006f, 0,
00084 0x00f4, 0x0302, 0x006f, 0,
00085 0x00f5, 0x0303, 0x006f, 0,
00086 0x00f6, 0x0308, 0x006f, 0,
00087 0x00f9, 0x0300, 0x0075, 0,
00088 0x00fa, 0x0301, 0x0075, 0,
00089 0x00fb, 0x0302, 0x0075, 0,
00090 0x00fc, 0x0308, 0x0075, 0,
00091 0x00fd, 0x0301, 0x0079, 0,
00092 0x00ff, 0x0308, 0x0079, 0,
00093
00094
00095 0x0104, 0x0328, 0x0041, 0,
00096 0x013d, 0x030c, 0x004c, 0,
00097 0x015a, 0x0301, 0x0053, 0,
00098 0x0160, 0x030c, 0x0053, 0,
00099 0x015e, 0x0327, 0x0053, 0,
00100 0x0164, 0x030c, 0x0054, 0,
00101 0x0179, 0x0301, 0x005a, 0,
00102 0x017d, 0x030c, 0x005a, 0,
00103 0x017b, 0x0307, 0x005a, 0,
00104 0x0105, 0x0328, 0x0061, 0,
00105 0x013e, 0x030c, 0x006c, 0,
00106 0x015b, 0x0301, 0x0073, 0,
00107 0x0161, 0x030c, 0x0073, 0,
00108 0x015f, 0x0327, 0x0073, 0,
00109 0x0165, 0x030c, 0x0074, 0,
00110 0x017a, 0x0301, 0x007a, 0,
00111 0x017e, 0x030c, 0x007a, 0,
00112 0x017c, 0x0307, 0x007a, 0,
00113 0x0154, 0x0301, 0x0052, 0,
00114 0x0102, 0x0306, 0x0041, 0,
00115 0x0139, 0x0301, 0x004c, 0,
00116 0x0106, 0x0301, 0x0043, 0,
00117 0x010c, 0x030c, 0x0043, 0,
00118 0x0118, 0x0328, 0x0045, 0,
00119 0x011a, 0x030c, 0x0045, 0,
00120 0x010e, 0x030c, 0x0044, 0,
00121 0x0143, 0x0301, 0x004e, 0,
00122 0x0147, 0x030c, 0x004e, 0,
00123 0x0150, 0x030b, 0x004f, 0,
00124 0x0158, 0x030c, 0x0052, 0,
00125 0x016e, 0x030a, 0x0055, 0,
00126 0x0170, 0x030b, 0x0055, 0,
00127 0x0162, 0x0327, 0x0054, 0,
00128 0x0155, 0x0301, 0x0072, 0,
00129 0x0103, 0x0306, 0x0061, 0,
00130 0x013a, 0x0301, 0x006c, 0,
00131 0x0107, 0x0301, 0x0063, 0,
00132 0x010d, 0x030c, 0x0063, 0,
00133 0x0119, 0x0328, 0x0065, 0,
00134 0x011b, 0x030c, 0x0065, 0,
00135 0x010f, 0x030c, 0x0064, 0,
00136 0x0144, 0x0301, 0x006e, 0,
00137 0x0148, 0x030c, 0x006e, 0,
00138 0x0151, 0x030b, 0x006f, 0,
00139 0x0159, 0x030c, 0x0072, 0,
00140 0x016f, 0x030a, 0x0075, 0,
00141 0x0171, 0x030b, 0x0075, 0,
00142 0x0163, 0x0327, 0x0074, 0,
00143
00144
00145 0x0124, 0x0302, 0x0048, 0,
00146 0x0130, 0x0307, 0x0049, 0,
00147 0x011e, 0x0306, 0x0047, 0,
00148 0x0134, 0x0302, 0x004a, 0,
00149 0x0125, 0x0302, 0x0068, 0,
00150 0x011f, 0x0306, 0x0067, 0,
00151 0x0135, 0x0302, 0x006a, 0,
00152 0x010a, 0x0307, 0x0043, 0,
00153 0x0108, 0x0302, 0x0043, 0,
00154 0x0120, 0x0307, 0x0047, 0,
00155 0x011c, 0x0302, 0x0047, 0,
00156 0x016c, 0x0306, 0x0055, 0,
00157 0x015c, 0x0302, 0x0053, 0,
00158 0x010b, 0x0307, 0x0063, 0,
00159 0x0109, 0x0302, 0x0063, 0,
00160 0x0121, 0x0307, 0x0067, 0,
00161 0x011d, 0x0302, 0x0067, 0,
00162 0x016d, 0x0306, 0x0075, 0,
00163 0x015d, 0x0302, 0x0073, 0,
00164
00165
00166 0x0156, 0x0327, 0x0052, 0,
00167 0x0128, 0x0303, 0x0049, 0,
00168 0x013b, 0x0327, 0x004c, 0,
00169 0x0112, 0x0304, 0x0045, 0,
00170 0x0122, 0x0327, 0x0047, 0,
00171 0x0157, 0x0327, 0x0072, 0,
00172 0x0129, 0x0303, 0x0069, 0,
00173 0x013c, 0x0327, 0x006c, 0,
00174 0x0113, 0x0304, 0x0065, 0,
00175 0x0123, 0x0327, 0x0067, 0,
00176 0x0100, 0x0304, 0x0041, 0,
00177 0x012e, 0x0328, 0x0049, 0,
00178 0x0116, 0x0307, 0x0045, 0,
00179 0x012a, 0x0304, 0x0049, 0,
00180 0x0145, 0x0327, 0x004e, 0,
00181 0x014c, 0x0304, 0x004f, 0,
00182 0x0136, 0x0327, 0x004b, 0,
00183 0x0172, 0x0328, 0x0055, 0,
00184 0x0168, 0x0303, 0x0055, 0,
00185 0x016a, 0x0304, 0x0055, 0,
00186 0x0101, 0x0304, 0x0061, 0,
00187 0x012f, 0x0328, 0x0069, 0,
00188 0x0117, 0x0307, 0x0065, 0,
00189 0x012b, 0x0304, 0x0069, 0,
00190 0x0146, 0x0327, 0x006e, 0,
00191 0x014d, 0x0304, 0x006f, 0,
00192 0x0137, 0x0327, 0x006b, 0,
00193 0x0173, 0x0328, 0x0075, 0,
00194 0x0169, 0x0303, 0x0075, 0,
00195 0x016b, 0x0304, 0x0075, 0,
00196
00197
00198 0x1e02, 0x0307, 0x0042, 0,
00199 0x1e03, 0x0307, 0x0062, 0,
00200 0x1e0a, 0x0307, 0x0044, 0,
00201 0x1e80, 0x0300, 0x0057, 0,
00202 0x1e82, 0x0301, 0x0057, 0,
00203 0x1e0b, 0x0307, 0x0064, 0,
00204 0x1ef2, 0x0300, 0x0059, 0,
00205 0x1e1e, 0x0307, 0x0046, 0,
00206 0x1e1f, 0x0307, 0x0066, 0,
00207 0x1e40, 0x0307, 0x004d, 0,
00208 0x1e41, 0x0307, 0x006d, 0,
00209 0x1e56, 0x0307, 0x0050, 0,
00210 0x1e81, 0x0300, 0x0077, 0,
00211 0x1e57, 0x0307, 0x0070, 0,
00212 0x1e83, 0x0301, 0x0077, 0,
00213 0x1e60, 0x0307, 0x0053, 0,
00214 0x1ef3, 0x0300, 0x0079, 0,
00215 0x1e84, 0x0308, 0x0057, 0,
00216 0x1e85, 0x0308, 0x0077, 0,
00217 0x1e61, 0x0307, 0x0073, 0,
00218 0x0174, 0x0302, 0x0057, 0,
00219 0x1e6a, 0x0307, 0x0054, 0,
00220 0x0176, 0x0302, 0x0059, 0,
00221 0x0175, 0x0302, 0x0077, 0,
00222 0x1e6b, 0x0307, 0x0074, 0,
00223 0x0177, 0x0302, 0x0079, 0,
00224
00225
00226 0x0178, 0x0308, 0x0059, 0,
00227
00228
00229 0x00c6, kKeyCompose, 0x0041, 0x0045, 0,
00230 0x00c1, kKeyCompose, 0x0041, 0x0027, 0,
00231 0x00c2, kKeyCompose, 0x0041, 0x0053, 0,
00232 0x00c3, kKeyCompose, 0x0041, 0x0022, 0,
00233 0x00c0, kKeyCompose, 0x0041, 0x0060, 0,
00234 0x00c5, kKeyCompose, 0x0041, 0x002a, 0,
00235 0x00c3, kKeyCompose, 0x0041, 0x007e, 0,
00236 0x00c7, kKeyCompose, 0x0043, 0x002c, 0,
00237 0x00d0, kKeyCompose, 0x0044, 0x002d, 0,
00238 0x00c9, kKeyCompose, 0x0045, 0x0027, 0,
00239 0x00ca, kKeyCompose, 0x0045, 0x0053, 0,
00240 0x00cb, kKeyCompose, 0x0045, 0x0022, 0,
00241 0x00c8, kKeyCompose, 0x0045, 0x0060, 0,
00242 0x00cd, kKeyCompose, 0x0049, 0x0027, 0,
00243 0x00ce, kKeyCompose, 0x0049, 0x0053, 0,
00244 0x00cf, kKeyCompose, 0x0049, 0x0022, 0,
00245 0x00cc, kKeyCompose, 0x0049, 0x0060, 0,
00246 0x00d1, kKeyCompose, 0x004e, 0x007e, 0,
00247 0x00d3, kKeyCompose, 0x004f, 0x0027, 0,
00248 0x00d4, kKeyCompose, 0x004f, 0x0053, 0,
00249 0x00d6, kKeyCompose, 0x004f, 0x0022, 0,
00250 0x00d2, kKeyCompose, 0x004f, 0x0060, 0,
00251 0x00d8, kKeyCompose, 0x004f, 0x002f, 0,
00252 0x00d5, kKeyCompose, 0x004f, 0x007e, 0,
00253 0x00de, kKeyCompose, 0x0054, 0x0048, 0,
00254 0x00da, kKeyCompose, 0x0055, 0x0027, 0,
00255 0x00db, kKeyCompose, 0x0055, 0x0053, 0,
00256 0x00dc, kKeyCompose, 0x0055, 0x0022, 0,
00257 0x00d9, kKeyCompose, 0x0055, 0x0060, 0,
00258 0x00dd, kKeyCompose, 0x0059, 0x0027, 0,
00259 0x00e1, kKeyCompose, 0x0061, 0x0027, 0,
00260 0x00e2, kKeyCompose, 0x0061, 0x0053, 0,
00261 0x00b4, kKeyCompose, 0x0027, 0x0027, 0,
00262 0x00e4, kKeyCompose, 0x0061, 0x0022, 0,
00263 0x00e6, kKeyCompose, 0x0061, 0x0065, 0,
00264 0x00e0, kKeyCompose, 0x0061, 0x0060, 0,
00265 0x00e5, kKeyCompose, 0x0061, 0x002a, 0,
00266 0x0040, kKeyCompose, 0x0041, 0x0054, 0,
00267 0x00e3, kKeyCompose, 0x0061, 0x007e, 0,
00268 0x005c, kKeyCompose, 0x002f, 0x002f, 0,
00269 0x007c, kKeyCompose, 0x004c, 0x0056, 0,
00270 0x007b, kKeyCompose, 0x0028, 0x002d, 0,
00271 0x007d, kKeyCompose, 0x0029, 0x002d, 0,
00272 0x005b, kKeyCompose, 0x0028, 0x0028, 0,
00273 0x005d, kKeyCompose, 0x0029, 0x0029, 0,
00274 0x00a6, kKeyCompose, 0x0042, 0x0056, 0,
00275 0x00e7, kKeyCompose, 0x0063, 0x002c, 0,
00276 0x00b8, kKeyCompose, 0x002c, 0x002c, 0,
00277 0x00a2, kKeyCompose, 0x0063, 0x002f, 0,
00278 0x00a9, kKeyCompose, 0x0028, 0x0063, 0,
00279 0x00a4, kKeyCompose, 0x006f, 0x0078, 0,
00280 0x00b0, kKeyCompose, 0x0030, 0x0053, 0,
00281 0x00a8, kKeyCompose, 0x0022, 0x0022, 0,
00282 0x00f7, kKeyCompose, 0x003a, 0x002d, 0,
00283 0x00e9, kKeyCompose, 0x0065, 0x0027, 0,
00284 0x00ea, kKeyCompose, 0x0065, 0x0053, 0,
00285 0x00eb, kKeyCompose, 0x0065, 0x0022, 0,
00286 0x00e8, kKeyCompose, 0x0065, 0x0060, 0,
00287 0x00f0, kKeyCompose, 0x0064, 0x002d, 0,
00288 0x00a1, kKeyCompose, 0x0021, 0x0021, 0,
00289 0x00ab, kKeyCompose, 0x003c, 0x003c, 0,
00290 0x00bb, kKeyCompose, 0x003e, 0x003e, 0,
00291 0x0023, kKeyCompose, 0x002b, 0x002b, 0,
00292 0x00ad, kKeyCompose, 0x002d, 0x002d, 0,
00293 0x00ed, kKeyCompose, 0x0069, 0x0027, 0,
00294 0x00ee, kKeyCompose, 0x0069, 0x0053, 0,
00295 0x00ef, kKeyCompose, 0x0069, 0x0022, 0,
00296 0x00ec, kKeyCompose, 0x0069, 0x0060, 0,
00297 0x00af, kKeyCompose, 0x002d, 0x0053, 0,
00298 0x00ba, kKeyCompose, 0x006f, 0x005f, 0,
00299 0x00b5, kKeyCompose, 0x0075, 0x002f, 0,
00300 0x00d7, kKeyCompose, 0x0078, 0x0078, 0,
00301 0x00a0, kKeyCompose, 0x0020, 0x0020, 0,
00302 0x00ac, kKeyCompose, 0x002c, 0x002d, 0,
00303 0x00f1, kKeyCompose, 0x006e, 0x007e, 0,
00304 0x00f3, kKeyCompose, 0x006f, 0x0027, 0,
00305 0x00f4, kKeyCompose, 0x006f, 0x0053, 0,
00306 0x00f6, kKeyCompose, 0x006f, 0x0022, 0,
00307 0x00f2, kKeyCompose, 0x006f, 0x0060, 0,
00308 0x00bd, kKeyCompose, 0x0031, 0x0032, 0,
00309 0x00bc, kKeyCompose, 0x0031, 0x0034, 0,
00310 0x00b9, kKeyCompose, 0x0031, 0x0053, 0,
00311 0x00aa, kKeyCompose, 0x0061, 0x005f, 0,
00312 0x00f8, kKeyCompose, 0x006f, 0x002f, 0,
00313 0x00f5, kKeyCompose, 0x006f, 0x007e, 0,
00314 0x00b6, kKeyCompose, 0x0070, 0x0021, 0,
00315 0x00b7, kKeyCompose, 0x002e, 0x002e, 0,
00316 0x00b1, kKeyCompose, 0x002b, 0x002d, 0,
00317 0x00bf, kKeyCompose, 0x003f, 0x003f, 0,
00318 0x00ae, kKeyCompose, 0x0028, 0x0072, 0,
00319 0x00a7, kKeyCompose, 0x0073, 0x006f, 0,
00320 0x00df, kKeyCompose, 0x0073, 0x0073, 0,
00321 0x00a3, kKeyCompose, 0x004c, 0x002d, 0,
00322 0x00fe, kKeyCompose, 0x0074, 0x0068, 0,
00323 0x00be, kKeyCompose, 0x0033, 0x0034, 0,
00324 0x00b3, kKeyCompose, 0x0033, 0x0053, 0,
00325 0x00b2, kKeyCompose, 0x0032, 0x0053, 0,
00326 0x00fa, kKeyCompose, 0x0075, 0x0027, 0,
00327 0x00fb, kKeyCompose, 0x0075, 0x0053, 0,
00328 0x00fc, kKeyCompose, 0x0075, 0x0022, 0,
00329 0x00f9, kKeyCompose, 0x0075, 0x0060, 0,
00330 0x00fd, kKeyCompose, 0x0079, 0x0027, 0,
00331 0x00ff, kKeyCompose, 0x0079, 0x0022, 0,
00332 0x00a5, kKeyCompose, 0x0079, 0x003d, 0,
00333
00334
00335 0
00336 };
00337
00338 static const KeyID s_numpadTable[] = {
00339 kKeyKP_Space, 0x0020,
00340 kKeyKP_Tab, kKeyTab,
00341 kKeyKP_Enter, kKeyReturn,
00342 kKeyKP_F1, kKeyF1,
00343 kKeyKP_F2, kKeyF2,
00344 kKeyKP_F3, kKeyF3,
00345 kKeyKP_F4, kKeyF4,
00346 kKeyKP_Home, kKeyHome,
00347 kKeyKP_Left, kKeyLeft,
00348 kKeyKP_Up, kKeyUp,
00349 kKeyKP_Right, kKeyRight,
00350 kKeyKP_Down, kKeyDown,
00351 kKeyKP_PageUp, kKeyPageUp,
00352 kKeyKP_PageDown, kKeyPageDown,
00353 kKeyKP_End, kKeyEnd,
00354 kKeyKP_Begin, kKeyBegin,
00355 kKeyKP_Insert, kKeyInsert,
00356 kKeyKP_Delete, kKeyDelete,
00357 kKeyKP_Equal, 0x003d,
00358 kKeyKP_Multiply, 0x002a,
00359 kKeyKP_Add, 0x002b,
00360 kKeyKP_Separator, 0x002c,
00361 kKeyKP_Subtract, 0x002d,
00362 kKeyKP_Decimal, 0x002e,
00363 kKeyKP_Divide, 0x002f,
00364 kKeyKP_0, 0x0030,
00365 kKeyKP_1, 0x0031,
00366 kKeyKP_2, 0x0032,
00367 kKeyKP_3, 0x0033,
00368 kKeyKP_4, 0x0034,
00369 kKeyKP_5, 0x0035,
00370 kKeyKP_6, 0x0036,
00371 kKeyKP_7, 0x0037,
00372 kKeyKP_8, 0x0038,
00373 kKeyKP_9, 0x0039
00374 };
00375
00376
00377
00378
00379
00380 CKeyState::CKeyState() :
00381 m_mask(0)
00382 {
00383 memset(&m_keys, 0, sizeof(m_keys));
00384 memset(&m_syntheticKeys, 0, sizeof(m_syntheticKeys));
00385 memset(&m_keyClientData, 0, sizeof(m_keyClientData));
00386 memset(&m_serverKeys, 0, sizeof(m_serverKeys));
00387 }
00388
00389 CKeyState::~CKeyState()
00390 {
00391
00392 }
00393
00394 void
00395 CKeyState::onKey(KeyButton button, bool down, KeyModifierMask newState)
00396 {
00397
00398 m_mask = newState;
00399 LOG((CLOG_DEBUG1 "new mask: 0x%04x", m_mask));
00400
00401
00402 button &= kButtonMask;
00403 if (button == 0) {
00404 return;
00405 }
00406
00407
00408 if (down) {
00409 m_keys[button] = 1;
00410 m_syntheticKeys[button] = 1;
00411 }
00412 else {
00413 m_keys[button] = 0;
00414 m_syntheticKeys[button] = 0;
00415 }
00416 }
00417
00418 void
00419 CKeyState::sendKeyEvent(
00420 void* target, bool press, bool isAutoRepeat,
00421 KeyID key, KeyModifierMask mask,
00422 SInt32 count, KeyButton button)
00423 {
00424 if (m_keyMap.isHalfDuplex(key, button)) {
00425 if (isAutoRepeat) {
00426
00427 }
00428 else {
00429 EVENTQUEUE->addEvent(CEvent(getKeyDownEvent(), target,
00430 CKeyInfo::alloc(key, mask, button, 1)));
00431 EVENTQUEUE->addEvent(CEvent(getKeyUpEvent(), target,
00432 CKeyInfo::alloc(key, mask, button, 1)));
00433 }
00434 }
00435 else {
00436 if (isAutoRepeat) {
00437 EVENTQUEUE->addEvent(CEvent(getKeyRepeatEvent(), target,
00438 CKeyInfo::alloc(key, mask, button, count)));
00439 }
00440 else if (press) {
00441 EVENTQUEUE->addEvent(CEvent(getKeyDownEvent(), target,
00442 CKeyInfo::alloc(key, mask, button, 1)));
00443 }
00444 else {
00445 EVENTQUEUE->addEvent(CEvent(getKeyUpEvent(), target,
00446 CKeyInfo::alloc(key, mask, button, 1)));
00447 }
00448 }
00449 }
00450
00451 void
00452 CKeyState::updateKeyMap()
00453 {
00454
00455 CKeyMap keyMap;
00456 getKeyMap(keyMap);
00457 m_keyMap.swap(keyMap);
00458 m_keyMap.finish();
00459
00460
00461 addCombinationEntries();
00462 addKeypadEntries();
00463 addAliasEntries();
00464 }
00465
00466 void
00467 CKeyState::updateKeyState()
00468 {
00469
00470 memset(&m_keys, 0, sizeof(m_keys));
00471 memset(&m_syntheticKeys, 0, sizeof(m_syntheticKeys));
00472 memset(&m_keyClientData, 0, sizeof(m_keyClientData));
00473 memset(&m_serverKeys, 0, sizeof(m_serverKeys));
00474 m_activeModifiers.clear();
00475
00476
00477 KeyButtonSet keysDown;
00478 pollPressedKeys(keysDown);
00479 for (KeyButtonSet::const_iterator i = keysDown.begin();
00480 i != keysDown.end(); ++i) {
00481 m_keys[*i] = 1;
00482 }
00483
00484
00485 m_mask = pollActiveModifiers();
00486
00487
00488 CAddActiveModifierContext addModifierContext(pollActiveGroup(), m_mask,
00489 m_activeModifiers);
00490 m_keyMap.foreachKey(&CKeyState::addActiveModifierCB, &addModifierContext);
00491
00492 LOG((CLOG_DEBUG1 "modifiers on update: 0x%04x", m_mask));
00493 }
00494
00495 void
00496 CKeyState::addActiveModifierCB(KeyID, SInt32 group,
00497 CKeyMap::KeyItem& keyItem, void* vcontext)
00498 {
00499 CAddActiveModifierContext* context =
00500 reinterpret_cast<CAddActiveModifierContext*>(vcontext);
00501 if (group == context->m_activeGroup &&
00502 (keyItem.m_generates & context->m_mask) != 0) {
00503 context->m_activeModifiers.insert(std::make_pair(
00504 keyItem.m_generates, keyItem));
00505 }
00506 }
00507
00508 void
00509 CKeyState::setHalfDuplexMask(KeyModifierMask mask)
00510 {
00511 m_keyMap.clearHalfDuplexModifiers();
00512 if ((mask & KeyModifierCapsLock) != 0) {
00513 m_keyMap.addHalfDuplexModifier(kKeyCapsLock);
00514 }
00515 if ((mask & KeyModifierNumLock) != 0) {
00516 m_keyMap.addHalfDuplexModifier(kKeyNumLock);
00517 }
00518 if ((mask & KeyModifierScrollLock) != 0) {
00519 m_keyMap.addHalfDuplexModifier(kKeyScrollLock);
00520 }
00521 }
00522
00523 void
00524 CKeyState::fakeKeyDown(KeyID id, KeyModifierMask mask, KeyButton serverID)
00525 {
00526
00527
00528 serverID &= kButtonMask;
00529 if (m_serverKeys[serverID] != 0) {
00530 fakeKeyRepeat(id, mask, 1, serverID);
00531 return;
00532 }
00533
00534
00535 if (isIgnoredKey(id, mask)) {
00536 LOG((CLOG_DEBUG1 "ignored key %04x %04x", id, mask));
00537 return;
00538 }
00539
00540
00541 Keystrokes keys;
00542 ModifierToKeys oldActiveModifiers = m_activeModifiers;
00543 const CKeyMap::KeyItem* keyItem =
00544 m_keyMap.mapKey(keys, id, pollActiveGroup(), m_activeModifiers,
00545 getActiveModifiersRValue(), mask, false);
00546 if (keyItem == NULL) {
00547 return;
00548 }
00549 KeyButton localID = (KeyButton)(keyItem->m_button & kButtonMask);
00550 updateModifierKeyState(localID, oldActiveModifiers, m_activeModifiers);
00551 if (localID != 0) {
00552
00553 ++m_keys[localID];
00554 ++m_syntheticKeys[localID];
00555 m_keyClientData[localID] = keyItem->m_client;
00556 m_serverKeys[serverID] = localID;
00557 }
00558
00559
00560 fakeKeys(keys, 1);
00561 }
00562
00563 void
00564 CKeyState::fakeKeyRepeat(
00565 KeyID id, KeyModifierMask mask,
00566 SInt32 count, KeyButton serverID)
00567 {
00568 serverID &= kButtonMask;
00569
00570
00571 KeyButton oldLocalID = m_serverKeys[serverID];
00572 if (oldLocalID == 0) {
00573 return;
00574 }
00575
00576
00577 Keystrokes keys;
00578 ModifierToKeys oldActiveModifiers = m_activeModifiers;
00579 const CKeyMap::KeyItem* keyItem =
00580 m_keyMap.mapKey(keys, id, pollActiveGroup(), m_activeModifiers,
00581 getActiveModifiersRValue(), mask, true);
00582 if (keyItem == NULL) {
00583 return;
00584 }
00585 KeyButton localID = (KeyButton)(keyItem->m_button & kButtonMask);
00586 if (localID == 0) {
00587 return;
00588 }
00589
00590
00591
00592
00593
00594
00595
00596 if (localID != oldLocalID) {
00597
00598
00599 for (Keystrokes::iterator index = keys.begin();
00600 index != keys.end(); ++index) {
00601 if (index->m_type == Keystroke::kButton &&
00602 index->m_data.m_button.m_button == localID) {
00603 index->m_data.m_button.m_button = oldLocalID;
00604 break;
00605 }
00606 }
00607
00608
00609 --m_keys[oldLocalID];
00610 --m_syntheticKeys[oldLocalID];
00611
00612
00613 updateModifierKeyState(localID, oldActiveModifiers, m_activeModifiers);
00614 ++m_keys[localID];
00615 ++m_syntheticKeys[localID];
00616 m_keyClientData[localID] = keyItem->m_client;
00617 m_serverKeys[serverID] = localID;
00618 }
00619
00620
00621 fakeKeys(keys, count);
00622 }
00623
00624 void
00625 CKeyState::fakeKeyUp(KeyButton serverID)
00626 {
00627
00628 KeyButton localID = m_serverKeys[serverID & kButtonMask];
00629 if (localID == 0) {
00630 return;
00631 }
00632
00633
00634 Keystrokes keys;
00635 keys.push_back(Keystroke(localID, false, false, m_keyClientData[localID]));
00636
00637
00638 --m_keys[localID];
00639 --m_syntheticKeys[localID];
00640 m_serverKeys[serverID] = 0;
00641
00642
00643 for (ModifierToKeys::iterator i = m_activeModifiers.begin();
00644 i != m_activeModifiers.end(); ++i) {
00645 if (i->second.m_button == localID && !i->second.m_lock) {
00646
00647 KeyModifierMask mask = i->first;
00648 m_activeModifiers.erase(i);
00649
00650 if (m_activeModifiers.count(mask) == 0) {
00651
00652 m_mask &= ~mask;
00653 LOG((CLOG_DEBUG1 "new state %04x", m_mask));
00654 }
00655
00656 break;
00657 }
00658 }
00659
00660
00661 fakeKeys(keys, 1);
00662 }
00663
00664 void
00665 CKeyState::fakeAllKeysUp()
00666 {
00667 Keystrokes keys;
00668 for (KeyButton i = 0; i < IKeyState::kNumButtons; ++i) {
00669 if (m_syntheticKeys[i] > 0) {
00670 keys.push_back(Keystroke(i, false, false, m_keyClientData[i]));
00671 m_keys[i] = 0;
00672 m_syntheticKeys[i] = 0;
00673 }
00674 }
00675 fakeKeys(keys, 1);
00676 memset(&m_serverKeys, 0, sizeof(m_serverKeys));
00677 m_activeModifiers.clear();
00678 m_mask = pollActiveModifiers();
00679 }
00680
00681 bool
00682 CKeyState::isKeyDown(KeyButton button) const
00683 {
00684 return (m_keys[button & kButtonMask] > 0);
00685 }
00686
00687 KeyModifierMask
00688 CKeyState::getActiveModifiers() const
00689 {
00690 return m_mask;
00691 }
00692
00693 KeyModifierMask&
00694 CKeyState::getActiveModifiersRValue()
00695 {
00696 return m_mask;
00697 }
00698
00699 SInt32
00700 CKeyState::getEffectiveGroup(SInt32 group, SInt32 offset) const
00701 {
00702 return m_keyMap.getEffectiveGroup(group, offset);
00703 }
00704
00705 bool
00706 CKeyState::isIgnoredKey(KeyID key, KeyModifierMask) const
00707 {
00708 switch (key) {
00709 case kKeyCapsLock:
00710 case kKeyNumLock:
00711 case kKeyScrollLock:
00712 return true;
00713
00714 default:
00715 return false;
00716 }
00717 }
00718
00719 KeyButton
00720 CKeyState::getButton(KeyID id, SInt32 group) const
00721 {
00722 const CKeyMap::KeyItemList* items =
00723 m_keyMap.findCompatibleKey(id, group, 0, 0);
00724 if (items == NULL) {
00725 return 0;
00726 }
00727 else {
00728 return items->back().m_button;
00729 }
00730 }
00731
00732 void
00733 CKeyState::addAliasEntries()
00734 {
00735 for (SInt32 g = 0, n = m_keyMap.getNumGroups(); g < n; ++g) {
00736
00737
00738
00739 m_keyMap.addKeyAliasEntry(kKeyTab, g,
00740 KeyModifierShift, KeyModifierShift,
00741 kKeyLeftTab,
00742 KeyModifierShift, KeyModifierShift);
00743
00744
00745
00746 m_keyMap.addKeyAliasEntry(kKeyLeftTab, g,
00747 KeyModifierShift, KeyModifierShift,
00748 kKeyTab,
00749 0, KeyModifierShift);
00750
00751
00752 m_keyMap.addKeyAliasEntry(0x20, g, 0, 0, 0xa0, 0, 0);
00753 }
00754 }
00755
00756 void
00757 CKeyState::addKeypadEntries()
00758 {
00759
00760
00761 for (SInt32 g = 0, n = m_keyMap.getNumGroups(); g < n; ++g) {
00762 for (size_t i = 0; i < sizeof(s_numpadTable) /
00763 sizeof(s_numpadTable[0]); i += 2) {
00764 m_keyMap.addKeyCombinationEntry(s_numpadTable[i], g,
00765 s_numpadTable + i + 1, 1);
00766 }
00767 }
00768 }
00769
00770 void
00771 CKeyState::addCombinationEntries()
00772 {
00773 for (SInt32 g = 0, n = m_keyMap.getNumGroups(); g < n; ++g) {
00774
00775 for (const KeyID* i = s_decomposeTable; *i != 0; ++i) {
00776
00777 UInt32 numKeys = 0;
00778 for (const KeyID* j = i; *++j != 0; ) {
00779 ++numKeys;
00780 }
00781
00782
00783 m_keyMap.addKeyCombinationEntry(*i, g, i + 1, numKeys);
00784
00785
00786 i += numKeys + 1;
00787 }
00788 }
00789 }
00790
00791 void
00792 CKeyState::fakeKeys(const Keystrokes& keys, UInt32 count)
00793 {
00794
00795 if (count == 0 || keys.empty()) {
00796 return;
00797 }
00798
00799
00800 LOG((CLOG_DEBUG1 "keystrokes:"));
00801 for (Keystrokes::const_iterator k = keys.begin(); k != keys.end(); ) {
00802 if (k->m_type == Keystroke::kButton && k->m_data.m_button.m_repeat) {
00803
00804
00805 Keystrokes::const_iterator start = k;
00806 while (count-- > 0) {
00807
00808 for (k = start; k != keys.end() &&
00809 k->m_type == Keystroke::kButton &&
00810 k->m_data.m_button.m_repeat; ++k) {
00811 fakeKey(*k);
00812 }
00813 }
00814
00815
00816
00817 }
00818 else {
00819
00820 fakeKey(*k);
00821
00822
00823 ++k;
00824 }
00825 }
00826 }
00827
00828 void
00829 CKeyState::updateModifierKeyState(KeyButton button,
00830 const ModifierToKeys& oldModifiers,
00831 const ModifierToKeys& newModifiers)
00832 {
00833
00834 CKeyMap::ButtonToKeyMap oldKeys, newKeys;
00835 for (ModifierToKeys::const_iterator i = oldModifiers.begin();
00836 i != oldModifiers.end(); ++i) {
00837 oldKeys.insert(std::make_pair(i->second.m_button, &i->second));
00838 }
00839 for (ModifierToKeys::const_iterator i = newModifiers.begin();
00840 i != newModifiers.end(); ++i) {
00841 newKeys.insert(std::make_pair(i->second.m_button, &i->second));
00842 }
00843
00844
00845 CKeyMap::ButtonToKeyMap pressed, released;
00846 std::set_difference(oldKeys.begin(), oldKeys.end(),
00847 newKeys.begin(), newKeys.end(),
00848 std::inserter(released, released.end()),
00849 ButtonToKeyLess());
00850 std::set_difference(newKeys.begin(), newKeys.end(),
00851 oldKeys.begin(), oldKeys.end(),
00852 std::inserter(pressed, pressed.end()),
00853 ButtonToKeyLess());
00854
00855
00856 for (CKeyMap::ButtonToKeyMap::const_iterator i = released.begin();
00857 i != released.end(); ++i) {
00858 if (i->first != button) {
00859 m_keys[i->first] = 0;
00860 m_syntheticKeys[i->first] = 0;
00861 }
00862 }
00863 for (CKeyMap::ButtonToKeyMap::const_iterator i = pressed.begin();
00864 i != pressed.end(); ++i) {
00865 if (i->first != button) {
00866 m_keys[i->first] = 1;
00867 m_syntheticKeys[i->first] = 1;
00868 m_keyClientData[i->first] = i->second->m_client;
00869 }
00870 }
00871 }
00872
00873
00874
00875
00876
00877
00878 CKeyState::CAddActiveModifierContext::CAddActiveModifierContext(
00879 SInt32 group, KeyModifierMask mask,
00880 ModifierToKeys& activeModifiers) :
00881 m_activeGroup(group),
00882 m_mask(mask),
00883 m_activeModifiers(activeModifiers)
00884 {
00885
00886 }