On Tuesday, 17 February 2015 at 19:35:27 UTC, H. S. Teoh wrote:
On Tue, Feb 17, 2015 at 07:17:41PM +0000, Paul via Digitalmars-d-learn wrote:
I'd like to create a Terminal using terminal.d and make it available across several source files (as a global rather than having to pass it
around) but when I define it like this in global scope:

Terminal Screen = Terminal(ConsoleOutputType.cellular);

I get this error:

Error: getenv cannot be interpreted at compile time, because it has no
available source code

I don't understand the error and Google doesn't help - can it be fixed
or am I just using the wrong approach?
[...]

The problem is that the Terminal constructor reads runtime information from the OS, so it cannot be run at compile-time. What you need to do is
to initialize it at runtime inside a static this() block:

        Terminal* screen;
        static this() {
                *screen = Terminal(ConsoleOutputType.cellular);
        }

Note that you have to use a pointer, because the Terminal struct does
not allow default construction of a Terminal.

However, this isn't the end of the story... because the Terminal
destructor also resets the terminal back to its original state -- otherwise after the program exits, you'll be stuck in cellular mode, which may not be very nice on some systems where the shell will get very confused (or rather, the user will see gibberish and not understand
what's going on).

So the *correct* approach is to initialize the Terminal struct in
main(), so that when main() exits it will clean up properly:

        Terminal* screen;
        void main(string[] args) {
                // Create the Terminal here
                auto term = Terminal(ConsoleOutputType.cellular);
                screen = &term;     // so that everybody else can see it

                ... // main program goes here
        } // Terminal will clean up properly here

It's a bit ugly, but it should work. At least, that's what I do in my
own programs that use terminal.d. :-)


T

Got it, I thought it might be something like this but when I tried to do:

Terminal screen;

...and initialise it later it failed because of the disabled default constructor.

There doesn't seem to be an alternative to using a pointer as it's rather a large struct to pass to functions as is!

which was falling

Reply via email to