From 3fb853d7b776eae50c4482dab199362c4ce31685 Mon Sep 17 00:00:00 2001 From: flash Date: Wed, 9 Oct 2024 02:22:45 +0200 Subject: [PATCH] Added CTRL+C handling. --- source/app.d | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/source/app.d b/source/app.d index 6eb989b..04ca780 100644 --- a/source/app.d +++ b/source/app.d @@ -1,5 +1,60 @@ import std.stdio; +import core.thread; +import core.stdc.signal; +import core.sys.windows.windows; + +__gshared bool hasCancelled; + +version(Posix) { + extern(C) void signalHander(int num) nothrow @nogc @system { + if(num == SIGINT) + hasCancelled = true; + } +} + +version(Windows) { + extern(Windows) BOOL ctrlHandler(DWORD fdwCtrlType) nothrow @nogc @system { + switch(fdwCtrlType) { + case CTRL_C_EVENT: + case CTRL_CLOSE_EVENT: + hasCancelled = true; + return TRUE; + + default: + return FALSE; + } + } +} void main() { - writeln("meow"); + import std.range : padLeft; + import std.string : format; + + version(Windows) + if(!SetConsoleCtrlHandler(&ctrlHandler, TRUE)) + stderr.writeln("Failed to register Windows CTRL handler."); + + version(Posix) + signal(SIGINT, &signalHander); + + if(hasCancelled) return; + + writeln(r" __ ____ __ __ "); + writeln(r" / |/ (_) /______ / /_____ "); + writeln(r" / /|_/ / / //_/ __ \/ __/ __ \"); + writeln(r" / / / / / ,< / /_/ / /_/ /_/ /"); + writeln(r"/_/ /_/_/_/|_|\____/\__/\____/ "); + + debug writeln("== %s ========= DEBUG ==".format("aabbccddee")); + else writeln("v0.0.0".padLeft(' ', 30)); + + if(hasCancelled) return; + + for(;;) { + Thread.sleep(1.seconds); + if(hasCancelled) + break; + } + + writeln("Exiting!"); }