From 976caaf06b6021bb5bedd9929f0ad082cb3385d9 Mon Sep 17 00:00:00 2001
From: Danny Auble <da@llnl.gov>
Date: Tue, 20 Apr 2010 23:22:10 +0000
Subject: [PATCH] ok, this added the rc support to slurm.  There is no way to
 set it up automatically right now, but a little popup will be added next
 time.

---
 src/sview/Makefile.am |   4 +-
 src/sview/Makefile.in |  26 +++-
 src/sview/common.c    |  56 ++++++++
 src/sview/defaults.c  | 307 ++++++++++++++++++++++++++++++++++++++++++
 src/sview/sview.c     |  62 ++++-----
 src/sview/sview.h     |  30 +++--
 6 files changed, 432 insertions(+), 53 deletions(-)
 create mode 100644 src/sview/defaults.c

diff --git a/src/sview/Makefile.am b/src/sview/Makefile.am
index 910409ac3fb..515a152f25e 100644
--- a/src/sview/Makefile.am
+++ b/src/sview/Makefile.am
@@ -17,7 +17,7 @@ noinst_HEADERS = sview.h
 sview_SOURCES = sview.c popups.c grid.c part_info.c job_info.c \
 	block_info.c node_info.c resv_info.c \
 	submit_info.c admin_info.c common.c \
-	config_info.c
+	config_info.c defaults.c
 
 force:
 $(sview_LDADD) : force
@@ -30,6 +30,6 @@ else
 
 EXTRA_sview_SOURCES = sview.h sview.c popups.c grid.c part_info.c job_info.c \
 	block_info.c node_info.c resv_info.c \
-	submit_info.c admin_info.c common.c
+	submit_info.c admin_info.c common.c config_info.c defaults.c
 
 endif
diff --git a/src/sview/Makefile.in b/src/sview/Makefile.in
index 2938e1bb5b3..1cbe20d7435 100644
--- a/src/sview/Makefile.in
+++ b/src/sview/Makefile.in
@@ -89,7 +89,7 @@ am__installdirs = "$(DESTDIR)$(bindir)"
 PROGRAMS = $(bin_PROGRAMS)
 am__sview_SOURCES_DIST = sview.c popups.c grid.c part_info.c \
 	job_info.c block_info.c node_info.c resv_info.c submit_info.c \
-	admin_info.c common.c config_info.c
+	admin_info.c common.c config_info.c defaults.c
 @HAVE_GTK_TRUE@am_sview_OBJECTS = sview-sview.$(OBJEXT) \
 @HAVE_GTK_TRUE@	sview-popups.$(OBJEXT) sview-grid.$(OBJEXT) \
 @HAVE_GTK_TRUE@	sview-part_info.$(OBJEXT) \
@@ -100,10 +100,11 @@ am__sview_SOURCES_DIST = sview.c popups.c grid.c part_info.c \
 @HAVE_GTK_TRUE@	sview-submit_info.$(OBJEXT) \
 @HAVE_GTK_TRUE@	sview-admin_info.$(OBJEXT) \
 @HAVE_GTK_TRUE@	sview-common.$(OBJEXT) \
-@HAVE_GTK_TRUE@	sview-config_info.$(OBJEXT)
+@HAVE_GTK_TRUE@	sview-config_info.$(OBJEXT) \
+@HAVE_GTK_TRUE@	sview-defaults.$(OBJEXT)
 am__EXTRA_sview_SOURCES_DIST = sview.h sview.c popups.c grid.c \
 	part_info.c job_info.c block_info.c node_info.c resv_info.c \
-	submit_info.c admin_info.c common.c
+	submit_info.c admin_info.c common.c config_info.c defaults.c
 sview_OBJECTS = $(am_sview_OBJECTS)
 @HAVE_GTK_TRUE@sview_DEPENDENCIES = $(top_builddir)/src/plugins/select/bluegene/block_allocator/libbluegene_block_allocator.la \
 @HAVE_GTK_TRUE@	$(top_builddir)/src/db_api/libslurmdb.o
@@ -325,13 +326,13 @@ INCLUDES = -I$(top_srcdir) $(BG_INCLUDES)
 @HAVE_GTK_TRUE@sview_SOURCES = sview.c popups.c grid.c part_info.c job_info.c \
 @HAVE_GTK_TRUE@	block_info.c node_info.c resv_info.c \
 @HAVE_GTK_TRUE@	submit_info.c admin_info.c common.c \
-@HAVE_GTK_TRUE@	config_info.c
+@HAVE_GTK_TRUE@	config_info.c defaults.c
 
 @HAVE_GTK_TRUE@sview_LDFLAGS = -export-dynamic $(CMD_LDFLAGS) $(BG_LDFLAGS) $(GTK_LIBS)
 @HAVE_GTK_TRUE@sview_CFLAGS = $(GTK_CFLAGS)
 @HAVE_GTK_FALSE@EXTRA_sview_SOURCES = sview.h sview.c popups.c grid.c part_info.c job_info.c \
 @HAVE_GTK_FALSE@	block_info.c node_info.c resv_info.c \
-@HAVE_GTK_FALSE@	submit_info.c admin_info.c common.c
+@HAVE_GTK_FALSE@	submit_info.c admin_info.c common.c config_info.c defaults.c
 
 all: all-am
 
@@ -424,6 +425,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sview-block_info.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sview-common.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sview-config_info.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sview-defaults.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sview-grid.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sview-job_info.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sview-node_info.Po@am__quote@
@@ -622,6 +624,20 @@ sview-config_info.obj: config_info.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sview_CFLAGS) $(CFLAGS) -c -o sview-config_info.obj `if test -f 'config_info.c'; then $(CYGPATH_W) 'config_info.c'; else $(CYGPATH_W) '$(srcdir)/config_info.c'; fi`
 
+sview-defaults.o: defaults.c
+@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sview_CFLAGS) $(CFLAGS) -MT sview-defaults.o -MD -MP -MF $(DEPDIR)/sview-defaults.Tpo -c -o sview-defaults.o `test -f 'defaults.c' || echo '$(srcdir)/'`defaults.c
+@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/sview-defaults.Tpo $(DEPDIR)/sview-defaults.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='defaults.c' object='sview-defaults.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sview_CFLAGS) $(CFLAGS) -c -o sview-defaults.o `test -f 'defaults.c' || echo '$(srcdir)/'`defaults.c
+
+sview-defaults.obj: defaults.c
+@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sview_CFLAGS) $(CFLAGS) -MT sview-defaults.obj -MD -MP -MF $(DEPDIR)/sview-defaults.Tpo -c -o sview-defaults.obj `if test -f 'defaults.c'; then $(CYGPATH_W) 'defaults.c'; else $(CYGPATH_W) '$(srcdir)/defaults.c'; fi`
+@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/sview-defaults.Tpo $(DEPDIR)/sview-defaults.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='defaults.c' object='sview-defaults.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sview_CFLAGS) $(CFLAGS) -c -o sview-defaults.obj `if test -f 'defaults.c'; then $(CYGPATH_W) 'defaults.c'; else $(CYGPATH_W) '$(srcdir)/defaults.c'; fi`
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
diff --git a/src/sview/common.c b/src/sview/common.c
index f951e69ac7a..9881703a33d 100644
--- a/src/sview/common.c
+++ b/src/sview/common.c
@@ -1583,3 +1583,59 @@ extern void sview_widget_modify_bg(GtkWidget *widget, GtkStateType state,
 /* 			g_print("%d 3 took %s\n", grid_button->inx, TIME_STR); */
 
 }
+
+extern char *page_to_str(int page)
+{
+	switch(page) {
+	case JOB_PAGE:
+		return "Job";
+	case PART_PAGE:
+		return "Partition";
+	case NODE_PAGE:
+		return "Node";
+	case BLOCK_PAGE:
+		return "Block";
+	case RESV_PAGE:
+		return "Reservation";
+	case SUBMIT_PAGE:
+		return "Submit";
+	case ADMIN_PAGE:
+		return "Admin";
+	case INFO_PAGE:
+		return "Info";
+	default:
+		return "Unknown";
+	}
+	return "Unknown";
+}
+
+extern char *tab_pos_to_str(int pos)
+{
+	switch(pos) {
+	case GTK_POS_TOP:
+		return "Top";
+	case GTK_POS_BOTTOM:
+		return "Bottom";
+	case GTK_POS_LEFT:
+		return "Left";
+	case GTK_POS_RIGHT:
+		return "Right";
+	default:
+		return "Unknown";
+	}
+	return "Unknown";
+}
+
+extern char *visible_to_str()
+{
+	char *ret = NULL;
+	int i = 0;
+	for(i=0; i<PAGE_CNT; i++)
+		if(sview_config.page_visible[i]) {
+			if(ret)
+				xstrcat(ret, ",");
+			xstrcat(ret, page_to_str(i));
+		}
+
+	return ret;
+}
diff --git a/src/sview/defaults.c b/src/sview/defaults.c
new file mode 100644
index 00000000000..581e1e29f26
--- /dev/null
+++ b/src/sview/defaults.c
@@ -0,0 +1,307 @@
+/****************************************************************************\
+ *  defaults.c - put default configuration information here
+ *****************************************************************************
+ *  Copyright (C) 2004-2007 The Regents of the University of California.
+ *  Copyright (C) 2008 Lawrence Livermore National Security.
+ *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
+ *  Written by Danny Auble <da@llnl.gov>, et. al.
+ *  CODE-OCEC-09-009. All rights reserved.
+ *
+ *  This file is part of SLURM, a resource management program.
+ *  For details, see <https://computing.llnl.gov/linux/slurm/>.
+ *  Please also read the included file: DISCLAIMER.
+ *
+ *  SLURM is free software; you can redistribute it and/or modify it under
+ *  the terms of the GNU General Public License as published by the Free
+ *  Software Foundation; either version 2 of the License, or (at your option)
+ *  any later version.
+ *
+ *  In addition, as a special exception, the copyright holders give permission
+ *  to link the code of portions of this program with the OpenSSL library under
+ *  certain conditions as described in each individual source file, and
+ *  distribute linked combinations including the two. You must obey the GNU
+ *  General Public License in all respects for all of the code used other than
+ *  OpenSSL. If you modify file(s) with this exception, you may extend this
+ *  exception to your version of the file(s), but you are not obligated to do
+ *  so. If you do not wish to do so, delete this exception statement from your
+ *  version.  If you delete this exception statement from all source files in
+ *  the program, then also delete it here.
+ *
+ *  SLURM is distributed in the hope that it will be useful, but WITHOUT ANY
+ *  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ *  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ *  details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with SLURM; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
+\*****************************************************************************/
+#include <fcntl.h>
+
+#include "sview.h"
+#include "src/common/parse_config.h"
+#include "src/common/slurm_strcasestr.h"
+
+extern display_data_t main_display_data[];
+
+static int _write_to_file(int fd, char *data)
+{
+	int pos = 0, nwrite = strlen(data), amount;
+	int rc = SLURM_SUCCESS;
+
+	while (nwrite > 0) {
+		amount = write(fd, &data[pos], nwrite);
+		if ((amount < 0) && (errno != EINTR)) {
+			error("Error writing file: %m");
+			rc = errno;
+			break;
+		}
+		nwrite -= amount;
+		pos    += amount;
+	}
+	return rc;
+}
+
+static void _init_sview_conf()
+{
+	int i;
+
+	sview_config.refresh_delay = 5;
+	sview_config.grid_x_width = 0;
+	sview_config.grid_hori = 10;
+	sview_config.grid_vert = 10;
+	sview_config.show_hidden = 0;
+	sview_config.admin_mode = FALSE;
+	sview_config.grid_speedup = 0;
+	sview_config.show_grid = TRUE;
+	sview_config.page_default = JOB_PAGE;
+	sview_config.tab_pos = GTK_POS_TOP;
+
+	if(getenv("SVIEW_GRID_SPEEDUP"))
+		sview_config.grid_speedup = 1;
+	for(i=0; i<PAGE_CNT; i++) {
+		if(!main_display_data[i].show)
+			sview_config.page_visible[i] = FALSE;
+		else
+			sview_config.page_visible[i] = TRUE;
+	}
+}
+
+extern int load_defaults()
+{
+	s_p_hashtbl_t *hashtbl = NULL;
+	s_p_options_t sview_conf_options[] = {
+		{"AdminMode", S_P_BOOLEAN},
+		{"DefaultPage", S_P_STRING},
+		{"GridHorizontal", S_P_UINT32},
+		{"GridSpeedUp", S_P_BOOLEAN},
+		{"GridVertical", S_P_UINT32},
+		{"GridXWidth", S_P_UINT32},
+		{"RefreshDelay", S_P_UINT16},
+		{"ShowGrid", S_P_BOOLEAN},
+		{"ShowHidden", S_P_BOOLEAN},
+		{"TabPosition", S_P_STRING},
+		{"VisiblePages", S_P_STRING},
+		{NULL}
+	};
+	char *pathname = NULL;
+	char *home = getenv("HOME");
+	uint32_t hash_val = NO_VAL;
+	int rc = SLURM_SUCCESS;
+	char *tmp_str;
+	_init_sview_conf();
+
+	if(!home)
+		return SLURM_ERROR;
+
+	pathname = xstrdup_printf("%s/.slurm", home);
+	if ((mkdir(pathname, 0750) < 0) && (errno != EEXIST)) {
+		error("mkdir(%s): %m", pathname);
+		rc = SLURM_ERROR;
+		goto end_it;
+	}
+	xstrcat(pathname, "/sviewrc");
+
+	if(access(pathname, R_OK) != 0) {
+		rc = SLURM_ERROR;
+		goto end_it;
+	}
+
+	hashtbl = s_p_hashtbl_create(sview_conf_options);
+
+	if(s_p_parse_file(hashtbl, &hash_val, pathname) == SLURM_ERROR)
+		fatal("something wrong with opening/reading conf file");
+
+	s_p_get_boolean(&sview_config.admin_mode, "AdminMode", hashtbl);
+	if (s_p_get_string(&tmp_str, "DefaultPage", hashtbl)) {
+		if (slurm_strcasestr(tmp_str, "job"))
+			sview_config.page_default = JOB_PAGE;
+		else if (slurm_strcasestr(tmp_str, "part"))
+			sview_config.page_default = PART_PAGE;
+		else if (slurm_strcasestr(tmp_str, "res"))
+			sview_config.page_default = RESV_PAGE;
+#ifdef HAVE_BG
+		else if (slurm_strcasestr(tmp_str, "block"))
+			sview_config.page_default = BLOCK_PAGE;
+#endif
+		else if (slurm_strcasestr(tmp_str, "node"))
+			sview_config.page_default = NODE_PAGE;
+		xfree(tmp_str);
+	}
+	s_p_get_uint32(&sview_config.grid_hori, "GridHorizontal", hashtbl);
+	s_p_get_boolean(&sview_config.grid_speedup, "GridSpeedup", hashtbl);
+	s_p_get_uint32(&sview_config.grid_vert, "GridVertical", hashtbl);
+	s_p_get_uint32(&sview_config.grid_x_width, "GridXWidth", hashtbl);
+	s_p_get_uint16(&sview_config.refresh_delay, "RefreshDelay", hashtbl);
+	s_p_get_boolean(&sview_config.show_grid, "ShowGrid", hashtbl);
+	s_p_get_boolean(&sview_config.show_hidden, "ShowHidden", hashtbl);
+	if (s_p_get_string(&tmp_str, "TabPosition", hashtbl)) {
+		if (slurm_strcasestr(tmp_str, "top"))
+			sview_config.tab_pos = GTK_POS_TOP;
+		else if (slurm_strcasestr(tmp_str, "bottom"))
+			sview_config.tab_pos = GTK_POS_BOTTOM;
+		else if (slurm_strcasestr(tmp_str, "left"))
+			sview_config.tab_pos = GTK_POS_LEFT;
+		else if (slurm_strcasestr(tmp_str, "right"))
+			sview_config.tab_pos = GTK_POS_RIGHT;
+		xfree(tmp_str);
+	}
+	if (s_p_get_string(&tmp_str, "VisiblePages", hashtbl)) {
+		int i = 0;
+		for(i=0; i<PAGE_CNT; i++)
+			sview_config.page_visible[i] = FALSE;
+
+		if (slurm_strcasestr(tmp_str, "job"))
+			sview_config.page_visible[JOB_PAGE] = 1;
+		if (slurm_strcasestr(tmp_str, "part"))
+			sview_config.page_visible[PART_PAGE] = 1;
+		if (slurm_strcasestr(tmp_str, "res"))
+			sview_config.page_visible[RESV_PAGE] = 1;
+#ifdef HAVE_BG
+		if (slurm_strcasestr(tmp_str, "block"))
+			sview_config.page_visible[BLOCK_PAGE] = 1;
+#endif
+		if (slurm_strcasestr(tmp_str, "node"))
+			sview_config.page_visible[NODE_PAGE] = 1;
+		xfree(tmp_str);
+	}
+	s_p_hashtbl_destroy(hashtbl);
+
+end_it:
+	xfree(pathname);
+	return SLURM_SUCCESS;
+}
+
+extern int save_defaults()
+{
+	char *reg_file = NULL, *old_file = NULL, *new_file = NULL;
+	char *home = getenv("HOME");
+	int rc = SLURM_SUCCESS;
+	char *tmp_str = NULL, *tmp_str2 = NULL;
+	int fd = 0;
+
+	if(!home)
+		return SLURM_ERROR;
+
+	reg_file = xstrdup_printf("%s/.slurm", home);
+	if ((mkdir(reg_file, 0750) < 0) && (errno != EEXIST)) {
+		error("mkdir(%s): %m", reg_file);
+		rc = SLURM_ERROR;
+		goto end_it;
+	}
+	xstrcat(reg_file, "/sviewrc");
+	old_file = xstrdup_printf("%s.old", reg_file);
+	new_file = xstrdup_printf("%s.new", reg_file);
+
+	fd = creat(new_file, 0600);
+	if (fd < 0) {
+		error("Can't save config file %s error %m", reg_file);
+		rc = errno;
+		goto end_it;
+	}
+
+	tmp_str = xstrdup_printf("AdminMode=%s\n",
+				 sview_config.admin_mode ? "YES" : "NO");
+	rc = _write_to_file(fd, tmp_str);
+	xfree(tmp_str);
+	if(rc != SLURM_SUCCESS)
+		goto end_it;
+	tmp_str = xstrdup_printf("DefaultPage=%s\n",
+				 page_to_str(sview_config.page_default));
+	rc = _write_to_file(fd, tmp_str);
+	xfree(tmp_str);
+	if(rc != SLURM_SUCCESS)
+		goto end_it;
+	tmp_str = xstrdup_printf("GridHorizontal=%u\n", sview_config.grid_hori);
+	rc = _write_to_file(fd, tmp_str);
+	xfree(tmp_str);
+	if(rc != SLURM_SUCCESS)
+		goto end_it;
+	tmp_str = xstrdup_printf("GridSpeedup=%s\n",
+				 sview_config.grid_speedup ? "YES" : "NO");
+	rc = _write_to_file(fd, tmp_str);
+	xfree(tmp_str);
+	if(rc != SLURM_SUCCESS)
+		goto end_it;
+	tmp_str = xstrdup_printf("GridVertical=%u\n", sview_config.grid_vert);
+	rc = _write_to_file(fd, tmp_str);
+	xfree(tmp_str);
+	if(rc != SLURM_SUCCESS)
+		goto end_it;
+	tmp_str = xstrdup_printf("GridXWidth=%u\n", sview_config.grid_x_width);
+	rc = _write_to_file(fd, tmp_str);
+	xfree(tmp_str);
+	if(rc != SLURM_SUCCESS)
+		goto end_it;
+	tmp_str = xstrdup_printf("RefreshDelay=%u\n",
+				 sview_config.refresh_delay);
+	rc = _write_to_file(fd, tmp_str);
+	xfree(tmp_str);
+	if(rc != SLURM_SUCCESS)
+		goto end_it;
+	tmp_str = xstrdup_printf("ShowGrid=%s\n",
+				 sview_config.show_grid ? "YES" : "NO");
+	rc = _write_to_file(fd, tmp_str);
+	xfree(tmp_str);
+	if(rc != SLURM_SUCCESS)
+		goto end_it;
+	tmp_str = xstrdup_printf("ShowHidden=%s\n",
+				 sview_config.show_hidden ? "YES" : "NO");
+	rc = _write_to_file(fd, tmp_str);
+	xfree(tmp_str);
+	if(rc != SLURM_SUCCESS)
+		goto end_it;
+	tmp_str = xstrdup_printf("TabPosition=%s\n",
+				 tab_pos_to_str(sview_config.tab_pos));
+	rc = _write_to_file(fd, tmp_str);
+	xfree(tmp_str);
+	if(rc != SLURM_SUCCESS)
+		goto end_it;
+	tmp_str2 = visible_to_str();
+	tmp_str = xstrdup_printf("VisiblePages=%s\n", tmp_str2);
+	xfree(tmp_str2);
+	rc = _write_to_file(fd, tmp_str);
+	xfree(tmp_str);
+	if(rc != SLURM_SUCCESS)
+		goto end_it;
+
+	fsync(fd);
+	close(fd);
+
+end_it:
+	if (rc)
+		(void) unlink(new_file);
+	else {			/* file shuffle */
+		int ign;	/* avoid warning */
+		(void) unlink(old_file);
+		ign =  link(reg_file, old_file);
+		(void) unlink(reg_file);
+		ign =  link(new_file, reg_file);
+		(void) unlink(new_file);
+	}
+
+	xfree(old_file);
+	xfree(new_file);
+	xfree(reg_file);
+	return rc;
+}
diff --git a/src/sview/sview.c b/src/sview/sview.c
index 75e4e10cf09..584ee094cc0 100644
--- a/src/sview/sview.c
+++ b/src/sview/sview.c
@@ -238,8 +238,7 @@ static void _page_switched(GtkNotebook     *notebook,
 		return;
 	else if(!grid_init && !started_grid_init) {
 		/* start the thread to make the grid only once */
-		if (!g_thread_create(_grid_init_thr, notebook, FALSE, &error))
-		{
+		if (!g_thread_create(_grid_init_thr, notebook, FALSE, &error)) {
 			g_printerr ("Failed to create grid init thread: %s\n",
 				    error->message);
 			return;
@@ -247,16 +246,12 @@ static void _page_switched(GtkNotebook     *notebook,
 		started_grid_init = 1;
 	}
 
-	if(page_running != -1) {
+	if(page_running != -1)
 		page_running = page_num;
-	}
 
 	for(i=0; i<PAGE_CNT; i++) {
-		if(main_display_data[i].id == -1)
-			break;
-		else if(!main_display_data[i].show)
-			continue;
-		if(main_display_data[i].extra == page_num)
+		if((main_display_data[i].id == -1)
+		   || (main_display_data[i].extra == page_num))
 			break;
 	}
 
@@ -426,6 +421,7 @@ static gboolean _delete(GtkWidget *widget,
 	fini = 1;
 	gtk_main_quit();
 	ba_fini();
+
 	if(popup_list)
 		list_destroy(popup_list);
 	if(grid_button_list)
@@ -626,15 +622,15 @@ static GtkWidget *_get_menubar_menu(GtkWidget *window, GtkWidget *notebook)
 	GtkToggleActionEntry toggle_entries[] = {
 		{"grid", GTK_STOCK_SELECT_COLOR, "Show _Grid",
 		 "<control>g", "Visual display of cluster",
-		 G_CALLBACK(_set_grid), TRUE},
+		 G_CALLBACK(_set_grid), sview_config.show_grid},
 		{"hidden", GTK_STOCK_SELECT_COLOR, "Show _Hidden",
 		 "<control>h", "Display Hidden Partitions/Jobs",
-		 G_CALLBACK(_set_hidden), FALSE},
+		 G_CALLBACK(_set_hidden), sview_config.show_hidden},
 		{"admin", GTK_STOCK_PREFERENCES,
 		 "_Admin Mode", "<control>a",
 		 "Allows user to change or update information",
 		 G_CALLBACK(_set_admin_mode),
-		 FALSE}
+		 sview_config.admin_mode}
 	};
 
 	/* Make an accelerator group (shortcut keys) */
@@ -643,7 +639,8 @@ static GtkWidget *_get_menubar_menu(GtkWidget *window, GtkWidget *notebook)
 				     G_N_ELEMENTS(entries), window);
 	gtk_action_group_add_radio_actions(menu_action_group, radio_entries,
 					   G_N_ELEMENTS(radio_entries),
-					   0, G_CALLBACK(_tab_pos), notebook);
+					   sview_config.tab_pos,
+					   G_CALLBACK(_tab_pos), notebook);
 	gtk_action_group_add_radio_actions(menu_action_group, debug_entries,
 					   G_N_ELEMENTS(debug_entries),
 					   -1, G_CALLBACK(_set_debug),
@@ -728,25 +725,8 @@ int main(int argc, char *argv[])
 	GtkViewport *view = NULL;
 	int i=0;
 
-	sview_config.refresh_delay = 5;
-	sview_config.grid_x_width = 0;
-	sview_config.grid_hori = 10;
-	sview_config.grid_vert = 10;
-	sview_config.show_hidden = 0;
-	sview_config.admin_mode = FALSE;
-	sview_config.grid_speedup = 0;
-	sview_config.show_grid = TRUE;
-	sview_config.page_default = PART_PAGE;
-	sview_config.tab_pos = GTK_POS_TOP;
-
-	if(getenv("SVIEW_GRID_SPEEDUP"))
-		sview_config.grid_speedup = 1;
-	for(i=0; i<PAGE_CNT; i++) {
-		if(!main_display_data[i].show)
-			sview_config.page_visible[i] = FALSE;
-		else
-			sview_config.page_visible[i] = TRUE;
-	}
+	load_defaults();
+
 	_init_pages();
 	g_thread_init(NULL);
 	gdk_threads_init();
@@ -848,11 +828,23 @@ int main(int argc, char *argv[])
 		else
 			gtk_widget_hide(visible_tab);
 	}
-	/* Set the default page This has to be done after the
+	/* Set the default page.  This has to be done after the
 	 * gtk_widget_show_all since it, for some reason always sets
 	 * 0 to be the default page and will just overwrite this. */
-	gtk_notebook_set_current_page(GTK_NOTEBOOK(main_notebook),
-				      sview_config.page_default);
+	/* Also if we already are set at the current page we need to
+	   start up the page thread, so just call the _page_switched
+	   function.  If we aren't already there, then set the current
+	   page which will inturn call the _page_switched.  If the
+	   pages is already this the signal doesn't happen so handle
+	   it here.
+	*/
+	if(gtk_notebook_get_current_page(GTK_NOTEBOOK(main_notebook))
+	   == sview_config.page_default)
+		_page_switched(GTK_NOTEBOOK(main_notebook), NULL,
+			       sview_config.page_default, NULL);
+	else
+		gtk_notebook_set_current_page(GTK_NOTEBOOK(main_notebook),
+					      sview_config.page_default);
 
 	/* Finished! */
 	gtk_main ();
diff --git a/src/sview/sview.h b/src/sview/sview.h
index 7aff8fe6082..f4eee631337 100644
--- a/src/sview/sview.h
+++ b/src/sview/sview.h
@@ -98,12 +98,12 @@
 
 enum { JOB_PAGE,
        PART_PAGE,
-       NODE_PAGE,
-       BLOCK_PAGE,
        RESV_PAGE,
+       BLOCK_PAGE,
+       NODE_PAGE,
        SUBMIT_PAGE,
-       ADMIN_PAGE,
        INFO_PAGE,
+       ADMIN_PAGE,
        PAGE_CNT
 };
 enum { TAB_CLICKED,
@@ -150,16 +150,16 @@ typedef enum { SEARCH_JOB_ID = 1,
 /* Input parameters */
 typedef struct {
 	bool admin_mode;
-	int grid_hori;
-	int grid_vert;
-	int grid_x_width;
-	int grid_speedup;
-	int page_default;
+	uint32_t grid_hori;
+	bool grid_speedup;
+	uint32_t grid_vert;
+	uint32_t grid_x_width;
+	uint16_t page_default;
 	bool page_visible[PAGE_CNT];
-	int refresh_delay;
-	bool show_hidden;
+	uint16_t refresh_delay;
 	bool show_grid;
-	int tab_pos;
+	bool show_hidden;
+	uint16_t tab_pos;
 } sview_config_t;
 
 typedef struct display_data display_data_t;
@@ -497,4 +497,12 @@ extern void add_display_treestore_line_with_font(
 	char *font);
 extern void sview_widget_modify_bg(GtkWidget *widget, GtkStateType state,
 				   const GdkColor color);
+extern char *page_to_str(int page);
+extern char *tab_pos_to_str(int tab_pos);
+extern char *visible_to_str();
+
+// defaults.c
+extern int load_defaults();
+extern int save_defaults();
+
 #endif
-- 
GitLab