#if !defined(FSL_DIFF_BUILDER_NCU_INCLUDED)
#define FSL_DIFF_BUILDER_NCU_INCLUDED
#include <ncurses.h>
#include "libfossil.h"
/**
Column indexes for fsl_dibu_ncu::maxWidths and friends.
*/
enum FslDiffBuilderCols {
FDBCols_NUM1 = 0, FDBCols_TEXT1,
FDBCols_MOD,
FDBCols_NUM2, FDBCols_TEXT2,
FDBCols_count
};
/**
Internal state for the ncurses unified-format-ish diff
builder.
*/
struct fsl_dibu_ncu {
/**
Largest column width we've yet seen.
FIXME: these are in bytes, not text columns. The current code may
truncate multibyte characters.
*/
uint32_t maxWidths[FDBCols_count];
/**
Max line numbers seen for the LHS/RHS input files. This is likely
higher than the number of diff lines.
This can be used, e.g., to size and allocate a curses PAD in the
second pass of the start() method.
*/
uint32_t lineCount[2];
/**
The actual number of lines needed for rendering the file.
*/
uint32_t displayLines;
/**
The column width, in bytes, needed for rendering the file. May
currently misbehave with multi-byte characters.
*/
uint32_t displayWidth;
/**
Rendering surface for the builder. Owned by this object.
*/
WINDOW * pad;
/**
Internal rendering position tracker.
*/
struct {
int y;
int x;
} cursor;
/**
Internal buffer.
*/
fsl_buffer buf;
};
typedef struct fsl_dibu_ncu fsl_dibu_ncu;
/**
Factory function for the "ncu" (ncurses unified) diff
builder.
The new instance's pimpl member is a (fsl_diff_builde_ncu*).
It must not be used via the diff APIs until after ncurses screen
mode has been activated via `initscr()`. Violations are met with
undefined behaviour. Similarly, ncurses apparently cannot render
non-ASCII UTF8 characters unless the application does something like
the following before calling `initscr()`:
```
setlocale(LC_ALL, "");
```
*/
fsl_diff_builder * fsl_dibu_ncu_alloc(void);
/**
Returns true if its argument was allocated via fsl_dibu_ncu_alloc(),
else false.
*/
bool fsl_dibu_is_ncu(fsl_diff_builder const * const b);
/**
If fsl_dibu_is_ncu() returns true for the given build, this
returns that builder's type-specific state, else it returns NULL.
*/
fsl_dibu_ncu * fsl_dibu_ncu_pimpl(fsl_diff_builder * const b);
/**
This is a very basic implementation of a diff viewer intended to be
run after a fsl_diff_builder has processed its diffs and is ready
to be rendered. This enters an input look which accepts navigation
keys until the user taps 'q' to quit the loop. w must be the target
window on top of which to render (e.g. stdscr).
*/
void fsl_dibu_ncu_basic_loop(fsl_dibu_ncu * const nc,
WINDOW * const w);
/**
Renders a vertical scrollbar on window tgt at column x, running
from the given top row to the row (top+barHeight). The scroll
indicator is rendered depending on the final two arguments:
lineCount specifies the number of lines in the scrollable
input and currentLine specifies the top-most line number of the
currently-displayed data. e.g. a lineCount of 100 and currentLine
of 1 puts the indicator 1% of the way down the scrollbar. Likewise,
a lineCount of 100 and currentLine of 90 puts the indicator at the
90% point.
*/
void fsl_nc_scrollbar_v( WINDOW * const tgt, int top, int x,
int barHeight, int lineCount,
int currentLine );
/**
Works like fsl_nc_scrollbar_v() but renders a horizontal scrollbar
at the given left/top coordinates of tgt.
*/
void fsl_nc_scrollbar_h( WINDOW * const tgt, int top, int left,
int barWidth, int colCount,
int currentCol );
#endif /* FSL_DIFF_BUILDER_NCU_INCLUDED */