Logo
  • Main Page
  • Related Pages
  • Modules
  • Classes
  • Files

mmsinputlisthread.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2005-2007 Stefan Schwarzer, Jens Schneider,             *
00003  *                           Matthias Hardt, Guido Madaus                  *
00004  *                                                                         *
00005  *   Copyright (C) 2007-2008 BerLinux Solutions GbR                        *
00006  *                           Stefan Schwarzer & Guido Madaus               *
00007  *                                                                         *
00008  *   Copyright (C) 2009-2013 BerLinux Solutions GmbH                       *
00009  *                                                                         *
00010  *   Authors:                                                              *
00011  *      Stefan Schwarzer   <stefan.schwarzer@diskohq.org>,                 *
00012  *      Matthias Hardt     <matthias.hardt@diskohq.org>,                   *
00013  *      Jens Schneider     <jens.schneider@diskohq.org>,                   *
00014  *      Guido Madaus       <guido.madaus@diskohq.org>,                     *
00015  *      Patrick Helterhoff <patrick.helterhoff@diskohq.org>,               *
00016  *      René Bählkow       <rene.baehlkow@diskohq.org>                     *
00017  *                                                                         *
00018  *   This library is free software; you can redistribute it and/or         *
00019  *   modify it under the terms of the GNU Lesser General Public            *
00020  *   License version 2.1 as published by the Free Software Foundation.     *
00021  *                                                                         *
00022  *   This library is distributed in the hope that it will be useful,       *
00023  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00024  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
00025  *   Lesser General Public License for more details.                       *
00026  *                                                                         *
00027  *   You should have received a copy of the GNU Lesser General Public      *
00028  *   License along with this library; if not, write to the                 *
00029  *   Free Software Foundation, Inc.,                                       *
00030  *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
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 // keycode translation table e.g. for remote controls
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     // special keys...
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     // close device if already opened
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     // open the device
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     // try to grab the device
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     // opened?
00522     if (this->dv_fd < 0)
00523         return;
00524 
00525     // release it
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     // try with normtab
00734     value = readValue(K_NORMTAB, code);
00735     MMSKeySymbol ks = getSymbol(code, value);
00736 
00737     // check special keys
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             // work only with the key release event
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                 // shift is pressed
00756                 value = readValue(K_SHIFTTAB, code);
00757                 ks = getSymbol(code, value);
00758             }
00759             else {
00760                 // shift+altgr is pressed
00761                 value = readValue(K_ALTSHIFTTAB, code);
00762                 ks = getSymbol(code, value);
00763             }
00764         }
00765         else
00766         if (this->altgr_pressed) {
00767             // altgr is pressed
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                  * if the touch driver doesn't send BTN_xxx events, use
00833                  * ABS_PRESSURE as indicator for pressed/released
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                     // x or y coordinate not set, ignore the PRESS event
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                     // x or y coordinate not set, check pressed coordinate
00881                     x = -1;
00882                     y = -1;
00883                     if (px<0 || py<0) {
00884                         // px or py coordinate not set, ignore the RELEASE event
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         // working for keyboard inputs
00919         unsigned char key;
00920         while (read(this->kb_fd, &key, 1) == 1) {
00921             // new event
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                     // new event
00959                     MMSInputEvent inputevent;
00960                     if (translateEvent(&linux_evt, &inputevent)) {
00961                         this->handler->addEvent(&inputevent);
00962                     }
00963                 }
00964 
00965                 // release the device
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 

Generated by doxygen