From: Dmitry Antipov Date: Fri, 1 Feb 2013 07:23:18 +0000 (+0400) Subject: * window.h (struct window): Convert base_line_number, base_line_pos X-Git-Tag: emacs-24.3.90~173^2~7^2~176 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=422ff52b80abd9233225b22ccdc5263631cbe482;p=emacs.git * window.h (struct window): Convert base_line_number, base_line_pos and column_number_displayed members from Lisp_Object to ptrdiff_t. Convert region_showing member from Lisp_Object to bitfield. Remove sequence_number member. Adjust comments. * window.c (sequence_number): Remove. (make_window): Initialize column_number_displayed. * print.c (print_object): Follow the printed representation of frames and print window pointer to distinguish between windows. (adjust_window_count): Invalidate base_line_pos. Adjust comment. * xdisp.c (wset_base_line_number, wset_base_line_pos) (wset_column_number_displayed, wset_region_showing): Remove. (window_buffer_changed, mode_line_update_needed, redisplay_internal) (try_scrolling, try_cursor_movement, redisplay_window) (try_window_reusing_current_matrix, try_window_id, display_line) (display_mode_lines, decode_mode_spec): Adjust users. * .gdbinit (pwinx): Do not print sequence_number. --- diff --git a/src/.gdbinit b/src/.gdbinit index 4688b0a4421..4215ffa312b 100644 --- a/src/.gdbinit +++ b/src/.gdbinit @@ -358,7 +358,6 @@ end define pwinx set $w = $arg0 - xgetint $w->sequence_number if ($w->mini_p != Qnil) printf "Mini " end diff --git a/src/ChangeLog b/src/ChangeLog index 2156d7f19c9..9682da24235 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,22 @@ +2013-02-01 Dmitry Antipov + + * window.h (struct window): Convert base_line_number, base_line_pos + and column_number_displayed members from Lisp_Object to ptrdiff_t. + Convert region_showing member from Lisp_Object to bitfield. + Remove sequence_number member. Adjust comments. + * window.c (sequence_number): Remove. + (make_window): Initialize column_number_displayed. + * print.c (print_object): Follow the printed representation of + frames and print window pointer to distinguish between windows. + (adjust_window_count): Invalidate base_line_pos. Adjust comment. + * xdisp.c (wset_base_line_number, wset_base_line_pos) + (wset_column_number_displayed, wset_region_showing): Remove. + (window_buffer_changed, mode_line_update_needed, redisplay_internal) + (try_scrolling, try_cursor_movement, redisplay_window) + (try_window_reusing_current_matrix, try_window_id, display_line) + (display_mode_lines, decode_mode_spec): Adjust users. + * .gdbinit (pwinx): Do not print sequence_number. + 2013-02-01 Paul Eggert Use fdopendir, fstatat and readlinkat, for efficiency (Bug#13539). diff --git a/src/print.c b/src/print.c index 2d96202f389..24886a64914 100644 --- a/src/print.c +++ b/src/print.c @@ -1766,7 +1766,7 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag { int len; strout ("#sequence_number); + len = sprintf (buf, "%p", XWINDOW (obj)); strout (buf, len, len, printcharfun); if (!NILP (XWINDOW (obj)->buffer)) { diff --git a/src/window.c b/src/window.c index a0ebe4b4484..5679c150efa 100644 --- a/src/window.c +++ b/src/window.c @@ -116,9 +116,6 @@ Lisp_Object minibuf_selected_window; /* Hook run at end of temp_output_buffer_show. */ static Lisp_Object Qtemp_buffer_show_hook; -/* Incremented for each window created. */ -static int sequence_number; - /* Nonzero after init_window_once has finished. */ static int window_initialized; @@ -286,8 +283,9 @@ adjust_window_count (struct window *w, int arg) b = b->base_buffer; b->window_count += arg; eassert (b->window_count >= 0); - /* Catch redisplay's attention. */ + /* These should be recalculated by redisplay code. */ w->window_end_valid = 0; + w->base_line_pos = 0; } } @@ -3429,8 +3427,6 @@ make_parent_window (Lisp_Object window, int horflag) adjust_window_count (p, 1); XSETWINDOW (parent, p); - p->sequence_number = ++sequence_number; - replace_window (window, parent, 1); wset_next (o, Qnil); @@ -3479,7 +3475,7 @@ make_window (void) w->nrows_scale_factor = w->ncols_scale_factor = 1; w->phys_cursor_type = -1; w->phys_cursor_width = -1; - w->sequence_number = ++sequence_number; + w->column_number_displayed = -1; /* Reset window_list. */ Vwindow_list = Qnil; diff --git a/src/window.h b/src/window.h index 135f591ded7..f28ce1424d0 100644 --- a/src/window.h +++ b/src/window.h @@ -192,23 +192,6 @@ struct window and Qt, so bitfield can't be used here. */ Lisp_Object dedicated; - /* Line number and position of a line somewhere above the top of the - screen. If this field is nil, it means we don't have a base - line. */ - Lisp_Object base_line_number; - /* If this field is nil, it means we don't have a base line. - If it is a buffer, it means don't display the line number - as long as the window shows that buffer. */ - Lisp_Object base_line_pos; - - /* If we have highlighted the region (or any part of it), - this is the mark position that we used, as an integer. */ - Lisp_Object region_showing; - - /* The column number currently displayed in this window's mode line, - or nil if column numbers are not being displayed. */ - Lisp_Object column_number_displayed; - /* If redisplay in this window goes beyond this buffer position, must run the redisplay-end-trigger-hook. */ Lisp_Object redisplay_end_trigger; @@ -238,9 +221,6 @@ struct window /* Number saying how recently window was selected. */ int use_time; - /* Unique number of window assigned when it was created. */ - int sequence_number; - /* Number of columns display within the window is scrolled to the left. */ ptrdiff_t hscroll; @@ -260,6 +240,19 @@ struct window it should be positive. */ ptrdiff_t last_point; + /* Line number and position of a line somewhere above the top of the + screen. If this field is zero, it means we don't have a base line. */ + ptrdiff_t base_line_number; + + /* If this field is zero, it means we don't have a base line. + If it is -1, it means don't display the line number as long + as the window shows its buffer. */ + ptrdiff_t base_line_pos; + + /* The column number currently displayed in this window's mode + line, or -1 if column numbers are not being displayed. */ + ptrdiff_t column_number_displayed; + /* Scaling factor for the glyph_matrix size calculation in this window. Used if window contains many small images or uses proportional fonts, as the normal may yield a matrix which is too small. */ @@ -340,6 +333,9 @@ struct window the frame image that window_end_pos did not get onto the frame. */ unsigned window_end_valid : 1; + /* Nonzero if we have highlighted the region (or any part of it). */ + unsigned region_showing : 1; + /* Amount by which lines of this window are scrolled in y-direction (smooth scrolling). */ int vscroll; diff --git a/src/xdisp.c b/src/xdisp.c index 0169238e994..7b6e108d97f 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -367,28 +367,6 @@ Lisp_Object Qcenter; static Lisp_Object Qmargin, Qpointer; static Lisp_Object Qline_height; -/* These setters are used only in this file, so they can be private. */ -static void -wset_base_line_number (struct window *w, Lisp_Object val) -{ - w->base_line_number = val; -} -static void -wset_base_line_pos (struct window *w, Lisp_Object val) -{ - w->base_line_pos = val; -} -static void -wset_column_number_displayed (struct window *w, Lisp_Object val) -{ - w->column_number_displayed = val; -} -static void -wset_region_showing (struct window *w, Lisp_Object val) -{ - w->region_showing = val; -} - #ifdef HAVE_WINDOW_SYSTEM /* Test if overflow newline into fringe. Called with iterator IT @@ -10775,7 +10753,7 @@ window_buffer_changed (struct window *w) return (((BUF_SAVE_MODIFF (b) < BUF_MODIFF (b)) != w->last_had_star) || ((!NILP (Vtransient_mark_mode) && !NILP (BVAR (b, mark_active))) - != !NILP (w->region_showing))); + != w->region_showing)); } /* Nonzero if W has %c in its mode line and mode line should be updated. */ @@ -10783,9 +10761,9 @@ window_buffer_changed (struct window *w) static int mode_line_update_needed (struct window *w) { - return (!NILP (w->column_number_displayed) + return (w->column_number_displayed != -1 && !(PT == w->last_point && !window_outdated (w)) - && (XFASTINT (w->column_number_displayed) != current_column ())); + && (w->column_number_displayed != current_column ())); } /*********************************************************************** @@ -13038,18 +13016,6 @@ redisplay_internal (void) clear_garbaged_frames (); } - - /* If showing the region, and mark has changed, we must redisplay - the whole window. The assignment to this_line_start_pos prevents - the optimization directly below this if-statement. */ - if (((!NILP (Vtransient_mark_mode) - && !NILP (BVAR (XBUFFER (w->buffer), mark_active))) - != !NILP (w->region_showing)) - || (!NILP (w->region_showing) - && !EQ (w->region_showing, - Fmarker_position (BVAR (XBUFFER (w->buffer), mark))))) - CHARPOS (this_line_start_pos) = 0; - /* Optimize the case that only the line containing the cursor in the selected window has changed. Variables starting with this_ are set in display_line and record information about the line @@ -13213,7 +13179,7 @@ redisplay_internal (void) && (EQ (selected_window, BVAR (current_buffer, last_selected_window)) || highlight_nonselected_windows) - && NILP (w->region_showing) + && !w->region_showing && NILP (Vshow_trailing_whitespace) && !cursor_in_echo_area) { @@ -14710,7 +14676,7 @@ try_scrolling (Lisp_Object window, int just_this_one_p, if (!just_this_one_p || current_buffer->clip_changed || BEG_UNCHANGED < CHARPOS (startp)) - wset_base_line_number (w, Qnil); + w->base_line_number = 0; /* If cursor ends up on a partially visible line, treat that as being off the bottom of the screen. */ @@ -14859,7 +14825,7 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp, int *scroll_ste region exists, cursor movement has to do more than just set the cursor. */ && markpos_of_region () < 0 - && NILP (w->region_showing) + && !w->region_showing && NILP (Vshow_trailing_whitespace) /* This code is not used for mini-buffer for the sake of the case of redisplaying to replace an echo area message; since in @@ -15425,7 +15391,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p) /* Forget any recorded base line for line number display. */ if (!buffer_unchanged_p) - wset_base_line_number (w, Qnil); + w->base_line_number = 0; /* Redisplay the mode line. Select the buffer properly for that. Also, run the hook window-scroll-functions @@ -15665,7 +15631,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p) || current_buffer->clip_changed || BEG_UNCHANGED < CHARPOS (startp)) /* Forget any recorded base line for line number display. */ - wset_base_line_number (w, Qnil); + w->base_line_number = 0; if (!cursor_row_fully_visible_p (w, 1, 0)) { @@ -15732,11 +15698,9 @@ redisplay_window (Lisp_Object window, int just_this_one_p) debug_method_add (w, "recenter"); #endif - /* w->vscroll = 0; */ - /* Forget any previously recorded base line for line number display. */ if (!buffer_unchanged_p) - wset_base_line_number (w, Qnil); + w->base_line_number = 0; /* Determine the window start relative to point. */ init_iterator (&it, w, PT, PT_BYTE, NULL, DEFAULT_FACE_ID); @@ -15956,10 +15920,10 @@ redisplay_window (Lisp_Object window, int just_this_one_p) && !FRAME_WINDOW_P (f) && !WINDOW_FULL_WIDTH_P (w)) /* Line number to display. */ - || INTEGERP (w->base_line_pos) + || w->base_line_pos > 0 /* Column number is displayed and different from the one displayed. */ - || (!NILP (w->column_number_displayed) - && (XFASTINT (w->column_number_displayed) != current_column ()))) + || (w->column_number_displayed != -1 + && (w->column_number_displayed != current_column ()))) /* This means that the window has a mode line. */ && (WINDOW_WANTS_MODELINE_P (w) || WINDOW_WANTS_HEADER_LINE_P (w))) @@ -15990,11 +15954,10 @@ redisplay_window (Lisp_Object window, int just_this_one_p) goto need_larger_matrices; } - if (!line_number_displayed - && !BUFFERP (w->base_line_pos)) + if (!line_number_displayed && w->base_line_pos != -1) { - wset_base_line_pos (w, Qnil); - wset_base_line_number (w, Qnil); + w->base_line_pos = 0; + w->base_line_number = 0; } finish_menu_bars: @@ -16231,7 +16194,7 @@ try_window_reusing_current_matrix (struct window *w) /* Can't do this if region may have changed. */ if (0 <= markpos_of_region () - || !NILP (w->region_showing) + || w->region_showing || !NILP (Vshow_trailing_whitespace)) return 0; @@ -17070,7 +17033,7 @@ try_window_id (struct window *w) GIVE_UP (11); /* Likewise if showing a region. */ - if (!NILP (w->region_showing)) + if (w->region_showing) GIVE_UP (10); /* Can't use this if overlay arrow position and/or string have @@ -19157,7 +19120,7 @@ display_line (struct it *it) } /* Is IT->w showing the region? */ - wset_region_showing (it->w, it->region_beg_charpos > 0 ? Qt : Qnil); + it->w->region_showing = it->region_beg_charpos > 0; /* Clear the result glyph row and enable it. */ prepare_desired_row (row); @@ -20161,7 +20124,7 @@ display_mode_lines (struct window *w) /* These will be set while the mode line specs are processed. */ line_number_displayed = 0; - wset_column_number_displayed (w, Qnil); + w->column_number_displayed = -1; if (WINDOW_WANTS_MODELINE_P (w)) { @@ -21184,8 +21147,7 @@ decode_mode_spec_coding (Lisp_Object coding_system, register char *buf, int eol_ returned with spaces to that value. Return a Lisp string in *STRING if the resulting string is taken from that Lisp string. - Note we operate on the current buffer for most purposes, - the exception being w->base_line_pos. */ + Note we operate on the current buffer for most purposes. */ static char lots_of_dashes[] = "--------------------------------------------------------------------------------------------------------------------------------------------"; @@ -21296,7 +21258,7 @@ decode_mode_spec (struct window *w, register int c, int field_width, else { ptrdiff_t col = current_column (); - wset_column_number_displayed (w, make_number (col)); + w->column_number_displayed = col; pint2str (decode_mode_spec_buf, width, col); return decode_mode_spec_buf; } @@ -21355,27 +21317,24 @@ decode_mode_spec (struct window *w, register int c, int field_width, /* If we decided that this buffer isn't suitable for line numbers, don't forget that too fast. */ - if (EQ (w->base_line_pos, w->buffer)) + if (w->base_line_pos == -1) goto no_value; - /* But do forget it, if the window shows a different buffer now. */ - else if (BUFFERP (w->base_line_pos)) - wset_base_line_pos (w, Qnil); /* If the buffer is very big, don't waste time. */ if (INTEGERP (Vline_number_display_limit) && BUF_ZV (b) - BUF_BEGV (b) > XINT (Vline_number_display_limit)) { - wset_base_line_pos (w, Qnil); - wset_base_line_number (w, Qnil); + w->base_line_pos = 0; + w->base_line_number = 0; goto no_value; } - if (INTEGERP (w->base_line_number) - && INTEGERP (w->base_line_pos) - && XFASTINT (w->base_line_pos) <= startpos) + if (w->base_line_number > 0 + && w->base_line_pos > 0 + && w->base_line_pos <= startpos) { - line = XFASTINT (w->base_line_number); - linepos = XFASTINT (w->base_line_pos); + line = w->base_line_number; + linepos = w->base_line_pos; linepos_byte = buf_charpos_to_bytepos (b, linepos); } else @@ -21398,8 +21357,8 @@ decode_mode_spec (struct window *w, register int c, int field_width, go back past it. */ if (startpos == BUF_BEGV (b)) { - wset_base_line_number (w, make_number (topline)); - wset_base_line_pos (w, make_number (BUF_BEGV (b))); + w->base_line_number = topline; + w->base_line_pos = BUF_BEGV (b); } else if (nlines < height + 25 || nlines > height * 3 + 50 || linepos == BUF_BEGV (b)) @@ -21425,13 +21384,13 @@ decode_mode_spec (struct window *w, register int c, int field_width, give up on line numbers for this window. */ if (position == limit_byte && limit == startpos - distance) { - wset_base_line_pos (w, w->buffer); - wset_base_line_number (w, Qnil); + w->base_line_pos = -1; + w->base_line_number = 0; goto no_value; } - wset_base_line_number (w, make_number (topline - nlines)); - wset_base_line_pos (w, make_number (BYTE_TO_CHAR (position))); + w->base_line_number = topline - nlines; + w->base_line_pos = BYTE_TO_CHAR (position); } /* Now count lines from the start pos to point. */