Я пишу код для извлечения данных из списков xmltv и отображения их на странице osd с 15 строками. Как сделать для прокрутки вверх и вниз по строкам на странице до тех пор, пока информация из списков perchannel не закончится, и они перейдут на следующую страницу, отображающую информацию для другого канала?Прокрутка вверх и вниз по строкам (из буфера) в c
канал 1:
| line1 | | line2 | |-----------|
| line2 | | line3 | |-----------|
| line3 | scroll down line => | line4 | then clear => | lastline |
| line4 | |-----------| | |
|-----------| | line15 | | |
| line15 | | line16 | | |
затем перейти к => канал 2:
| line1 | | line2 | |-----------|
| line2 | | line3 | |-----------|
| line3 | scroll down line => | line4 | then clear => | lastline |
| line4 | |-----------| | |
|-----------| | line15 | | |
| line15 | | line16 | | |
т.д.
Код:
int epg_show_perchannel(tvtime_osd_t* osd, int page, station_mgr_t *stationmgr, xmltv_t *xmltv, int channel)
{
if (!page)
return 0;
if (xmltv){
const int buf_length = 255;
const int max_num_lines = 15;
const int num_stations = station_get_num_stations(stationmgr);
char *old_channel = strdup(xmltv_get_channel(xmltv));
char buf[buf_length+1];
int i, cur = 0;
time_t curtime = time(0);
const char *xmltv_id = 0;
if (channel > num_stations)
channel = 1;
else if (channel < 1)
channel = num_stations;
if (!(xmltv_id = station_get_xmltv_id(stationmgr, channel-1)))
xmltv_id = xmltv_lookup_channel(xmltv, station_get_name(stationmgr, channel-1));
xmltv_set_channel(xmltv, xmltv_id);
xmltv_refresh_withtime(xmltv, curtime);
/* Header with channel number + name */
snprintf(buf, buf_length, "%d Next on [%s] %s:", channel, station_get_channel(stationmgr,channel-1), station_get_name(stationmgr, channel-1));
tvtime_osd_list_set_text(osd, cur++, buf);
tvtime_osd_list_set_hilight(osd, -1);
for(i = 0; i < max_num_lines; i++) {
xmltv_refresh_withtime(xmltv, curtime);
if (xmltv_get_title(xmltv)) {
char start_time[50];
time_t start_timestamp = xmltv_get_start_time(xmltv);
time_t end_timestamp = xmltv_get_end_time(xmltv);
strftime(start_time, 50, "%H:%M", localtime(&start_timestamp));
/* starttime of current program + Now showing program */
snprintf(buf, buf_length, "%s %s", start_time, xmltv_get_title(xmltv));
if (xmltv_get_sub_title(xmltv)){
strncat(buf," (",buf_length-strlen(buf));
strncat(buf,xmltv_get_sub_title(xmltv),buf_length-strlen(buf));
strncat(buf,")",buf_length-strlen(buf));
}
tvtime_osd_list_set_multitext(osd, cur++, buf, 1);
if (!xmltv_get_next_title(xmltv)) {
char end_time[50];
/* no next program, print endtime of current programme */
strftime(end_time, 50, "%H:%M", localtime(&end_timestamp));
snprintf(buf, buf_length, "%s %s", end_time, "");
tvtime_osd_list_set_multitext(osd, cur++, buf, 1);
}
curtime = end_timestamp;
} else {
/* No XMLTV information for this channel */
tvtime_osd_list_set_text(osd, cur++, "");
}
}
tvtime_osd_list_set_lines(osd, cur);
tvtime_osd_show_list(osd, 1, 1);
xmltv_set_channel(xmltv, old_channel);
free(old_channel);
xmltv_refresh(xmltv);
} else {
tvtime_osd_list_set_text(osd, 0, "No XMLTV information available");
tvtime_osd_list_set_lines(osd, 1);
tvtime_osd_show_list(osd, 1, 1);
}
return channel;
}
код, текущая страница показа с 15 линиями, а затем переход к следующему каналу.
Я хочу, чтобы прокрутить список до сведения из XMLTV списки для канала не конец (содержит информацию в течение 3-4 дней), а затем перейти к следующему каналу:
вы должны посмотреть, как реализованы «больше» и «меньше». – Coren
То, что вы положили в свой пример, это прокрутка __down__, а не прокрутка вверх. Если вы прокрутите вверх, вы перейдете к верхним строкам, и вы скроете строку15 и покажете строку – Eregrith
@Coren: Именно то, что вы сказали. Он использует termcap (я думаю), по сравнению с которым выступает NCurses, или что-то в этом роде. Но вкратце, NCurses - лучшее решение для этого. –