Fixed focusing problem

some optimizations to "drawing code"(not the real one) because of more efficient locking.
... other improvements.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6074 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Adi Oanca
2004-01-14 15:55:10 +00:00
parent 7bd3c77058
commit fa554b7dd8
7 changed files with 73 additions and 33 deletions
+3 -4
View File
@@ -231,7 +231,8 @@ void Desktop::SetFrontWinBorder(WinBorder* winBorder){
// TODO: implement
}
//---------------------------------------------------------------------------
void Desktop::SetFoocusWinBorder(WinBorder* winBorder){
// TODO: remove shortly?
void Desktop::SetFoooocusWinBorder(WinBorder* winBorder){
if (FocusWinBorder() == winBorder && (winBorder && !winBorder->IsHidden()))
return;
@@ -312,9 +313,7 @@ void Desktop::MouseEventHandler(PortMessage *msg){
rl->fMainLock.Lock();
ws->SearchAndSetNewFront(target);
// NOTE: !!! Be VERY careful about this method !!!!
SetFoocusWinBorder(target);
//ws->SetFocusLayer(target);
ws->SetFocusLayer(target);
rl->fMainLock.Unlock();
fGeneralLock.Unlock();
+1 -1
View File
@@ -41,7 +41,7 @@ public:
void RemoveWinBorder(WinBorder* winBorder);
bool HasWinBorder(WinBorder* winBorder);
void SetFrontWinBorder(WinBorder* winBorder);
void SetFoocusWinBorder(WinBorder* winBorder);
void SetFoooocusWinBorder(WinBorder* winBorder);
WinBorder* FrontWinBorder(void) const;
WinBorder* FocusWinBorder(void) const;
+3
View File
@@ -153,6 +153,9 @@ Layer* RootLayer::VirtualBottomChild() const{
}
//---------------------------------------------------------------------------
void RootLayer::AddWinBorderToWorkspaces(WinBorder* winBorder, uint32 wks){
if (!(fMainLock.IsLocked()))
debugger("RootLayer::AddWinBorderToWorkspaces - fMainLock has to be locked!\n");
if (wks == B_CURRENT_WORKSPACE){
ActiveWorkspace()->AddLayerPtr(winBorder);
return;
+20 -2
View File
@@ -289,10 +289,14 @@ ServerApp *ServerWindow::GetApp(void)
//! Shows the window's WinBorder
void ServerWindow::Show(void)
{
if(!_winborder->IsHidden())
return;
STRACE(("ServerWindow %s: Show\n",_title->String()));
if(_winborder)
{
RootLayer *rl = _winborder->GetRootLayer();
RootLayer *rl = _winborder->GetRootLayer();
int32 wksCount;
desktop->fGeneralLock.Lock();
printf("ServerWindow(%s)::Show() - General lock acquired\n", _winborder->GetName());
@@ -300,8 +304,16 @@ printf("ServerWindow(%s)::Show() - General lock acquired\n", _winborder->GetName
printf("ServerWindow(%s)::Show() - Main lock acquired\n", _winborder->GetName());
_winborder->Show();
if ((_feel == B_FLOATING_SUBSET_WINDOW_FEEL || _feel == B_MODAL_SUBSET_WINDOW_FEEL)
&& _winborder->MainWinBorder() == NULL)
{
// This window hasn't been added to a normal window subset,
// so don't call placement or redrawing methods!
goto goOut;
}
int32 wksCount= rl->WorkspaceCount();
wksCount = rl->WorkspaceCount();
for(int32 i = 0; i < wksCount; i++){
if (fWorkspaces & (0x00000001UL << i)){
Workspace *ws = rl->WorkspaceAt(i+1);
@@ -309,6 +321,9 @@ printf("ServerWindow(%s)::Show() - Main lock acquired\n", _winborder->GetName())
ws->SetFocusLayer(_winborder);
}
}
goOut:
rl->fMainLock.Unlock();
printf("ServerWindow(%s)::Show() - Main lock released\n", _winborder->GetName());
desktop->fGeneralLock.Unlock();
@@ -319,6 +334,9 @@ printf("ServerWindow(%s)::Show() - General lock released\n", _winborder->GetName
//! Hides the window's WinBorder
void ServerWindow::Hide(void)
{
if(_winborder->IsHidden())
return;
STRACE(("ServerWindow %s: Hide\n",_title->String()));
if(_winborder){
RootLayer *rl = _winborder->GetRootLayer();
+5 -12
View File
@@ -737,23 +737,16 @@ void WinBorder::AddToSubsetOf(WinBorder* main){
printf("WinBorder(%s)::AddToSubsetOf() - General lock acquired\n", GetName());
rl->fMainLock.Lock();
printf("WinBorder(%s)::AddToSubsetOf() - Main lock acquired\n", GetName());
for(int32 i = 0; i < rl->WorkspaceCount(); i++){
Workspace *ws = rl->WorkspaceAt(i+1);
if(ws->FrontLayer() == main){
printf("\n@\n@\n");
ws->PrintToStream();
if(ws->FrontLayer() == main)
ws->AddLayerPtr(this);
if(rl->ActiveWorkspace() == ws && !IsHidden()){
ws->Invalidate();
printf("\n#\n#\n");
ws->PrintToStream();
printf("\n#\n#\n");
}
}
}
rl->fMainLock.Unlock();
rl->fMainLock.Unlock();
printf("WinBorder(%s)::AddToSubsetOf() - Main lock released\n", GetName());
desktop->fGeneralLock.Unlock();
desktop->fGeneralLock.Unlock();
printf("WinBorder(%s)::AddToSubsetOf() - General lock released\n", GetName());
}
}
+38 -12
View File
@@ -83,12 +83,14 @@ bool Workspace::AddLayerPtr(WinBorder* layer){
opLock.Unlock();
STRACE(("\n*AddLayerPtr(%s) -", layer->GetName()));
// do a *smart* search and set the new 'front'
SearchAndSetNewFront(layer);
// do a *smart* search and set the new 'focus'
//SearchAndSetNewFocus(layer); // - it WILL be called!
// this also does a redraw
SetFocusLayer(layer);
// this may happen in case of subset windows.
if(!(layer->IsHidden())){
// do a *smart* search and set the new 'front'
SearchAndSetNewFront(layer);
// do a *smart* search and set the new 'focus' + a redraw
SetFocusLayer(layer);
}
return true;
}
@@ -162,13 +164,33 @@ printf("Layer %s NOT found in Workspace No %ld\n", layer->GetName(), ID());
//---------------------------------------------------------------------------
WinBorder* Workspace::SetFocusLayer(WinBorder* layer){
STRACE(("\n@Workspace(%ld)::SetFOCUSLayer( %s )\n", ID(), layer? layer->GetName(): "NULL"));
SearchAndSetNewFocus(layer);
STRACESTREAM();
// TODO: there had to be a Invalidate() vresion witch takes a BRegion parameter
Invalidate();
return fFocusItem? fFocusItem->layerPtr : NULL;
if(!(desktop->fGeneralLock.IsLocked()))
debugger("Workspace::SetFocusLayer - desktop->fGeneralLock must be LOCKED!\n");
WinBorder *previousFocus = FocusLayer();
SearchAndSetNewFocus(layer);
if (previousFocus != FocusLayer()){
if (previousFocus)
previousFocus->SetFocus(false);
if (FocusLayer()){
FocusLayer()->SetFocus(true);
}
// TODO: there had to be a Invalidate() vresion witch takes a BRegion parameter
Invalidate();
}
else{
// Do nothing!
}
STRACESTREAM();
STRACE(("\n#Workspace(%ld)::SetFOCUSLayer( %s ) ENDED\n", ID(), layer? layer->GetName(): "NULL"));
return FocusLayer();
}
//---------------------------------------------------------------------------
WinBorder* Workspace::FocusLayer() const{
@@ -177,6 +199,10 @@ WinBorder* Workspace::FocusLayer() const{
//---------------------------------------------------------------------------
WinBorder* Workspace::SetFrontLayer(WinBorder* layer){
STRACE(("\n@Workspace(%ld)::SetFrontLayer( %s )\n", ID(), layer? layer->GetName(): "NULL"));
if(!(desktop->fGeneralLock.IsLocked()))
debugger("Workspace::SetFRONTLayer - desktop->fGeneralLock must be LOCKED!\n");
SearchAndSetNewFront(layer);
STRACESTREAM();
// TODO: there had to be a Invalidate() vresion witch takes a BRegion parameter
+3 -2
View File
@@ -61,12 +61,13 @@ public:
void SearchAndSetNewFront(WinBorder* preferred);
void SearchAndSetNewFocus(WinBorder* preferred);
ListData* HasItem(ListData* item);
ListData* HasItem(WinBorder* layer);
private:
void InsertItem(ListData* item, ListData* before);
void RemoveItem(ListData* item);
ListData* HasItem(ListData* item);
ListData* HasItem(WinBorder* layer);
ListData* FindPlace(ListData* pref);