⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 console.c

📁 Wine-20031016
💻 C
📖 第 1 页 / 共 2 页
字号:
    c.Y = 0;    for (p = 0; p < 3; p++)    {        c.X = sbSize.X - 3 + p;        okCHAR(hCon, c, mytest[p], TEST_ATTRIB);    }    c.Y = 1;    for (p = 0; p < mylen - 3; p++)    {        c.X = p;        okCHAR(hCon, c, mytest[p + 3], TEST_ATTRIB);    }    c.X = mylen - 3;    okCHAR(hCon, c, ' ', DEFAULT_ATTRIB);    okCURSOR(hCon, c);}static void testWriteWrappedProcessed(HANDLE hCon, COORD sbSize){    COORD		c;    DWORD		len, mode;    const char*		mytest = "abcd\nf\tg";    const int	mylen = strlen(mytest);    int			p;    ok(GetConsoleMode(hCon, &mode) && SetConsoleMode(hCon, mode | (ENABLE_WRAP_AT_EOL_OUTPUT|ENABLE_PROCESSED_OUTPUT)),       "setting wrap at EOL & processed output");    /* write line, wrapping enabled, buffer doesn't exceed sb width */    c.X = sbSize.X - 9; c.Y = 0;    ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left-9");    ok(WriteConsole(hCon, mytest, mylen, &len, NULL) != 0 && len == mylen, "WriteConsole");    for (p = 0; p < 4; p++)    {        c.X = sbSize.X - 9 + p;        okCHAR(hCon, c, mytest[p], TEST_ATTRIB);    }    c.X = sbSize.X - 9 + p;    okCHAR(hCon, c, ' ', DEFAULT_ATTRIB);    c.X = 0; c.Y++;    okCHAR(hCon, c, mytest[5], TEST_ATTRIB);    for (c.X = 1; c.X < 8; c.X++)        okCHAR(hCon, c, ' ', TEST_ATTRIB);    okCHAR(hCon, c, mytest[7], TEST_ATTRIB);    c.X++;    okCHAR(hCon, c, ' ', DEFAULT_ATTRIB);    okCURSOR(hCon, c);    /* write line, wrapping enabled, buffer does exceed sb width */    c.X = sbSize.X - 3; c.Y = 2;    ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left-3");    ok(WriteConsole(hCon, mytest, mylen, &len, NULL) != 0 && len == mylen, "WriteConsole");    for (p = 0; p < 3; p++)    {        c.X = sbSize.X - 3 + p;        okCHAR(hCon, c, mytest[p], TEST_ATTRIB);    }    c.X = 0; c.Y++;    okCHAR(hCon, c, mytest[3], TEST_ATTRIB);    c.X++;    okCHAR(hCon, c, ' ', DEFAULT_ATTRIB);    c.X = 0; c.Y++;    okCHAR(hCon, c, mytest[5], TEST_ATTRIB);    for (c.X = 1; c.X < 8; c.X++)        okCHAR(hCon, c, ' ', TEST_ATTRIB);    okCHAR(hCon, c, mytest[7], TEST_ATTRIB);    c.X++;    okCHAR(hCon, c, ' ', DEFAULT_ATTRIB);    okCURSOR(hCon, c);}static void testWrite(HANDLE hCon, COORD sbSize){    /* FIXME: should in fact insure that the sb is at least 10 character wide */    ok(SetConsoleTextAttribute(hCon, TEST_ATTRIB), "Setting default text color");    resetContent(hCon, sbSize, FALSE);    testWriteSimple(hCon, sbSize);    resetContent(hCon, sbSize, FALSE);    testWriteNotWrappedNotProcessed(hCon, sbSize);    resetContent(hCon, sbSize, FALSE);    testWriteNotWrappedProcessed(hCon, sbSize);    resetContent(hCon, sbSize, FALSE);    testWriteWrappedNotProcessed(hCon, sbSize);    resetContent(hCon, sbSize, FALSE);    testWriteWrappedProcessed(hCon, sbSize);}#if 0static void testScroll(HANDLE hCon, COORD sbSize){    SMALL_RECT  scroll, clip;    COORD       dst, c, tc;    CHAR_INFO   ci;#define W 11#define H 7    /* no clipping, src & dst rect don't overlap */    resetContent(hCon, sbSize, TRUE);#define IN_SRECT(r,c) ((r).Left <= (c).X && (c).X <= (r).Right && (r).Top <= (c).Y && (c).Y <= (r).Bottom)#define IN_SRECT2(r,d,c) ((d).X <= (c).X && (c).X <= (d).X + (r).Right - (r).Left && (d).Y <= (c).Y && (c).Y <= (d).Y + (r).Bottom - (r).Top)    scroll.Left = 0;    scroll.Right = W - 1;    scroll.Top = 0;    scroll.Bottom = H - 1;    dst.X = W + 3;    dst.Y = H + 3;    ci.Char.UnicodeChar = '#';    ci.Attributes = TEST_ATTRIB;    clip.Left = 0;    clip.Right = sbSize.X - 1;    clip.Top = 0;    clip.Bottom = sbSize.Y - 1;    ok(ScrollConsoleScreenBuffer(hCon, &scroll, NULL, dst, &ci), "Scrolling SB");    for (c.Y = 0; c.Y < sbSize.Y; c.Y++)    {        for (c.X = 0; c.X < sbSize.X; c.X++)        {            if (IN_SRECT2(scroll, dst, c) && IN_SRECT(clip, c))            {                tc.X = c.X - dst.X;                tc.Y = c.Y - dst.Y;                okCHAR(hCon, c, CONTENT(tc), DEFAULT_ATTRIB);            }            else if (IN_SRECT(scroll, c) && IN_SRECT(clip, c))                okCHAR(hCon, c, '#', TEST_ATTRIB);            else okCHAR(hCon, c, CONTENT(c), DEFAULT_ATTRIB);        }    }    /* no clipping, src & dst rect do overlap */    resetContent(hCon, sbSize, TRUE);    scroll.Left = 0;    scroll.Right = W - 1;    scroll.Top = 0;    scroll.Bottom = H - 1;    dst.X = W /2;    dst.Y = H / 2;    ci.Char.UnicodeChar = '#';    ci.Attributes = TEST_ATTRIB;    clip.Left = 0;    clip.Right = sbSize.X - 1;    clip.Top = 0;    clip.Bottom = sbSize.Y - 1;    ok(ScrollConsoleScreenBuffer(hCon, &scroll, NULL, dst, &ci), "Scrolling SB");    for (c.Y = 0; c.Y < sbSize.Y; c.Y++)    {        for (c.X = 0; c.X < sbSize.X; c.X++)        {            if (dst.X <= c.X && c.X < dst.X + W && dst.Y <= c.Y && c.Y < dst.Y + H)            {                tc.X = c.X - dst.X;                tc.Y = c.Y - dst.Y;                okCHAR(hCon, c, CONTENT(tc), DEFAULT_ATTRIB);            }            else if (c.X < W && c.Y < H) okCHAR(hCon, c, '#', TEST_ATTRIB);            else okCHAR(hCon, c, CONTENT(c), DEFAULT_ATTRIB);        }    }    /* clipping, src & dst rect don't overlap */    resetContent(hCon, sbSize, TRUE);    scroll.Left = 0;    scroll.Right = W - 1;    scroll.Top = 0;    scroll.Bottom = H - 1;    dst.X = W + 3;    dst.Y = H + 3;    ci.Char.UnicodeChar = '#';    ci.Attributes = TEST_ATTRIB;    clip.Left = W / 2;    clip.Right = min(W + W / 2, sbSize.X - 1);    clip.Top = H / 2;    clip.Bottom = min(H + H / 2, sbSize.Y - 1);    ok(ScrollConsoleScreenBuffer(hCon, &scroll, &clip, dst, &ci), "Scrolling SB");    for (c.Y = 0; c.Y < sbSize.Y; c.Y++)    {        for (c.X = 0; c.X < sbSize.X; c.X++)        {            if (IN_SRECT2(scroll, dst, c) && IN_SRECT(clip, c))            {                tc.X = c.X - dst.X;                tc.Y = c.Y - dst.Y;                okCHAR(hCon, c, CONTENT(tc), DEFAULT_ATTRIB);            }            else if (IN_SRECT(scroll, c) && IN_SRECT(clip, c))                okCHAR(hCon, c, '#', TEST_ATTRIB);            else okCHAR(hCon, c, CONTENT(c), DEFAULT_ATTRIB);        }    }    /* clipping, src & dst rect do overlap */    resetContent(hCon, sbSize, TRUE);    scroll.Left = 0;    scroll.Right = W - 1;    scroll.Top = 0;    scroll.Bottom = H - 1;    dst.X = W / 2 - 3;    dst.Y = H / 2 - 3;    ci.Char.UnicodeChar = '#';    ci.Attributes = TEST_ATTRIB;    clip.Left = W / 2;    clip.Right = min(W + W / 2, sbSize.X - 1);    clip.Top = H / 2;    clip.Bottom = min(H + H / 2, sbSize.Y - 1);    ok(ScrollConsoleScreenBuffer(hCon, &scroll, &clip, dst, &ci), "Scrolling SB");    for (c.Y = 0; c.Y < sbSize.Y; c.Y++)    {        for (c.X = 0; c.X < sbSize.X; c.X++)        {            if (IN_SRECT2(scroll, dst, c) && IN_SRECT(clip, c))            {                tc.X = c.X - dst.X;                tc.Y = c.Y - dst.Y;                okCHAR(hCon, c, CONTENT(tc), DEFAULT_ATTRIB);            }            else if (IN_SRECT(scroll, c) && IN_SRECT(clip, c))                okCHAR(hCon, c, '#', TEST_ATTRIB);            else okCHAR(hCon, c, CONTENT(c), DEFAULT_ATTRIB);        }    }}#endifSTART_TEST(console){    HANDLE hConIn, hConOut;    BOOL ret;    CONSOLE_SCREEN_BUFFER_INFO	sbi;    /* be sure we have a clean console (and that's our own)     * FIXME: this will make the test fail (currently) if we don't run     * under X11     * Another solution would be to rerun the test under wineconsole with     * the curses backend     */    hConIn = CreateFileA("CONIN$", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);    hConOut = CreateFileA("CONOUT$", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);    /* first, we need to be sure we're attached to a console */    if (hConIn == INVALID_HANDLE_VALUE || hConOut == INVALID_HANDLE_VALUE)    {        /* we're not attached to a console, let's do it */        AllocConsole();        hConIn = CreateFileA("CONIN$", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);        hConOut = CreateFileA("CONOUT$", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);    }    /* now verify everything's ok */    ok(hConIn != INVALID_HANDLE_VALUE, "Opening ConIn");    ok(hConOut != INVALID_HANDLE_VALUE, "Opening ConOut");    ok(ret = GetConsoleScreenBufferInfo(hConOut, &sbi), "Getting sb info");    if (!ret) return;    /* Non interactive tests */    testCursor(hConOut, sbi.dwSize);    /* will test wrapped (on/off) & processed (on/off) strings output */    testWrite(hConOut, sbi.dwSize);    /* will test line scrolling at the bottom of the screen */    /* testBottomScroll(); */    /* will test all the scrolling operations */    /* this one is disabled for now, Wine's result are way too bad */    /* testScroll(hCon, sbi.dwSize); */    /* will test sb creation / modification... */    /* testScreenBuffer() */    /* still to be done: events generation, access rights & access on objects */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -