From d78ae64f0682a4aef09e9ff77e8748af9b2380b9 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 4 May 2014 21:35:42 -0400 Subject: refactor --- src/display.c | 8 ++++---- src/pty-unix.c | 4 ++-- src/screen.h | 2 -- src/window-xlib.c | 37 +++++++++++++++++++++++++------------ src/window-xlib.h | 2 ++ 5 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/display.c b/src/display.c index 95c13e8..7c8d063 100644 --- a/src/display.c +++ b/src/display.c @@ -120,7 +120,7 @@ void runes_display_draw_cursor(RunesTerm *t, cairo_t *cr) cairo_rectangle( cr, col * t->fontx + 0.5, - (row + t->scr.row_visible_offset) * t->fonty + 0.5, + (row + t->w.row_visible_offset) * t->fonty + 0.5, t->fontx - 1, t->fonty - 1); cairo_stroke(cr); } @@ -130,13 +130,13 @@ void runes_display_draw_cursor(RunesTerm *t, cairo_t *cr) cairo_rectangle( cr, col * t->fontx, - (row + t->scr.row_visible_offset) * t->fonty, + (row + t->w.row_visible_offset) * t->fonty, t->fontx, t->fonty); cairo_fill(cr); runes_display_draw_glyph( t, cr, t->config.bgdefault, cell->attrs, cell->contents, cell->len, - row + t->scr.row_visible_offset, col); + row + t->w.row_visible_offset, col); } cairo_restore(cr); } @@ -183,7 +183,7 @@ static void runes_display_recalculate_font_metrics(RunesTerm *t) static int runes_display_draw_cell(RunesTerm *t, int row, int col) { - struct runes_cell *cell = &t->scr.grid->rows[row + t->scr.grid->row_top - t->scr.row_visible_offset].cells[col]; + struct runes_cell *cell = &t->scr.grid->rows[row + t->scr.grid->row_top - t->w.row_visible_offset].cells[col]; cairo_pattern_t *bg = NULL, *fg = NULL; int bg_is_custom = 0, fg_is_custom = 0; diff --git a/src/pty-unix.c b/src/pty-unix.c index 3faeb7f..59636e7 100644 --- a/src/pty-unix.c +++ b/src/pty-unix.c @@ -109,8 +109,8 @@ void runes_pty_backend_set_window_size(RunesTerm *t) void runes_pty_backend_write(RunesTerm *t, char *buf, size_t len) { write(t->pty.master, buf, len); - if (t->scr.row_visible_offset != 0) { - t->scr.row_visible_offset = 0; + if (t->w.row_visible_offset != 0) { + t->w.row_visible_offset = 0; t->scr.dirty = 1; runes_window_backend_request_flush(t); } diff --git a/src/screen.h b/src/screen.h index b18d2b5..3132e8a 100644 --- a/src/screen.h +++ b/src/screen.h @@ -81,8 +81,6 @@ struct runes_screen { char *icon_name; size_t icon_name_len; - int row_visible_offset; - struct runes_cell_attrs attrs; unsigned char hide_cursor: 1; diff --git a/src/window-xlib.c b/src/window-xlib.c index 485a3fd..ee4beaa 100644 --- a/src/window-xlib.c +++ b/src/window-xlib.c @@ -83,6 +83,7 @@ static Bool runes_window_backend_find_flush_events( static void runes_window_backend_resize_window( RunesTerm *t, int width, int height); static void runes_window_backend_flush(RunesTerm *t); +static void runes_window_backend_visible_scroll(RunesTerm *t, int count); static void runes_window_backend_visual_bell(RunesTerm *t); static void runes_window_backend_reset_visual_bell(uv_timer_t *handle); static void runes_window_backend_visual_bell_free_handle(uv_handle_t *handle); @@ -496,6 +497,28 @@ static void runes_window_backend_flush(RunesTerm *t) cairo_surface_flush(cairo_get_target(w->backend_cr)); } +static void runes_window_backend_visible_scroll(RunesTerm *t, int count) +{ + RunesWindowBackend *w = &t->w; + int min = 0, max = t->scr.grid->row_count - t->scr.grid->max.row; + int old_offset = w->row_visible_offset; + + w->row_visible_offset += count; + if (w->row_visible_offset < min) { + w->row_visible_offset = min; + } + if (w->row_visible_offset > max) { + w->row_visible_offset = max; + } + + if (w->row_visible_offset == old_offset) { + return; + } + + t->scr.dirty = 1; + runes_window_backend_flush(t); +} + static void runes_window_backend_visual_bell(RunesTerm *t) { if (t->config.bell_is_urgent) { @@ -759,20 +782,10 @@ static int runes_window_backend_handle_builtin_button_press( return 1; break; case Button4: - t->scr.row_visible_offset += t->config.scroll_lines; - if (t->scr.row_visible_offset > t->scr.grid->row_count - t->scr.grid->max.row) { - t->scr.row_visible_offset = t->scr.grid->row_count - t->scr.grid->max.row; - } - t->scr.dirty = 1; - runes_window_backend_flush(t); + runes_window_backend_visible_scroll(t, t->config.scroll_lines); break; case Button5: - t->scr.row_visible_offset -= t->config.scroll_lines; - if (t->scr.row_visible_offset < 0) { - t->scr.row_visible_offset = 0; - } - t->scr.dirty = 1; - runes_window_backend_flush(t); + runes_window_backend_visible_scroll(t, -t->config.scroll_lines); break; default: break; diff --git a/src/window-xlib.h b/src/window-xlib.h index 123c12a..1989cfd 100644 --- a/src/window-xlib.h +++ b/src/window-xlib.h @@ -25,6 +25,8 @@ struct runes_window { cairo_t *backend_cr; + int row_visible_offset; + Atom atoms[RUNES_NUM_ATOMS]; }; -- cgit v1.2.3-54-g00ecf