summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--UPDATING5
-rw-r--r--include/modes.h7
-rw-r--r--include/pttstruct.h3
-rw-r--r--include/uflags.h12
-rw-r--r--mbbsd/io.c12
-rw-r--r--mbbsd/mbbsd.c10
-rw-r--r--mbbsd/passwd.c15
-rw-r--r--mbbsd/talk.c24
-rw-r--r--mbbsd/user.c10
-rw-r--r--mbbsd/var.c4
-rw-r--r--upgrade/r4848_watermode.c57
11 files changed, 108 insertions, 51 deletions
diff --git a/UPDATING b/UPDATING
index 26967506..eb01ece9 100644
--- a/UPDATING
+++ b/UPDATING
@@ -19,8 +19,13 @@ https://opensvn.csie.org/traccgi/pttbbs/changeset/2273
make r4035_regnew
make r4194_passwd
make r4826_numlogin
+ make r4848_watermode
-----------------------------------------------------------------------------
+r4848: [water mode]
+決定把 uflag2 的 WATERMODE (2 bit) 移出來放到獨立的變數。
+uflag / uflag2 還是放單一 bit 的東西較好。
+
r4841: [shm size tag]
由於站台設定變動後導致 SHM 大小不同 (eg, MAX_BOARDS) 然後有 utility 沒 build
到的問題再次發生,所以我們開啟了 size check. 請重 build 所有程式並重開 SHM。
diff --git a/include/modes.h b/include/modes.h
index 7ceb7ba9..b32698e7 100644
--- a/include/modes.h
+++ b/include/modes.h
@@ -200,6 +200,13 @@
#define PAGER_MODES (5)
+#define PAGER_UI_ORIG 0x00000000 // was: WATER_ORIG
+#define PAGER_UI_NEW 0x00000001 // was: WATER_NEW
+#define PAGER_UI_OFO 0x00000002 // was: WATER_OFO
+#define PAGER_UI_IS(uitype) ((cuser.pager_ui_type%PAGER_UI_TYPES) == (uitype))
+#define PAGER_UI_TYPES 0x00000003 // the types that we really support
+#define PAGER_UI_TYPES_USER 0x00000002 // the types we allow user to select
+
/* stuff.c: show_file */
#define SHOWFILE_RAW (0x00)
#define SHOWFILE_ALLOW_COLOR (0x01) // ESC [ ... m
diff --git a/include/pttstruct.h b/include/pttstruct.h
index a1ec4c55..3ce9ecb4 100644
--- a/include/pttstruct.h
+++ b/include/pttstruct.h
@@ -80,8 +80,7 @@ typedef struct userec_t {
uint8_t year; /* 生日 年 */
uint8_t sex; /* 性別 */
- uint8_t unused_2;
-
+ uint8_t pager_ui_type; /* 呼叫器界面類別 (was: WATER_*) */
uint8_t pager; /* 呼叫器狀態 */
uint8_t invisible; /* 隱形狀態 */
diff --git a/include/uflags.h b/include/uflags.h
index 72a21831..4b695658 100644
--- a/include/uflags.h
+++ b/include/uflags.h
@@ -48,12 +48,12 @@
/* -------------------- userec_t.uflag2 (unsigned int) */
-// XXX TODO move water to standalone variable just like invisible/pager.
-#define WATER_ORIG 0x00000000
-#define WATER_NEW 0x00000001
-#define WATER_OFO 0x00000002
-#define WATERMODE(mode) ((cuser.uflag2 & WATER_MASK) == mode)
-#define WATER_MASK 0x00000003 /* water mask */
+// WATER_* is moved to PAGER_UI_* in modes.h
+// #define WATER_ORIG 0x00000000
+// #define WATER_NEW 0x00000001
+// #define WATER_OFO 0x00000002
+// #define WATERMODE(mode) ((cuser.uflag2 & WATER_MASK) == mode)
+// #define WATER_MASK 0x00000003 /* water mask */
// #define WATER_??? 0x00000004
// #define WATER_??? 0x00000008
diff --git a/mbbsd/io.c b/mbbsd/io.c
index 432b4004..68a2a62a 100644
--- a/mbbsd/io.c
+++ b/mbbsd/io.c
@@ -559,7 +559,7 @@ igetch(void)
}
return ch;
case KEY_TAB:
- if (WATERMODE(WATER_ORIG) || WATERMODE(WATER_NEW))
+ if (PAGER_UI_IS(PAGER_UI_ORIG) || PAGER_UI_IS(PAGER_UI_NEW))
if (currutmp != NULL && watermode > 0) {
check_water_init();
watermode = (watermode + water_which->count)
@@ -574,7 +574,7 @@ igetch(void)
return (ch);
if (currutmp->msgs[0].pid &&
- WATERMODE(WATER_OFO) && wmofo == NOTREPLYING) {
+ PAGER_UI_IS(PAGER_UI_OFO) && wmofo == NOTREPLYING) {
int my_newfd;
screen_backup_t old_screen;
@@ -586,7 +586,7 @@ igetch(void)
scr_restore(&old_screen);
i_newfd = my_newfd;
continue;
- } else if (!WATERMODE(WATER_OFO)) {
+ } else if (!PAGER_UI_IS(PAGER_UI_OFO)) {
check_water_init();
if (watermode > 0) {
watermode = (watermode + water_which->count)
@@ -641,7 +641,7 @@ igetch(void)
return ch;
case Ctrl('T'):
- if (WATERMODE(WATER_ORIG) || WATERMODE(WATER_NEW)) {
+ if (PAGER_UI_IS(PAGER_UI_ORIG) || PAGER_UI_IS(PAGER_UI_NEW)) {
if (watermode > 0) {
check_water_init();
if (watermode > 1)
@@ -655,7 +655,7 @@ igetch(void)
return ch;
case Ctrl('F'):
- if (WATERMODE(WATER_NEW)) {
+ if (PAGER_UI_IS(PAGER_UI_NEW)) {
if (watermode > 0) {
check_water_init();
if (water_which_flag == (int)water_usies)
@@ -675,7 +675,7 @@ igetch(void)
return ch;
case Ctrl('G'):
- if (WATERMODE(WATER_NEW)) {
+ if (PAGER_UI_IS(PAGER_UI_NEW)) {
if (watermode > 0) {
check_water_init();
water_which_flag = (water_which_flag + water_usies) % (water_usies + 1);
diff --git a/mbbsd/mbbsd.c b/mbbsd/mbbsd.c
index f10bec3d..6fddd4ed 100644
--- a/mbbsd/mbbsd.c
+++ b/mbbsd/mbbsd.c
@@ -430,7 +430,7 @@ add_history_water(water_t * w, const msgque_t * msg)
{
memcpy(&w->msg[w->top], msg, sizeof(msgque_t));
w->top++;
- w->top %= WATERMODE(WATER_OFO) ? 5 : MAX_REVIEW;
+ w->top %= PAGER_UI_IS(PAGER_UI_OFO) ? 5 : MAX_REVIEW;
if (w->count < MAX_REVIEW)
w->count++;
@@ -444,9 +444,9 @@ add_history(const msgque_t * msg)
int i = 0, j, waterinit = 0;
water_t *tmp;
check_water_init();
- if (WATERMODE(WATER_ORIG) || WATERMODE(WATER_NEW))
+ if (PAGER_UI_IS(PAGER_UI_ORIG) || PAGER_UI_IS(PAGER_UI_NEW))
add_history_water(&water[0], msg);
- if (WATERMODE(WATER_NEW) || WATERMODE(WATER_OFO)) {
+ if (PAGER_UI_IS(PAGER_UI_NEW) || PAGER_UI_IS(PAGER_UI_OFO)) {
for (i = 0; i < 5 && swater[i]; i++)
if (swater[i]->pid == msg->pid
#ifdef PLAY_ANGEL
@@ -478,7 +478,7 @@ add_history(const msgque_t * msg)
swater[0] = tmp;
add_history_water(swater[0], msg);
}
- if (WATERMODE(WATER_ORIG) || WATERMODE(WATER_NEW)) {
+ if (PAGER_UI_IS(PAGER_UI_ORIG) || PAGER_UI_IS(PAGER_UI_NEW)) {
if (watermode > 0 &&
(water_which == swater[0] || water_which == &water[0])) {
if (watermode < water_which->count)
@@ -502,7 +502,7 @@ write_request(int sig)
#endif
syncnow();
check_water_init();
- if (WATERMODE(WATER_OFO)) {
+ if (PAGER_UI_IS(PAGER_UI_OFO)) {
/* 如果目前正在回水球模式的話, 就不能進行 add_history() ,
因為會改寫 water[], 而使回水球目的爛掉, 所以分成幾種情況考慮.
sig != 0表真的有水球進來, 故顯示.
diff --git a/mbbsd/passwd.c b/mbbsd/passwd.c
index 060f0937..efa23f43 100644
--- a/mbbsd/passwd.c
+++ b/mbbsd/passwd.c
@@ -421,9 +421,7 @@ int
pwcuSetWaterballMode(unsigned int bm)
{
// XXX you MUST save this variable in pwcuExitSave();
- bm &= WATER_MASK;
- cuser.uflag2 &= ~WATER_MASK;
- cuser.uflag2 |= bm;
+ cuser.pager_ui_type = bm % PAGER_UI_TYPES;
return 0;
}
@@ -504,7 +502,7 @@ pwcuExitSave ()
{
int dirty = 0;
uint32_t uflag, uflag2, withme;
- uint8_t invisible, pager, signature;
+ uint8_t invisible, pager, signature, pager_ui_type;
int32_t money;
PWCU_START();
@@ -523,13 +521,8 @@ pwcuExitSave ()
money = u.money;
signature = u.signature;
- // water is already saved in uflag2
+ pager_ui_type = u.pager_ui_type;
- // XXX TODO move water to cuser.watermode ?
- // configure uflag2 by cuser
- _DISABLE_BIT(u.uflag2, WATER_MASK);
- _ENABLE_BIT (u.uflag2, (cuser.uflag2 & WATER_MASK));
-
// configure new utmp values
u.withme = currutmp->withme;
u.pager = currutmp->pager;
@@ -537,6 +530,7 @@ pwcuExitSave ()
u.signature = cuser.signature;
u.money = moneyof(usernum);
+ u.pager_ui_type = cuser.pager_ui_type;
// XXX 當初設計的人把 mind 設計成非 NULL terminated 的...
// assert(sizeof(u.mind) == sizeof(currutmp->mind));
@@ -553,6 +547,7 @@ pwcuExitSave ()
withme != u.withme||
pager != u.pager ||
money != u.money ||
+ pager_ui_type != u.pager_ui_type ||
signature != u.signature||
invisible != u.invisible))
{
diff --git a/mbbsd/talk.c b/mbbsd/talk.c
index dd4217ac..bbeb7c30 100644
--- a/mbbsd/talk.c
+++ b/mbbsd/talk.c
@@ -1011,7 +1011,7 @@ t_display_new(void)
t_display_new_flag = 1;
check_water_init();
- if (WATERMODE(WATER_ORIG))
+ if (PAGER_UI_IS(PAGER_UI_ORIG))
water_which = &water[0];
else
off = 3;
@@ -1019,10 +1019,10 @@ t_display_new(void)
if (water[0].count && watermode > 0) {
move(1, 0);
outs("───────水─球─回─顧───");
- outs(WATERMODE(WATER_ORIG) ?
+ outs(PAGER_UI_IS(PAGER_UI_ORIG) ?
"──────用[Ctrl-R Ctrl-T]鍵切換─────" :
"用[Ctrl-R Ctrl-T Ctrl-F Ctrl-G ]鍵切換────");
- if (WATERMODE(WATER_NEW)) {
+ if (PAGER_UI_IS(PAGER_UI_NEW)) {
move(2, 0);
clrtoeol();
for (i = 0; i < 6; i++) {
@@ -1055,7 +1055,7 @@ t_display_new(void)
if (len < 0)
len = 0;
- move(i + (WATERMODE(WATER_ORIG) ? 2 : 3), 0);
+ move(i + (PAGER_UI_IS(PAGER_UI_ORIG) ? 2 : 3), 0);
clrtoeol();
if (watermode - 1 != i)
prints(ANSI_COLOR(1;33;46) " %s " ANSI_COLOR(37;45) " %s " ANSI_RESET "%*s",
@@ -1079,7 +1079,7 @@ t_display_new(void)
move(i + off, 0);
outs("──────────────────────"
"─────────────────");
- if (WATERMODE(WATER_NEW))
+ if (PAGER_UI_IS(PAGER_UI_NEW))
while (i++ <= water[0].count) {
move(i + off, 0);
clrtoeol();
@@ -1928,7 +1928,7 @@ t_showhelp(void)
outs("\n" ANSI_COLOR(36) "【 交談專用鍵 】" ANSI_RESET "\n"
"(→)(t)(Enter) 跟他/她聊天\n"
"(w) 熱線 Call in\n"
- "(^W)切換水球方式 一般 / 進階 / 未來\n"
+ "(^W)切換水球方式 一般 / 進階\n"
"(b) 對好友廣播 (一定要在好友列表中)\n"
"(^R) 即時回應 (有人 Call in 你時)\n");
}
@@ -3013,20 +3013,16 @@ userlist(void)
case Ctrl('W'):
if (HasUserPerm(PERM_LOGINOK)) {
- int tmp;
- char *wm[3] = {"一般", "進階", "未來"};
-
+ static const char *wm[PAGER_UI_TYPES] = {"一般", "進階", "未來"};
- tmp = cuser.uflag2 & WATER_MASK;
- tmp = (tmp + 1) % 3;
- pwcuSetWaterballMode(tmp);
+ pwcuSetWaterballMode((cuser.pager_ui_type +1) % PAGER_UI_TYPES_USER);
/* vmsg cannot support multi lines */
move(b_lines - 4, 0);
clrtobot();
move(b_lines - 3, 0);
- outs("系統提供 一般 進階 未來 三種模式\n"
+ outs("系統提供數種水球模式可供選擇\n"
"在切換後請正常下線再重新登入, 以確保結構正確\n");
- vmsgf( "目前切換到 %s 水球模式", wm[tmp]);
+ vmsgf( "目前切換到 [%s] 水球模式", wm[cuser.pager_ui_type%PAGER_UI_TYPES]);
redrawall = redraw = 1;
}
break;
diff --git a/mbbsd/user.c b/mbbsd/user.c
index d6897099..29951d77 100644
--- a/mbbsd/user.c
+++ b/mbbsd/user.c
@@ -439,13 +439,13 @@ void Customize(void)
/* extended stuff */
{
char mindbuf[5];
- static const char *wm[] =
+ static const char *wm[PAGER_UI_TYPES+1] =
{"一般", "進階", "未來", ""};
prints("%c. %-40s%s\n",
'1' + iax++,
"水球模式",
- wm[(cuser.uflag2 & WATER_MASK)]);
+ wm[cuser.pager_ui_type % PAGER_UI_TYPES]);
memcpy(mindbuf, &currutmp->mind, 4);
mindbuf[4] = 0;
prints("%c. %-40s%s\n",
@@ -499,10 +499,8 @@ void Customize(void)
{
case 0:
{
- int currentset = cuser.uflag2 & WATER_MASK;
- currentset = (currentset + 1) % 3;
- pwcuSetWaterballMode(currentset);
- vmsg("修正水球模式後請正常離線再重新上線");
+ pwcuSetWaterballMode((cuser.pager_ui_type +1) % PAGER_UI_TYPES_USER);
+ vmsg("修改水球模式後請正常離線再重新上線");
dirty = 1;
}
continue;
diff --git a/mbbsd/var.c b/mbbsd/var.c
index eb178940..2a09f0a6 100644
--- a/mbbsd/var.c
+++ b/mbbsd/var.c
@@ -334,14 +334,14 @@ int KEY_ESC_arg;
int watermode = -1;
int wmofo = NOTREPLYING;
/*
- * WATERMODE(WATER_ORIG) | WATERMODE(WATER_NEW):
+ * PAGER_UI_IS(PAGER_UI_ORIG) | PAGER_UI_IS(PAGER_UI_NEW):
* ????????????????????
* Ptt 水球回顧 (FIXME: guessed by scw)
* watermode = -1 沒在回水球
* = 0 在回上一顆水球 (Ctrl-R)
* > 0 在回前 n 顆水球 (Ctrl-R Ctrl-R)
*
- * WATERMODE(WATER_OFO) by in2
+ * PAGER_UI_IS(PAGER_UI_OFO) by in2
* wmofo = NOTREPLYING 沒在回水球
* = REPLYING 正在回水球
* = RECVINREPLYING 回水球間又接到水球
diff --git a/upgrade/r4848_watermode.c b/upgrade/r4848_watermode.c
new file mode 100644
index 00000000..e9db7fc5
--- /dev/null
+++ b/upgrade/r4848_watermode.c
@@ -0,0 +1,57 @@
+#define _UTIL_C_
+#include "bbs.h"
+#include <time.h>
+
+int transform(userec_t *new, userec_t *old, int i)
+{
+ userec_t *u = new;
+
+ memcpy(new, old, sizeof(userec_t));
+
+ if (!u->userid[0])
+ return 0;
+
+ u->pager_ui_type = (u->uflag2 & 3) % PAGER_UI_TYPES;
+
+ printf("%-13s: wateremode: %d -> %d\n",
+ u->userid, u->uflag2 & 3, u->pager_ui_type);
+
+ // force convert!
+ // passwd_update(n+1, u);
+
+ return 0;
+}
+
+int main(void)
+{
+ int fd, fdw;
+ userec_t new;
+ userec_t old;
+ int i = 0;
+
+ printf("sizeof(userec_t)=%u\n", (unsigned int)sizeof(userec_t));
+ printf("You're going to convert your .PASSWDS\n");
+ printf("The new file will be named .PASSWDS.trans.tmp\n");
+
+ if (chdir(BBSHOME) < 0) {
+ perror("chdir");
+ exit(-1);
+ }
+
+ if ((fd = open(FN_PASSWD, O_RDONLY)) < 0 ||
+ (fdw = open(FN_PASSWD".trans.tmp", O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0 ) {
+ perror("open");
+ exit(-1);
+ }
+
+ while (read(fd, &old, sizeof(old)) > 0) {
+ transform(&new, &old, ++i);
+ write(fdw, &new, sizeof(new));
+ }
+
+ close(fd);
+ close(fdw);
+
+ // printf("total %d records converted.\n", accs);
+ return 0;
+}