00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "mmsinput/mmsinputlisthread.h"
00034
00035 #include <string.h>
00036 #include <errno.h>
00037
00038 #ifndef __LIS_DEBUG__
00039 #undef MSG2OUT
00040 #define MSG2OUT(ident, msg...)
00041 #endif
00042
00043
00044
00045 MMSKeySymbol MMSInputLISThread_extkeycodes [] = {
00046 MMSKEY_UNKNOWN,
00047 MMSKEY_ESCAPE,
00048 MMSKEY_1,
00049 MMSKEY_2,
00050 MMSKEY_3,
00051 MMSKEY_4,
00052 MMSKEY_5,
00053 MMSKEY_6,
00054 MMSKEY_7,
00055 MMSKEY_8,
00056 MMSKEY_9,
00057 MMSKEY_0,
00058 MMSKEY_MINUS_SIGN,
00059 MMSKEY_EQUALS_SIGN,
00060 MMSKEY_BACKSPACE,
00061 MMSKEY_TAB,
00062 MMSKEY_SMALL_Q,
00063 MMSKEY_SMALL_W,
00064 MMSKEY_SMALL_E,
00065 MMSKEY_SMALL_R,
00066 MMSKEY_SMALL_T,
00067 MMSKEY_SMALL_Y,
00068 MMSKEY_SMALL_U,
00069 MMSKEY_SMALL_I,
00070 MMSKEY_SMALL_O,
00071 MMSKEY_SMALL_P,
00072 MMSKEY_SQUARE_BRACKET_LEFT,
00073 MMSKEY_SQUARE_BRACKET_RIGHT,
00074 MMSKEY_RETURN,
00075 MMSKEY_CONTROL,
00076 MMSKEY_SMALL_A,
00077 MMSKEY_SMALL_S,
00078 MMSKEY_SMALL_D,
00079 MMSKEY_SMALL_F,
00080 MMSKEY_SMALL_G,
00081 MMSKEY_SMALL_H,
00082 MMSKEY_SMALL_J,
00083 MMSKEY_SMALL_K,
00084 MMSKEY_SMALL_L,
00085 MMSKEY_SEMICOLON,
00086 MMSKEY_UNKNOWN,
00087 MMSKEY_UNKNOWN,
00088 MMSKEY_SHIFT,
00089 MMSKEY_BACKSLASH,
00090 MMSKEY_SMALL_Z,
00091 MMSKEY_SMALL_X,
00092 MMSKEY_SMALL_C,
00093 MMSKEY_SMALL_V,
00094 MMSKEY_SMALL_B,
00095 MMSKEY_SMALL_N,
00096 MMSKEY_SMALL_M,
00097 MMSKEY_COMMA,
00098 MMSKEY_PERIOD,
00099 MMSKEY_SLASH,
00100 MMSKEY_SHIFT,
00101 MMSKEY_UNKNOWN,
00102 MMSKEY_ALT,
00103 MMSKEY_SPACE,
00104 MMSKEY_CAPS_LOCK,
00105 MMSKEY_F1,
00106 MMSKEY_F2,
00107 MMSKEY_F3,
00108 MMSKEY_F4,
00109 MMSKEY_F5,
00110 MMSKEY_F6,
00111 MMSKEY_F7,
00112 MMSKEY_F8,
00113 MMSKEY_F9,
00114 MMSKEY_F10,
00115 MMSKEY_NUM_LOCK,
00116 MMSKEY_SCROLL_LOCK,
00117 MMSKEY_UNKNOWN,
00118 MMSKEY_UNKNOWN,
00119 MMSKEY_UNKNOWN,
00120 MMSKEY_UNKNOWN,
00121 MMSKEY_UNKNOWN,
00122 MMSKEY_UNKNOWN,
00123 MMSKEY_UNKNOWN,
00124 MMSKEY_UNKNOWN,
00125 MMSKEY_UNKNOWN,
00126 MMSKEY_UNKNOWN,
00127 MMSKEY_UNKNOWN,
00128 MMSKEY_UNKNOWN,
00129 MMSKEY_UNKNOWN,
00130 MMSKEY_BACKSLASH,
00131 MMSKEY_UNKNOWN,
00132 MMSKEY_LESS_THAN_SIGN,
00133 MMSKEY_F11,
00134 MMSKEY_F12,
00135 MMSKEY_UNKNOWN,
00136 MMSKEY_UNKNOWN,
00137 MMSKEY_UNKNOWN,
00138 MMSKEY_UNKNOWN,
00139 MMSKEY_UNKNOWN,
00140 MMSKEY_UNKNOWN,
00141 MMSKEY_UNKNOWN,
00142 MMSKEY_RETURN,
00143 MMSKEY_CONTROL,
00144 MMSKEY_UNKNOWN,
00145 MMSKEY_PRINT,
00146 MMSKEY_ALTGR,
00147 MMSKEY_UNKNOWN,
00148 MMSKEY_HOME,
00149 MMSKEY_CURSOR_UP,
00150 MMSKEY_PAGE_UP,
00151 MMSKEY_CURSOR_LEFT,
00152 MMSKEY_CURSOR_RIGHT,
00153 MMSKEY_END,
00154 MMSKEY_CURSOR_DOWN,
00155 MMSKEY_PAGE_DOWN,
00156 MMSKEY_INSERT,
00157 MMSKEY_DELETE,
00158 MMSKEY_UNKNOWN,
00159 MMSKEY_MUTE,
00160 MMSKEY_VOLUME_DOWN,
00161 MMSKEY_VOLUME_UP,
00162 MMSKEY_POWER,
00163 MMSKEY_UNKNOWN,
00164 MMSKEY_UNKNOWN,
00165 MMSKEY_PAUSE,
00166 MMSKEY_UNKNOWN,
00167 MMSKEY_UNKNOWN,
00168 MMSKEY_UNKNOWN,
00169 MMSKEY_UNKNOWN,
00170 MMSKEY_UNKNOWN,
00171 MMSKEY_META,
00172 MMSKEY_META,
00173 MMSKEY_SUPER,
00174 MMSKEY_STOP,
00175 MMSKEY_UNKNOWN,
00176 MMSKEY_UNKNOWN,
00177 MMSKEY_UNKNOWN,
00178 MMSKEY_UNKNOWN,
00179 MMSKEY_UNKNOWN,
00180 MMSKEY_UNKNOWN,
00181 MMSKEY_UNKNOWN,
00182 MMSKEY_UNKNOWN,
00183 MMSKEY_UNKNOWN,
00184 MMSKEY_HELP,
00185 MMSKEY_MENU,
00186 MMSKEY_CALCULATOR,
00187 MMSKEY_SETUP,
00188 MMSKEY_UNKNOWN,
00189 MMSKEY_UNKNOWN,
00190 MMSKEY_UNKNOWN,
00191 MMSKEY_UNKNOWN,
00192 MMSKEY_UNKNOWN,
00193 MMSKEY_UNKNOWN,
00194 MMSKEY_CUSTOM1,
00195 MMSKEY_CUSTOM2,
00196 MMSKEY_INTERNET,
00197 MMSKEY_UNKNOWN,
00198 MMSKEY_UNKNOWN,
00199 MMSKEY_UNKNOWN,
00200 MMSKEY_UNKNOWN,
00201 MMSKEY_MAIL,
00202 MMSKEY_UNKNOWN,
00203 MMSKEY_UNKNOWN,
00204 MMSKEY_BACK,
00205 MMSKEY_FORWARD,
00206 MMSKEY_EJECT,
00207 MMSKEY_EJECT,
00208 MMSKEY_EJECT,
00209 MMSKEY_NEXT,
00210 MMSKEY_PLAYPAUSE,
00211 MMSKEY_PREVIOUS,
00212 MMSKEY_STOP,
00213 MMSKEY_RECORD,
00214 MMSKEY_REWIND,
00215 MMSKEY_PHONE,
00216 MMSKEY_UNKNOWN,
00217 MMSKEY_SETUP,
00218 MMSKEY_UNKNOWN,
00219 MMSKEY_SHUFFLE,
00220 MMSKEY_EXIT,
00221 MMSKEY_UNKNOWN,
00222 MMSKEY_EDITOR,
00223 MMSKEY_PAGE_UP,
00224 MMSKEY_PAGE_DOWN,
00225 MMSKEY_UNKNOWN,
00226 MMSKEY_UNKNOWN,
00227 MMSKEY_UNKNOWN,
00228 MMSKEY_UNKNOWN,
00229 MMSKEY_UNKNOWN,
00230 MMSKEY_UNKNOWN,
00231 MMSKEY_UNKNOWN,
00232 MMSKEY_UNKNOWN,
00233 MMSKEY_UNKNOWN,
00234 MMSKEY_UNKNOWN,
00235 MMSKEY_UNKNOWN,
00236 MMSKEY_UNKNOWN,
00237 MMSKEY_UNKNOWN,
00238 MMSKEY_UNKNOWN,
00239 MMSKEY_UNKNOWN,
00240 MMSKEY_UNKNOWN,
00241 MMSKEY_UNKNOWN,
00242 MMSKEY_UNKNOWN,
00243 MMSKEY_UNKNOWN,
00244 MMSKEY_UNKNOWN,
00245 MMSKEY_UNKNOWN,
00246 MMSKEY_PLAY,
00247 MMSKEY_PAUSE,
00248 MMSKEY_CUSTOM3,
00249 MMSKEY_CUSTOM4,
00250 MMSKEY_UNKNOWN,
00251 MMSKEY_UNKNOWN,
00252 MMSKEY_UNKNOWN,
00253 MMSKEY_PLAY,
00254 MMSKEY_FASTFORWARD,
00255 MMSKEY_UNKNOWN,
00256 MMSKEY_PRINT,
00257 MMSKEY_UNKNOWN,
00258 MMSKEY_UNKNOWN,
00259 MMSKEY_AUDIO,
00260 MMSKEY_HELP,
00261 MMSKEY_MAIL,
00262 MMSKEY_UNKNOWN,
00263 MMSKEY_UNKNOWN,
00264 MMSKEY_UNKNOWN,
00265 MMSKEY_UNKNOWN,
00266 MMSKEY_UNKNOWN,
00267 MMSKEY_UNKNOWN,
00268 MMSKEY_UNKNOWN,
00269 MMSKEY_CANCEL,
00270 MMSKEY_UNKNOWN,
00271 MMSKEY_UNKNOWN,
00272 MMSKEY_UNKNOWN,
00273 MMSKEY_UNKNOWN,
00274 MMSKEY_UNKNOWN,
00275 MMSKEY_UNKNOWN,
00276 MMSKEY_UNKNOWN,
00277 MMSKEY_UNKNOWN,
00278 MMSKEY_UNKNOWN,
00279 MMSKEY_UNKNOWN,
00280 MMSKEY_UNKNOWN,
00281 MMSKEY_UNKNOWN,
00282 MMSKEY_UNKNOWN,
00283 MMSKEY_UNKNOWN,
00284 MMSKEY_UNKNOWN,
00285 MMSKEY_UNKNOWN,
00286 MMSKEY_UNKNOWN,
00287 MMSKEY_UNKNOWN,
00288 MMSKEY_UNKNOWN,
00289 MMSKEY_UNKNOWN,
00290 MMSKEY_UNKNOWN,
00291 MMSKEY_UNKNOWN,
00292 MMSKEY_UNKNOWN,
00293 MMSKEY_UNKNOWN,
00294 MMSKEY_UNKNOWN,
00295 MMSKEY_UNKNOWN,
00296 MMSKEY_UNKNOWN,
00297 MMSKEY_UNKNOWN,
00298 MMSKEY_UNKNOWN,
00299 MMSKEY_UNKNOWN,
00300 MMSKEY_UNKNOWN,
00301 MMSKEY_UNKNOWN,
00302 MMSKEY_UNKNOWN,
00303 MMSKEY_UNKNOWN,
00304 MMSKEY_UNKNOWN,
00305 MMSKEY_UNKNOWN,
00306 MMSKEY_UNKNOWN,
00307 MMSKEY_UNKNOWN,
00308 MMSKEY_UNKNOWN,
00309 MMSKEY_UNKNOWN,
00310 MMSKEY_UNKNOWN,
00311 MMSKEY_UNKNOWN,
00312 MMSKEY_UNKNOWN,
00313 MMSKEY_UNKNOWN,
00314 MMSKEY_UNKNOWN,
00315 MMSKEY_UNKNOWN,
00316 MMSKEY_UNKNOWN,
00317 MMSKEY_UNKNOWN,
00318 MMSKEY_UNKNOWN,
00319 MMSKEY_UNKNOWN,
00320 MMSKEY_UNKNOWN,
00321 MMSKEY_UNKNOWN,
00322 MMSKEY_UNKNOWN,
00323 MMSKEY_UNKNOWN,
00324 MMSKEY_UNKNOWN,
00325 MMSKEY_UNKNOWN,
00326 MMSKEY_UNKNOWN,
00327 MMSKEY_UNKNOWN,
00328 MMSKEY_UNKNOWN,
00329 MMSKEY_UNKNOWN,
00330 MMSKEY_UNKNOWN,
00331 MMSKEY_UNKNOWN,
00332 MMSKEY_UNKNOWN,
00333 MMSKEY_UNKNOWN,
00334 MMSKEY_UNKNOWN,
00335 MMSKEY_UNKNOWN,
00336 MMSKEY_UNKNOWN,
00337 MMSKEY_UNKNOWN,
00338 MMSKEY_UNKNOWN,
00339 MMSKEY_UNKNOWN,
00340 MMSKEY_UNKNOWN,
00341 MMSKEY_UNKNOWN,
00342 MMSKEY_UNKNOWN,
00343 MMSKEY_UNKNOWN,
00344 MMSKEY_UNKNOWN,
00345 MMSKEY_UNKNOWN,
00346 MMSKEY_UNKNOWN,
00347 MMSKEY_UNKNOWN,
00348 MMSKEY_UNKNOWN,
00349 MMSKEY_UNKNOWN,
00350 MMSKEY_UNKNOWN,
00351 MMSKEY_UNKNOWN,
00352 MMSKEY_UNKNOWN,
00353 MMSKEY_UNKNOWN,
00354 MMSKEY_UNKNOWN,
00355 MMSKEY_UNKNOWN,
00356 MMSKEY_UNKNOWN,
00357 MMSKEY_UNKNOWN,
00358 MMSKEY_UNKNOWN,
00359 MMSKEY_UNKNOWN,
00360 MMSKEY_UNKNOWN,
00361 MMSKEY_UNKNOWN,
00362 MMSKEY_UNKNOWN,
00363 MMSKEY_UNKNOWN,
00364 MMSKEY_UNKNOWN,
00365 MMSKEY_UNKNOWN,
00366 MMSKEY_UNKNOWN,
00367 MMSKEY_UNKNOWN,
00368 MMSKEY_UNKNOWN,
00369 MMSKEY_UNKNOWN,
00370 MMSKEY_UNKNOWN,
00371 MMSKEY_UNKNOWN,
00372 MMSKEY_UNKNOWN,
00373 MMSKEY_UNKNOWN,
00374 MMSKEY_UNKNOWN,
00375 MMSKEY_UNKNOWN,
00376 MMSKEY_UNKNOWN,
00377 MMSKEY_UNKNOWN,
00378 MMSKEY_UNKNOWN,
00379 MMSKEY_UNKNOWN,
00380 MMSKEY_UNKNOWN,
00381 MMSKEY_UNKNOWN,
00382 MMSKEY_UNKNOWN,
00383 MMSKEY_UNKNOWN,
00384 MMSKEY_UNKNOWN,
00385 MMSKEY_UNKNOWN,
00386 MMSKEY_UNKNOWN,
00387 MMSKEY_UNKNOWN,
00388 MMSKEY_UNKNOWN,
00389 MMSKEY_UNKNOWN,
00390 MMSKEY_UNKNOWN,
00391 MMSKEY_UNKNOWN,
00392 MMSKEY_UNKNOWN,
00393 MMSKEY_UNKNOWN,
00394 MMSKEY_UNKNOWN,
00395 MMSKEY_UNKNOWN,
00396 MMSKEY_UNKNOWN,
00397 MMSKEY_UNKNOWN,
00398
00399
00400 MMSKEY_OK,
00401 MMSKEY_SELECT,
00402 MMSKEY_GOTO,
00403 MMSKEY_CLEAR,
00404 MMSKEY_POWER2,
00405 MMSKEY_OPTION,
00406 MMSKEY_INFO,
00407 MMSKEY_TIME,
00408 MMSKEY_VENDOR,
00409 MMSKEY_ARCHIVE,
00410 MMSKEY_PROGRAM,
00411 MMSKEY_CHANNEL,
00412 MMSKEY_FAVORITES,
00413 MMSKEY_EPG,
00414 MMSKEY_PVR,
00415 MMSKEY_MHP,
00416 MMSKEY_LANGUAGE,
00417 MMSKEY_TITLE,
00418 MMSKEY_SUBTITLE,
00419 MMSKEY_ANGLE,
00420 MMSKEY_ZOOM,
00421 MMSKEY_MODE,
00422 MMSKEY_KEYBOARD,
00423 MMSKEY_SCREEN,
00424 MMSKEY_PC,
00425 MMSKEY_TV,
00426 MMSKEY_TV2,
00427 MMSKEY_VCR,
00428 MMSKEY_VCR2,
00429 MMSKEY_SAT,
00430 MMSKEY_SAT2,
00431 MMSKEY_CD,
00432 MMSKEY_TAPE,
00433 MMSKEY_RADIO,
00434 MMSKEY_TUNER,
00435 MMSKEY_PLAYER,
00436 MMSKEY_TEXT,
00437 MMSKEY_DVD,
00438 MMSKEY_AUX,
00439 MMSKEY_MP3,
00440 MMSKEY_AUDIO,
00441 MMSKEY_VIDEO,
00442 MMSKEY_DIRECTORY,
00443 MMSKEY_LIST,
00444 MMSKEY_MEMO,
00445 MMSKEY_CALENDAR,
00446 MMSKEY_RED,
00447 MMSKEY_GREEN,
00448 MMSKEY_YELLOW,
00449 MMSKEY_BLUE,
00450 MMSKEY_CHANNEL_UP,
00451 MMSKEY_CHANNEL_DOWN,
00452 MMSKEY_FIRST,
00453 MMSKEY_LAST,
00454 MMSKEY_AB,
00455 MMSKEY_NEXT,
00456 MMSKEY_RESTART,
00457 MMSKEY_SLOW,
00458 MMSKEY_SHUFFLE,
00459 MMSKEY_FASTFORWARD,
00460 MMSKEY_PREVIOUS,
00461 MMSKEY_NEXT,
00462 MMSKEY_DIGITS,
00463 MMSKEY_TEEN,
00464 MMSKEY_TWEN,
00465 MMSKEY_BREAK
00466 };
00467
00468
00469
00470 MMSInputLISThread::MMSInputLISThread(MMSInputLISHandler *handler, int kb_fd) {
00471 this->handler = handler;
00472 this->kb_fd = kb_fd;
00473 this->dv_fd = -1;
00474
00475 this->shift_pressed = false;
00476 this->altgr_pressed = false;
00477 this->is_caps_lock = false;
00478 this->button_pressed = false;
00479
00480 this->lastX = this->lastY = -1;
00481 }
00482
00483 MMSInputLISThread::MMSInputLISThread(MMSInputLISHandler *handler, MMSINPUTLISHANDLER_DEV *device) {
00484 this->handler = handler;
00485 this->kb_fd = -1;
00486 this->dv_fd = -1;
00487 this->device = *device;
00488 }
00489
00490 MMSInputLISThread::~MMSInputLISThread() {
00491 }
00492
00493 bool MMSInputLISThread::openDevice() {
00494
00495 closeDevice();
00496
00497 MSG2OUT("MMSINPUTMANAGER", "Opening %s, type=%s (%s)\n",
00498 this->device.name.c_str(),
00499 this->device.type.c_str(),
00500 this->device.desc.c_str());
00501
00502
00503 if ((this->dv_fd = open(this->device.name.c_str(), O_RDWR)) < 0) {
00504 MSG2OUT("MMSINPUTMANAGER", "could not open device: %s\n", this->device.name.c_str());
00505 this->dv_fd = -1;
00506 return false;
00507 }
00508
00509
00510 if (ioctl(this->dv_fd, EVIOCGRAB, 1)) {
00511 MSG2OUT("MMSINPUTMANAGER", "could not grab device: %s\n", this->device.name.c_str());
00512 close(this->dv_fd);
00513 this->dv_fd = -1;
00514 return false;
00515 }
00516
00517 return true;
00518 }
00519
00520 void MMSInputLISThread::closeDevice() {
00521
00522 if (this->dv_fd < 0)
00523 return;
00524
00525
00526 ioctl(this->dv_fd, EVIOCGRAB, 0);
00527 close(this->dv_fd);
00528 this->dv_fd = -1;
00529 }
00530
00531 MMSKeySymbol MMSInputLISThread::getSymbol(int code, unsigned short value) {
00532 unsigned char type = KTYP(value);
00533 unsigned char index = KVAL(value);
00534
00535 TRACEOUT("MMSINPUT", "KEYCODE: TYPE=%d(0x%x), INDEX=%d(0x%x), value=%d(0x%x)", type, type, index, index, value, value);
00536
00537 switch (type) {
00538 case KT_FN:
00539 if (index < 12)
00540 return (MMSKeySymbol)(MMSKEY_F1 + index);
00541 break;
00542 case KT_LETTER:
00543 case KT_LATIN:
00544 switch (index) {
00545 case 0x1c: return MMSKEY_PRINT;
00546 case 0x7f: return MMSKEY_BACKSPACE;
00547 case 0x08: return MMSKEY_BACKSPACE;
00548 case 0x09: return MMSKEY_TAB;
00549 case 0x0d: return MMSKEY_RETURN;
00550 case 0x18: return MMSKEY_CANCEL;
00551 case 0x1b: return MMSKEY_ESCAPE;
00552 case 0x20: return MMSKEY_SPACE;
00553 case 0x21: return MMSKEY_EXCLAMATION_MARK;
00554 case 0x22: return MMSKEY_QUOTATION;
00555 case 0x23: return MMSKEY_NUMBER_SIGN;
00556 case 0x24: return MMSKEY_DOLLAR_SIGN;
00557 case 0x25: return MMSKEY_PERCENT_SIGN;
00558 case 0x26: return MMSKEY_AMPERSAND;
00559 case 0x27: return MMSKEY_APOSTROPHE;
00560 case 0x28: return MMSKEY_PARENTHESIS_LEFT;
00561 case 0x29: return MMSKEY_PARENTHESIS_RIGHT;
00562 case 0x2a: return MMSKEY_ASTERISK;
00563 case 0x2b: return MMSKEY_PLUS_SIGN;
00564 case 0x2c: return MMSKEY_COMMA;
00565 case 0x2d: return MMSKEY_MINUS_SIGN;
00566 case 0x2e: return MMSKEY_PERIOD;
00567 case 0x2f: return MMSKEY_SLASH;
00568 case 0x30: return MMSKEY_0;
00569 case 0x31: return MMSKEY_1;
00570 case 0x32: return MMSKEY_2;
00571 case 0x33: return MMSKEY_3;
00572 case 0x34: return MMSKEY_4;
00573 case 0x35: return MMSKEY_5;
00574 case 0x36: return MMSKEY_6;
00575 case 0x37: return MMSKEY_7;
00576 case 0x38: return MMSKEY_8;
00577 case 0x39: return MMSKEY_9;
00578 case 0x3a: return MMSKEY_COLON;
00579 case 0x3b: return MMSKEY_SEMICOLON;
00580 case 0x3c: return MMSKEY_LESS_THAN_SIGN;
00581 case 0x3d: return MMSKEY_EQUALS_SIGN;
00582 case 0x3e: return MMSKEY_GREATER_THAN_SIGN;
00583 case 0x3f: return MMSKEY_QUESTION_MARK;
00584 case 0x40: return MMSKEY_AT;
00585 case 0x41: return MMSKEY_CAPITAL_A;
00586 case 0x42: return MMSKEY_CAPITAL_B;
00587 case 0x43: return MMSKEY_CAPITAL_C;
00588 case 0x44: return MMSKEY_CAPITAL_D;
00589 case 0x45: return MMSKEY_CAPITAL_E;
00590 case 0x46: return MMSKEY_CAPITAL_F;
00591 case 0x47: return MMSKEY_CAPITAL_G;
00592 case 0x48: return MMSKEY_CAPITAL_H;
00593 case 0x49: return MMSKEY_CAPITAL_I;
00594 case 0x4a: return MMSKEY_CAPITAL_J;
00595 case 0x4b: return MMSKEY_CAPITAL_K;
00596 case 0x4c: return MMSKEY_CAPITAL_L;
00597 case 0x4d: return MMSKEY_CAPITAL_M;
00598 case 0x4e: return MMSKEY_CAPITAL_N;
00599 case 0x4f: return MMSKEY_CAPITAL_O;
00600 case 0x50: return MMSKEY_CAPITAL_P;
00601 case 0x51: return MMSKEY_CAPITAL_Q;
00602 case 0x52: return MMSKEY_CAPITAL_R;
00603 case 0x53: return MMSKEY_CAPITAL_S;
00604 case 0x54: return MMSKEY_CAPITAL_T;
00605 case 0x55: return MMSKEY_CAPITAL_U;
00606 case 0x56: return MMSKEY_CAPITAL_V;
00607 case 0x57: return MMSKEY_CAPITAL_W;
00608 case 0x58: return MMSKEY_CAPITAL_X;
00609 case 0x59: return MMSKEY_CAPITAL_Y;
00610 case 0x5a: return MMSKEY_CAPITAL_Z;
00611 case 0x5b: return MMSKEY_SQUARE_BRACKET_LEFT;
00612 case 0x5c: return MMSKEY_BACKSLASH;
00613 case 0x5d: return MMSKEY_SQUARE_BRACKET_RIGHT;
00614 case 0x5e: return MMSKEY_CIRCUMFLEX_ACCENT;
00615 case 0x5f: return MMSKEY_UNDERSCORE;
00616 case 0x60: return MMSKEY_GRAVE_ACCENT;
00617 case 0x61: return MMSKEY_SMALL_A;
00618 case 0x62: return MMSKEY_SMALL_B;
00619 case 0x63: return MMSKEY_SMALL_C;
00620 case 0x64: return MMSKEY_SMALL_D;
00621 case 0x65: return MMSKEY_SMALL_E;
00622 case 0x66: return MMSKEY_SMALL_F;
00623 case 0x67: return MMSKEY_SMALL_G;
00624 case 0x68: return MMSKEY_SMALL_H;
00625 case 0x69: return MMSKEY_SMALL_I;
00626 case 0x6a: return MMSKEY_SMALL_J;
00627 case 0x6b: return MMSKEY_SMALL_K;
00628 case 0x6c: return MMSKEY_SMALL_L;
00629 case 0x6d: return MMSKEY_SMALL_M;
00630 case 0x6e: return MMSKEY_SMALL_N;
00631 case 0x6f: return MMSKEY_SMALL_O;
00632 case 0x70: return MMSKEY_SMALL_P;
00633 case 0x71: return MMSKEY_SMALL_Q;
00634 case 0x72: return MMSKEY_SMALL_R;
00635 case 0x73: return MMSKEY_SMALL_S;
00636 case 0x74: return MMSKEY_SMALL_T;
00637 case 0x75: return MMSKEY_SMALL_U;
00638 case 0x76: return MMSKEY_SMALL_V;
00639 case 0x77: return MMSKEY_SMALL_W;
00640 case 0x78: return MMSKEY_SMALL_X;
00641 case 0x79: return MMSKEY_SMALL_Y;
00642 case 0x7a: return MMSKEY_SMALL_Z;
00643 case 0x7b: return MMSKEY_CURLY_BRACKET_LEFT;
00644 case 0x7c: return MMSKEY_VERTICAL_BAR;
00645 case 0x7d: return MMSKEY_CURLY_BRACKET_RIGHT;
00646 case 0x7e: return MMSKEY_TILDE;
00647 default: return MMSKEY_UNKNOWN;
00648 }
00649 break;
00650 case KT_PAD:
00651 switch (value) {
00652 case K_P0: return MMSKEY_0;
00653 case K_P1: return MMSKEY_1;
00654 case K_P2: return MMSKEY_2;
00655 case K_P3: return MMSKEY_3;
00656 case K_P4: return MMSKEY_4;
00657 case K_P5: return MMSKEY_5;
00658 case K_P6: return MMSKEY_6;
00659 case K_P7: return MMSKEY_7;
00660 case K_P8: return MMSKEY_8;
00661 case K_P9: return MMSKEY_9;
00662 case K_PPLUS: return MMSKEY_PLUS_SIGN;
00663 case K_PMINUS: return MMSKEY_MINUS_SIGN;
00664 case K_PSTAR: return MMSKEY_ASTERISK;
00665 case K_PSLASH: return MMSKEY_SLASH;
00666 case K_PENTER: return MMSKEY_RETURN;
00667 case K_PCOMMA: return MMSKEY_COMMA;
00668 case K_PDOT: return MMSKEY_PERIOD;
00669 case K_PPARENL: return MMSKEY_PARENTHESIS_LEFT;
00670 case K_PPARENR: return MMSKEY_PARENTHESIS_RIGHT;
00671 default: return MMSKEY_UNKNOWN;
00672 }
00673 break;
00674 }
00675
00676 switch (value) {
00677 case K_LEFT: return MMSKEY_CURSOR_LEFT;
00678 case K_RIGHT: return MMSKEY_CURSOR_RIGHT;
00679 case K_UP: return MMSKEY_CURSOR_UP;
00680 case K_DOWN: return MMSKEY_CURSOR_DOWN;
00681 case K_ENTER: return MMSKEY_RETURN;
00682 case K_CTRL: return MMSKEY_CONTROL;
00683 case K_SHIFT: return MMSKEY_SHIFT;
00684 case K_ALT: return MMSKEY_ALT;
00685 case K_ALTGR: return MMSKEY_ALTGR;
00686 case K_INSERT: return MMSKEY_INSERT;
00687 case K_REMOVE: return MMSKEY_DELETE;
00688 case K_FIND: return MMSKEY_HOME;
00689 case K_SELECT: return MMSKEY_END;
00690 case K_PGUP: return MMSKEY_PAGE_UP;
00691 case K_PGDN: return MMSKEY_PAGE_DOWN;
00692 case K_NUM: return MMSKEY_NUM_LOCK;
00693 case K_HOLD: return MMSKEY_SCROLL_LOCK;
00694 case K_PAUSE: return MMSKEY_PAUSE;
00695 case K_BREAK: return MMSKEY_BREAK;
00696 case K_CAPS: return MMSKEY_CAPS_LOCK;
00697 case K_P0: return MMSKEY_INSERT;
00698 case K_P1: return MMSKEY_END;
00699 case K_P2: return MMSKEY_CURSOR_DOWN;
00700 case K_P3: return MMSKEY_PAGE_DOWN;
00701 case K_P4: return MMSKEY_CURSOR_LEFT;
00702 case K_P5: return MMSKEY_BEGIN;
00703 case K_P6: return MMSKEY_CURSOR_RIGHT;
00704 case K_P7: return MMSKEY_HOME;
00705 case K_P8: return MMSKEY_CURSOR_UP;
00706 case K_P9: return MMSKEY_PAGE_UP;
00707 case K_PPLUS: return MMSKEY_PLUS_SIGN;
00708 case K_PMINUS: return MMSKEY_MINUS_SIGN;
00709 case K_PSTAR: return MMSKEY_ASTERISK;
00710 case K_PSLASH: return MMSKEY_SLASH;
00711 case K_PENTER: return MMSKEY_RETURN;
00712 case K_PCOMMA: return MMSKEY_COMMA;
00713 case K_PDOT: return MMSKEY_PERIOD;
00714 case K_PPARENL: return MMSKEY_PARENTHESIS_LEFT;
00715 case K_PPARENR: return MMSKEY_PARENTHESIS_RIGHT;
00716 }
00717
00718 return MMSKEY_UNKNOWN;
00719 }
00720
00721 unsigned short MMSInputLISThread::readValue(unsigned char table, unsigned char index) {
00722 struct kbentry entry;
00723 entry.kb_table = table;
00724 entry.kb_index = index;
00725 entry.kb_value = 0;
00726 ioctl(this->kb_fd, KDGKBENT, &entry);
00727 return entry.kb_value;
00728 }
00729
00730 MMSKeySymbol MMSInputLISThread::getKeyFromCode(bool pressed, unsigned char code) {
00731 unsigned short value;
00732
00733
00734 value = readValue(K_NORMTAB, code);
00735 MMSKeySymbol ks = getSymbol(code, value);
00736
00737
00738 switch (ks) {
00739 case MMSKEY_SHIFT:
00740 this->shift_pressed = pressed;
00741 break;
00742 case MMSKEY_ALTGR:
00743 this->altgr_pressed = pressed;
00744 break;
00745 case MMSKEY_CAPS_LOCK:
00746 if (!pressed) {
00747
00748 this->is_caps_lock = !this->is_caps_lock;
00749 updateLED();
00750 }
00751 break;
00752 default:
00753 if ((this->shift_pressed)||(this->is_caps_lock)) {
00754 if (!this->altgr_pressed) {
00755
00756 value = readValue(K_SHIFTTAB, code);
00757 ks = getSymbol(code, value);
00758 }
00759 else {
00760
00761 value = readValue(K_ALTSHIFTTAB, code);
00762 ks = getSymbol(code, value);
00763 }
00764 }
00765 else
00766 if (this->altgr_pressed) {
00767
00768 value = readValue(K_ALTTAB, code);
00769 ks = getSymbol(code, value);
00770 }
00771 break;
00772 }
00773
00774 return ks;
00775 }
00776
00777 void MMSInputLISThread::updateLED() {
00778 int locks = 0;
00779 if (this->is_caps_lock)
00780 locks |= K_CAPSLOCK;
00781 ioctl(this->kb_fd, KDSKBLED, locks);
00782 }
00783
00784 MMSKeySymbol MMSInputLISThread::translateKey(int code) {
00785 if (code < 0)
00786 return MMSKEY_UNKNOWN;
00787 if (code >= (int)(sizeof(MMSInputLISThread_extkeycodes)/sizeof(MMSKeySymbol)))
00788 return MMSKEY_UNKNOWN;
00789 return MMSInputLISThread_extkeycodes[code];
00790 }
00791
00792 bool MMSInputLISThread::translateEvent(struct input_event *linux_evt, MMSInputEvent *inputevent) {
00793 static int x = -1, y = -1;
00794 static int px = 0, py = 0;
00795 static int pressed = 0xff;
00796
00797 TRACEOUT("MMSINPUT", "EVENT TYPE = %d, CODE = %d, VALUE = %d", linux_evt->type, linux_evt->code, linux_evt->value);
00798
00799 if(linux_evt->type == EV_ABS) {
00800 if(this->device.touch.swapXY) {
00801 if(linux_evt->code == ABS_X) { linux_evt->code = ABS_Y; }
00802 else if(linux_evt->code == ABS_Y) { linux_evt->code = ABS_X; }
00803 }
00804
00805 switch(linux_evt->code) {
00806 case ABS_X:
00807 x = linux_evt->value - this->device.touch.rect.x;
00808
00809 if(this->device.touch.swapX) {
00810 x = this->device.touch.rect.w - x;
00811 }
00812
00813 x*= this->device.touch.xFactor;
00814
00815 TRACEOUT("MMSINPUT", "EVENT TYPE = EV_ABS, CODE = ABS_X, X = %d, XF = %f", x, this->device.touch.xFactor);
00816
00817 break;
00818 case ABS_Y:
00819 y = linux_evt->value - this->device.touch.rect.y;
00820
00821 if(this->device.touch.swapY) {
00822 y = this->device.touch.rect.h - y;
00823 }
00824
00825 y*= this->device.touch.yFactor;
00826
00827 TRACEOUT("MMSINPUT", "EVENT TYPE = EV_ABS, CODE = ABS_Y, Y = %d, YF = %f", y, this->device.touch.yFactor);
00828
00829 break;
00830 case ABS_PRESSURE:
00831
00832
00833
00834
00835 TRACEOUT("MMSINPUT", "EVENT TYPE = EV_ABS, CODE = ABS_PRESSURE, VALUE = %d", linux_evt->value);
00836
00837 if(!this->device.touch.haveBtnEvents) {
00838 pressed = (linux_evt->value ? 1 : 0);
00839 }
00840 break;
00841 default:
00842 break;
00843 }
00844 } else if(linux_evt->type == EV_KEY) {
00845 switch(linux_evt->code) {
00846 case BTN_LEFT:
00847 case BTN_TOUCH:
00848 pressed = (linux_evt->value ? 1 : 0);
00849 break;
00850 default:
00851 inputevent->key = translateKey(linux_evt->code);
00852 if (inputevent->key == MMSKEY_UNKNOWN)
00853 return false;
00854
00855 inputevent->type = linux_evt->value ? MMSINPUTEVENTTYPE_KEYPRESS : MMSINPUTEVENTTYPE_KEYRELEASE;
00856 TRACEOUT("MMSINPUT", "KEY %s %d", (pressed ? "PRESS" : "RELEASE"), inputevent->key);
00857 return true;
00858 break;
00859 }
00860 } else if(linux_evt->type == EV_SYN) {
00861 if(pressed != 0xff) {
00862 inputevent->type = (pressed ? MMSINPUTEVENTTYPE_BUTTONPRESS : MMSINPUTEVENTTYPE_BUTTONRELEASE);
00863
00864 if (pressed) {
00865 px = x;
00866 py = y;
00867 if (x<0 || y<0) {
00868
00869 x = -1;
00870 y = -1;
00871 return false;
00872 }
00873 inputevent->posx = x;
00874 inputevent->posy = y;
00875 x = -1;
00876 y = -1;
00877 }
00878 else {
00879 if (x<0 || y<0) {
00880
00881 x = -1;
00882 y = -1;
00883 if (px<0 || py<0) {
00884
00885 return false;
00886 }
00887 else {
00888 inputevent->posx = px;
00889 inputevent->posy = py;
00890 }
00891 }
00892 else {
00893 inputevent->posx = x;
00894 inputevent->posy = y;
00895 x = -1;
00896 y = -1;
00897 }
00898
00899 }
00900
00901 TRACEOUT("MMSINPUT", "BUTTON %s at %dx%d", (pressed ? "PRESS" : "RELEASE"), inputevent->posx, inputevent->posy);
00902
00903 pressed = 0xff;
00904 } else {
00905 inputevent->posx = x;
00906 inputevent->posy = y;
00907 inputevent->type = MMSINPUTEVENTTYPE_AXISMOTION;
00908 }
00909
00910 return true;
00911 }
00912
00913 return false;
00914 }
00915
00916 void MMSInputLISThread::threadMain() {
00917 if (this->kb_fd >= 0) {
00918
00919 unsigned char key;
00920 while (read(this->kb_fd, &key, 1) == 1) {
00921
00922 MMSInputEvent inputevent;
00923 if (key & 0x80) {
00924 inputevent.type = MMSINPUTEVENTTYPE_KEYRELEASE;
00925
00926 TRACEOUT("MMSINPUT", "KEY RELEASE <<<");
00927
00928 inputevent.key = getKeyFromCode(false, key & 0x7f);
00929 }
00930 else {
00931 inputevent.type = MMSINPUTEVENTTYPE_KEYPRESS;
00932
00933 TRACEOUT("MMSINPUT", "KEY PRESS >>>");
00934
00935 inputevent.key = getKeyFromCode(true, key & 0x7f);
00936 }
00937
00938 this->handler->addEvent(&inputevent);
00939 }
00940 }
00941 else
00942 if (!this->device.name.empty()) {
00943 if(this->device.type != MMSINPUTLISHANDLER_DEVTYPE_UNKNOWN) {
00944 if (openDevice()) {
00945 while (1) {
00946 int readlen;
00947 struct input_event linux_evt;
00948
00949 if (((readlen = read(this->dv_fd, (void*)&linux_evt, sizeof(linux_evt))) < 0) && (errno != EINTR))
00950 break;
00951
00952 if (readlen <= 0)
00953 continue;
00954
00955 if (readlen != sizeof(linux_evt))
00956 break;
00957
00958
00959 MMSInputEvent inputevent;
00960 if (translateEvent(&linux_evt, &inputevent)) {
00961 this->handler->addEvent(&inputevent);
00962 }
00963 }
00964
00965
00966 closeDevice();
00967 }
00968 }
00969 else {
00970 MSG2OUT("MMSINPUTMANAGER", "Wrong type of device %s, type=%s (%s)\n",
00971 this->device.name.c_str(),
00972 this->device.type.c_str(),
00973 this->device.desc.c_str());
00974 }
00975 }
00976 else {
00977 printf("inputlisthread not correctly initialized");
00978 }
00979 }
00980