diff options
| author | Paul Buetow <paul@buetow.org> | 2010-11-21 17:01:59 +0000 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2010-11-21 17:01:59 +0000 |
| commit | b891420946d5269cc326d67555c6aab3db41a01a (patch) | |
| tree | f6c5e7d6dbf18ec8c0ea9ec0b037251df46b4cbb /ycurses/src/curses | |
| parent | a537e8323d932125232c305f9573daef89aef0df (diff) | |
added yhttpd and ycurses trunk versions
Diffstat (limited to 'ycurses/src/curses')
25 files changed, 1511 insertions, 0 deletions
diff --git a/ycurses/src/curses/attributes.cpp b/ycurses/src/curses/attributes.cpp new file mode 100644 index 0000000..b859da0 --- /dev/null +++ b/ycurses/src/curses/attributes.cpp @@ -0,0 +1,80 @@ +#ifndef ATTRIBUTES_CPP +#define ATTRIBUTES_CPP + +#include "attributes.h" + +attributes::attributes() +{ + init(); +} + +attributes::attributes(int i_attr) +{ + init(); + set(true, i_attr); +} + +attributes::attributes(color& r_color) +{ + init(); + set_color(r_color); +} + +void +attributes::init() +{ + p_color = 0; +} + +void +attributes::use_wattron(WINDOW* p_window) +{ + std::set<int>::iterator iter; + for (iter = set_attr.begin(); iter != set_attr.end(); ++iter) + wattron(p_window, *iter); + + if (p_color) + wattron(p_window, COLOR_PAIR(p_color->get_num())); +} + +void +attributes::use_wattroff(WINDOW* p_window) +{ + std::set<int>::iterator iter; + for (iter = set_attr.begin(); iter != set_attr.end(); ++iter) + wattroff(p_window, *iter); + + if (p_color) + wattroff(p_window, COLOR_PAIR(p_color->get_num())); +} + + +void +attributes::unset_all() +{ + set_attr.clear(); + p_color = 0; +} + +bool +attributes::get(int i_attr) +{ + return set_attr.find(i_attr) != set_attr.end(); +} + +void +attributes::set(bool b, int i_attr) +{ + if ((set_attr.find(i_attr) != set_attr.end() ) == b) + return; + + set_attr.insert(i_attr); +} + +void +attributes::set_color(color& r_color) +{ + this->p_color = &r_color; +} + +#endif diff --git a/ycurses/src/curses/attributes.h b/ycurses/src/curses/attributes.h new file mode 100644 index 0000000..2bc58d6 --- /dev/null +++ b/ycurses/src/curses/attributes.h @@ -0,0 +1,70 @@ +#ifndef ATTRIBUTES_H +#define ATTRIBUTES_H + +#include <set> +#include "incl.h" +#include "color.h" + +using namespace std; + +const int Normal = A_NORMAL; +const int Standout = A_STANDOUT; +const int Underline = A_UNDERLINE; +const int Reverse = A_REVERSE; +const int Blink = A_BLINK; +const int Dim = A_DIM; +const int Bold = A_BOLD; +const int Protect = A_PROTECT; +const int Invis = A_INVIS; +const int AltCharSet = A_ALTCHARSET; +const int CharText = A_CHARTEXT; + +class attributes +{ +private: + void init(); + set<int> set_attr; + bool get(int i_attr); + void set(bool b, int i_attr); + color* p_color; + + friend class window; + void use_wattron(WINDOW* p_window); + void use_wattroff(WINDOW* p_window); + +public: + attributes(); + attributes(int i_attr); + attributes(color& r_color); + + void set(int i_attr) { set(true, i_attr); } + void unset(int i_attr ) { set(false, i_attr); } + void unset_all(); + void set_color(color& r_color); + + void set_normal(bool b) { set(b, Normal); } + void set_standout(bool b) { set(b, Standout); } + void set_underline(bool b) { set(b, Underline); } + void set_reverse(bool b) { set(b, Reverse); } + void set_blink(bool b) { set(b, Blink); } + void set_dim(bool b) { set(b, Dim); } + void set_bold(bool b) { set(b, Bold); } + void set_protect(bool b) { set(b, Protect); } + void set_invisible(bool b) { set(b, Invis); } + void set_altcharset(bool b) { set(b, AltCharSet); } + void set_chartext(bool b) { set(b, CharText); } + + bool get_normal() { return get(Normal); } + bool get_standout() { return get(Standout); } + bool get_underline() { return get(Underline); } + bool get_reverse() { return get(Reverse); } + bool get_blink() { return get(Blink); } + bool get_dim() { return get(Dim); } + bool get_bold() { return get(Bold); } + bool get_protect() { return get(Protect); } + bool get_invisible() { return get(Invis); } + bool get_altcharset() { return get(AltCharSet); } + bool get_chartext() { return get(CharText); } +}; + +#endif diff --git a/ycurses/src/curses/color.cpp b/ycurses/src/curses/color.cpp new file mode 100644 index 0000000..190d343 --- /dev/null +++ b/ycurses/src/curses/color.cpp @@ -0,0 +1,54 @@ +#ifndef COLOR_CPP +#define COLOR_CPP + +#include "color.h" + +bool color::b_activated = false; +int color::i_pair_count = 0; + +color::color(short i, short j) + : i_foreground(i), i_background(j) +{ + init(); + + i_pair = ++i_pair_count; + + /* + * Simple color assignment. color pair 0 cannot + * be redefined. + */ + init_pair(i_pair, i_foreground, i_background); +} + +color::~color() +{ +} + +void +color::init() +{ + if ( !b_activated ) + { + if (has_colors()) + { + start_color(); + b_activated = true; + } + } +} + +void +color::enable() +{ + attron(COLOR_PAIR(i_pair)); +} + +void +color::disable() +{ + attroff(COLOR_PAIR(i_pair)); +} + + +#endif + diff --git a/ycurses/src/curses/color.h b/ycurses/src/curses/color.h new file mode 100644 index 0000000..a59727c --- /dev/null +++ b/ycurses/src/curses/color.h @@ -0,0 +1,39 @@ + +#ifndef COLOR_H +#define COLOR_H + +#include "incl.h" + +using namespace std; + +const short Red = COLOR_RED; +const short Green = COLOR_GREEN; +const short Yellow = COLOR_YELLOW; +const short Blue = COLOR_BLUE; +const short Cyan = COLOR_CYAN; +const short Magenta = COLOR_MAGENTA; +const short White = COLOR_WHITE; +const short Black = COLOR_BLACK; + +class color +{ + private: + void init(); + + static int i_pair_count; + short i_pair; + short i_foreground; + short i_background; + static bool b_activated; + + friend class curses; + + public: + color(short i, short j); + ~color(); + void enable(); + void disable(); + short get_num() { return i_pair; } +}; + +#endif diff --git a/ycurses/src/curses/coordinate.cpp b/ycurses/src/curses/coordinate.cpp new file mode 100644 index 0000000..efdf9e2 --- /dev/null +++ b/ycurses/src/curses/coordinate.cpp @@ -0,0 +1,134 @@ +#ifndef COORDONATE_CPP +#define COORDONATE_CPP + +#include "coordinate.h" + +coordinate::coordinate() +{ + y = x = 0; +} + +coordinate::coordinate(coordinate_type type, dummy_window& r_win) +{ + set(type, r_win); +} + +coordinate::coordinate(coordinate_type type) +{ + set(type); +} + +coordinate::coordinate(int y, int x) +{ + this->y = y; + this->x = x; +} + +coordinate& +coordinate::set(coordinate_type type, dummy_window& r_win) +{ + switch (type) + { + case Absolutecoord: + getyx(r_win.get_WINDOW(), y, x); + break; + + case Relativecoord: + getparyx(r_win.get_WINDOW(), y, x); + break; + + case Beginningcoord: + getbegyx(r_win.get_WINDOW(), y, x); + break; + + case windowSize: + getmaxyx(r_win.get_WINDOW(), y, x); + break; + + default: + set(type); + } + + return *this; +} + +coordinate& +coordinate::set(coordinate_type type) +{ + switch (type) + { + case TerminalSize: + y = COLS; + x = LINES; + break; + + case TerminalCenter: + y = static_cast<int>(COLS / 2); + x = static_cast<int>(LINES / 2); + break; + } + + return *this; +} + +coordinate& +coordinate::left() +{ + return left(1); +} + +coordinate& +coordinate::right() +{ + return right(1); +} + +coordinate& +coordinate::up() +{ + return up(1); +} + +coordinate& +coordinate::down() +{ + return down(1); +} + +coordinate& +coordinate::left(int i) +{ + x -= i; + return *this; +} + +coordinate& +coordinate::right(int i) +{ + x += i; + return *this; +} + +coordinate& +coordinate::up(int i) +{ + y -= i; + return *this; +} + +coordinate& +coordinate::down(int i) +{ + y += i; + return *this; +} + +coordinate& +coordinate::displace(int i_y, int i_x) +{ + y += i_y; + x += i_x; + return *this; +} + +#endif diff --git a/ycurses/src/curses/coordinate.h b/ycurses/src/curses/coordinate.h new file mode 100644 index 0000000..c17b36b --- /dev/null +++ b/ycurses/src/curses/coordinate.h @@ -0,0 +1,43 @@ +#ifndef COORDINATE_H +#define COORDINATE_H + +#include "incl.h" +#include "dummy.h" + +using namespace std; + +enum coordinate_type +{ + Absolutecoord, + Relativecoord, + Beginningcoord, + windowSize, + TerminalSize, + TerminalCenter +}; + + +struct coordinate +{ + int y, x; + + coordinate(); + coordinate(coordinate_type type, dummy_window& r_win); + coordinate(coordinate_type type); + coordinate(int y, int x); + + coordinate& set(coordinate_type type, dummy_window& r_win); + coordinate& set(coordinate_type type); + coordinate& left(); + coordinate& right(); + coordinate& up(); + coordinate& down(); + coordinate& left(int i); + coordinate& right(int i); + coordinate& up(int i); + coordinate& down(int i); + coordinate& displace(int i_y, int i_x); + +}; + +#endif diff --git a/ycurses/src/curses/coordinate.impl b/ycurses/src/curses/coordinate.impl new file mode 100644 index 0000000..8bdf17c --- /dev/null +++ b/ycurses/src/curses/coordinate.impl @@ -0,0 +1,17 @@ +template<class T> +coordinate +create_coordinate(dummy_window& d_window) +{ + coordinate coord; + T(d_window, coord.x, coord.y); + return coord; +} + +template<class T> +coordinate +create_coordinate() +{ + coordinate coord; + T(coord.x, coord.y); + return coord; +} diff --git a/ycurses/src/curses/curses.cpp b/ycurses/src/curses/curses.cpp new file mode 100644 index 0000000..3605e59 --- /dev/null +++ b/ycurses/src/curses/curses.cpp @@ -0,0 +1,86 @@ +#ifndef CURSES_CPP +#define CURSES_CPP + +#include "curses.h" + +int curses::i_self_counter = 0; + +curses::curses() +{ + if ( ++i_self_counter == 1 ) + { + initscr(); + raw(); + keypad(stdscr, TRUE); + noecho(); + } +} + +curses::~curses() +{ + if ( --i_self_counter == 0 ) + { +/* + Factory<attributes>::destroyAll(); + Factory<color>::destroyAll(); + Factory<window>::destroyAll(); + Factory<menu>::destroyAll(); + Factory<pwindow>::destroyAll(); + */ + clear(); + endwin(); + } +} + +void +curses::finish() +{ +} + +int +curses::get_char() +{ + return getch(); +} + +string +curses::get_string() +{ + char c[1024]; + getstr(c); + return string(c); +} + +void +curses::pause() +{ + getch(); +} + +void +curses::disable() +{ + refresh(); + def_prog_mode(); + endwin(); +} + +void +curses::enable() +{ + reset_prog_mode(); + refresh(); +} + +void +curses::clear() +{ + coordinate coord(LINES, COLS); + for ( int i = 0; i < coord.y; ++i ) + for ( int j = 0; j < coord.x; ++j ) + mvaddch(i, j, ' '); + + refresh(); +} + +#endif diff --git a/ycurses/src/curses/curses.h b/ycurses/src/curses/curses.h new file mode 100644 index 0000000..04ed707 --- /dev/null +++ b/ycurses/src/curses/curses.h @@ -0,0 +1,55 @@ +#ifndef CURSES_H +#define CURSES_H + +#include "attributes.h" +#include "incl.h" +#include "color.h" +#include "cursor.h" +#include "menu.h" +#include "pwindow.h" +#include "tool.h" +#include "window.h" +#include "coordinate.h" + +using namespace std; + +/* This class is representing the base of curses, it has to be instantiated + * in order to use curses. + */ +class curses +{ + private: + static int i_self_counter; + + public: + /* Initializes curses before its first use */ + curses(); + + /* Removes all curses elements, all objects (such as window, color etc) + * be finished as well! + */ + ~curses(); + + /* Waits for user intput and returns the ASCII code being typed */ + static int get_char(); + + /* Returns the string being typed until the first return */ + static string get_string(); + + /* Waits intil the user hits a key */ + static void pause(); + + static void disable(); + static void enable(); + + /* Removes all curses elements, all objects (such as window, color etc) will + * be finished as well! This method will be called by ~curses internally. + * You can also use this method instead of the destructor if you wanna use + * another shutdown routine like catching SIGINT first, deleting your own + * stuff, and then running curses::finish();! + */ + static void finish(); + static void clear(); +}; + +#endif diff --git a/ycurses/src/curses/cursor.cpp b/ycurses/src/curses/cursor.cpp new file mode 100644 index 0000000..eaa10a7 --- /dev/null +++ b/ycurses/src/curses/cursor.cpp @@ -0,0 +1,32 @@ +#ifndef CURSOR_CPP +#define CURSOR_CPP + +#include "cursor.h" + +cursor::cursor() +{ +} + +cursor::cursor(cursorType t) +{ + set(t); +} + +cursor::cursor(coordinate& r_coord) +{ + set(r_coord); +} + +void +cursor::set(cursorType t) +{ + curs_set(t); +} + +void +cursor::set(coordinate& r_coord) +{ + move(r_coord.y, r_coord.x); +} + +#endif diff --git a/ycurses/src/curses/cursor.h b/ycurses/src/curses/cursor.h new file mode 100644 index 0000000..504a44c --- /dev/null +++ b/ycurses/src/curses/cursor.h @@ -0,0 +1,30 @@ +#ifndef CURSOR_H +#define CURSOR_H + +#include "incl.h" +#include "coordinate.h" + +using namespace std; + +enum cursorType +{ + Invisible = 0, + Visible, + VeryVisible +}; + +struct cursor +{ + cursor(); + cursor(cursorType t); + cursor(coordinate& r_coord); + + static void set(cursorType t); + static void set(coordinate& r_coord); + + static void set_invisible() { set(Invisible); } + static void setVisible() { set(Visible); } + static void setVeryVisible() { set(VeryVisible); } +}; + +#endif diff --git a/ycurses/src/curses/dummy.cpp b/ycurses/src/curses/dummy.cpp new file mode 100644 index 0000000..eab2b13 --- /dev/null +++ b/ycurses/src/curses/dummy.cpp @@ -0,0 +1,11 @@ +#ifndef DUMMY_CPP +#define DUMMY_CPP + +#include "dummy.h" + +WINDOW* dummy_window::get_WINDOW() +{ + return 0; +} + +#endif diff --git a/ycurses/src/curses/dummy.h b/ycurses/src/curses/dummy.h new file mode 100644 index 0000000..d691e1c --- /dev/null +++ b/ycurses/src/curses/dummy.h @@ -0,0 +1,11 @@ +#ifndef DUMMY_H +#define DUMMY_H + +#include "incl.h" + +struct dummy_window +{ + virtual WINDOW* get_WINDOW(); +}; + +#endif diff --git a/ycurses/src/curses/hidden.cpp b/ycurses/src/curses/hidden.cpp new file mode 100644 index 0000000..9f9b39f --- /dev/null +++ b/ycurses/src/curses/hidden.cpp @@ -0,0 +1,29 @@ +#ifndef HIDDEN_CPP +#define HIDDEN_CPP + +#include "hidden.h" + +hidden::hidden() +{ + show(); +} + +void +hidden::hide() +{ + b_hidden = true; +} + +void +hidden::show() +{ + b_hidden = false; +} + +bool +hidden::is_hidden() +{ + return b_hidden; +} + +#endif diff --git a/ycurses/src/curses/hidden.h b/ycurses/src/curses/hidden.h new file mode 100644 index 0000000..f0f632a --- /dev/null +++ b/ycurses/src/curses/hidden.h @@ -0,0 +1,21 @@ +#ifndef HIDDEN_H +#define HIDDEN_H + +#include "incl.h" + +using namespace std; + +class hidden +{ + private: + bool b_hidden; + + public: + hidden(); + virtual void hide(); + virtual void show(); + bool is_hidden(); +}; + +#endif + diff --git a/ycurses/src/curses/incl.h b/ycurses/src/curses/incl.h new file mode 100644 index 0000000..b31d1ff --- /dev/null +++ b/ycurses/src/curses/incl.h @@ -0,0 +1,8 @@ +#include <iostream> +#include <map> +#include <string> +#include <vector> + +#include <ncurses.h> +#include <menu.h> +#include <panel.h> diff --git a/ycurses/src/curses/menu.cpp b/ycurses/src/curses/menu.cpp new file mode 100644 index 0000000..e240566 --- /dev/null +++ b/ycurses/src/curses/menu.cpp @@ -0,0 +1,117 @@ +#ifndef MENU_CPP +#define MENU_CPP + +#include "menu.h" + +menu::menu(vector<string>& vec_choices) +{ + init(vec_choices); +} + +menu::~menu() +{ + if (p_items) + { + for (int i = 0; i < i_choices; ++i) + free_item(p_items[i]); + + delete [] p_items; + p_items = 0; + } + + if (p_menu) + { + free_menu(p_menu); + p_menu = 0; + } + + if (p_win) + { + delete p_win; + p_win = 0; + } +} + +void +menu::init(vector<string>& vec_choices) +{ + i_choices = vec_choices.size(); + i_current = 0; + + int i_choices = vec_choices.size(); + int iMaxLen = 0; + p_items = new ITEM*[i_choices]; + + for (int i = 0; i < i_choices; ++i) + { + p_items[i] = new_item(vec_choices.at(i).c_str(), ""); + int iLen = vec_choices.at(i).length(); + if (iLen > iMaxLen) + iMaxLen = iLen; + } + + p_menu = new_menu(p_items); + + p_win = new window(i_choices+2, iMaxLen+4, 4, 4); + WINDOW* p_window = p_win->get_WINDOW(); + + set_menu_win(p_menu, p_window); + set_menu_sub(p_menu, derwin(p_window, i_choices, iMaxLen+2, 1, 1)); + + refresh(); + post_menu(p_menu); + wrefresh(p_window); +} + +window& +menu::get_window() +{ + return *p_win; +} + +int +menu::run() +{ + WINDOW* p_window = p_win->get_WINDOW(); + keypad(p_window, 1); + int i_choice; + + while( (i_choice = wgetch(p_window)) ) + { + switch(i_choice) + { + case KEY_DOWN: + case 'j': // Vi mode + if ( i_current < i_choices-1 ) + ++i_current; + menu_driver(p_menu, REQ_DOWN_ITEM); + break; + + case KEY_UP: + case 'k': // Vi mode + if ( i_current > 0 ) + --i_current; + menu_driver(p_menu, REQ_UP_ITEM); + break; + + case 'h': // Vi mode + case 'q': // Vi mode + case 27: // ESC + i_current = i_choices-1; // Select last entry. + + case 'l': // Vi mode + case 10: // Enter + case 32: // Space + keypad(p_window, 0); + return i_current; + } + +// window win_root(root); +// win_root.print(i_choice); + + wrefresh(p_window); + } +} + +#endif + diff --git a/ycurses/src/curses/menu.h b/ycurses/src/curses/menu.h new file mode 100644 index 0000000..3b672c3 --- /dev/null +++ b/ycurses/src/curses/menu.h @@ -0,0 +1,28 @@ +#ifndef MENU_H +#define MENU_H + +#include "incl.h" +#include "window.h" + +using namespace std; + +class menu +{ + private: + void init(vector<string>& vec_choices); + + int i_choices, i_current; + ITEM** p_items; + MENU* p_menu; + window* p_win; + + public: + menu(vector<string>& vec_choices); + menu(string s_name, vector<string>& vec_choices); + ~menu(); + + window& get_window(); + int run(); +}; + +#endif diff --git a/ycurses/src/curses/pwindow.cpp b/ycurses/src/curses/pwindow.cpp new file mode 100644 index 0000000..9ef2d80 --- /dev/null +++ b/ycurses/src/curses/pwindow.cpp @@ -0,0 +1,99 @@ +#ifndef PANEL_CPP +#define PANEL_CPP + +#include "pwindow.h" + +pwindow::pwindow(window& r_win) +{ + p_window = &r_win; + init(); +} + +void +pwindow::reinit(window& r_win) +{ + p_window = &r_win; + init(); +} + +pwindow::~pwindow() +{ + remove(); +} + +void +pwindow::remove() +{ + if (p_panel) + { + del_panel(p_panel); + p_panel = 0; + } + + update(); +} + +void +pwindow::init() +{ + p_panel = new_panel(p_window->get_WINDOW()); + update(); +} + +void +pwindow::update() +{ + update_panels(); + doupdate(); +} + +void +pwindow::on_bottom() +{ + bottom_panel(p_panel); + update(); +} + +void +pwindow::on_top() +{ + top_panel(p_panel); + update(); +} + +void +pwindow::hide() +{ + hidden::hide(); + hide_panel(p_panel); + update(); +} + +void +pwindow::show() +{ + hidden::show(); + show_panel(p_panel); + update(); +} + +void +pwindow::move(coordinate& r_coord) +{ + move(r_coord.y, r_coord.x); +} + +void +pwindow::move(int y, int x) +{ + move_panel(p_panel, y, x); + update(); +} + +PANEL* +pwindow::get_PANEL() +{ + return p_panel; +} + +#endif diff --git a/ycurses/src/curses/pwindow.h b/ycurses/src/curses/pwindow.h new file mode 100644 index 0000000..49b1d75 --- /dev/null +++ b/ycurses/src/curses/pwindow.h @@ -0,0 +1,37 @@ +#ifndef PWINDOW_H +#define PWINDOW_H + +using namespace std; + +#include "incl.h" +#include "coordinate.h" +#include "hidden.h" +#include "window.h" + +class pwindow : public hidden +{ + + private: + PANEL* p_panel; + window* p_window; + void init(); + + public: + pwindow(window& r_win); + ~pwindow(); + void init(window& r_win); + void reinit(window& r_win); + + void remove(); + void on_bottom(); + void on_top(); + void hide(); + void show(); + void move(int y, int x); + void move(coordinate& r_coord); + + static void update(); + PANEL* get_PANEL(); +}; + +#endif diff --git a/ycurses/src/curses/tool.cpp b/ycurses/src/curses/tool.cpp new file mode 100644 index 0000000..1bce76f --- /dev/null +++ b/ycurses/src/curses/tool.cpp @@ -0,0 +1,37 @@ +#ifndef TOOL_CPP +#define TOOL_CPP + +#include "tool.h" + +string +tool::int2string(int i_int) +{ + char buf[64]; + sprintf(buf, "%d", i_int); + return buf; +} + +int +tool::string2int(string s) +{ + const char *p = s.c_str(); + int i_res = 0; + + // Convert each digit char and add into result. + while (*p >= '0' && *p <='9') + { + i_res = (i_res * 10) + (*p - '0'); + p++; + } + + // Check that there were no non-digits at end. + if (*p != 0) + { + return -1; + } + + return i_res; +} + +#endif + diff --git a/ycurses/src/curses/tool.h b/ycurses/src/curses/tool.h new file mode 100644 index 0000000..130bd09 --- /dev/null +++ b/ycurses/src/curses/tool.h @@ -0,0 +1,15 @@ +#ifndef TOOL_H +#define TOOL_H + +#include "incl.h" + +using namespace std; + +class tool +{ +public: + static string int2string( int i_int ); + static int string2int( string s ); +}; + +#endif diff --git a/ycurses/src/curses/window.cpp b/ycurses/src/curses/window.cpp new file mode 100644 index 0000000..d5ce37c --- /dev/null +++ b/ycurses/src/curses/window.cpp @@ -0,0 +1,367 @@ +#ifndef WINDOW_CPP +#define WINDOW_CPP + +#include "window.h" + +bool window::b_is_rootoot = false; + +window::window(window_type t) +{ + b_is_rootoot = true; + init(); + p_window = stdscr; +} + +window::window(int i_height, int i_width) +{ + init(); + + this->i_height = i_height; + this->i_width = i_width; + this->i_start_y = (LINES - i_height) / 2; + this->i_start_x = (COLS - i_width) / 2; + + p_window = create_new_win(i_height, i_width, i_start_y, i_start_x); +} + +window::window(int i_height, int i_width, coordinate& r_coord) +{ + init(); + + this->i_height = i_height; + this->i_width = i_width; + this->i_start_y = r_coord.y; + this->i_start_x = r_coord.x; + + p_window = create_new_win(i_height, i_width, i_start_y, i_start_x); +} + +window::window(int i_height, int i_width, int i_start_y, int i_start_x) +{ + init(); + + this->i_height = i_height; + this->i_width = i_width; + this->i_start_y = i_start_y; + this->i_start_x = i_start_x; + + p_window = create_new_win(i_height, i_width, i_start_y, i_start_x); +} + +window::~window() +{ + if (p_window) + { + if(!is_root_win()) + destroy_win(p_window); + + p_window = 0; + } +} + +bool +window::is_root_win() +{ + return b_is_rootoot; +} + +void +window::init() +{ +} + +WINDOW* +window::create_new_win(int i_height, int i_width, int i_start_y, int i_start_x) +{ + WINDOW *p_local_win = newwin(i_height, i_width, i_start_y, i_start_x); + box(p_local_win, 0 , 0); /* 0, 0 gives default characters + * for the vertical and horizontal + * lines */ + wrefresh(p_local_win); /* Show that box */ + + return p_local_win; +} + +void +window::destroy_win(WINDOW *p_local_win) +{ + /* box(local_win, ' ', ' '); : This won't produce the desired + * result of erasing the window. It will leave it's four corners + * and so an ugly remnant of window. + */ + + wborder(p_local_win, ' ', ' ', ' ',' ',' ',' ',' ',' '); + /* The parameters taken are + * 1. win: the window on which to operate + * 2. ls: character to be used for the left side of the window + * 3. rs: character to be used for the right side of the window + * 4. ts: character to be used for the top side of the window + * 5. bs: character to be used for the bottom side of the window + * 6. tl: character to be used for the top left corner of the window + * 7. tr: character to be used for the top right corner of the window + * 8. bl: character to be used for the bottom left corner of the window + * 9. br: character to be used for the bottom right corner of the window + */ + + wrefresh(p_local_win); + delwin(p_local_win); +} + +void +window::hide() +{ + hidden::hide(); + + if (p_window) + destroy_win(p_window); +} + +void +window::show() +{ + if (!is_hidden()) + return; + + hidden::show(); + + p_window = create_new_win(i_height, i_width, i_start_y, i_start_x); + + refresh(); +} + +void +window::refresh() +{ + wrefresh(p_window); +} + +void +window::set_attributes(attributes& r_attr) +{ + r_attr.use_wattron(p_window); +} + +void +window::unset_attributes(attributes& r_attr) +{ + r_attr.use_wattroff(p_window); +} + +int +window::save_attributes() +{ + return attr_get(&sr_attributes, &sr_pair, sr_options); +} + +int +window::restore_attributes() +{ + return attr_set(sr_attributes, sr_pair, sr_options); +} + +void +window::print(int i) +{ + print(tool::int2string(i)); +} + +void +window::print(coordinate &r_coord, string s) +{ + print(r_coord.y, r_coord.x, s); +} + +void +window::print(int i_y, int i_x, int i) +{ + print(i_y, i_x, tool::int2string(i)); +} + +void +window::print(coordinate &r_coord, int i) +{ + print(r_coord, tool::int2string(i)); +} + +void +window::println(int i) +{ + println(tool::int2string(i)); +} + +void +window::println(coordinate &r_coord, string s) +{ + println(r_coord.y, r_coord.x, s); +} + +void +window::println(int i_y, int i_x, int i) +{ + println(i_y, i_x, tool::int2string(i)); +} + +void +window::println(coordinate &r_coord, int i) +{ + println(r_coord, tool::int2string(i)); +} + +void +window::print(string s) +{ + wprintw(p_window, const_cast<char*>(s.c_str())); + refresh(); +} + +void +window::print(int i_y, int i_x, string s) +{ + mvwprintw(p_window, i_y, i_x, const_cast<char*>(s.c_str())); + refresh(); +} + +void +window::println(string s) +{ + wprintw(p_window, const_cast<char*>((s+"\n").c_str())); + refresh(); +} + +void +window::println(int i_y, int i_x, string s) +{ + mvwprintw(p_window, i_y, i_x, const_cast<char*>((s+"\n").c_str())); + refresh(); +} + +void +window::print(int i, attributes& r_attr) +{ + save_attributes(); + set_attributes(r_attr); + print(tool::int2string(i)); + restore_attributes(); +} + +void +window::print(coordinate &r_coord, string s, attributes& r_attr) +{ + save_attributes(); + set_attributes(r_attr); + print(r_coord.y, r_coord.x, s); + restore_attributes(); +} + +void +window::print(int i_y, int i_x, int i, attributes& r_attr) +{ + save_attributes(); + set_attributes(r_attr); + print(i_y, i_x, tool::int2string(i)); + restore_attributes(); +} + +void +window::print(coordinate &r_coord, int i, attributes& r_attr) +{ + save_attributes(); + set_attributes(r_attr); + print(r_coord, tool::int2string(i)); + restore_attributes(); +} + +void +window::println(int i, attributes& r_attr) +{ + save_attributes(); + set_attributes(r_attr); + println(tool::int2string(i)); + restore_attributes(); +} + +void +window::println(coordinate &r_coord, string s, attributes& r_attr) +{ + save_attributes(); + set_attributes(r_attr); + println(r_coord.y, r_coord.x, s); + restore_attributes(); +} + +void +window::println(int i_y, int i_x, int i, attributes& r_attr) +{ + save_attributes(); + set_attributes(r_attr); + println(i_y, i_x, tool::int2string(i)); + restore_attributes(); +} + +void +window::println(coordinate &r_coord, int i, attributes& r_attr) +{ + save_attributes(); + set_attributes(r_attr); + println(r_coord, tool::int2string(i)); + restore_attributes(); +} + +void +window::print(string s, attributes& r_attr) +{ + save_attributes(); + set_attributes(r_attr); + wprintw(p_window, const_cast<char*>(s.c_str())); + refresh(); + restore_attributes(); +} + +void +window::print(int i_y, int i_x, string s, attributes& r_attr) +{ + save_attributes(); + set_attributes(r_attr); + mvwprintw(p_window, i_y, i_x, const_cast<char*>(s.c_str())); + refresh(); + restore_attributes(); +} + +void +window::println(string s, attributes& r_attr) +{ + save_attributes(); + set_attributes(r_attr); + wprintw(p_window, const_cast<char*>((s+"\n").c_str())); + refresh(); + restore_attributes(); +} + +void +window::println(int i_y, int i_x, string s, attributes& r_attr) +{ + save_attributes(); + set_attributes(r_attr); + mvwprintw(p_window, i_y, i_x, const_cast<char*>((s+"\n").c_str())); + refresh(); + restore_attributes(); +} + +void +window::move_cursor(coordinate& r_coord) +{ + move_cursor(r_coord.y, r_coord.x); +} + +void +window::move_cursor(int i_y, int i_x) +{ + if (!p_window) + return; + + wmove(p_window, i_y, i_x); + refresh(); +} + + +#endif diff --git a/ycurses/src/curses/window.h b/ycurses/src/curses/window.h new file mode 100644 index 0000000..d194e2f --- /dev/null +++ b/ycurses/src/curses/window.h @@ -0,0 +1,85 @@ +#ifndef WINDOW_H +#define WINDOW_H + +#include "attributes.h" +#include "color.h" +#include "coordinate.h" +#include "dummy.h" +#include "hidden.h" +#include "incl.h" +#include "tool.h" + +using namespace std; + +enum window_type +{ + root +}; + +class window : public dummy_window, hidden +{ + private: + WINDOW* p_window; + int i_height, i_width, i_start_y, i_start_x; + static bool b_is_rootoot; + + /* For save_attributes and restore_attributes */ + attr_t sr_attributes; short sr_pair; void *sr_options; + + WINDOW *create_new_win(int i_height, int i_width, int i_start_y, int i_start_x); + void destroy_win(WINDOW *p_local_win); + + /* Called by the constructors */ + void init(); + + public: + window(window_type t); + window(int i_height, int i_width, coordinate& r_coord); + window(int i_height, int i_width, int i_start_y, int i_start_x); + window(int i_height, int i_width); + ~window(); + + void hide(); + void show(); + void refresh(); + void set_attributes(attributes& r_attr); + void unset_attributes(attributes& r_attr); + bool is_root_win(); + + WINDOW* get_WINDOW() { return p_window; } + + int save_attributes(); + int restore_attributes(); + + void move_cursor(coordinate& r_coord); + void move_cursor(int i_y, int i_x); + + void print(string s); + void print(int i_y, int i_x, string s); + void println(string s); + void println(int i_y, int i_x, string s); + void print(int i); + void print(coordinate &r_coord, string s); + void print(int i_y, int i_x, int i); + void print(coordinate &r_coord, int i); + void println(int i); + void println(coordinate &r_coord, string s); + void println(int i_y, int i_x, int i); + void println(coordinate &r_coord, int i); + + void print(string s, attributes& r_attr); + void print(int i_y, int i_x, string s, attributes& r_attr); + void println(string s, attributes& r_attr); + void println(int i_y, int i_x, string s, attributes& r_attr); + void print(int i, attributes& r_attr); + void print(coordinate &r_coord, string s, attributes& r_attr); + void print(int i_y, int i_x, int i, attributes& r_attr); + void print(coordinate &r_coord, int i, attributes& r_attr); + void println(int i, attributes& r_attr); + void println(coordinate &r_coord, string s, attributes& r_attr); + void println(int i_y, int i_x, int i, attributes& r_attr); + void println(coordinate &r_coord, int i, attributes& r_attr); +}; + +#endif + diff --git a/ycurses/src/curses/ycurses.h b/ycurses/src/curses/ycurses.h new file mode 100644 index 0000000..1699e96 --- /dev/null +++ b/ycurses/src/curses/ycurses.h @@ -0,0 +1,6 @@ +#ifndef YCURSES_H +#define YCURSES_H + +#include "curses.h" + +#endif |
