[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#21473: 24.5; very slow tooltip display to sort-of-slow remote displa
From: |
Ken Raeburn |
Subject: |
bug#21473: 24.5; very slow tooltip display to sort-of-slow remote display |
Date: |
Mon, 14 Sep 2015 04:13:41 -0400 |
(“spun off” from discussion in bug #11822 that was wandering off topic)
I’ve noticed that when I’m using a “slow” network link — high bandwidth but a
round-trip time of 30-40 milliseconds (remember when that was fast?) — the
tooltip window that pops up when I move the mouse, say, over the buffer name in
the mode line, takes much longer to come up than when I’m running Emacs on a
local display. And if I keep moving the mouse around, I’m likely to get the
tooltip for the buffer-name part of the mode line, but displayed somewhere else
entirely, depending where the mouse has moved to.
Based on some earlier investigations, I used gdb to look at calls to _XReply in
the Xlib library; this is the routine that flushes the outgoing buffer to the X
server and then waits for a response, which contains color info or font info or
whatever else is wanted by the caller. It’s of interest because each such call
is going to require a round trip to the X server, and on a connection like
mine, will add 30ms of delay that cannot be removed without eliminating some of
the synchronous Xlib calls — e.g., fewer font queries or whatever. Of course
they can’t all be removed, but if some are pointless or redundant we may be
able to reduce the time spent waiting.
I ran such a test (“emacs -Q”, moving mouse over the buffer name; emacs 24.5,
X11, lucid toolkit) over a fast connection just to sort out what calls are
being made and from where. I found 160 calls to _XReply. Whatever else Emacs is
doing to display a tooltip window, on a connection with a 30ms RTT, that’ll
account for almost 4.8 seconds of delay. (“Almost", because I think a few of
those 160 calls are after the tooltip window was up, and I moved the mouse
away.) And, indeed, when I do the test without gdb but over the slower
connection, by eyeball I’d say it took about 5 seconds for the tooltip window
to pop up (including the normal tooltip delay), and the text didn’t all fill in
immediately.
In all, there were about 50 calls to XParseColor, slightly more to XAllocColor,
31 to XSync (used in error handling), and a handful of assorted other
synchronous calls.
The first thing that should’ve occurred to me is that the tooltip window is
treated like a frame; realize_basic_faces is called to realize 15 faces, the
default plus 14 named ones, each with foreground and background colors, and
each color needs XParseColor and XAllocColor both to make round trips to the X
server. Emacs looks up the color “lightyellow” for the background of the
default face, and for the background of the mode-line face, and for the
background of the mode-line-inactive face, etc., and “black” for foreground as
well. So there are 60 round trips (1.8s) right there.
Some of the other synchronous calls can be attributed to these operations:
12 x_create_tip_frame calls x_decode_color("black") 6 times
(XParseColor+XAllocColor) to initialize the foreground etc colors, just to keep
ref count management simpler
11 via various paths from x_set_mouse_color
10 via various paths from realize_face from lookup_face from
face_at_string_position from note_mode_line_or_margin_highlight from
note_mouse_highlight from note_mouse_movement
8 via various paths from realize_face from lookup_face from
face_at_buffer_position from handle_face_prop from handle_stop from
start_display from try_window from Fx_show_tip
8 via various paths from Fdisplay_supports_face_attributes_p realizing a face
6 via x_set_{foreground,background,border}_color when x_create_tip_frame sets
defaults
4 via x_set_cursor_color when x_create_tip_frame sets defaults
4 via x_set_cursor_color when face-set-after-frame-default updates parameters
16 via various paths from x_real_positions handling events during x_write_glyphs
12 via xfont_list_pattern called eventually from x_default_font_parameter twice
and face_at_string_position once
xfont_list_pattern, x_set_mouse_color, and x_real_position catch X errors using
x_catch_errors and friends, which keep invoking XSync and then looking to see
if any errors have been reported. In x_set_mouse_color, at least, we might be
able to use smarter X error handling to match request serial numbers against
errors and only sync once at the end, or something like that.
But given that 2/3 of the round trips are for XParseColor and XAllocColor, I
think they’re the place to start. I threw in a couple of simple caches (mapping
name=>RGB and RGB=>pixel) and wrapped the XParseColor call in x_defined_color
and the x_alloc_nearest_color_1 call in x_alloc_nearest_color with code to use
them; made x_copy_color an identity operation; and disabled freeing of colors
(my caches are really simple and don’t include reference counts). That
proof-of-concept version seems to have shaved a couple of seconds off the time
to pop up the tooltip, but it still takes around three seconds, and the text
still doesn’t fill in quickly.
I’m including below a summary of the stack traces I got from another run (list
of function names and number of times that call stack was seen), using the
sources from git as of September 9. The counts are a little different from the
previous run (total 176 round trips) but it looks largely similar. Another test
with those caches added in used only 72 round trips, of which 41 were XSync
calls, and all but one of those were about error checking; of the other 31, the
most frequent call was XQueryColors, which probably also could’ve been
satisfied from the caches.
Ken
28 _XReply « XParseColor « x_defined_color « defined_color « load_color2 «
load_face_colors « realize_x_face « realize_face « realize_named_face «
realize_basic_faces « init_frame_faces « x_create_tip_frame « Fx_show_tip «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « Fapply « Ffuncall « exec_byte_code « funcall_lambda
« Ffuncall
28 _XReply « XAllocColor « x_alloc_nearest_color_1 « x_defined_color «
defined_color « load_color2 « load_face_colors « realize_x_face « realize_face
« realize_named_face « realize_basic_faces « init_frame_faces «
x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall «
exec_byte_code « funcall_lambda
6 _XReply « XParseColor « x_defined_color « x_decode_color «
x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « call1 « timer_check_2 «
timer_check « readable_events « get_input_pending «
detect_input_pending_run_timers « wait_reading_process_output
6 _XReply « XAllocColor « x_alloc_nearest_color_1 « x_defined_color «
x_decode_color « x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
run_hook_with_args « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
Fapply « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « call1 «
timer_check_2 « timer_check « readable_events « get_input_pending «
detect_input_pending_run_timers
5 _XReply « XSync « x_check_errors « x_set_mouse_color «
x_set_frame_parameters « x_default_parameter « x_create_tip_frame « Fx_show_tip
« Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « Fapply « Ffuncall « exec_byte_code « funcall_lambda
« Ffuncall « call1 « timer_check_2 « timer_check « readable_events «
get_input_pending
4 _XReply « XSync « x_had_errors_p « x_real_pos_and_offsets «
x_real_positions « handle_one_xevent « XTread_socket « gobble_input «
handle_async_input « process_pending_signals « x_write_glyphs «
update_text_area « update_window_line « update_window « update_single_window «
Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall
2 _XReply « XTranslateCoordinates « x_real_pos_and_offsets «
x_real_positions « handle_one_xevent « XTread_socket « gobble_input «
handle_async_input « process_pending_signals « x_write_glyphs «
update_text_area « update_window_line « update_window « update_single_window «
Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall « exec_byte_code
2 _XReply « XSync « x_uncatch_errors « x_real_pos_and_offsets «
x_real_positions « handle_one_xevent « XTread_socket « gobble_input «
handle_async_input « process_pending_signals « x_write_glyphs «
update_text_area « update_window_line « update_window « update_single_window «
Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall
2 _XReply « XSync « x_uncatch_errors « xfont_list_pattern « xfont_list «
font_list_entities « font_find_for_lface « font_load_for_lface «
font_open_by_spec « font_open_by_name « x_default_font_parameter «
x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall
2 _XReply « XSync « x_uncatch_errors « get_current_wm_state «
x_net_wm_state « handle_one_xevent « XTread_socket « gobble_input «
handle_async_input « process_pending_signals « x_write_glyphs «
update_text_area « update_window_line « update_window « update_single_window «
Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall
2 _XReply « XSync « x_had_errors_p « x_wm_supports « do_ewmh_fullscreen «
x_check_fullscreen « handle_one_xevent « XTread_socket « gobble_input «
handle_async_input « process_pending_signals « x_write_glyphs «
update_text_area « update_window_line « update_window « update_single_window «
Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply
2 _XReply « XSync « x_had_errors_p « xfont_list_pattern « xfont_list «
font_list_entities « font_find_for_lface « font_load_for_lface «
font_open_by_spec « font_open_by_name « x_default_font_parameter «
x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall
2 _XReply « XSync « x_catch_errors « x_real_pos_and_offsets «
x_real_positions « handle_one_xevent « XTread_socket « gobble_input «
handle_async_input « process_pending_signals « x_write_glyphs «
update_text_area « update_window_line « update_window « update_single_window «
Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall
2 _XReply « XSync « x_catch_errors « xfont_list_pattern « xfont_list «
font_list_entities « font_find_for_lface « font_load_for_lface «
font_open_by_spec « font_open_by_name « x_default_font_parameter «
x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall
2 _XReply « XSync « x_catch_errors « get_current_wm_state «
x_net_wm_state « handle_one_xevent « XTread_socket « gobble_input «
handle_async_input « process_pending_signals « x_write_glyphs «
update_text_area « update_window_line « update_window « update_single_window «
Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall
2 _XReply « XQueryTree « x_real_pos_and_offsets « x_real_positions «
handle_one_xevent « XTread_socket « gobble_input « handle_async_input «
process_pending_signals « x_write_glyphs « update_text_area «
update_window_line « update_window « update_single_window « Fx_show_tip «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « Fapply « Ffuncall « exec_byte_code
2 _XReply « XParseColor « x_defined_color « defined_color « load_color2 «
load_face_colors « realize_x_face « realize_face « realize_default_face «
realize_basic_faces « init_frame_faces « x_create_tip_frame « Fx_show_tip «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « Fapply « Ffuncall « exec_byte_code « funcall_lambda
« Ffuncall
2 _XReply « XParseColor « x_defined_color « defined_color « load_color2 «
load_face_colors « realize_x_face « realize_face « lookup_face «
x_supports_face_attributes_p « Fdisplay_supports_face_attributes_p « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « call2 « x_create_tip_frame « Fx_show_tip « Ffuncall
« exec_byte_code « funcall_lambda
2 _XReply « XParseColor « x_defined_color « defined_color « load_color2 «
load_face_colors « realize_x_face « realize_face « lookup_face «
face_at_string_position « note_mode_line_or_margin_highlight «
note_mouse_highlight « note_mouse_movement « handle_one_xevent « XTread_socket
« gobble_input « handle_async_input « process_pending_signals « xg_select «
wait_reading_process_output « kbd_buffer_get_event « read_event_from_main_queue
« read_decoded_event_from_main_queue « read_char « read_key_sequence «
command_loop_1 « internal_condition_case « command_loop_2 « internal_catch «
command_loop
2 _XReply « XParseColor « x_defined_color « defined_color « load_color2 «
load_face_colors « realize_x_face « realize_face « lookup_face «
face_at_buffer_position « handle_face_prop « handle_stop « start_display «
try_window « Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall «
exec_byte_code
2 _XReply « XParseColor « x_defined_color « defined_color « load_color2 «
load_face_colors « realize_x_face « realize_face «
Finternal_merge_in_global_face « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « call2 « x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code
« funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
run_hook_with_args « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
Fapply « Ffuncall
2 _XReply « XListFonts « xfont_list_pattern « xfont_list «
font_list_entities « font_find_for_lface « font_load_for_lface «
font_open_by_spec « font_open_by_name « x_default_font_parameter «
x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « call1
2 _XReply « XGetWindowProperty « x_real_pos_and_offsets «
x_real_positions « handle_one_xevent « XTread_socket « gobble_input «
handle_async_input « process_pending_signals « x_write_glyphs «
update_text_area « update_window_line « update_window « update_single_window «
Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall « exec_byte_code
2 _XReply « XGetWindowProperty « get_current_wm_state « x_net_wm_state «
handle_one_xevent « XTread_socket « gobble_input « handle_async_input «
process_pending_signals « x_write_glyphs « update_text_area «
update_window_line « update_window « update_single_window « Fx_show_tip «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « Fapply « Ffuncall « exec_byte_code
2 _XReply « XGetGeometry « x_real_pos_and_offsets « x_real_positions «
handle_one_xevent « XTread_socket « gobble_input « handle_async_input «
process_pending_signals « x_write_glyphs « update_text_area «
update_window_line « update_window « update_single_window « Fx_show_tip «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « Fapply « Ffuncall « exec_byte_code
2 _XReply « XAllocColor « x_alloc_nearest_color_1 « x_defined_color «
defined_color « load_color2 « load_face_colors « realize_x_face « realize_face
« realize_default_face « realize_basic_faces « init_frame_faces «
x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall «
exec_byte_code « funcall_lambda
2 _XReply « XAllocColor « x_alloc_nearest_color_1 « x_defined_color «
defined_color « load_color2 « load_face_colors « realize_x_face « realize_face
« lookup_face « x_supports_face_attributes_p «
Fdisplay_supports_face_attributes_p « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « call2 « x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code
2 _XReply « XAllocColor « x_alloc_nearest_color_1 « x_defined_color «
defined_color « load_color2 « load_face_colors « realize_x_face « realize_face
« lookup_face « face_at_string_position « note_mode_line_or_margin_highlight «
note_mouse_highlight « note_mouse_movement « handle_one_xevent « XTread_socket
« gobble_input « handle_async_input « process_pending_signals « xg_select «
wait_reading_process_output « kbd_buffer_get_event « read_event_from_main_queue
« read_decoded_event_from_main_queue « read_char « read_key_sequence «
command_loop_1 « internal_condition_case « command_loop_2 « internal_catch
2 _XReply « XAllocColor « x_alloc_nearest_color_1 « x_defined_color «
defined_color « load_color2 « load_face_colors « realize_x_face « realize_face
« lookup_face « face_at_buffer_position « handle_face_prop « handle_stop «
start_display « try_window « Fx_show_tip « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
run_hook_with_args « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
Fapply « Ffuncall
2 _XReply « XAllocColor « x_alloc_nearest_color_1 « x_defined_color «
defined_color « load_color2 « load_face_colors « realize_x_face « realize_face
« Finternal_merge_in_global_face « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « call2 « x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code
« funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
run_hook_with_args « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
Fapply
2 _XReply « XAllocColor « x_alloc_nearest_color_1 « x_alloc_lighter_color
« x_setup_relief_color « x_setup_relief_colors « x_draw_glyph_string_box «
x_draw_glyph_string « draw_glyphs « draw_row_with_mouse_face « show_mouse_face
« note_mode_line_or_margin_highlight « note_mouse_highlight «
note_mouse_movement « handle_one_xevent « XTread_socket « gobble_input «
handle_async_input « process_pending_signals « xg_select «
wait_reading_process_output « kbd_buffer_get_event « read_event_from_main_queue
« read_decoded_event_from_main_queue « read_char « read_key_sequence «
command_loop_1 « internal_condition_case « command_loop_2 « internal_catch
2 _XReply « 0x00007ffff62c9df0 « XQueryColors « x_query_colors «
x_query_color « x_set_mouse_color « x_set_frame_parameters «
x_default_parameter « x_create_tip_frame « Fx_show_tip « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « Fapply « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
call1 « timer_check_2 « timer_check
2 _XReply « 0x00007ffff62c9df0 « XQueryColors « x_query_colors «
x_query_color « x_alloc_lighter_color « x_setup_relief_color «
x_setup_relief_colors « x_draw_glyph_string_box « x_draw_glyph_string «
draw_glyphs « draw_row_with_mouse_face « show_mouse_face «
note_mode_line_or_margin_highlight « note_mouse_highlight « note_mouse_movement
« handle_one_xevent « XTread_socket « gobble_input « handle_async_input «
process_pending_signals « xg_select « wait_reading_process_output «
kbd_buffer_get_event « read_event_from_main_queue «
read_decoded_event_from_main_queue « read_char « read_key_sequence «
command_loop_1 « internal_condition_case
2 _XReply « 0x00007ffff62c9df0 « XQueryColors « xftfont_get_colors «
xftfont_prepare_face « prepare_face_for_display « get_glyph_face_and_encoding «
fill_glyph_string « draw_glyphs « x_write_glyphs « update_text_area «
update_window_line « update_window « update_single_window « Fx_show_tip «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « Fapply « Ffuncall « exec_byte_code
1 _XReply « XSync « x_uncatch_errors « x_wm_supports « do_ewmh_fullscreen
« x_check_fullscreen « handle_one_xevent « XTread_socket « gobble_input «
handle_async_input « process_pending_signals « x_write_glyphs «
update_text_area « update_window_line « update_window « update_single_window «
Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply
1 _XReply « XSync « x_uncatch_errors « x_set_mouse_color «
x_set_frame_parameters « x_default_parameter « x_create_tip_frame « Fx_show_tip
« Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « Fapply « Ffuncall « exec_byte_code « funcall_lambda
« Ffuncall « call1 « timer_check_2 « timer_check « readable_events «
get_input_pending
1 _XReply « XSync « x_uncatch_errors « xfont_list_pattern « xfont_list «
font_list_entities « font_find_for_lface « font_load_for_lface « realize_x_face
« realize_face « lookup_face « x_supports_face_attributes_p «
Fdisplay_supports_face_attributes_p « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « call2 « x_create_tip_frame « Fx_show_tip « Ffuncall
1 _XReply « XSync « x_uncatch_errors « xfont_list_pattern « xfont_list «
font_list_entities « font_find_for_lface « font_load_for_lface « realize_x_face
« realize_face « lookup_face « face_at_string_position «
note_mode_line_or_margin_highlight « note_mouse_highlight « note_mouse_movement
« handle_one_xevent « XTread_socket « gobble_input « handle_async_input «
process_pending_signals « xg_select « wait_reading_process_output «
kbd_buffer_get_event « read_event_from_main_queue «
read_decoded_event_from_main_queue « read_char « read_key_sequence «
command_loop_1 « internal_condition_case « command_loop_2
1 _XReply « XSync « x_uncatch_errors « xfont_list_pattern « xfont_list «
font_list_entities « font_find_for_lface « font_load_for_lface « realize_x_face
« realize_face « lookup_face « face_at_buffer_position « handle_face_prop «
handle_stop « start_display « try_window « Fx_show_tip « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « Fapply
1 _XReply « XSync « x_uncatch_errors « get_current_wm_state «
do_ewmh_fullscreen « x_check_fullscreen « handle_one_xevent « XTread_socket «
gobble_input « handle_async_input « process_pending_signals « x_write_glyphs «
update_text_area « update_window_line « update_window « update_single_window «
Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply
1 _XReply « XSync « x_sync « x_wm_supports « do_ewmh_fullscreen «
x_check_fullscreen « handle_one_xevent « XTread_socket « gobble_input «
handle_async_input « process_pending_signals « x_write_glyphs «
update_text_area « update_window_line « update_window « update_single_window «
Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply
1 _XReply « XSync « x_had_errors_p « xfont_list_pattern « xfont_list «
font_list_entities « font_find_for_lface « font_load_for_lface « realize_x_face
« realize_face « lookup_face « x_supports_face_attributes_p «
Fdisplay_supports_face_attributes_p « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « call2 « x_create_tip_frame « Fx_show_tip « Ffuncall
1 _XReply « XSync « x_had_errors_p « xfont_list_pattern « xfont_list «
font_list_entities « font_find_for_lface « font_load_for_lface « realize_x_face
« realize_face « lookup_face « face_at_string_position «
note_mode_line_or_margin_highlight « note_mouse_highlight « note_mouse_movement
« handle_one_xevent « XTread_socket « gobble_input « handle_async_input «
process_pending_signals « xg_select « wait_reading_process_output «
kbd_buffer_get_event « read_event_from_main_queue «
read_decoded_event_from_main_queue « read_char « read_key_sequence «
command_loop_1 « internal_condition_case « command_loop_2
1 _XReply « XSync « x_had_errors_p « xfont_list_pattern « xfont_list «
font_list_entities « font_find_for_lface « font_load_for_lface « realize_x_face
« realize_face « lookup_face « face_at_buffer_position « handle_face_prop «
handle_stop « start_display « try_window « Fx_show_tip « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « Fapply
1 _XReply « XSync « x_catch_errors « x_wm_supports « do_ewmh_fullscreen «
x_check_fullscreen « handle_one_xevent « XTread_socket « gobble_input «
handle_async_input « process_pending_signals « x_write_glyphs «
update_text_area « update_window_line « update_window « update_single_window «
Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply
1 _XReply « XSync « x_catch_errors « x_set_mouse_color «
x_set_frame_parameters « x_default_parameter « x_create_tip_frame « Fx_show_tip
« Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « Fapply « Ffuncall « exec_byte_code « funcall_lambda
« Ffuncall « call1 « timer_check_2 « timer_check « readable_events «
get_input_pending
1 _XReply « XSync « x_catch_errors « xfont_list_pattern « xfont_list «
font_list_entities « font_find_for_lface « font_load_for_lface « realize_x_face
« realize_face « lookup_face « x_supports_face_attributes_p «
Fdisplay_supports_face_attributes_p « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « call2 « x_create_tip_frame « Fx_show_tip « Ffuncall
1 _XReply « XSync « x_catch_errors « xfont_list_pattern « xfont_list «
font_list_entities « font_find_for_lface « font_load_for_lface « realize_x_face
« realize_face « lookup_face « face_at_string_position «
note_mode_line_or_margin_highlight « note_mouse_highlight « note_mouse_movement
« handle_one_xevent « XTread_socket « gobble_input « handle_async_input «
process_pending_signals « xg_select « wait_reading_process_output «
kbd_buffer_get_event « read_event_from_main_queue «
read_decoded_event_from_main_queue « read_char « read_key_sequence «
command_loop_1 « internal_condition_case « command_loop_2
1 _XReply « XSync « x_catch_errors « xfont_list_pattern « xfont_list «
font_list_entities « font_find_for_lface « font_load_for_lface « realize_x_face
« realize_face « lookup_face « face_at_buffer_position « handle_face_prop «
handle_stop « start_display « try_window « Fx_show_tip « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « Fapply
1 _XReply « XSync « x_catch_errors « get_current_wm_state «
do_ewmh_fullscreen « x_check_fullscreen « handle_one_xevent « XTread_socket «
gobble_input « handle_async_input « process_pending_signals « x_write_glyphs «
update_text_area « update_window_line « update_window « update_single_window «
Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply
1 _XReply « XQueryPointer « compute_tip_xy « Fx_show_tip « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « Fapply « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
call1 « timer_check_2 « timer_check « readable_events « get_input_pending «
detect_input_pending_run_timers « wait_reading_process_output « sit_for «
read_char
1 _XReply « XParseColor « x_defined_color « x_decode_color «
x_set_mouse_color « x_set_frame_parameters « x_default_parameter «
x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « call1 « timer_check_2 «
timer_check « readable_events
1 _XReply « XParseColor « x_defined_color « x_decode_color «
x_set_foreground_color « x_set_frame_parameters « x_default_parameter «
x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « call1 « timer_check_2 «
timer_check « readable_events
1 _XReply « XParseColor « x_defined_color « x_decode_color «
x_set_cursor_color « x_set_frame_parameters « x_default_parameter «
x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « call1 « timer_check_2 «
timer_check « readable_events
1 _XReply « XParseColor « x_defined_color « x_decode_color «
x_set_cursor_color « x_set_frame_parameters « Fmodify_frame_parameters «
Finternal_set_lisp_face_attribute « Ffuncall « exec_byte_code « funcall_lambda
« Ffuncall « Fapply « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « call2 « x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code
« funcall_lambda « Ffuncall
1 _XReply « XParseColor « x_defined_color « x_decode_color «
x_set_border_color « x_set_frame_parameters « x_default_parameter «
x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « call1 « timer_check_2 «
timer_check « readable_events
1 _XReply « XParseColor « x_defined_color « x_decode_color «
x_set_background_color « x_set_frame_parameters « x_default_parameter «
x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args «
Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « call1 « timer_check_2 «
timer_check « readable_events
1 _XReply « XParseColor « x_defined_color « defined_color « load_color2 «
load_color « realize_x_face « realize_face « lookup_face «
face_at_string_position « note_mode_line_or_margin_highlight «
note_mouse_highlight « note_mouse_movement « handle_one_xevent « XTread_socket
« gobble_input « handle_async_input « process_pending_signals « xg_select «
wait_reading_process_output « kbd_buffer_get_event « read_event_from_main_queue
« read_decoded_event_from_main_queue « read_char « read_key_sequence «
command_loop_1 « internal_condition_case « command_loop_2 « internal_catch «
command_loop
1 _XReply « XListFonts « xfont_list_pattern « xfont_list «
font_list_entities « font_find_for_lface « font_load_for_lface « realize_x_face
« realize_face « lookup_face « x_supports_face_attributes_p «
Fdisplay_supports_face_attributes_p « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « call2 « x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code
1 _XReply « XListFonts « xfont_list_pattern « xfont_list «
font_list_entities « font_find_for_lface « font_load_for_lface « realize_x_face
« realize_face « lookup_face « face_at_string_position «
note_mode_line_or_margin_highlight « note_mouse_highlight « note_mouse_movement
« handle_one_xevent « XTread_socket « gobble_input « handle_async_input «
process_pending_signals « xg_select « wait_reading_process_output «
kbd_buffer_get_event « read_event_from_main_queue «
read_decoded_event_from_main_queue « read_char « read_key_sequence «
command_loop_1 « internal_condition_case « command_loop_2 « internal_catch
1 _XReply « XListFonts « xfont_list_pattern « xfont_list «
font_list_entities « font_find_for_lface « font_load_for_lface « realize_x_face
« realize_face « lookup_face « face_at_buffer_position « handle_face_prop «
handle_stop « start_display « try_window « Fx_show_tip « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « Fapply « Ffuncall
1 _XReply « XGetWindowProperty « x_wm_supports « do_ewmh_fullscreen «
x_check_fullscreen « handle_one_xevent « XTread_socket « gobble_input «
handle_async_input « process_pending_signals « x_write_glyphs «
update_text_area « update_window_line « update_window « update_single_window «
Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall
1 _XReply « XGetWindowProperty « get_current_wm_state «
do_ewmh_fullscreen « x_check_fullscreen « handle_one_xevent « XTread_socket «
gobble_input « handle_async_input « process_pending_signals « x_write_glyphs «
update_text_area « update_window_line « update_window « update_single_window «
Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall
1 _XReply « XGetSelectionOwner « Fx_selection_exists_p « Ffuncall «
exec_byte_code « Ffuncall « Fapply « Ffuncall « exec_byte_code « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « eval_sub « Feval «
internal_condition_case_1 « menu_item_eval_property « parse_tool_bar_item «
process_tool_bar_item « map_keymap_item « map_keymap_internal « map_keymap «
tool_bar_items « update_tool_bar « prepare_menu_bars « redisplay_internal «
redisplay_preserve_echo_area « detect_input_pending_run_timers «
wait_reading_process_output « sit_for
1 _XReply « XAllocColor « x_copy_color « x_set_cursor_color «
x_set_frame_parameters « x_default_parameter « x_create_tip_frame « Fx_show_tip
« Ffuncall « exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code «
funcall_lambda « Ffuncall « Fapply « Ffuncall « exec_byte_code « funcall_lambda
« Ffuncall « call1 « timer_check_2 « timer_check « readable_events «
get_input_pending
1 _XReply « XAllocColor « x_copy_color « x_set_cursor_color «
x_set_frame_parameters « Fmodify_frame_parameters «
Finternal_set_lisp_face_attribute « Ffuncall « exec_byte_code « funcall_lambda
« Ffuncall « Fapply « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « call2 « x_create_tip_frame « Fx_show_tip « Ffuncall « exec_byte_code
« funcall_lambda « Ffuncall « exec_byte_code
1 _XReply « XAllocColor « x_alloc_nearest_color_1 « x_defined_color «
x_decode_color « x_set_mouse_color « x_set_frame_parameters «
x_default_parameter « x_create_tip_frame « Fx_show_tip « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « Fapply « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
call1 « timer_check_2 « timer_check
1 _XReply « XAllocColor « x_alloc_nearest_color_1 « x_defined_color «
x_decode_color « x_set_foreground_color « x_set_frame_parameters «
x_default_parameter « x_create_tip_frame « Fx_show_tip « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « Fapply « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
call1 « timer_check_2 « timer_check
1 _XReply « XAllocColor « x_alloc_nearest_color_1 « x_defined_color «
x_decode_color « x_set_cursor_color « x_set_frame_parameters «
x_default_parameter « x_create_tip_frame « Fx_show_tip « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « Fapply « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
call1 « timer_check_2 « timer_check
1 _XReply « XAllocColor « x_alloc_nearest_color_1 « x_defined_color «
x_decode_color « x_set_cursor_color « x_set_frame_parameters «
Fmodify_frame_parameters « Finternal_set_lisp_face_attribute « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall « exec_byte_code
« funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « call2 « x_create_tip_frame «
Fx_show_tip « Ffuncall « exec_byte_code « funcall_lambda
1 _XReply « XAllocColor « x_alloc_nearest_color_1 « x_defined_color «
x_decode_color « x_set_border_color « x_set_frame_parameters «
x_default_parameter « x_create_tip_frame « Fx_show_tip « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « Fapply « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
call1 « timer_check_2 « timer_check
1 _XReply « XAllocColor « x_alloc_nearest_color_1 « x_defined_color «
x_decode_color « x_set_background_color « x_set_frame_parameters «
x_default_parameter « x_create_tip_frame « Fx_show_tip « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « Fapply « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
call1 « timer_check_2 « timer_check
1 _XReply « XAllocColor « x_alloc_nearest_color_1 « x_defined_color «
defined_color « load_color2 « load_color « realize_x_face « realize_face «
lookup_face « face_at_string_position « note_mode_line_or_margin_highlight «
note_mouse_highlight « note_mouse_movement « handle_one_xevent « XTread_socket
« gobble_input « handle_async_input « process_pending_signals « xg_select «
wait_reading_process_output « kbd_buffer_get_event « read_event_from_main_queue
« read_decoded_event_from_main_queue « read_char « read_key_sequence «
command_loop_1 « internal_condition_case « command_loop_2 « internal_catch
1 _XReply « 0x00007ffff62c9df0 « XQueryColors « x_query_colors «
x_query_color « x_copy_color « x_set_cursor_color « x_set_frame_parameters «
x_default_parameter « x_create_tip_frame « Fx_show_tip « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « run_hook_with_args « Ffuncall « exec_byte_code « funcall_lambda «
Ffuncall « Fapply « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
call1 « timer_check_2
1 _XReply « 0x00007ffff62c9df0 « XQueryColors « x_query_colors «
x_query_color « x_copy_color « x_set_cursor_color « x_set_frame_parameters «
Fmodify_frame_parameters « Finternal_set_lisp_face_attribute « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « Fapply « Ffuncall « exec_byte_code
« funcall_lambda « Ffuncall « exec_byte_code « funcall_lambda « Ffuncall «
exec_byte_code « funcall_lambda « Ffuncall « call2 « x_create_tip_frame «
Fx_show_tip « Ffuncall « exec_byte_code
1 _XReply « 0x00007ffff62c9df0 « XQueryColors « xftfont_get_colors «
xftfont_prepare_face « prepare_face_for_display « x_set_mouse_face_gc «
x_set_glyph_string_gc « x_draw_glyph_string « draw_glyphs «
draw_row_with_mouse_face « show_mouse_face « note_mode_line_or_margin_highlight
« note_mouse_highlight « note_mouse_movement « handle_one_xevent «
XTread_socket « gobble_input « handle_async_input « process_pending_signals «
xg_select « wait_reading_process_output « kbd_buffer_get_event «
read_event_from_main_queue « read_decoded_event_from_main_queue « read_char «
read_key_sequence « command_loop_1 « internal_condition_case « command_loop_2
1 _XReply « 0x00007ffff62c9df0 « XQueryColors « xftfont_get_colors «
xftfont_draw « x_draw_glyph_string_foreground « x_draw_glyph_string «
draw_glyphs « draw_row_with_mouse_face « show_mouse_face «
note_mode_line_or_margin_highlight « note_mouse_highlight « note_mouse_movement
« handle_one_xevent « XTread_socket « gobble_input « handle_async_input «
process_pending_signals « xg_select « wait_reading_process_output «
kbd_buffer_get_event « read_event_from_main_queue «
read_decoded_event_from_main_queue « read_char « read_key_sequence «
command_loop_1 « internal_condition_case « command_loop_2 « internal_catch «
command_loop
- bug#21473: 24.5; very slow tooltip display to sort-of-slow remote display,
Ken Raeburn <=