/*************************************************************************** * Copyright (c) 2003-2006, Broadcom Corporation * All Rights Reserved * Confidential Property of Broadcom Corporation * * THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE * AGREEMENT BETWEEN THE USER AND BROADCOM. YOU HAVE NO RIGHT TO USE OR * EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT. * * $brcm_Workfile: $ * $brcm_Revision: $ * $brcm_Date: $ * * Module Description: * * Revision History: * * $brcm_Log: $ * ***************************************************************************/ #define MAX_GUIDE_ENTRIES 9 #ifdef CONFIG_DVB #include "dvb_parser.h" #endif /* Define to test guide drawing and selection control without PSIP guide data */ /* #define STATIC_GUIDE_TEST */ #define GUIDE_MIN(x,y) ((x < y) ? x : y) #define eSCREEN_GUIDE_X 82 #define eSCREEN_GUIDE_Y_OFF 130 #define eSCREEN_GUIDE_HEIGHT 30 #define eSCREEN_GUIDE_CH_WIDTH 55 #define eSCREEN_GUIDE_CALLSIGN_WIDTH 90 #define eSCREEN_GUIDE_CH_NAME_X 138 #define eSCREEN_GUIDE_CH_NAME_WIDTH 30 #define eSCREEN_GUIDE_NEXT_X 445 #define eSCREEN_GUIDE_CUR_X 235 #define eSCREEN_GUIDE_NAME_WIDTH 196 #define eSCREEN_GUIDE_SPACING 30 #define guide_text_box(s,f,x,y,w,h,m,l,cf,cb,o,lsp) text_box(s,f,x,y,w,h,m,l,cf,lsp) static void draw_guide_entry(bapp_t *p_app, bscreen_t *p_screen, guide_state_t *p_gs, int idx, chm_info_t *p_info, bool selected); static chm_info_t* screen_guide_get_info(bapp_t *p_app, int idx); guide_state_t g_guide_state = { 0, 0, 1, "", { eS_EVENT_MAX, 0, 0}, 0, 0, 0 }; /* Summary: Guide event handling. return 0 if no redrawing should be done. . */ int screen_guide_move(bapp_t *p_app, bscreen_t *p_screen, int up) { int start_idx,end_idx,num_disp,result,old_sel; guide_state_t *p_gs; p_gs = (guide_state_t*)p_screen->local_state; chm_info_t *p_info; chm_info_t *p_old_info; BDBG_ASSERT(p_gs); result = 0; if (p_app->settings.ch_map.vch_map.num_vch < 2) return result; start_idx = p_gs->offset; end_idx = GUIDE_MIN((p_app->settings.ch_map.vch_map.num_vch - 1), (p_gs->offset + (MAX_GUIDE_ENTRIES - 1))); num_disp = (end_idx - start_idx + 1); old_sel = p_gs->selection; /* If moving selection up */ if (up > 0) { if (p_gs->selection == 0) { /* already at top */ } else if (up >= MAX_GUIDE_ENTRIES) { /* jump one page up */ start_idx -= MAX_GUIDE_ENTRIES; p_gs->selection -= MAX_GUIDE_ENTRIES; if (start_idx < 0) { BDBG_ERR(("start_idx = %d < 0\n", start_idx)); start_idx = 0; p_gs->selection = start_idx; } p_gs->offset = start_idx; result = 1; } else if (p_gs->selection > start_idx) { p_gs->selection--; p_old_info = screen_guide_get_info(p_app,old_sel); p_info = screen_guide_get_info(p_app,p_gs->selection); draw_guide_entry(p_app,p_screen,p_gs, p_gs->selection,p_info,true); draw_guide_entry(p_app,p_screen,p_gs, old_sel,p_old_info,false); result = 1; } else if (start_idx > 0) { start_idx -= MAX_GUIDE_ENTRIES; if (start_idx < 0) { BDBG_ERR(("start_idx = %d < 0\n", start_idx)); start_idx = 0; p_gs->selection = start_idx; } p_gs->offset = start_idx; p_gs->selection--; result = 1; } else { /* Do nothing */ } } else /* moving selection down */ { if (p_gs->selection == (p_app->settings.ch_map.vch_map.num_vch - 1)) { /* already at bottom */ } else if (up <= -MAX_GUIDE_ENTRIES) { /* jump one page down */ p_gs->offset += MAX_GUIDE_ENTRIES; p_gs->selection += MAX_GUIDE_ENTRIES; if (p_gs->offset >= p_app->settings.ch_map.vch_map.num_vch) { BDBG_ERR(("p_gs->offset = %d >= %d\n", p_gs->offset,p_app->settings.ch_map.vch_map.num_vch)); p_gs->offset -= MAX_GUIDE_ENTRIES; } if (p_gs->selection >= p_app->settings.ch_map.vch_map.num_vch) { BDBG_ERR(("p_gs->selection = %d >= %d\n", p_gs->selection,p_app->settings.ch_map.vch_map.num_vch)); p_gs->selection = p_app->settings.ch_map.vch_map.num_vch - 1; } result = 1; } else if (p_gs->selection < end_idx) { p_gs->selection++; p_old_info = screen_guide_get_info(p_app,old_sel); p_info = screen_guide_get_info(p_app,p_gs->selection); draw_guide_entry(p_app,p_screen,p_gs, old_sel,p_old_info,false); draw_guide_entry(p_app,p_screen,p_gs, p_gs->selection,p_info,true); result = 1; } else if ((end_idx == p_app->settings.ch_map.vch_map.num_vch) || (num_disp < MAX_GUIDE_ENTRIES)) { /* do nothing */ } else { p_gs->offset += MAX_GUIDE_ENTRIES; p_gs->selection++; if (p_gs->offset >= p_app->settings.ch_map.vch_map.num_vch) { BDBG_ERR(("p_gs->offset = %d >= %d\n", p_gs->offset,p_app->settings.ch_map.vch_map.num_vch)); p_gs->offset -= MAX_GUIDE_ENTRIES; p_gs->selection = p_app->settings.ch_map.vch_map.num_vch - 1; } result = 1; } } return result; } /* Summary: Guide event handling . */ int screen_guide_event(void *v_app, void *v_screen, bscreen_event_t *p_event) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; guide_state_t *p_gs; int result = 0; p_gs = (guide_state_t*)p_screen->local_state; BDBG_ASSERT(p_gs); switch (p_event->type) { case eS_EVENT_SETUP: { #ifdef CONFIG_DVB_SUBTITLE bapp_dsub_enable(p_app->dsub, false, 0); #endif bscreen_default_setup(v_app,v_screen); p_gs->column = 1; if (p_app->settings.ch_map.cur_ch) { p_gs->offset = (p_app->settings.ch_map.cur_ch/MAX_GUIDE_ENTRIES) * MAX_GUIDE_ENTRIES; p_gs->selection = p_app->settings.ch_map.cur_ch; } else { p_gs->selection = 0; p_gs->offset = 0; } memset(&p_gs->event,0,sizeof(p_gs->event)); p_gs->repeat_rate = 1; p_gs->repeat_timeout = DEFAULT_REPEAT_TIMEOUT/p_gs->repeat_rate; result = 1; /* always handle event */ bapp_enable_cc(p_app, 0); bapp_eia708_enable(p_app->eia708, false); if (p_app->settings.ch_map.vch_map.num_vch == 0) { /* set update progress to done since there are no channels */ p_gs->update_progress = 100; } else { bos_sleep(20); /* give time for command to be processed */ } bapp_audio_do_mute(p_app, true); } break; case eS_EVENT_SETUP_DONE: { } break; case eS_EVENT_PROGRESS: { p_gs->update_progress = p_event->id; if (p_gs->update_progress < 100) { int num_chars = SCREEN_MAX_STR_WIDTH; int w = 0; int h = 0; /* draw progress text */ bscreen_get_string(p_app->lang,eTEXT_GUIDE_DL_PROGRESS, p_app->tmp_str, &num_chars); bgfx_string_info(p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],(const unsigned long *)p_app->tmp_str,num_chars,&w,&h); text_box_shadow(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL], ePROGRESS_GUIDE_X - w - 7, ePROGRESS_GUIDE_TEXT_Y, w + 3, ePROGRESS_GUIDE_TEXT_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_MED_YELLOW,eCOLOR_BLACK, eMENU_TEXT_DROPSHADOW ,100); bscreen_draw_progress(v_app, ePROGRESS_GUIDE_X, ePROGRESS_GUIDE_Y, ePROGRESS_GUIDE_WIDTH, ePROGRESS_GUIDE_HEIGHT, eBUTTON_VOL_PROGRESS_BORDER, eCOLOR_WHITE, eCOLOR_DRK_BLUE, p_gs->update_progress, 100); } else { bgfx_fill_rect(&p_app->surf,ePROGRESS_GUIDE_TEXT_X,ePROGRESS_GUIDE_Y, ePROGRESS_GUIDE_X+ePROGRESS_GUIDE_WIDTH-ePROGRESS_GUIDE_TEXT_X+3,ePROGRESS_GUIDE_HEIGHT+3,eCOLOR_LT_BLUE); } result = 1; } break; case eS_EVENT_REDRAW: { result = 1; } break; case eS_EVENT_IR: { switch (p_event->id) { case eIR_SELECT: if (p_gs->column == 1) { p_app->chm_cmd.cmd_id = eCHM_CANCEL; chm_cmd(&p_app->chm, &p_app->chm_cmd); BDBG_WRN(("Current Selection %d\n", p_gs->selection)); bos_sleep(500); /* Give chance for cancel to take effect - JPF are we sure this is necessary??? */ bapp_set_channel(p_app, p_app->settings.ch_map.vch_map.vch[p_gs->selection].ch_num/*, p_app->settings.ch_map.vch_map.vch[p_gs->selection].minor*/); bapp_set_current_screen(p_app,eSCREEN_BANNER,eSCREEN_NULL); } else { } result = 1; break; case eIR_MENU: case eIR_GUIDE: #if 0 p_app->chm_cmd.cmd_id = eCHM_CANCEL; chm_cmd(&p_app->chm,&p_app->chm_cmd); BDBG_WRN(("Current Selection %d\n", p_gs->selection)); bos_sleep(500); /* Give chance for cancel to take effect */ #endif /* p_app->settings.ch_map.cur_ch = p_gs->selection;*/ bapp_goto_last_screen(p_app); bapp_tune(p_app); result = 1; break; case eIR_CH_UP: result = screen_guide_move(p_app,p_screen,MAX_GUIDE_ENTRIES); break; case eIR_UP: result = screen_guide_move(p_app,p_screen,1); break; case eIR_CH_DOWN: result = screen_guide_move(p_app,p_screen,-MAX_GUIDE_ENTRIES); break; case eIR_DOWN: result = screen_guide_move(p_app,p_screen,0); break; default: break; } p_gs->event = *p_event; p_gs->repeat_rate = 1; p_gs->repeat_timeout = bos_getticks() + (DEFAULT_REPEAT_TIMEOUT/p_gs->repeat_rate); } break; case eS_EVENT_IDLE: { if (p_gs->repeat_timeout < bos_getticks()) { /* Handle repeating when key is held down */ if (p_gs->event.type == eS_EVENT_IR) { switch (p_gs->event.id) { case eIR_UP: case eIR_CH_UP: result = screen_guide_move(p_app,p_screen,1); break; case eIR_DOWN: case eIR_CH_DOWN: result = screen_guide_move(p_app,p_screen,0); break; default: break; } } if (p_gs->repeat_rate < MAX_REPEAT_ACCEL) { p_gs->repeat_rate += REPEAT_INC; } p_gs->repeat_timeout = bos_getticks() + (DEFAULT_REPEAT_TIMEOUT/p_gs->repeat_rate); } if (!result) result = bscreen_default_idle(v_app,v_screen); } break; default: { result = bscreen_default_event(v_app,v_screen,p_event); } break; } return result; } /* Summary: Draw the guide entry . */ static void draw_guide_entry(bapp_t *p_app, bscreen_t *p_screen, guide_state_t *p_gs, int idx, chm_info_t *p_info, bool selected) { int x,y,num_chars,w,h,str_y,l_idx; int bkgnd_color = eCOLOR_MED_BLUE; int offset = 4; int guide_width; l_idx = idx; vch_t vch; st_t st; freq_t freq; if (!ch_map_get_current(bapp_cur_ch_map(p_app),&vch,&st,&freq)) { BDBG_MSG(("Invalid current channel or map.\n")); return; } if (p_app->settings.ch_map.vch_map.num_vch == 0) return; /* alternate medium and lt blue background */ bkgnd_color = ((l_idx % 2) ? eCOLOR_MED_BLUE : eCOLOR_LT_BLUE); bgfx_fill_rect(&p_app->surf,eSCREEN_ACTION_SAFE_X+offset,eSCREEN_GUIDE_Y_OFF + (eSCREEN_GUIDE_HEIGHT * (l_idx % MAX_GUIDE_ENTRIES)), eSCREEN_ACTION_SAFE_WIDTH - (2*offset), eSCREEN_GUIDE_HEIGHT,bkgnd_color); /* String for channel column */ num_chars = snprintf(p_gs->ch_num_str,24,"%d", p_app->settings.ch_map.vch_map.vch[idx].ch_num/*, p_app->settings.ch_map.vch_map.vch[idx].minor*/); num_chars = c_to_uni_str(p_gs->ch_num_str,p_app->tmp_str,num_chars); bgfx_string_info(p_app->p_font[p_app->lang][eFONT_SIZE_SMALL], (const unsigned long *)p_app->tmp_str,num_chars,&w,&h); /* draw channel number column */ if ( l_idx >= MAX_GUIDE_ENTRIES) l_idx = (l_idx % MAX_GUIDE_ENTRIES); x = eSCREEN_GUIDE_X; y = eSCREEN_GUIDE_Y_OFF + (eSCREEN_GUIDE_HEIGHT * l_idx); str_y = y + (eSCREEN_GUIDE_HEIGHT - h)/2; guide_text_box(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL], x, str_y, eSCREEN_GUIDE_CH_WIDTH, eSCREEN_GUIDE_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,eCOLOR_BLACK, eMENU_TEXT_DROPSHADOW ,eSCREEN_GUIDE_SPACING); /* String for channel short name column */ num_chars = MAX_CH_NAME_CHARS; num_chars = c_to_uni_str(st.name,p_app->tmp_str,num_chars); if (num_chars == 0) { num_chars = MAX_CH_NAME_CHARS; bscreen_get_string(p_app->lang,eTEXT_NA_GUIDE_CH, p_app->tmp_str, &num_chars); } /* draw channel short name column */ x = eSCREEN_GUIDE_CH_NAME_X; bgfx_fill_rect(&p_app->surf,x, y, eSCREEN_GUIDE_CALLSIGN_WIDTH,eSCREEN_GUIDE_HEIGHT,bkgnd_color); guide_text_box(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL], x, str_y, eSCREEN_GUIDE_CALLSIGN_WIDTH, eSCREEN_GUIDE_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,eCOLOR_BLACK, eMENU_TEXT_DROPSHADOW ,eSCREEN_GUIDE_SPACING); /* String channel name column */ if (p_info) num_chars = c_to_uni_str(p_info->eit_info[EIT_CURRENT].prog_title,p_app->tmp_str,MAX_TITLE_CHARS); else num_chars = 0; if (num_chars == 0) { /* num_chars = snprintf(p_gs->ch_num_str,31,"Channel - %d.%d", */ /* p_app->settings.ch_map.vch_map.vch[idx].major,*/ /* p_app->settings.ch_map.vch_map.vch[idx].minor);*/ /* num_chars = c_to_uni_str(p_gs->ch_num_str,p_app->tmp_str,num_chars);*/ num_chars = SCREEN_MAX_STR_WIDTH; bscreen_get_string(p_app->lang,eTEXT_NO_GUIDE_DATA, p_app->tmp_str, &num_chars); } x = eSCREEN_GUIDE_CUR_X; guide_width = eSCREEN_GUIDE_NAME_WIDTH; bgfx_fill_rect(&p_app->surf,x-1, y, guide_width + 2,eSCREEN_GUIDE_HEIGHT,bkgnd_color); if (selected && (p_gs->column == 1)) { bbutton_t button; button.text_id = eTEXT_MAX; button.desc_text_id = eTEXT_MAX; button.type = eBUTTON_MENU; button.x = x-offset; button.y = y; button.width = guide_width+offset; button.height = eSCREEN_GUIDE_HEIGHT; bscreen_draw_button_str(p_app,&button,selected,0,p_app->tmp_str, num_chars,NULL,0,eFONT_SIZE_SMALL,0); } else { /* draw channel name column */ guide_text_box(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL], x, str_y, guide_width, eSCREEN_GUIDE_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,eCOLOR_BLACK, eMENU_TEXT_DROPSHADOW ,eSCREEN_GUIDE_SPACING); } /* String for current column */ if (p_info) num_chars = c_to_uni_str(p_info->eit_info[EIT_NEXT].prog_title,p_app->tmp_str,MAX_TITLE_CHARS); else num_chars = 0; if (num_chars == 0) { num_chars = SCREEN_MAX_STR_WIDTH; bscreen_get_string(p_app->lang,eTEXT_NO_GUIDE_DATA, p_app->tmp_str, &num_chars); } /* draw channel column */ x = eSCREEN_GUIDE_NEXT_X; bgfx_fill_rect(&p_app->surf,x, y, guide_width,eSCREEN_GUIDE_HEIGHT,bkgnd_color); guide_text_box(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL], x, str_y, guide_width, eSCREEN_GUIDE_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,eCOLOR_BLACK, eMENU_TEXT_DROPSHADOW ,eSCREEN_GUIDE_SPACING); } /* Summary: Get the guide info for this entry. */ static chm_info_t* screen_guide_get_info(bapp_t *p_app, int idx) { chm_info_t *p_info; #ifdef CONFIG_DVB int i, eit_cnt; eit_t eit[MAX_EIT_NUM]; vch_t vch; st_t st; freq_t freq; BKNI_Memset(p_app->tmp_info.eit_info, 0, 2*sizeof(chm_eit_t)); if (!ch_map_get_current(bapp_cur_ch_map(p_app),&vch,&st,&freq)) return &p_app->tmp_info; dvb_get_current_event(vch, &eit_cnt, eit); for (i=0; itmp_info.eit_info[i].start_time = eit[i].start_time; p_app->tmp_info.eit_info[i].length = eit[i].duration; p_app->tmp_info.eit_info[i].event_id = eit[i].event_id; if ((eit[i].event_name[0]>0) && (eit[i].event_name[0]<0x20)) BKNI_Memcpy(p_app->tmp_info.eit_info[i].prog_title, &eit[i].event_name[1], strlen(eit[i].event_name)-1); else if (eit[i].event_name[0]>0) BKNI_Memcpy(p_app->tmp_info.eit_info[i].prog_title, &eit[i].event_name, strlen(eit[i].event_name)); if ((eit[i].event_text[0]>0) && (eit[i].event_text[0]<0x20)) BKNI_Memcpy(p_app->tmp_info.eit_info[i].prog_desc, &eit[i].event_text[1], strlen(eit[i].event_text)-1); else if (eit[i].event_text[0]>0) BKNI_Memcpy(p_app->tmp_info.eit_info[i].prog_desc, eit[i].event_text, strlen(eit[i].event_text)); } #endif p_info = &p_app->tmp_info; return p_info; } /* Summary: Guide screen drawing function . */ void bscreen_guide_draw(void *v_app, void *v_screen) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; guide_state_t *p_gs; unsigned int num_chars; chm_info_t *p_info; int idx; p_gs = (guide_state_t*)p_screen->local_state; BDBG_ASSERT(p_gs); bscreen_draw_background(v_app, &p_app->surf, p_screen->top_banner_height); /* draw title */ num_chars = SCREEN_MAX_STR_WIDTH; bscreen_get_string(p_app->lang,p_screen->title_text_id, p_app->tmp_str, &num_chars); text_box_shadow(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_LARGE], eMENU_TITLE_TEXT_X, eMENU_TITLE_TEXT_Y, eMENU_TITLE_TEXT_WIDTH, eMENU_TITLE_TEXT_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_MED_YELLOW,eCOLOR_BLACK, eMENU_TEXT_DROPSHADOW ,eSCREEN_GUIDE_SPACING); /* draw guide data update progress */ if (p_gs->update_progress < 100) { int num_chars = SCREEN_MAX_STR_WIDTH; int w = 0; int h = 0; /* draw progress text */ bscreen_get_string(p_app->lang,eTEXT_GUIDE_DL_PROGRESS, p_app->tmp_str, &num_chars); bgfx_string_info(p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],(const unsigned long *)p_app->tmp_str,num_chars,&w,&h); text_box_shadow(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL], ePROGRESS_GUIDE_X - w - 7, ePROGRESS_GUIDE_TEXT_Y, w + 3, ePROGRESS_GUIDE_TEXT_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_MED_YELLOW,eCOLOR_BLACK, eMENU_TEXT_DROPSHADOW ,100); bscreen_draw_progress(v_app, ePROGRESS_GUIDE_X, ePROGRESS_GUIDE_Y, ePROGRESS_GUIDE_WIDTH, ePROGRESS_GUIDE_HEIGHT, eBUTTON_VOL_PROGRESS_BORDER, eCOLOR_WHITE, eCOLOR_DRK_BLUE, p_gs->update_progress, 100); } else { bgfx_fill_rect(&p_app->surf,ePROGRESS_GUIDE_TEXT_X,ePROGRESS_GUIDE_Y, ePROGRESS_GUIDE_TEXT_WIDTH+ePROGRESS_GUIDE_WIDTH,ePROGRESS_GUIDE_HEIGHT,eCOLOR_LT_BLUE); } /* draw column header bar */ bgfx_fill_rect(&p_app->surf,eSCREEN_ACTION_SAFE_X+4, eMENU_TITLE_TEXT_Y + eMENU_TITLE_TEXT_HEIGHT + 2, eSCREEN_ACTION_SAFE_WIDTH-8,eINFO_AREA_HEIGHT - 6,eCOLOR_DRK_BLUE); /* draw column header */ num_chars = SCREEN_MAX_STR_WIDTH; bscreen_get_string(p_app->lang,eTEXT_GUIDE_HEADER, p_app->tmp_str, &num_chars); text_box_shadow(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL], eSCREEN_GUIDE_X, eMENU_TITLE_TEXT_Y + eMENU_TITLE_TEXT_HEIGHT + 6 , eWIDTH, eINFO_AREA_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,eCOLOR_BLACK, eMENU_TEXT_DROPSHADOW ,eSCREEN_GUIDE_SPACING); if (p_app->settings.ch_map.vch_map.num_vch > 0) { unsigned short cur_ch; vch_t vch; st_t st; freq_t freq; ch_map_t *p_ch_map = bapp_cur_ch_map(p_app); ch_map_get_current(p_ch_map,&vch,&st,&freq); cur_ch = vch.ch_num; p_ch_map->cur_ch = p_gs->offset; /* Draw the guide entries */ for (idx = p_gs->offset; idx < GUIDE_MIN(p_app->settings.ch_map.vch_map.num_vch, (p_gs->offset + MAX_GUIDE_ENTRIES)); ++idx) { p_ch_map->cur_ch = idx; p_info = screen_guide_get_info(p_app,idx); draw_guide_entry(p_app,p_screen,p_gs, idx,p_info, (idx == p_gs->selection) ? true : false); } ch_map_set_ch(p_ch_map,cur_ch); } else { int w = 0; int h = 0; /* No channels in channel map so show "No Programs Available" */ num_chars = SCREEN_MAX_STR_WIDTH; bscreen_get_string(p_app->lang,eTEXT_NO_GUIDE_DATA, p_app->tmp_str, &num_chars); bgfx_string_info(p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],(const unsigned long *)p_app->tmp_str,num_chars,&w,&h); text_box_shadow(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL], eSCREEN_GUIDE_X+((eWIDTH-(2*eSCREEN_GUIDE_X))/2)-(w/2), eSCREEN_ACTION_SAFE_Y + eSCREEN_ACTION_SAFE_HEIGHT/2, w+5, h, p_app->tmp_str, num_chars, eCOLOR_WHITE,eCOLOR_BLACK, eMENU_TEXT_DROPSHADOW ,eSCREEN_GUIDE_SPACING); } draw_navigation_hints(v_app, v_screen); }