Author: rinrab
Date: Wed Apr  8 21:26:10 2026
New Revision: 1932913

Log:
svnbrowse: Implement exiting by ESC.

* subversion/svnbrowse/svnbrowse.c
  (KEY_ESC): Define.
  (view_on_event): Add case for the ESC key.
  (sub_main): Disable ESCDELAY and elaborate my thoughts about ESCDELAY and
   this shortcut in general.

Modified:
   subversion/trunk/subversion/svnbrowse/svnbrowse.c

Modified: subversion/trunk/subversion/svnbrowse/svnbrowse.c
==============================================================================
--- subversion/trunk/subversion/svnbrowse/svnbrowse.c   Wed Apr  8 20:48:06 
2026        (r1932912)
+++ subversion/trunk/subversion/svnbrowse/svnbrowse.c   Wed Apr  8 21:26:10 
2026        (r1932913)
@@ -108,6 +108,8 @@ const apr_getopt_option_t svn_browse__op
  * alphabetical order. */
 #define CTRL(ch) ((ch) - 'a' + 1)
 
+#define KEY_ESC 27
+
 typedef struct svn_browse__view_t {
   /* TODO: store information about terminal screen (a WINDOW* in curses world) 
*/
   svn_browse__model_t *model;
@@ -152,9 +154,8 @@ view_on_event(svn_browse__view_t *view,
       case 'u':
         SVN_ERR(svn_browse__model_go_up(view->model, scratch_pool));
         break;
-      /* TODO: quit via escape. some say just check for 27, but it I think it's
-       * a bit ugly. */
       case 'q':
+      case KEY_ESC:
         return svn_error_create(SVN_ERR_CANCELLED, NULL, NULL);
     }
 
@@ -401,6 +402,25 @@ sub_main(int *code, int argc, const char
   keypad(stdscr, TRUE);
   nonl();
 
+  /* ESCDELAY is a ncurses-exclusive variable that controls how curses will
+   * handle escape sequences - when a user hits ESC and inputs a command for
+   * the application to potentially do some handling. We don't really care
+   * about this capability and would rather prefer to get out of svnbrowse by
+   * ESC. Other backends may require further testing. It still works fine with
+   * this variable misconfigured.
+   *
+   * Generally, the decision to exit by ESC itself is questionable, as the
+   * majority of default applications don't do that (like vim, less, man). Some
+   * users would spam escape after each action and the others to would expect
+   * it to close a 37-deep stacked dialog. Anyway we can just drop associated
+   * case statement at any time if we found that annoying.
+   *
+   * Find more info in 'man ESCDELAY'. */
+
+#ifdef NCURSES_VERSION
+  ESCDELAY = 0;
+#endif /* NCURSES_VERSION */
+
   view = view_make(ctx, pool);
 
   iterpool = svn_pool_create(pool);

Reply via email to