summaryrefslogtreecommitdiffstats
path: root/mbbsd/pfterm.c
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2008-01-12 13:33:11 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2008-01-12 13:33:11 +0800
commita1cabe2b83732154321ed07a75b38f1d61807a82 (patch)
treeb15d9c78180c15c2409106fe9dd6438cd4c09714 /mbbsd/pfterm.c
parent89443698a9cf7c2b708b154f57449baa96e42a94 (diff)
downloadpttbbs-a1cabe2b83732154321ed07a75b38f1d61807a82.tar
pttbbs-a1cabe2b83732154321ed07a75b38f1d61807a82.tar.gz
pttbbs-a1cabe2b83732154321ed07a75b38f1d61807a82.tar.bz2
pttbbs-a1cabe2b83732154321ed07a75b38f1d61807a82.tar.lz
pttbbs-a1cabe2b83732154321ed07a75b38f1d61807a82.tar.xz
pttbbs-a1cabe2b83732154321ed07a75b38f1d61807a82.tar.zst
pttbbs-a1cabe2b83732154321ed07a75b38f1d61807a82.zip
- bbslua/pfterm: Add Win32 porting
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3822 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'mbbsd/pfterm.c')
-rw-r--r--mbbsd/pfterm.c55
1 files changed, 52 insertions, 3 deletions
diff --git a/mbbsd/pfterm.c b/mbbsd/pfterm.c
index d8e0d1ad..1288fecb 100644
--- a/mbbsd/pfterm.c
+++ b/mbbsd/pfterm.c
@@ -217,6 +217,14 @@ typedef struct
static FlatTerm ft;
+#ifdef _WIN32
+ // sorry, we support only 80x24 on Windows now.
+ HANDLE hStdout;
+ COORD coordBufSize = {80, 24}, coordBufCoord = {0, 0};
+ SMALL_RECT winrect = {0, 0, 79, 23};
+ CHAR_INFO winbuf[80*24];
+#endif
+
//////////////////////////////////////////////////////////////////////////
// Flat Terminal Utility Macro
//////////////////////////////////////////////////////////////////////////
@@ -392,6 +400,12 @@ int fterm_DBCS_Big5(unsigned char c1, unsigned char c2);
void
initscr(void)
{
+#ifdef _WIN32
+ hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
+ SetConsoleScreenBufferSize(hStdout, coordBufSize);
+ SetConsoleCursorPosition(hStdout, coordBufCoord);
+#endif
+
memset(&ft, sizeof(ft), 0);
resizeterm(FTSZ_DEFAULT_ROW, FTSZ_DEFAULT_COL);
ft.attr = ft.rattr = FTATTR_DEFAULT;
@@ -709,6 +723,31 @@ doupdate(void)
return;
}
+#ifdef _WIN32
+
+ assert(ft.rows == coordBufSize.Y);
+ assert(ft.cols == coordBufSize.X);
+
+ for (y = 0; y < ft.rows; y++)
+ {
+ for (x = 0; x < ft.cols; x++)
+ {
+ WORD xAttr = FTAMAP[y][x], xxAttr;
+ // w32 attribute: bit swap (0,2) and (4, 6)
+ xxAttr = xAttr & 0xAA;
+ if (xAttr & 0x01) xxAttr |= 0x04;
+ if (xAttr & 0x04) xxAttr |= 0x01;
+ if (xAttr & 0x10) xxAttr |= 0x40;
+ if (xAttr & 0x40) xxAttr |= 0x10;
+
+ winbuf[y*ft.cols + x].Attributes= xxAttr;
+ winbuf[y*ft.cols + x].Char.AsciiChar = FTCMAP[y][x];
+ }
+ }
+ WriteConsoleOutputA(hStdout, winbuf, coordBufSize, coordBufCoord, &winrect);
+
+#else // !_WIN32
+
// if scroll, do it first
if (ft.scroll)
fterm_rawscroll(ft.scroll);
@@ -911,7 +950,9 @@ doupdate(void)
}
}
- // doing rawcursor() earlier to enable max display time
+#endif // !_WIN32
+
+ // doing fterm_rawcursor() earlier to enable max display time
fterm_rawcursor();
fterm_dupe2bk();
ft.dirty = 0;
@@ -1985,10 +2026,17 @@ fterm_rawmove_opt(int y, int x)
void
fterm_rawcursor(void)
{
+#ifdef _WIN32
+ COORD cursor;
+ cursor.X = ft.x;
+ cursor.Y = ft.y;
+ SetConsoleCursorPosition(hStdout, cursor);
+#else
// fterm_rawattr(FTATTR_DEFAULT);
fterm_rawattr(ft.attr);
fterm_rawmove_opt(ft.y, ft.x);
fterm_rawflush();
+#endif // !_WIN32
}
void
@@ -2145,11 +2193,12 @@ standend(void)
}
#ifndef _PFTERM_TEST_MAIN
+
void
scr_dump(screen_backup_t *psb)
{
int y = 0;
- void *p = NULL;
+ char *p = NULL;
psb->row= ft.rows;
psb->col= ft.cols;
@@ -2171,7 +2220,7 @@ void
scr_restore(const screen_backup_t *psb)
{
int y = 0;
- void *p = NULL;
+ char *p = NULL;
int c = ft.cols, r = ft.rows;
if (!psb || !psb->raw_memory)
return;