home · contact · privacy
Improved formatting and include comments in windows.c
[plomrogue] / src / windows.c
index 072ae0165a6621936bf7f2aa58de162ded04a37d..9e9fd1270964f3592db93f02f40752f788bc160c 100644 (file)
@@ -2,9 +2,12 @@
 
 #include "windows.h"
 #include <stdint.h>    /* for uint16_t, uint32_t */
-#include <ncurses.h>   /* for LOTS of stuff */
+#include <ncurses.h>   /* for typedefs WINDOW, chtype, wresize(), getmaxx(), */
+                       /* getmaxy(), supbad(), delwin(), mvwaddch(),         */
+                       /* mvwaddstr(), newpad(), wnoutrefres(), erase(),     */
+                       /* werase(), pnoutrefresh(), doupdate()               */
 #include <stdlib.h>    /* for malloc(), free() */
-#include <string.h>    /* for strlen(), memcpy() */
+#include <string.h>    /* for strlen(), strnlen(), memcpy() */
 #include "yx_uint16.h" /* for yx_uint16 coordinates */
 
 
@@ -35,9 +38,9 @@ static void draw_wins(struct Win * w);
 
 
 /* draw_win_borderlines() draws the vertical and horizontal borders of window
- * "w" sans corners, and draws the top border line as the windows' title bar
- * (highlighted if the window is described active by "active" being set).
- * draw_wins_borderlines().
+ * "w" sans corners into the virtual screen "pad", and draws the top border
+ * line as the windows' title bar (highlighted if the window is described
+ * active by "active" being set). draw_wins_borderlines().
  *
  * draw_wins_borderlines() calls draw_win_borderlines() recursively on all
  * windows from "w" on. "w_active" is a pointer to the one window that
@@ -46,8 +49,9 @@ static void draw_wins(struct Win * w);
  * Finally, draw_wins_bordercorners draws into "pad" the borders of window "w"
  * and all its successors.
  */
-static void draw_win_borderlines(struct Win * w, char active);
-static void draw_wins_borderlines(struct Win * w, struct Win * w_active);
+static void draw_win_borderlines(struct Win * w, char active, WINDOW * pad);
+static void draw_wins_borderlines(struct Win * w, struct Win * w_active,
+                                  WINDOW * pad);
 static void draw_wins_bordercorners(struct Win * w, WINDOW * pad);
 
 
@@ -67,35 +71,35 @@ static void refit_pad(struct WinMeta * wmeta)
     }
 
     /* Only resize the pad if the rightmost window column has changed. */
-    if (getmaxx(wmeta->pad.curses_win) != lastwincol)
+    if (getmaxx(wmeta->padframe.curses_win) != lastwincol)
     {
-        wresize(wmeta->pad.curses_win,
-                getmaxy(wmeta->pad.curses_win), lastwincol + 2);
+        wresize(wmeta->padframe.curses_win,
+                getmaxy(wmeta->padframe.curses_win), lastwincol + 2);
     }
 }
 
 
 
-static void update_wins (struct WinMeta * wmeta, struct Win * w)
+static void update_wins(struct WinMeta * wmeta, struct Win * w)
 {
     if (0 != w->frame.curses_win)
     {
-        destroy_win (w);
+        destroy_win(w);
     }
     place_win(wmeta, w);
     refit_pad(wmeta);
-    w->frame.curses_win = subpad(wmeta->pad.curses_win,
+    w->frame.curses_win = subpad(wmeta->padframe.curses_win,
                                  w->frame.size.y, w->frame.size.x,
                                  w->start.y, w->start.x);
     if (0 != w->next)
     {
-        update_wins (wmeta, w->next);
+        update_wins(wmeta, w->next);
     }
 }
 
 
 
-static void place_win (struct WinMeta * wmeta, struct Win * w)
+static void place_win(struct WinMeta * wmeta, struct Win * w)
 {
     /* First window goes into the upper-left corner. */
     w->start.x = 0;
@@ -117,7 +121,7 @@ static void place_win (struct WinMeta * wmeta, struct Win * w)
         uint16_t w_prev_maxy = w->prev->start.y
                                + getmaxy(w->prev->frame.curses_win);
         if (   w->frame.size.x <= w->prev->frame.size.x
-            && w->frame.size.y <  wmeta->pad.size.y - w_prev_maxy)
+            && w->frame.size.y <  wmeta->padframe.size.y - w_prev_maxy)
         {
             w->start.x = w->prev->start.x;
             w->start.y = w_prev_maxy + 1;
@@ -146,7 +150,7 @@ static void place_win (struct WinMeta * wmeta, struct Win * w)
                               + getmaxy(w_upup->frame.curses_win);
                 widthdiff = (w_upup->start.x + w_upup->frame.size.x)
                             - (w_up->start.x + w_up->frame.size.x);
-                if (   w->frame.size.y < wmeta->pad.size.y - w_prev_maxy
+                if (   w->frame.size.y < wmeta->padframe.size.y - w_prev_maxy
                     && w->frame.size.x < widthdiff)
                 {
                     w->start.x = w_up->start.x + w_up->frame.size.x + 1 ;
@@ -174,27 +178,25 @@ static void draw_wins (struct Win * w)
     w->draw(w);
     if (0 != w->next)
     {
-        draw_wins (w->next);
+        draw_wins(w->next);
     }
 }
 
 
 
-static void draw_win_borderlines(struct Win * w, char active)
+static void draw_win_borderlines(struct Win * w, char active, WINDOW * pad)
 {
     /* Draw vertical and horizontal border lines. */
     uint16_t y, x;
     for (y = w->start.y; y <= w->start.y + w->frame.size.y; y++)
     {
-        mvwaddch(wgetparent(w->frame.curses_win), y, w->start.x - 1, '|');
-        mvwaddch(wgetparent(w->frame.curses_win),
-                 y, w->start.x + w->frame.size.x, '|');
+        mvwaddch(pad, y, w->start.x - 1,               '|');
+        mvwaddch(pad, y, w->start.x + w->frame.size.x, '|');
     }
     for (x = w->start.x; x <= w->start.x + w->frame.size.x; x++)
     {
-        mvwaddch(wgetparent(w->frame.curses_win), w->start.y - 1, x, '-');
-        mvwaddch(wgetparent(w->frame.curses_win),
-                 w->start.y + w->frame.size.y, x, '-');
+        mvwaddch(pad, w->start.y - 1,               x, '-');
+        mvwaddch(pad, w->start.y + w->frame.size.y, x, '-');
     }
 
     /* Draw as much as possible of the title into center of top border line. */
@@ -216,24 +218,24 @@ static void draw_win_borderlines(struct Win * w, char active)
         memcpy(title + 1, w->title, length_visible);
         title[0] = title[length_visible + 1] = decoration;
         title[length_visible + 2] = '\0';
-        mvwaddstr(wgetparent(w->frame.curses_win),
-                  w->start.y - 1, w->start.x + title_offset, title);
+        mvwaddstr(pad, w->start.y - 1, w->start.x + title_offset, title);
     }
 }
 
 
 
-static void draw_wins_borderlines(struct Win * w, struct Win * w_active)
+static void draw_wins_borderlines(struct Win * w, struct Win * w_active,
+                                  WINDOW * pad)
 {
     char active = 0;
     if (w == w_active)
     {
         active = 1;
     }
-    draw_win_borderlines(w, active);
+    draw_win_borderlines(w, active, pad);
     if (0 != w->next)
     {
-        draw_wins_borderlines (w->next, w_active);
+        draw_wins_borderlines(w->next, w_active, pad);
     }
 }
 
@@ -257,20 +259,21 @@ static void draw_wins_bordercorners(struct Win * w, WINDOW * pad)
 extern struct WinMeta init_win_meta(WINDOW * screen)
 {
     struct WinMeta wmeta;
-    wmeta.screen         = screen;
-    wmeta.pad.size.y     = getmaxy(screen);
-    wmeta.pad.size.x     = getmaxx(screen);
-    wmeta.chain_start    = 0;
-    wmeta.chain_end      = 0;
-    wmeta.pad_offset     = 0;
-    wmeta.pad.curses_win = newpad(wmeta.pad.size.y, 1);
-    wmeta.active         = 0;
+    wmeta.screen              = screen;
+    wmeta.padframe.size.y     = getmaxy(screen);
+    wmeta.padframe.size.x     = getmaxx(screen);
+    wmeta.chain_start         = 0;
+    wmeta.chain_end           = 0;
+    wmeta.pad_offset          = 0;
+    wmeta.padframe.curses_win = newpad(wmeta.padframe.size.y, 1);
+    wmeta.active              = 0;
     return wmeta;
 }
 
 
 
 extern struct Win init_win(struct WinMeta * wmeta, char * title,
+                           uint16_t height, uint16_t width,
                            void * data, void * func)
 {
     struct Win w;
@@ -278,10 +281,24 @@ extern struct Win init_win(struct WinMeta * wmeta, char * title,
     w.next             = 0;
     w.frame.curses_win = 0;
     w.title            = title;
-    w.frame.size.x     = 20;
-    w.frame.size.y     = wmeta->pad.size.y - 1;
     w.data             = data;
     w.draw             = func;
+    if (width > 0)
+    {
+        w.frame.size.x = width;
+    }
+    else
+    {
+        w.frame.size.x = 1;
+    }
+    if (height > 0 && height <= wmeta->padframe.size.y - 1)
+    {
+        w.frame.size.y = height;
+    }
+    else
+    {
+        w.frame.size.y = wmeta->padframe.size.y - 1;
+    }
     return w;
 }
 
@@ -352,7 +369,8 @@ extern void reset_pad_offset(struct WinMeta * wmeta, uint16_t new_offset)
 {
     if (new_offset >= 0
         && (new_offset < wmeta->pad_offset
-            || new_offset + wmeta->pad.size.x < getmaxx(wmeta->pad.curses_win)))
+            || new_offset + wmeta->padframe.size.x
+               < getmaxx(wmeta->padframe.curses_win)))
     {
         wmeta->pad_offset = new_offset;
     }
@@ -364,7 +382,7 @@ extern void resize_active_win(struct WinMeta * wmeta, struct yx_uint16 size)
 {
     if (0 != wmeta->active
         && size.x > 0 && size.y > 0
-        && size.y < wmeta->pad.size.y)
+        && size.y < wmeta->padframe.size.y)
     {
         wmeta->active->frame.size = size;
         update_wins(wmeta, wmeta->chain_start);   /* Positioning of successor */
@@ -489,34 +507,36 @@ extern void draw_all_wins(struct WinMeta * wmeta)
     /* Empty everything before filling it a-new. */
     erase();
     wnoutrefresh(wmeta->screen);
-    werase(wmeta->pad.curses_win);
+    werase(wmeta->padframe.curses_win);
     if (wmeta->chain_start)
     {
 
         /* Draw windows' contents first, then their borders. */
         draw_wins(wmeta->chain_start);
-        draw_wins_borderlines(wmeta->chain_start, wmeta->active);
-        draw_wins_bordercorners(wmeta->chain_start, wmeta->pad.curses_win);
+        draw_wins_borderlines(wmeta->chain_start, wmeta->active,
+                              wmeta->padframe.curses_win);
+        draw_wins_bordercorners(wmeta->chain_start, wmeta->padframe.curses_win);
 
         /* Draw virtual screen scroll hints. */
         if (wmeta->pad_offset > 0)
         {
-            draw_scroll_hint(&wmeta->pad,
+            draw_scroll_hint(&wmeta->padframe,
                              wmeta->pad_offset, wmeta->pad_offset + 1, '<');
         }
-        if (wmeta->pad_offset + wmeta->pad.size.x
-            < getmaxx(wmeta->pad.curses_win) - 1)
+        if (wmeta->pad_offset + wmeta->padframe.size.x
+            < getmaxx(wmeta->padframe.curses_win) - 1)
         {
-            draw_scroll_hint(&wmeta->pad,
-                             wmeta->pad_offset + wmeta->pad.size.x - 1,
-                             getmaxx(wmeta->pad.curses_win)
-                             - (wmeta->pad_offset + wmeta->pad.size.x), '>');
+            draw_scroll_hint(&wmeta->padframe,
+                             wmeta->pad_offset + wmeta->padframe.size.x - 1,
+                             getmaxx(wmeta->padframe.curses_win)
+                             - (wmeta->pad_offset + wmeta->padframe.size.x),
+                             '>');
         }
 
         /* Write virtual screen segment to be shown on physical screen into */
         /* ncurses screen buffer. */
-        pnoutrefresh(wmeta->pad.curses_win, 0, wmeta->pad_offset, 0, 0,
-                     wmeta->pad.size.y, wmeta->pad.size.x-1);
+        pnoutrefresh(wmeta->padframe.curses_win, 0, wmeta->pad_offset, 0, 0,
+                     wmeta->padframe.size.y, wmeta->padframe.size.x-1);
     }
 
     /* Only at the end write accumulated changes to the physical screen. */