📄 goto.c
字号:
case IR_PLAY_ENTER:
switch (bPbcState)
{
case SV_FF:
case SV_FR:
case SV_SF:
case SV_SR:
case SV_PAUSE:
case SV_STEP:
return (FALSE); // don't process this key in Goto
break;
default:
break;
}
if (fgIsDvdPlay())
{
switch (_bGotoCurItem)
{
case STGOTO_DVD_CHAPTER:
case STGOTO_DVD_TITLE:
case STGOTO_DVD_ANGLE:
case STGOTO_DVD_TIME:
case STGOTO_DVD_TIME_CH:
if (_bGotoState != STGOTO_MAIN)
break;
// check disallowed operations
if (_bGotoCurItem == STGOTO_DVD_TITLE && !fgIsTTLSearchAllow())
break;
if (_bGotoCurItem == STGOTO_DVD_CHAPTER && !fgIsPTTSearchAllow())
break;
if ((_bGotoCurItem == STGOTO_DVD_TIME || _bGotoCurItem == STGOTO_DVD_TIME_CH)
&& !fgIsTimeSearchAllow())
break;
_bGotoState = _bGotoCurItem;
vInvokeFun(_bGotoState, TRUE);
if ((_bGotoCurItem == STGOTO_DVD_CHAPTER || _bGotoCurItem == STGOTO_DVD_TIME || _bGotoCurItem == STGOTO_DVD_TIME_CH) &&
_bGotoState == STGOTO_MAIN)
// go back from that state and need to redraw
{
vRedrawGotoItem(TRUE);
vGotoHLItem(TRUE);
}
break;
case STGOTO_DVD_AUDIO:
// check disallowed operations
if (!fgIsAudioChangeAllow())
break;
case STGOTO_DVD_SUBTITLE:
case STGOTO_DVD_REPEAT:
case STGOTO_DVD_TIMEDISP:
if (_bGotoState == STGOTO_MAIN)
{
_bGotoState = _bGotoCurItem;
}
vInvokeFun(_bGotoState, TRUE);
if (_bGotoState == STGOTO_MAIN)
// go back from that state and need to redraw
{
vRedrawGotoItem(TRUE);
vGotoHLItem(TRUE);
}
break;
}
}
else if (fgIsVcdPlay())
{
switch (_bGotoCurItem)
{
case STGOTO_VCD_TIME_CH:
if (bSharedInfo(SI_TRACK_NO) == 0)
return (TRUE);
case STGOTO_VCD_CHAPTER:
case STGOTO_VCD_TITLE:
case STGOTO_VCD_TIME:
if (_bGotoState != STGOTO_MAIN)
break;
_bGotoState = _bGotoCurItem;
vInvokeFun(_bGotoState, TRUE);
if ((_bGotoCurItem == STGOTO_VCD_TIME || _bGotoCurItem == STGOTO_VCD_CHAPTER || _bGotoCurItem == STGOTO_VCD_TIME_CH)
&& _bGotoState == STGOTO_MAIN)
// go back from that state and need to redraw
{
vRedrawGotoItem(TRUE);
vGotoHLItem(TRUE);
}
break;
case STGOTO_VCD_REPEAT:
// disallow repeat when PBC on
if (bSharedInfo(SI_PBC_SWITCH) == SV_PBC_ON)
break;
case STGOTO_VCD_TIMEDISP:
if (_bGotoState == STGOTO_MAIN)
{
_bGotoState = _bGotoCurItem;
}
vInvokeFun(_bGotoState, TRUE);
if (_bGotoState == STGOTO_MAIN)
// go back from that state and need to redraw
{
vRedrawGotoItem(TRUE);
vGotoHLItem(TRUE);
}
break;
}
}
break;
/*
switch (bPbcState)
{
case SV_PLAY: // show invalid input icon here??
break;
case SV_PAUSE: vSendUopCmd(UOP_PAUSE, 0, 0, 0);
vGotoShowPlayIcon();
break;
}
break;
*/
case IR_UP:
if (_bGotoState == STGOTO_MAIN)
{
vGotoHLItem(FALSE);
if (!_bGotoCurItem--)
{
#ifdef NO_SCROLL_OVER
_bGotoCurItem = 0;
#else
// scroll over the top
_bGotoCurItem = bGotoTotalItem() - 1;
_bGotoBeg = _bGotoCurItem - GOTO_PAGE_ITEM_NUM + 1;
if (_bGotoBeg < 0)
_bGotoBeg = 0;
if (bGotoTotalItem() <= GOTO_PAGE_ITEM_NUM)
vRedrawGotoItem(FALSE);
else
vRedrawGotoItem(TRUE);
#endif /* NO_SCROLL_OVER */
}
else if (_bGotoCurItem < _bGotoBeg && 1)
{
// scrolling up
_bGotoBeg--;
vRedrawGotoItem(TRUE);
}
vGotoHLItem(TRUE);
break;
}
goto UP_DOWN_HANDLER; // temp solution
/*
if (fgIsDvdPlay())
{
switch (_bGotoState)
{
case STGOTO_DVD_AUDIO:
case STGOTO_DVD_SUBTITLE:
case STGOTO_DVD_REPEAT:
case STGOTO_DVD_TIMEDISP:
vInvokeFun(_bGotoState, TRUE);
break;
}
}
else if (fgIsVcdPlay())
{
switch (_bGotoState)
{
case STGOTO_VCD_REPEAT:
case STGOTO_VCD_TIMEDISP:
vInvokeFun(_bGotoState, TRUE);
break;
}
}
break;
*/
case IR_DOWN:
if (_bGotoState == STGOTO_MAIN)
{
vGotoHLItem(FALSE);
_bGotoCurItem = ++_bGotoCurItem % bGotoTotalItem();
if (_bGotoCurItem == 0)
{
#ifdef NO_SCROLL_OVER
_bGotoCurItem = bGotoTotalItem() - 1;
#else
// scroll over the bottom
_bGotoBeg = 0;
if (bGotoTotalItem() <= GOTO_PAGE_ITEM_NUM)
vRedrawGotoItem(FALSE);
else
vRedrawGotoItem(TRUE);
#endif /* NO_SCROLL_OVER */
}
else if (_bGotoCurItem >= _bGotoBeg + GOTO_PAGE_ITEM_NUM)
{
// scrolling down
_bGotoBeg++;
vRedrawGotoItem(TRUE);
}
vGotoHLItem(TRUE);
break;
}
UP_DOWN_HANDLER:
if (fgIsDvdPlay())
{
switch (_bGotoState)
{
case STGOTO_DVD_AUDIO:
case STGOTO_DVD_SUBTITLE:
case STGOTO_DVD_REPEAT:
case STGOTO_DVD_TIMEDISP:
vInvokeFun(_bGotoState, TRUE);
break;
}
}
else if (fgIsVcdPlay())
{
switch (_bGotoState)
{
case STGOTO_VCD_REPEAT:
case STGOTO_VCD_TIMEDISP:
vInvokeFun(_bGotoState, TRUE);
break;
}
}
break;
case IR_LEFT:
if (_bGotoState == STGOTO_MAIN)
break;
if (fgIsDvdPlay())
{
switch (_bGotoState)
{
case STGOTO_DVD_CHAPTER:
case STGOTO_DVD_TITLE:
case STGOTO_DVD_ANGLE:
case STGOTO_DVD_TIME:
case STGOTO_DVD_TIME_CH:
vGotoBackMain();
vRedrawGotoItem(FALSE);
break;
case STGOTO_DVD_AUDIO:
case STGOTO_DVD_SUBTITLE:
case STGOTO_DVD_REPEAT:
case STGOTO_DVD_TIMEDISP:
vGotoBackMain();
vRedrawGotoItem(TRUE);
break;
}
}
else if (fgIsVcdPlay())
{
switch (_bGotoState)
{
case STGOTO_VCD_CHAPTER:
case STGOTO_VCD_TITLE:
case STGOTO_VCD_TIME:
case STGOTO_VCD_TIME_CH:
vGotoBackMain();
vRedrawGotoItem(FALSE);
break;
case STGOTO_VCD_REPEAT:
case STGOTO_VCD_TIMEDISP:
vGotoBackMain();
vRedrawGotoItem(TRUE);
break;
}
}
vGotoHLItem(TRUE);
break;
case IR_DISPLAY:
#ifdef GOTO_STATUS_NO_TTCH
if (bSharedInfo(SI_NTSC_PAL) == SV_PAL)
{
vOsdPosClear(OSD_POS_GOTO_DISP_P);
}
else
{
vOsdPosClear(OSD_POS_GOTO_DISP);
}
#endif
_rOsdStateCtx.bGotoTimeType++;
_rOsdStateCtx.bGotoTimeType %= 4;
vUpdateGotoShow(GOTO_SHOW_PANEL_TIME);
vDealGotoTimedisp(FALSE);
break;
default:
if (_bGotoState != STGOTO_MAIN)
{
vInvokeFun(_bGotoState, TRUE);
break;
}
if (_bIRKey >= IR_INTERNAL_KEY_START)
{
if (fgIsNoInputState() && _bIRKey != IR_CMD_DONE)
{
vOsdPosClear(OSD_POS_ZOOM);
vSendUopCmd(UOP_ZOOM_IN, SV_ZOOM_1, 0, 0x80);
vGotoClose();
vGotoExit();
}
return (FALSE);
}
break;
}
return (TRUE);
}
// common portion of original vDealGotoChapter and vDealGotoTitle
static void v2DigitInputHandler(BYTE bCurr, BYTE bTotal, BYTE bUopId, WORD wY) large
{
BYTE bNum;
BYTE pbStr[] = { 5, '1', '2', '/', '3', '4' };
pbStr[1] = bCurr / 10 + '0';
pbStr[2] = bCurr % 10 + '0';
pbStr[4] = bTotal / 10 + '0';
pbStr[5] = bTotal % 10 + '0';
switch (_bIRKey)
{
case IR_PLAY:
case IR_ENTER:
case IR_PLAY_ENTER:
if (_bInputPos == 0xFF)
{
_bInputPos = 0;
_bInputNum = 0;
pbStr[1] = '_';
pbStr[2] = '0';
vSetMsgCol4(_bWBGotoMenu, 0, 3, 2, 4);
vOsdShowStrXY(GOTO_RITEM_X, wY, _bWBGotoMenu, pbStr);
}
break;
case IR_NUM0:
case IR_NUM1:
case IR_NUM2:
case IR_NUM3:
case IR_NUM4:
case IR_NUM5:
case IR_NUM6:
case IR_NUM7:
case IR_NUM8:
case IR_NUM9:
pbStr[1] = '0' + _bInputNum / 10;
pbStr[2] = '0' + _bInputNum % 10;
bNum = _bIRKey - IR_NUM0;
if (_bInputPos == 0)
{
if (bNum > (bTotal / 10)) // invalid input
break;
_bInputNum = 10 * bNum;
pbStr[1] = '0' + bNum;
pbStr[2] = '_';
_bInputPos++;
}
else
{
if (_bInputNum + bNum > bTotal)
break; // input exceeding valid range
if (_bInputNum + bNum == 0)
break; // input 00
_bInputNum += bNum;
pbStr[2] = '0' + bNum;
_bInputPos++;
}
vSetMsgCol4(_bWBGotoMenu, 0, 3, 2, 4);
vOsdShowStrXY(GOTO_RITEM_X, wY, _bWBGotoMenu, pbStr);
if (_bInputPos == 2) // input completed (2-digit)
{
vSendUopCmd(bUopId, _bInputNum, 0, 0);
vSetMsgCol4(_bWBGotoMenu, 0, 3, 2, 1);
vOsdShowStrXY(GOTO_RITEM_X, wY, _bWBGotoMenu, pbStr);
//vRedrawGotoItem(TRUE);
//vGotoHLItem(TRUE);
vGotoBackMain();
}
break;
}
}
void vDealGotoChapter(BYTE fgDeal) large
{
BYTE bYPos = (fgIsDvdPlay() ? STGOTO_DVD_CHAPTER : STGOTO_VCD_CHAPTER) -
_bGotoBeg;
WORD wY = GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * bYPos;
// when VCD, use PTT as the analogy to DVD's chapter
BYTE bChNo = bSharedInfo(fgIsDvdPlay() ? SI_CHAP_NO : SI_PTT_NO);
BYTE bChNs = bSharedInfo(fgIsDvdPlay() ? SI_CHAP_NS : SI_PTT_NS);
BYTE bDom = bSharedInfo(SI_DVD_DOM);
if (!fgDeal)
{
vShowGotoChapter();
return;
}
if (fgIsDvdPlay() && bSharedInfo(SI_DVD_DOM) != SV_VTSTT_DOM)
{
vGotoBackMain();
return;
}
v2DigitInputHandler(bChNo, bChNs, UOP_PTT_PLAY, wY);
}
void vDealGotoTitle(BYTE fgDeal) large
{
BYTE bYPos = (fgIsDvdPlay() ? STGOTO_DVD_TITLE : STGOTO_VCD_TITLE) -
_bGotoBeg;
WORD wY = GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * bYPos;
// when VCD, use TRACK as the analogy to DVD's title
BYTE bTtNo = bSharedInfo(fgIsDvdPlay() ? SI_TT_NO : SI_TRACK_NO);
BYTE bTtNs = bSharedInfo(fgIsDvdPlay() ? SI_TT_NS : SI_TRACK_NS);
BYTE bUopId;
if (!fgDeal)
{
vShowGotoTitle();
return;
}
if (fgIsDvdPlay())
bUopId = UOP_TITLE_PLAY;
else if (fgIsVcdPlay())
bUopId = UOP_TRACK_PLAY;
v2DigitInputHandler(bTtNo, bTtNs, bUopId, wY);
}
// the following global variables are for vRedrawGotoItemPage() only
// !!! if we use auto variables instead, there will be strange error !!!
static xdata void (*_pvFunBak)(BYTE, BYTE, BYTE) large;
static BYTE xdata _bCntI;
static BYTE xdata _bTotal;
static void vRedrawGotoItemPage(BYTE bTotal, WORD wMsgIdx, void (*pvFun)(BYTE, BYTE, BYTE) large) large
{
_bTotal = bTotal;
_pvFunBak = pvFun;
// clear all pasted messages
vSolidRect(_bWBGotoMenu, GOTO_PANEL_WIDTH + 11, GOTO_ITEM_BEGIN_Y - 2,
GOTO_WINDOW_END_X, GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * 4 + 5, 3);
// draw the top green rectangle and paste menu title
vSolidRect(_bWBGotoMenu, GOTO_LITEM_X, 0,
GOTO_WINDOW_END_X - 17, GOTO_ITEM_BEGIN_Y - 3, 0);
vSetMsgCol4(_bWBGotoMenu, 0, 0, 2, 4);
vOsdPasteMsgXY(GOTO_LITEM_X, GOTO_ITEM_BEGIN_Y - 34,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -