aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDan Lynch <danjlynch@users.sourceforge.net>2006-05-18 17:51:19 +0000
committerDan Lynch <danjlynch@users.sourceforge.net>2006-05-18 17:51:19 +0000
commit2814681d2070bd8f28b79abb4bcc74a05570635c (patch)
tree0cc7f68f62e66c29f077576fa30fe9132a27539f /src
parent7d239660fbced0b015cd8021f78f6548dd456825 (diff)
downloadipxe-2814681d2070bd8f28b79abb4bcc74a05570635c.tar.gz
all window primitives implemented
Diffstat (limited to 'src')
-rw-r--r--src/core/curses.c164
-rw-r--r--src/include/curses.h39
2 files changed, 116 insertions, 87 deletions
diff --git a/src/core/curses.c b/src/core/curses.c
index f61f61e03..4c6a97a63 100644
--- a/src/core/curses.c
+++ b/src/core/curses.c
@@ -8,6 +8,106 @@
*
*/
+#define WRAP 0
+#define NOWRAP 1
+
+struct cursor_pos {
+ unsigned int y, x;
+};
+
+/*
+ Primitives
+*/
+
+/**
+ * Write a single character rendition to a window
+ *
+ * @v *win window in which to write
+ * @v ch character rendition to write
+ */
+static void _wputch ( WINDOW *win, chtype ch, int wrap ) {
+ win->scr->putc(win->scr, ch);
+ if ( ++(win->curs_x) > win->width ) {
+ if ( wrap == WRAP ) {
+ win->curs_x = 0;
+ (win->curs_y)++;
+ } else {
+ (win->curs_x)--;
+ }
+ }
+}
+
+/**
+ * Write a chtype string to a window
+ *
+ * @v *win window in which to write
+ * @v *chstr chtype string
+ * @v wrap wrap "switch"
+ * @v n write at most n chtypes
+ */
+static void _wputchstr ( WINDOW *win, chtype *chstr, int wrap, int n ) {
+ for ( ; *chstr && n-- ; chstr++ ) {
+ _wputch(win,*chstr,wrap);
+ }
+}
+
+/**
+ * Write a standard c-style string to a window
+ * @v *win window in which to write
+ * @v *str string
+ * @v wrap wrap "switch"
+ * @v n write at most n chars from *str
+ */
+static void _wputstr ( WINDOW *win, char *str, int wrap, int n ) {
+ for ( ; *str && n-- ; str++ ) {
+ _wputch( win, *str | win->attrs, wrap );
+ }
+}
+
+/**
+ * Restore cursor position from encoded backup variable
+ *
+ * @v *win window on which to operate
+ * @v *pos pointer to struct in which original cursor position is stored
+ */
+static void _restore_curs_pos ( WINDOW *win, struct cursor_pos *pos ){
+ win->curs_y = pos->y;
+ win->curs_x = pos->x;
+}
+
+/**
+ * Store cursor position for later restoration
+ *
+ * @v *win window on which to operate
+ * @v *pos pointer to struct in which to store cursor position
+ */
+static void _store_curs_pos ( WINDOW *win, struct cursor_pos *pos ) {
+ pos->y = win->curs_y;
+ pos->x = win->curs_x;
+}
+
+/**
+ * Move a window's cursor to the specified position
+ *
+ * @v *win window to be operated on
+ * @v y Y position
+ * @v x X position
+ * @ret rc return status code
+ */
+int wmove ( WINDOW *win, int y, int x ) {
+ /* chech for out-of-bounds errors */
+ if ( ( ( (unsigned)x - win->ori_x ) > win->width ) ||
+ ( ( (unsigned)y - win->ori_y ) > win->height ) ) {
+ return ERR;
+ }
+
+ win->scr->movetoyx( win->scr, y, x );
+ return OK;
+}
+
+
+
+
WINDOW _stdscr = {
.attrs = A_DEFAULT,
.ori_y = 0,
@@ -146,8 +246,6 @@ WINDOW *newwin ( int nlines, int ncols, int begin_y, int begin_x ) {
* @ret rc return status code
*/
int waddch ( WINDOW *win, const chtype ch ) {
- _putc( win->scr, ch & A_CHARTEXT );
- _advcurs_wrap( win );
return OK;
err:
return ERR;
@@ -162,21 +260,12 @@ int waddch ( WINDOW *win, const chtype ch ) {
* @ret rc return status code
*/
int waddchnstr ( WINDOW *win, const chtype *chstr, int n ) {
- unsigned int ch, pos, count = 0;
- chtype *chptr = chstr;
+ struct cursor_pos pos;
- pos = _store_curs_pos ( win );
- while ( ( ( ( ch = ( *chptr & A_CHARTEXT ) ) ) != '\0' )
- && ( count++ < (unsigned)n ) ) {
- _putc( win, ch );
- _advcurs_nowrap( win );
- /* set rendition code here */
- }
- _restore_curs_pos( win, pos );
+ _store_curs_pos( win, &pos );
+ _wputchstr( win, chstr, NOWRAP, n );
+ _restore_curs_pos( win, &pos );
return OK;
- err:
- _restore_curs_pos( win, pos );
- return ERR;
}
/**
@@ -193,8 +282,6 @@ int waddnstr ( WINDOW *win, const char *str, int n ) {
while ( ( ( ch = *strptr ) != '\0' )
&& ( count++ < (unsigned)n ) ) {
- _putc( win, ch );
- _advcurs_wrap( win );
}
return OK;
@@ -239,29 +326,6 @@ int wattrset ( WINDOW *win, int attrs ) {
}
/**
- * Set background rendition attributes for a window and apply to
- * contents
- *
- * @v *win window to be operated on
- * @v ch chtype containing rendition attributes
- * @ret rc return status code
- */
-int wbkgd ( WINDOW *win, chtype ch ) {
- return OK;
- err:
- return ERR;
-}
-
-/**
- * Set background rendition attributes for a window
- *
- * @v *win window to be operated on
- * @v ch chtype containing rendition attributes
- */
-void wbkgdset ( WINDOW *win, chtype ch ) {
-}
-
-/**
* Draw borders from single-byte characters and renditions around a
* window
*
@@ -276,25 +340,11 @@ void wbkgdset ( WINDOW *win, chtype ch ) {
* @v br bottom right corner
* @ret rc return status code
*/
-int wborder ( WINDOW *win, chtype ls, chtype rs,
- chtype ts, chtype bs, chtype tl,
- chtype tr, chtype bl, chtype br ) {
+int wborder ( WINDOW *win, chtype ls, chtype rs,
+ chtype ts, chtype bs, chtype tl,
+ chtype tr, chtype bl, chtype br ) {
return OK;
err:
return ERR;
}
-/**
- * Move a window's cursor to the specified position
- *
- * @v *win window to be operated on
- * @v y Y position
- * @v x X position
- * @ret rc return status code
- */
-int wmove ( WINDOW *win, int y, int x ) {
- _movetoyx( win->scr, y, x );
- return OK;
- err:
- return ERR;
-}
diff --git a/src/include/curses.h b/src/include/curses.h
index 911c51aa5..34fef8fe7 100644
--- a/src/include/curses.h
+++ b/src/include/curses.h
@@ -477,7 +477,7 @@ extern int wattr_off ( WINDOW *, attr_t, void * );
extern int wattr_on ( WINDOW *, attr_t, void * );
extern int wattr_set ( WINDOW *, attr_t, short, void * );
extern int wbkgd ( WINDOW *, chtype );
-extern void wbkgdset ( WINDOW *, chtype );
+/*extern void wbkgdset ( WINDOW *, chtype );*/
extern int wborder ( WINDOW *, chtype, chtype, chtype, chtype, chtype, chtype,
chtype, chtype );
extern int wchgat ( WINDOW *, int, attr_t, short, const void * );
@@ -628,7 +628,7 @@ static inline int bkgd ( chtype ch ) {
* Set background rendition attributes for stdscr
*/
static inline void bkgdset ( chtype ch ) {
- wbkgdset ( stdscr, ch );
+ wattrset ( stdscr, ch );
}
/**
@@ -832,37 +832,16 @@ static inline int waddstr ( WINDOW *win, const char *str ) {
return waddnstr ( win, str, -1 );
}
-/*
- * Primitives
- */
-/**
- * Advance cursor (wrap text)
- *
- * @v *win window in which to advance
- * @ret rc void function
- */
-void _advcurs_wrap ( struct _curses_window *win );
-/**
- * Advance cursor (no wrap text)
- *
- * @v *win window in which to advance
- * @ret rc void function
- */
-void _advcurs_nowrap ( struct _curses_window *win );
-/**
- * Store cursor position for later restoration
- *
- * @v *win window on which to operate
- * @ret rc return encoded position
- */
-unsigned int _store_curs_pos ( WINDOW *win );
/**
- * Restore cursor position from encoded backup variable
+ * Set background rendition attributes for a window and apply to
+ * contents
*
- * @v *win window on which to operate
- * @v pos encoded position
+ * @v *win window to be operated on
+ * @v ch chtype containing rendition attributes
* @ret rc return status code
*/
-int _restore_curs_pos ( WINDOW *win, unsigned int pos );
+static inline int wbkgdset ( WINDOW *win, chtype ch ) {
+ return wattrset( win, ch );
+}
#endif /* CURSES_H */