From c62af7064d2a59b569ad52c45fe19fbc6806a0d4 Mon Sep 17 00:00:00 2001
From: John Scipione <jscipione@gmail.com>
Date: Mon, 25 Feb 2013 18:15:30 -0500
Subject: [PATCH] Use LockLooper() in BMenuBar::_Track() which is atomic.
instead of Window()->Lock() which is not.
---
src/kits/interface/MenuBar.cpp | 22 ++++++++++------------
1 files changed, 10 insertions(+), 12 deletions(-)
diff --git a/src/kits/interface/MenuBar.cpp b/src/kits/interface/MenuBar.cpp
index 8c7dc13..4ae163f 100644
a
|
b
|
BMenuBar::_Track(int32* action, int32 startIndex, bool showMenu)
|
557 | 557 | { |
558 | 558 | // TODO: Cleanup, merge some "if" blocks if possible |
559 | 559 | fChosenItem = NULL; |
560 | | |
561 | | BWindow* window = Window(); |
562 | 560 | fState = MENU_STATE_TRACKING; |
563 | 561 | |
564 | 562 | BPoint where; |
565 | 563 | uint32 buttons; |
566 | | if (window->Lock()) { |
| 564 | if (LockLooper()) { |
567 | 565 | if (startIndex != -1) { |
568 | 566 | be_app->ObscureCursor(); |
569 | 567 | _SelectItem(ItemAt(startIndex), true, false); |
570 | 568 | } |
571 | 569 | GetMouse(&where, &buttons); |
572 | | window->Unlock(); |
| 570 | UnlockLooper(); |
573 | 571 | } |
574 | 572 | |
575 | 573 | while (fState != MENU_STATE_CLOSED) { |
576 | 574 | bigtime_t snoozeAmount = 40000; |
577 | | if (Window() == NULL || !window->Lock()) |
| 575 | if (Window() == NULL || !LockLooper()) |
578 | 576 | break; |
579 | 577 | |
580 | 578 | BMenuItem* menuItem = NULL; |
… |
… |
BMenuBar::_Track(int32* action, int32 startIndex, bool showMenu)
|
587 | 585 | // call _Track() from the selected sub-menu when the mouse cursor |
588 | 586 | // is over its window |
589 | 587 | BMenu* menu = fSelected->Submenu(); |
590 | | window->Unlock(); |
| 588 | UnlockLooper(); |
591 | 589 | snoozeAmount = 30000; |
592 | 590 | bool wasSticky = _IsStickyMode(); |
593 | 591 | menu->_SetStickyMode(wasSticky); |
… |
… |
BMenuBar::_Track(int32* action, int32 startIndex, bool showMenu)
|
602 | 600 | // where to store the current mouse position ? |
603 | 601 | // (Or just use the BView mouse hooks) |
604 | 602 | BPoint newWhere; |
605 | | if (window->Lock()) { |
| 603 | if (LockLooper()) { |
606 | 604 | GetMouse(&newWhere, &buttons); |
607 | | window->Unlock(); |
| 605 | UnlockLooper(); |
608 | 606 | } |
609 | 607 | |
610 | 608 | // This code is needed to make menus |
… |
… |
BMenuBar::_Track(int32* action, int32 startIndex, bool showMenu)
|
619 | 617 | } else |
620 | 618 | fState = MENU_STATE_CLOSED; |
621 | 619 | } |
622 | | if (!window->Lock()) |
| 620 | if (!LockLooper()) |
623 | 621 | break; |
624 | 622 | } else if (menuItem != NULL) { |
625 | 623 | if (menuItem->Submenu() != NULL && menuItem != fSelected) { |
… |
… |
BMenuBar::_Track(int32* action, int32 startIndex, bool showMenu)
|
642 | 640 | fState = MENU_STATE_TRACKING; |
643 | 641 | } |
644 | 642 | |
645 | | window->Unlock(); |
| 643 | UnlockLooper(); |
646 | 644 | |
647 | 645 | if (fState != MENU_STATE_CLOSED) { |
648 | 646 | // If user doesn't move the mouse, loop here, |
… |
… |
BMenuBar::_Track(int32* action, int32 startIndex, bool showMenu)
|
680 | 678 | } |
681 | 679 | } |
682 | 680 | |
683 | | if (window->Lock()) { |
| 681 | if (LockLooper()) { |
684 | 682 | if (fSelected != NULL) |
685 | 683 | _SelectItem(NULL); |
686 | 684 | |
687 | 685 | if (fChosenItem != NULL) |
688 | 686 | fChosenItem->Invoke(); |
689 | 687 | _RestoreFocus(); |
690 | | window->Unlock(); |
| 688 | UnlockLooper(); |
691 | 689 | } |
692 | 690 | |
693 | 691 | if (_IsStickyMode()) |