]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow non-system tooltips to display above menus on Haiku
authorPo Lu <luangruo@yahoo.com>
Tue, 18 Jan 2022 02:06:00 +0000 (02:06 +0000)
committerPo Lu <luangruo@yahoo.com>
Tue, 18 Jan 2022 02:06:00 +0000 (02:06 +0000)
* doc/emacs/haiku.texi (Haiku Basics): Document that tooltips
can now be displayed above the menu bar.

* lisp/tooltip.el (tooltip-show-help): Only display help text in
the echo area if Haiku system tooltips are enabled.

* src/haiku_support.cc (FlipBuffers): Stop flushing view.
* src/haikufns.c (Fx_show_tip): Fix a sizing bug leading to
tooltips needing two redisplays to display correctly.
* src/haikuterm.c (haiku_read_socket): Ignore resize events on
tooltips.

doc/emacs/haiku.texi
lisp/tooltip.el
src/haiku_support.cc
src/haikufns.c
src/haikuterm.c

index eeae379e06a3b1a9e2e8cb5ff8a74d581cdf6cef..6e38660fdb3ee35648161b0271f30a274fea0484 100644 (file)
@@ -92,9 +92,9 @@ not be able to display text properties or faces.  If you need those
 features, customize the variable @code{haiku-use-system-tooltips} to
 the nil value, and Emacs will use its own implementation of tooltips.
 
-  Both system tooltips and Emacs's own tooltips cannot display above
-the menu bar, so help text in the menu bar will display in the echo
-area instead.
+  System tooltips cannot display above the menu bar, so help text
+in the menu bar will display in the echo area instead when they are
+enabled.
 
 @cindex X resources on Haiku
   Unlike the X window system, Haiku does not have a system-wide
index b8590529597b8d4508c5df504dd22a6e4a5910a1..af6f456d7b5b63dee46bfb88c6a01decd03f18fe 100644 (file)
@@ -374,8 +374,10 @@ It is also called if Tooltip mode is on, for text-only displays."
   "Function installed as `show-help-function'.
 MSG is either a help string to display, or nil to cancel the display."
   (if (and (display-graphic-p)
-           (or (not (eq window-system 'haiku)) ;; On Haiku, there isn't a reliable way to show tooltips
-                                               ;; above menus.
+           ;; On Haiku, system tooltips can't be displayed above
+           ;; menus.
+           (or (not (and haiku-use-system-tooltips
+                         (eq window-system 'haiku)))
                (not (menu-or-popup-active-p))))
       (let ((previous-help tooltip-help-message))
        (setq tooltip-help-message msg)
index 22a977a4a69de8826cacc32552114fb7961647bc..2d6fd0381fc4a470f0ea00a8bbb8c063030b07af 100644 (file)
@@ -1320,7 +1320,6 @@ public:
     if (!offscreen_draw_view)
       gui_abort ("Failed to lock offscreen view during buffer flip");
 
-    offscreen_draw_view->Flush ();
     offscreen_draw_view->Sync ();
 
     EmacsWindow *w = (EmacsWindow *) Window ();
index c294f4e862cf6fb176ccfd4b808854f248c75dc5..4ab7fa83b57f349aeca4ab5cce027176d7a20632 100644 (file)
@@ -1903,10 +1903,6 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
   tip_last_string = string;
   tip_last_parms = parms;
 
-  /* Block input until the tip has been fully drawn, to avoid crashes
-     when drawing tips in menus.  */
-  block_input ();
-
   if (NILP (tip_frame) || !FRAME_LIVE_P (XFRAME (tip_frame)))
     {
       /* Add default values to frame parameters.  */
@@ -1998,20 +1994,24 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
   height = XFIXNUM (Fcdr (size)) + 2 * FRAME_INTERNAL_BORDER_WIDTH (tip_f);
   /* Calculate position of tooltip frame.  */
   compute_tip_xy (tip_f, parms, dx, dy, width, height, &root_x, &root_y);
+
+  block_input ();
+  BWindow_set_offset (FRAME_HAIKU_WINDOW (tip_f),
+                     root_x, root_y);
   BWindow_resize (FRAME_HAIKU_WINDOW (tip_f), width, height);
-  haiku_set_offset (tip_f, root_x, root_y, 1);
+  BView_resize_to (FRAME_HAIKU_VIEW (tip_f), width, height);
+  change_frame_size (tip_f, width, height, false, true, false);
   BWindow_set_tooltip_decoration (FRAME_HAIKU_WINDOW (tip_f));
-  BView_set_view_cursor (FRAME_HAIKU_VIEW (tip_f),
-                        FRAME_OUTPUT_DATA (XFRAME (frame))->current_cursor);
-  SET_FRAME_VISIBLE (tip_f, 1);
   BWindow_set_visible (FRAME_HAIKU_WINDOW (tip_f), 1);
   BWindow_sync (FRAME_HAIKU_WINDOW (tip_f));
+  SET_FRAME_VISIBLE (tip_f, 1);
+  unblock_input ();
+
   w->must_be_updated_p = true;
-  flush_frame (tip_f);
   update_single_window (w);
+
   set_buffer_internal_1 (old_buffer);
   unbind_to (count_1, Qnil);
-  unblock_input ();
   windows_or_buffers_changed = old_windows_or_buffers_changed;
 
  start_timer:
index cc4c3961ec4c023a0aedddb7cf9d01efbc6b5b43..60b59436b87a2e9a6771b314cf53b201fe367948 100644 (file)
@@ -2639,7 +2639,7 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
            struct haiku_resize_event *b = buf;
            struct frame *f = haiku_window_to_frame (b->window);
 
-           if (!f)
+           if (!f || FRAME_TOOLTIP_P (f))
              continue;
 
            int width = lrint (b->px_widthf);