如何使用ncurses获得明亮的白色背景色?

时间:2017-10-06 13:17:21

标签: c ncurses

如何在ncurses中获得带有黑色文字的亮白色背景,类似于nano中的标题栏?尽管遵循the advice in another question(这与在黑色背景上获得明亮的白色文字,与我想要实现的相反),我似乎可以实现所有这一切,是一个丑陋的米色背景。

图片:

GNU nano的标题栏,我想要的。

enter image description here

我从下面的程序中获得了什么。 (使用gcc -lncursesw -I/usr/include minimal_example.c构建)

enter image description here

#include <locale.h>
#include <ncurses.h>

int main() {
    setlocale(LC_ALL, "");
    // Initialize curses library
    initscr();
    // Enable colors
    start_color();
    // Attempt recommendation in https://stackoverflow.com/questions/1896162/how-to-get-a-brightwhite-color-in-ncurses and other places on the web
    use_default_colors();
    // Make the COLOR_PAIR 0xFF refer to a white foreground, black background window.
    // Using -1 will not work in my case, because I want the opposite of the default (black text  on white bg), not the default (white text on black bg).
    init_pair(0xFF, COLOR_BLACK, COLOR_WHITE);
    refresh();
    // Get our term height and width.
    int x;
    int y;
    // & not required because this is a macro
    getmaxyx(stdscr, y, x); 
    // Create a new window.
    // TODO: Resize the window when the term resizes.
    WINDOW *window = newwin(y,x,0,0);
    // Try some other attributes recommended online, no dice. Putting this after the call to wbkgd() just makes the text look strange, does not change the background.
    wattron(window,A_BOLD|A_STANDOUT);
    // Set window color.
    wbkgd(window, COLOR_PAIR(0xff));
    // Draw a nice box around the window.
    box(window, 0, 0); 
    // Write some text.
    mvwprintw(window, 1, 1, "背景:不白");
    wrefresh(window);

    // Wait for keypress to exit.
    getch(); 
    // De-initialize ncurses.
    endwin();
    return 0;
}

我认为我的终端配置(termite)可能有问题,但我能够使用默认配置在xfce4-terminalxterm中重现问题。解决此问题的唯一方法是将我的color7color15设置为与foreground相同的颜色,显然我不想这样做,因为这是非标准的,我想要分发此代码所用的较大应用程序。

(xfce4-terminal有bug) enter image description here

3 个答案:

答案 0 :(得分:1)

如果有至少16种颜色且can_change_color()返回true,我的建议是定义鲜艳的颜色(9到15)。否则会回到非亮色:

#include <stdlib.h>
#include <locale.h>
#include <ncurses.h>

#define PAIR_BW       1
#define BRIGHT_WHITE  15

int main(void) {
    int rows, cols;

    setlocale(LC_ALL, "");
    initscr();

    start_color();
    use_default_colors();
    if (can_change_color() && COLORS >= 16)
        init_color(BRIGHT_WHITE, 1000,1000,1000);

    if (COLORS >= 16) {
        init_pair(PAIR_BW, COLOR_BLACK, BRIGHT_WHITE);
    } else {
        init_pair(PAIR_BW, COLOR_BLACK, COLOR_WHITE);
    }

    refresh();
    getmaxyx(stdscr, rows, cols); 
    WINDOW *window = newwin(rows,cols,0,0);
    wbkgd(window, COLOR_PAIR(PAIR_BW));
    box(window, 0, 0); 
    mvwprintw(window, 1, 1, "背景:不白");
    wrefresh(window);

    getch(); 
    endwin();
    return EXIT_SUCCESS;
}

这已经过测试,可以在Gnome Terminal 3.18.3和XTerm 322中使用,如果使用ncursesw,它应该适用于所有具有颜色功能的终端(尽管在一些奇怪的终端上你仍然可以获得非亮白背景)。

答案 1 :(得分:0)

此更改(假设TERM=xterm-256color)执行了所要求的操作:

> diff -u foo.c foo2.c
--- foo.c       2017-10-06 15:59:56.000000000 -0400
+++ foo2.c      2017-10-06 16:10:11.893529758 -0400
@@ -7,10 +7,9 @@
     initscr();
     // Enable colors
     start_color();
-    // Attempt recommendation in https://stackoverflow.com/questions/1896162/how-to-get-a-brightwhite-color-in-ncurses and other places on the web
-    use_default_colors();
-    // Make the COLOR_PAIR 0xFF refer to a white foreground, black background window.
-    // Using -1 will not work in my case, because I want the opposite of the default (black text  on white bg), not the default (white text on black bg).
+    // redefine colors, using the initc capability in TERM=xterm-256color
+    init_color(COLOR_BLACK, 0, 0, 0);
+    init_color(COLOR_WHITE, 999, 999, 999);
     init_pair(0xFF, COLOR_BLACK, COLOR_WHITE);
     refresh();
     // Get our term height and width.

nano不这样做。您可能会发现阅读它的source-code很有帮助,看它是否通过使用终端的默认颜色来解决问题。

答案 2 :(得分:-2)

终端模拟器中的颜色有点混乱。你的问题是灰色的背景确实是白色的&#34;根据你的终端!在Wikipedia上查看此表格。看看&#34; White&#34;行是跨越所有不同的终端模拟器?你真正想要的是&#34;明亮的白色&#34;,这超出了8种初始颜色。问题是,根据curses

  

某些终端支持超过八(8)种“ANSI”颜色。那里   没有其他颜色的标准名称。

所以你只需要按编号使用它们,并希望每个人的终端都符合维基百科上的表格(我认为最多)。

init_pair(0xFF, COLOR_BLACK, COLORS > 15 ? 15 : COLOR_WHITE);

这就是你所需要的,所以你可以摆脱所有其他use_default_colorsA_BOLD的东西。

旧回答:

curs_color手册说

  

请注意,通过颜色对设置隐式背景颜色只会影响字符编写操作明确触及的字符单元格。

     

...

     

A_BLINK属性理论上应该使背景变亮。

确实,如果你只是改变

wbkgd(window, COLOR_PAIR(0xff) | A_BLINK);

您将获得明亮的白色背景,但仅限于绘制文本的区域(包括窗口边框)。我不确定如何在整个窗口背景下获得相同的效果,但希望这可以让你开始。