Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Jun 2016 23:13:14 +0000 (UTC)
From:      Alan Somers <asomers@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r302162 - head/usr.sbin/gstat
Message-ID:  <201606232313.u5NNDEu3093674@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: asomers
Date: Thu Jun 23 23:13:14 2016
New Revision: 302162
URL: https://svnweb.freebsd.org/changeset/base/302162

Log:
  Fix gstat's interactive f and q commands
  
  curses and libedit don't play well together. After last year's libedit
  upgrade in head, they play even less well together. This change resets some
  curses settings after they get screwed up by libedit calls. Without it,
  gstat's interactive commands require an extra "enter", screw up the terminal
  on exit, and screw up the display if the user enters an invalid filter
  string.
  
  PR:		204852
  Submitted by:	Keith White
  Reviewed by:	pfg
  Approved by:	re (gjb)
  MFC after:	4 weeks
  Sponsored by:	Spectra Logic Corp
  Differential Revision:	https://reviews.freebsd.org/D6934

Modified:
  head/usr.sbin/gstat/gstat.c

Modified: head/usr.sbin/gstat/gstat.c
==============================================================================
--- head/usr.sbin/gstat/gstat.c	Thu Jun 23 22:42:03 2016	(r302161)
+++ head/usr.sbin/gstat/gstat.c	Thu Jun 23 23:13:14 2016	(r302162)
@@ -167,20 +167,6 @@ main(int argc, char **argv)
 	if (sq == NULL)
 		err(1, "geom_stats_snapshot()");
 	if (!flag_b) {
-		/* Setup curses */
-		initscr();
-		start_color();
-		use_default_colors();
-		pair_content(0, &cf, &cb);
-		init_pair(1, COLOR_GREEN, cb);
-		init_pair(2, COLOR_MAGENTA, cb);
-		init_pair(3, COLOR_RED, cb);
-		cbreak();
-		noecho();
-		nonl();
-		nodelay(stdscr, 1);
-		intrflush(stdscr, FALSE);
-		keypad(stdscr, TRUE);
 		/* Setup libedit */
 		hist = history_init();
 		if (hist == NULL)
@@ -195,6 +181,20 @@ main(int argc, char **argv)
 		el_set(el, EL_PROMPT, el_prompt);
 		if (f_s[0] != '\0')
 			history(hist, &hist_ev, H_ENTER, f_s);
+		/* Setup curses */
+		initscr();
+		start_color();
+		use_default_colors();
+		pair_content(0, &cf, &cb);
+		init_pair(1, COLOR_GREEN, cb);
+		init_pair(2, COLOR_MAGENTA, cb);
+		init_pair(3, COLOR_RED, cb);
+		cbreak();
+		noecho();
+		nonl();
+		nodelay(stdscr, 1);
+		intrflush(stdscr, FALSE);
+		keypad(stdscr, TRUE);
 	}
 	geom_stats_snapshot_timestamp(sq, &tq);
 	for (quit = 0; !quit;) {
@@ -410,12 +410,15 @@ main(int argc, char **argv)
 				if ((p = strchr(tmp_f_s, '\n')) != NULL)
 					*p = '\0';
 				/*
-				 * We have to clear since we messed up
+				 * Fix the terminal.  We messed up
 				 * curses idea of the screen by using
 				 * libedit.
 				 */
 				clear();
 				refresh();
+				cbreak();
+				noecho();
+				nonl();
 				if (regcomp(&tmp_f_re, tmp_f_s, REG_EXTENDED)
 				    != 0) {
 					move(0, 0);
@@ -440,8 +443,8 @@ main(int argc, char **argv)
 	}
 
 	if (!flag_b) {
-		endwin();
 		el_end(el);
+		endwin();
 	}
 	exit(EX_OK);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201606232313.u5NNDEu3093674>