/* * Input thread reading from device. * Generates events on incoming data. */ static void* sdlEventThread( DirectThread *thread, void *driver_data ) { SDLInputData *data = (SDLInputData*) driver_data; DFBSDL *dfb_sdl = data->dfb_sdl; while (!data->stop) { DFBInputEvent evt; SDL_Event event; fusion_skirmish_prevail( &dfb_sdl->lock ); /* Check for events */ while ( SDL_PollEvent(&event) ) { fusion_skirmish_dismiss( &dfb_sdl->lock ); switch (event.type) { case SDL_MOUSEMOTION: motion_compress( event.motion.x, event.motion.y ); break; case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONDOWN: motion_realize( data ); if (event.type == SDL_MOUSEBUTTONDOWN) evt.type = DIET_BUTTONPRESS; else evt.type = DIET_BUTTONRELEASE; evt.flags = DIEF_NONE; switch (event.button.button) { case SDL_BUTTON_LEFT: evt.button = DIBI_LEFT; break; case SDL_BUTTON_MIDDLE: evt.button = DIBI_MIDDLE; break; case SDL_BUTTON_RIGHT: evt.button = DIBI_RIGHT; break; case SDL_BUTTON_WHEELUP: case SDL_BUTTON_WHEELDOWN: if (event.type != SDL_MOUSEBUTTONDOWN) { fusion_skirmish_prevail( &dfb_sdl->lock ); continue; } evt.type = DIET_AXISMOTION; evt.flags = DIEF_AXISREL; evt.axis = DIAI_Z; if (event.button.button == SDL_BUTTON_WHEELUP) evt.axisrel = -1; else evt.axisrel = 1; break; default: fusion_skirmish_prevail( &dfb_sdl->lock ); continue; } dfb_input_dispatch( data->device, &evt ); break; case SDL_KEYUP: case SDL_KEYDOWN: if (event.type == SDL_KEYDOWN) evt.type = DIET_KEYPRESS; else evt.type = DIET_KEYRELEASE; /* Get a key id first */ translate_key( event.key.keysym.sym, &evt ); /* If SDL provided a symbol, use it */ if (event.key.keysym.unicode) { evt.flags |= DIEF_KEYSYMBOL; evt.key_symbol = event.key.keysym.unicode; /** * Hack to translate the Control+[letter] * combination to * Modifier: CONTROL, Key Symbol: [letter] * A side effect here is that Control+Backspace * produces Control+h */ if (evt.modifiers == DIMM_CONTROL && evt.key_symbol >= 1 && evt.key_symbol <= ('z'-'a'+1)) { evt.key_symbol += 'a'-1; } } dfb_input_dispatch( data->device, &evt ); break; case SDL_QUIT: evt.type = DIET_KEYPRESS; evt.flags = DIEF_KEYSYMBOL; evt.key_symbol = DIKS_ESCAPE; dfb_input_dispatch( data->device, &evt ); evt.type = DIET_KEYRELEASE; evt.flags = DIEF_KEYSYMBOL; evt.key_symbol = DIKS_ESCAPE; dfb_input_dispatch( data->device, &evt ); break; default: break; } fusion_skirmish_prevail( &dfb_sdl->lock ); } fusion_skirmish_dismiss( &dfb_sdl->lock ); motion_realize( data ); usleep(10000); direct_thread_testcancel( thread ); } return NULL; }
static void handleMouseEvent(XEvent* pXEvent, X11InputData* pData) { static int iMouseEventCount = 0; DFBInputEvent dfbEvent; if (pXEvent->type == MotionNotify) { motion_compress( pXEvent->xmotion.x, pXEvent->xmotion.y, pXEvent ); ++iMouseEventCount; } if ( pXEvent->type == ButtonPress || pXEvent->type == ButtonRelease ) { if ( pXEvent->type == ButtonPress ) dfbEvent.type = DIET_BUTTONPRESS; else dfbEvent.type = DIET_BUTTONRELEASE; dfbEvent.flags = DIEF_TIMESTAMP; /* Get pressed button */ switch ( pXEvent->xbutton.button ) { case 1: dfbEvent.button = DIBI_LEFT; break; case 2: dfbEvent.button = DIBI_MIDDLE; break; case 3: dfbEvent.button = DIBI_RIGHT; break; //Wheel events case 4: /*up*/ case 5: /*down*/ case 6: /*left*/ case 7: /*right*/ if (pXEvent->type == ButtonPress) { dfbEvent.type = DIET_AXISMOTION; dfbEvent.flags = DIEF_AXISREL; dfbEvent.axis = DIAI_Z; /*SCROLL UP*/ if ( pXEvent->xbutton.button == 4 ) { dfbEvent.axisrel = -1; } /*SCROLL DOWN */ else if (pXEvent->xbutton.button == 5) { dfbEvent.axisrel = 1; } /*SCROLL LEFT*/ else if (pXEvent->xbutton.button == 6) { dfbEvent.axis = DIAI_X; dfbEvent.axisrel = -1; } /*SCROLL RIGHT*/ else if (pXEvent->xbutton.button == 7 ) { dfbEvent.axis = DIAI_X; dfbEvent.axisrel = 1; } } else return; break; default: break; } dfbEvent.timestamp.tv_sec = pXEvent->xbutton.time / 1000; dfbEvent.timestamp.tv_usec = (pXEvent->xbutton.time % 1000) * 1000; dfb_input_dispatch( pData->device, &dfbEvent ); ++iMouseEventCount; } }