Commit ccf2ea914f91ed510e98e7e6eb3cba09778c35e1

Con Kolivas 2011-07-12T00:33:08

Convert the log and status portions of the screen to two separate ncurses windows for simpler cleaner output.

diff --git a/main.c b/main.c
index 1cfc7fc..977288d 100644
--- a/main.c
+++ b/main.c
@@ -518,7 +518,7 @@ static inline int cpu_from_thr_id(int thr_id)
 	return (thr_id - gpu_threads) % num_processors;
 }
 
-static WINDOW * mainwin;
+static WINDOW *mainwin, *statuswin, *logwin;
 static double total_secs = 0.1;
 static char statusline[256];
 static int cpucursor, gpucursor, logstart, logcursor;
@@ -532,79 +532,63 @@ static inline void print_status(int thr_id)
 	if (unlikely(!curses_active))
 		return;
 
-	move(2,0);
-	printw("Totals: %s", statusline);
-	clrtoeol();
+	wmove(statuswin, 0, 0);
+	wattron(statuswin, A_BOLD);
+	wprintw(statuswin, PROGRAM_NAME " version " VERSION);
+	wattroff(statuswin, A_BOLD);
+	wmove(statuswin, 1, 0);
+	whline(statuswin, '-', 80);
+	wmove(statuswin, 2,0);
+	wprintw(statuswin, "Totals: %s", statusline);
+	wclrtoeol(statuswin);
+	wmove(statuswin, 3, 0);
+	whline(statuswin, '-', 80);
+	wmove(statuswin, logstart - 1, 0);
+	whline(statuswin, '-', 80);
 
 	if (thr_id >= 0 && thr_id < gpu_threads) {
 		int gpu = gpu_from_thr_id(thr_id);
 		struct cgpu_info *cgpu = &gpus[gpu];
 
-		move(gpucursor + gpu, 0);
-		printw("GPU %d: [%.1f Mh/s] [Q:%d  A:%d  R:%d  HW:%d  E:%.0f%%  U:%.2f/m]          ",
+		wmove(statuswin, gpucursor + gpu, 0);
+		wprintw(statuswin, "GPU %d: [%.1f Mh/s] [Q:%d  A:%d  R:%d  HW:%d  E:%.0f%%  U:%.2f/m]",
 			gpu, cgpu->total_mhashes / total_secs,
 			cgpu->getworks, cgpu->accepted, cgpu->rejected, cgpu->hw_errors,
 			cgpu->efficiency, cgpu->utility);
-		clrtoeol();
+		wclrtoeol(statuswin);
 	} else if (thr_id >= gpu_threads) {
 		int cpu = cpu_from_thr_id(thr_id);
 		struct cgpu_info *cgpu = &cpus[cpu];
 
-		move(cpucursor + cpu, 0);
-		printw("CPU %d: [%.1f Mh/s] [Q:%d  A:%d  R:%d  HW:%d  E:%.0f%%  U:%.2f/m]",
+		wmove(statuswin, cpucursor + cpu, 0);
+		wprintw(statuswin, "CPU %d: [%.1f Mh/s] [Q:%d  A:%d  R:%d  HW:%d  E:%.0f%%  U:%.2f/m]",
 			cpu, cgpu->total_mhashes / total_secs,
 			cgpu->getworks, cgpu->accepted, cgpu->rejected, cgpu->hw_errors,
 			cgpu->efficiency, cgpu->utility);
-		clrtoeol();
+		wclrtoeol(statuswin);
 	}
 
-	move(logcursor, 0);
-	refresh();
-}
-
-static void refresh_display(void)
-{
-	int i, x;
-
-	if (unlikely(!curses_active))
-		return;
-
-	move(0,0);
-	attron(A_BOLD);
-	printw(PROGRAM_NAME " version " VERSION);
-	attroff(A_BOLD);
-	clrtoeol();
-	move(1, 0);
-	clrtoeol();
-	hline('-', 80);
-	move(3, 0);
-	clrtoeol();
-	hline('-', 80);
-	move(logstart, 0);
-	clrtoeol();
-	hline('-', 80);
-
-	for (i = 0; i < mining_threads; i++)
-		print_status(i);
-
-	move(logcursor, 0);
-	redrawwin(mainwin);
+	wrefresh(statuswin);
 }
 
 void log_curses(const char *f, va_list ap)
 {
-	int x;
+	int x, y, logx, logy;
 
 	if (unlikely(!curses_active))
 		return;
 
-	/* Scroll log output downwards */
-	getmaxyx(mainwin, logcursor, x);
-	move(--logcursor, 0);
-	vw_printw(mainwin, f, ap);
-	clrtoeol();
-
-	refresh_display();
+	getmaxyx(mainwin, y, x);
+	getmaxyx(logwin, logy, logx);
+	y -= logcursor;
+	/* Detect screen size change */
+	if (x != logx || y != logy) {
+		wresize(logwin, y, x);
+		redrawwin(logwin);
+		redrawwin(statuswin);
+	}
+	vw_printw(logwin, f, ap);
+	wrefresh(logwin);
 }
 
 static bool submit_fail = false;
@@ -1736,7 +1720,7 @@ static void *wakeup_thread(void *userdata)
 int main (int argc, char *argv[])
 {
 	struct thr_info *thr;
-	unsigned int i, j = 0;
+	unsigned int i, j = 0, x, y;
 	char name[32];
 
 	if (unlikely(pthread_mutex_init(&hash_lock, NULL)))
@@ -1804,7 +1788,7 @@ int main (int argc, char *argv[])
 	mining_threads = opt_n_threads + gpu_threads;
 	gpucursor = logcursor;
 	cpucursor = gpucursor + nDevs;
-	logstart = cpucursor + (opt_n_threads ? num_processors : 0);
+	logstart = cpucursor + (opt_n_threads ? num_processors : 0) + 1;
 	logcursor = logstart + 1;
 
 	if (!rpc_userpass) {
@@ -1982,16 +1966,17 @@ int main (int argc, char *argv[])
 	pthread_mutex_unlock(&hash_lock);
 
 	/* Set up the ncurses interface */
-	if ((mainwin = initscr()) == NULL) {
-		applog(LOG_ERR, "Failed to initscr");
-		return 1;
-	}
-	idlok(mainwin, true);
-	scrollok(mainwin, true);
+	mainwin = initscr();
+	statuswin = newwin(logstart, 80, 0, 0);
+	getmaxyx(mainwin, y, x);
+	logwin = newwin(y - logcursor, 0, logcursor, 0);
+	idlok(logwin, true);
+	scrollok(logwin, true);
+	leaveok(logwin, true);
+	leaveok(statuswin, true);
 	curses_active = true;
-	getmaxyx(mainwin, logcursor, i);
-	move(logcursor, 0);
-	refresh_display();
+	for (i = 0; i < mining_threads; i++)
+		print_status(i);
 
 	/* Now that everything's ready put enough work in the queue */
 	for (i = 0; i < opt_queue + mining_threads; i++) {
@@ -2011,7 +1996,8 @@ int main (int argc, char *argv[])
 
 	applog(LOG_INFO, "workio thread dead, exiting.");
 
-	delwin(mainwin);
+	delwin(logwin);
+	delwin(statuswin);
 	endwin();
 	refresh();