[RFC] ColorD

Jens Mueller jens.k.mueller at gmx.de
Sun Oct 28 03:40:08 PDT 2012


Adam D. Ruppe wrote:
> Here we go, some more basic functions:
> 
> http://arsdnet.net/dcode/terminal.d
> 
> The unix stuff is more implemented than the windows.
> 
> 
> Let's walk through main and I'll discuss why I'm doing things the
> way I am. I'm throwing this out just to show one possible way this
> can be done and to explain why I like this way. Feel free to take
> some or all of my code if you want.
> 
> 
> 	auto terminal = Terminal(ConsoleOutputType.cellular);
> 
> First, the terminal is a separate type, a struct, rather than just
> magic functions. This way it can use the struct destructor to reset
> things to normal.
> 
> The argument here is either linear or cellular - do you want line
> based output or do you want to control the whole screen as a grid of
> cells?
> 
> If you use cellular, it will use the alternative screen buffer on
> unix terminals. IIRC Windows works basically the same way. This is
> what we want for a TUI app.
> 
> The escape sequences to make this happen is based on the envrionment
> variable TERMCAP, which is set by gnu screen, xterm, and most other
> emulators.
> 
> It is *not* set by the linux console or rxvt on my box, so this
> isn't perfect yet, but it is a start. If it can't find a capability
> in there, it simply ignores those method calls, meaning it should be
> backward compatible (once fully implemented - I haven't done this on
> title yet.)

I like that you code won't need additional libraries. But how do you
plan to handle the linux console or rxvt if setting TERMCAP is not
portable?

> 	terminal.setTitle("Basic I/O");
> 
> All changes are done with methods. This is how Windows does it and
> is cleaner anyway.
> 
> 	auto input = terminal.captureInput(ConsoleInputFlags.raw);
> 
> To get real time input, you use a special method which returns an
> input struct. Which could probably be an input range actually but
> isn't now.
> 
> Anyway the reason is you have to change the terminal mode in linux
> to get real time input. Otherwise it will be line buffered. Again, a
> struct lets us reset the mode automatically in the destructor. The
> flags let you control automatic echo.
> 
> 	terminal.color(Color.green | Bright, Color.black);
> 
> I insist that you set foreground and background colors together.
> This ensure you get readable text.
> 
> The colors are defined with a platform independent color enum and
> you can flag in bright to get brighter colors.
> 
> 
> BTW I'm thinking about calling it LowContrast instead of bright...
> then your color definitions can always be the same regardless of bg,
> and it automatically flips the bright bit if needed. But since I'm
> forcing you to specify background here too it isn't a big deal with
> now.
> 
> 
> 	int centerX = terminal.width / 2;
> 	int centerY = terminal.height / 2;
> 
> I prefer width and height to rows and columns. I think more in terms
> of gui here.
> 
> 	while(true) {
> 		if(input.kbhit()) {
> 
> Since we have real time capture, can poll for new input instead of
> blocking.
> 
> 			auto c = input.getch();
> 
> Get our character... (BTW this function still needs a lot of work)
> 
> 			if(c == 'q' || c == 'Q')
> 				break;
> 			terminal.moveTo(centerX, centerY);
> 			terminal.writef("%c", c);
> 			terminal.flush();
> 
> And output the stuff, centering the text. All output methods are
> attached to the terminal to ensure the proper api stuff is handled.
> 
> 		usleep(10000);
> 
> This is just there so we don't eat too much cpu waiting on input.

This looks well thought-out. I'm unsure about TERMCAP. Currently I'm
using tinfo instead. Probably I'm going will all your ideas but still
using tinfo.

Jens


More information about the Digitalmars-d mailing list