/** Set seek position. */ static void gtrk_seek(uint cmd, uint val) { gtrk *t = gg->curtrk; int delta; if (t == NULL) return; switch (cmd) { case A_SEEK: t->time_seek = val; break; case A_FFWD: delta = gg->conf.seek_step_delta; goto use_delta; case A_RWND: delta = -(int)gg->conf.seek_step_delta; goto use_delta; case A_LEAP_FWD: delta = gg->conf.seek_leap_delta; goto use_delta; case A_LEAP_BACK: delta = -(int)gg->conf.seek_leap_delta; goto use_delta; use_delta: t->time_seek = ffmax((int)t->time_cur + delta, 0); break; } }
void handleEvents() { sf::Event Event; const sf::Input& Input = App->GetInput(); bool shiftDown = Input.IsKeyDown(sf::Key::LShift) || Input.IsKeyDown(sf::Key::RShift); while (App->GetEvent(Event)) { // Close window : exit if (Event.Type == sf::Event::Closed) App->Close(); // // Escape key : exit if (Event.Type == sf::Event::KeyPressed) { if(Event.Key.Code == sf::Key::Escape) App->Close(); else if(Event.Key.Code == sf::Key::Delete) deleteShape(); else if(Event.Key.Code == sf::Key::Up && selected != 0) { Shape* s = findShape(selected); switch(colorM) { case COLOR_R: s->color[0] = ffmin(1.0, s->color[0]+0.05); break; case COLOR_G: s->color[1] = ffmin(1.0, s->color[1]+0.05); break; case COLOR_B: s->color[2] = ffmin(1.0, s->color[2]+0.05); break; } } else if(Event.Key.Code == sf::Key::Down && selected != 0) { Shape* s = findShape(selected); switch(colorM) { case COLOR_R: s->color[0] = ffmax(0.0, s->color[0]-0.05); break; case COLOR_G: s->color[1] = ffmax(0.0, s->color[1]-0.05); break; case COLOR_B: s->color[2] = ffmax(0.0, s->color[2]-0.05); break; } } } // Resize event : adjust viewport if (Event.Type == sf::Event::Resized) { glViewport(0, 0, Event.Size.Width, Event.Size.Height); currentRes[0] = Event.Size.Width; currentRes[1] = Event.Size.Height; update_perspective(); } if (Event.Type == sf::Event::MouseButtonPressed) { lastPos[0] = Event.MouseButton.X; lastPos[1] = Event.MouseButton.Y; float x = Event.MouseButton.X; float y = currentRes[1]-Event.MouseButton.Y; if(Event.MouseButton.Button == sf::Mouse::Left) { if(!handleButtons(x,y)) { handleSelection(Event.MouseButton.X, Event.MouseButton.Y); } } if(Event.MouseButton.Button == sf::Mouse::Left && !shiftDown) { buttonDown[0] = 1; } if(Event.MouseButton.Button == sf::Mouse::Right) buttonDown[1] = 1; if(Event.MouseButton.Button == sf::Mouse::Middle) buttonDown[2] = 1; if(Event.MouseButton.Button == sf::Mouse::Left && shiftDown) buttonDown[2] = 1; } if (Event.Type == sf::Event::MouseButtonReleased) { if(Event.MouseButton.Button == sf::Mouse::Left && !shiftDown) buttonDown[0] = 0; if(Event.MouseButton.Button == sf::Mouse::Right) buttonDown[1] = 0; if(Event.MouseButton.Button == sf::Mouse::Middle) buttonDown[2] = 0; if(Event.MouseButton.Button == sf::Mouse::Left && shiftDown) buttonDown[2] = 0; } if (Event.Type == sf::Event::MouseMoved && (buttonDown[0] || buttonDown[1] || buttonDown[2]) ) { int x = Event.MouseMove.X; int y = Event.MouseMove.Y; if(selected == 0) { if(buttonDown[0]) camera.trackball_rotate(lastPos[0], lastPos[1], x, y, currentRes[0], currentRes[1]); if(buttonDown[1]) camera.trackball_translate(lastPos[0], lastPos[1], x, y); if(buttonDown[2]) camera.trackball_translate_z(lastPos[0], lastPos[1], x, y); } else { Shape* s = findShape(selected); float diff = (x-lastPos[0])-(y-lastPos[1]); vec3 v; switch(axisM) { case X_AXIS: v = vec3(diff,0.0,0.0); break; case Y_AXIS: v = vec3(0.0,diff,0.0); break; case Z_AXIS: v = vec3(0.0,0.0,diff); break; } switch(transM) { case TRANS_TRANSLATION: s->trans.trans += v*0.01; break; case TRANS_ROTATION: s->rot.trans += v*0.1; break; case TRANS_SCALE: s->scale.trans += v*0.01; break; } } lastPos[0] = x; lastPos[1] = y; } } }
static void corecmd_run(uint cmd, void *udata) { dbglog("%s cmd:%u udata:%p", __func__, cmd, udata); switch ((enum ACTION)cmd) { case A_SHOWPCM: file_showpcm(); break; case A_DELFILE: file_del(); break; case A_PLAY: if (gg->curtrk != NULL) gg->track->cmd(gg->curtrk->trk, FMED_TRACK_STOP); gg->qu->cmd(FMED_QUE_PLAY, (void*)gg->qu->fmed_queue_item(-1, gg->focused)); break; case A_PLAYPAUSE: if (gg->curtrk == NULL) { gg->qu->cmd(FMED_QUE_PLAY, NULL); break; } if (gg->curtrk->paused) { gg->curtrk->paused = 0; wmain_status(""); gg->curtrk->d->snd_output_pause = 0; gg->track->cmd(gg->curtrk->trk, FMED_TRACK_UNPAUSE); break; } gg->curtrk->d->snd_output_pause = 1; wmain_status("Paused"); gg->curtrk->paused = 1; break; case A_STOP: gg->track->cmd(NULL, FMED_TRACK_STOPALL); break; case A_STOP_AFTER: gg->qu->cmd(FMED_QUE_STOP_AFTER, NULL); break; case A_NEXT: case A_PREV: { if (gg->curtrk != NULL) gg->track->cmd(gg->curtrk->trk, FMED_TRACK_STOP); uint id = (cmd == A_NEXT) ? FMED_QUE_NEXT2 : FMED_QUE_PREV2; gg->qu->cmd(id, (gg->curtrk != NULL) ? gg->curtrk->qent : NULL); break; } case A_SEEK: case A_FFWD: case A_RWND: case A_LEAP_FWD: case A_LEAP_BACK: gtrk_seek(cmd, (size_t)udata); break; case A_SETGOPOS: if (gg->curtrk != NULL) { gg->go_pos = gg->curtrk->time_cur; wmain_status("Marker: %u:%02u" , gg->go_pos / 60, gg->go_pos % 60); } break; case A_GOPOS: if (gg->curtrk != NULL && gg->go_pos != (uint)-1) gg->curtrk->time_seek = gg->go_pos; break; case A_VOL: gg->vol = (size_t)udata; gtrk_vol(gg->vol); break; case A_VOLUP: gg->vol = ffmin(gg->vol + 5, MAXVOL); gtrk_vol(gg->vol); break; case A_VOLDOWN: gg->vol = ffmax((int)gg->vol - 5, 0); gtrk_vol(gg->vol); break; case A_VOLRESET: gg->vol = 100; gtrk_vol(gg->vol); break; case A_LIST_SAVE: { char *list_fn = udata; gg->qu->fmed_queue_save(-1, list_fn); ffmem_free(list_fn); break; } case A_LIST_REMOVE: list_rmitems(); break; case A_LIST_RMDEAD: gg->qu->cmd(FMED_QUE_RMDEAD, NULL); break; case A_LIST_CLEAR: gg->qu->cmd(FMED_QUE_CLEAR | FMED_QUE_NO_ONCHANGE, NULL); ffui_post_view_clear(&gg->wmain.vlist); break; case A_LIST_RANDOM: core->props->list_random = !core->props->list_random; break; case A_ONDROPFILE: { ffstr *d = udata; ffstr s = *d, ln; while (s.len != 0) { ffstr_nextval3(&s, &ln, '\n'); if (!ffs_matchz(ln.ptr, ln.len, "file://")) continue; ffstr_shift(&ln, FFSLEN("file://")); wmain_ent_add(&ln); } ffstr_free(d); ffmem_free(d); break; } case A_URL_ADD: { ffstr *s = udata; wmain_ent_add(s); ffstr_free(s); ffmem_free(s); break; } case A_ONCLOSE: if (gg->conf.autosave_playlists) lists_save(); core->sig(FMED_STOP); break; case LOADLISTS: lists_load(); break; default: FF_ASSERT(0); } }