void translateKeyDownEvent(const SDL_Event& event) { SDL_Keysym keysym = event.key.keysym; // ALT+RETURN = Fullscreen toggle if (keysym.sym == SDLK_RETURN && (keysym.mod & KMOD_LALT)) { PPEvent myEvent(eFullScreen); RaiseEventSerialized(&myEvent); return; } preTranslateKey(keysym); #ifdef DEBUG printf ("DEBUG: Key pressed: VK: %d, SC: %d, Scancode: %d\n", toVK(keysym), toSC(keysym), keysym.sym); #endif pp_uint16 chr[3] = {toVK(keysym), toSC(keysym), keysym.sym}; #ifndef NOT_PC_KB // Hack for azerty keyboards (num keys are shifted, so we use the scancodes) if (stdKb) { if (chr[1] >= 2 && chr[1] <= 10) chr[0] = chr[1] + 47; // 1-9 else if (chr[1] == 11) chr[0] = 48; // 0 } #endif PPEvent myEvent(eKeyDown, &chr, sizeof(chr)); RaiseEventSerialized(&myEvent); }
void translateMouseMoveEvent(pp_int32 mouseButton, pp_int32 localMouseX, pp_int32 localMouseY) { myDisplayDevice->transform(localMouseX, localMouseY); p.x = localMouseX; p.y = localMouseY; if (mouseButton == 0) { p.x = localMouseX; p.y = localMouseY; PPEvent myEvent(eMouseMoved, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); } else { if (mouseButton > 2 || !mouseButton) return; p.x = localMouseX; p.y = localMouseY; if (mouseButton == 1 && lMouseDown) { PPEvent myEvent(eLMouseDrag, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); } else if (rMouseDown) { PPEvent myEvent(eRMouseDrag, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); } } }
void processSDLUserEvents(const SDL_UserEvent& event) { union { void *ptr; pp_int32 i32; } data1, data2; data1.ptr = event.data1; data2.ptr = event.data2; switch (event.code) { case SDLUserEventTimer: { PPEvent myEvent(eTimer); RaiseEventSerialized(&myEvent); break; } case SDLUserEventLMouseRepeat: { PPPoint p; p.x = data1.i32; p.y = data2.i32; PPEvent myEvent(eLMouseRepeat, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); break; } case SDLUserEventRMouseRepeat: { PPPoint p; p.x = data1.i32; p.y = data2.i32; PPEvent myEvent(eRMouseRepeat, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); break; } case SDLUserEventMidiKeyDown: { pp_int32 note = data1.i32; pp_int32 volume = data2.i32; globalMutex->lock(); myTracker->sendNoteDown(note, volume); globalMutex->unlock(); break; } case SDLUserEventMidiKeyUp: { pp_int32 note = data1.i32; globalMutex->lock(); myTracker->sendNoteUp(note); globalMutex->unlock(); break; } } }
void SendFile(char *file) { PPSystemString finalFile(file); PPSystemString* strPtr = &finalFile; PPEvent event(eFileDragDropped, &strPtr, sizeof(PPSystemString*)); RaiseEventSerialized(&event); }
void translateKeyDownEvent(const SDL_Event& event) { SDL_keysym keysym = event.key.keysym; // ALT+RETURN = Fullscreen toggle if (keysym.sym == SDLK_RETURN && (keysym.mod & KMOD_LALT)) { PPEvent myEvent(eFullScreen); RaiseEventSerialized(&myEvent); return; } preTranslateKey(keysym); pp_uint16 character = event.key.keysym.unicode; pp_uint16 chr[3] = {toVK(keysym), toSC(keysym), character}; #ifndef NOT_PC_KB // Hack for azerty keyboards (num keys are shifted, so we use the scancodes) if (stdKb) { if (chr[1] >= 2 && chr[1] <= 10) chr[0] = chr[1] + 47; // 1-9 else if (chr[1] == 11) chr[0] = 48; // 0 } #endif PPEvent myEvent(eKeyDown, &chr, sizeof(chr)); RaiseEventSerialized(&myEvent); if(character == 127) character = VK_BACK; if (character >= 32 && character <= 127) { PPEvent myEvent2(eKeyChar, &character, sizeof(character)); RaiseEventSerialized(&myEvent2); } }
void translateMouseWheelEvent(pp_int32 wheelX, pp_int32 wheelY) { TMouseWheelEventParams mouseWheelParams; // Deltas from wheel event mouseWheelParams.deltaX = wheelX; mouseWheelParams.deltaY = wheelY; // Use last stored coordinates mouseWheelParams.pos.x = p.x; mouseWheelParams.pos.y = p.y; PPEvent myEvent(eMouseWheelMoved, &mouseWheelParams, sizeof(mouseWheelParams)); RaiseEventSerialized(&myEvent); }
void translateTextInputEvent(const SDL_Event& event) { #ifdef DEBUG printf ("DEBUG: Text input: %s\n", event.text.text); #endif char character = event.text.text[0]; // Only deal with ASCII characters if (character >= 32 && character <= 127) { PPEvent myEvent(eKeyChar, &character, sizeof(character)); RaiseEventSerialized(&myEvent); } }
void exitSDLEventLoop(bool serializedEventInvoked/* = true*/) { PPEvent event(eAppQuit); RaiseEventSerialized(&event); // it's necessary to make this mutex lock because the SDL modal event loop // used in the modal dialogs expects modal dialogs to be invoked by // events within these mutex lock calls if (!serializedEventInvoked) globalMutex->lock(); bool res = myTracker->shutDown(); if (!serializedEventInvoked) globalMutex->unlock(); if (res) done = 1; }
void translateKeyUpEvent(const SDL_Event& event) { SDL_Keysym keysym = event.key.keysym; preTranslateKey(keysym); pp_uint16 chr[3] = {toVK(keysym), toSC(keysym), keysym.sym}; #ifndef NOT_PC_KB if (stdKb) { if(chr[1] >= 2 && chr[1] <= 10) chr[0] = chr[1] + 47; else if(chr[1] == 11) chr[0] = 48; } #endif PPEvent myEvent(eKeyUp, &chr, sizeof(chr)); RaiseEventSerialized(&myEvent); }
int main(int argc, char *argv[]) #endif { SDL_Event event; char *loadFile = 0; pp_int32 defaultBPP = -1; PPDisplayDevice::Orientations orientation = PPDisplayDevice::ORIENTATION_NORMAL; bool swapRedBlue = false, noSplash = false; bool recVelocity = false; // Parse command line while ( argc > 1 ) { --argc; #ifdef __APPLE__ // OSX: Swallow "-psn_xxx" argument passed by Finder on OSX <10.9 if ( strncmp(argv[argc], "-psn", 4) == 0 ) { continue; } else #endif if ( strcmp(argv[argc-1], "-bpp") == 0 ) { defaultBPP = atoi(argv[argc]); --argc; } else if ( strcmp(argv[argc], "-nosplash") == 0 ) { noSplash = true; } else if ( strcmp(argv[argc], "-swap") == 0 ) { swapRedBlue = true; } else if ( strcmp(argv[argc-1], "-orientation") == 0 ) { if (strcmp(argv[argc], "NORMAL") == 0) { orientation = PPDisplayDevice::ORIENTATION_NORMAL; } else if (strcmp(argv[argc], "ROTATE90CCW") == 0) { orientation = PPDisplayDevice::ORIENTATION_ROTATE90CCW; } else if (strcmp(argv[argc], "ROTATE90CW") == 0) { orientation = PPDisplayDevice::ORIENTATION_ROTATE90CW; } else goto unrecognizedCommandLineSwitch; --argc; } else if ( strcmp(argv[argc], "-nonstdkb") == 0) { stdKb = false; } else if ( strcmp(argv[argc], "-recvelocity") == 0) { recVelocity = true; } else { unrecognizedCommandLineSwitch: if (argv[argc][0] == '-') { fprintf(stderr, "Usage: %s [-bpp N] [-swap] [-orientation NORMAL|ROTATE90CCW|ROTATE90CW] [-nosplash] [-nonstdkb] [-recvelocity]\n", argv[0]); exit(1); } else { loadFile = argv[argc]; } } } globalMutex = new PPMutex(); // Store current working path (init routine is likely to change it) PPPath_POSIX path; PPSystemString oldCwd = path.getCurrent(); globalMutex->lock(); initTracker(defaultBPP, orientation, swapRedBlue, noSplash); globalMutex->unlock(); #ifdef HAVE_LIBASOUND if (myMidiReceiver && recVelocity) { myMidiReceiver->setRecordVelocity(true); } #endif if (loadFile) { PPSystemString newCwd = path.getCurrent(); path.change(oldCwd); SendFile(loadFile); path.change(newCwd); pp_uint16 chr[3] = {VK_RETURN, 0, 0}; PPEvent event(eKeyDown, &chr, sizeof(chr)); RaiseEventSerialized(&event); } // Main event loop done = 0; while (!done && SDL_WaitEvent(&event)) { switch (event.type) { case SDL_QUIT: exitSDLEventLoop(false); break; case SDL_MOUSEMOTION: { // Ignore old mouse motion events in the event queue SDL_Event new_event; if (SDL_PeepEvents(&new_event, 1, SDL_GETEVENT, SDL_MOUSEMOTION, SDL_MOUSEMOTION) > 0) { while (SDL_PeepEvents(&new_event, 1, SDL_GETEVENT, SDL_MOUSEMOTION, SDL_MOUSEMOTION) > 0); processSDLEvents(new_event); } else { processSDLEvents(event); } break; } // Open modules drag 'n dropped onto MilkyTracker (currently only works on Dock icon, OSX) case SDL_DROPFILE: SendFile(event.drop.file); SDL_free(event.drop.file); break; // Refresh GUI if window resized case SDL_WINDOWEVENT: switch (event.window.event) { case SDL_WINDOWEVENT_RESIZED: myTrackerScreen->update(); } break; case SDL_USEREVENT: processSDLUserEvents((const SDL_UserEvent&)event); break; default: processSDLEvents(event); break; } } ticking = false; SDL_RemoveTimer(timer); globalMutex->lock(); #ifdef HAVE_LIBASOUND delete myMidiReceiver; #endif delete myTracker; myTracker = NULL; delete myTrackerScreen; myTrackerScreen = NULL; delete myDisplayDevice; globalMutex->unlock(); SDL_Quit(); delete globalMutex; return 0; }
void translateMouseUpEvent(pp_int32 mouseButton, pp_int32 localMouseX, pp_int32 localMouseY) { if (mouseButton > 2 || !mouseButton) return; myDisplayDevice->transform(localMouseX, localMouseY); p.x = localMouseX; p.y = localMouseY; // ----------------------------- if (mouseButton == 1) { lClickCount++; if (lClickCount >= 4) { pp_uint32 deltat = PPGetTickCount() - lmyTime; if (deltat < 500) { p.x = localMouseX; p.y = localMouseY; if (abs(p.x - llastClickPosition.x) < 4 && abs(p.y - llastClickPosition.y) < 4) { PPEvent myEvent(eLMouseDoubleClick, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); } } lClickCount = 0; } p.x = localMouseX; p.y = localMouseY; PPEvent myEvent(eLMouseUp, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); lMouseDown = false; } else if (mouseButton == 2) { rClickCount++; if (rClickCount >= 4) { pp_uint32 deltat = PPGetTickCount() - rmyTime; if (deltat < 500) { p.x = localMouseX; p.y = localMouseY; if (abs(p.x - rlastClickPosition.x) < 4 && abs(p.y - rlastClickPosition.y) < 4) { PPEvent myEvent(eRMouseDoubleClick, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); } } rClickCount = 0; } p.x = localMouseX; p.y = localMouseY; PPEvent myEvent(eRMouseUp, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); rMouseDown = false; } }
void translateMouseDownEvent(pp_int32 mouseButton, pp_int32 localMouseX, pp_int32 localMouseY) { if (mouseButton > 2 || !mouseButton) return; myDisplayDevice->transform(localMouseX, localMouseY); p.x = localMouseX; p.y = localMouseY; // ----------------------------- if (mouseButton == 1) { PPEvent myEvent(eLMouseDown, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); lMouseDown = true; lButtonDownStartTime = timerTicker; if (!lClickCount) { lmyTime = PPGetTickCount(); llastClickPosition.x = localMouseX; llastClickPosition.y = localMouseY; } else if (lClickCount == 2) { pp_uint32 deltat = PPGetTickCount() - lmyTime; if (deltat > 500) { lClickCount = 0; lmyTime = PPGetTickCount(); llastClickPosition.x = localMouseX; llastClickPosition.y = localMouseY; } } lClickCount++; } else if (mouseButton == 2) { PPEvent myEvent(eRMouseDown, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); rMouseDown = true; rButtonDownStartTime = timerTicker; if (!rClickCount) { rmyTime = PPGetTickCount(); rlastClickPosition.x = localMouseX; rlastClickPosition.y = localMouseY; } else if (rClickCount == 2) { pp_uint32 deltat = PPGetTickCount() - rmyTime; if (deltat > 500) { rClickCount = 0; rmyTime = PPGetTickCount(); rlastClickPosition.x = localMouseX; rlastClickPosition.y = localMouseY; } } rClickCount++; } }
int main(int argc, char *argv[]) #endif { Uint32 videoflags; SDL_Event event; char *loadFile = 0; pp_int32 defaultBPP = -1; PPDisplayDevice::Orientations orientation = PPDisplayDevice::ORIENTATION_NORMAL; bool swapRedBlue = false, fullScreen = false, noSplash = false; bool recVelocity = false; // Parse command line while ( argc > 1 ) { --argc; if ( strcmp(argv[argc-1], "-bpp") == 0 ) { defaultBPP = atoi(argv[argc]); --argc; } else if ( strcmp(argv[argc], "-nosplash") == 0 ) { noSplash = true; } else if ( strcmp(argv[argc], "-swap") == 0 ) { swapRedBlue = true; } else if ( strcmp(argv[argc], "-fullscreen") == 0) { fullScreen = true; } else if ( strcmp(argv[argc-1], "-orientation") == 0 ) { if (strcmp(argv[argc], "NORMAL") == 0) { orientation = PPDisplayDevice::ORIENTATION_NORMAL; } else if (strcmp(argv[argc], "ROTATE90CCW") == 0) { orientation = PPDisplayDevice::ORIENTATION_ROTATE90CCW; } else if (strcmp(argv[argc], "ROTATE90CW") == 0) { orientation = PPDisplayDevice::ORIENTATION_ROTATE90CW; } else goto unrecognizedCommandLineSwitch; --argc; } else if ( strcmp(argv[argc], "-nonstdkb") == 0) { stdKb = false; } else if ( strcmp(argv[argc], "-recvelocity") == 0) { recVelocity = true; } else { unrecognizedCommandLineSwitch: if (argv[argc][0] == '-') { fprintf(stderr, "Usage: %s [-bpp N] [-swap] [-orientation NORMAL|ROTATE90CCW|ROTATE90CW] [-fullscreen] [-nosplash] [-nonstdkb] [-recvelocity]\n", argv[0]); exit(1); } else { loadFile = argv[argc]; } } } // Workaround for seg-fault in SDL_Init on Eee PC (thanks nostromo) // (see http://forum.eeeuser.com/viewtopic.php?pid=136945) #if HAVE_DECL_SDL_PUTENV SDL_putenv("SDL_VIDEO_X11_WMCLASS=Milkytracker"); #endif timerMutex = new PPMutex(); globalMutex = new PPMutex(); // Store current working path (init routine is likely to change it) PPPath_POSIX path; PPSystemString oldCwd = path.getCurrent(); globalMutex->lock(); initTracker(defaultBPP, orientation, swapRedBlue, fullScreen, noSplash); globalMutex->unlock(); #ifdef HAVE_LIBASOUND if (myMidiReceiver && recVelocity) { myMidiReceiver->setRecordVelocity(true); } #endif if (loadFile) { PPSystemString newCwd = path.getCurrent(); path.change(oldCwd); SendFile(loadFile); path.change(newCwd); pp_uint16 chr[3] = {VK_RETURN, 0, 0}; PPEvent event(eKeyDown, &chr, sizeof(chr)); RaiseEventSerialized(&event); } /* Main event loop */ done = 0; while (!done && SDL_WaitEvent(&event)) { switch (event.type) { case SDL_QUIT: exitSDLEventLoop(false); break; case SDL_MOUSEMOTION: { // ignore old mouse motion events in the event queue SDL_Event new_event; if (SDL_PeepEvents(&new_event, 1, SDL_GETEVENT, SDL_EVENTMASK(SDL_MOUSEMOTION)) > 0) { while (SDL_PeepEvents(&new_event, 1, SDL_GETEVENT, SDL_EVENTMASK(SDL_MOUSEMOTION)) > 0); processSDLEvents(new_event); } else { processSDLEvents(event); } break; } case SDL_USEREVENT: processSDLUserEvents((const SDL_UserEvent&)event); break; default: processSDLEvents(event); break; } } #ifdef __GP2X__ SDL_JoystickClose(0); #endif timerMutex->lock(); ticking = false; timerMutex->unlock(); SDL_SetTimer(0, NULL); timerMutex->lock(); globalMutex->lock(); #ifdef HAVE_LIBASOUND delete myMidiReceiver; #endif delete myTracker; myTracker = NULL; delete myTrackerScreen; myTrackerScreen = NULL; delete myDisplayDevice; globalMutex->unlock(); timerMutex->unlock(); SDL_Quit(); delete globalMutex; delete timerMutex; /* Quoting from README.Qtopia (Application Porting Notes): One thing I have noticed is that applications sometimes don't exit correctly. Their icon remains in the taskbar and they tend to relaunch themselves automatically. I believe this problem doesn't occur if you exit your application using the exit() method. However, if you end main() with 'return 0;' or so, this seems to happen. */ #ifdef __QTOPIA__ exit(0); #else return 0; #endif }
void translateMouseUpEvent(pp_int32 mouseButton, pp_int32 localMouseX, pp_int32 localMouseY) { myDisplayDevice->transform(localMouseX, localMouseY); if (mouseButton == SDL_BUTTON_WHEELDOWN) { TMouseWheelEventParams mouseWheelParams; mouseWheelParams.pos.x = localMouseX; mouseWheelParams.pos.y = localMouseY; mouseWheelParams.delta = -1; PPEvent myEvent(eMouseWheelMoved, &mouseWheelParams, sizeof(mouseWheelParams)); RaiseEventSerialized(&myEvent); } else if (mouseButton == SDL_BUTTON_WHEELUP) { TMouseWheelEventParams mouseWheelParams; mouseWheelParams.pos.x = localMouseX; mouseWheelParams.pos.y = localMouseY; mouseWheelParams.delta = 1; PPEvent myEvent(eMouseWheelMoved, &mouseWheelParams, sizeof(mouseWheelParams)); RaiseEventSerialized(&myEvent); } else if (mouseButton > 2 || !mouseButton) return; // ----------------------------- if (mouseButton == 1) { lClickCount++; if (lClickCount >= 4) { pp_uint32 deltat = PPGetTickCount() - lmyTime; if (deltat < 500) { p.x = localMouseX; p.y = localMouseY; if (abs(p.x - llastClickPosition.x) < 4 && abs(p.y - llastClickPosition.y) < 4) { PPEvent myEvent(eLMouseDoubleClick, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); } } lClickCount = 0; } p.x = localMouseX; p.y = localMouseY; PPEvent myEvent(eLMouseUp, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); lMouseDown = false; } else if (mouseButton == 2) { rClickCount++; if (rClickCount >= 4) { pp_uint32 deltat = PPGetTickCount() - rmyTime; if (deltat < 500) { p.x = localMouseX; p.y = localMouseY; if (abs(p.x - rlastClickPosition.x) < 4 && abs(p.y - rlastClickPosition.y) < 4) { PPEvent myEvent(eRMouseDoubleClick, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); } } rClickCount = 0; } p.x = localMouseX; p.y = localMouseY; PPEvent myEvent(eRMouseUp, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); rMouseDown = false; } }