bool CWinEventsSDL::ProcessOSXShortcuts(SDL_Event& event) { static bool shift = false, cmd = false; cmd = !!(SDL_GetModState() & (KMOD_LMETA | KMOD_RMETA )); shift = !!(SDL_GetModState() & (KMOD_LSHIFT | KMOD_RSHIFT)); if (cmd && event.key.type == SDL_KEYDOWN) { char keysymbol = event.key.keysym.sym; // if the unicode is in the ascii range // use this instead for getting the real // character based on the used keyboard layout // see http://lists.libsdl.org/pipermail/sdl-libsdl.org/2004-May/043716.html if (!(event.key.keysym.unicode & 0xff80)) keysymbol = event.key.keysym.unicode; switch(keysymbol) { case SDLK_q: // CMD-q to quit if (!g_application.m_bStop) CApplicationMessenger::Get().Quit(); return true; case SDLK_f: // CMD-f to toggle fullscreen g_application.OnAction(CAction(ACTION_TOGGLE_FULLSCREEN)); return true; case SDLK_s: // CMD-3 to take a screenshot g_application.OnAction(CAction(ACTION_TAKE_SCREENSHOT)); return true; case SDLK_h: // CMD-h to hide g_Windowing.Hide(); return true; case SDLK_m: // CMD-m to minimize CApplicationMessenger::Get().Minimize(); return true; default: return false; } } return false; }
void CWinEventsWin32::OnGesture(HWND hWnd, LPARAM lParam) { if (!g_Windowing.PtrGetGestureInfo) return; GESTUREINFO gi = {0}; gi.cbSize = sizeof(gi); g_Windowing.PtrGetGestureInfo((HGESTUREINFO)lParam, &gi); // convert to window coordinates POINT point = { gi.ptsLocation.x, gi.ptsLocation.y }; WindowFromScreenCoords(hWnd, &point); switch (gi.dwID) { case GID_BEGIN: { m_lastGesturePosX = point.x; m_lastGesturePosY = point.y; g_application.OnAction(CAction(ACTION_GESTURE_BEGIN, 0, (float)point.x, (float)point.y, 0, 0)); } break; case GID_END: { g_application.OnAction(CAction(ACTION_GESTURE_END)); } break; case GID_PAN: { g_application.OnAction(CAction(ACTION_GESTURE_PAN, 0, (float)point.x, (float)point.y, (float)(point.x - m_lastGesturePosX), (float)(point.y - m_lastGesturePosY))); m_lastGesturePosX = point.x; m_lastGesturePosY = point.y; } break; case GID_ROTATE: CLog::Log(LOGDEBUG, "%s - Rotating", __FUNCTION__); break; case GID_ZOOM: CLog::Log(LOGDEBUG, "%s - Zooming", __FUNCTION__); break; case GID_TWOFINGERTAP: case GID_PRESSANDTAP: default: // You have encountered an unknown gesture break; } g_Windowing.PtrCloseGestureInfoHandle((HGESTUREINFO)lParam); }
void CGUIDialogKeyboardGeneric::Backspace() { // send action to edit control CGUIControl *edit = GetControl(CTL_EDIT); if (edit) edit->OnAction(CAction(ACTION_BACKSPACE)); }
void CGUIWindowFullScreen::SeekTV(bool bPlus, bool bLargeStep) { if (bLargeStep) { if (bPlus) OnAction(CAction(ACTION_NEXT_ITEM)); else OnAction(CAction(ACTION_PREV_ITEM)); return; } else if (!bLargeStep) { ChangetheTVGroup(bPlus); return; } }
/*! \brief Start playback with a given playback core. * \param params The parameters. * \details params[0] = Name of playback core. */ static int PlayWith(const std::vector<std::string>& params) { g_application.m_eForcedNextPlayer = CPlayerCoreFactory::Get().GetPlayerCore(params[0]); g_application.OnAction(CAction(ACTION_PLAYER_PLAY)); return 0; }
bool CWinEventsSDL::ProcessOSXShortcuts(SDL_Event& event) { /* 歌方: 1、 卦指: 1、 傍苧: 1、 */ static bool shift = false, cmd = false; cmd = !!(SDL_GetModState() & (KMOD_LMETA | KMOD_RMETA )); shift = !!(SDL_GetModState() & (KMOD_LSHIFT | KMOD_RSHIFT)); if (cmd && event.key.type == SDL_KEYDOWN) { switch(event.key.keysym.sym) { case SDLK_q: // CMD-q to quit if (!g_application.m_bStop) g_application.getApplicationMessenger().Quit(); return true; case SDLK_f: // CMD-f to toggle fullscreen g_application.OnAction(CAction(ACTION_TOGGLE_FULLSCREEN)); return true; case SDLK_s: // CMD-3 to take a screenshot g_application.OnAction(CAction(ACTION_TAKE_SCREENSHOT)); return true; case SDLK_h: // CMD-h to hide (but we minimize for now) case SDLK_m: // CMD-m to minimize g_application.getApplicationMessenger().Minimize(); return true; default: return false; } } return false; }
EVENT_RESULT CGUIButtonControl::OnMouseEvent(const CPoint &point, const CMouseEvent &event) { if (event.m_id == ACTION_MOUSE_LEFT_CLICK) { OnAction(CAction(ACTION_SELECT_ITEM)); return EVENT_RESULT_HANDLED; } return EVENT_RESULT_UNHANDLED; }
EVENT_RESULT CGUIWindowFullScreen::OnMouseEvent(const CPoint &point, const CMouseEvent &event) { if (event.m_id == ACTION_MOUSE_RIGHT_CLICK) { // no control found to absorb this click - go back to GUI OnAction(CAction(ACTION_SHOW_GUI)); return EVENT_RESULT_HANDLED; } if (event.m_id == ACTION_MOUSE_WHEEL_UP) { return g_application.OnAction(CAction(ACTION_ANALOG_SEEK_FORWARD, 0.5f)) ? EVENT_RESULT_HANDLED : EVENT_RESULT_UNHANDLED; } if (event.m_id == ACTION_MOUSE_WHEEL_DOWN) { return g_application.OnAction(CAction(ACTION_ANALOG_SEEK_BACK, 0.5f)) ? EVENT_RESULT_HANDLED : EVENT_RESULT_UNHANDLED; } if (event.m_id >= ACTION_GESTURE_NOTIFY && event.m_id <= ACTION_GESTURE_END) // gestures return EVENT_RESULT_UNHANDLED; return EVENT_RESULT_UNHANDLED; }
/////////////////////////////////////////////////////////////////////////////// // IPropertyActionSequence methods STDMETHODIMP CPropertyChoice::AddAction (IPropertyAction *pIAct) { if (!m_fIsInitialized) { HRESULT hr = InitNew(); if (FAILED(hr)) return hr; } COM_TRY { m_Actions.push_back (CAction(pIAct)); m_fIsDirty = true; } COM_CATCH; return S_OK; }
/////////////////////////////////////////////////////////////////////////////// // IPropertyActionSequence methods STDMETHODIMP CPropertyChoice::AddAction (IPropertyAction *pIAct) { if (!m_fIsInitialized) { HRESULT hr = InitNew(); if (FAILED(hr)) return hr; } try { m_Actions.push_back (CAction(pIAct)); m_fIsDirty = true; } catch (...) { ASSERT(false); return E_FAIL; } return NOERROR; }
bool CMathEventQueue::addCalculation(const C_FLOAT64 & executionTime, const bool & equality, CMathEvent * pEvent) { // It is not possible to proceed backwards in time. if (mpTime == NULL || executionTime < *mpTime) return false; size_t CascadingLevel = mCascadingLevel; // If the assignment is in the future or it has a priority the // cascading level must be zero. if (executionTime > *mpTime || !isnan(* (C_FLOAT64 *) pEvent->getPriority()->getValuePointer())) CascadingLevel = 0; pEvent->addPendingAction(mActions.insert(std::make_pair(CKey(executionTime, equality, CascadingLevel), CAction(pEvent, this)))); return true; }
bool CGUIDialogAccessPoints::OnMessage(CGUIMessage& message) { bool result = CGUIDialog::OnMessage(message); switch (message.GetMessage()) { case GUI_MSG_WINDOW_INIT: { m_use_ipconfig = false; m_doing_connection = false; // fetch the param list std::string param(message.GetStringParam()); // network apply vs network connect if (param.find("name+") != std::string::npos) { m_use_ipconfig = true; // network apply, param contains a description for connecting // to an access point. we want to find this access point, // disable the others, then inject a OnAction msg to select it. DecodeAccessPointParam(param); // change the label to show we are doing a connection. CGUIMessage msg(GUI_MSG_LABEL_SET, GetID(), ACCESS_POINT_LABEL); // <string id="33203">Connecting</string> msg.SetLabel(g_localizeStrings.Get(33203)); OnMessage(msg); } UpdateConnectionList(); // if we are doing an 'apply', then inject a click on the "selected" item. if (m_use_ipconfig) CApplicationMessenger::Get().SendAction(CAction(ACTION_SELECT_ITEM), GetID()); break; } case GUI_MSG_WINDOW_DEINIT: { } } return result; }
void CGUIWindowFullScreen::ChangetheTVGroup(bool next) { CGUISelectButtonControl* pButton = (CGUISelectButtonControl*)GetControl(CONTROL_GROUP_CHOOSER); if (!pButton) return; if (!m_bGroupSelectShow) { SET_CONTROL_VISIBLE(CONTROL_GROUP_CHOOSER); SET_CONTROL_FOCUS(CONTROL_GROUP_CHOOSER, 0); // fire off an event that we've pressed this button... OnAction(CAction(ACTION_SELECT_ITEM)); m_bGroupSelectShow = true; } else { if (next) pButton->OnRight(); else pButton->OnLeft(); } }
void CGUIDialogSettingsBase::OnClick(BaseSettingControlPtr pSettingControl) { if (AllowResettingSettings() && pSettingControl->GetSetting()->GetId() == SETTINGS_RESET_SETTING_ID) { OnAction(CAction(ACTION_SETTINGS_RESET)); return; } // we need to first set the delayed setting and then execute OnClick() // because OnClick() triggers OnSettingChanged() and there we need to // know if the changed setting is delayed or not if (pSettingControl->IsDelayed()) { m_delayedSetting = pSettingControl; // for some controls we need to update its displayed data/text before // OnClick() is called after the delay timer has expired because // otherwise the displayed value of the control does not match with // the user's interaction pSettingControl->Update(true); // either start or restart the delay timer which will result in a call to // the control's OnClick() method to update the setting's value if (m_delayedTimer.IsRunning()) m_delayedTimer.Restart(); else m_delayedTimer.Start(GetDelayMs()); return; } // if changing the setting fails // we need to restore the proper state if (!pSettingControl->OnClick()) pSettingControl->Update(); }
/*! \brief Control player. * \param params The parameters * \details params[0] = Control to execute. * params[1] = "notify" to notify user (optional, certain controls). */ static int PlayerControl(const std::vector<std::string>& params) { g_application.ResetScreenSaver(); g_application.WakeUpScreenSaverAndDPMS(); std::string paramlow(params[0]); StringUtils::ToLower(paramlow); if (paramlow == "play") { // play/pause // either resume playing, or pause if (g_application.GetAppPlayer().IsPlaying()) { if (g_application.GetAppPlayer().GetPlaySpeed() != 1) g_application.GetAppPlayer().SetPlaySpeed(1); else g_application.GetAppPlayer().Pause(); } } else if (paramlow == "stop") { g_application.StopPlaying(); } else if (StringUtils::StartsWithNoCase(params[0], "frameadvance")) { std::string strFrames; if (params[0].size() == 12) CLog::Log(LOGERROR, "PlayerControl(frameadvance(n)) called with no argument"); else if (params[0].size() < 15) // arg must be at least "(N)" CLog::Log(LOGERROR, "PlayerControl(frameadvance(n)) called with invalid argument: \"%s\"", params[0].substr(13).c_str()); else strFrames = params[0].substr(13); StringUtils::TrimRight(strFrames, ")"); float frames = (float) atof(strFrames.c_str()); g_application.GetAppPlayer().FrameAdvance(frames); } else if (paramlow =="rewind" || paramlow == "forward") { if (g_application.GetAppPlayer().IsPlaying() && !g_application.GetAppPlayer().IsPaused()) { float playSpeed = g_application.GetAppPlayer().GetPlaySpeed(); if (paramlow == "rewind" && playSpeed == 1) // Enables Rewinding playSpeed *= -2; else if (paramlow == "rewind" && playSpeed > 1) //goes down a notch if you're FFing playSpeed /= 2; else if (paramlow == "forward" && playSpeed < 1) //goes up a notch if you're RWing { playSpeed /= 2; if (playSpeed == -1) playSpeed = 1; } else playSpeed *= 2; if (playSpeed > 32 || playSpeed < -32) playSpeed = 1; g_application.GetAppPlayer().SetPlaySpeed(playSpeed); } } else if (paramlow =="tempoup" || paramlow == "tempodown") { if (g_application.GetAppPlayer().SupportsTempo() && g_application.GetAppPlayer().IsPlaying() && !g_application.GetAppPlayer().IsPaused()) { float playTempo = g_application.GetAppPlayer().GetPlayTempo(); if (paramlow == "tempodown") playTempo -= 0.1f; else if (paramlow == "tempoup") playTempo += 0.1f; g_application.GetAppPlayer().SetTempo(playTempo); } } else if (paramlow == "next") { g_application.OnAction(CAction(ACTION_NEXT_ITEM)); } else if (paramlow == "previous") { g_application.OnAction(CAction(ACTION_PREV_ITEM)); } else if (paramlow == "bigskipbackward") { if (g_application.GetAppPlayer().IsPlaying()) g_application.GetAppPlayer().Seek(false, true); } else if (paramlow == "bigskipforward") { if (g_application.GetAppPlayer().IsPlaying()) g_application.GetAppPlayer().Seek(true, true); } else if (paramlow == "smallskipbackward") { if (g_application.GetAppPlayer().IsPlaying()) g_application.GetAppPlayer().Seek(false, false); } else if (paramlow == "smallskipforward") { if (g_application.GetAppPlayer().IsPlaying()) g_application.GetAppPlayer().Seek(true, false); } else if (StringUtils::StartsWithNoCase(params[0], "seekpercentage")) { std::string offset; if (params[0].size() == 14) CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) called with no argument"); else if (params[0].size() < 17) // arg must be at least "(N)" CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) called with invalid argument: \"%s\"", params[0].substr(14).c_str()); else { // Don't bother checking the argument: an invalid arg will do seek(0) offset = params[0].substr(15); StringUtils::TrimRight(offset, ")"); float offsetpercent = (float) atof(offset.c_str()); if (offsetpercent < 0 || offsetpercent > 100) CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) argument, %f, must be 0-100", offsetpercent); else if (g_application.GetAppPlayer().IsPlaying()) g_application.SeekPercentage(offsetpercent); } } else if (paramlow == "showvideomenu") { if( g_application.GetAppPlayer().IsPlaying() ) g_application.GetAppPlayer().OnAction(CAction(ACTION_SHOW_VIDEOMENU)); } else if (StringUtils::StartsWithNoCase(params[0], "partymode")) { std::string strXspPath; //empty param=music, "music"=music, "video"=video, else xsp path PartyModeContext context = PARTYMODECONTEXT_MUSIC; if (params[0].size() > 9) { if (params[0].size() == 16 && StringUtils::EndsWithNoCase(params[0], "video)")) context = PARTYMODECONTEXT_VIDEO; else if (params[0].size() != 16 || !StringUtils::EndsWithNoCase(params[0], "music)")) { strXspPath = params[0].substr(10); StringUtils::TrimRight(strXspPath, ")"); context = PARTYMODECONTEXT_UNKNOWN; } } if (g_partyModeManager.IsEnabled()) g_partyModeManager.Disable(); else g_partyModeManager.Enable(context, strXspPath); } else if (paramlow == "random" || paramlow == "randomoff" || paramlow == "randomon") { // get current playlist int iPlaylist = CServiceBroker::GetPlaylistPlayer().GetCurrentPlaylist(); // reverse the current setting bool shuffled = CServiceBroker::GetPlaylistPlayer().IsShuffled(iPlaylist); if ((shuffled && paramlow == "randomon") || (!shuffled && paramlow == "randomoff")) return 0; // check to see if we should notify the user bool notify = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "notify")); CServiceBroker::GetPlaylistPlayer().SetShuffle(iPlaylist, !shuffled, notify); // save settings for now playing windows switch (iPlaylist) { case PLAYLIST_MUSIC: CMediaSettings::GetInstance().SetMusicPlaylistShuffled(CServiceBroker::GetPlaylistPlayer().IsShuffled(iPlaylist)); CServiceBroker::GetSettings().Save(); break; case PLAYLIST_VIDEO: CMediaSettings::GetInstance().SetVideoPlaylistShuffled(CServiceBroker::GetPlaylistPlayer().IsShuffled(iPlaylist)); CServiceBroker::GetSettings().Save(); default: break; } // send message CGUIMessage msg(GUI_MSG_PLAYLISTPLAYER_RANDOM, 0, 0, iPlaylist, CServiceBroker::GetPlaylistPlayer().IsShuffled(iPlaylist)); CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg); } else if (StringUtils::StartsWithNoCase(params[0], "repeat")) { // get current playlist int iPlaylist = CServiceBroker::GetPlaylistPlayer().GetCurrentPlaylist(); PLAYLIST::REPEAT_STATE previous_state = CServiceBroker::GetPlaylistPlayer().GetRepeat(iPlaylist); std::string paramlow(params[0]); StringUtils::ToLower(paramlow); PLAYLIST::REPEAT_STATE state; if (paramlow == "repeatall") state = PLAYLIST::REPEAT_ALL; else if (paramlow == "repeatone") state = PLAYLIST::REPEAT_ONE; else if (paramlow == "repeatoff") state = PLAYLIST::REPEAT_NONE; else if (previous_state == PLAYLIST::REPEAT_NONE) state = PLAYLIST::REPEAT_ALL; else if (previous_state == PLAYLIST::REPEAT_ALL) state = PLAYLIST::REPEAT_ONE; else state = PLAYLIST::REPEAT_NONE; if (state == previous_state) return 0; // check to see if we should notify the user bool notify = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "notify")); CServiceBroker::GetPlaylistPlayer().SetRepeat(iPlaylist, state, notify); // save settings for now playing windows switch (iPlaylist) { case PLAYLIST_MUSIC: CMediaSettings::GetInstance().SetMusicPlaylistRepeat(state == PLAYLIST::REPEAT_ALL); CServiceBroker::GetSettings().Save(); break; case PLAYLIST_VIDEO: CMediaSettings::GetInstance().SetVideoPlaylistRepeat(state == PLAYLIST::REPEAT_ALL); CServiceBroker::GetSettings().Save(); } // send messages so now playing window can get updated CGUIMessage msg(GUI_MSG_PLAYLISTPLAYER_REPEAT, 0, 0, iPlaylist, (int)state); CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg); } else if (StringUtils::StartsWithNoCase(params[0], "resumelivetv")) { CFileItem& fileItem(g_application.CurrentFileItem()); PVR::CPVRChannelPtr channel = fileItem.HasPVRRecordingInfoTag() ? fileItem.GetPVRRecordingInfoTag()->Channel() : PVR::CPVRChannelPtr(); if (channel) { CFileItem playItem(channel); if (!g_application.PlayMedia(playItem, "", channel->IsRadio() ? PLAYLIST_MUSIC : PLAYLIST_VIDEO)) { CLog::Log(LOGERROR, "ResumeLiveTv could not play channel: %s", channel->ChannelName().c_str()); return false; } } } else if (paramlow == "reset") { g_application.OnAction(CAction(ACTION_PLAYER_RESET)); } return 0; }
/*! \brief Start playback with a given playback core. * \param params The parameters. * \details params[0] = Name of playback core. */ static int PlayWith(const std::vector<std::string>& params) { g_application.OnAction(CAction(ACTION_PLAYER_PLAY, params[0])); return 0; }
void CGUIWindowFullScreen::MuteProfanity() { if ((g_application.GetCurrentPlayer() == EPC_MPLAYER || g_application.GetCurrentPlayer() == EPC_DVDPLAYER) && g_application.m_pPlayer->GetMuteProfanity()) { bool isMuted = g_application.IsMuted(); if (isMuted && !m_bPMute) return; CStdString subtitleText = "How now brown cow"; double duration; double current; if (g_application.m_pPlayer->GetCurrentSubtitleInfo(subtitleText, duration, current)) { if ((duration <= 0 || current <= 0 || subtitleText.IsEmpty()) && m_bPMute) { CLog::Log(LOGWARNING,"UnMuting because there was an error getting subtitles"); g_application.getApplicationMessenger().SendAction(CAction(ACTION_MUTE)); m_bPMute = false; return; } /* Ignored characters for timing */ subtitleText.Replace("\\r", ""); subtitleText.Replace("\r", ""); subtitleText.Replace("\\n", ""); subtitleText.Replace("\n", ""); subtitleText.Replace("<br>", ""); subtitleText.Replace("\\N", ""); subtitleText.Replace("<i>", ""); subtitleText.Replace("</i>", ""); subtitleText.Replace("<b>", ""); subtitleText.Replace("</b>", ""); subtitleText.Replace("<u>", ""); subtitleText.Replace(" ", ""); subtitleText.Replace("</u>", ""); subtitleText.Replace("</i", ""); subtitleText.Replace("</b", ""); subtitleText.Replace("</u", ""); /* Add extra timing for certain characters */ subtitleText.Replace(" ", " "); subtitleText.Replace(".", ". "); subtitleText.Replace(",", ", "); subtitleText.Replace(";", "; "); subtitleText.Replace(":", ": "); subtitleText.Replace("<p>", " "); subtitleText.Replace("<P>", " "); subtitleText.Trim(); double durationPerChar = duration / subtitleText.length(); double muteStart = -1; double muteEnd = -1; multimap<CStdString, int> m; int indexOfSware = subtitleText.ToLower().Find("skeeter"); if (indexOfSware == -1) { if (m_bPMute) { CLog::Log(LOGWARNING,"UnMuting because no curse words found"); g_application.getApplicationMessenger().SendAction(CAction(ACTION_MUTE)); m_bPMute = false; } return; } double muteDuration = 8 * durationPerChar; muteStart = (indexOfSware -1) * durationPerChar; double muteEnd = muteStart + muteDuration; if (current >= muteStart && current <= muteEnd) { if (!g_application.IsMuted()) { CLog::Log(LOGWARNING, "Muting. Line: %s", subtitleText.c_str()); CLog::Log(LOGWARNING, "current: %d, subtitle duration: %d, muteDuration: %d, muteStart: %d, muteEnd: %d", current, duration, muteDuration, muteStart, muteEnd); g_application.getApplicationMessenger().SendAction(CAction(ACTION_MUTE)); m_bPMute = true; } } else if (g_application.IsMuted()) { CLog::Log(LOGWARNING, "UnMuting. Line: '%s'\n - current: %d, subtitle duration: %d, muteDuration: %d, muteStart: %d, muteEnd: %d", subtitleText.c_str(), current, duration, muteDuration, muteStart, muteEnd); g_application.getApplicationMessenger().SendAction(CAction(ACTION_MUTE)); m_bPMute = false; } } } }
bool CGUIWindowFullScreen::OnAction(const CAction &action) { if (g_application.m_pPlayer != NULL && g_application.m_pPlayer->OnAction(action)) return true; if (m_timeCodePosition > 0 && action.GetButtonCode()) { // check whether we have a mapping in our virtual videotimeseek "window" and have a select action CKey key(action.GetButtonCode()); CAction timeSeek = CButtonTranslator::GetInstance().GetAction(WINDOW_VIDEO_TIME_SEEK, key, false); if (timeSeek.GetID() == ACTION_SELECT_ITEM) { SeekToTimeCodeStamp(SEEK_ABSOLUTE); return true; } } const unsigned int MsgTime = 300; const unsigned int DisplTime = 2000; switch (action.GetID()) { case ACTION_SHOW_OSD: ToggleOSD(); return true; case ACTION_SHOW_GUI: { // switch back to the menu OutputDebugString("Switching to GUI\n"); g_windowManager.PreviousWindow(); OutputDebugString("Now in GUI\n"); return true; } break; case ACTION_PLAYER_PLAY: case ACTION_PAUSE: if (m_timeCodePosition > 0) { SeekToTimeCodeStamp(SEEK_ABSOLUTE); return true; } break; case ACTION_STEP_BACK: if (!g_application.CurrentFileItem().HasPVRChannelInfoTag()) { if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD); else g_application.m_pPlayer->Seek(false, false); } else SeekTV(false, false); return true; case ACTION_STEP_FORWARD: if (!g_application.CurrentFileItem().HasPVRChannelInfoTag()) { if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_FORWARD); else g_application.m_pPlayer->Seek(true, false); } else SeekTV(true, false); return true; case ACTION_BIG_STEP_BACK: if (!g_application.CurrentFileItem().HasPVRChannelInfoTag()) { if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD); else g_application.m_pPlayer->Seek(false, true); } else SeekTV(false, true); return true; case ACTION_BIG_STEP_FORWARD: if (!g_application.CurrentFileItem().HasPVRChannelInfoTag()) { if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_FORWARD); else g_application.m_pPlayer->Seek(true, true); } else SeekTV(true, true); return true; case ACTION_NEXT_SCENE: if (g_application.m_pPlayer->SeekScene(true)) g_infoManager.SetDisplayAfterSeek(); return true; break; case ACTION_PREV_SCENE: if (g_application.m_pPlayer->SeekScene(false)) g_infoManager.SetDisplayAfterSeek(); return true; break; case ACTION_SHOW_OSD_TIME: m_bShowCurrentTime = !m_bShowCurrentTime; if(!m_bShowCurrentTime) g_infoManager.SetDisplayAfterSeek(0); //Force display off g_infoManager.SetShowTime(m_bShowCurrentTime); return true; break; case ACTION_SHOW_SUBTITLES: { g_settings.m_currentVideoSettings.m_SubtitleOn = !g_settings.m_currentVideoSettings.m_SubtitleOn; g_application.m_pPlayer->SetSubtitleVisible(g_settings.m_currentVideoSettings.m_SubtitleOn); CStdString sub; if (g_settings.m_currentVideoSettings.m_SubtitleOn) g_application.m_pPlayer->GetSubtitleName(g_application.m_pPlayer->GetSubtitle(),sub); else sub = g_localizeStrings.Get(1223); g_application.m_guiDialogKaiToast.QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(287), sub, DisplTime, false, MsgTime); } return true; break; case ACTION_SHOW_INFO: { CGUIDialogFullScreenInfo* pDialog = (CGUIDialogFullScreenInfo*)g_windowManager.GetWindow(WINDOW_DIALOG_FULLSCREEN_INFO); if (pDialog) { CFileItem item(g_application.CurrentFileItem()); pDialog->DoModal(); return true; } break; } case ACTION_NEXT_SUBTITLE: { if (g_application.m_pPlayer->GetSubtitleCount() == 0) return true; if(g_settings.m_currentVideoSettings.m_SubtitleStream < 0) g_settings.m_currentVideoSettings.m_SubtitleStream = g_application.m_pPlayer->GetSubtitle(); if (g_settings.m_currentVideoSettings.m_SubtitleOn) { g_settings.m_currentVideoSettings.m_SubtitleStream++; if (g_settings.m_currentVideoSettings.m_SubtitleStream >= g_application.m_pPlayer->GetSubtitleCount()) { g_settings.m_currentVideoSettings.m_SubtitleStream = 0; g_settings.m_currentVideoSettings.m_SubtitleOn = false; g_application.m_pPlayer->SetSubtitleVisible(false); } g_application.m_pPlayer->SetSubtitle(g_settings.m_currentVideoSettings.m_SubtitleStream); } else { g_settings.m_currentVideoSettings.m_SubtitleOn = true; g_application.m_pPlayer->SetSubtitleVisible(true); } CStdString sub; if (g_settings.m_currentVideoSettings.m_SubtitleOn) g_application.m_pPlayer->GetSubtitleName(g_settings.m_currentVideoSettings.m_SubtitleStream,sub); else sub = g_localizeStrings.Get(1223); g_application.m_guiDialogKaiToast.QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(287), sub, DisplTime, false, MsgTime); } return true; break; case ACTION_SUBTITLE_DELAY_MIN: g_settings.m_currentVideoSettings.m_SubtitleDelay -= 0.1f; if (g_settings.m_currentVideoSettings.m_SubtitleDelay < -g_advancedSettings.m_videoSubsDelayRange) g_settings.m_currentVideoSettings.m_SubtitleDelay = -g_advancedSettings.m_videoSubsDelayRange; if (g_application.m_pPlayer) g_application.m_pPlayer->SetSubTitleDelay(g_settings.m_currentVideoSettings.m_SubtitleDelay); ShowSlider(action.GetID(), 22006, g_settings.m_currentVideoSettings.m_SubtitleDelay, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange); return true; break; case ACTION_SUBTITLE_DELAY_PLUS: g_settings.m_currentVideoSettings.m_SubtitleDelay += 0.1f; if (g_settings.m_currentVideoSettings.m_SubtitleDelay > g_advancedSettings.m_videoSubsDelayRange) g_settings.m_currentVideoSettings.m_SubtitleDelay = g_advancedSettings.m_videoSubsDelayRange; if (g_application.m_pPlayer) g_application.m_pPlayer->SetSubTitleDelay(g_settings.m_currentVideoSettings.m_SubtitleDelay); ShowSlider(action.GetID(), 22006, g_settings.m_currentVideoSettings.m_SubtitleDelay, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange); return true; break; case ACTION_SUBTITLE_DELAY: ShowSlider(action.GetID(), 22006, g_settings.m_currentVideoSettings.m_SubtitleDelay, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange, true); return true; break; case ACTION_AUDIO_DELAY: ShowSlider(action.GetID(), 297, g_settings.m_currentVideoSettings.m_AudioDelay, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange, true); return true; break; case ACTION_AUDIO_DELAY_MIN: g_settings.m_currentVideoSettings.m_AudioDelay -= 0.025f; if (g_settings.m_currentVideoSettings.m_AudioDelay < -g_advancedSettings.m_videoAudioDelayRange) g_settings.m_currentVideoSettings.m_AudioDelay = -g_advancedSettings.m_videoAudioDelayRange; if (g_application.m_pPlayer) g_application.m_pPlayer->SetAVDelay(g_settings.m_currentVideoSettings.m_AudioDelay); ShowSlider(action.GetID(), 297, g_settings.m_currentVideoSettings.m_AudioDelay, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange); return true; break; case ACTION_AUDIO_DELAY_PLUS: g_settings.m_currentVideoSettings.m_AudioDelay += 0.025f; if (g_settings.m_currentVideoSettings.m_AudioDelay > g_advancedSettings.m_videoAudioDelayRange) g_settings.m_currentVideoSettings.m_AudioDelay = g_advancedSettings.m_videoAudioDelayRange; if (g_application.m_pPlayer) g_application.m_pPlayer->SetAVDelay(g_settings.m_currentVideoSettings.m_AudioDelay); ShowSlider(action.GetID(), 297, g_settings.m_currentVideoSettings.m_AudioDelay, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange); return true; break; case ACTION_AUDIO_NEXT_LANGUAGE: { if (g_application.m_pPlayer->GetAudioStreamCount() == 1) return true; g_settings.m_currentVideoSettings.m_AudioStream++; if (g_settings.m_currentVideoSettings.m_AudioStream >= g_application.m_pPlayer->GetAudioStreamCount()) g_settings.m_currentVideoSettings.m_AudioStream = 0; g_application.m_pPlayer->SetAudioStream(g_settings.m_currentVideoSettings.m_AudioStream); // Set the audio stream to the one selected CStdString aud; g_application.m_pPlayer->GetAudioStreamName(g_settings.m_currentVideoSettings.m_AudioStream,aud); g_application.m_guiDialogKaiToast.QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(460), aud, DisplTime, false, MsgTime); return true; } break; case REMOTE_0: case REMOTE_1: case REMOTE_2: case REMOTE_3: case REMOTE_4: case REMOTE_5: case REMOTE_6: case REMOTE_7: case REMOTE_8: case REMOTE_9: { if (g_application.CurrentFileItem().IsLiveTV()) { CPVRChannel channel; int iChannelNumber = -1; CPVRManager::Get()->GetCurrentChannel(&channel); if (action.GetID() == REMOTE_0) { iChannelNumber = CPVRManager::Get()->GetPreviousChannel(); } else { int autoCloseTime = g_guiSettings.GetBool("pvrplayback.switchautoclose") ? 1500 : 0; CStdString strChannel; strChannel.Format("%i", action.GetID() - REMOTE_0); if (CGUIDialogNumeric::ShowAndGetNumber(strChannel, g_localizeStrings.Get(19000), autoCloseTime) || autoCloseTime) iChannelNumber = atoi(strChannel.c_str()); } if (iChannelNumber > 0 && iChannelNumber != channel.ChannelNumber()) OnAction(CAction(ACTION_CHANNEL_SWITCH, (float)iChannelNumber)); } else { ChangetheTimeCode(action.GetID()); } return true; } break; case ACTION_ASPECT_RATIO: { // toggle the aspect ratio mode (only if the info is onscreen) if (m_bShowViewModeInfo) { #ifdef HAS_VIDEO_PLAYBACK g_renderManager.SetViewMode(++g_settings.m_currentVideoSettings.m_ViewMode); #endif } m_bShowViewModeInfo = true; m_dwShowViewModeTimeout = CTimeUtils::GetTimeMS(); } return true; break; case ACTION_SMALL_STEP_BACK: if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD); else { int orgpos = (int)g_application.GetTime(); int jumpsize = g_advancedSettings.m_videoSmallStepBackSeconds; // secs int setpos = (orgpos > jumpsize) ? orgpos - jumpsize : 0; g_application.SeekTime((double)setpos); } return true; break; case ACTION_SHOW_PLAYLIST: { CFileItem item(g_application.CurrentFileItem()); if (item.HasPVRChannelInfoTag()) g_windowManager.ActivateWindow(WINDOW_DIALOG_PVR_OSD_CHANNELS); else if (item.HasVideoInfoTag()) g_windowManager.ActivateWindow(WINDOW_VIDEO_PLAYLIST); else if (item.HasMusicInfoTag()) g_windowManager.ActivateWindow(WINDOW_MUSIC_PLAYLIST); } return true; break; case ACTION_ZOOM_IN: { g_settings.m_currentVideoSettings.m_CustomZoomAmount += 0.01f; if (g_settings.m_currentVideoSettings.m_CustomZoomAmount > 2.f) g_settings.m_currentVideoSettings.m_CustomZoomAmount = 2.f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 216, g_settings.m_currentVideoSettings.m_CustomZoomAmount, 0.5f, 0.1f, 2.0f); } return true; break; case ACTION_ZOOM_OUT: { g_settings.m_currentVideoSettings.m_CustomZoomAmount -= 0.01f; if (g_settings.m_currentVideoSettings.m_CustomZoomAmount < 0.5f) g_settings.m_currentVideoSettings.m_CustomZoomAmount = 0.5f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 216, g_settings.m_currentVideoSettings.m_CustomZoomAmount, 0.5f, 0.1f, 2.0f); } return true; break; case ACTION_INCREASE_PAR: { g_settings.m_currentVideoSettings.m_CustomPixelRatio += 0.01f; if (g_settings.m_currentVideoSettings.m_CustomPixelRatio > 2.f) g_settings.m_currentVideoSettings.m_CustomZoomAmount = 2.f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 217, g_settings.m_currentVideoSettings.m_CustomPixelRatio, 0.5f, 0.1f, 2.0f); } return true; break; case ACTION_DECREASE_PAR: { g_settings.m_currentVideoSettings.m_CustomPixelRatio -= 0.01f; if (g_settings.m_currentVideoSettings.m_CustomZoomAmount < 0.5f) g_settings.m_currentVideoSettings.m_CustomPixelRatio = 0.5f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 217, g_settings.m_currentVideoSettings.m_CustomPixelRatio, 0.5f, 0.1f, 2.0f); } return true; break; case ACTION_VSHIFT_UP: { g_settings.m_currentVideoSettings.m_CustomVerticalShift -= 0.01f; if (g_settings.m_currentVideoSettings.m_CustomVerticalShift < -2.0f) g_settings.m_currentVideoSettings.m_CustomVerticalShift = -2.0f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 225, g_settings.m_currentVideoSettings.m_CustomVerticalShift, -2.0f, 0.1f, 2.0f); } return true; break; case ACTION_VSHIFT_DOWN: { g_settings.m_currentVideoSettings.m_CustomVerticalShift += 0.01f; if (g_settings.m_currentVideoSettings.m_CustomVerticalShift > 2.0f) g_settings.m_currentVideoSettings.m_CustomVerticalShift = 2.0f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 225, g_settings.m_currentVideoSettings.m_CustomVerticalShift, -2.0f, 0.1f, 2.0f); } return true; break; default: break; } return CGUIWindow::OnAction(action); }
bool CGUIWindowFullScreen::OnMessage(CGUIMessage& message) { switch (message.GetMessage()) { case GUI_MSG_WINDOW_INIT: { // check whether we've come back here from a window during which time we've actually // stopped playing videos if (message.GetParam1() == WINDOW_INVALID && !g_application.IsPlayingVideo()) { // why are we here if nothing is playing??? g_windowManager.PreviousWindow(); return true; } g_infoManager.SetShowInfo(false); g_infoManager.SetShowCodec(false); m_bShowCurrentTime = false; m_bGroupSelectShow = false; g_infoManager.SetDisplayAfterSeek(0); // Make sure display after seek is off. // switch resolution g_graphicsContext.SetFullScreenVideo(true); #ifdef HAS_VIDEO_PLAYBACK // make sure renderer is uptospeed g_renderManager.Update(false); #endif // now call the base class to load our windows CGUIWindow::OnMessage(message); m_bShowViewModeInfo = false; if (CUtil::IsUsingTTFSubtitles()) { CSingleLock lock (m_fontLock); CStdString fontPath = "special://xbmc/media/Fonts/"; fontPath += g_guiSettings.GetString("subtitles.font"); // We scale based on PAL4x3 - this at least ensures all sizing is constant across resolutions. CGUIFont *subFont = g_fontManager.LoadTTF("__subtitle__", fontPath, color[g_guiSettings.GetInt("subtitles.color")], 0, g_guiSettings.GetInt("subtitles.height"), g_guiSettings.GetInt("subtitles.style"), false, 1.0f, 1.0f, RES_PAL_4x3, true); CGUIFont *borderFont = g_fontManager.LoadTTF("__subtitleborder__", fontPath, 0xFF000000, 0, g_guiSettings.GetInt("subtitles.height"), g_guiSettings.GetInt("subtitles.style"), true, 1.0f, 1.0f, RES_PAL_4x3, true); if (!subFont || !borderFont) CLog::Log(LOGERROR, "CGUIWindowFullScreen::OnMessage(WINDOW_INIT) - Unable to load subtitle font"); else m_subsLayout = new CGUITextLayout(subFont, true, 0, borderFont); } else m_subsLayout = NULL; return true; } case GUI_MSG_WINDOW_DEINIT: { CGUIWindow::OnMessage(message); CGUIDialog *pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_OSD_TELETEXT); if (pDialog) pDialog->Close(true); CGUIDialogSlider *slider = (CGUIDialogSlider *)g_windowManager.GetWindow(WINDOW_DIALOG_SLIDER); if (slider) slider->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_VIDEO_OSD); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_FULLSCREEN_INFO); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_OSD_CHANNELS); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_OSD_GUIDE); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_OSD_DIRECTOR); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_OSD_CUTTER); if (pDialog) pDialog->Close(true); FreeResources(true); CSingleLock lock (g_graphicsContext); g_graphicsContext.SetFullScreenVideo(false); lock.Leave(); #ifdef HAS_VIDEO_PLAYBACK // make sure renderer is uptospeed g_renderManager.Update(false); #endif CSingleLock lockFont(m_fontLock); if (m_subsLayout) { g_fontManager.Unload("__subtitle__"); g_fontManager.Unload("__subtitleborder__"); delete m_subsLayout; m_subsLayout = NULL; } return true; } case GUI_MSG_CLICKED: { unsigned int iControl = message.GetSenderId(); if (iControl == CONTROL_GROUP_CHOOSER) { // Get the currently selected label of the Select button CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), iControl); OnMessage(msg); CStdString strLabel = msg.GetLabel(); if (msg.GetParam1() != 0) { const CPVRChannelGroups *groups = CPVRManager::GetChannelGroups()->Get(CPVRManager::GetClients()->IsPlayingRadio()); CPVRChannelGroup *selectedGroup = (CPVRChannelGroup *) groups->GetByName(strLabel); // Switch to the first channel of the new group if the new group ID is // different from the current one. if (selectedGroup && *selectedGroup != *CPVRManager::Get()->GetPlayingGroup(selectedGroup->IsRadio())) { CPVRManager::Get()->SetPlayingGroup(selectedGroup); OnAction(CAction(ACTION_CHANNEL_SWITCH, (float) groups->GetFirstChannelForGroupID(selectedGroup->GroupID()))); } // hide the control and reset focus m_bGroupSelectShow = false; SET_CONTROL_HIDDEN(CONTROL_GROUP_CHOOSER); // SET_CONTROL_FOCUS(0, 0); } return true; } break; } case GUI_MSG_SETFOCUS: case GUI_MSG_LOSTFOCUS: if (message.GetSenderId() != WINDOW_FULLSCREEN_VIDEO) return true; break; } return CGUIWindow::OnMessage(message); }
bool CGUIWindowFullScreen::OnAction(const CAction &action) { if (g_application.m_pPlayer != NULL && g_application.m_pPlayer->OnAction(action)) return true; if (m_timeCodePosition > 0 && action.GetButtonCode()) { // check whether we have a mapping in our virtual videotimeseek "window" and have a select action CKey key(action.GetButtonCode()); CAction timeSeek = CButtonTranslator::GetInstance().GetAction(WINDOW_VIDEO_TIME_SEEK, key, false); if (timeSeek.GetID() == ACTION_SELECT_ITEM) { SeekToTimeCodeStamp(SEEK_ABSOLUTE); return true; } } const unsigned int MsgTime = 300; const unsigned int DisplTime = 2000; switch (action.GetID()) { case ACTION_SHOW_OSD: ToggleOSD(); return true; case ACTION_SHOW_GUI: { // switch back to the menu OutputDebugString("Switching to GUI\n"); g_windowManager.PreviousWindow(); OutputDebugString("Now in GUI\n"); return true; } break; case ACTION_PLAYER_PLAY: case ACTION_PAUSE: if (m_timeCodePosition > 0) { SeekToTimeCodeStamp(SEEK_ABSOLUTE); return true; } break; case ACTION_STEP_BACK: if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD); else g_application.m_pPlayer->Seek(false, false); return true; break; case ACTION_STEP_FORWARD: if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_FORWARD); else g_application.m_pPlayer->Seek(true, false); return true; break; case ACTION_BIG_STEP_BACK: if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD); else g_application.m_pPlayer->Seek(false, true); return true; break; case ACTION_BIG_STEP_FORWARD: if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_FORWARD); else g_application.m_pPlayer->Seek(true, true); return true; break; case ACTION_NEXT_SCENE: if (g_application.m_pPlayer->SeekScene(true)) g_infoManager.SetDisplayAfterSeek(); return true; break; case ACTION_PREV_SCENE: if (g_application.m_pPlayer->SeekScene(false)) g_infoManager.SetDisplayAfterSeek(); return true; break; case ACTION_SHOW_OSD_TIME: m_bShowCurrentTime = !m_bShowCurrentTime; if(!m_bShowCurrentTime) g_infoManager.SetDisplayAfterSeek(0); //Force display off g_infoManager.SetShowTime(m_bShowCurrentTime); return true; break; case ACTION_SHOW_SUBTITLES: { if (g_application.m_pPlayer->GetSubtitleCount() == 0) return true; g_settings.m_currentVideoSettings.m_SubtitleOn = !g_settings.m_currentVideoSettings.m_SubtitleOn; g_application.m_pPlayer->SetSubtitleVisible(g_settings.m_currentVideoSettings.m_SubtitleOn); CStdString sub, lang; if (g_settings.m_currentVideoSettings.m_SubtitleOn) { g_application.m_pPlayer->GetSubtitleName(g_application.m_pPlayer->GetSubtitle(),sub); g_application.m_pPlayer->GetSubtitleLanguage(g_application.m_pPlayer->GetSubtitle(),lang); if (sub != lang) sub.Format("%s [%s]", sub.c_str(), lang.c_str()); } else sub = g_localizeStrings.Get(1223); CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(287), sub, DisplTime, false, MsgTime); } return true; break; case ACTION_SHOW_INFO: { CGUIDialogFullScreenInfo* pDialog = (CGUIDialogFullScreenInfo*)g_windowManager.GetWindow(WINDOW_DIALOG_FULLSCREEN_INFO); if (pDialog) { pDialog->DoModal(); return true; } break; } case ACTION_NEXT_SUBTITLE: { if (g_application.m_pPlayer->GetSubtitleCount() == 0) return true; if(g_settings.m_currentVideoSettings.m_SubtitleStream < 0) g_settings.m_currentVideoSettings.m_SubtitleStream = g_application.m_pPlayer->GetSubtitle(); if (g_settings.m_currentVideoSettings.m_SubtitleOn) { g_settings.m_currentVideoSettings.m_SubtitleStream++; if (g_settings.m_currentVideoSettings.m_SubtitleStream >= g_application.m_pPlayer->GetSubtitleCount()) { g_settings.m_currentVideoSettings.m_SubtitleStream = 0; g_settings.m_currentVideoSettings.m_SubtitleOn = false; g_application.m_pPlayer->SetSubtitleVisible(false); } g_application.m_pPlayer->SetSubtitle(g_settings.m_currentVideoSettings.m_SubtitleStream); } else { g_settings.m_currentVideoSettings.m_SubtitleOn = true; g_application.m_pPlayer->SetSubtitleVisible(true); } CStdString sub, lang; if (g_settings.m_currentVideoSettings.m_SubtitleOn) { g_application.m_pPlayer->GetSubtitleName(g_settings.m_currentVideoSettings.m_SubtitleStream,sub); g_application.m_pPlayer->GetSubtitleLanguage(g_settings.m_currentVideoSettings.m_SubtitleStream,lang); if (sub != lang) sub.Format("%s [%s]", sub.c_str(), lang.c_str()); } else sub = g_localizeStrings.Get(1223); CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(287), sub, DisplTime, false, MsgTime); } return true; break; case ACTION_SUBTITLE_DELAY_MIN: g_settings.m_currentVideoSettings.m_SubtitleDelay -= 0.1f; if (g_settings.m_currentVideoSettings.m_SubtitleDelay < -g_advancedSettings.m_videoSubsDelayRange) g_settings.m_currentVideoSettings.m_SubtitleDelay = -g_advancedSettings.m_videoSubsDelayRange; if (g_application.m_pPlayer) g_application.m_pPlayer->SetSubTitleDelay(g_settings.m_currentVideoSettings.m_SubtitleDelay); ShowSlider(action.GetID(), 22006, g_settings.m_currentVideoSettings.m_SubtitleDelay, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange); return true; break; case ACTION_SUBTITLE_DELAY_PLUS: g_settings.m_currentVideoSettings.m_SubtitleDelay += 0.1f; if (g_settings.m_currentVideoSettings.m_SubtitleDelay > g_advancedSettings.m_videoSubsDelayRange) g_settings.m_currentVideoSettings.m_SubtitleDelay = g_advancedSettings.m_videoSubsDelayRange; if (g_application.m_pPlayer) g_application.m_pPlayer->SetSubTitleDelay(g_settings.m_currentVideoSettings.m_SubtitleDelay); ShowSlider(action.GetID(), 22006, g_settings.m_currentVideoSettings.m_SubtitleDelay, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange); return true; break; case ACTION_SUBTITLE_DELAY: ShowSlider(action.GetID(), 22006, g_settings.m_currentVideoSettings.m_SubtitleDelay, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange, true); return true; break; case ACTION_AUDIO_DELAY: ShowSlider(action.GetID(), 297, g_settings.m_currentVideoSettings.m_AudioDelay, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange, true); return true; break; case ACTION_AUDIO_DELAY_MIN: g_settings.m_currentVideoSettings.m_AudioDelay -= 0.025f; if (g_settings.m_currentVideoSettings.m_AudioDelay < -g_advancedSettings.m_videoAudioDelayRange) g_settings.m_currentVideoSettings.m_AudioDelay = -g_advancedSettings.m_videoAudioDelayRange; if (g_application.m_pPlayer) g_application.m_pPlayer->SetAVDelay(g_settings.m_currentVideoSettings.m_AudioDelay); ShowSlider(action.GetID(), 297, g_settings.m_currentVideoSettings.m_AudioDelay, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange); return true; break; case ACTION_AUDIO_DELAY_PLUS: g_settings.m_currentVideoSettings.m_AudioDelay += 0.025f; if (g_settings.m_currentVideoSettings.m_AudioDelay > g_advancedSettings.m_videoAudioDelayRange) g_settings.m_currentVideoSettings.m_AudioDelay = g_advancedSettings.m_videoAudioDelayRange; if (g_application.m_pPlayer) g_application.m_pPlayer->SetAVDelay(g_settings.m_currentVideoSettings.m_AudioDelay); ShowSlider(action.GetID(), 297, g_settings.m_currentVideoSettings.m_AudioDelay, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange); return true; break; case ACTION_AUDIO_NEXT_LANGUAGE: { if (g_application.m_pPlayer->GetAudioStreamCount() == 1) return true; if(g_settings.m_currentVideoSettings.m_AudioStream < 0) g_settings.m_currentVideoSettings.m_AudioStream = g_application.m_pPlayer->GetAudioStream(); g_settings.m_currentVideoSettings.m_AudioStream++; if (g_settings.m_currentVideoSettings.m_AudioStream >= g_application.m_pPlayer->GetAudioStreamCount()) g_settings.m_currentVideoSettings.m_AudioStream = 0; g_application.m_pPlayer->SetAudioStream(g_settings.m_currentVideoSettings.m_AudioStream); // Set the audio stream to the one selected CStdString aud; g_application.m_pPlayer->GetAudioStreamName(g_settings.m_currentVideoSettings.m_AudioStream,aud); CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(460), aud, DisplTime, false, MsgTime); return true; } break; case REMOTE_0: case REMOTE_1: case REMOTE_2: case REMOTE_3: case REMOTE_4: case REMOTE_5: case REMOTE_6: case REMOTE_7: case REMOTE_8: case REMOTE_9: { if (g_application.CurrentFileItem().IsLiveTV()) { int channelNr = -1; CStdString strChannel; strChannel.Format("%i", action.GetID() - REMOTE_0); if (CGUIDialogNumeric::ShowAndGetNumber(strChannel, g_localizeStrings.Get(19000))) channelNr = atoi(strChannel.c_str()); if (channelNr > 0) OnAction(CAction(ACTION_CHANNEL_SWITCH, (float)channelNr)); } else { ChangetheTimeCode(action.GetID()); } return true; } break; case ACTION_ASPECT_RATIO: { // toggle the aspect ratio mode (only if the info is onscreen) if (m_bShowViewModeInfo) { #ifdef HAS_VIDEO_PLAYBACK g_renderManager.SetViewMode(++g_settings.m_currentVideoSettings.m_ViewMode); #endif } m_bShowViewModeInfo = true; m_dwShowViewModeTimeout = XbmcThreads::SystemClockMillis(); } return true; break; case ACTION_SMALL_STEP_BACK: if (m_timeCodePosition > 0) SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD); else { int orgpos = (int)g_application.GetTime(); int jumpsize = g_advancedSettings.m_videoSmallStepBackSeconds; // secs int setpos = (orgpos > jumpsize) ? orgpos - jumpsize : 0; g_application.SeekTime((double)setpos); } return true; break; case ACTION_ZOOM_IN: { g_settings.m_currentVideoSettings.m_CustomZoomAmount += 0.01f; if (g_settings.m_currentVideoSettings.m_CustomZoomAmount > 2.f) g_settings.m_currentVideoSettings.m_CustomZoomAmount = 2.f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 216, g_settings.m_currentVideoSettings.m_CustomZoomAmount, 0.5f, 0.1f, 2.0f); } return true; break; case ACTION_ZOOM_OUT: { g_settings.m_currentVideoSettings.m_CustomZoomAmount -= 0.01f; if (g_settings.m_currentVideoSettings.m_CustomZoomAmount < 0.5f) g_settings.m_currentVideoSettings.m_CustomZoomAmount = 0.5f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 216, g_settings.m_currentVideoSettings.m_CustomZoomAmount, 0.5f, 0.1f, 2.0f); } return true; break; case ACTION_INCREASE_PAR: { g_settings.m_currentVideoSettings.m_CustomPixelRatio += 0.01f; if (g_settings.m_currentVideoSettings.m_CustomPixelRatio > 2.f) g_settings.m_currentVideoSettings.m_CustomZoomAmount = 2.f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 217, g_settings.m_currentVideoSettings.m_CustomPixelRatio, 0.5f, 0.1f, 2.0f); } return true; break; case ACTION_DECREASE_PAR: { g_settings.m_currentVideoSettings.m_CustomPixelRatio -= 0.01f; if (g_settings.m_currentVideoSettings.m_CustomZoomAmount < 0.5f) g_settings.m_currentVideoSettings.m_CustomPixelRatio = 0.5f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 217, g_settings.m_currentVideoSettings.m_CustomPixelRatio, 0.5f, 0.1f, 2.0f); } return true; break; case ACTION_VSHIFT_UP: { g_settings.m_currentVideoSettings.m_CustomVerticalShift -= 0.01f; if (g_settings.m_currentVideoSettings.m_CustomVerticalShift < -2.0f) g_settings.m_currentVideoSettings.m_CustomVerticalShift = -2.0f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 225, g_settings.m_currentVideoSettings.m_CustomVerticalShift, -2.0f, 0.1f, 2.0f); } return true; break; case ACTION_VSHIFT_DOWN: { g_settings.m_currentVideoSettings.m_CustomVerticalShift += 0.01f; if (g_settings.m_currentVideoSettings.m_CustomVerticalShift > 2.0f) g_settings.m_currentVideoSettings.m_CustomVerticalShift = 2.0f; g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM; g_renderManager.SetViewMode(VIEW_MODE_CUSTOM); ShowSlider(action.GetID(), 225, g_settings.m_currentVideoSettings.m_CustomVerticalShift, -2.0f, 0.1f, 2.0f); } return true; break; case ACTION_SUBTITLE_VSHIFT_UP: { RESOLUTION_INFO& res_info = g_settings.m_ResInfo[g_graphicsContext.GetVideoResolution()]; int subalign = g_guiSettings.GetInt("subtitles.align"); if ((subalign == SUBTITLE_ALIGN_BOTTOM_OUTSIDE) || (subalign == SUBTITLE_ALIGN_TOP_INSIDE)) { res_info.iSubtitles ++; if (res_info.iSubtitles >= res_info.iHeight) res_info.iSubtitles = res_info.iHeight - 1; ShowSlider(action.GetID(), 274, (float) res_info.iHeight - res_info.iSubtitles, 0.0f, 1.0f, (float) res_info.iHeight); } else { res_info.iSubtitles --; if (res_info.iSubtitles < 0) res_info.iSubtitles = 0; if (subalign == SUBTITLE_ALIGN_MANUAL) ShowSlider(action.GetID(), 274, (float) res_info.iSubtitles, 0.0f, 1.0f, (float) res_info.iHeight); else ShowSlider(action.GetID(), 274, (float) res_info.iSubtitles - res_info.iHeight, (float) -res_info.iHeight, -1.0f, 0.0f); } break; } case ACTION_SUBTITLE_VSHIFT_DOWN: { RESOLUTION_INFO& res_info = g_settings.m_ResInfo[g_graphicsContext.GetVideoResolution()]; int subalign = g_guiSettings.GetInt("subtitles.align"); if ((subalign == SUBTITLE_ALIGN_BOTTOM_OUTSIDE) || (subalign == SUBTITLE_ALIGN_TOP_INSIDE)) { res_info.iSubtitles--; if (res_info.iSubtitles < 0) res_info.iSubtitles = 0; ShowSlider(action.GetID(), 274, (float) res_info.iHeight - res_info.iSubtitles, 0.0f, 1.0f, (float) res_info.iHeight); } else { res_info.iSubtitles++; if (res_info.iSubtitles >= res_info.iHeight) res_info.iSubtitles = res_info.iHeight - 1; if (subalign == SUBTITLE_ALIGN_MANUAL) ShowSlider(action.GetID(), 274, (float) res_info.iSubtitles, 0.0f, 1.0f, (float) res_info.iHeight); else ShowSlider(action.GetID(), 274, (float) res_info.iSubtitles - res_info.iHeight, (float) -res_info.iHeight, -1.0f, 0.0f); } break; } case ACTION_SUBTITLE_ALIGN: { RESOLUTION_INFO& res_info = g_settings.m_ResInfo[g_graphicsContext.GetVideoResolution()]; int subalign = g_guiSettings.GetInt("subtitles.align"); subalign++; if (subalign > SUBTITLE_ALIGN_TOP_OUTSIDE) subalign = SUBTITLE_ALIGN_MANUAL; res_info.iSubtitles = res_info.iHeight - 1; g_guiSettings.SetInt("subtitles.align", subalign); CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(21460), g_localizeStrings.Get(21461 + subalign), TOAST_DISPLAY_TIME, false); break; } default: break; } return CGUIWindow::OnAction(action); }
/*! \brief Control player. * \param params The parameters * \details params[0] = Control to execute. * params[1] = "notify" to notify user (optional, certain controls). */ static int PlayerControl(const std::vector<std::string>& params) { g_application.ResetScreenSaver(); g_application.WakeUpScreenSaverAndDPMS(); std::string paramlow(params[0]); StringUtils::ToLower(paramlow); if (paramlow == "play") { // play/pause // either resume playing, or pause if (g_application.m_pPlayer->IsPlaying()) { if (g_application.m_pPlayer->GetPlaySpeed() != 1) g_application.m_pPlayer->SetPlaySpeed(1, g_application.IsMutedInternal()); else g_application.m_pPlayer->Pause(); } } else if (paramlow == "stop") { g_application.StopPlaying(); } else if (paramlow =="rewind" || paramlow == "forward") { if (g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused()) { int iPlaySpeed = g_application.m_pPlayer->GetPlaySpeed(); if (paramlow == "rewind" && iPlaySpeed == 1) // Enables Rewinding iPlaySpeed *= -2; else if (paramlow == "rewind" && iPlaySpeed > 1) //goes down a notch if you're FFing iPlaySpeed /= 2; else if (paramlow == "forward" && iPlaySpeed < 1) //goes up a notch if you're RWing { iPlaySpeed /= 2; if (iPlaySpeed == -1) iPlaySpeed = 1; } else iPlaySpeed *= 2; if (iPlaySpeed > 32 || iPlaySpeed < -32) iPlaySpeed = 1; g_application.m_pPlayer->SetPlaySpeed(iPlaySpeed, g_application.IsMutedInternal()); } } else if (paramlow == "next") { g_application.OnAction(CAction(ACTION_NEXT_ITEM)); } else if (paramlow == "previous") { g_application.OnAction(CAction(ACTION_PREV_ITEM)); } else if (paramlow == "bigskipbackward") { if (g_application.m_pPlayer->IsPlaying()) g_application.m_pPlayer->Seek(false, true); } else if (paramlow == "bigskipforward") { if (g_application.m_pPlayer->IsPlaying()) g_application.m_pPlayer->Seek(true, true); } else if (paramlow == "smallskipbackward") { if (g_application.m_pPlayer->IsPlaying()) g_application.m_pPlayer->Seek(false, false); } else if (paramlow == "smallskipforward") { if (g_application.m_pPlayer->IsPlaying()) g_application.m_pPlayer->Seek(true, false); } else if (StringUtils::StartsWithNoCase(params[0], "seekpercentage")) { std::string offset; if (params[0].size() == 14) CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) called with no argument"); else if (params[0].size() < 17) // arg must be at least "(N)" CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) called with invalid argument: \"%s\"", params[0].substr(14).c_str()); else { // Don't bother checking the argument: an invalid arg will do seek(0) offset = params[0].substr(15); StringUtils::TrimRight(offset, ")"); float offsetpercent = (float) atof(offset.c_str()); if (offsetpercent < 0 || offsetpercent > 100) CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) argument, %f, must be 0-100", offsetpercent); else if (g_application.m_pPlayer->IsPlaying()) g_application.SeekPercentage(offsetpercent); } } else if (paramlow == "showvideomenu") { if( g_application.m_pPlayer->IsPlaying() ) g_application.m_pPlayer->OnAction(CAction(ACTION_SHOW_VIDEOMENU)); } else if (paramlow == "record") { if( g_application.m_pPlayer->IsPlaying() && g_application.m_pPlayer->CanRecord()) g_application.m_pPlayer->Record(!g_application.m_pPlayer->IsRecording()); } else if (StringUtils::StartsWithNoCase(params[0], "partymode")) { std::string strXspPath; //empty param=music, "music"=music, "video"=video, else xsp path PartyModeContext context = PARTYMODECONTEXT_MUSIC; if (params[0].size() > 9) { if (params[0].size() == 16 && StringUtils::EndsWithNoCase(params[0], "video)")) context = PARTYMODECONTEXT_VIDEO; else if (params[0].size() != 16 || !StringUtils::EndsWithNoCase(params[0], "music)")) { strXspPath = params[0].substr(10); StringUtils::TrimRight(strXspPath, ")"); context = PARTYMODECONTEXT_UNKNOWN; } } if (g_partyModeManager.IsEnabled()) g_partyModeManager.Disable(); else g_partyModeManager.Enable(context, strXspPath); } else if (paramlow == "random" || paramlow == "randomoff" || paramlow == "randomon") { // get current playlist int iPlaylist = g_playlistPlayer.GetCurrentPlaylist(); // reverse the current setting bool shuffled = g_playlistPlayer.IsShuffled(iPlaylist); if ((shuffled && paramlow == "randomon") || (!shuffled && paramlow == "randomoff")) return 0; // check to see if we should notify the user bool notify = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "notify")); g_playlistPlayer.SetShuffle(iPlaylist, !shuffled, notify); // save settings for now playing windows switch (iPlaylist) { case PLAYLIST_MUSIC: CMediaSettings::Get().SetMusicPlaylistShuffled(g_playlistPlayer.IsShuffled(iPlaylist)); CSettings::Get().Save(); break; case PLAYLIST_VIDEO: CMediaSettings::Get().SetVideoPlaylistShuffled(g_playlistPlayer.IsShuffled(iPlaylist)); CSettings::Get().Save(); } // send message CGUIMessage msg(GUI_MSG_PLAYLISTPLAYER_RANDOM, 0, 0, iPlaylist, g_playlistPlayer.IsShuffled(iPlaylist)); g_windowManager.SendThreadMessage(msg); } return 0; }
void CGUIDialogKeyboardGeneric::MoveCursor(int iAmount) { CGUIControl *edit = GetControl(CTL_EDIT); if (edit) edit->OnAction(CAction(iAmount < 0 ? ACTION_CURSOR_LEFT : ACTION_CURSOR_RIGHT)); }
bool CInertialScrollingHandler::ProcessInertialScroll(float frameTime) { //do inertial scroll animation by sending gesture_pan if( m_bScrolling) { float yMovement = 0.0; float xMovement = 0.0; //decrease based on negativ acceleration //calc the overall inertial scrolling time in secs float absolutInertialTime = (CTimeUtils::GetFrameTime() - m_inertialStartTime)/(float)1000; //as long as we aren't over the overall inertial scroll time - do the deacceleration if ( absolutInertialTime < TIME_TO_ZERO_SPEED + TIME_FOR_DEACELLERATION_DECREASE ) { //v = s/t -> s = t * v yMovement = frameTime * m_iFlickVelocity.y; xMovement = frameTime * m_iFlickVelocity.x; //calc new velocity based on deacceleration //v = a*t + v0 m_iFlickVelocity.y = m_inertialDeacceleration.y * frameTime + m_iFlickVelocity.y; m_iFlickVelocity.x = m_inertialDeacceleration.x * frameTime + m_iFlickVelocity.x; //CLog::Log(LOGDEBUG,"velocity: %f dec: %f time: %f", m_iFlickVelocity.y, m_inertialDeacceleration.y, absolutInertialTime); //check if the signs are equal - which would mean we deaccelerated to long and reversed the direction if( (m_inertialDeacceleration.y < 0) == (m_iFlickVelocity.y < 0) ) { m_iFlickVelocity.y = 0; } if( (m_inertialDeacceleration.x < 0) == (m_iFlickVelocity.x < 0) ) { m_iFlickVelocity.x = 0; } //did we scroll long enought for decrease the deacceleration? if( absolutInertialTime > TIME_TO_ZERO_SPEED - TIME_FOR_DEACELLERATION_DECREASE ) { //decrease deacceleration by deacceleration decrease factor m_inertialDeacceleration.y*=DEACELLERATION_DECREASE_FACTOR; m_inertialDeacceleration.x *= DEACELLERATION_DECREASE_FACTOR; } } //if we have movement if( xMovement || yMovement ) { //fire the pan action g_application.OnAction(CAction(ACTION_GESTURE_PAN, 0, m_iLastGesturePoint.x, m_iLastGesturePoint.y, xMovement, yMovement)); //save new gesture point m_iLastGesturePoint.y += yMovement; m_iLastGesturePoint.x += xMovement; } else//no movement -> done { m_bAborting = true;//we are done } } //if we are done - or we where aborted if( m_bAborting ) { //fire gesture end action g_application.OnAction(CAction(ACTION_GESTURE_END, 0, (float)0.0, (float)0.0, (float)0.0, (float)0.0)); m_bAborting = false; m_bScrolling = false; //stop scrolling m_iFlickVelocity.x = 0; m_iFlickVelocity.y = 0; } return true; }