Revert Interface Kit: BWindow owns (and deletes) menu sem and friends
This reverts commits:39083dd0f70f430ba35cac55439364Fixes #19553 Change-Id: I40f9a694079d4376221099e1d1b99208aeb207b7 Reviewed-on: https://review.haiku-os.org/c/haiku/+/9416 Reviewed-by: waddlesplash <[email protected]> Tested-by: Commit checker robot <[email protected]>
This commit is contained in:
committed by
waddlesplash
parent
b515400884
commit
e362f604f4
@@ -106,7 +106,7 @@ private:
|
|||||||
menu_bar_border fBorder;
|
menu_bar_border fBorder;
|
||||||
thread_id fTrackingPID;
|
thread_id fTrackingPID;
|
||||||
int32 fPrevFocusToken;
|
int32 fPrevFocusToken;
|
||||||
uint32 _reserved1;
|
sem_id fMenuSem;
|
||||||
BRect* fLastBounds;
|
BRect* fLastBounds;
|
||||||
uint32 fBorders;
|
uint32 fBorders;
|
||||||
uint32 _reserved[1];
|
uint32 _reserved[1];
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ BMenuBar::BMenuBar(BRect frame, const char* name, uint32 resizingMode,
|
|||||||
fBorder(B_BORDER_FRAME),
|
fBorder(B_BORDER_FRAME),
|
||||||
fTrackingPID(-1),
|
fTrackingPID(-1),
|
||||||
fPrevFocusToken(-1),
|
fPrevFocusToken(-1),
|
||||||
|
fMenuSem(-1),
|
||||||
fLastBounds(NULL),
|
fLastBounds(NULL),
|
||||||
fTracking(false)
|
fTracking(false)
|
||||||
{
|
{
|
||||||
@@ -67,6 +68,7 @@ BMenuBar::BMenuBar(const char* name, menu_layout layout, uint32 flags)
|
|||||||
fBorder(B_BORDER_FRAME),
|
fBorder(B_BORDER_FRAME),
|
||||||
fTrackingPID(-1),
|
fTrackingPID(-1),
|
||||||
fPrevFocusToken(-1),
|
fPrevFocusToken(-1),
|
||||||
|
fMenuSem(-1),
|
||||||
fLastBounds(NULL),
|
fLastBounds(NULL),
|
||||||
fTracking(false)
|
fTracking(false)
|
||||||
{
|
{
|
||||||
@@ -80,6 +82,7 @@ BMenuBar::BMenuBar(BMessage* archive)
|
|||||||
fBorder(B_BORDER_FRAME),
|
fBorder(B_BORDER_FRAME),
|
||||||
fTrackingPID(-1),
|
fTrackingPID(-1),
|
||||||
fPrevFocusToken(-1),
|
fPrevFocusToken(-1),
|
||||||
|
fMenuSem(-1),
|
||||||
fLastBounds(NULL),
|
fLastBounds(NULL),
|
||||||
fTracking(false)
|
fTracking(false)
|
||||||
{
|
{
|
||||||
@@ -489,8 +492,9 @@ BMenuBar::StartMenuBar(int32 menuIndex, bool sticky, bool showMenu,
|
|||||||
// so let's call MenusBeginning() directly
|
// so let's call MenusBeginning() directly
|
||||||
window->MenusBeginning();
|
window->MenusBeginning();
|
||||||
|
|
||||||
sem_id sem = create_sem(0, "window close sem");
|
fMenuSem = create_sem(0, "window close sem");
|
||||||
_set_menu_sem_(window, sem);
|
_set_menu_sem_(window, fMenuSem);
|
||||||
|
|
||||||
fTrackingPID = spawn_thread(_TrackTask, "menu_tracking", B_DISPLAY_PRIORITY, NULL);
|
fTrackingPID = spawn_thread(_TrackTask, "menu_tracking", B_DISPLAY_PRIORITY, NULL);
|
||||||
if (fTrackingPID >= 0) {
|
if (fTrackingPID >= 0) {
|
||||||
menubar_data data;
|
menubar_data data;
|
||||||
@@ -507,6 +511,7 @@ BMenuBar::StartMenuBar(int32 menuIndex, bool sticky, bool showMenu,
|
|||||||
} else {
|
} else {
|
||||||
fTracking = false;
|
fTracking = false;
|
||||||
_set_menu_sem_(window, B_NO_MORE_SEMS);
|
_set_menu_sem_(window, B_NO_MORE_SEMS);
|
||||||
|
delete_sem(fMenuSem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -534,6 +539,8 @@ BMenuBar::_TrackTask(void* arg)
|
|||||||
window->PostMessage(_MENUS_DONE_);
|
window->PostMessage(_MENUS_DONE_);
|
||||||
|
|
||||||
_set_menu_sem_(window, B_BAD_SEM_ID);
|
_set_menu_sem_(window, B_BAD_SEM_ID);
|
||||||
|
delete_sem(menuBar->fMenuSem);
|
||||||
|
menuBar->fMenuSem = B_BAD_SEM_ID;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -370,6 +370,7 @@ BPopUpMenu::_Go(BPoint where, bool autoInvoke, bool startOpened,
|
|||||||
fTrackThread = spawn_thread(_thread_entry, "popup", B_DISPLAY_PRIORITY, data);
|
fTrackThread = spawn_thread(_thread_entry, "popup", B_DISPLAY_PRIORITY, data);
|
||||||
if (fTrackThread < B_OK) {
|
if (fTrackThread < B_OK) {
|
||||||
// Something went wrong. Cleanup and return NULL
|
// Something went wrong. Cleanup and return NULL
|
||||||
|
delete_sem(sem);
|
||||||
if (async && window != NULL)
|
if (async && window != NULL)
|
||||||
_set_menu_sem_(window, B_BAD_SEM_ID);
|
_set_menu_sem_(window, B_BAD_SEM_ID);
|
||||||
delete data;
|
delete data;
|
||||||
@@ -403,6 +404,8 @@ BPopUpMenu::_thread_entry(void* menuData)
|
|||||||
if (data->async && data->window)
|
if (data->async && data->window)
|
||||||
_set_menu_sem_(data->window, B_BAD_SEM_ID);
|
_set_menu_sem_(data->window, B_BAD_SEM_ID);
|
||||||
|
|
||||||
|
delete_sem(data->lock);
|
||||||
|
|
||||||
// Commit suicide if needed
|
// Commit suicide if needed
|
||||||
if (data->async && menu->fAutoDestruct) {
|
if (data->async && menu->fAutoDestruct) {
|
||||||
menu->fTrackThread = -1;
|
menu->fTrackThread = -1;
|
||||||
@@ -459,12 +462,8 @@ BPopUpMenu::_WaitMenu(void* _data)
|
|||||||
BWindow* window = data->window;
|
BWindow* window = data->window;
|
||||||
sem_id sem = data->lock;
|
sem_id sem = data->lock;
|
||||||
if (window != NULL) {
|
if (window != NULL) {
|
||||||
status_t err;
|
while (acquire_sem_etc(sem, 1, B_RELATIVE_TIMEOUT, 50000) != B_BAD_SEM_ID)
|
||||||
do {
|
window->UpdateIfNeeded();
|
||||||
err = acquire_sem_etc(sem, 1, B_RELATIVE_TIMEOUT, 50000);
|
|
||||||
} while (err == B_INTERRUPTED);
|
|
||||||
|
|
||||||
window->UpdateIfNeeded();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t unused;
|
status_t unused;
|
||||||
|
|||||||
@@ -217,23 +217,8 @@ static value_info sWindowValueInfo[] = {
|
|||||||
void
|
void
|
||||||
_set_menu_sem_(BWindow* window, sem_id sem)
|
_set_menu_sem_(BWindow* window, sem_id sem)
|
||||||
{
|
{
|
||||||
if (window == NULL)
|
if (window != NULL)
|
||||||
return;
|
window->fMenuSem = sem;
|
||||||
|
|
||||||
// delete semaphore when set to invalid
|
|
||||||
switch (sem) {
|
|
||||||
case B_BAD_SEM_ID:
|
|
||||||
case B_NO_MORE_SEMS:
|
|
||||||
case -1:
|
|
||||||
if (window->fMenuSem > 0)
|
|
||||||
delete_sem(window->fMenuSem);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
window->fMenuSem = sem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user