summaryrefslogtreecommitdiffstats
path: root/src/display.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/display.cpp342
1 files changed, 342 insertions, 0 deletions
diff --git a/src/display.cpp b/src/display.cpp
new file mode 100644
index 0000000..cc03919
--- /dev/null
+++ b/src/display.cpp
@@ -0,0 +1,342 @@
+/*
+ * Copyright 2010, Intel Corporation
+ *
+ * This file is part of PowerTOP
+ *
+ * This program file 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; version 2 of the License.
+ *
+ * This program 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 this program in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc,
+ * 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ * or just google for it.
+ *
+ * Authors:
+ * Arjan van de Ven <arjan@linux.intel.com>
+ */
+#include "display.h"
+#include "lib.h"
+
+#include <ncurses.h>
+
+
+#include <vector>
+#include <map>
+#include <string>
+#include <string.h>
+
+using namespace std;
+
+static int display = 0;
+
+vector<string> tab_names;
+map<string, class tab_window *> tab_windows;
+map<string, string> tab_translations;
+
+map<string, string> bottom_lines;
+
+void create_tab(const string &name, const string &translation, class tab_window *w, string bottom_line)
+{
+ if (!w)
+ w = new(class tab_window);
+
+ w->win = newpad(1000,1000);
+ tab_names.push_back(name);
+ tab_windows[name] = w;
+ tab_translations[name] = translation;
+ bottom_lines[name] = bottom_line;
+}
+
+
+void init_display(void)
+{
+ initscr();
+ start_color();
+
+ cbreak(); /* character at a time input */
+ noecho(); /* don't show the user input */
+ keypad(stdscr, TRUE); /* enable cursor/etc keys */
+
+ use_default_colors();
+
+ create_tab("Overview", _("Overview"));
+ create_tab("Idle stats", _("Idle stats"));
+ create_tab("Frequency stats", _("Frequency stats"));
+ create_tab("Device stats", _("Device stats"));
+
+ display = 1;
+}
+
+void reset_display(void)
+{
+ if (!display)
+ return;
+
+ keypad(stdscr, FALSE);
+ echo();
+ nocbreak();
+
+ resetterm();
+}
+
+
+WINDOW *tab_bar = NULL;
+WINDOW *bottom_line = NULL;
+
+static int current_tab;
+
+void show_tab(unsigned int tab)
+{
+ class tab_window *win;
+ unsigned int i;
+ int tab_pos = 17;
+ const char *c;
+
+ if (!display)
+ return;
+
+ if (tab_bar) {
+ delwin(tab_bar);
+ tab_bar = NULL;
+ }
+
+ if (bottom_line) {
+ delwin(bottom_line);
+ bottom_line = NULL;
+ }
+
+ tab_bar = newwin(1, 0, 0, 0);
+
+ wattrset(tab_bar, A_REVERSE);
+ mvwprintw(tab_bar, 0,0, "%120s", "");
+ mvwprintw(tab_bar, 0,0, "PowerTOP %s", PACKAGE_VERSION);
+
+ bottom_line = newwin(1, 0, LINES-1, 0);
+ wattrset(bottom_line, A_REVERSE);
+ mvwprintw(bottom_line, 0,0, "%120s", "");
+
+ c = bottom_lines[tab_names[tab]].c_str();
+ if (c && strlen(c) > 0)
+ mvwprintw(bottom_line, 0,0, "%s", c);
+ else
+ mvwprintw(bottom_line, 0, 0,
+ "<ESC> %s | <TAB> / <Shift + TAB> %s | ", _("Exit"),
+ _("Navigate"));
+
+
+ current_tab = tab;
+
+ for (i = 0; i < tab_names.size(); i++) {
+ if (i == tab)
+ wattrset(tab_bar, A_NORMAL);
+ else
+ wattrset(tab_bar, A_REVERSE);
+ mvwprintw(tab_bar, 0, tab_pos, " %s ", tab_translations[tab_names[i]].c_str());
+
+ tab_pos += 3 + tab_names[i].length();
+ }
+
+ wrefresh(tab_bar);
+ wrefresh(bottom_line);
+
+ win = tab_windows[tab_names[tab]];
+ if (!win)
+ return;
+
+ prefresh(win->win, win->ypad_pos, win->xpad_pos, 1, 0, LINES - 3, COLS - 1);
+}
+
+WINDOW *get_ncurses_win(const char *name)
+{
+ class tab_window *w;
+ WINDOW *win;
+
+ w= tab_windows[name];
+ if (!w)
+ return NULL;
+
+ win = w->win;
+
+ return win;
+}
+
+WINDOW *get_ncurses_win(int nr)
+{
+ class tab_window *w;
+ WINDOW *win;
+
+ w= tab_windows[tab_names[nr]];
+ if (!w)
+ return NULL;
+
+ win = w->win;
+
+ return win;
+}
+
+WINDOW *get_ncurses_win(const string &name)
+{
+ return get_ncurses_win(name.c_str());
+}
+
+void show_prev_tab(void)
+{
+ class tab_window *w;
+
+ if (!display)
+ return;
+ w = tab_windows[tab_names[current_tab]];
+ if (w)
+ w->hide();
+
+ current_tab --;
+ if (current_tab < 0)
+ current_tab = tab_names.size() - 1;
+
+ w = tab_windows[tab_names[current_tab]];
+ if (w)
+ w->expose();
+
+ show_tab(current_tab);
+}
+
+void show_next_tab(void)
+{
+ class tab_window *w;
+
+ if (!display)
+ return;
+
+ w = tab_windows[tab_names[current_tab]];
+ if (w)
+ w->hide();
+
+ current_tab ++;
+ if (current_tab >= (int)tab_names.size())
+ current_tab = 0;
+
+ w = tab_windows[tab_names[current_tab]];
+ if (w)
+ w->expose();
+
+ show_tab(current_tab);
+}
+
+void show_cur_tab(void)
+{
+ if (!display)
+ return;
+ show_tab(current_tab);
+}
+
+void cursor_down(void)
+{
+ class tab_window *w;
+
+ w = tab_windows[tab_names[current_tab]];
+ if (w) {
+ if (w->ypad_pos < 1000) {
+ if (tab_names[current_tab] == "Tunables" || tab_names[current_tab] == "WakeUp") {
+ if ((w->cursor_pos + 7) >= LINES) {
+ prefresh(w->win, ++w->ypad_pos, w->xpad_pos,
+ 1, 0, LINES - 3, COLS - 1);
+ }
+ w->cursor_down();
+ } else {
+ prefresh(w->win, ++w->ypad_pos, w->xpad_pos,
+ 1, 0, LINES - 3, COLS - 1);
+ }
+ }
+ }
+
+ show_cur_tab();
+}
+
+void cursor_up(void)
+{
+ class tab_window *w;
+
+ w = tab_windows[tab_names[current_tab]];
+
+ if (w) {
+ w->cursor_up();
+ if(w->ypad_pos > 0) {
+ prefresh(w->win, --w->ypad_pos, w->xpad_pos,
+ 1, 0, LINES - 3, COLS - 1);
+ }
+ }
+
+ show_cur_tab();
+}
+
+void cursor_left(void)
+{
+ class tab_window *w;
+
+ w = tab_windows[tab_names[current_tab]];
+
+ if (w) {
+ if (w->xpad_pos > 0) {
+ prefresh(w->win, w->ypad_pos,--w->xpad_pos,
+ 1, 0, LINES - 3, COLS - 1);
+ }
+ }
+}
+
+void cursor_right(void)
+{
+ class tab_window *w;
+
+ w = tab_windows[tab_names[current_tab]];
+
+ if (w) {
+ if (w->xpad_pos < 1000) {
+ prefresh(w->win, w->ypad_pos, ++w->xpad_pos,
+ 1, 0, LINES - 3, COLS - 1);
+ }
+ }
+}
+
+void cursor_enter(void)
+{
+ class tab_window *w;
+
+ w = tab_windows[tab_names[current_tab]];
+
+ if (w) {
+ w->cursor_enter();
+ w->repaint();
+ }
+ show_cur_tab();
+}
+
+void window_refresh()
+{
+ class tab_window *w;
+
+ w = tab_windows[tab_names[current_tab]];
+
+ if (w) {
+ w->ypad_pos = 0;
+ w->xpad_pos = 0;
+ w->window_refresh();
+ w->repaint();
+ }
+
+ show_cur_tab();
+}
+
+int ncurses_initialized(void)
+{
+ if (display)
+ return 1;
+ return 0;
+}