diff options
| author | Dmitry Antipov | 2013-09-06 12:49:14 +0400 |
|---|---|---|
| committer | Dmitry Antipov | 2013-09-06 12:49:14 +0400 |
| commit | 7f6c6450a1332c5bbff900fdeccea6d793970643 (patch) | |
| tree | 824362905443b243a566a9306d6e4c5db1393ba4 | |
| parent | 179923f74b3fca2aa27488297e6595beb76e0351 (diff) | |
| download | emacs-7f6c6450a1332c5bbff900fdeccea6d793970643.tar.gz emacs-7f6c6450a1332c5bbff900fdeccea6d793970643.zip | |
Attempt to make redisplay more selective when changing cursor type.
* frame.h (struct frame): New bitfield cursor_type_changed.
* xdisp.c (cursor_type_changed): Remove.
(try_cursor_movement, redisplay_window, try_window_id)
(set_frame_cursor_types, try_window_reusing_current_matrix):
Adjust to use per-frame bitfield.
(redisplay_internal): Look for cursor type change on each visible
frame and consider all frames if cursor type has been changed on
the frame other than selected. If cursor type has been changed on
selected frame only, do not use fast update.
| -rw-r--r-- | src/ChangeLog | 13 | ||||
| -rw-r--r-- | src/frame.h | 3 | ||||
| -rw-r--r-- | src/xdisp.c | 26 |
3 files changed, 30 insertions, 12 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index e7ac61b4fb4..2325b351217 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,5 +1,18 @@ | |||
| 1 | 2013-09-06 Dmitry Antipov <dmantipov@yandex.ru> | 1 | 2013-09-06 Dmitry Antipov <dmantipov@yandex.ru> |
| 2 | 2 | ||
| 3 | Attempt to make redisplay more selective when changing cursor type. | ||
| 4 | * frame.h (struct frame): New bitfield cursor_type_changed. | ||
| 5 | * xdisp.c (cursor_type_changed): Remove. | ||
| 6 | (try_cursor_movement, redisplay_window, try_window_id) | ||
| 7 | (set_frame_cursor_types, try_window_reusing_current_matrix): | ||
| 8 | Adjust to use per-frame bitfield. | ||
| 9 | (redisplay_internal): Look for cursor type change on each visible | ||
| 10 | frame and consider all frames if cursor type has been changed on | ||
| 11 | the frame other than selected. If cursor type has been changed on | ||
| 12 | selected frame only, do not use fast update. | ||
| 13 | |||
| 14 | 2013-09-06 Dmitry Antipov <dmantipov@yandex.ru> | ||
| 15 | |||
| 3 | Attempt to make redisplay more selective when changing fonts. | 16 | Attempt to make redisplay more selective when changing fonts. |
| 4 | * frame.h (struct frame): New bitfield fonts_changed. | 17 | * frame.h (struct frame): New bitfield fonts_changed. |
| 5 | * dispextern.h (fonts_changed_p, adjust_glyphs): Remove declaration. | 18 | * dispextern.h (fonts_changed_p, adjust_glyphs): Remove declaration. |
diff --git a/src/frame.h b/src/frame.h index 3c7499ea814..3dfbac15709 100644 --- a/src/frame.h +++ b/src/frame.h | |||
| @@ -214,6 +214,9 @@ struct frame | |||
| 214 | matrix adjustments. */ | 214 | matrix adjustments. */ |
| 215 | unsigned fonts_changed : 1; | 215 | unsigned fonts_changed : 1; |
| 216 | 216 | ||
| 217 | /* Nonzero means that cursor type has been changed. */ | ||
| 218 | unsigned cursor_type_changed : 1; | ||
| 219 | |||
| 217 | /* Margin at the top of the frame. Used to display the tool-bar. */ | 220 | /* Margin at the top of the frame. Used to display the tool-bar. */ |
| 218 | int tool_bar_lines; | 221 | int tool_bar_lines; |
| 219 | 222 | ||
diff --git a/src/xdisp.c b/src/xdisp.c index 36f7f1e503e..a7f7fc88198 100644 --- a/src/xdisp.c +++ b/src/xdisp.c | |||
| @@ -512,10 +512,6 @@ int update_mode_lines; | |||
| 512 | 512 | ||
| 513 | int windows_or_buffers_changed; | 513 | int windows_or_buffers_changed; |
| 514 | 514 | ||
| 515 | /* Nonzero means a frame's cursor type has been changed. */ | ||
| 516 | |||
| 517 | static int cursor_type_changed; | ||
| 518 | |||
| 519 | /* Nonzero after display_mode_line if %l was used and it displayed a | 515 | /* Nonzero after display_mode_line if %l was used and it displayed a |
| 520 | line number. */ | 516 | line number. */ |
| 521 | 517 | ||
| @@ -13010,6 +13006,10 @@ redisplay_internal (void) | |||
| 13010 | adjust_frame_glyphs (f); | 13006 | adjust_frame_glyphs (f); |
| 13011 | f->fonts_changed = 0; | 13007 | f->fonts_changed = 0; |
| 13012 | } | 13008 | } |
| 13009 | /* If cursor type has been changed on the frame | ||
| 13010 | other than selected, consider all frames. */ | ||
| 13011 | if (f != sf && f->cursor_type_changed) | ||
| 13012 | update_mode_lines++; | ||
| 13013 | } | 13013 | } |
| 13014 | clear_desired_matrices (f); | 13014 | clear_desired_matrices (f); |
| 13015 | } | 13015 | } |
| @@ -13059,8 +13059,7 @@ redisplay_internal (void) | |||
| 13059 | } | 13059 | } |
| 13060 | 13060 | ||
| 13061 | consider_all_windows_p = (update_mode_lines | 13061 | consider_all_windows_p = (update_mode_lines |
| 13062 | || buffer_shared_and_changed () | 13062 | || buffer_shared_and_changed ()); |
| 13063 | || cursor_type_changed); | ||
| 13064 | 13063 | ||
| 13065 | /* If specs for an arrow have changed, do thorough redisplay | 13064 | /* If specs for an arrow have changed, do thorough redisplay |
| 13066 | to ensure we remove any arrow that should no longer exist. */ | 13065 | to ensure we remove any arrow that should no longer exist. */ |
| @@ -13151,6 +13150,7 @@ redisplay_internal (void) | |||
| 13151 | && !current_buffer->prevent_redisplay_optimizations_p | 13150 | && !current_buffer->prevent_redisplay_optimizations_p |
| 13152 | && FRAME_VISIBLE_P (XFRAME (w->frame)) | 13151 | && FRAME_VISIBLE_P (XFRAME (w->frame)) |
| 13153 | && !FRAME_OBSCURED_P (XFRAME (w->frame)) | 13152 | && !FRAME_OBSCURED_P (XFRAME (w->frame)) |
| 13153 | && !XFRAME (w->frame)->cursor_type_changed | ||
| 13154 | /* Make sure recorded data applies to current buffer, etc. */ | 13154 | /* Make sure recorded data applies to current buffer, etc. */ |
| 13155 | && this_line_buffer == current_buffer | 13155 | && this_line_buffer == current_buffer |
| 13156 | && match_p | 13156 | && match_p |
| @@ -13419,6 +13419,7 @@ redisplay_internal (void) | |||
| 13419 | /* Update the display. */ | 13419 | /* Update the display. */ |
| 13420 | set_window_update_flags (XWINDOW (f->root_window), 1); | 13420 | set_window_update_flags (XWINDOW (f->root_window), 1); |
| 13421 | pending |= update_frame (f, 0, 0); | 13421 | pending |= update_frame (f, 0, 0); |
| 13422 | f->cursor_type_changed = 0; | ||
| 13422 | f->updated_p = 1; | 13423 | f->updated_p = 1; |
| 13423 | } | 13424 | } |
| 13424 | } | 13425 | } |
| @@ -13480,6 +13481,7 @@ redisplay_internal (void) | |||
| 13480 | 13481 | ||
| 13481 | XWINDOW (selected_window)->must_be_updated_p = 1; | 13482 | XWINDOW (selected_window)->must_be_updated_p = 1; |
| 13482 | pending = update_frame (sf, 0, 0); | 13483 | pending = update_frame (sf, 0, 0); |
| 13484 | sf->cursor_type_changed = 0; | ||
| 13483 | } | 13485 | } |
| 13484 | 13486 | ||
| 13485 | /* We may have called echo_area_display at the top of this | 13487 | /* We may have called echo_area_display at the top of this |
| @@ -13494,6 +13496,7 @@ redisplay_internal (void) | |||
| 13494 | { | 13496 | { |
| 13495 | XWINDOW (mini_window)->must_be_updated_p = 1; | 13497 | XWINDOW (mini_window)->must_be_updated_p = 1; |
| 13496 | pending |= update_frame (mini_frame, 0, 0); | 13498 | pending |= update_frame (mini_frame, 0, 0); |
| 13499 | mini_frame->cursor_type_changed = 0; | ||
| 13497 | if (!pending && hscroll_windows (mini_window)) | 13500 | if (!pending && hscroll_windows (mini_window)) |
| 13498 | goto retry; | 13501 | goto retry; |
| 13499 | } | 13502 | } |
| @@ -13534,7 +13537,6 @@ redisplay_internal (void) | |||
| 13534 | 13537 | ||
| 13535 | update_mode_lines = 0; | 13538 | update_mode_lines = 0; |
| 13536 | windows_or_buffers_changed = 0; | 13539 | windows_or_buffers_changed = 0; |
| 13537 | cursor_type_changed = 0; | ||
| 13538 | } | 13540 | } |
| 13539 | 13541 | ||
| 13540 | /* Start SIGIO interrupts coming again. Having them off during the | 13542 | /* Start SIGIO interrupts coming again. Having them off during the |
| @@ -14976,7 +14978,7 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp, int *scroll_ste | |||
| 14976 | cases. */ | 14978 | cases. */ |
| 14977 | && !update_mode_lines | 14979 | && !update_mode_lines |
| 14978 | && !windows_or_buffers_changed | 14980 | && !windows_or_buffers_changed |
| 14979 | && !cursor_type_changed | 14981 | && !f->cursor_type_changed |
| 14980 | /* Can't use this case if highlighting a region. When a | 14982 | /* Can't use this case if highlighting a region. When a |
| 14981 | region exists, cursor movement has to do more than just | 14983 | region exists, cursor movement has to do more than just |
| 14982 | set the cursor. */ | 14984 | set the cursor. */ |
| @@ -15972,7 +15974,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p) | |||
| 15972 | /* Redisplay the window. */ | 15974 | /* Redisplay the window. */ |
| 15973 | if (!current_matrix_up_to_date_p | 15975 | if (!current_matrix_up_to_date_p |
| 15974 | || windows_or_buffers_changed | 15976 | || windows_or_buffers_changed |
| 15975 | || cursor_type_changed | 15977 | || f->cursor_type_changed |
| 15976 | /* Don't use try_window_reusing_current_matrix in this case | 15978 | /* Don't use try_window_reusing_current_matrix in this case |
| 15977 | because it can have changed the buffer. */ | 15979 | because it can have changed the buffer. */ |
| 15978 | || !NILP (Vwindow_scroll_functions) | 15980 | || !NILP (Vwindow_scroll_functions) |
| @@ -16351,7 +16353,7 @@ try_window_reusing_current_matrix (struct window *w) | |||
| 16351 | /* Don't try to reuse the display if windows have been split | 16353 | /* Don't try to reuse the display if windows have been split |
| 16352 | or such. */ | 16354 | or such. */ |
| 16353 | || windows_or_buffers_changed | 16355 | || windows_or_buffers_changed |
| 16354 | || cursor_type_changed) | 16356 | || f->cursor_type_changed) |
| 16355 | return 0; | 16357 | return 0; |
| 16356 | 16358 | ||
| 16357 | /* Can't do this if region may have changed. */ | 16359 | /* Can't do this if region may have changed. */ |
| @@ -17122,7 +17124,7 @@ try_window_id (struct window *w) | |||
| 17122 | GIVE_UP (1); | 17124 | GIVE_UP (1); |
| 17123 | 17125 | ||
| 17124 | /* This flag is used to prevent redisplay optimizations. */ | 17126 | /* This flag is used to prevent redisplay optimizations. */ |
| 17125 | if (windows_or_buffers_changed || cursor_type_changed) | 17127 | if (windows_or_buffers_changed || f->cursor_type_changed) |
| 17126 | GIVE_UP (2); | 17128 | GIVE_UP (2); |
| 17127 | 17129 | ||
| 17128 | /* Verify that narrowing has not changed. | 17130 | /* Verify that narrowing has not changed. |
| @@ -25948,7 +25950,7 @@ set_frame_cursor_types (struct frame *f, Lisp_Object arg) | |||
| 25948 | FRAME_BLINK_OFF_CURSOR (f) = DEFAULT_CURSOR; | 25950 | FRAME_BLINK_OFF_CURSOR (f) = DEFAULT_CURSOR; |
| 25949 | 25951 | ||
| 25950 | /* Make sure the cursor gets redrawn. */ | 25952 | /* Make sure the cursor gets redrawn. */ |
| 25951 | cursor_type_changed = 1; | 25953 | f->cursor_type_changed = 1; |
| 25952 | } | 25954 | } |
| 25953 | 25955 | ||
| 25954 | 25956 | ||