diff options
| author | YAMAMOTO Mitsuharu | 2011-05-25 12:06:05 +0900 |
|---|---|---|
| committer | YAMAMOTO Mitsuharu | 2011-05-25 12:06:05 +0900 |
| commit | e61124cd850ad6e0fc511dc995031db77b3535cd (patch) | |
| tree | 6c43a8bbdecf4dce4f8c815af831e46a4a503a57 /src/fringe.c | |
| parent | 964b0e76b0c609ddd0dd71b7ab7c7c44627ec044 (diff) | |
| download | emacs-e61124cd850ad6e0fc511dc995031db77b3535cd.tar.gz emacs-e61124cd850ad6e0fc511dc995031db77b3535cd.zip | |
Take account of periodic fringe bitmap's dependency on y-position in redrawing.
* dispextern.h (struct glyph_row): New member fringe_bitmap_periodic_p.
* dispnew.c (shift_glyph_matrix, scrolling_window): Mark scrolled row
for fringe update if it has periodic bitmap.
(row_equal_p): Also compare left_fringe_offset, right_fringe_offset,
and fringe_bitmap_periodic_p.
* fringe.c (get_fringe_bitmap_data): New function.
(draw_fringe_bitmap_1, update_window_fringes): Use it.
(update_window_fringes): Record periodicity of fringe bitmap in glyph
row. Mark glyph row for fringe update if periodicity changed.
* xdisp.c (try_window_reusing_current_matrix): Don't mark scrolled row
for fringe update unless it has periodic bitmap.
Diffstat (limited to 'src/fringe.c')
| -rw-r--r-- | src/fringe.c | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/src/fringe.c b/src/fringe.c index 880fe2c6e42..e160353914e 100644 --- a/src/fringe.c +++ b/src/fringe.c | |||
| @@ -541,6 +541,20 @@ get_fringe_bitmap_name (bn) | |||
| 541 | return num; | 541 | return num; |
| 542 | } | 542 | } |
| 543 | 543 | ||
| 544 | /* Get fringe bitmap data for bitmap number BN. */ | ||
| 545 | |||
| 546 | static struct fringe_bitmap * | ||
| 547 | get_fringe_bitmap_data (int bn) | ||
| 548 | { | ||
| 549 | struct fringe_bitmap *fb; | ||
| 550 | |||
| 551 | fb = fringe_bitmaps[bn]; | ||
| 552 | if (fb == NULL) | ||
| 553 | fb = &standard_bitmaps[bn < MAX_STANDARD_FRINGE_BITMAPS | ||
| 554 | ? bn : UNDEF_FRINGE_BITMAP]; | ||
| 555 | |||
| 556 | return fb; | ||
| 557 | } | ||
| 544 | 558 | ||
| 545 | /* Draw the bitmap WHICH in one of the left or right fringes of | 559 | /* Draw the bitmap WHICH in one of the left or right fringes of |
| 546 | window W. ROW is the glyph row for which to display the bitmap; it | 560 | window W. ROW is the glyph row for which to display the bitmap; it |
| @@ -593,10 +607,7 @@ draw_fringe_bitmap_1 (w, row, left_p, overlay, which) | |||
| 593 | face_id = FRINGE_FACE_ID; | 607 | face_id = FRINGE_FACE_ID; |
| 594 | } | 608 | } |
| 595 | 609 | ||
| 596 | fb = fringe_bitmaps[which]; | 610 | fb = get_fringe_bitmap_data (which); |
| 597 | if (fb == NULL) | ||
| 598 | fb = &standard_bitmaps[which < MAX_STANDARD_FRINGE_BITMAPS | ||
| 599 | ? which : UNDEF_FRINGE_BITMAP]; | ||
| 600 | 611 | ||
| 601 | period = fb->period; | 612 | period = fb->period; |
| 602 | 613 | ||
| @@ -1075,12 +1086,8 @@ update_window_fringes (w, keep_current_p) | |||
| 1075 | 1086 | ||
| 1076 | if (bn != NO_FRINGE_BITMAP) | 1087 | if (bn != NO_FRINGE_BITMAP) |
| 1077 | { | 1088 | { |
| 1078 | struct fringe_bitmap *fb; | 1089 | struct fringe_bitmap *fb = get_fringe_bitmap_data (bn); |
| 1079 | 1090 | ||
| 1080 | fb = fringe_bitmaps[bn]; | ||
| 1081 | if (fb == NULL) | ||
| 1082 | fb = &standard_bitmaps[bn < MAX_STANDARD_FRINGE_BITMAPS | ||
| 1083 | ? bn : UNDEF_FRINGE_BITMAP]; | ||
| 1084 | if (fb->align == ALIGN_BITMAP_TOP && fb->period == 0) | 1091 | if (fb->align == ALIGN_BITMAP_TOP && fb->period == 0) |
| 1085 | { | 1092 | { |
| 1086 | struct glyph_row *row1; | 1093 | struct glyph_row *row1; |
| @@ -1134,12 +1141,8 @@ update_window_fringes (w, keep_current_p) | |||
| 1134 | 1141 | ||
| 1135 | if (bn != NO_FRINGE_BITMAP) | 1142 | if (bn != NO_FRINGE_BITMAP) |
| 1136 | { | 1143 | { |
| 1137 | struct fringe_bitmap *fb; | 1144 | struct fringe_bitmap *fb = get_fringe_bitmap_data (bn); |
| 1138 | 1145 | ||
| 1139 | fb = fringe_bitmaps[bn]; | ||
| 1140 | if (fb == NULL) | ||
| 1141 | fb = &standard_bitmaps[bn < MAX_STANDARD_FRINGE_BITMAPS | ||
| 1142 | ? bn : UNDEF_FRINGE_BITMAP]; | ||
| 1143 | if (fb->align == ALIGN_BITMAP_BOTTOM && fb->period == 0) | 1146 | if (fb->align == ALIGN_BITMAP_BOTTOM && fb->period == 0) |
| 1144 | { | 1147 | { |
| 1145 | struct glyph_row *row1; | 1148 | struct glyph_row *row1; |
| @@ -1175,6 +1178,7 @@ update_window_fringes (w, keep_current_p) | |||
| 1175 | int left, right; | 1178 | int left, right; |
| 1176 | unsigned left_face_id, right_face_id; | 1179 | unsigned left_face_id, right_face_id; |
| 1177 | int left_offset, right_offset; | 1180 | int left_offset, right_offset; |
| 1181 | int periodic_p; | ||
| 1178 | 1182 | ||
| 1179 | row = w->desired_matrix->rows + rn; | 1183 | row = w->desired_matrix->rows + rn; |
| 1180 | cur = w->current_matrix->rows + rn; | 1184 | cur = w->current_matrix->rows + rn; |
| @@ -1183,6 +1187,7 @@ update_window_fringes (w, keep_current_p) | |||
| 1183 | 1187 | ||
| 1184 | left_face_id = right_face_id = DEFAULT_FACE_ID; | 1188 | left_face_id = right_face_id = DEFAULT_FACE_ID; |
| 1185 | left_offset = right_offset = 0; | 1189 | left_offset = right_offset = 0; |
| 1190 | periodic_p = 0; | ||
| 1186 | 1191 | ||
| 1187 | /* Decide which bitmap to draw in the left fringe. */ | 1192 | /* Decide which bitmap to draw in the left fringe. */ |
| 1188 | if (WINDOW_LEFT_FRINGE_WIDTH (w) == 0) | 1193 | if (WINDOW_LEFT_FRINGE_WIDTH (w) == 0) |
| @@ -1270,6 +1275,9 @@ update_window_fringes (w, keep_current_p) | |||
| 1270 | else | 1275 | else |
| 1271 | right = NO_FRINGE_BITMAP; | 1276 | right = NO_FRINGE_BITMAP; |
| 1272 | 1277 | ||
| 1278 | periodic_p = (get_fringe_bitmap_data (left)->period != 0 | ||
| 1279 | || get_fringe_bitmap_data (right)->period != 0); | ||
| 1280 | |||
| 1273 | if (row->y != cur->y | 1281 | if (row->y != cur->y |
| 1274 | || row->visible_height != cur->visible_height | 1282 | || row->visible_height != cur->visible_height |
| 1275 | || row->ends_at_zv_p != cur->ends_at_zv_p | 1283 | || row->ends_at_zv_p != cur->ends_at_zv_p |
| @@ -1279,6 +1287,7 @@ update_window_fringes (w, keep_current_p) | |||
| 1279 | || right_face_id != cur->right_fringe_face_id | 1287 | || right_face_id != cur->right_fringe_face_id |
| 1280 | || left_offset != cur->left_fringe_offset | 1288 | || left_offset != cur->left_fringe_offset |
| 1281 | || right_offset != cur->right_fringe_offset | 1289 | || right_offset != cur->right_fringe_offset |
| 1290 | || periodic_p != cur->fringe_bitmap_periodic_p | ||
| 1282 | || cur->redraw_fringe_bitmaps_p) | 1291 | || cur->redraw_fringe_bitmaps_p) |
| 1283 | { | 1292 | { |
| 1284 | redraw_p = row->redraw_fringe_bitmaps_p = 1; | 1293 | redraw_p = row->redraw_fringe_bitmaps_p = 1; |
| @@ -1291,6 +1300,7 @@ update_window_fringes (w, keep_current_p) | |||
| 1291 | cur->right_fringe_face_id = right_face_id; | 1300 | cur->right_fringe_face_id = right_face_id; |
| 1292 | cur->left_fringe_offset = left_offset; | 1301 | cur->left_fringe_offset = left_offset; |
| 1293 | cur->right_fringe_offset = right_offset; | 1302 | cur->right_fringe_offset = right_offset; |
| 1303 | cur->fringe_bitmap_periodic_p = periodic_p; | ||
| 1294 | } | 1304 | } |
| 1295 | } | 1305 | } |
| 1296 | 1306 | ||
| @@ -1309,6 +1319,7 @@ update_window_fringes (w, keep_current_p) | |||
| 1309 | row->right_fringe_face_id = right_face_id; | 1319 | row->right_fringe_face_id = right_face_id; |
| 1310 | row->left_fringe_offset = left_offset; | 1320 | row->left_fringe_offset = left_offset; |
| 1311 | row->right_fringe_offset = right_offset; | 1321 | row->right_fringe_offset = right_offset; |
| 1322 | row->fringe_bitmap_periodic_p = periodic_p; | ||
| 1312 | } | 1323 | } |
| 1313 | 1324 | ||
| 1314 | return redraw_p && !keep_current_p; | 1325 | return redraw_p && !keep_current_p; |