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.patternUserDefined = false;
}
_UpdateSessionTitle(fSessions.IndexOf(session));
_UpdateSessionTitle(_IndexOfSession(session));
}
break;
}
@@ -729,11 +729,12 @@ TermWindow::MessageReceived(BMessage *message)
case kCloseView:
{
TermView* termView;
int32 index = -1;
if (message->FindPointer("termView", (void**)&termView) == B_OK)
index = _IndexOfTermView(termView);
else
SessionID sessionID(*message, "session");
if (sessionID.IsValid()) {
if (Session* session = _SessionForID(sessionID))
index = _IndexOfSession(session);
} else
index = _IndexOfTermView(_ActiveTermView());
if (index >= 0)
@@ -1060,7 +1061,7 @@ TermWindow::_IndexOfTermView(TermView* termView) const
}
inline TermWindow::Session*
TermWindow::Session*
TermWindow::_SessionAt(int32 index) const
{
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
TermWindow::_CheckChildren()
{
@@ -1173,7 +1181,7 @@ TermWindow::TabRightClicked(SmartTabView* tabView, BPoint point, int32 index)
return;
BMessage* message = new BMessage(kCloseView);
message->AddPointer("termview", termView);
_SessionAt(index)->id.AddToMessage(*message, "session");
BPopUpMenu* popUpMenu = new BPopUpMenu("tab menu");
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
// ourselves to avoid deleting the caller synchronously.
BMessage message(kCloseView);
message.AddPointer("termView", view);
message.AddInt32("reason", reason);
PostMessage(&message);
if (Session* session = _SessionAt(_IndexOfTermView(view))) {
BMessage message(kCloseView);
session->id.AddToMessage(message, "session");
message.AddInt32("reason", reason);
PostMessage(&message);
}
}
+3
View File
@@ -104,6 +104,8 @@ private:
SessionID(const BMessage& message,
const char* field);
bool IsValid() const { return fID >= 0; }
status_t AddToMessage(BMessage& message,
const char* field) const;
@@ -145,6 +147,7 @@ private:
int32 _IndexOfTermView(TermView* termView) const;
inline Session* _SessionAt(int32 index) const;
Session* _SessionForID(const SessionID& sessionID) const;
inline int32 _IndexOfSession(Session* session) const;
void _CheckChildren();
void _ResizeView(TermView* view);