From 4107af3bfe74bfda0f761ebcc836c8ffcf96e592 Mon Sep 17 00:00:00 2001 From: Timothy Stack Date: Wed, 19 Jun 2013 06:47:36 -0700 Subject: [PATCH 1/3] [session] prefer bookmarks from the same session --- src/lnav.hh | 1 + src/session_data.cc | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/lnav.hh b/src/lnav.hh index 74530ebb..6c36bc78 100644 --- a/src/lnav.hh +++ b/src/lnav.hh @@ -123,6 +123,7 @@ typedef std::pair session_pair_t; struct _lnav_data { std::string ld_session_id; time_t ld_session_time; + time_t ld_session_load_time; time_t ld_session_save_time; std::list ld_session_file_names; int ld_session_file_index; diff --git a/src/session_data.cc b/src/session_data.cc index f19a398e..b173c9a9 100644 --- a/src/session_data.cc +++ b/src/session_data.cc @@ -95,6 +95,9 @@ static string latest_bookmark_file(const string &name) base = strrchr(path, '/') + 1; if (sscanf(base, "file-%*[^.].ts%d.json", ×tamp) == 1) { + if (timestamp == lnav_data.ld_session_load_time) { + return path; + } file_names.push_back(make_pair(timestamp, path)); } } @@ -452,18 +455,20 @@ void load_session(void) yajl_handle handle; int fd; - load_bookmarks(); - if (lnav_data.ld_session_file_names.empty()) { + load_bookmarks(); return; } handle = yajl_alloc(&ypc.ypc_callbacks, NULL, &ypc); sess_iter = lnav_data.ld_session_file_names.begin(); advance(sess_iter, lnav_data.ld_session_file_index); + lnav_data.ld_session_load_time = sess_iter->first.second; lnav_data.ld_session_save_time = sess_iter->first.second; string &view_info_name = sess_iter->second; + load_bookmarks(); + if ((fd = open(view_info_name.c_str(), O_RDONLY)) < 0) { perror("cannot open session file"); } From f26dc13529a1aee04480c7ab2927cfc9dc0a0c3b Mon Sep 17 00:00:00 2001 From: Timothy Stack Date: Thu, 20 Jun 2013 06:08:53 -0700 Subject: [PATCH 2/3] [cppcheck] fix some nits turned up by cppcheck --- src/lnav_util.cc | 3 ++- src/session_data.cc | 4 ++-- src/view_curses.hh | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/lnav_util.cc b/src/lnav_util.cc index 43f5ba9e..475d1380 100644 --- a/src/lnav_util.cc +++ b/src/lnav_util.cc @@ -38,6 +38,7 @@ #include +#include "auto_fd.hh" #include "lnav_util.hh" std::string hash_string(const std::string &str) @@ -144,7 +145,7 @@ bool change_to_parent_dir(void) file_format_t detect_file_format(const std::string &filename) { file_format_t retval = FF_UNKNOWN; - int fd; + auto_fd fd; if ((fd = open(filename.c_str(), O_RDONLY)) != -1) { char buffer[32]; diff --git a/src/session_data.cc b/src/session_data.cc index bc734c57..702c342b 100644 --- a/src/session_data.cc +++ b/src/session_data.cc @@ -342,7 +342,7 @@ void load_bookmarks(void) const string &log_name = iter->ld_file->get_filename(); string mark_file_name; yajl_handle handle; - int fd; + auto_fd fd; fprintf(stderr, "load %s\n", log_name.c_str()); @@ -455,7 +455,7 @@ void load_session(void) std::list::iterator sess_iter; yajlpp_parse_context ypc(view_info_handlers); yajl_handle handle; - int fd; + auto_fd fd; if (lnav_data.ld_session_file_names.empty()) { load_bookmarks(); diff --git a/src/view_curses.hh b/src/view_curses.hh index 2b46e6ae..8d149233 100644 --- a/src/view_curses.hh +++ b/src/view_curses.hh @@ -435,7 +435,7 @@ public: return VC_ANSI_START + ((fg * 8) + bg); }; - int ansi_color_pair(int fg, int bg) + static inline int ansi_color_pair(int fg, int bg) { return COLOR_PAIR(ansi_color_pair_index(fg, bg)); }; From 8be234d41f65c06311a9a55a1a95c21bf3635e22 Mon Sep 17 00:00:00 2001 From: Timothy Stack Date: Thu, 20 Jun 2013 06:42:11 -0700 Subject: [PATCH 3/3] [bookmarks] restore support for bookmarks in the other views --- src/lnav.cc | 172 ++++++++++++++++++++--------------------- src/textview_curses.hh | 31 ++++++++ 2 files changed, 116 insertions(+), 87 deletions(-) diff --git a/src/lnav.cc b/src/lnav.cc index 392d8c0d..77cba175 100644 --- a/src/lnav.cc +++ b/src/lnav.cc @@ -755,12 +755,18 @@ static void sigwinch(int sig) static void back_ten(int ten_minute) { - logfile_sub_source &lss = lnav_data.ld_log_source; + textview_curses * tc = lnav_data.ld_view_stack.top(); + logfile_sub_source *lss; + + lss = dynamic_cast(tc->get_sub_source()); + + if (!lss) + return; time_t hour = rounddown_offset(lnav_data.ld_top_time, 60 * 60, ten_minute * 10 * 60); - vis_line_t line = lss.find_from_time(hour); + vis_line_t line = lss->find_from_time(hour); --line; lnav_data.ld_view_stack.top()->set_top(line); @@ -1185,52 +1191,48 @@ static void handle_paging_key(int ch) break; case 'm': - if (lss) { - lnav_data.ld_last_user_mark[tc] = tc->get_top(); - lss->toggle_user_mark(&textview_curses::BM_USER, - vis_line_t(lnav_data.ld_last_user_mark[tc])); - tc->reload_data(); + lnav_data.ld_last_user_mark[tc] = tc->get_top(); + tc->toggle_user_mark(&textview_curses::BM_USER, + vis_line_t(lnav_data.ld_last_user_mark[tc])); + tc->reload_data(); - lnav_data.ld_rl_view->set_alt_value(HELP_MSG_2( - u, U, - "to move forward/backward through user bookmarks")); - } + lnav_data.ld_rl_view->set_alt_value(HELP_MSG_2( + u, U, + "to move forward/backward through user bookmarks")); break; case 'J': - if (lss) { - if (lnav_data.ld_last_user_mark.find(tc) == - lnav_data.ld_last_user_mark.end() || - !tc->is_visible(vis_line_t(lnav_data.ld_last_user_mark[tc]))) { - lnav_data.ld_last_user_mark[tc] = tc->get_top(); - } - else { - vis_line_t height; - unsigned long width; - - tc->get_dimensions(height, width); - if (lnav_data.ld_last_user_mark[tc] > tc->get_bottom() - 2 && - tc->get_top() + height < tc->get_inner_height()) { - tc->shift_top(vis_line_t(1)); - } - if (lnav_data.ld_last_user_mark[tc] + 1 >= - tc->get_inner_height()) { - break; - } - lnav_data.ld_last_user_mark[tc] += 1; - } - lss->toggle_user_mark(&textview_curses::BM_USER, - vis_line_t(lnav_data.ld_last_user_mark[tc])); - tc->reload_data(); - - lnav_data.ld_rl_view->set_alt_value(HELP_MSG_1( - c, - "to copy marked lines to the clipboard")); + if (lnav_data.ld_last_user_mark.find(tc) == + lnav_data.ld_last_user_mark.end() || + !tc->is_visible(vis_line_t(lnav_data.ld_last_user_mark[tc]))) { + lnav_data.ld_last_user_mark[tc] = tc->get_top(); } + else { + vis_line_t height; + unsigned long width; + + tc->get_dimensions(height, width); + if (lnav_data.ld_last_user_mark[tc] > tc->get_bottom() - 2 && + tc->get_top() + height < tc->get_inner_height()) { + tc->shift_top(vis_line_t(1)); + } + if (lnav_data.ld_last_user_mark[tc] + 1 >= + tc->get_inner_height()) { + break; + } + lnav_data.ld_last_user_mark[tc] += 1; + } + tc->toggle_user_mark(&textview_curses::BM_USER, + vis_line_t(lnav_data.ld_last_user_mark[tc])); + tc->reload_data(); + + lnav_data.ld_rl_view->set_alt_value(HELP_MSG_1( + c, + "to copy marked lines to the clipboard")); break; case 'K': - if (lss) { + { int new_mark; if (lnav_data.ld_last_user_mark.find(tc) == @@ -1243,8 +1245,8 @@ static void handle_paging_key(int ch) new_mark = lnav_data.ld_last_user_mark[tc]; } - lss->toggle_user_mark(&textview_curses::BM_USER, - vis_line_t(new_mark)); + tc->toggle_user_mark(&textview_curses::BM_USER, + vis_line_t(new_mark)); if (new_mark == tc->get_top()) { tc->shift_top(vis_line_t(-1)); } @@ -1264,39 +1266,37 @@ static void handle_paging_key(int ch) break; case 'M': - if (lss) { - if (lnav_data.ld_last_user_mark.find(tc) == - lnav_data.ld_last_user_mark.end()) { - flash(); - } - else { - int start_line = min( - (int)tc->get_top(), lnav_data.ld_last_user_mark[tc] + 1); - int end_line = max( - (int)tc->get_top(), lnav_data.ld_last_user_mark[tc] - 1); + if (lnav_data.ld_last_user_mark.find(tc) == + lnav_data.ld_last_user_mark.end()) { + flash(); + } + else { + int start_line = min((int)tc->get_top(), + lnav_data.ld_last_user_mark[tc] + 1); + int end_line = max((int)tc->get_top(), + lnav_data.ld_last_user_mark[tc] - 1); - lss->toggle_user_mark(&textview_curses::BM_USER, - vis_line_t(start_line), - vis_line_t(end_line)); - tc->reload_data(); - } + tc->toggle_user_mark(&textview_curses::BM_USER, + vis_line_t(start_line), + vis_line_t(end_line)); + tc->reload_data(); } break; case 'S': - { - bookmark_vector::iterator iter; + { + bookmark_vector::iterator iter; - for (iter = bm[&textview_curses::BM_SEARCH].begin(); - iter != bm[&textview_curses::BM_SEARCH].end(); - ++iter) { - lss->toggle_user_mark(&textview_curses::BM_USER, *iter); + for (iter = bm[&textview_curses::BM_SEARCH].begin(); + iter != bm[&textview_curses::BM_SEARCH].end(); + ++iter) { + tc->toggle_user_mark(&textview_curses::BM_USER, *iter); + } + + lnav_data.ld_last_user_mark[tc] = -1; + tc->reload_data(); } - - lnav_data.ld_last_user_mark[tc] = -1; - tc->reload_data(); - } - break; + break; case '1': case '2': @@ -2423,29 +2423,27 @@ public: } return; } - if (lss) { - if (this->lb_selection_start == vis_line_t(-1)) { - this->lb_selection_start = vis_y; - this->lb_selection_last = vis_line_t(-1); + if (this->lb_selection_start == vis_line_t(-1)) { + this->lb_selection_start = vis_y; + this->lb_selection_last = vis_line_t(-1); + } + else { + if (this->lb_selection_last != vis_line_t(-1)) { + tc->toggle_user_mark(&textview_curses::BM_USER, + this->lb_selection_start, + this->lb_selection_last); + } + if (this->lb_selection_start == vis_y) { + this->lb_selection_last = vis_line_t(-1); } else { - if (this->lb_selection_last != vis_line_t(-1)) { - lss->toggle_user_mark(&textview_curses::BM_USER, - this->lb_selection_start, - this->lb_selection_last); - } - if (this->lb_selection_start == vis_y) { - this->lb_selection_last = vis_line_t(-1); - } - else { - lss->toggle_user_mark(&textview_curses::BM_USER, - this->lb_selection_start, - vis_y); - this->lb_selection_last = vis_y; - } + tc->toggle_user_mark(&textview_curses::BM_USER, + this->lb_selection_start, + vis_y); + this->lb_selection_last = vis_y; } - tc->reload_data(); } + tc->reload_data(); break; case xterm_mouse::XT_BUTTON_RELEASE: diff --git a/src/textview_curses.hh b/src/textview_curses.hh index 47512b95..96a9a5f9 100644 --- a/src/textview_curses.hh +++ b/src/textview_curses.hh @@ -197,6 +197,37 @@ public: vis_bookmarks &get_bookmarks(void) { return this->tc_bookmarks; }; + void toggle_user_mark(bookmark_type_t *bm, + vis_line_t start_line, + vis_line_t end_line = vis_line_t(-1)) + { + if (end_line == -1) { + end_line = start_line; + } + if (start_line > end_line) { + std::swap(start_line, end_line); + } + for (vis_line_t curr_line = start_line; curr_line <= end_line; + ++curr_line) { + bookmark_vector &bv = + this->tc_bookmarks[bm]; + bookmark_vector::iterator iter; + bool added; + + iter = bv.insert_once(curr_line); + if (iter == bv.end()) { + added = true; + } + else { + bv.erase(iter); + added = false; + } + if (this->tc_sub_source != NULL) { + this->tc_sub_source->text_mark(bm, (int)curr_line, added); + } + } + }; + void set_sub_source(text_sub_source *src) { this->tc_sub_source = src;