2012-02-20 2 views
2

xmltvのリストからデータを抽出し、15行でosdページに表示するコードを記述します。 リスティングperchannelの情報が終了するまでページ内を1行ずつ上下にスクロールさせ、次のページに移動して別のチャンネルの情報を表示する方法はありますか?次いで(バッファからの)行ごとに上下にスクロールします。

| line1 |      | line2 |    |-----------| 
| line2 |      | line3 |    |-----------| 
| line3 | scroll down line => | line4 | then clear => | lastline | 
| line4 |      |-----------|    |   | 
|-----------|      | line15 |    |   | 
| line15 |      | line16 |    |   | 

=に移動>チャンネル2:

チャネル1

| 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

あなたは 'more'と' less'がどのように実装されているかを見てください。 – Coren

+1

あなたの例に入れているのは、スクロールアップではなく、スクロール__down__です。上にスクロールすると上の行に移動するので、行15を非表示にして行0を表示します。 – Eregrith

+0

@Coren:あなたが言ったことはまったく同じです。 termcap(私は思う)を使用しています。これは、NCursesが好評を得ているもの、あるいはそのようなものです。しかし、一言で言えば、NCursesはこれに最適なソリューションです。 –

答えて

0

コメントに記載されているアプリケーションは端末(おそらく端末のエスケープシーケンス)でスクロールしますが、端末のように見えないものに特別なAPIを使ってテキストを表示しているようですそのアプローチは機能しません。

テキストを再作成してください。以前のテキストを削除する必要があります。正直なところ私は考えていません...ドキュメントをチェックしてください。

関連する問題