]> granicus.if.org Git - nethack/commitdiff
fix up PDCurses cursor placement for prompts
authornhmall <nhmall@nethack.org>
Sat, 15 Dec 2018 04:08:41 +0000 (23:08 -0500)
committernhmall <nhmall@nethack.org>
Sat, 15 Dec 2018 04:08:41 +0000 (23:08 -0500)
sys/share/pcunix.c
sys/winnt/windmain.c
win/curses/cursdial.c
win/curses/cursmain.c
win/curses/cursmesg.c
win/win32/vs2017/NetHack.vcxproj
win/win32/vs2017/NetHackW.vcxproj

index bb746ca92d99e606f6f3dce1725a9a11928c097c..f1cf7144eec2fdb89fd52690fb30f998eb8f88ff 100644 (file)
@@ -9,15 +9,15 @@
 #include "wintty.h"
 
 #include <sys/stat.h>
-#if defined(WIN32) || defined(MSDOS)
+#if defined(MSDOS)
 #include <errno.h>
 #endif
 
-#if defined(WIN32) || defined(MSDOS)
+#if defined(MSDOS)
 extern char orgdir[];
 #endif
 
-#if defined(WIN32) && defined(TTY_GRAPHICS)
+#if defined(TTY_GRAPHICS)
 extern void NDECL(backsp);
 extern void NDECL(clear_screen);
 #endif
@@ -49,7 +49,7 @@ int fd;
        return(0);
     }
 #else
-#if (defined(MICRO) || defined(WIN32)) && !defined(NO_FSTAT)
+#if (defined(MICRO)) && !defined(NO_FSTAT)
     if(fstat(fd, &buf)) {
        if(moves > 1) pline("Cannot get status of saved level? ");
        else pline("Cannot get status of saved game.");
@@ -126,28 +126,7 @@ getlock()
 #if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
         chdirx(orgdir, 0);
 #endif
-#if defined(WIN32) || defined(HOLD_LOCKFILE_OPEN)
-#if defined(HOLD_LOCKFILE_OPEN)
-        if (errno == EACCES) {
-#define OOPS_BUFSZ 512
-            char oops[OOPS_BUFSZ];
-            Strcpy(
-                oops,
-                "\nThere are files from a game in progress under your name.");
-            Strcat(oops, "\nThe files are locked or inaccessible.");
-            Strcat(oops, " Is the other game still running?\n");
-            if (strlen(fq_lock) < ((OOPS_BUFSZ - 16) - strlen(oops)))
-                Sprintf(eos(oops), "Cannot open %s", fq_lock);
-            Strcat(oops, "\n");
-            unlock_file(HLOCK);
-            error(oops);
-        } else
-#endif
-            error("Bad directory or name: %s\n%s\n", fq_lock,
-                  strerror(errno));
-#else
         perror(fq_lock);
-#endif
         unlock_file(HLOCK);
         error("Cannot open %s", fq_lock);
     }
@@ -197,10 +176,6 @@ getlock()
     if (c == 'y' || c == 'Y')
 #ifndef SELF_RECOVER
         if (eraseoldlocks()) {
-#if defined(WIN32) && defined(TTY_GRAPHICS)
-            if (WINDOWPORT("tty"))
-                clear_screen(); /* display gets fouled up otherwise */
-#endif
             goto gotlock;
         } else {
             unlock_file(HLOCK);
@@ -211,7 +186,7 @@ getlock()
         }
 #else /*SELF_RECOVER*/
         if (recover_savefile()) {
-#if defined(WIN32) && defined(TTY_GRAPHICS)
+#if defined(TTY_GRAPHICS)
             if (WINDOWPORT("tty"))
                 clear_screen(); /* display gets fouled up otherwise */
 #endif
@@ -241,13 +216,7 @@ gotlock:
 #if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
         chdirx(orgdir, 0);
 #endif
-#if defined(WIN32)
-        error("cannot creat file (%s.)\n%s\n%s\"%s\" exists?\n", fq_lock,
-              strerror(ern), " Are you sure that the directory",
-              fqn_prefix[LEVELPREFIX]);
-#else
         error("cannot creat file (%s.)", fq_lock);
-#endif
     } else {
         if (write(fd, (char *) &hackpid, sizeof(hackpid))
             != sizeof(hackpid)) {
@@ -270,7 +239,6 @@ gotlock:
 }
 #endif /* PC_LOCKING */
 
-#ifndef WIN32
 void
 regularize(s)
 /*
@@ -290,7 +258,6 @@ register char *s;
             *lp == '|' || *lp >= 127 || (*lp >= '[' && *lp <= ']'))
             *lp = '_';
 }
-#endif /* WIN32 */
 
 #ifdef __EMX__
 void
index 15ae95d87af9f5b343c4bc1cc9db8506b470017e..b70cd456d5102e3608897a8584cca0ca3e76ae18 100644 (file)
@@ -9,6 +9,11 @@
 #include "dlb.h"
 #include <ctype.h>
 #include <sys\stat.h>
+#include <errno.h>
+
+#if 0
+#include "wintty.h"
+#endif
 
 #if !defined(SAFEPROCS)
 #error You must #define SAFEPROCS to build windmain.c
@@ -26,8 +31,15 @@ E char chosen_windowtype[WINTYPELEN];   /* flag.h */
 #if defined(MSWIN_GRAPHICS)
 E void NDECL(mswin_destroy_reg);
 #endif
+#ifdef TTY_GRAPHICS
+extern void NDECL(backsp);
+extern void NDECL(clear_screen);
+#endif
 #undef E
 
+#ifdef PC_LOCKING
+static int NDECL(eraseoldlocks);
+#endif
 int NDECL(windows_nhgetch);
 void NDECL(windows_nhbell);
 int FDECL(windows_nh_poskey, (int *, int *, int *));
@@ -45,6 +57,14 @@ HANDLE hStdOut;
 #if defined(MSWIN_GRAPHICS)
 char default_window_sys[] = "mswin";
 #endif
+#ifdef WANT_GETHDATE
+static struct stat hbuf;
+#endif
+#include <sys/stat.h>
+#if defined(WIN32) || defined(MSDOS)
+#endif
+
+extern char orgdir[];
 
 /*
  * __MINGW32__ Note
@@ -724,4 +744,181 @@ char *outbuf;
     Strcpy(outbuf, "\033");
 }
 
-/*pcmain.c*/
+#ifdef PC_LOCKING
+static int
+eraseoldlocks()
+{
+    register int i;
+
+    /* cannot use maxledgerno() here, because we need to find a lock name
+     * before starting everything (including the dungeon initialization
+     * that sets astral_level, needed for maxledgerno()) up
+     */
+    for (i = 1; i <= MAXDUNGEON * MAXLEVEL + 1; i++) {
+        /* try to remove all */
+        set_levelfile_name(lock, i);
+        (void) unlink(fqname(lock, LEVELPREFIX, 0));
+    }
+    set_levelfile_name(lock, 0);
+#ifdef HOLD_LOCKFILE_OPEN
+    really_close();
+#endif
+    if (unlink(fqname(lock, LEVELPREFIX, 0)))
+        return 0; /* cannot remove it */
+    return (1);   /* success! */
+}
+
+void
+getlock()
+{
+    register int fd, c, ci, ct, ern;
+    int fcmask = FCMASK;
+    char tbuf[BUFSZ];
+    const char *fq_lock;
+#define OOPS_BUFSZ 512
+    char oops[OOPS_BUFSZ];
+
+    /* we ignore QUIT and INT at this point */
+    if (!lock_file(HLOCK, LOCKPREFIX, 10)) {
+        wait_synch();
+#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
+        chdirx(orgdir, 0);
+#endif
+        error("Quitting.");
+    }
+
+    /* regularize(lock); */ /* already done in pcmain */
+    Sprintf(tbuf, "%s", fqname(lock, LEVELPREFIX, 0));
+    set_levelfile_name(lock, 0);
+    fq_lock = fqname(lock, LEVELPREFIX, 1);
+    if ((fd = open(fq_lock, 0)) == -1) {
+        if (errno == ENOENT)
+            goto gotlock; /* no such file */
+#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
+        chdirx(orgdir, 0);
+#endif
+#if defined(HOLD_LOCKFILE_OPEN)
+        if (errno == EACCES) {
+            Strcpy(
+                oops,
+                "\nThere are files from a game in progress under your name.");
+            Strcat(oops, "\nThe files are locked or inaccessible.");
+            Strcat(oops, " Is the other game still running?\n");
+            if (strlen(fq_lock) < ((OOPS_BUFSZ - 16) - strlen(oops)))
+                Sprintf(eos(oops), "Cannot open %s", fq_lock);
+            Strcat(oops, "\n");
+            unlock_file(HLOCK);
+            raw_print(oops);
+        } else
+#endif
+            error("Bad directory or name: %s\n%s\n", fq_lock,
+                  strerror(errno));
+        unlock_file(HLOCK);
+        Sprintf(oops, "Cannot open %s", fq_lock);
+        raw_print(oops);
+        nethack_exit(EXIT_FAILURE);
+    }
+
+    (void) nhclose(fd);
+
+    if (iflags.window_inited || WINDOWPORT("curses")) {
+#ifdef SELF_RECOVER
+        c = yn("There are files from a game in progress under your name. "
+               "Recover?");
+#else
+        pline("There is already a game in progress under your name.");
+        pline("You may be able to use \"recover %s\" to get it back.\n",
+              tbuf);
+        c = yn("Do you want to destroy the old game?");
+#endif
+    } else {
+        c = 'n';
+        ct = 0;
+#ifdef SELF_RECOVER
+        raw_print("There are files from a game in progress under your name. "
+              "Recover? [yn]");
+#else
+        raw_print("\nThere is already a game in progress under your name.\n");
+        raw_print("If this is unexpected, you may be able to use \n");
+        raw_print("\"recover %s\" to get it back.", tbuf);
+        raw_print("\nDo you want to destroy the old game? [yn] ");
+#endif
+        while ((ci = nhgetch()) != '\n') {
+            if (ct > 0) {
+                raw_print("\b \b");
+                ct = 0;
+                c = 'n';
+            }
+            if (ci == 'y' || ci == 'n' || ci == 'Y' || ci == 'N') {
+                ct = 1;
+                c = ci;
+            }
+        }
+    }
+    if (c == 'y' || c == 'Y')
+#ifndef SELF_RECOVER
+        if (eraseoldlocks()) {
+            if (WINDOWPORT("tty"))
+                clear_screen(); /* display gets fouled up otherwise */
+            goto gotlock;
+        } else {
+            unlock_file(HLOCK);
+#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
+            chdirx(orgdir, 0);
+#endif
+            raw_print("Couldn't destroy old game.");
+        }
+#else /*SELF_RECOVER*/
+        if (recover_savefile()) {
+            if (WINDOWPORT("tty"))
+                clear_screen(); /* display gets fouled up otherwise */
+            goto gotlock;
+        } else {
+            unlock_file(HLOCK);
+#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
+            chdirx(orgdir, 0);
+#endif
+            raw_print("Couldn't recover old game.");
+        }
+#endif /*SELF_RECOVER*/
+    else {
+        unlock_file(HLOCK);
+#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
+        chdirx(orgdir, 0);
+#endif
+        Sprintf(oops, "%s", "Cannot start a new game.");
+        raw_print(oops);
+    }
+
+gotlock:
+    fd = creat(fq_lock, fcmask);
+    if (fd == -1)
+        ern = errno;
+    unlock_file(HLOCK);
+    if (fd == -1) {
+#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
+        chdirx(orgdir, 0);
+#endif
+        Sprintf(oops, "cannot creat file (%s.)\n%s\n%s\"%s\" exists?\n", fq_lock,
+              strerror(ern), " Are you sure that the directory",
+              fqn_prefix[LEVELPREFIX]);
+        raw_print(oops);
+    } else {
+        if (write(fd, (char *) &hackpid, sizeof(hackpid))
+            != sizeof(hackpid)) {
+#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
+            chdirx(orgdir, 0);
+#endif
+            error("cannot write lock (%s)", fq_lock);
+        }
+        if (nhclose(fd) == -1) {
+#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
+            chdirx(orgdir, 0);
+#endif
+            error("cannot close lock (%s)", fq_lock);
+        }
+    }
+}
+#endif /* PC_LOCKING */
+
+/*windmain.c*/
index 2e63b6f8287c72bbe72ae289e717b5e37e71a04a..41d8e9ffa69e1a3740098536c0769a859fc7c60a 100644 (file)
@@ -164,6 +164,7 @@ curses_character_input_dialog(const char *prompt, const char *choices,
                               CHAR_P def)
 {
     WINDOW *askwin = NULL;
+    WINDOW *message_window;
     int answer, count, maxwidth, map_height, map_width;
     char *linestr;
     char askstr[BUFSZ + QBUFSZ];
@@ -180,6 +181,9 @@ curses_character_input_dialog(const char *prompt, const char *choices,
         map_width = term_cols;
     }
 
+#ifdef PDCURSES
+    message_window = curses_get_nhwin(MESSAGE_WIN);
+#endif
     maxwidth = map_width - 2;
 
     if (choices != NULL) {
@@ -241,8 +245,11 @@ curses_character_input_dialog(const char *prompt, const char *choices,
     /*curses_stupid_hack = 0; */
 
     while (1) {
+#ifdef PDCURSES
+        answer = wgetch(message_window);
+#else
         answer = getch();
-
+#endif
         if (answer == ERR) {
             answer = def;
             break;
index 62abc71f16ad5e5c98b56d01132900b7e63546d9..f2ab82542c15404c31a15a5fbbc75cb8f5ad501a 100644 (file)
@@ -619,7 +619,13 @@ raw_print(str)  -- Print directly to a screen, or otherwise guarantee that
 void
 curses_raw_print(const char *str)
 {
+#ifdef PDCURSES
+    WINDOW *win = curses_get_nhwin(MESSAGE_WIN);
+
+    curses_message_win_puts(str, FALSE);
+#else
     puts(str);
+#endif
 }
 
 /*
index dd0f6e3490e9a7e2e342cc6fec7fa35fd3888c92..98e3677d15870155d4cfc5eaae6f344c971e9577 100644 (file)
@@ -143,7 +143,7 @@ curses_block(boolean noscroll)
 {
     int height, width, ret = 0;
     WINDOW *win = curses_get_nhwin(MESSAGE_WIN);
-    char *resp = " \n\033"; /* space, enter, esc */
+    char *resp = " \r\n\033"; /* space, enter, esc */
 
 
     curses_get_window_size(MESSAGE_WIN, &height, &width);
@@ -429,7 +429,11 @@ curses_message_win_getline(const char *prompt, char *answer, int buffer)
         wmove(win, my, mx);
         curs_set(1);
         wrefresh(win);
+#ifdef PDCURSES
+        ch = wgetch(win);
+#else
         ch = getch();
+#endif
         curs_set(0);
         switch(ch) {
         case '\033': /* DOESCAPE */
index 9f193832a0579c58af8fd51d28447ac4388f9d86..1e114f64fabb82f26894bd83da6c28cefd24d9e0 100644 (file)
     <ClCompile Include="$(SysShareDir)cppregex.cpp" />\r
     <ClCompile Include="$(SysShareDir)nhlan.c" />\r
     <ClCompile Include="$(SysShareDir)pcsys.c" />\r
-    <ClCompile Include="$(SysShareDir)pcunix.c" />\r
     <ClCompile Include="$(SysShareDir)random.c" />\r
     <ClCompile Include="$(SysWinntDir)ntsound.c" />\r
     <ClCompile Include="$(SysWinntDir)nttty.c" />\r
index d1ede9f0a1eb07897c8fe09630bd458e1c4e2718..79a25df44813f0b1798e077d5ee03e3bacd515b7 100644 (file)
     <ClCompile Include="$(SysShareDir)cppregex.cpp" />\r
     <ClCompile Include="$(SysShareDir)nhlan.c" />\r
     <ClCompile Include="$(SysShareDir)pcsys.c" />\r
-    <ClCompile Include="$(SysShareDir)pcunix.c" />\r
     <ClCompile Include="$(SysShareDir)random.c" />\r
     <ClCompile Include="$(SysWinntDir)ntsound.c" />\r
     <ClCompile Include="$(SysWinntDir)stubs.c">\r