URI: 
       tAdd text width to eliminate some magic numbers - ledit - Text editor (WIP)
  HTML git clone git://lumidify.org/ledit.git (fast, but not encrypted)
  HTML git clone https://lumidify.org/git/ledit.git (encrypted, but very slow)
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit b8f2762e5d7b778ba858d790f40c85aeab2f57ab
   DIR parent 991419d13fe4ec01c9898681cd5d9ab708486ed8
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Sat, 22 May 2021 18:11:16 +0200
       
       Add text width to eliminate some magic numbers
       
       Diffstat:
         M buffer.c                            |       4 ++--
         M common.h                            |       2 ++
         M ledit.c                             |      74 +++++++++++++++++++------------
       
       3 files changed, 50 insertions(+), 30 deletions(-)
       ---
   DIR diff --git a/buffer.c b/buffer.c
       t@@ -189,7 +189,7 @@ static void
        init_line(ledit_buffer *buffer, ledit_line *line) {
                line->parent_buffer = buffer;
                line->layout = pango_layout_new(buffer->state->context);
       -        pango_layout_set_width(line->layout, (buffer->state->w - 10) * PANGO_SCALE);
       +        pango_layout_set_width(line->layout, (buffer->state->text_w) * PANGO_SCALE);
                pango_layout_set_font_description(line->layout, buffer->state->font);
                pango_layout_set_wrap(line->layout, PANGO_WRAP_WORD_CHAR);
                pango_layout_set_attributes(line->layout, basic_attrs);
       t@@ -199,7 +199,7 @@ init_line(ledit_buffer *buffer, ledit_line *line) {
                line->dirty = 1;
                /* FIXME: does this set line height reasonably when no text yet? */
                pango_layout_get_pixel_size(line->layout, &line->w, &line->h);
       -        line->w = buffer->state->w - 10;
       +        line->w = buffer->state->text_w;
                line->y_offset = 0;
        }
        
   DIR diff --git a/common.h b/common.h
       t@@ -19,6 +19,8 @@ typedef struct {
                int depth;
                int w;
                int h;
       +        int text_w;
       +        int text_h;
                int scroll_dragging;
                int scroll_grab_handle;
                int selecting;
   DIR diff --git a/ledit.c b/ledit.c
       t@@ -1,3 +1,4 @@
       +/* FIXME: Fix lag when scrolling */
        /* FIXME: Fix lag when selecting with mouse */
        /* FIXME: Use PANGO_PIXELS() */
        /* FIXME: Fix cursor movement, especially buffer->trailing and writing at end of line */
       t@@ -138,6 +139,16 @@ static void get_new_line_softline(
            int *new_line_ret, int *new_softline_ret
        );
        
       +#define SCROLLBAR_WIDTH 10
       +#define SCROLL_STEP 10
       +
       +static void
       +recalc_text_size(void) {
       +        int bar_h = bottom_bar.mode_h;
       +        state.text_w = state.w - SCROLLBAR_WIDTH;
       +        state.text_h = state.h - bar_h;
       +}
       +
        /* clipboard handling largely stolen from st (simple terminal) */
        
        #define MODBIT(x, set, bit) ((set) ? ((x) |= (bit)) : ((x) &= ~(bit)))
       t@@ -170,6 +181,7 @@ set_mode(enum ledit_mode mode) {
                ledit_grow_draw(&state, bottom_bar.mode_draw, bottom_bar.mode_w, bottom_bar.mode_h);
                XftDrawRect(bottom_bar.mode_draw->xftdraw, &state.bg, 0, 0, bottom_bar.mode_w, bottom_bar.mode_h);
                pango_xft_render_layout(bottom_bar.mode_draw->xftdraw, &state.fg, bottom_bar.mode, 0, 0);
       +        recalc_text_size(); /* probably not necessary, but whatever */
        }
        
        void
       t@@ -612,18 +624,18 @@ clear_key_stack(void) {
        
        static void
        get_scroll_pos_height(double *pos, double *height) {
       -        *height = ((double)state.h / buffer->total_height) * state.h;
       +        *height = ((double)state.text_h / buffer->total_height) * state.text_h;
                *pos = (buffer->display_offset /
       -               (buffer->total_height - state.h)) * (state.h - *height);
       +               (buffer->total_height - state.text_h)) * (state.text_h - *height);
        }
        
        static void
        set_scroll_pos(double pos) {
       -        buffer->display_offset = pos * (buffer->total_height / (double)state.h);
       +        buffer->display_offset = pos * (buffer->total_height / (double)state.text_h);
                if (buffer->display_offset < 0)
                        buffer->display_offset = 0;
       -        if (buffer->display_offset + state.h > buffer->total_height)
       -                buffer->display_offset = buffer->total_height - state.h;
       +        if (buffer->display_offset + state.text_h > buffer->total_height)
       +                buffer->display_offset = buffer->total_height - state.text_h;
        }
        
        static void
       t@@ -889,6 +901,7 @@ setup(int argc, char *argv[]) {
                if (xsel.xtarget == None)
                        xsel.xtarget = XA_STRING;
        
       +        recalc_text_size();
                redraw();
        }
        
       t@@ -925,9 +938,9 @@ redraw(void) {
                                        final_y = buffer->display_offset - h;
                                        final_h -= buffer->display_offset - h;
                                }
       -                        if (dest_y + final_h > state.h) {
       +                        if (dest_y + final_h > state.text_h) {
                                        final_h -= final_y + final_h -
       -                                           buffer->display_offset - state.h;
       +                                           buffer->display_offset - state.text_h;
                                }
                                ledit_cache_pixmap *pix = ledit_get_cache_pixmap(
                                    line->cache_index
       t@@ -942,7 +955,7 @@ redraw(void) {
                                        cursor_displayed = 1;
                                }
                        }
       -                if (h + line->h >= buffer->display_offset + state.h)
       +                if (h + line->h >= buffer->display_offset + state.text_h)
                                break;
                        h += line->h;
                }
       t@@ -971,31 +984,33 @@ redraw(void) {
                                );
                        }
                }
       -        if (buffer->total_height > state.h) {
       +        if (buffer->total_height > state.text_h) {
                        XSetForeground(state.dpy, state.gc, state.scroll_bg.pixel);
                        XFillRectangle(
                            state.dpy, state.drawable, state.gc,
       -                    state.w - 10, 0, 10, state.h
       +                    state.w - SCROLLBAR_WIDTH, 0, SCROLLBAR_WIDTH, state.text_h
                        );
                        XSetForeground(state.dpy, state.gc, state.fg.pixel);
                        double scroll_h, scroll_y;
                        get_scroll_pos_height(&scroll_y, &scroll_h);
                        XFillRectangle(
                            state.dpy, state.drawable, state.gc,
       -                    state.w - 10, (int)round(scroll_y), 10, (int)round(scroll_h)
       +                    state.w - SCROLLBAR_WIDTH, (int)round(scroll_y),
       +                    SCROLLBAR_WIDTH, (int)round(scroll_h)
                        );
                }
                XSetForeground(state.dpy, state.gc, state.bg.pixel);
       +        /* FIXME: allow different color for bar */
                XFillRectangle(
                    state.dpy, state.drawable, state.gc,
       -            0, state.h - bottom_bar.mode_h,
       -            state.w - 10, bottom_bar.mode_h
       +            0, state.text_h,
       +            state.w, state.h - state.text_h
                );
                XCopyArea(
                    state.dpy, bottom_bar.mode_draw->pixmap,
                    state.drawable, state.gc,
                    0, 0, bottom_bar.mode_w, bottom_bar.mode_h,
       -            state.w - 10 - bottom_bar.mode_w, state.h - bottom_bar.mode_h
       +            state.w - bottom_bar.mode_w, state.text_h
                );
        
                XdbeSwapInfo swap_info;
       t@@ -1160,7 +1175,7 @@ button_press(XEvent *event) {
                                get_scroll_pos_height(&scroll_y, &scroll_h);
                                x = event->xbutton.x;
                                y = event->xbutton.y;
       -                        if (x >= state.w - 10) {
       +                        if (x >= state.text_w) {
                                        state.scroll_dragging = 1;
                                        state.scroll_grab_handle = y;
                                        if (y < scroll_y || y > scroll_y + scroll_h) {
       t@@ -1168,7 +1183,7 @@ button_press(XEvent *event) {
                                                set_scroll_pos(new_scroll_y);
                                        }
                                        return 1;
       -                        } else {
       +                        } else if (y < state.text_h) {
                                        int l, b;
                                        xy_to_line_byte(x, y, &l, &b);
                                        set_selection(l, b, l, b);
       t@@ -1183,18 +1198,19 @@ button_press(XEvent *event) {
                                }
                                break;
                        case Button4:
       -                        buffer->display_offset -= 10;
       +                        buffer->display_offset -= SCROLL_STEP;
                                if (buffer->display_offset < 0)
                                        buffer->display_offset = 0;
                                return 1;
                        case Button5:
       -                        if (buffer->display_offset + state.h <
       +                        if (buffer->display_offset + state.text_h <
                                    buffer->total_height) {
       -                                buffer->display_offset += 10;
       -                                if (buffer->display_offset + state.h >
       -                                    buffer->total_height)
       +                                buffer->display_offset += SCROLL_STEP;
       +                                if (buffer->display_offset + state.text_h >
       +                                    buffer->total_height) {
                                                buffer->display_offset =
       -                                            buffer->total_height - state.h;
       +                                            buffer->total_height - state.text_h;
       +                                }
                                }
                                return 1;
                }
       t@@ -1243,9 +1259,9 @@ ensure_cursor_shown(void) {
                if (cursor_y < buffer->display_offset) {
                        buffer->display_offset = cursor_y;
                } else if (cursor_y + strong.height / PANGO_SCALE >
       -                   buffer->display_offset + state.h) {
       +                   buffer->display_offset + state.text_h) {
                        buffer->display_offset =
       -                    cursor_y - state.h + strong.height / PANGO_SCALE;
       +                    cursor_y - state.text_h + strong.height / PANGO_SCALE;
                }
        }
        
       t@@ -1259,17 +1275,18 @@ resize_window(int w, int h) {
                for (int i = 0; i < buffer->lines_num; i++) {
                        ledit_line *line = ledit_get_line(buffer, i);
                        /* 10 pixels for scrollbar */
       -                pango_layout_set_width(line->layout, (w - 10) * PANGO_SCALE);
       +                pango_layout_set_width(line->layout, (w - SCROLLBAR_WIDTH) * PANGO_SCALE);
                        pango_layout_get_pixel_size(line->layout, &tmp_w, &tmp_h);
                        line->h = tmp_h;
       -                line->w = w - 10;
       +                line->w = w - SCROLLBAR_WIDTH;
                        line->y_offset = buffer->total_height;
                        line->dirty = 1;
                        buffer->total_height += tmp_h;
                }
       +        recalc_text_size();
                if (buffer->display_offset > 0 &&
       -            buffer->display_offset + state.h >= buffer->total_height) {
       -                buffer->display_offset = buffer->total_height - state.h;
       +            buffer->display_offset + state.text_h >= buffer->total_height) {
       +                buffer->display_offset = buffer->total_height - state.text_h;
                        if (buffer->display_offset < 0)
                                buffer->display_offset = 0;
                }
       t@@ -1725,5 +1742,6 @@ key_press(XEvent event) {
                            &buffer->cur_line, &buffer->cur_index
                        );
                }
       +        /* FIXME: only do this when necessary */
                ensure_cursor_shown();
        }