📄 osdhandler.cc
字号:
//// Copyright (c) 2005 by Istv醤 V醨adi//// This file is part of dxr3Player, a DVD player written specifically // for the DXR3 (aka Hollywood+) decoder card.// This program is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation; either version 2 of the License, or// (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with this program; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA//------------------------------------------------------------------------------#include "OSDHandler.h"#include "output/unichrome/osd/DVDInfoFrame.h"#include "output/unichrome/osd/VolumeFrame.h"#include "output/osd/DVDPosition.h"#include "unichrome/Unichrome.h"#include "unichrome/Icon.h"#include "unichrome/Font.h"#include "unichrome/MemoryBlock.h"#include "unichrome/LogicalWindow.h"#include "util/Util.h"#include "util/Config.h"//------------------------------------------------------------------------------using output::unichrome::OSDHandler;using output::unichrome::osd::Frame;using output::unichrome::osd::DVDInfoFrame;using output::unichrome::osd::VolumeFrame;using output::unichrome::osd::RoundedField;using output::osd::DVDPosition;using output::osd::SimpleCommand;using unichrome::Unichrome;using unichrome::Icon;using unichrome::Font;using unichrome::Window;using unichrome::LogicalWindow;//------------------------------------------------------------------------------OSDHandler::OSDHandler(Unichrome& videoDevice) : CommandBasedOSDHandler("output::unichrome::OSDHandler"), videoDevice(videoDevice), normalFont(videoDevice, "normal.fnt", Config::get().dataDirectory), dvdInfoFrame(0), volumeFrame(0), frameTimeouts(2){}//------------------------------------------------------------------------------OSDHandler::~OSDHandler(){}//------------------------------------------------------------------------------void OSDHandler::disableDVDInfo(){ CommandBasedOSDHandler::disableDVDInfo(); dvdInfoFrame->hide(); dvdInfoFrame->resetFireTime(); videoDevice.flush();}//------------------------------------------------------------------------------void OSDHandler::run(){ Frame::Config frameConfig(videoDevice, normalFont); RoundedField::Config numericFieldConfig(videoDevice, normalFont, fieldBackgroundColor, "0123456789:/"); RoundedField::Config capitalFieldConfig(videoDevice, normalFont, fieldBackgroundColor, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); Window& mainWindow = videoDevice.getFrameBufferWindow(); char iconDirectory[256]; snprintf(iconDirectory, sizeof(iconDirectory), "%s/icons", Config::get().dataDirectory); dvdInfoFrame = new DVDInfoFrame(frameConfig, mainWindow, numericFieldConfig, capitalFieldConfig, iconDirectory); dvdInfoFrame->setDisplayPosition((mainWindow.getWidth() - DVDInfoFrame::width) / 2, mainWindow.getHeight() - DVDInfoFrame::height - DVDInfoFrame::bottomOffset); frameTimeouts.setTimeout(1, dvdInfoFrame); volumeFrame = new VolumeFrame(frameConfig, mainWindow, numericFieldConfig); volumeFrame->setDisplayPosition((mainWindow.getWidth() - VolumeFrame::width) / 2, mainWindow.getHeight() - VolumeFrame::height - VolumeFrame::bottomOffset); frameTimeouts.setTimeout(0, volumeFrame); videoDevice.flush(); CommandBasedOSDHandler::run();}//------------------------------------------------------------------------------void OSDHandler::handleUpdateDVDPosition(const DVDPosition& dvdPosition){ dvdInfoFrame->setPosition(dvdPosition);}//------------------------------------------------------------------------------void OSDHandler::handleUpdateDVDLanguages(unsigned audioLanguageCode, unsigned spuLanguageCode){ dvdInfoFrame->setLanguages(audioLanguageCode, spuLanguageCode);}//------------------------------------------------------------------------------void OSDHandler::handleUpdateVolume(unsigned volume){ volumeFrame->setVolume(volume); showVolumeFrame(Util::currentTimeMillis() + 5000);}//------------------------------------------------------------------------------void OSDHandler::handleSimpleCommand(SimpleCommand::type_t type){ switch(type) { case SimpleCommand::SHOW: if (dvdInfoFrame->isVisible()) { if (dvdInfoFrame->getFireTime()==INVALID_MILLIS) { dvdInfoFrame->hide(); } else { dvdInfoFrame->resetFireTime(); } } else { showDVDInfoFrame(Util::currentTimeMillis() + 5000); } break; case SimpleCommand::PLAYMODE_PLAY: dvdInfoFrame->setPlayMode(FORWARD); showDVDInfoFrame(Util::currentTimeMillis() + 5000); break; case SimpleCommand::PLAYMODE_PAUSE: dvdInfoFrame->setPlayMode(PAUSED); showDVDInfoFrame(INVALID_MILLIS); break; case SimpleCommand::PLAYMODE_FAST_FORWARD_1: dvdInfoFrame->setPlayMode(FAST_FORWARD_1); showDVDInfoFrame(INVALID_MILLIS); break; case SimpleCommand::PLAYMODE_FAST_FORWARD_2: dvdInfoFrame->setPlayMode(FAST_FORWARD_2); showDVDInfoFrame(INVALID_MILLIS); break; case SimpleCommand::PLAYMODE_FAST_FORWARD_3: dvdInfoFrame->setPlayMode(FAST_FORWARD_3); showDVDInfoFrame(INVALID_MILLIS); break; case SimpleCommand::PLAYMODE_FAST_BACKWARD_1: dvdInfoFrame->setPlayMode(FAST_BACKWARD_1); showDVDInfoFrame(INVALID_MILLIS); break; case SimpleCommand::PLAYMODE_FAST_BACKWARD_2: dvdInfoFrame->setPlayMode(FAST_BACKWARD_2); showDVDInfoFrame(INVALID_MILLIS); break; case SimpleCommand::PLAYMODE_FAST_BACKWARD_3: dvdInfoFrame->setPlayMode(FAST_BACKWARD_3); showDVDInfoFrame(INVALID_MILLIS); break; }}//------------------------------------------------------------------------------millis_t OSDHandler::finalizeUpdates(){ millis_t nextTime = frameTimeouts.fire(Util::currentTimeMillis()); if (dvdInfoFrame->isVisible()) dvdInfoFrame->show(); if (volumeFrame->isVisible()) volumeFrame->show(); videoDevice.flush(); return nextTime;}//------------------------------------------------------------------------------millis_t OSDHandler::handleTimeout(){ millis_t nextTime = frameTimeouts.fire(Util::currentTimeMillis()); videoDevice.flush(); return nextTime;}//------------------------------------------------------------------------------void OSDHandler::showDVDInfoFrame(millis_t timeout){ if (!dvdInfoEnabled) return; if (!dvdInfoFrame->isVisible()) { if (volumeFrame->isVisible() && volumeFrame->getDisplayY() >= dvdInfoFrame->getDisplayY()) { volumeFrame->hide(); volumeFrame->resetFireTime(); } } dvdInfoFrame->show(); dvdInfoFrame->setFireTime(timeout);}//------------------------------------------------------------------------------void OSDHandler::showVolumeFrame(millis_t timeout){ if (!volumeFrame->isVisible()) { size_t y = 0; if (dvdInfoFrame->isVisible()) { y = dvdInfoFrame->getDisplayY() - VolumeFrame::height - 10; } else { Window& mainWindow = videoDevice.getFrameBufferWindow(); y = mainWindow.getHeight() - VolumeFrame::height - VolumeFrame::bottomOffset; } volumeFrame->setDisplayPosition(volumeFrame->getDisplayX(), y); } volumeFrame->show(); volumeFrame->setFireTime(timeout);}//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -