diff options
| author | Po Lu | 2022-01-26 01:20:48 +0000 |
|---|---|---|
| committer | Po Lu | 2022-01-26 01:20:48 +0000 |
| commit | bca68550844da7849ab33616345525918e82f3c8 (patch) | |
| tree | 36f25c960aa972e68053a38914f781b530f83c28 /src | |
| parent | 19c6fb16746718d94b9e316503c5779de88e2e2d (diff) | |
| download | emacs-bca68550844da7849ab33616345525918e82f3c8.tar.gz emacs-bca68550844da7849ab33616345525918e82f3c8.zip | |
Make `haiku-menu-bar-open' faster
* src/haikumenu.c (Fhaiku_menu_bar_open): Get draw lock before
updating the menu bar.
* src/haikuterm.c (haiku_read_socket): Don't update menu bar if
b->no_lock.
Diffstat (limited to 'src')
| -rw-r--r-- | src/haikumenu.c | 13 | ||||
| -rw-r--r-- | src/haikuterm.c | 28 |
2 files changed, 27 insertions, 14 deletions
diff --git a/src/haikumenu.c b/src/haikumenu.c index 3fee5831608..b73baf72e05 100644 --- a/src/haikumenu.c +++ b/src/haikumenu.c | |||
| @@ -644,17 +644,20 @@ the position of the last non-menu event instead. */) | |||
| 644 | struct frame *f = decode_window_system_frame (frame); | 644 | struct frame *f = decode_window_system_frame (frame); |
| 645 | 645 | ||
| 646 | if (FRAME_EXTERNAL_MENU_BAR (f)) | 646 | if (FRAME_EXTERNAL_MENU_BAR (f)) |
| 647 | set_frame_menubar (f, 1); | 647 | { |
| 648 | block_input (); | ||
| 649 | BView_draw_lock (FRAME_HAIKU_VIEW (f)); | ||
| 650 | set_frame_menubar (f, 1); | ||
| 651 | BMenuBar_start_tracking (FRAME_HAIKU_MENU_BAR (f)); | ||
| 652 | BView_draw_unlock (FRAME_HAIKU_VIEW (f)); | ||
| 653 | unblock_input (); | ||
| 654 | } | ||
| 648 | else | 655 | else |
| 649 | { | 656 | { |
| 650 | return call2 (Qpopup_menu, call0 (Qmouse_menu_bar_map), | 657 | return call2 (Qpopup_menu, call0 (Qmouse_menu_bar_map), |
| 651 | last_nonmenu_event); | 658 | last_nonmenu_event); |
| 652 | } | 659 | } |
| 653 | 660 | ||
| 654 | block_input (); | ||
| 655 | BMenuBar_start_tracking (FRAME_HAIKU_MENU_BAR (f)); | ||
| 656 | unblock_input (); | ||
| 657 | |||
| 658 | return Qnil; | 661 | return Qnil; |
| 659 | } | 662 | } |
| 660 | 663 | ||
diff --git a/src/haikuterm.c b/src/haikuterm.c index c8cc02a2988..e7d596cec3d 100644 --- a/src/haikuterm.c +++ b/src/haikuterm.c | |||
| @@ -3178,15 +3178,25 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) | |||
| 3178 | 3178 | ||
| 3179 | if (type == MENU_BAR_OPEN) | 3179 | if (type == MENU_BAR_OPEN) |
| 3180 | { | 3180 | { |
| 3181 | BView_draw_lock (FRAME_HAIKU_VIEW (f)); | 3181 | /* b->no_lock means that MenusBeginning was called |
| 3182 | /* This shouldn't be here, but nsmenu does it, so | 3182 | from the main thread, which means tracking was |
| 3183 | it should probably be safe. */ | 3183 | started manually, and we have already updated the |
| 3184 | int was_waiting_for_input_p = waiting_for_input; | 3184 | menu bar. */ |
| 3185 | if (waiting_for_input) | 3185 | if (!b->no_lock) |
| 3186 | waiting_for_input = 0; | 3186 | { |
| 3187 | set_frame_menubar (f, 1); | 3187 | BView_draw_lock (FRAME_HAIKU_VIEW (f)); |
| 3188 | waiting_for_input = was_waiting_for_input_p; | 3188 | /* This shouldn't be here, but nsmenu does it, so |
| 3189 | BView_draw_unlock (FRAME_HAIKU_VIEW (f)); | 3189 | it should probably be safe. */ |
| 3190 | int was_waiting_for_input_p = waiting_for_input; | ||
| 3191 | if (waiting_for_input) | ||
| 3192 | waiting_for_input = 0; | ||
| 3193 | set_frame_menubar (f, 1); | ||
| 3194 | waiting_for_input = was_waiting_for_input_p; | ||
| 3195 | BView_draw_unlock (FRAME_HAIKU_VIEW (f)); | ||
| 3196 | } | ||
| 3197 | |||
| 3198 | /* But set the flag anyway, because the menu will end | ||
| 3199 | from the window thread. */ | ||
| 3190 | FRAME_OUTPUT_DATA (f)->menu_bar_open_p = 1; | 3200 | FRAME_OUTPUT_DATA (f)->menu_bar_open_p = 1; |
| 3191 | popup_activated_p += 1; | 3201 | popup_activated_p += 1; |
| 3192 | 3202 | ||