From 0c4c72121c0afc0cca3a4cac6ac70b120cd235c3 Mon Sep 17 00:00:00 2001 From: piaip Date: Sat, 12 Apr 2008 11:52:28 +0000 Subject: - visio: add vfooter() high level API. git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@4145 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- mbbsd/visio.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 mbbsd/visio.c (limited to 'mbbsd/visio.c') diff --git a/mbbsd/visio.c b/mbbsd/visio.c new file mode 100644 index 00000000..3c8114d1 --- /dev/null +++ b/mbbsd/visio.c @@ -0,0 +1,83 @@ +/* $Id$ */ +#include "bbs.h" + +/* + * visio.c + * High-level virtual screen input output control + * + * This is not the original visio.c from maple3. + * m3 visio = (ptt) visio+screen. + * This visio contains only high level UI element/widgets. + * In fact the only APIs from m3 are vmsg/vget... + * + * To add API here, please... + * (1) name the API in prefix of 'v'. + * (2) use only screen.c APIs. + * (3) take care of wide screen. + * (4) utilize the colos in visio.h, and name asa VCLR_* (visio color) + */ + +// ---- DEFINITION --------------------------------------------------- +#define MAX_COL (t_columns-1) +#define SAFE_MAX_COL (MAX_COL-1) + +// ---- UTILITIES ---------------------------------------------------- +inline void +outnc(int n, unsigned char c) +{ + while (n-- > 0) + outc(c); +} + +inline void +nblank(int n) +{ + outnc(n, ' '); +} + +// ---- HIGH LEVEL API ----------------------------------------------- + +/** + * 在最底部印出 caption msg 的形式 + * msg 中若有 () 則會變色為, \t 後的文字會靠右。 + * 最後面會自動留一個空白 (以避免自動偵測中文字的問題)。 + */ +void +vfooter(const char *caption, const char *msg) +{ + int i = 0; + move(b_lines, 0); clrtoeol(); + + if (caption) + { + outs(VCLR_FOOTER_CAPTION); + outs(caption); i+= strlen(caption); + } + + if (!msg) msg = ""; + outs(VCLR_FOOTER); + + while (*msg && i < SAFE_MAX_COL) + { + if (*msg == '(') + outs(VCLR_FOOTER_QUOTE); + else if (*msg == '\t') + { + // if we don't have enough space, ignore whole. + int l = strlen(++msg); + if (i + l > SAFE_MAX_COL) break; + l = SAFE_MAX_COL - l - i; + nblank(l); + i += l; + continue; + } + outc(*msg); i++; + if (*msg == ')') + outs(VCLR_FOOTER); + msg ++; + } + nblank(SAFE_MAX_COL-i); + outc(' '); + outs(ANSI_RESET); +} + -- cgit v1.2.3