From 479f51a63bb0de72453881d72a1b3ff5f30b4658 Mon Sep 17 00:00:00 2001 From: Martin Rudalics Date: Sat, 10 Feb 2018 10:18:38 +0100 Subject: 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). --- src/xfns.c | 72 +++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 41 insertions(+), 31 deletions(-) (limited to 'src/xfns.c') 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 -- cgit v1.2.1