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日間の情報が含まれている)になるまで、リストをスクロールダウンしたい、その後、次のチャンネルに移動:
あなたは 'more'と' less'がどのように実装されているかを見てください。 – Coren
あなたの例に入れているのは、スクロールアップではなく、スクロール__down__です。上にスクロールすると上の行に移動するので、行15を非表示にして行0を表示します。 – Eregrith
@Coren:あなたが言ったことはまったく同じです。 termcap(私は思う)を使用しています。これは、NCursesが好評を得ているもの、あるいはそのようなものです。しかし、一言で言えば、NCursesはこれに最適なソリューションです。 –