use blank_line() instead of hblank/mvwhline(), and fix more breakage
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2844 35c25a1d-7b9e-4130-9fde-d3aeb78583b8master
parent
b1ce64a375
commit
b386a905e6
26
ChangeLog
26
ChangeLog
|
@ -13,21 +13,20 @@ CVS code -
|
|||
openfilestruct, and so that the values in it are used directly
|
||||
instead of being periodically synced up with the globals.
|
||||
Accordingly, remove the globals. Changes to pretty much
|
||||
every function. Rename global_init() resize_init(), rename
|
||||
add_open_file() make_new_buffer(), rename load_buffer()
|
||||
every function. Rename global_init() window_size_init(),
|
||||
rename add_open_file() make_new_buffer(), rename load_buffer()
|
||||
open_buffer(), rename load_open_file() load_buffer(), rename
|
||||
open_prevnext_file() switch_to_prevnext_buffer(), rename
|
||||
open_prevfile_void() switch_to_prev_buffer(), rename
|
||||
open_nextfile_void() switch_to_next_buffer(), remove
|
||||
load_file(), rename cancel_fork() cancel_command(),
|
||||
rename open_pipe() execute_command(), and remove
|
||||
execute_command(). (DLR)
|
||||
- Replace almost all mvwaddstr(hblank) calls with mvwhline(' ',
|
||||
COLS) calls, which do the same thing. New function
|
||||
nmvwhline() (since slang doesn't define mvwhline()); changes
|
||||
to do_browser(), blank_titlebar(), blank_topbar(),
|
||||
blank_edit(), blank_statusbar(), blank_bottombars(),
|
||||
update_line(), and edit_refresh(). (DLR)
|
||||
rename open_pipe() execute_command(), remove
|
||||
execute_command(), and remove resize_variables(). (DLR)
|
||||
- Replace all mvwaddstr(hblank) calls with a new function that
|
||||
does the same thing without the need for hblank. New function
|
||||
blank_line(); changes to do_browser(), blank_titlebar(),
|
||||
blank_topbar(), blank_edit(), blank_statusbar(),
|
||||
blank_bottombars(), update_line(), and edit_refresh(). (DLR)
|
||||
- files.c:
|
||||
open_file()
|
||||
- Assert that filename isn't NULL, and don't do anything special
|
||||
|
@ -83,8 +82,11 @@ CVS code -
|
|||
display_string()
|
||||
- Display invalid multibyte sequences as Unicode 0xFFFD
|
||||
(Replacement Character). (DLR)
|
||||
total_redraw()
|
||||
- Rework to use functions that slang actually defines. (DLR)
|
||||
titlebar()
|
||||
- Rework to display only one space after the version number, so
|
||||
that there's more room for other things, and to not display
|
||||
the status when we're in the file browser, since Pico doesn't.
|
||||
(DLR)
|
||||
- configure.ac:
|
||||
- Since we only use vsnprintf() now, remove the tests for
|
||||
snprintf(). (DLR)
|
||||
|
|
27
src/files.c
27
src/files.c
|
@ -111,6 +111,15 @@ void make_new_buffer(void)
|
|||
openfile = openfile->next;
|
||||
}
|
||||
|
||||
/* Initialize the new buffer. */
|
||||
initialize_buffer();
|
||||
}
|
||||
|
||||
/* Initialize the current entry of the openfile openfilestruct. */
|
||||
void initialize_buffer(void)
|
||||
{
|
||||
assert(openfile != NULL);
|
||||
|
||||
openfile->filename = mallocstrcpy(NULL, "");
|
||||
|
||||
openfile->fileage = make_new_node(NULL);
|
||||
|
@ -142,6 +151,20 @@ void make_new_buffer(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
#ifndef DISABLE_SPELLER
|
||||
/* Reinitialize the current entry of the openfile openfilestruct. */
|
||||
void reinitialize_buffer(void)
|
||||
{
|
||||
assert(openfile != NULL);
|
||||
|
||||
free(openfile->filename);
|
||||
|
||||
free_filestruct(openfile->fileage);
|
||||
|
||||
initialize_buffer();
|
||||
}
|
||||
#endif
|
||||
|
||||
/* filename is a file to open. We make a new buffer, if necessary, and
|
||||
* then open and read the file. */
|
||||
void open_buffer(const char *filename)
|
||||
|
@ -255,7 +278,7 @@ void switch_to_next_buffer_void(void)
|
|||
switch_to_prevnext_buffer(TRUE);
|
||||
}
|
||||
|
||||
/* Delete an entry from the openfile filestruct, and open the one
|
||||
/* Delete an entry from the openfile filestruct, and switch to the one
|
||||
* after it. Return TRUE on success, or FALSE if there are no more open
|
||||
* file buffers. */
|
||||
bool close_buffer(void)
|
||||
|
@ -2581,7 +2604,7 @@ char *do_browser(char *path, DIR *dir)
|
|||
if (j == selected)
|
||||
wattron(edit, A_REVERSE);
|
||||
|
||||
mvwhline(edit, editline, col, ' ', longest);
|
||||
blank_line(edit, editline, col, longest);
|
||||
mvwaddstr(edit, editline, col, disp);
|
||||
free(disp);
|
||||
|
||||
|
|
|
@ -89,7 +89,6 @@ char *answer = NULL; /* Answer str to many questions */
|
|||
ssize_t tabsize = -1; /* Our internal tabsize variable. The
|
||||
default value is set in main(). */
|
||||
|
||||
char *hblank = NULL; /* A horizontal blank line */
|
||||
#ifndef DISABLE_HELP
|
||||
char *help_text; /* The text in the help window */
|
||||
#endif
|
||||
|
@ -1162,8 +1161,6 @@ void thanks_for_all_the_fish(void)
|
|||
free(last_search);
|
||||
if (last_replace != NULL)
|
||||
free(last_replace);
|
||||
if (hblank != NULL)
|
||||
free(hblank);
|
||||
#ifndef DISABLE_SPELLER
|
||||
if (alt_speller != NULL)
|
||||
free(alt_speller);
|
||||
|
|
53
src/nano.c
53
src/nano.c
|
@ -575,10 +575,12 @@ void check_die_too_small(void)
|
|||
die(_("Window size is too small for nano...\n"));
|
||||
}
|
||||
|
||||
/* Reinitialize the variables that depend on the window size. That is,
|
||||
* fill and hblank. */
|
||||
void resize_variables(void)
|
||||
/* Make sure the window size isn't too small, and reinitialize the fill
|
||||
* variable, since it depends on the window size. */
|
||||
void window_size_init(void)
|
||||
{
|
||||
check_die_too_small();
|
||||
|
||||
#ifndef DISABLE_WRAPJUSTIFY
|
||||
fill = wrap_at;
|
||||
if (fill <= 0)
|
||||
|
@ -586,17 +588,6 @@ void resize_variables(void)
|
|||
if (fill < 0)
|
||||
fill = 0;
|
||||
#endif
|
||||
|
||||
hblank = charealloc(hblank, COLS + 1);
|
||||
charset(hblank, ' ', COLS);
|
||||
hblank[COLS] = '\0';
|
||||
}
|
||||
|
||||
/* Initialize the resize variables. */
|
||||
void resize_init(void)
|
||||
{
|
||||
check_die_too_small();
|
||||
resize_variables();
|
||||
}
|
||||
|
||||
void window_init(void)
|
||||
|
@ -2341,6 +2332,7 @@ const char *do_int_speller(const char *tempfile_name)
|
|||
const char *do_alt_speller(char *tempfile_name)
|
||||
{
|
||||
int alt_spell_status;
|
||||
char *filename_save;
|
||||
size_t current_x_save = openfile->current_x;
|
||||
size_t pww_save = openfile->placewewant;
|
||||
ssize_t current_y_save = openfile->current_y;
|
||||
|
@ -2455,15 +2447,20 @@ const char *do_alt_speller(char *tempfile_name)
|
|||
}
|
||||
#endif
|
||||
|
||||
/* Reinitialize the filestruct. */
|
||||
free_filestruct(openfile->fileage);
|
||||
/* Set up the window size. */
|
||||
window_size_init();
|
||||
|
||||
/* Reinitialize the resize variables. */
|
||||
resize_init();
|
||||
/* Save the current filename. */
|
||||
filename_save = mallocstrcpy(NULL, openfile->filename);
|
||||
|
||||
/* Reload the temp file. Do what open_buffer() would do, except for
|
||||
* making a new buffer for the temp file if multibuffer support is
|
||||
* available. */
|
||||
/* Reinitialize the current buffer. */
|
||||
reinitialize_buffer();
|
||||
|
||||
/* Restore the current filename. */
|
||||
openfile->filename = filename_save;
|
||||
|
||||
/* Reload the temp file. Open it, read it into the current buffer,
|
||||
* and move back to the first line of the buffer. */
|
||||
open_file(tempfile_name, FALSE, &f);
|
||||
read_file(f, tempfile_name);
|
||||
openfile->current = openfile->fileage;
|
||||
|
@ -3675,7 +3672,8 @@ void handle_sigwinch(int s)
|
|||
COLS = win.ws_col;
|
||||
LINES = win.ws_row;
|
||||
|
||||
resize_init();
|
||||
/* Reinitialize the window size variables. */
|
||||
window_size_init();
|
||||
|
||||
/* If we've partitioned the filestruct, unpartition it now. */
|
||||
if (filepart != NULL)
|
||||
|
@ -4618,16 +4616,19 @@ int main(int argc, char **argv)
|
|||
/* Back up the old terminal settings so that they can be restored. */
|
||||
tcgetattr(0, &oldterm);
|
||||
|
||||
/* Curses initialization stuff: Start curses and set up the
|
||||
* terminal state. */
|
||||
/* Initialize curses mode. */
|
||||
initscr();
|
||||
|
||||
/* Set up the terminal state. */
|
||||
terminal_init();
|
||||
|
||||
/* Turn the cursor on for sure. */
|
||||
curs_set(1);
|
||||
|
||||
/* Set up the resize variables and the shortcuts. */
|
||||
resize_init();
|
||||
/* Initialize the window size variables. */
|
||||
window_size_init();
|
||||
|
||||
/* Set up the shortcuts. */
|
||||
shortcut_init(FALSE);
|
||||
|
||||
/* Set up the signal handlers. */
|
||||
|
|
|
@ -127,12 +127,6 @@
|
|||
#define getline ngetline
|
||||
#endif
|
||||
|
||||
/* Slang curses emulation brain damage, part 3: Slang doesn't define
|
||||
* mvwhline(), so use the version we have. */
|
||||
#ifdef USE_SLANG
|
||||
#define mvwhline nmvwhline
|
||||
#endif
|
||||
|
||||
#define VERMSG "GNU nano " VERSION
|
||||
|
||||
/* If we aren't using ncurses, turn the mouse support off, as it's
|
||||
|
|
12
src/proto.h
12
src/proto.h
|
@ -65,7 +65,6 @@ extern char *backup_dir;
|
|||
|
||||
extern WINDOW *topwin, *edit, *bottomwin;
|
||||
extern char *answer;
|
||||
extern char *hblank;
|
||||
#ifndef DISABLE_HELP
|
||||
extern char *help_text;
|
||||
#endif
|
||||
|
@ -239,6 +238,10 @@ void delete_opennode(openfilestruct *fileptr);
|
|||
void free_openfilestruct(openfilestruct *src);
|
||||
#endif
|
||||
void make_new_buffer(void);
|
||||
void initialize_buffer(void);
|
||||
#ifndef DISABLE_SPELLER
|
||||
void reinitialize_buffer(void);
|
||||
#endif
|
||||
void open_buffer(const char *filename);
|
||||
void load_buffer(void);
|
||||
#ifdef ENABLE_MULTIBUFFER
|
||||
|
@ -358,8 +361,7 @@ void finish(void);
|
|||
void die(const char *msg, ...);
|
||||
void die_save_file(const char *die_filename);
|
||||
void check_die_too_small(void);
|
||||
void resize_variables(void);
|
||||
void resize_init(void);
|
||||
void window_size_init(void);
|
||||
void window_init(void);
|
||||
#ifndef DISABLE_MOUSE
|
||||
void mouse_init(void);
|
||||
|
@ -567,9 +569,6 @@ void get_totals(const filestruct *begin, const filestruct *end, size_t
|
|||
*lines, size_t *size);
|
||||
|
||||
/* Public functions in winio.c. */
|
||||
#ifdef USE_SLANG
|
||||
int nmvwhline(WINDOW *win, int y, int x, char ch, int n);
|
||||
#endif
|
||||
#ifndef NANO_SMALL
|
||||
void reset_kbinput(void);
|
||||
#endif
|
||||
|
@ -632,6 +631,7 @@ size_t xplustabs(void);
|
|||
size_t actual_x(const char *str, size_t xplus);
|
||||
size_t strnlenpt(const char *buf, size_t size);
|
||||
size_t strlenpt(const char *buf);
|
||||
void blank_line(WINDOW *win, int y, int x, int n);
|
||||
void blank_titlebar(void);
|
||||
void blank_topbar(void);
|
||||
void blank_edit(void);
|
||||
|
|
127
src/winio.c
127
src/winio.c
|
@ -52,19 +52,6 @@ static bool resetstatuspos = FALSE;
|
|||
/* Should we reset the cursor position
|
||||
* at the statusbar prompt? */
|
||||
|
||||
#ifdef USE_SLANG
|
||||
/* Slang curses emulation brain damage, part 4: Slang doesn't define
|
||||
* mvwhline(). */
|
||||
int nmvwhline(WINDOW *win, int y, int x, char ch, int n)
|
||||
{
|
||||
wmove(win, y, x);
|
||||
for (; n > 0; n--)
|
||||
waddch(win, ch);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Control character compatibility:
|
||||
*
|
||||
* - NANO_BACKSPACE_KEY is Ctrl-H, which is Backspace under ASCII, ANSI,
|
||||
|
@ -2223,34 +2210,43 @@ size_t strlenpt(const char *buf)
|
|||
return strnlenpt(buf, (size_t)-1);
|
||||
}
|
||||
|
||||
/* Move to (x, y) in win, and display a line of n spaces with the
|
||||
* current attributes. */
|
||||
void blank_line(WINDOW *win, int y, int x, int n)
|
||||
{
|
||||
wmove(win, y, x);
|
||||
for (; n > 0; n--)
|
||||
waddch(win, ' ');
|
||||
}
|
||||
|
||||
void blank_titlebar(void)
|
||||
{
|
||||
mvwhline(topwin, 0, 0, ' ', COLS);
|
||||
blank_line(topwin, 0, 0, COLS);
|
||||
}
|
||||
|
||||
void blank_topbar(void)
|
||||
{
|
||||
if (!ISSET(MORE_SPACE))
|
||||
mvwhline(topwin, 1, 0, ' ', COLS);
|
||||
blank_line(topwin, 1, 0, COLS);
|
||||
}
|
||||
|
||||
void blank_edit(void)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < editwinrows; i++)
|
||||
mvwhline(edit, i, 0, ' ', COLS);
|
||||
blank_line(edit, i, 0, COLS);
|
||||
}
|
||||
|
||||
void blank_statusbar(void)
|
||||
{
|
||||
mvwhline(bottomwin, 0, 0, ' ', COLS);
|
||||
blank_line(bottomwin, 0, 0, COLS);
|
||||
}
|
||||
|
||||
void blank_bottombars(void)
|
||||
{
|
||||
if (!ISSET(NO_HELP)) {
|
||||
mvwhline(bottomwin, 1, 0, ' ', COLS);
|
||||
mvwhline(bottomwin, 2, 0, ' ', COLS);
|
||||
blank_line(bottomwin, 1, 0, COLS);
|
||||
blank_line(bottomwin, 2, 0, COLS);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2747,17 +2743,18 @@ void titlebar(const char *path)
|
|||
{
|
||||
int space;
|
||||
/* The space we have available for display. */
|
||||
size_t verlen = strlenpt(VERMSG) + 1;
|
||||
size_t verlen = strlenpt(VERMSG);
|
||||
/* The length of the version message in columns. */
|
||||
const char *prefix;
|
||||
/* "File:", "Dir:", or "New Buffer". Goes before filename. */
|
||||
/* "DIR:", "File:", or "New Buffer". Goes before filename. */
|
||||
size_t prefixlen;
|
||||
/* The length of the prefix in columns, plus one. */
|
||||
/* The length of the prefix in columns. */
|
||||
const char *state;
|
||||
/* "Modified", "View", or spaces the length of "Modified".
|
||||
* Tells the state of this buffer. */
|
||||
/* "Modified", "View", or "". Shows the state of this
|
||||
* buffer. */
|
||||
size_t statelen = 0;
|
||||
/* The length of the state in columns, plus one. */
|
||||
/* The length of the state in columns, or the length of
|
||||
* "Modified" if the state is blank. */
|
||||
char *exppath = NULL;
|
||||
/* The file name, expanded for display. */
|
||||
bool newfie = FALSE;
|
||||
|
@ -2771,34 +2768,34 @@ void titlebar(const char *path)
|
|||
wattron(topwin, A_REVERSE);
|
||||
blank_titlebar();
|
||||
|
||||
if (COLS <= 5 || COLS - 5 < verlen)
|
||||
if (COLS <= 4 || COLS - 4 < verlen)
|
||||
space = 0;
|
||||
else {
|
||||
space = COLS - 5 - verlen;
|
||||
/* Reserve 2/3 of the screen plus one column for after the
|
||||
space = COLS - 4 - verlen;
|
||||
/* Reserve 2/3 of the screen plus two columns for after the
|
||||
* version message. */
|
||||
if (space < COLS - (COLS / 3) + 1)
|
||||
space = COLS - (COLS / 3) + 1;
|
||||
if (space < COLS - (COLS / 3) + 2)
|
||||
space = COLS - (COLS / 3) + 2;
|
||||
}
|
||||
|
||||
if (COLS > 4) {
|
||||
/* The version message should only take up 1/3 of the screen
|
||||
* minus one column. */
|
||||
if (COLS > 3) {
|
||||
/* The version message, counting the two spaces before it,
|
||||
* should only take up 1/3 of the screen minus two columns. */
|
||||
mvwaddnstr(topwin, 0, 2, VERMSG, actual_x(VERMSG,
|
||||
(COLS / 3) - 3));
|
||||
waddstr(topwin, " ");
|
||||
(COLS / 3) - 4));
|
||||
waddch(topwin, ' ');
|
||||
}
|
||||
|
||||
if (openfile->modified)
|
||||
state = _("Modified");
|
||||
else if (ISSET(VIEW_MODE))
|
||||
state = _("View");
|
||||
else {
|
||||
if (space > 0)
|
||||
statelen = strnlenpt(_("Modified"), space - 1) + 1;
|
||||
state = &hblank[COLS - statelen];
|
||||
}
|
||||
statelen = strnlenpt(state, COLS);
|
||||
#ifndef DISABLE_BROWSER
|
||||
/* Don't display the state if we're in the file browser. */
|
||||
if (path != NULL)
|
||||
state = "";
|
||||
else
|
||||
#endif
|
||||
state = openfile->modified ? _("Modified") : ISSET(VIEW_MODE) ?
|
||||
_("View") : "";
|
||||
|
||||
statelen = strlenpt((state[0] != '\0') ? state : _("Modified"));
|
||||
|
||||
/* We need a space before state. */
|
||||
if ((openfile->modified || ISSET(VIEW_MODE)) && statelen < COLS)
|
||||
|
@ -2810,6 +2807,7 @@ void titlebar(const char *path)
|
|||
goto the_end;
|
||||
|
||||
#ifndef DISABLE_BROWSER
|
||||
/* path should be a directory if we're in the file browser. */
|
||||
if (path != NULL)
|
||||
prefix = _("DIR:");
|
||||
else
|
||||
|
@ -2828,8 +2826,11 @@ void titlebar(const char *path)
|
|||
if (!newfie && prefixlen + statelen < space)
|
||||
prefixlen++;
|
||||
|
||||
/* If we're not in the file browser, path should be the current
|
||||
* filename. */
|
||||
if (path == NULL)
|
||||
path = openfile->filename;
|
||||
|
||||
if (space >= prefixlen + statelen)
|
||||
space -= prefixlen + statelen;
|
||||
else
|
||||
|
@ -2837,9 +2838,9 @@ void titlebar(const char *path)
|
|||
/* space is now the room we have for the file name. */
|
||||
|
||||
if (!newfie) {
|
||||
size_t lenpt = strlenpt(path), start_col;
|
||||
size_t lenpt = strlenpt(path) + 1, start_col;
|
||||
|
||||
dots = (lenpt > space);
|
||||
dots = (lenpt >= space);
|
||||
|
||||
if (dots) {
|
||||
start_col = lenpt - space + 3;
|
||||
|
@ -2855,8 +2856,8 @@ void titlebar(const char *path)
|
|||
/* The length of the expanded filename. */
|
||||
|
||||
/* There is room for the whole filename, so we center it. */
|
||||
waddnstr(topwin, hblank, (space - exppathlen) / 3);
|
||||
waddnstr(topwin, prefix, actual_x(prefix, prefixlen));
|
||||
mvwaddnstr(topwin, 0, ((COLS / 3) - 4) + ((space - exppathlen) /
|
||||
3), prefix, actual_x(prefix, prefixlen));
|
||||
if (!newfie) {
|
||||
assert(strlenpt(prefix) + 1 == prefixlen);
|
||||
|
||||
|
@ -2878,14 +2879,16 @@ void titlebar(const char *path)
|
|||
the_end:
|
||||
free(exppath);
|
||||
|
||||
if (COLS <= 1 || statelen >= COLS - 1)
|
||||
mvwaddnstr(topwin, 0, 0, state, actual_x(state, COLS));
|
||||
else {
|
||||
assert(COLS - statelen - 2 >= 0);
|
||||
if (state[0] != '\0') {
|
||||
if (COLS <= 1 || statelen >= COLS - 1)
|
||||
mvwaddnstr(topwin, 0, 0, state, actual_x(state, COLS));
|
||||
else {
|
||||
assert(COLS - statelen - 2 >= 0);
|
||||
|
||||
mvwaddch(topwin, 0, COLS - statelen - 2, ' ');
|
||||
mvwaddnstr(topwin, 0, COLS - statelen - 1, state,
|
||||
mvwaddch(topwin, 0, COLS - statelen - 2, ' ');
|
||||
mvwaddnstr(topwin, 0, COLS - statelen - 1, state,
|
||||
actual_x(state, statelen));
|
||||
}
|
||||
}
|
||||
|
||||
wattroff(topwin, A_REVERSE);
|
||||
|
@ -3448,7 +3451,7 @@ void update_line(const filestruct *fileptr, size_t index)
|
|||
return;
|
||||
|
||||
/* First, blank out the line. */
|
||||
mvwhline(edit, line, 0, ' ', COLS);
|
||||
blank_line(edit, line, 0, COLS);
|
||||
|
||||
/* Next, convert variables that index the line to their equivalent
|
||||
* positions in the expanded line. */
|
||||
|
@ -3632,7 +3635,7 @@ void edit_refresh(void)
|
|||
foo = foo->next;
|
||||
}
|
||||
while (nlines < editwinrows) {
|
||||
mvwhline(edit, nlines, 0, ' ', COLS);
|
||||
blank_line(edit, nlines, 0, COLS);
|
||||
nlines++;
|
||||
}
|
||||
reset_cursor();
|
||||
|
@ -3789,8 +3792,14 @@ int do_yesno(bool all, const char *msg)
|
|||
|
||||
void total_redraw(void)
|
||||
{
|
||||
touchwin(stdscr);
|
||||
wrefresh(stdscr);
|
||||
#ifdef USE_SLANG
|
||||
/* Slang curses emulation brain damage, part 3: Slang doesn't define
|
||||
* curscr. */
|
||||
SLsmg_touch_screen();
|
||||
SLsmg_refresh();
|
||||
#else
|
||||
wrefresh(curscr);
|
||||
#endif
|
||||
}
|
||||
|
||||
void total_refresh(void)
|
||||
|
|
Loading…
Reference in New Issue