X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/a4b0cca119b01dc55bad802ef696c857fe014482..7479dd3e8afeac3925c1d5e23d5296623852cff8:/src/fringe.c?ds=sidebyside diff --git a/src/fringe.c b/src/fringe.c index ce31fd0176..1eae6b1849 100644 --- a/src/fringe.c +++ b/src/fringe.c @@ -1,5 +1,6 @@ /* Fringe handling (split from xdisp.c). - Copyright (C) 1985-1988, 1993-1995, 1997-2012 Free Software Foundation, Inc. + Copyright (C) 1985-1988, 1993-1995, 1997-2014 Free Software + Foundation, Inc. This file is part of GNU Emacs. @@ -19,6 +20,8 @@ along with GNU Emacs. If not, see . */ #include #include +#include + #include "lisp.h" #include "frame.h" #include "window.h" @@ -28,8 +31,6 @@ along with GNU Emacs. If not, see . */ #include "blockinput.h" #include "termhooks.h" -#ifdef HAVE_WINDOW_SYSTEM - /* Fringe bitmaps are represented in three different ways: Logical bitmaps are used internally to denote things like @@ -82,7 +83,7 @@ struct fringe_bitmap unsigned width : 8; unsigned period : 8; unsigned align : 2; - unsigned dynamic : 1; + bool_bf dynamic : 1; }; @@ -473,7 +474,7 @@ static struct fringe_bitmap standard_bitmaps[] = #define NO_FRINGE_BITMAP 0 #define UNDEF_FRINGE_BITMAP 1 -#define MAX_STANDARD_FRINGE_BITMAPS (sizeof (standard_bitmaps)/sizeof (standard_bitmaps[0])) +#define MAX_STANDARD_FRINGE_BITMAPS ARRAYELTS (standard_bitmaps) static struct fringe_bitmap **fringe_bitmaps; static Lisp_Object *fringe_faces; @@ -658,6 +659,10 @@ draw_fringe_bitmap_1 (struct window *w, struct glyph_row *row, int left_p, int o { /* If W has a vertical border to its left, don't draw over it. */ wd -= ((!WINDOW_LEFTMOST_P (w) + /* This could be wrong when we allow window local + right dividers - but the window on the left is hard + to get. */ + && !FRAME_RIGHT_DIVIDER_WIDTH (f) && !WINDOW_HAS_VERTICAL_SCROLL_BAR (w) /* But don't reduce the fringe width if the window has a left margin, because that means we are not @@ -665,7 +670,7 @@ draw_fringe_bitmap_1 (struct window *w, struct glyph_row *row, int left_p, int o and OTOH leaving out that one pixel leaves behind traces of the cursor, if it was in column zero before drawing non-empty margin area. */ - && NILP (w->left_margin_cols)) + && w->left_margin_cols == 0) ? 1 : 0); p.bx = x - wd; p.nx = wd; @@ -690,7 +695,9 @@ draw_fringe_bitmap_1 (struct window *w, struct glyph_row *row, int left_p, int o } } - FRAME_RIF (f)->draw_fringe_bitmap (w, row, &p); + if (p.x >= WINDOW_BOX_LEFT_EDGE_X (w) + && (p.x + p.wd) <= WINDOW_BOX_LEFT_EDGE_X (w) + WINDOW_PIXEL_WIDTH (w)) + FRAME_RIF (f)->draw_fringe_bitmap (w, row, &p); } static int @@ -698,7 +705,7 @@ get_logical_cursor_bitmap (struct window *w, Lisp_Object cursor) { Lisp_Object cmap, bm = Qnil; - if ((cmap = BVAR (XBUFFER (w->buffer), fringe_cursor_alist)), !NILP (cmap)) + if ((cmap = BVAR (XBUFFER (w->contents), fringe_cursor_alist)), !NILP (cmap)) { bm = Fassq (cursor, cmap); if (CONSP (bm)) @@ -735,7 +742,7 @@ get_logical_fringe_bitmap (struct window *w, Lisp_Object bitmap, int right_p, in If partial, lookup partial bitmap in default value if not found here. If not partial, or no partial spec is present, use non-partial bitmap. */ - if ((cmap = BVAR (XBUFFER (w->buffer), fringe_indicator_alist)), !NILP (cmap)) + if ((cmap = BVAR (XBUFFER (w->contents), fringe_indicator_alist)), !NILP (cmap)) { bm1 = Fassq (bitmap, cmap); if (CONSP (bm1)) @@ -889,31 +896,32 @@ draw_row_fringe_bitmaps (struct window *w, struct glyph_row *row) /* Draw the fringes of window W. Only fringes for rows marked for update in redraw_fringe_bitmaps_p are drawn. - Return >0 if left or right fringe was redrawn in any way. + Return nonzero if left or right fringe was redrawn in any way. - If NO_FRINGE is non-zero, also return >0 if either fringe has zero width. + If NO_FRINGE_P is non-zero, also return nonzero if either fringe + has zero width. - A return value >0 indicates that the vertical line between windows - needs update (as it may be drawn in the fringe). + A return nonzero value indicates that the vertical line between + windows needs update (as it may be drawn in the fringe). */ -int -draw_window_fringes (struct window *w, int no_fringe) +bool +draw_window_fringes (struct window *w, bool no_fringe_p) { struct glyph_row *row; int yb = window_text_bottom_y (w); int nrows = w->current_matrix->nrows; int y, rn; - int updated = 0; + bool updated_p = 0; if (w->pseudo_window_p) - return 0; + return updated_p; /* Must draw line if no fringe */ - if (no_fringe + if (no_fringe_p && (WINDOW_LEFT_FRINGE_WIDTH (w) == 0 || WINDOW_RIGHT_FRINGE_WIDTH (w) == 0)) - updated++; + updated_p = 1; for (y = w->vscroll, rn = 0, row = w->current_matrix->rows; y < yb && rn < nrows; @@ -923,10 +931,10 @@ draw_window_fringes (struct window *w, int no_fringe) continue; draw_row_fringe_bitmaps (w, row); row->redraw_fringe_bitmaps_p = 0; - updated++; + updated_p = 1; } - return updated; + return updated_p; } @@ -935,14 +943,14 @@ draw_window_fringes (struct window *w, int no_fringe) If KEEP_CURRENT_P is 0, update current_matrix too. */ -int -update_window_fringes (struct window *w, int keep_current_p) +bool +update_window_fringes (struct window *w, bool keep_current_p) { struct glyph_row *row, *cur = 0; int yb = window_text_bottom_y (w); int rn, nrows = w->current_matrix->nrows; int y; - int redraw_p = 0; + bool redraw_p = 0; Lisp_Object boundary_top = Qnil, boundary_bot = Qnil; Lisp_Object arrow_top = Qnil, arrow_bot = Qnil; Lisp_Object empty_pos; @@ -962,7 +970,7 @@ update_window_fringes (struct window *w, int keep_current_p) return 0; if (!MINI_WINDOW_P (w) - && (ind = BVAR (XBUFFER (w->buffer), indicate_buffer_boundaries), !NILP (ind))) + && (ind = BVAR (XBUFFER (w->contents), indicate_buffer_boundaries), !NILP (ind))) { if (EQ (ind, Qleft) || EQ (ind, Qright)) boundary_top = boundary_bot = arrow_top = arrow_bot = ind; @@ -1003,7 +1011,7 @@ update_window_fringes (struct window *w, int keep_current_p) { if (top_ind_rn < 0 && row->visible_height > 0) { - if (MATRIX_ROW_START_CHARPOS (row) <= BUF_BEGV (XBUFFER (w->buffer)) + if (MATRIX_ROW_START_CHARPOS (row) <= BUF_BEGV (XBUFFER (w->contents)) && !MATRIX_ROW_PARTIALLY_VISIBLE_AT_TOP_P (w, row)) row->indicate_bob_p = !NILP (boundary_top); else @@ -1013,7 +1021,7 @@ update_window_fringes (struct window *w, int keep_current_p) if (bot_ind_rn < 0) { - if (MATRIX_ROW_END_CHARPOS (row) >= BUF_ZV (XBUFFER (w->buffer)) + if (MATRIX_ROW_END_CHARPOS (row) >= BUF_ZV (XBUFFER (w->contents)) && !MATRIX_ROW_PARTIALLY_VISIBLE_AT_BOTTOM_P (w, row)) row->indicate_eob_p = !NILP (boundary_bot), bot_ind_rn = rn; else if (y + row->height >= yb) @@ -1023,7 +1031,7 @@ update_window_fringes (struct window *w, int keep_current_p) } } - empty_pos = BVAR (XBUFFER (w->buffer), indicate_empty_lines); + empty_pos = BVAR (XBUFFER (w->contents), indicate_empty_lines); if (!NILP (empty_pos) && !EQ (empty_pos, Qright)) empty_pos = WINDOW_LEFT_FRINGE_WIDTH (w) == 0 ? Qright : Qleft; @@ -1168,7 +1176,7 @@ update_window_fringes (struct window *w, int keep_current_p) int left, right; unsigned left_face_id, right_face_id; int left_offset, right_offset; - int periodic_p; + bool periodic_p; row = w->desired_matrix->rows + rn; cur = w->current_matrix->rows + rn; @@ -1284,7 +1292,7 @@ update_window_fringes (struct window *w, int keep_current_p) || periodic_p != cur->fringe_bitmap_periodic_p || cur->redraw_fringe_bitmaps_p) { - redraw_p = row->redraw_fringe_bitmaps_p = 1; + redraw_p = 1, row->redraw_fringe_bitmaps_p = 1; if (!keep_current_p) { cur->redraw_fringe_bitmaps_p = 1; @@ -1303,7 +1311,7 @@ update_window_fringes (struct window *w, int keep_current_p) if (row->overlay_arrow_bitmap != cur->overlay_arrow_bitmap) { - redraw_p = row->redraw_fringe_bitmaps_p = 1; + redraw_p = 1, row->redraw_fringe_bitmaps_p = 1; if (!keep_current_p) { cur->redraw_fringe_bitmaps_p = 1; @@ -1338,7 +1346,7 @@ update_window_fringes (struct window *w, int keep_current_p) */ void -compute_fringe_widths (struct frame *f, int redraw) +compute_fringe_widths (struct frame *f, bool redraw_p) { int o_left = FRAME_LEFT_FRINGE_WIDTH (f); int o_right = FRAME_RIGHT_FRINGE_WIDTH (f); @@ -1360,8 +1368,8 @@ compute_fringe_widths (struct frame *f, int redraw) if (left_fringe_width || right_fringe_width) { - int left_wid = left_fringe_width >= 0 ? left_fringe_width : -left_fringe_width; - int right_wid = right_fringe_width >= 0 ? right_fringe_width : -right_fringe_width; + int left_wid = eabs (left_fringe_width); + int right_wid = eabs (right_fringe_width); int conf_wid = left_wid + right_wid; int font_wid = FRAME_COLUMN_WIDTH (f); int cols = (left_wid + right_wid + font_wid-1) / font_wid; @@ -1409,7 +1417,7 @@ compute_fringe_widths (struct frame *f, int redraw) FRAME_FRINGE_COLS (f) = 0; } - if (redraw && FRAME_VISIBLE_P (f)) + if (redraw_p && FRAME_VISIBLE_P (f)) if (o_left != FRAME_LEFT_FRINGE_WIDTH (f) || o_right != FRAME_RIGHT_FRINGE_WIDTH (f) || o_cols != FRAME_FRINGE_COLS (f)) @@ -1519,7 +1527,7 @@ init_fringe_bitmap (int which, struct fringe_bitmap *fb, int once_p) | (swap_nibble[(b>>12) & 0xf])); b >>= (16 - fb->width); #ifdef WORDS_BIGENDIAN - b = ((b >> 8) | (b << 8)); + b = bswap_16 (b); #endif *bits++ = b; } @@ -1658,7 +1666,7 @@ If BITMAP already exists, the existing definition is replaced. */) Fput (bitmap, Qfringe, make_number (n)); } - fb.dynamic = 1; + fb.dynamic = true; xfb = xmalloc (sizeof fb + fb.height * BYTES_PER_BITMAP_ROW); fb.bits = b = (unsigned short *) (xfb + 1); @@ -1688,6 +1696,8 @@ If BITMAP already exists, the existing definition is replaced. */) DEFUN ("set-fringe-bitmap-face", Fset_fringe_bitmap_face, Sset_fringe_bitmap_face, 1, 2, 0, doc: /* Set face for fringe bitmap BITMAP to FACE. +FACE is merged with the `fringe' face, so normally FACE should specify +only the foreground color. If FACE is nil, reset face to default fringe face. */) (Lisp_Object bitmap, Lisp_Object face) { @@ -1861,5 +1871,3 @@ w32_reset_fringes (void) } #endif /* HAVE_NTGUI */ - -#endif /* HAVE_WINDOW_SYSTEM */