emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 5bc3ed492b 5/5: Fix race conditions waiting for menu bar resize e


From: Po Lu
Subject: master 5bc3ed492b 5/5: Fix race conditions waiting for menu bar resize events on Haiku
Date: Sun, 17 Apr 2022 04:14:31 -0400 (EDT)

branch: master
commit 5bc3ed492bffa962ef326387f2476b66442a006c
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Fix race conditions waiting for menu bar resize events on Haiku
    
    * src/haikufns.c (haiku_create_frame, haiku_create_tip_frame):
    Clear `wait_for_event_type'.
    (haiku_set_menu_bar_lines): Clean up coding style.
    * src/haikuterm.c (haiku_wait_for_event): New function.
    (haiku_read_socket): Implement waiting for MENU_BAR_RESIZE
    events.
    * src/haikuterm.h (struct haiku_output): New field
    `wait_for_event_type'.
---
 src/haikufns.c  |  6 +++++-
 src/haikuterm.c | 45 +++++++++++++++++++++++++++++++++++++++++----
 src/haikuterm.h |  4 ++++
 3 files changed, 50 insertions(+), 5 deletions(-)

diff --git a/src/haikufns.c b/src/haikufns.c
index b040e6cafa..151874e26f 100644
--- a/src/haikufns.c
+++ b/src/haikufns.c
@@ -635,6 +635,7 @@ haiku_create_frame (Lisp_Object parms)
 
   f->output_method = output_haiku;
   f->output_data.haiku = xzalloc (sizeof *f->output_data.haiku);
+  f->output_data.haiku->wait_for_event_type = -1;
 
   fset_icon_name (f, gui_display_get_arg (dpyinfo, parms, Qicon_name,
                                           "iconName", "Title",
@@ -946,6 +947,7 @@ haiku_create_tip_frame (Lisp_Object parms)
      counts etc.  */
   f->output_method = output_haiku;
   f->output_data.haiku = xzalloc (sizeof *f->output_data.haiku);
+  f->output_data.haiku->wait_for_event_type = -1;
 
   f->tooltip = true;
   fset_icon_name (f, Qnil);
@@ -1264,9 +1266,11 @@ haiku_set_override_redirect (struct frame *f, 
Lisp_Object new_value,
 static void
 haiku_set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object 
oldval)
 {
+  int nlines;
+
   if (FRAME_TOOLTIP_P (f))
     return;
-  int nlines;
+
   if (TYPE_RANGED_FIXNUMP (int, value))
     nlines = XFIXNUM (value);
   else
diff --git a/src/haikuterm.c b/src/haikuterm.c
index 8499dad932..203bfa3f81 100644
--- a/src/haikuterm.c
+++ b/src/haikuterm.c
@@ -2766,6 +2766,40 @@ flush_dirty_back_buffers (void)
   unblock_input ();
 }
 
+/* N.B. that support for TYPE must be explictly added to
+   haiku_read_socket.  */
+void
+haiku_wait_for_event (struct frame *f, int type)
+{
+  int input_blocked_to;
+  object_wait_info info;
+  specpdl_ref depth;
+
+  input_blocked_to = interrupt_input_blocked;
+  info.object = port_application_to_emacs;
+  info.type = B_OBJECT_TYPE_PORT;
+  info.events = B_EVENT_READ;
+
+  depth = SPECPDL_INDEX ();
+  specbind (Qinhibit_quit, Qt);
+
+  FRAME_OUTPUT_DATA (f)->wait_for_event_type = type;
+
+  while (FRAME_OUTPUT_DATA (f)->wait_for_event_type == type)
+    {
+      if (wait_for_objects (&info, 1) < B_OK)
+       continue;
+
+      pending_signals = true;
+      /* This will call the read_socket_hook.  */
+      totally_unblock_input ();
+      interrupt_input_blocked = input_blocked_to;
+      info.events = B_EVENT_READ;
+    }
+
+  unbind_to (depth, Qnil);
+}
+
 static int
 haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
 {
@@ -3453,7 +3487,6 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
 
            break;
          }
-
        case MENU_BAR_RESIZE:
          {
            struct haiku_menu_bar_resize_event *b = buf;
@@ -3462,13 +3495,17 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
            if (!f || !FRAME_EXTERNAL_MENU_BAR (f))
              continue;
 
+           if (FRAME_OUTPUT_DATA (f)->wait_for_event_type
+               == MENU_BAR_RESIZE)
+             FRAME_OUTPUT_DATA (f)->wait_for_event_type = -1;
+
            int old_height = FRAME_MENU_BAR_HEIGHT (f);
 
            FRAME_MENU_BAR_HEIGHT (f) = b->height + 1;
-           FRAME_MENU_BAR_LINES (f) =
-             (b->height + FRAME_LINE_HEIGHT (f)) / FRAME_LINE_HEIGHT (f);
+           FRAME_MENU_BAR_LINES (f)
+             = (b->height + FRAME_LINE_HEIGHT (f)) / FRAME_LINE_HEIGHT (f);
 
-           if (old_height != b->height)
+           if (old_height != b->height + 1)
              {
                adjust_frame_size (f, -1, -1, 3, true, Qmenu_bar_lines);
                haiku_clear_under_internal_border (f);
diff --git a/src/haikuterm.h b/src/haikuterm.h
index df4e7d47e8..903a21d29f 100644
--- a/src/haikuterm.h
+++ b/src/haikuterm.h
@@ -179,6 +179,9 @@ struct haiku_output
 
   /* If non-NULL, the last menu bar click event received.  */
   struct haiku_menu_bar_click_event *saved_menu_event;
+
+  /* The type of any event that's being waited for.  */
+  int wait_for_event_type;
 };
 
 struct x_output
@@ -295,6 +298,7 @@ extern Lisp_Object haiku_menu_show (struct frame *, int, 
int, int,
                                    Lisp_Object, const char **);
 extern Lisp_Object haiku_popup_dialog (struct frame *, Lisp_Object, 
Lisp_Object);
 extern void haiku_activate_menubar (struct frame *);
+extern void haiku_wait_for_event (struct frame *, int);
 extern void haiku_note_drag_motion (void);
 
 extern void initialize_frame_menubar (struct frame *);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]