diff -ur tf-50b6/src/globals.h tf-50b6-patch/src/globals.h --- tf-50b6/src/globals.h Wed Jul 21 02:19:41 2004 +++ tf-50b6-patch/src/globals.h Thu Aug 5 14:27:52 2004 @@ -223,6 +223,7 @@ #define status_attr getattrvar(VAR_stat_attr) #define status_fields getstdvar(VAR_stat_fields) #define status_pad getstdvar(VAR_stat_pad) +#define status_height getintvar(VAR_stat_height) #define sub getintvar(VAR_sub) #define tabsize getintvar(VAR_tabsize) #define telopt getintvar(VAR_telopt) diff -ur tf-50b6/src/main.c tf-50b6-patch/src/main.c --- tf-50b6/src/main.c Thu Jul 29 19:37:19 2004 +++ tf-50b6-patch/src/main.c Thu Aug 5 14:27:52 2004 @@ -49,7 +49,7 @@ #endif "TinyFugue version 5.0 beta 6"; -const char mods[] = ""; +const char mods[] = "With multistatus line written by Someone [Minor changes by Karol Lassak (ingwar@ingwar.eu.org)]"; const char copyright[] = "Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2002, 2003, 2004 Ken Keys (hawkeye@tcp.com)"; Only in tf-50b6-patch/src: main.c.orig diff -ur tf-50b6/src/output.c tf-50b6-patch/src/output.c --- tf-50b6/src/output.c Fri Jul 30 21:21:02 2004 +++ tf-50b6-patch/src/output.c Thu Aug 5 14:27:53 2004 @@ -15,6 +15,8 @@ * Handles all screen-related phenomena. *****************************************************************/ +#define MAX_STATUS_HEIGHT 5 + #define TERM_vt100 1 #define TERM_vt220 2 #define TERM_ansi 3 @@ -388,7 +390,7 @@ lines = ((str = getvar("LINES"))) ? atoi(str) : 0; columns = ((str = getvar("COLUMNS"))) ? atoi(str) : 0; if (lines <= 0 || columns <= 0) get_window_size(); - ystatus = lines - isize; + ystatus = lines - isize - (status_height - 1); top_margin = 1; bottom_margin = lines; @@ -396,8 +398,8 @@ old_ix = -1; init_term(); - Stringninit(status_line, columns); - check_charattrs(status_line, columns, 0, __FILE__, __LINE__); + Stringninit(status_line, columns * MAX_STATUS_HEIGHT); + check_charattrs(status_line, columns * MAX_STATUS_HEIGHT, 0, __FILE__, __LINE__); ch_attr(&special_var[VAR_hiliteattr]); ch_attr(&special_var[VAR_alert_attr]); ch_attr(&special_var[VAR_stat_attr]); @@ -688,7 +690,7 @@ } else { prompt = fgprompt(); if (isize > lines - 3) set_var_by_id(VAR_isize, lines - 3); - ystatus = lines - isize; + ystatus = lines - isize - (status_height - 1); #if 0 outcount = ystatus - 1; #endif @@ -699,7 +701,7 @@ } update_status_line(NULL); ix = iendx = oy = 1; - iy = iendy = istarty = ystatus + 1; + iy = iendy = istarty = ystatus + status_height; ipos(); #endif } @@ -1317,9 +1319,9 @@ inlist(field, status_field_list, status_field_list->tail); } - if (width > columns) { - eprintf("status_fields: status width (%d) is wider than screen (%d)", - width, columns); + if (width > columns * status_height) { + eprintf("status_fields: status width (%d) is wider than screen * status height (%d * %d)", + width, columns, status_height); } /* update new fields */ @@ -1411,21 +1413,21 @@ { int column; if (field->column >= 0) - return (field->column > columns) ? columns : field->column; + return (field->column > columns * status_height) ? columns * status_height : field->column; column = field->column + - ((status_left + status_right > columns) ? - status_left + status_right : columns); - return (column > columns) ? columns : column; + ((status_left + status_right > columns * status_height) ? + status_left + status_right : columns * status_height); + return (column > columns * status_height) ? columns * status_height : column; } static int status_width(StatusField *field, int start) { int width; - if (start >= columns) return 0; - width = (field->width == 0) ? columns - status_right - status_left : + if (start >= columns * status_height) return 0; + width = (field->width == 0) ? columns * status_height - status_right - status_left : (field->width > 0) ? field->width : -field->width; - if (width > columns - start) - width = columns - start; + if (width > columns * status_height - start) + width = columns * status_height - start; if (width < 0) width = 0; return width; @@ -1583,8 +1585,8 @@ continue; } if (internal >= 0 && field->internal != internal) continue; - column = status_field_column(field); - if (column >= columns) /* doesn't fit, nor will any later fields */ + column = status_field_column(field); + if (column >= columns * status_height) /* doesn't fit, nor will any later fields */ break; count++; width = format_status_field(field); @@ -1593,17 +1595,17 @@ column >= alert_pos + alert_len) { /* no overlap with alert */ - xy(column + 1, ystatus); + xy((column + 1) % columns, ystatus + (column / columns)); hwrite(CS(status_line), column, width, 0); } else { if (column < alert_pos) { /* field starts left of alert */ - xy(column + 1, ystatus); + xy((column + 1) % columns, ystatus + (column / columns)); hwrite(CS(status_line), column, alert_pos - column, 0); } if (column + width >= alert_pos) { /* field ends right of alert */ - xy(alert_pos + alert_len + 1, ystatus); + xy((alert_pos + alert_len + 1) % columns, ystatus + (column / columns)); hwrite(CS(status_line), alert_pos + alert_len, column + width - (alert_pos + alert_len), 0); } @@ -1625,12 +1627,12 @@ for (node = status_field_list->head; node; node = node->next) { field = (StatusField*)node->datum; - if ((column = status_field_column(field)) >= columns) + if ((column = status_field_column(field)) >= columns * status_height) break; width = format_status_field(field); } - for (column += width; column < columns; column++) { + for (column += width; column < columns * status_height; column++) { status_line->data[column] = true_status_pad; status_line->charattrs[column] = status_attr; } @@ -1638,23 +1640,33 @@ int display_status_line(void) { + int i; if (screen_mode < 1) return 0; if (!alert_len) { /* no overlap with alert */ - xy(1, ystatus); - hwrite(CS(status_line), 0, columns, 0); + for (i = 0; i < status_height; i++) { + xy(1, ystatus + i); + hwrite(CS(status_line), (columns * i), columns, 0); + } } else { /* overlap with alert (this could happen in ch_status_attr()) */ - if (alert_pos > 0) { - xy(1, ystatus); - hwrite(CS(status_line), 0, alert_pos, 0); - } - if (alert_pos + alert_len < columns) { - xy(alert_pos + alert_len + 1, ystatus); - hwrite(CS(status_line), alert_pos + alert_len, - columns - (alert_pos + alert_len), 0); - } + for (i = 0; i < status_height; i++) { + if (!i) { + if (alert_pos > 0) { + xy(1, ystatus); + hwrite(CS(status_line), 0, alert_pos, 0); + } + if (alert_pos + alert_len < columns) { + xy(alert_pos + alert_len + 1, ystatus); + hwrite(CS(status_line), alert_pos + alert_len, + columns - (alert_pos + alert_len), 0); + } + } else { + xy(1, ystatus + i); + hwrite(CS(status_line), (columns * i), columns, 0); + } + } } bufflush(); @@ -1747,9 +1759,9 @@ { int need_redraw; - if (status_line->len < columns) - Stringnadd(status_line, '?', columns - status_line->len); - Stringtrunc(status_line, columns); + if (status_line->len < columns * status_height) + Stringnadd(status_line, '?', columns * status_height - status_line->len); + Stringtrunc(status_line, columns * status_height); if (screen_mode < 0) { /* e.g., called by init_variables() */ need_redraw = 0; @@ -1763,6 +1775,11 @@ #ifdef SCREEN } else if (var == &special_var[VAR_isize]) { /* %isize changed */ need_redraw = 1; + } else if (var == &special_var[VAR_stat_height]) { /* %status_height changed */ + if (status_height > MAX_STATUS_HEIGHT) { + set_var_by_id(VAR_stat_height, MAX_STATUS_HEIGHT); + } + need_redraw = 1; } else { /* SIGWINCH */ /* Set ystatus to the top of the area fix_screen() must erase. */ /* ystatus = 1; */ @@ -1858,9 +1875,9 @@ static void clear_input_window(void) { /* only called in visual mode */ - clear_lines(ystatus + 1, lines); + clear_lines(ystatus + status_height, lines); ix = iendx = 1; - iy = iendy = istarty = ystatus + 1; + iy = iendy = istarty = ystatus + status_height; ipos(); } @@ -1878,14 +1895,14 @@ static void scroll_input(int n) { if (n > isize) { - clear_lines(ystatus + 1, lines); - iendy = ystatus + 1; + clear_lines(ystatus + status_height, lines); + iendy = ystatus + status_height; } else if (delete_line) { - xy(1, ystatus + 1); + xy(1, ystatus + status_height); for (iendy = lines + 1; iendy > lines - n + 1; iendy--) tp(delete_line); } else if (has_scroll_region) { - setscroll(ystatus + 1, lines); + setscroll(ystatus + status_height, lines); xy(1, lines); crnl(n); /* DON'T: cy += n; */ iendy = lines - n + 1; @@ -2049,7 +2066,7 @@ } } else if (scroll && !clearfull) { scroll_input(1); - if (istarty > ystatus + 1) istarty--; + if (istarty > ystatus + status_height) istarty--; } else { clear_input_window(); } @@ -2292,7 +2309,7 @@ ioutall(place - (ix - 1) - (iy - lines - 1) * Wrap); iy = lines; ipos(); - } else if ((iy < ystatus + 1) || (iy > lines)) { + } else if ((iy < ystatus + status_height) || (iy > lines)) { logical_refresh(); } else { ipos(); Only in tf-50b6-patch/src: output.c.orig diff -ur tf-50b6/src/varlist.h tf-50b6-patch/src/varlist.h --- tf-50b6/src/varlist.h Mon Jul 26 10:30:56 2004 +++ tf-50b6-patch/src/varlist.h Thu Aug 5 14:27:53 2004 @@ -128,6 +128,7 @@ varstr (VAR_sprefix, "sprefix", NULL, NULL) varstr (VAR_stat_attr, "status_attr", NULL, ch_status_attr) varstr (VAR_stat_fields,"status_fields",NULL, ch_status_fields) +varint (VAR_stat_height,"status_height",1, ch_visual) varstr (VAR_stat_pad, "status_pad", "_", update_status_line) varstr (VAR_stint_clock,"status_int_clock",NULL, ch_status_int) varstr (VAR_stint_more, "status_int_more",NULL, ch_status_int)