+
+/* See tui-source.h. */
+
+bool
+tui_source_window::line_is_displayed (int line) const
+{
+ bool is_displayed = false;
+ int threshold = SCROLL_THRESHOLD;
+ int i = 0;
+ while (i < content.size () - threshold && !is_displayed)
+ {
+ is_displayed
+ = (content[i].line_or_addr.loa == LOA_LINE
+ && content[i].line_or_addr.u.line_no == line);
+ i++;
+ }
+
+ return is_displayed;
+}
+
+void
+tui_source_window::maybe_update (struct frame_info *fi, symtab_and_line sal,
+ int line_no, CORE_ADDR addr)
+{
+ int start_line = (line_no - (viewport_height / 2)) + 1;
+ if (start_line <= 0)
+ start_line = 1;
+
+ bool source_already_displayed = (sal.symtab != 0
+ && showing_source_p (fullname));
+
+ struct tui_line_or_address l;
+
+ l.loa = LOA_LINE;
+ l.u.line_no = start_line;
+ if (!(source_already_displayed
+ && line_is_displayed (line_no)))
+ update_source_window (get_frame_arch (fi), sal.symtab, l);
+ else
+ {
+ l.u.line_no = line_no;
+ set_is_exec_point_at (l);
+ }
+}