Qt add_menu() w/o start_menu()

I temporarily reverted the fix for end-of-game disclosure of overview
in order to trigger the add_menu() crash under Qt.  It came down to

if (!actual) impossible("AddMenu called before we know if Menu or Text");
actual->AddMenu(glyph,identifier,ch,gch,attr,str,itemflags);

where 'actual' happens to be Null.  impossible() gets called, goes
through pline() calling putmesg() and putstr(WIN_MESSAGE), then the
output never shows up anywhere.  I haven't figured our what's going
on with that, but changing the above to

if (!actual)
    impossible("AddMenu called before we know if Menu or Text");
else
    actual->AddMenu(glyph, identifier, ch, gch, attr, str, itemflags);

at least prevents the crash.  The main window ends up becoming
minimized/iconified but the final popups which occur after disclosure
appear and accept responses and then a clean exit takes place.

Presumably it used panic() rather than impossible() at some point,
otherwise that code makes no sense:  test for Null then deference it
regardless of the result of the test?
This commit is contained in:
PatR
2023-04-20 13:15:31 -07:00
parent a725447d65
commit 889b437775

View File

@@ -1286,25 +1286,37 @@ NetHackQtMenuOrTextWindow::NetHackQtMenuOrTextWindow(QWidget *parent_) :
QWidget* NetHackQtMenuOrTextWindow::Widget()
{
if (!actual) impossible("Widget called before we know if Menu or Text");
return actual->Widget();
QWidget *result = NULL;
if (!actual)
impossible("Widget called before we know if Menu or Text");
else
result = actual->Widget();
return result;
}
// Text
void NetHackQtMenuOrTextWindow::Clear()
{
if (!actual) impossible("Clear called before we know if Menu or Text");
actual->Clear();
if (!actual)
impossible("Clear called before we know if Menu or Text");
else
actual->Clear();
}
void NetHackQtMenuOrTextWindow::Display(bool block)
{
if (!actual) impossible("Display called before we know if Menu or Text");
actual->Display(block);
if (!actual)
impossible("Display called before we know if Menu or Text");
else
actual->Display(block);
}
bool NetHackQtMenuOrTextWindow::Destroy()
{
if (!actual) impossible("Destroy called before we know if Menu or Text");
return actual->Destroy();
bool result = false;
if (!actual)
impossible("Destroy called before we know if Menu or Text");
else
result = actual->Destroy();
return result;
}
void NetHackQtMenuOrTextWindow::PutStr(int attr, const QString& text)
@@ -1323,18 +1335,26 @@ void NetHackQtMenuOrTextWindow::AddMenu(int glyph, const ANY_P* identifier,
char ch, char gch, int attr,
const QString& str, unsigned itemflags)
{
if (!actual) impossible("AddMenu called before we know if Menu or Text");
actual->AddMenu(glyph,identifier,ch,gch,attr,str,itemflags);
if (!actual)
impossible("AddMenu called before we know if Menu or Text");
else
actual->AddMenu(glyph, identifier, ch, gch, attr, str, itemflags);
}
void NetHackQtMenuOrTextWindow::EndMenu(const QString& prompt)
{
if (!actual) impossible("EndMenu called before we know if Menu or Text");
actual->EndMenu(prompt);
if (!actual)
impossible("EndMenu called before we know if Menu or Text");
else
actual->EndMenu(prompt);
}
int NetHackQtMenuOrTextWindow::SelectMenu(int how, MENU_ITEM_P **menu_list)
{
if (!actual) impossible("SelectMenu called before we know if Menu or Text");
return actual->SelectMenu(how,menu_list);
int result = -1;
if (!actual)
impossible("SelectMenu called before we know if Menu or Text");
else
result = actual->SelectMenu(how, menu_list);
return result;
}
} // namespace nethack_qt_