2012-02-20 4 views
2

Я пишу код для извлечения данных из списков 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 дней), а затем перейти к следующему каналу:

screenshoot

screenshoot

+1

вы должны посмотреть, как реализованы «больше» и «меньше». – Coren

+1

То, что вы положили в свой пример, это прокрутка __down__, а не прокрутка вверх. Если вы прокрутите вверх, вы перейдете к верхним строкам, и вы скроете строку15 и покажете строку – Eregrith

+0

@Coren: Именно то, что вы сказали. Он использует termcap (я думаю), по сравнению с которым выступает NCurses, или что-то в этом роде. Но вкратце, NCurses - лучшее решение для этого. –

ответ

0

Приложения, упомянутые в комментариях, прокручиваются на терминале (возможно, с терминальными escape-последовательностями), но вы, кажется, показываете текст с некоторым специальным API, на что-то, что чистое не похоже на терминал, поэтому я предполагаюэтот подход не будет работать.

Вы должны просто воссоздать тексты, возможно, вам нужно удалить предыдущие тексты, честно говоря, я понятия не имею ... проверьте документацию.

Смежные вопросы