* Fixed a possible locking bug in Desktop::WindowAction().

* Cleaned up locking a bit.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16686 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2006-03-10 11:42:58 +00:00
parent 87b1f40c0f
commit 73bc0d629e
2 changed files with 26 additions and 34 deletions
+3 -2
View File
@@ -1707,7 +1707,6 @@ Desktop::SetWindowFlags(WindowLayer *window, uint32 newFlags)
_TriggerWindowRedrawing(dirty); _TriggerWindowRedrawing(dirty);
UnlockAllWindows(); UnlockAllWindows();
} }
@@ -1820,8 +1819,10 @@ Desktop::WindowAction(int32 windowToken, int32 action)
::ServerWindow* serverWindow; ::ServerWindow* serverWindow;
if (BPrivate::gDefaultTokens.GetToken(windowToken, if (BPrivate::gDefaultTokens.GetToken(windowToken,
B_SERVER_TOKEN, (void**)&serverWindow) != B_OK) B_SERVER_TOKEN, (void**)&serverWindow) != B_OK) {
UnlockAllWindows();
return; return;
}
if (action == B_BRING_TO_FRONT if (action == B_BRING_TO_FRONT
&& !serverWindow->Window()->IsMinimized()) { && !serverWindow->Window()->IsMinimized()) {
+23 -32
View File
@@ -851,12 +851,16 @@ ServerWindow::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link)
link.Read<int32>(&minHeight); link.Read<int32>(&minHeight);
link.Read<int32>(&maxHeight); link.Read<int32>(&maxHeight);
*/ */
fDesktop->UnlockSingleWindow();
if (fDesktop->LockAllWindows()) { if (fDesktop->LockAllWindows()) {
fWindowLayer->SetSizeLimits(minWidth, maxWidth, fWindowLayer->SetSizeLimits(minWidth, maxWidth,
minHeight, maxHeight); minHeight, maxHeight);
fDesktop->UnlockAllWindows(); fDesktop->UnlockAllWindows();
} }
fDesktop->LockSingleWindow();
// and now, sync the client to the limits that we were able to enforce // and now, sync the client to the limits that we were able to enforce
fWindowLayer->GetSizeLimits(&minWidth, &maxWidth, fWindowLayer->GetSizeLimits(&minWidth, &maxWidth,
&minHeight, &maxHeight); &minHeight, &maxHeight);
@@ -899,9 +903,9 @@ ServerWindow::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link)
case AS_GET_MOUSE: case AS_GET_MOUSE:
{ {
fDesktop->UnlockSingleWindow();
DTRACE(("ServerWindow %s: Message AS_GET_MOUSE\n", fTitle)); DTRACE(("ServerWindow %s: Message AS_GET_MOUSE\n", fTitle));
fDesktop->UnlockSingleWindow();
// Returns // Returns
// 1) BPoint mouse location // 1) BPoint mouse location
// 2) int32 button state // 2) int32 button state
@@ -914,7 +918,7 @@ fDesktop->UnlockSingleWindow();
fLink.Attach<BPoint>(where); fLink.Attach<BPoint>(where);
fLink.Attach<int32>(buttons); fLink.Attach<int32>(buttons);
fLink.Flush(); fLink.Flush();
fDesktop->LockSingleWindow(); fDesktop->LockSingleWindow();
break; break;
} }
@@ -1150,21 +1154,18 @@ ServerWindow::_DispatchViewMessage(int32 code,
float offsetX = x - fCurrentLayer->Frame().left; float offsetX = x - fCurrentLayer->Frame().left;
float offsetY = y - fCurrentLayer->Frame().top; float offsetY = y - fCurrentLayer->Frame().top;
if (fDesktop->LockSingleWindow()) { BRegion dirty;
BRegion dirty; fCurrentLayer->MoveBy(offsetX, offsetY, &dirty);
fCurrentLayer->MoveBy(offsetX, offsetY, &dirty);
// TODO: think about how to avoid this hack: // TODO: think about how to avoid this hack:
// the parent clipping needs to be updated, it is not // the parent clipping needs to be updated, it is not
// done in ResizeBy() since it would need to avoid // done in ResizeBy() since it would need to avoid
// too much computations when children are resized because // too much computations when children are resized because
// follow modes // follow modes
if (ViewLayer* parent = fCurrentLayer->Parent()) if (ViewLayer* parent = fCurrentLayer->Parent())
parent->RebuildClipping(false); parent->RebuildClipping(false);
fWindowLayer->MarkContentDirty(dirty); fWindowLayer->MarkContentDirty(dirty);
fDesktop->UnlockSingleWindow();
}
break; break;
} }
case AS_LAYER_RESIZE_TO: case AS_LAYER_RESIZE_TO:
@@ -1179,23 +1180,18 @@ ServerWindow::_DispatchViewMessage(int32 code,
float deltaWidth = newWidth - fCurrentLayer->Frame().Width(); float deltaWidth = newWidth - fCurrentLayer->Frame().Width();
float deltaHeight = newHeight - fCurrentLayer->Frame().Height(); float deltaHeight = newHeight - fCurrentLayer->Frame().Height();
if (fDesktop->LockSingleWindow()) { BRegion dirty;
BRegion dirty; fCurrentLayer->ResizeBy(deltaWidth, deltaHeight, &dirty);
fCurrentLayer->ResizeBy(deltaWidth, deltaHeight, &dirty);
// TODO: see above // TODO: see above
if (ViewLayer* parent = fCurrentLayer->Parent()) if (ViewLayer* parent = fCurrentLayer->Parent())
parent->RebuildClipping(false); parent->RebuildClipping(false);
fWindowLayer->MarkContentDirty(dirty); fWindowLayer->MarkContentDirty(dirty);
fDesktop->UnlockSingleWindow();
}
break; break;
} }
case AS_LAYER_GET_COORD: case AS_LAYER_GET_COORD:
{ {
fDesktop->LockSingleWindow();
STRACE(("ServerWindow %s: Message AS_LAYER_GET_COORD: ViewLayer: %s\n", Title(), fCurrentLayer->Name())); STRACE(("ServerWindow %s: Message AS_LAYER_GET_COORD: ViewLayer: %s\n", Title(), fCurrentLayer->Name()));
fLink.StartMessage(B_OK); fLink.StartMessage(B_OK);
// our offset in the parent -> will be originX and originY in BView // our offset in the parent -> will be originX and originY in BView
@@ -1203,8 +1199,6 @@ ServerWindow::_DispatchViewMessage(int32 code,
fLink.Attach<float>(fCurrentLayer->Frame().top); fLink.Attach<float>(fCurrentLayer->Frame().top);
fLink.Attach<BRect>(fCurrentLayer->Bounds()); fLink.Attach<BRect>(fCurrentLayer->Bounds());
fLink.Flush(); fLink.Flush();
fDesktop->UnlockSingleWindow();
break; break;
} }
case AS_LAYER_SET_ORIGIN: case AS_LAYER_SET_ORIGIN:
@@ -1844,10 +1838,7 @@ ServerWindow::_DispatchViewMessage(int32 code,
} }
default: default:
if (fDesktop->LockSingleWindow()) { _DispatchViewDrawingMessage(code, link);
_DispatchViewDrawingMessage(code, link);
fDesktop->UnlockSingleWindow();
}
break; break;
} }
} }