📄 utilhandler.c
字号:
/* * C Source file to handle utility functions * Copyright (c) Sigma Designs 2002-2003. All Rights Reserved. */#include <signal.h>#include <assert.h>#include <unistd.h>#include "OsdWindow.h"#include "utilhandler.h"voidSaveRect(OSD_WINDOW *wPtr, GR_PIXELVAL **pixels, GR_COORD x, GR_COORD y, GR_SIZE width, GR_SIZE height, GR_COLOR bgcolor){ if (*pixels) free((void *)(*pixels)); *pixels = (GR_PIXELVAL *)malloc(width*height); assert(*pixels != NULL); GrReadArea(wPtr->wid, x, y, width, height, *pixels); GrSetGCForeground(wPtr->gc, bgcolor); GrFillRect(wPtr->wid,wPtr->gc,x,y,width,height); GrSetGCForeground(wPtr->gc, MWPALINDEX(255)); //Flush display cache //asm ("mcr p15, 0, r0, c7, c10, 0\n"); return;}voidRestoreRect(OSD_WINDOW *wPtr, GR_PIXELVAL **pixels, GR_COORD x, GR_COORD y, GR_SIZE width, GR_SIZE height){ if (*pixels) { GrFillRect(wPtr->wid,wPtr->gc_pal0, x, y, width, height); GrArea(wPtr->wid, wPtr->gc_pal0, x,y,width,height, *pixels , MWPF_PIXELVAL); free((void *)(*pixels)); //Flush display cache //asm ("mcr p15, 0, r0, c7, c10, 0\n"); } *pixels = NULL; return;}voidSaveVolRect(OSD_WINDOW *wPtr){ SaveRect(wPtr, &volPixels, VOL_X,VOL_Y, VOL_W,VOL_H, MWPALINDEX(0)); return;}voidSavePopupRect(OSD_WINDOW *wPtr){ SaveRect(wPtr, &popupPixels, POPUP_X, POPUP_Y, POPUP_W, POPUP_H, MWPALINDEX(0)); return;}voidRestoreVolRect(OSD_WINDOW *wPtr){ RestoreRect(wPtr, &volPixels, VOL_X,VOL_Y, VOL_W,VOL_H); return;}voidRestorePopupRect(OSD_WINDOW *wPtr){ RestoreRect(wPtr, &popupPixels, POPUP_X, POPUP_Y, POPUP_W, POPUP_H); return;}static void DrawDigit(char *str, char digit, int right_inc){ GR_COORD x; GR_SIZE retwidth, retheight, retbase; GR_GC_ID gc_pal64 = GrNewGC(); // png background is index 64 GrSetGCForeground(gc_pal64, MWPALINDEX(64)); GrSetGCBackground(gc_pal64, MWPALINDEX(0)); GrSetGCFont(gc_pal64, OSD_DEFAULT_FONT_NO); GrSetGCUseBackground(gc_pal64,GR_FALSE); GrGetGCTextSize(gc1,str,curId,GR_TFASCII, &retwidth, &retheight, &retbase); x = curX + retwidth; GrText(wid,gc_pal64,x,curY,&str[curId],1,GR_TFASCII); str[curId] = digit; if (right_inc) { GrText(wid,gc1,x,curY,&str[curId],1,GR_TFASCII); curId += right_inc; GrGetGCTextSize(gc1,str,curId,GR_TFASCII, &retwidth, &retheight, &retbase); GrText(wid,gc_pal244,curX+retwidth,curY,&str[curId],1,GR_TFASCII); } else { GrText(wid,gc_pal244,x,curY,&str[curId],1,GR_TFASCII); } GrDestroyGC(gc_pal64);}//-------------------------// Volume Stuff//static int volDrawn = GR_FALSE, laststeps = 0;static void VolumeTimerHandler(OSD_WINDOW *wPtr, DATA_POINTER ptr){ GrDestroyTimer(wPtr->volumeTid); RestoreVolRect(wPtr); volDrawn = GR_FALSE; RedrawOsd(wPtr); return;}voidCancelVolume(OSD_WINDOW *wPtr){ if (volDrawn) VolumeTimerHandler(wPtr, NULL);}voidDrawVolBar(OSD_WINDOW *wPtr){ int i, vol, steps; char vbarImg[] = "img/vol01.png"; GetVolume(&vol); if (vol < 0) vol = 0; if (vol > 100) vol = 100; steps = vol / 8; if (!volDrawn) { volDrawn = GR_TRUE; SaveVolRect(wPtr); OsdDrawPictureEx(wPtr,VOL_X,VOL_Y,VOL_W,VOL_H,"img/volbkgrnd.png"); if (steps < 9) { vbarImg[8] = 0x30; vbarImg[9] = 0x31+steps; } else { vbarImg[8] = 0x31; vbarImg[9] = 0x30+steps-9; } OsdDrawPictureEx(wPtr,VOL_STEP1_X,VOL_STEP1_Y,VOL_STEP_WIDTH+(VOL_STEP_XINC*steps),VOL_STEP_HEIGHT,vbarImg); } else { if (steps > laststeps) { for (i=laststeps+1; i <= steps; i++) OsdDrawPictureEx(wPtr,VOL_STEP1_X+(i*VOL_STEP_XINC),VOL_STEP1_Y,VOL_STEP_WIDTH,VOL_STEP_HEIGHT,"img/vol01.png"); } else { //Clear the bar for (i=laststeps; i > steps; i--) GrFillRect(wPtr->wid,wPtr->gc_pal6,VOL_STEP1_X+(i*VOL_STEP_XINC),VOL_STEP1_Y,VOL_STEP_WIDTH,VOL_STEP_HEIGHT); } } laststeps = steps; GrDestroyTimer(wPtr->volumeTid); wPtr->VolumeTimerHandler = VolumeTimerHandler; wPtr->volumeTid = GrCreateTimer(wPtr->wid, OSD_TIMEOUT); return;}//---------------------// Search stuff//voidSearchKeydownHandler(OSD_WINDOW *wPtr,DATA_POINTER ptr){ GR_EVENT *event; GR_SIZE retwidth, retheight, retbase; int t = (int)ptr; char digit; event=wPtr->lastevent; switch (event->keystroke.ch) { case SHOW_LEFT_KEYDOWN: GrGetGCTextSize(gc1,txtStr,curId,GR_TFASCII, &retwidth, &retheight, &retbase); GrText(wid,gc1,POPUP_DATA_X + retwidth,curY,&txtStr[curId],1,GR_TFASCII); if (curId <= 0) curId = curIdMax; else { curId--; if (curRow == 0) { if (curId == 2 || curId == 5) curId--; } else { if ((t == DVD_SEARCH) && (curId == 3 || curId == 4 || curId == 5)) curId = 2; } } GrGetGCTextSize(gc1,txtStr,curId,GR_TFASCII, &retwidth, &retheight, &retbase); GrText(wid,gc_pal244,POPUP_DATA_X + retwidth,curY,&txtStr[curId],1,GR_TFASCII); break; case SHOW_RIGHT_KEYDOWN: GrGetGCTextSize(gc1,txtStr,curId,GR_TFASCII, &retwidth, &retheight, &retbase); GrText(wid,gc1,POPUP_DATA_X + retwidth,curY,&txtStr[curId],1,GR_TFASCII); if (curId >= curIdMax) curId = 0; else { curId++; if (curRow == 0) { if (curId == 2 || curId == 5) curId++; } else { if ((t == DVD_SEARCH) && (curId == 3 || curId == 4 || curId == 5)) curId = 6; } } GrGetGCTextSize(gc1,txtStr,curId,GR_TFASCII, &retwidth, &retheight, &retbase); GrText(wid,gc_pal244,POPUP_DATA_X + retwidth,curY,&txtStr[curId],1,GR_TFASCII); break; case SHOW_CANCEL_KEYDOWN: { //Clear current text string to background GR_GC_ID gc_pal64 = GrNewGC(); // png background is index 64 GrSetGCForeground(gc_pal64, MWPALINDEX(64)); GrSetGCBackground(gc_pal64, MWPALINDEX(0)); GrSetGCFont(gc_pal64, OSD_DEFAULT_FONT_NO); GrSetGCUseBackground(gc_pal64,GR_FALSE); GrText(wid,gc_pal64,POPUP_DATA_X,curY,txtStr,-1,GR_TFASCII); GrDestroyGC(gc_pal64); if (curRow == 0) { curId = 0; curIdMax = 7; curY = POPUP_TIME_Y; HMSStr[0] = HMSStr[1] = '0'; HMSStr[3] = HMSStr[4] = '0'; HMSStr[6] = HMSStr[7] = '0'; txtStr = HMSStr; } else { if (t == DVD_SEARCH) { curId = 0; curIdMax = 8; curY = POPUP_CHAPTER_Y; TitleChapterStr[0] = TitleChapterStr[1] = TitleChapterStr[2] = '0'; TitleChapterStr[6] = TitleChapterStr[7] = TitleChapterStr[8] = '0'; txtStr = TitleChapterStr; } else if (t == VCD_SEARCH) { curId = 0; curIdMax = 2; curY = POPUP_CHAPTER_Y; TrackStr[0] = TrackStr[1] = TrackStr[2] = '0'; txtStr = TrackStr; } } goto Text_Redraw; } case SHOW_UP_KEYDOWN: case SHOW_DOWN_KEYDOWN: if (t != TIME_SEARCH) { GrText(wid,gc_pal6,POPUP_DATA_X,curY,txtStr,-1,GR_TFASCII); if (curRow == 0) { curRow = 1; curY = POPUP_CHAPTER_Y; HMSStr[0] = HMSStr[1] = '0'; HMSStr[3] = HMSStr[4] = '0'; HMSStr[6] = HMSStr[7] = '0'; if (t == DVD_SEARCH) { curId = 0; curIdMax = 8; txtStr = TitleChapterStr; } else if (t == VCD_SEARCH) { curId = 0; curIdMax = 2; txtStr = TrackStr; } } else { curRow = 0; curId = 0; curIdMax = 7; curY = POPUP_TIME_Y; if (t == DVD_SEARCH) { TitleChapterStr[0] = TitleChapterStr[1] = TitleChapterStr[2] = '0'; TitleChapterStr[6] = TitleChapterStr[7] = TitleChapterStr[8] = '0'; } else if (t == VCD_SEARCH){ TrackStr[0] = TrackStr[1] = TrackStr[2] = '0'; } txtStr = HMSStr; } Text_Redraw: GrText(wid,gc1,POPUP_DATA_X,POPUP_TIME_Y,HMSStr,-1,GR_TFASCII); if (t == DVD_SEARCH) GrText(wid,gc1,POPUP_DATA_X,POPUP_CHAPTER_Y,TitleChapterStr,-1,GR_TFASCII); else if (t == VCD_SEARCH) GrText(wid,gc1,POPUP_DATA_X,POPUP_CHAPTER_Y,TrackStr,-1,GR_TFASCII); GrGetGCTextSize(gc_pal244,txtStr,curId,GR_TFASCII, &retwidth, &retheight, &retbase); GrText(wid,gc_pal244,POPUP_DATA_X + retwidth,curY,&txtStr[curIdMax],1,GR_TFASCII); } break; case SHOW_ZERO_KEYDOWN: digit = 0x30; goto Search_DrawDigit; case SHOW_ONE_KEYDOWN: digit = 0x31; goto Search_DrawDigit; case SHOW_TWO_KEYDOWN: digit = 0x32; goto Search_DrawDigit; case SHOW_THREE_KEYDOWN: digit = 0x33; goto Search_DrawDigit; case SHOW_FOUR_KEYDOWN: digit = 0x34; goto Search_DrawDigit; case SHOW_FIVE_KEYDOWN: digit = 0x35; goto Search_DrawDigit; case SHOW_SIX_KEYDOWN: digit = 0x36; goto Search_DrawDigit; case SHOW_SEVEN_KEYDOWN: digit = 0x37; goto Search_DrawDigit; case SHOW_EIGHT_KEYDOWN: digit = 0x38; goto Search_DrawDigit; case SHOW_NINE_KEYDOWN: digit = 0x39; Search_DrawDigit: if (curRow == 0) { if (curId == 0 || curId == 3 || curId == 6) DrawDigit(txtStr, digit,1); else if (curId == 1 || curId == 4) DrawDigit(txtStr, digit,2); else DrawDigit(txtStr, digit,0); } else { switch (t) { case DVD_SEARCH: if (curId == 2) DrawDigit(txtStr, digit,4); else if (curId == curIdMax) DrawDigit(txtStr, digit,0); else DrawDigit(txtStr, digit,1); break; case VCD_SEARCH: if (curId == curIdMax) DrawDigit(txtStr, digit,0); else DrawDigit(txtStr, digit,1); break; } } break; case SHOW_ENTER_KEYDOWN: { int hour = (HMSStr[0] - 0x30)*10 + (HMSStr[1] - 0x30); int min = (HMSStr[3] - 0x30)*10 + (HMSStr[4] - 0x30); int sec = (HMSStr[6] - 0x30)*10 + (HMSStr[7] - 0x30); switch (t) { case DVD_SEARCH: { int title = (TitleChapterStr[0] - 0x30)*100 + (TitleChapterStr[1] - 0x30)*10 + (TitleChapterStr[2] - 0x30); int chapter = (TitleChapterStr[6] - 0x30)*100 + (TitleChapterStr[7] - 0x30)*10 + (TitleChapterStr[8] - 0x30); DVDSearch(hour,min,sec,chapter,title); } goto Quit_DVD_VCD_Label; case VCD_SEARCH: { int track = (TrackStr[0] - 0x30)*100 + (TrackStr[1] - 0x30)*10 + (TrackStr[2] - 0x30); VCDSearch(hour,min,sec,track); } goto Quit_DVD_VCD_Label; case TIME_SEARCH: AVISearch(hour,min,sec); goto Quit_AVI_Label; break; } } break; case SHOW_POWER_KEYDOWN: case SHOW_OPEN_KEYDOWN: if (t == TIME_SEARCH) { RestorePopupRect(wPtr); OpenKeydownHandler(); } else { //goto Quit_DVD_VCD_Label; RestorePopupRect(wPtr); RedrawOsd(wPtr); MapMainWindow(wPtr, (DATA_POINTER)GR_FALSE); OsdKbHandler(wPtr, NULL); } break; case SHOW_SEARCH_KEYDOWN: Quit_DVD_VCD_Label: RestorePopupRect(wPtr); RedrawOsd(wPtr); MapMainWindow(wPtr, (DATA_POINTER)GR_FALSE); break; case SHOW_TIME_SEARCH_KEYDOWN: Quit_AVI_Label: RestorePopupRect(wPtr); RedrawOsd(wPtr); wPtr->KbdHandler = PlayfileKeydownHandler; break; } return;}void MapSearchHandler(OSD_WINDOW *wPtr, DATA_POINTER ptr){ int t = (int)ptr; gc1 = wPtr->gc; gc_pal0 = wPtr->gc_pal0; gc_pal6 = wPtr->gc_pal6; gc_pal244 = wPtr->gc_pal244; wid = wPtr->wid; wPtr->KbdHandler = SearchKeydownHandler; wPtr->KbdHandler_dptr = ptr; SavePopupRect(wPtr); OsdDrawPictureEx(wPtr, POPUP_X, POPUP_Y, POPUP_W,POPUP_H,"img/popup.png"); //Draw 00:00:00 HMSStr[0] = HMSStr[1] = '0'; HMSStr[3] = HMSStr[4] = '0'; HMSStr[6] = HMSStr[7] = '0'; curRow = 0; curId = 0; curIdMax = 7; curY = POPUP_TIME_Y; txtStr = HMSStr; curX = POPUP_DATA_X; TitleChapterStr[0] = TitleChapterStr[1] = TitleChapterStr[2] = '0'; TitleChapterStr[6] = TitleChapterStr[7] = TitleChapterStr[8] = '0'; TrackStr[0] = TrackStr[1] = TrackStr[2] = '0'; switch (t) { case DVD_SEARCH: GrText(wid,gc1,POPUP_HEADER_X,POPUP_HEADER_Y,"DVD Search",-1,GR_TFASCII); GrText(wid,gc1,POPUP_TEXT_X,POPUP_CHAPTER_Y,"Title/Chapter:",-1,GR_TFASCII); break; case VCD_SEARCH:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -