Add Tabs for various features
diff --git a/display.c b/display.c
index bb5fb69..11bf45e 100644
--- a/display.c
+++ b/display.c
@@ -23,6 +23,7 @@
 static WINDOW *regulator_win;
 static WINDOW *clock_win;
 static WINDOW *sensor_win;
+static WINDOW *selected_win;
 static WINDOW *footer_win;
 
 int maxx, maxy;
@@ -33,9 +34,10 @@
 	endwin();
 }
 
-void killall_windows(void)
+/* "all" : Kill header and footer windows too ? */
+void killall_windows(int all)
 {
-	if (header_win) {
+	if (all && header_win) {
 		delwin(header_win);
 		header_win = NULL;
 	}
@@ -51,7 +53,7 @@
 		delwin(sensor_win);
 		sensor_win = NULL;
 	}
-	if (footer_win) {
+	if (all && footer_win) {
 		delwin(footer_win);
 		footer_win = NULL;
 	}
@@ -70,7 +72,8 @@
 
         init_pair(PT_COLOR_DEFAULT, COLOR_WHITE, COLOR_BLACK);
         init_pair(PT_COLOR_ERROR, COLOR_BLACK, COLOR_RED);
-        init_pair(PT_COLOR_HEADER_BAR, COLOR_BLACK, COLOR_WHITE);
+        //init_pair(PT_COLOR_HEADER_BAR, COLOR_BLACK, COLOR_WHITE);
+        init_pair(PT_COLOR_HEADER_BAR, COLOR_BLACK, COLOR_GREEN);
         init_pair(PT_COLOR_YELLOW, COLOR_WHITE, COLOR_YELLOW);
         init_pair(PT_COLOR_GREEN, COLOR_WHITE, COLOR_GREEN);
         init_pair(PT_COLOR_BRIGHT, COLOR_WHITE, COLOR_BLACK);
@@ -85,7 +88,7 @@
 {
 
 	getmaxyx(stdscr, maxy, maxx);
-	killall_windows();
+	killall_windows(1);
 
 	header_win = subwin(stdscr, 1, maxx, 0, 0);
 //	regulator_win = subwin(stdscr, maxy/2 - 2, maxx, 1, 0);
@@ -101,98 +104,59 @@
 
 }
 
-/*
- * maxrows is the MAXIMUM number of rows we need for this window 
- * pshare is the minimum number of rows we should have for this (in %age)
- * maxrows prevails in case of an argument !
- */
-int create_regulator_win(int row, int maxrows, int *pshare)
+void create_selectedwindow(void)
 {
-        int numrows;
-        int idealrows; // Based on pshare provided to us
+        WINDOW *win;
 
-        if (regulator_win) {
-                delwin(regulator_win);
-                regulator_win = NULL;
-        }
+        killall_windows(0);
 
         getmaxyx(stdscr, maxy, maxx);
 
-        idealrows = ((maxy - 2) * (*pshare)) / 100;
-        if (maxrows < idealrows) {
-                numrows = maxrows;
-                *pshare = (numrows * 100) / maxy;
-        } else
-                numrows = idealrows;
-        regulator_win = subwin(stdscr, numrows, maxx, row, 0);
+        win = subwin(stdscr, maxy - 2, maxx, 1, 0);
 
-        refresh();
+        switch (selectedwindow) {
+                case REGULATOR: regulator_win = win;
+                                break;
 
-        return numrows + row;
-}
+                case CLOCK:     clock_win = win;
+                                break;
 
-int create_clock_win(int row, int maxrows, int *pshare)
-{
-        int numrows;
-        int idealrows;
-
-        if (clock_win) {
-                delwin(clock_win);
-                clock_win = NULL;
+                case SENSOR:    sensor_win = win;
+                                break;
         }
 
-        getmaxyx(stdscr, maxy, maxx);
-        idealrows = ((maxy - 2) * (*pshare)) / 100;
-
-        if (maxrows < idealrows)
-                numrows = maxrows;
-        else
-                numrows = idealrows;
-        clock_win = subwin(stdscr, numrows, maxx, row, 0);
-
+        selected_win = win;
+        
         refresh();
-
-        return numrows + row;
-}
-
-int create_sensor_win(int row, int maxrows, int *pshare)
-{
-        int numrows;
-        int idealrows;
-
-        if (sensor_win) {
-                delwin(sensor_win);
-                sensor_win = NULL;
-        }
-
-        getmaxyx(stdscr, maxy, maxx);
-        idealrows = ((maxy - 2) * (*pshare)) / 100;
-
-        if (maxrows < idealrows)
-                numrows = maxrows;
-        else
-                numrows = idealrows;
-        sensor_win = subwin(stdscr, numrows, maxx, row, 0);
-
-        refresh();
-
-        return numrows + row;
 }
 
 void show_header(void)
 {
 	int i, j = 0;
+        //char format[64];
 
 	wattrset(header_win, COLOR_PAIR(PT_COLOR_HEADER_BAR));
 	wbkgd(header_win, COLOR_PAIR(PT_COLOR_HEADER_BAR));
 	werase(header_win);
 
-	print(header_win, 0, 0, "PowerDebug version %s         (C) Linaro",
+	print(header_win, 0, 0, "PowerDebug %s",
 	      VERSION);
-	print(header_win, 50, 0, "Refresh Rate %4.2f Secs",
-	      ticktime);
+	//print(header_win, 50, 0, "Refresh Rate %4.2f Secs", ticktime);
 
-	wrefresh(header_win);
+        for (i = 0; i < TOTAL_FEATURE_WINS; i++) {
+                if (selectedwindow == i)
+		        wattron(header_win, A_REVERSE);
+                else 
+		        wattroff(header_win, A_REVERSE);
+
+                //sprintf(format, " %%-%ds ", sizeof(win_names[i]) + 2);
+                //sprintf(format, " %%s ");
+
+                print(header_win, i*(maxx / TOTAL_FEATURE_WINS) + 20, 0, 
+                        " %s ", win_names[i]);
+        }
+        wrefresh(header_win);
+
 
 	werase(footer_win);
 
@@ -210,21 +174,18 @@
 
 void show_regulator_info(int verbose)
 {
-	int i, count = 2;
+	int i, count = 1;
 
 	werase(regulator_win);
 	wattron(regulator_win, A_BOLD);
-	wattron(regulator_win, A_STANDOUT);
-	print(regulator_win, 0, 0, "Regulator Information");
-	wattroff(regulator_win, A_STANDOUT);
-	print(regulator_win, 0, 1, "Name");
-	print(regulator_win, 12, 1, "Status");
-	print(regulator_win, 24, 1, "State");
-	print(regulator_win, 36, 1, "Type");
-	print(regulator_win, 48, 1, "Users");
-	print(regulator_win, 60, 1, "Microvolts");
-	print(regulator_win, 72, 1, "Min u-volts");
-	print(regulator_win, 84, 1, "Max u-volts");
+	print(regulator_win, 0, 0, "Name");
+	print(regulator_win, 12, 0, "Status");
+	print(regulator_win, 24, 0, "State");
+	print(regulator_win, 36, 0, "Type");
+	print(regulator_win, 48, 0, "Users");
+	print(regulator_win, 60, 0, "Microvolts");
+	print(regulator_win, 72, 0, "Min u-volts");
+	print(regulator_win, 84, 0, "Max u-volts");
 	wattroff(regulator_win, A_BOLD);
 
 	for (i=0; i<numregulators; i++) {
@@ -273,14 +234,10 @@
         sprintf(lev, "(Level %d)\n", level);
         werase(clock_win);
         wattron(clock_win, A_BOLD);
-        wattron(clock_win, A_STANDOUT);
-        print(clock_win, 0, 0, "Clock Information");
-        wattroff(clock_win, A_STANDOUT);
-        print(clock_win, 0, 1, "Name");
-        print(clock_win, 24, 1, "Flags");
-        print(clock_win, 36, 1, "Rate");
-        print(clock_win, 48, 1, "Usecount");
-        print(clock_win, 60, 1, lev);
+        print(clock_win, 0, 0, "Name  %s", lev);
+        print(clock_win, 48, 0, "Flags");
+        print(clock_win, 60, 0, "Rate");
+        print(clock_win, 72, 0, "Usecount");
         wattroff(clock_win, A_BOLD);
 	wrefresh(clock_win);
 }
@@ -289,14 +246,11 @@
 {
         werase(sensor_win);
         wattron(sensor_win, A_BOLD);
-        wattron(sensor_win, A_STANDOUT);
-        print(sensor_win, 0, 0, "Sensor Information");
-        wattroff(sensor_win, A_STANDOUT);
-        print(sensor_win, 0, 1, "Name");
-        print(sensor_win, 36, 1, "Temperature");
+        print(sensor_win, 0, 0, "Name");
+        print(sensor_win, 36, 0, "Temperature");
         wattroff(sensor_win, A_BOLD);
         wattron(sensor_win, A_BLINK);
-        print(sensor_win, 0, 2, "Currently Sensor information available"
+        print(sensor_win, 0, 1, "Currently Sensor information available"
                                   " only in Dump mode!");
         wattroff(sensor_win, A_BLINK);
 	wrefresh(sensor_win);
@@ -317,11 +271,11 @@
         else
                 wattroff(clock_win, WA_REVERSE);
 
-        print(clock_win, 0, line + 2, "%s", clockname); 
+        print(clock_win, 0, line + 1, "%s", clockname); 
         if (strcmp(clockname, "..")) {
-                print(clock_win, 24, line + 2, "%d", flags); 
-                print(clock_win, 36, line + 2, "%d", rate); 
-                print(clock_win, 48, line + 2, "%d", usecount);
+                print(clock_win, 48, line + 1, "%d", flags); 
+                print(clock_win, 60, line + 1, "%d", rate); 
+                print(clock_win, 72, line + 1, "%d", usecount);
         }
 
         if (highlight)
diff --git a/powerdebug.c b/powerdebug.c
index 87e60bc..8c84932 100644
--- a/powerdebug.c
+++ b/powerdebug.c
@@ -20,8 +20,14 @@
 int numregulators;
 int dump;
 int highlighted_row;
+int selectedwindow = -1;
 double ticktime = 10.0;  /* in seconds */
 
+char *win_names[TOTAL_FEATURE_WINS] = {
+        "Regulators",
+        "Clocks",
+        "Sensors" };
+
 int init_regulator_ds(void)
 {
 	DIR *regdir;
@@ -228,17 +234,20 @@
 
 int main(int argc, char **argv)
 {
-	int c;
-	int firsttime = 1;
+	int c, i;
+	int firsttime[TOTAL_FEATURE_WINS];
         int enter_hit = 0;
 	int regulators = 0, sensors = 0, clocks = 0, verbose = 0;
         int r_share = 0, s_share = 0, c_share = 0; //%age share of the win size
 
+        for (i = 0; i < TOTAL_FEATURE_WINS; i++)
+                firsttime[i] = 1;
+
 	/*
 	 * Options:
-	 * -r, --regulator	: regulator
-	 * -s, --sensor		: sensors
-	 * -c, --clock		: clocks
+         * -r, --regulator      : regulator
+         * -s, --sensor         : sensors
+         * -c, --clock          : clocks
 	 * -t, --time		: ticktime
 	 * -d, --dump		: dump
 	 * -v, --verbose	: verbose
@@ -250,9 +259,9 @@
 	while (1) {
 		int optindex = 0;
 		static struct option long_options[] = {
-			{"regulator", 0, 0, 'r'},
-			{"sensor", 0, 0, 's'},
-			{"clock", 0, 0, 'c'},
+                        {"regulator", 0, 0, 'r'},
+                        {"sensor", 0, 0, 's'},
+                        {"clock", 0, 0, 'c'},
 			{"time", 0, 0, 't'},
 			{"dump", 0, 0, 'd'},
 			{"verbose", 0, 0, 'v'},
@@ -266,15 +275,18 @@
 			break;
 
 		switch (c) {
-			case 'r':
-				regulators = 1;
-				break;
-			case 's':
-				sensors = 1;
-				break;
-			case 'c':
-				clocks = 1;
-				break;
+                        case 'r':
+                                regulators = 1;
+                                selectedwindow = REGULATOR;
+                                break;
+                        case 's':
+                                sensors = 1;
+                                selectedwindow = SENSOR;
+                                break;
+                        case 'c':
+                                clocks = 1;
+                                selectedwindow = CLOCK;
+                                break;
 			case 't':
                                 ticktime = strtod(optarg, NULL);
 				break;
@@ -300,11 +312,13 @@
 		}
 	}
 
+        if (!dump && (regulators || clocks || sensors)) {
+                fprintf(stderr, "Option supported only in dump mode (-d)\n");
+                usage(argv);
+        } 
 
-	/* Need atleast one option specified */
-	if (!regulators && !sensors && !clocks) {
-		usage(argv);
-	}
+        if (!dump)
+                selectedwindow = REGULATOR;
 
 	init_regulator_ds();
 
@@ -312,10 +326,9 @@
 		int key = 0;
 		struct timeval tval;
 		fd_set readfds;
-                int row = 1;
 
 		if (!dump) {
-			if(firsttime)
+			if(firsttime[0])
 				init_curses();
 			create_windows();
 			show_header();
@@ -332,29 +345,25 @@
                         c_share = 100 - (r_share + s_share);
 		}
 	
-		if (regulators) {
+		if (selectedwindow == REGULATOR) {
 			read_regulator_info();
 			if (!dump) {
-                                int orig_r_share = r_share;
-
-                                row = create_regulator_win(row,
-                                                           numregulators + 2,
-                                                           &r_share);
-                                c_share += (orig_r_share - r_share);
+                                create_selectedwindow();
 				show_regulator_info(verbose);
                         }
 			else
 				print_regulator_info(verbose);
 		}
 
-                if (clocks) {
-                        if (firsttime)
+                if (selectedwindow == CLOCK) {
+                        if (firsttime[CLOCK]) {
                                 init_clock_details();
+                                firsttime[CLOCK] = 0;
+                        }
                         if (!dump) {
                                 int hrow;
 
-                                //giv big no. in second arg as of now
-                                row = create_clock_win(row, 100, &c_share);
+                                create_selectedwindow();
                                 hrow = read_and_print_clock_info(verbose,
                                                                 highlighted_row,
                                                                 enter_hit);
@@ -364,9 +373,9 @@
                                 dump_clock_info(verbose);
                 }
 
-		if (sensors) {
+		if (selectedwindow == SENSOR) {
                         if (!dump) {
-                                row = create_sensor_win(row, 100, &s_share);//big no. as of now
+                                create_selectedwindow();
                                 print_sensor_header();
                         }
                         else
@@ -386,14 +395,36 @@
 		if (key)  {
 			char keychar;
 
-			int keystroke = fgetc(stdin);
+			//int keystroke = fgetc(stdin);
+			int keystroke = getch();
 			if (keystroke == EOF)
 				exit(0);
 
-                        if (keystroke == 9)
-                                highlighted_row++;
+                        if (keystroke == KEY_RIGHT || keystroke == 9)
+                                selectedwindow++;
+
+                        if (keystroke == KEY_LEFT || keystroke == 353)
+                                selectedwindow--;
+
+                        if (selectedwindow >= TOTAL_FEATURE_WINS)
+                                selectedwindow = 0;
+
+                        if (selectedwindow < 0)
+                                selectedwindow = TOTAL_FEATURE_WINS - 1;
+
+                        if (selectedwindow == CLOCK) {
+                                if (keystroke == KEY_DOWN)
+                                        highlighted_row++;
+                                if (keystroke == KEY_UP && highlighted_row > 0)
+                                        highlighted_row--;
+                        }
 
 			keychar = toupper(keystroke);
+
+                        //killall_windows(1); fini_curses();
+                        //printf("key entered %d:%c\n", keystroke, keychar);
+                        //exit(1);
+
                         if (keystroke == 13)
                                 enter_hit = 1;
 
@@ -402,8 +433,6 @@
 			if (keychar == 'R')
 				ticktime = 3;
 		}
-                if (firsttime)
-                        firsttime = 0;
 	}
 
 	exit(0);
diff --git a/powerdebug.h b/powerdebug.h
index 6b7f665..6ce68cd 100644
--- a/powerdebug.h
+++ b/powerdebug.h
@@ -26,6 +26,13 @@
 #define VERSION "1.0"
 
 #define VALUE_MAX 16
+#define TOTAL_FEATURE_WINS 3  /* Regulator, Clock and Sensor (for now) */
+
+WINDOW windows[TOTAL_FEATURE_WINS];
+extern char *win_names[TOTAL_FEATURE_WINS];
+
+enum {REGULATOR, CLOCK, SENSOR};
+extern int selectedwindow;
 
 struct regulator_info {
 	char name[NAME_MAX];
@@ -82,10 +89,8 @@
 
 extern void init_curses(void);
 extern void fini_curses(void);
-extern void killall_windows(void);
+extern void killall_windows(int all);
 extern void show_header(void);
 extern void create_windows(void);
-extern int  create_regulator_win(int row, int numrows, int *pshare);
-extern int  create_clock_win(int row, int numrows, int *pshare);
-extern int  create_sensor_win(int row, int numrows, int *pshare);
+extern void create_selectedwindow(void);
 extern void show_regulator_info(int verbose);