Don't send TermView pointers around in messages. When the message is processed

the pointer might already be invalid. Use SessionID instead.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39499 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2010-11-19 12:11:58 +00:00
parent 713b2a7886
commit 54197c6163
2 changed files with 24 additions and 11 deletions
+21 -11
View File
@@ -708,7 +708,7 @@ TermWindow::MessageReceived(BMessage *message)
session->title.pattern.Truncate(0); session->title.pattern.Truncate(0);
session->title.patternUserDefined = false; session->title.patternUserDefined = false;
} }
_UpdateSessionTitle(fSessions.IndexOf(session)); _UpdateSessionTitle(_IndexOfSession(session));
} }
break; break;
} }
@@ -729,11 +729,12 @@ TermWindow::MessageReceived(BMessage *message)
case kCloseView: case kCloseView:
{ {
TermView* termView;
int32 index = -1; int32 index = -1;
if (message->FindPointer("termView", (void**)&termView) == B_OK) SessionID sessionID(*message, "session");
index = _IndexOfTermView(termView); if (sessionID.IsValid()) {
else if (Session* session = _SessionForID(sessionID))
index = _IndexOfSession(session);
} else
index = _IndexOfTermView(_ActiveTermView()); index = _IndexOfTermView(_ActiveTermView());
if (index >= 0) if (index >= 0)
@@ -1060,7 +1061,7 @@ TermWindow::_IndexOfTermView(TermView* termView) const
} }
inline TermWindow::Session* TermWindow::Session*
TermWindow::_SessionAt(int32 index) const TermWindow::_SessionAt(int32 index) const
{ {
return (Session*)fSessions.ItemAt(index); return (Session*)fSessions.ItemAt(index);
@@ -1079,6 +1080,13 @@ TermWindow::_SessionForID(const SessionID& sessionID) const
} }
int32
TermWindow::_IndexOfSession(Session* session) const
{
return fSessions.IndexOf(session);
}
void void
TermWindow::_CheckChildren() TermWindow::_CheckChildren()
{ {
@@ -1173,7 +1181,7 @@ TermWindow::TabRightClicked(SmartTabView* tabView, BPoint point, int32 index)
return; return;
BMessage* message = new BMessage(kCloseView); BMessage* message = new BMessage(kCloseView);
message->AddPointer("termview", termView); _SessionAt(index)->id.AddToMessage(*message, "session");
BPopUpMenu* popUpMenu = new BPopUpMenu("tab menu"); BPopUpMenu* popUpMenu = new BPopUpMenu("tab menu");
popUpMenu->AddItem(new BMenuItem(B_TRANSLATE("Close tab"), message)); popUpMenu->AddItem(new BMenuItem(B_TRANSLATE("Close tab"), message));
@@ -1192,10 +1200,12 @@ TermWindow::NotifyTermViewQuit(TermView* view, int32 reason)
{ {
// Since the notification can come from the view, we send a message to // Since the notification can come from the view, we send a message to
// ourselves to avoid deleting the caller synchronously. // ourselves to avoid deleting the caller synchronously.
BMessage message(kCloseView); if (Session* session = _SessionAt(_IndexOfTermView(view))) {
message.AddPointer("termView", view); BMessage message(kCloseView);
message.AddInt32("reason", reason); session->id.AddToMessage(message, "session");
PostMessage(&message); message.AddInt32("reason", reason);
PostMessage(&message);
}
} }
+3
View File
@@ -104,6 +104,8 @@ private:
SessionID(const BMessage& message, SessionID(const BMessage& message,
const char* field); const char* field);
bool IsValid() const { return fID >= 0; }
status_t AddToMessage(BMessage& message, status_t AddToMessage(BMessage& message,
const char* field) const; const char* field) const;
@@ -145,6 +147,7 @@ private:
int32 _IndexOfTermView(TermView* termView) const; int32 _IndexOfTermView(TermView* termView) const;
inline Session* _SessionAt(int32 index) const; inline Session* _SessionAt(int32 index) const;
Session* _SessionForID(const SessionID& sessionID) const; Session* _SessionForID(const SessionID& sessionID) const;
inline int32 _IndexOfSession(Session* session) const;
void _CheckChildren(); void _CheckChildren();
void _ResizeView(TermView* view); void _ResizeView(TermView* view);