Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dosbox-staging/dosbox-staging.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/dos/dos.cpp')
-rw-r--r--src/dos/dos.cpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/dos/dos.cpp b/src/dos/dos.cpp
index 6081899ec..f8fba87b9 100644
--- a/src/dos/dos.cpp
+++ b/src/dos/dos.cpp
@@ -1440,6 +1440,74 @@ static Bitu DOS_26Handler(void) {
return CBRET_NONE;
}
+constexpr uint8_t code_ctrl_c = 0x03;
+constexpr uint8_t code_return = 0x0d;
+constexpr uint8_t code_esc = 0x1b;
+
+bool DOS_IsCancelRequest()
+{
+ if (shutdown_requested)
+ return true;
+
+ CALLBACK_Idle();
+ while (!(Files[STDIN]->GetInformation() & (1 << 6))) {
+ // A key is waiting, read it
+ uint16_t count = 1;
+ uint8_t code = 0;
+ DOS_ReadFile(STDIN, &code, &count);
+
+ // Check if user requested to cancel
+ if (shutdown_requested || count == 0 ||
+ code == 'q' || code == 'Q' ||
+ code == code_ctrl_c || code == code_esc)
+ return true;
+ }
+
+ // Return control if no key pressed
+ return shutdown_requested;
+}
+
+UserDecision DOS_WaitForCancelContinue()
+{
+ auto decision = UserDecision::Next;
+ while (decision == UserDecision::Next)
+ decision = DOS_WaitForCancelContinueNext();
+
+ return decision;
+}
+
+UserDecision DOS_WaitForCancelContinueNext()
+{
+ auto decision = UserDecision::Cancel;
+ while (!shutdown_requested) {
+ CALLBACK_Idle();
+
+ // Try to read the key
+ uint16_t count = 1;
+ uint8_t code = 0;
+ DOS_ReadFile(STDIN, &code, &count);
+
+ if (shutdown_requested || count == 0 ||
+ code == 'q' || code == 'Q' ||
+ code == code_ctrl_c || code == code_esc) {
+ decision = UserDecision::Cancel;
+ break;
+ }
+
+ if (code == code_return || code == ' ') {
+ decision = UserDecision::Continue;
+ break;
+ }
+
+ if (code == 'n' || code == 'N') {
+ decision = UserDecision::Next;
+ break;
+ }
+ }
+
+ return decision;
+}
+
DOS_Version DOS_ParseVersion(const char *word, const char *args)
{
DOS_Version new_version = {5, 0, 0}; // Default to 5.0