summaryrefslogtreecommitdiff
path: root/src/xfns.c
diff options
context:
space:
mode:
authorMartin Rudalics <rudalics@gmx.at>2018-02-10 10:18:38 +0100
committerMartin Rudalics <rudalics@gmx.at>2018-02-10 10:18:38 +0100
commit479f51a63bb0de72453881d72a1b3ff5f30b4658 (patch)
tree2dfd86cd245bc11954b933f2e99670aa3b42b4ee /src/xfns.c
parent2c980ea613115f5c2858e172f3bf9be103439a46 (diff)
downloademacs-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.c72
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