]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix Haiku menu bars when redisplay happens immediately after activation
authorPo Lu <luangruo@yahoo.com>
Mon, 18 Apr 2022 00:50:15 +0000 (00:50 +0000)
committerPo Lu <luangruo@yahoo.com>
Mon, 18 Apr 2022 00:50:15 +0000 (00:50 +0000)
* src/haiku_support.cc (MessageReceived): Make `REPLAY_MENU_BAR'
messages synchronous.
(be_replay_menu_bar_event): Return whether or not the menu bar
really opened.
* src/haiku_support.h: Update prototypes.
* src/haikumenu.c (haiku_activate_menubar): Immediately activate
menu bar after replaying event.

src/haiku_support.cc
src/haiku_support.h
src/haikumenu.c

index 673ae02ac9cff4e802e1683c809e129b30c2a27e..1feea6c450221d6dc465bd780b6468e45350e5f2 100644 (file)
@@ -1335,7 +1335,7 @@ public:
 
        window->menus_begun = &menus_begun;
        set_mouse_position (pt.x, pt.y);
-       MouseDown (l);
+       BMenuBar::MouseDown (l);
        window->menus_begun = NULL;
 
        if (!menus_begun)
@@ -1345,8 +1345,19 @@ public:
       }
     else if (msg->what == REPLAY_MENU_BAR)
       {
+       window = (EmacsWindow *) Window ();
+       menus_begun = false;
+       window->menus_begun = &menus_begun;
+
        if (msg->FindPoint ("emacs:point", &pt) == B_OK)
          BMenuBar::MouseDown (pt);
+
+       window->menus_begun = NULL;
+
+       if (!menus_begun)
+         msg->SendReply (msg);
+       else
+         msg->SendReply (BE_MENU_BAR_OPEN);
       }
     else
       BMenuBar::MessageReceived (msg);
@@ -4261,14 +4272,17 @@ be_drag_and_drop_in_progress (void)
   return drag_and_drop_in_progress;
 }
 
-void
+/* Replay the menu bar click event EVENT.  Return whether or not the
+   menu bar actually opened.  */
+bool
 be_replay_menu_bar_event (void *menu_bar,
                          struct haiku_menu_bar_click_event *event)
 {
   BMenuBar *m = (BMenuBar *) menu_bar;
   BMessenger messenger (m);
-  BMessage msg (REPLAY_MENU_BAR);
+  BMessage reply, msg (REPLAY_MENU_BAR);
 
   msg.AddPoint ("emacs:point", BPoint (event->x, event->y));
-  messenger.SendMessage (&msg);
+  messenger.SendMessage (&msg, &reply);
+  return reply.what == BE_MENU_BAR_OPEN;
 }
index 6b285cf3e0acef2ccab32142f492ce54655112d8..4718be4f84af29366db738641a67f84c8c897ab3 100644 (file)
@@ -636,7 +636,7 @@ extern bool be_drag_message (void *, void *, bool, void (*) (void),
                             bool (*) (void));
 extern bool be_drag_and_drop_in_progress (void);
 
-extern void be_replay_menu_bar_event (void *, struct haiku_menu_bar_click_event *);
+extern bool be_replay_menu_bar_event (void *, struct haiku_menu_bar_click_event *);
 
 #ifdef __cplusplus
 extern void *find_appropriate_view_for_draw (void *);
index 46dde6496bb4374172f16a003a85543d173433ea..54ee3f160f69a53c9be893a3f0efbebc86fd8854 100644 (file)
@@ -783,11 +783,17 @@ haiku_activate_menubar (struct frame *f)
   if (FRAME_OUTPUT_DATA (f)->saved_menu_event)
     {
       block_input ();
-      be_replay_menu_bar_event (FRAME_HAIKU_MENU_BAR (f),
-                               FRAME_OUTPUT_DATA (f)->saved_menu_event);
+      rc = be_replay_menu_bar_event (FRAME_HAIKU_MENU_BAR (f),
+                                    FRAME_OUTPUT_DATA (f)->saved_menu_event);
       xfree (FRAME_OUTPUT_DATA (f)->saved_menu_event);
       FRAME_OUTPUT_DATA (f)->saved_menu_event = NULL;
       unblock_input ();
+
+      if (!rc)
+       return;
+
+      FRAME_OUTPUT_DATA (f)->menu_bar_open_p = 1;
+      popup_activated_p += 1;
     }
   else
     {