summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2009-09-20 20:15:46 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2009-09-20 20:15:46 +0800
commit0f1c03fda85c111bbd551c10774b84af1ef08aff (patch)
treefad29bfb63746631c45c7ef3aa04862edaaf4611
parent482183879a186547216f0d06bad332ece60571bc (diff)
downloadpttbbs-0f1c03fda85c111bbd551c10774b84af1ef08aff.tar
pttbbs-0f1c03fda85c111bbd551c10774b84af1ef08aff.tar.gz
pttbbs-0f1c03fda85c111bbd551c10774b84af1ef08aff.tar.bz2
pttbbs-0f1c03fda85c111bbd551c10774b84af1ef08aff.tar.lz
pttbbs-0f1c03fda85c111bbd551c10774b84af1ef08aff.tar.xz
pttbbs-0f1c03fda85c111bbd551c10774b84af1ef08aff.tar.zst
pttbbs-0f1c03fda85c111bbd551c10774b84af1ef08aff.zip
* refine menu and ad banner system, making the code simple and readable
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@4870 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r--include/proto.h1
-rw-r--r--mbbsd/board.c3
-rw-r--r--mbbsd/menu.c119
-rw-r--r--mbbsd/xyz.c2
4 files changed, 82 insertions, 43 deletions
diff --git a/include/proto.h b/include/proto.h
index ea65837f..76507556 100644
--- a/include/proto.h
+++ b/include/proto.h
@@ -347,6 +347,7 @@ int query_file_money(const fileheader_t *pfh);
/* menu */
void showtitle(const char *title, const char *mid);
void adbanner(int i);
+void adbanner_goodbye();
int main_menu(void);
int admin(void);
int Mail(void);
diff --git a/mbbsd/board.c b/mbbsd/board.c
index 8e7e8edb..3692daf8 100644
--- a/mbbsd/board.c
+++ b/mbbsd/board.c
@@ -1168,9 +1168,8 @@ show_brdlist(int head, int clsflag, int newflag)
currstat = CLASS;
myrow = 6;
showtitle("分類看板", BBSName);
- adbanner(0);
move(1, 0);
- // TODO remove ascii art here
+ // TODO move ascii art to adbanner?
outs(
" "
"◣ ╭—" ANSI_COLOR(33) "●\n"
diff --git a/mbbsd/menu.c b/mbbsd/menu.c
index fe7682a3..2c33f06b 100644
--- a/mbbsd/menu.c
+++ b/mbbsd/menu.c
@@ -29,6 +29,59 @@ enum {
TITLE_TAIL_DIGEST,
};
+// 由於歷史因素,這裡會出現三種編號:
+// MODE (定義於 modes.h) 是 BBS 對各種功能在 utmp 的編號 (var.c 要加字串)
+// Menu Index (M_*) 是 menu.c 內部分辨選單要對應哪個 mode 的 index
+// AdBanner Index 是動態看版要顯示什麼的值
+// 從前這是用兩個 mode map 來轉換的 (令人看得滿頭霧水)
+// 重整後 Menu Index 跟 AdBanner Index 合一,請見下面的說明
+///////////////////////////////////////////////////////////////////////
+// AdBanner (SHM->notes) 前幾筆是 Note 板精華區「<系統> 動態看板」(SYS)
+// 目錄下的文章,所以編排 Menu (M_*) 時要照其順序:
+// 精華區編號 => Menu Index => MODE
+// (AdBannerIndex)
+// ====================================
+// 00離站畫面 => M_GOODBYE
+// 01主選單 => M_MMENU => MMENU
+// 02系統維護區 => M_ADMIN => ADMIN
+// 03私人信件區 => M_MAIL => MAIL
+// 04休閒聊天區 => M_TMENU => TMENU
+// 05個人設定區 => M_UMENU => UMENU
+// 06系統工具區 => M_XMENU => XMENU
+// 07娛樂與休閒 => M_PMENU => PMENU
+// 08Ptt搜尋器 => M_SREG => SREG
+// 09Ptt量販店 => M_PSALE => PSALE
+// 10Ptt遊樂場 => M_AMUSE => AMUSE
+// 11Ptt棋院 => M_CHC => CHC
+// 12特別名單 => M_NMENU => NMENU
+///////////////////////////////////////////////////////////////////////
+// 由於 MODE 與 menu 的順序現在已不一致 (最早可能是一致的),所以中間的
+// 轉換是靠 menu_mode_map 來處理。
+// 要定義新 Menu 時,請在 M_MENU_MAX 之前加入新值,並在 menu_mode_map
+// 加入對應的 MODE 值。 另外,在 Notes 下也要增加對應的 AdBanner 圖片
+// 若不想加圖片則要修改 N_SYSADBANNER
+///////////////////////////////////////////////////////////////////////
+
+enum {
+ M_GOODBYE=0,
+ M_MMENU, M_ADMIN, M_MAIL, M_TMENU,
+ M_UMENU, M_XMENU, M_PMENU,M_SREG,
+ M_PSALE, M_AMUSE, M_CHC, M_NMENU,
+
+ M_MENU_MAX, // 這是 menu (M_*) 的最大值
+ N_SYSADBANNER = M_MENU_MAX, // 定義 M_* 到多少有對應的 ADBANNER
+ M_MENU_REFRESH= -1, // 系統用不到的 index 值 (可顯示其它活動與點歌)
+};
+
+static const int menu_mode_map[M_MENU_MAX] = {
+ 0,
+ MMENU, ADMIN, MAIL, TMENU,
+ UMENU, XMENU, PMENU, SREG,
+ PSALE, AMUSE, CHC, NMENU
+};
+
+///////////////////////////////////////////////////////////////////////
+
void
showtitle(const char *title, const char *mid)
{
@@ -235,37 +288,36 @@ show_status(void)
/*
* current caller of adbanner:
- * board.c: adbanner(0); // called when IN_CLASSROOT()
- * // with currstat = CLASS -> don't show adbanners
- * xyz.c: adbanner(999999); // logout
- * menu.c: adbanner(cmdmode); // ...
+ * xyz.c: adbanner_goodbye(); // logout
+ * menu.c: adbanner(cmdmode); // ...
+ * board.c: adbanner(0); // 後來變在 board.c 裡自己處理(應該是那隻魚)
*/
-#define N_SYSADBANNER (sizeof(adbanner_map) / sizeof(adbanner_map[0]))
void
-adbanner(int cmdmode)
+adbanner_goodbye()
{
- const int adbanner_map[] = {
- 2, 10, 11, -1, 3, 1, 12,
- 7, 9, 8, 4, 5, 6,
- };
-
- int i;
+ adbanner(M_GOODBYE);
+}
- // adbanner 前幾筆是 Note 板精華區「<系統> 動態看板」(SYS) 目錄下的文章
+void
+adbanner(int menu_index)
+{
+ int i = menu_index;
// don't show if stat in class or user wants to skip adbanners
if (currstat == CLASS || !(cuser.uflag & ADBANNER_FLAG))
return;
+
// also prevent SHM busy status
if (SHM->Pbusystate || SHM->last_film <= 0)
return;
- if (cmdmode > 0 && cmdmode < N_SYSADBANNER &&
- 0 < adbanner_map[cmdmode] && adbanner_map[cmdmode] <= SHM->last_film) {
- i = adbanner_map[cmdmode];
- } else if (cmdmode == 999999) { /* Goodbye my friend */
- i = 0;
+ if ( i != M_MENU_REFRESH &&
+ i >= 0 &&
+ i < N_SYSADBANNER &&
+ i <= SHM->last_film)
+ {
+ // use system menu - i
} else {
// To display ADBANNERs in slide show mode.
// Since menu is updated per hour, the total presentation time
@@ -317,12 +369,12 @@ typedef struct {
} commands_t;
static int
-show_menu(int adbannermode, const commands_t * p)
+show_menu(int menu_index, const commands_t * p)
{
register int n = 0;
register char *s;
- adbanner(adbannermode);
+ adbanner(menu_index);
// seems not everyone likes the menu in center.
#ifdef LARGETERM_CENTER_MENU
@@ -342,33 +394,19 @@ show_menu(int adbannermode, const commands_t * p)
return n - 1;
}
-
-enum {
- M_ADMIN = 0, M_AMUSE, M_CHC, M_JCEE, M_MAIL, M_MMENU, M_NMENU,
- M_PMENU, M_PSALE, M_SREG, M_TMENU, M_UMENU, M_XMENU, M_XMAX
-};
-
-static const int mode_map[] = {
- ADMIN, AMUSE, CHC, JCEE, MAIL, MMENU, NMENU,
- PMENU, PSALE, SREG, TMENU, UMENU, XMENU,
-};
-
static void
-domenu(int cmdmode, const char *cmdtitle, int cmd, const commands_t cmdtable[])
+domenu(int menu_index, const char *cmdtitle, int cmd, const commands_t cmdtable[])
{
- int lastcmdptr, adbannermode;
+ int lastcmdptr, cmdmode;
int n, pos, total, i;
int err;
- adbannermode = cmdmode;
- assert(cmdmode < M_XMAX);
- cmdmode = mode_map[cmdmode];
+ assert(0 <= menu_index && menu_index < M_MENU_MAX);
+ cmdmode = menu_mode_map[menu_index];
setutmpmode(cmdmode);
-
showtitle(cmdtitle, BBSName);
-
- total = show_menu(adbannermode, cmdtable);
+ total = show_menu(menu_index, cmdtable);
show_status();
lastcmdptr = pos = 0;
@@ -490,7 +528,8 @@ domenu(int cmdmode, const char *cmdtitle, int cmd, const commands_t cmdtable[])
if (refscreen) {
showtitle(cmdtitle, BBSName);
- show_menu(-1, cmdtable);
+ // menu 設定 M_MENU_REFRESH 可讓 ADBanner 顯示別的資訊
+ show_menu(M_MENU_REFRESH, cmdtable);
show_status();
refscreen = NA;
}
diff --git a/mbbsd/xyz.c b/mbbsd/xyz.c
index 6c1eaf04..4523536a 100644
--- a/mbbsd/xyz.c
+++ b/mbbsd/xyz.c
@@ -263,7 +263,7 @@ Goodbye(void)
if (*genbuf != 'y')
return 0;
- adbanner(999999);
+ adbanner_goodbye();
if (cuser.userlevel) {
getdata(b_lines - 1, 0,
"(G)隨風而逝 (M)托夢站長 (N)酸甜苦辣流言板?[G] ",