From 548fd495a5e2b09b35ba16d14af0c18b93256fce Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Tue, 6 Jun 2017 12:50:13 -0400 Subject: [PATCH] Added logic to allowing toggling line numbers in win.c. Default is off but config.h defaults them to on for tide. Also fixed a bug for line numbers on an empty buffer --- config.h | 4 +--- inc/win.h | 2 ++ lib/view.c | 5 ++++- lib/win.c | 19 ++++++++++++++----- tide.c | 3 ++- 5 files changed, 23 insertions(+), 10 deletions(-) diff --git a/config.h b/config.h index 6589ee2..c7b17d6 100644 --- a/config.h +++ b/config.h @@ -5,7 +5,6 @@ extern char *ShellCmd[], *SedCmd[], *PickFileCmd[], *PickTagCmd[], *OpenCmd[]; extern int CLR_NormalText, CLR_GutterText, CLR_SelectedText, CLR_TagsBkg, CLR_EditBkg, CLR_HorBorder, CLR_VerBorder, CLR_Ruler, CLR_ScrollBkg, CLR_ThumbBkg, CLR_Cursor; -extern int LineNumbers; /* OS-Specific Config ******************************************************************************/ @@ -35,6 +34,7 @@ enum { DblClickTime = 250, /* Millisecond time for detecting double clicks */ RulePosition = 80, /* Column in which the vertical ruler appears */ CopyIndent = 1, /* New lines will inherit the indent of the preceding line */ + LineNumbers = 1, /* Enable line numbers by default or not */ }; #ifdef INCLUDE_DEFS @@ -93,7 +93,5 @@ int CLR_VerBorder = 2; // Vertical border color int CLR_Ruler = 1; // Ruler color int CLR_Cursor = 7; // Cursor color -int LineNumbers = 1; - #undef INCLUDE_DEFS #endif diff --git a/inc/win.h b/inc/win.h index 911746d..b12dd7c 100644 --- a/inc/win.h +++ b/inc/win.h @@ -44,6 +44,8 @@ void win_window(char* name, void (*errfn)(char*)); void win_dialog(char* name, void (*errfn)(char*)); void win_loop(void); void win_settext(WinRegion id, char* text); +void win_showlinenums(bool enable); +bool win_getlinenums(void); void win_setruler(size_t ruler); Rune win_getkey(void); void win_setkeys(KeyBinding* bindings); diff --git a/lib/view.c b/lib/view.c index 28574cb..0a36dd5 100644 --- a/lib/view.c +++ b/lib/view.c @@ -550,8 +550,11 @@ static size_t setcell(View* view, size_t row, size_t col, uint32_t attr, Rune r) static size_t fill_row(View* view, unsigned row, size_t pos, size_t* line) { view_getrow(view, row)->off = pos; - if (line) + if (line) { + if (pos > buf_end(&(view->buffer))) + *line = 0; view_getrow(view, row)->line = *line; + } clearrow(view, row); for (size_t x = 0; x < view->ncols;) { uint32_t attr = (in_selection(view->selection, pos) ? CLR_SelectedText : CLR_NormalText); diff --git a/lib/win.c b/lib/win.c index 1387d00..609f6b6 100644 --- a/lib/win.c +++ b/lib/win.c @@ -32,6 +32,7 @@ static WinRegion Focused = EDIT; static Region Regions[NREGIONS] = {0}; static Rune LastKey; static KeyBinding* Keys = NULL; +static bool ShowLineNumbers = false; static void win_init(void (*errfn)(char*)) { for (int i = 0; i < SCROLL; i++) @@ -90,6 +91,14 @@ void win_settext(WinRegion id, char* text) { buf_logclear(&(view->buffer)); } +void win_setlinenums(bool enable) { + ShowLineNumbers = enable; +} + +bool win_getlinenums(void) { + return ShowLineNumbers; +} + void win_setruler(size_t ruler) { Ruler = ruler; } @@ -143,15 +152,15 @@ void win_setscroll(double offset, double visible) { } static size_t gutter_cols(void) { - size_t len = (LineNumbers ? 1 : 0), + size_t len = (ShowLineNumbers ? 1 : 0), lines = win_buf(EDIT)->nlines; - while (LineNumbers && lines > 9) + while (ShowLineNumbers && lines > 9) lines /= 10, len++; return len; } static size_t gutter_size(void) { - return (gutter_cols() * x11_font_width(Font)) + (LineNumbers ? 5 : 0); + return (gutter_cols() * x11_font_width(Font)) + (ShowLineNumbers ? 5 : 0); } static void layout(int width, int height) { @@ -220,7 +229,7 @@ static void onredraw(int width, int height) { size_t gsz = gutter_size(); if (Ruler) x11_draw_rect(CLR_Ruler, ((Ruler+2) * fwidth) + gsz, Regions[i].y-2, 1, Regions[i].height+7); - if (LineNumbers) + if (ShowLineNumbers) x11_draw_rect(CLR_Ruler, Regions[SCROLL].width, Regions[SCROLL].y-2, gsz, Regions[SCROLL].height+7); } @@ -359,7 +368,7 @@ static void onwheeldn(WinRegion id, bool pressed, size_t row, size_t col) { static void draw_line_num(size_t x, size_t y, size_t gcols, size_t num) { UGlyph glyphs[gcols]; - if (LineNumbers) { + if (ShowLineNumbers) { for (int i = gcols-1; i >= 0; i--) { glyphs[i].attr = CLR_GutterText; if (num > 0) { diff --git a/tide.c b/tide.c index 71c6553..16e86db 100644 --- a/tide.c +++ b/tide.c @@ -238,7 +238,7 @@ static void tag_redo(void) { } static void tag_lnnum(void) { - LineNumbers = !LineNumbers; + win_setlinenums(!win_getlinenums()); } static void search(void) { @@ -594,6 +594,7 @@ int main(int argc, char** argv) { char* tags = getenv("EDITTAGS"); win_settext(TAGS, (tags ? tags : DefaultTags)); win_setruler(RulePosition); + win_setlinenums((bool)LineNumbers); /* open the first file in this instance */ if (argc > 1) edit_relative(argv[1]); -- 2.51.0