diff options
author | Martin Rudalics <rudalics@gmx.at> | 2018-02-10 10:18:38 +0100 |
---|---|---|
committer | Martin Rudalics <rudalics@gmx.at> | 2018-02-10 10:18:38 +0100 |
commit | 479f51a63bb0de72453881d72a1b3ff5f30b4658 (patch) | |
tree | 2dfd86cd245bc11954b933f2e99670aa3b42b4ee /src/xfns.c | |
parent | 2c980ea613115f5c2858e172f3bf9be103439a46 (diff) | |
download | emacs-479f51a63bb0de72453881d72a1b3ff5f30b4658.tar.gz |
Make tooltip code handle scenarios from Bug#30182 and Bug#30399
Move calculation of the mode line default help echo from
note_mode_line_or_margin_highlight to display_mode_lines
(Bug#30182). Fix cursor type for dragging the mode line.
Normalize FRAME argument of Fx_show_tip before assigning it to
tip_last_frame and handle the transition from GTK+ to Emacs
tooltips and vice-versa in x_hide_tip (Bug#30399).
* src/window.h (struct window): New Lisp member
mode_line_help_echo.
(wset_mode_line_help_echo): New function.
* src/w32fns.c (Fx_show_tip): Normalize the FRAME argument
bevore storing it in tip_last_frame (Bug#30399).
* src/xdisp.c (display_mode_lines): Calculate mode line
default help echo string here and store it in the window's
mode_line_help_echo slot (Bug#30182).
(note_mode_line_or_margin_highlight): Use value in window's
mode_line_help_echo slot as mode line default help echo. When
the window is resizable show a vertical drag cursor instead of
the vertical scroll bar cursor.
* src/xfns.c (x_hide_tip): Rewrite the GTK+ part to correctly
handle the transition from GTK+ system to Emacs tooltips and
vice-versa (Bug#30399).
(Fx_show_tip): Normalize the FRAME argument bevore storing it
in tip_last_frame (Bug#30399).
Diffstat (limited to 'src/xfns.c')
-rw-r--r-- | src/xfns.c | 72 |
1 files changed, 41 insertions, 31 deletions
diff --git a/src/xfns.c b/src/xfns.c index db1ce311021..9f0d9468c14 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -6077,7 +6077,7 @@ static Lisp_Object tip_timer; /* STRING argument of last `x-show-tip' call. */ static Lisp_Object tip_last_string; -/* FRAME argument of last `x-show-tip' call. */ +/* Normalized FRAME argument of last `x-show-tip' call. */ static Lisp_Object tip_last_frame; /* PARMS argument of last `x-show-tip' call. */ @@ -6542,16 +6542,20 @@ x_hide_tip (bool delete) } #ifdef USE_GTK - /* The GTK+ system tooltip window can be found via the x_output - structure of tip_last_frame, if it still exists. */ - if (x_gtk_use_system_tooltips && NILP (tip_last_frame)) - return Qnil; - else if (!x_gtk_use_system_tooltips - && (NILP (tip_frame) - || (!delete - && FRAMEP (tip_frame) - && FRAME_LIVE_P (XFRAME (tip_frame)) - && !FRAME_VISIBLE_P (XFRAME (tip_frame))))) + /* Any GTK+ system tooltip can be found via the x_output structure of + tip_last_frame, provided that frame is still live. Any Emacs + tooltip is found via the tip_frame variable. Note that the current + value of x_gtk_use_system_tooltips might not be the same as used + for the tooltip we have to hide, see Bug#30399. */ + if ((NILP (tip_last_frame) && NILP (tip_frame)) + || (!x_gtk_use_system_tooltips + && !delete + && FRAMEP (tip_frame) + && FRAME_LIVE_P (XFRAME (tip_frame)) + && !FRAME_VISIBLE_P (XFRAME (tip_frame)))) + /* Either there's no tooltip to hide or it's an already invisible + Emacs tooltip and we don't want to change its type. Return + quickly. */ return Qnil; else { @@ -6562,10 +6566,9 @@ x_hide_tip (bool delete) specbind (Qinhibit_redisplay, Qt); specbind (Qinhibit_quit, Qt); - if (x_gtk_use_system_tooltips) + /* Try to hide the GTK+ system tip first. */ + if (FRAMEP (tip_last_frame)) { - /* The GTK+ system tooltip window is stored in the x_output - structure of tip_last_frame. */ struct frame *f = XFRAME (tip_last_frame); if (FRAME_LIVE_P (f)) @@ -6573,33 +6576,37 @@ x_hide_tip (bool delete) if (xg_hide_tooltip (f)) was_open = Qt; } - else - tip_last_frame = Qnil; } - else + + /* Reset tip_last_frame, it will be reassigned when showing the + next GTK+ system tooltip. */ + tip_last_frame = Qnil; + + /* Now look whether there's an Emacs tip around. */ + if (FRAMEP (tip_frame)) { - if (FRAMEP (tip_frame)) - { - struct frame *f = XFRAME (tip_frame); + struct frame *f = XFRAME (tip_frame); - if (FRAME_LIVE_P (f)) + if (FRAME_LIVE_P (f)) + { + if (delete || x_gtk_use_system_tooltips) { - if (delete) - { - delete_frame (tip_frame, Qnil); - tip_frame = Qnil; - } - else - x_make_frame_invisible (f); - - was_open = Qt; + /* Delete the Emacs tooltip frame when DELETE is true + or we change the tooltip type from an Emacs one to + a GTK+ system one. */ + delete_frame (tip_frame, Qnil); + tip_frame = Qnil; } else - tip_frame = Qnil; + x_make_frame_invisible (f); + + was_open = Qt; } else tip_frame = Qnil; } + else + tip_frame = Qnil; return unbind_to (count, was_open); } @@ -6721,7 +6728,10 @@ Text larger than the specified size is clipped. */) if (SCHARS (string) == 0) string = make_unibyte_string (" ", 1); + if (NILP (frame)) + frame = selected_frame; f = decode_window_system_frame (frame); + if (NILP (timeout)) timeout = make_number (5); else |