fix #H4332 - Qt crash upon immediate quit

Put in Ron Vaniwaarden's fix for crash occuring if player quits
right after choosing a character and declines to disclose anything.
Just a guess, but deleting the never-viewed inventory window might
be the cause.  (3.4.3 didn't delete it.)

There's a small amount of reformatting, but cleaning that up
manually is a monumental task.
This commit is contained in:
PatR
2016-05-11 15:10:33 -07:00
parent 02760cc45d
commit 68cf2ec84f
2 changed files with 47 additions and 11 deletions
+3
View File
@@ -281,6 +281,9 @@ MacOSX: initial binary release was built from out of date source code that
had 'BETA' and 'DEBUG' inappropriately enabled had 'BETA' and 'DEBUG' inappropriately enabled
MacOSX: force TIMED_DELAY build option on so that 'runmode' run-time option MacOSX: force TIMED_DELAY build option on so that 'runmode' run-time option
is functional is functional
Qt: could issue impossible "Destroy called before we know if Menu or Text"
followed by crash caused by deferencing a Null pointer if player quit
immediately after creating character and declined to disclose anything
X11: core bug for '`' (backtick) and #terrain commands was only noticed by X11: core bug for '`' (backtick) and #terrain commands was only noticed by
X11 interface: impossible "add_menu: called before start_menu" X11 interface: impossible "add_menu: called before start_menu"
X11: enable a scroll bar in menu windows X11: enable a scroll bar in menu windows
+44 -11
View File
@@ -1379,6 +1379,7 @@ void NetHackQtStringRequestor::SetDefault(const char* d)
{ {
input.setText(d); input.setText(d);
} }
bool NetHackQtStringRequestor::Get(char* buffer, int maxchar) bool NetHackQtStringRequestor::Get(char* buffer, int maxchar)
{ {
input.setMaxLength(maxchar); input.setMaxLength(maxchar);
@@ -1432,6 +1433,7 @@ void NetHackQtStringRequestor::done(int i)
NetHackQtWindow::NetHackQtWindow() NetHackQtWindow::NetHackQtWindow()
{ {
} }
NetHackQtWindow::~NetHackQtWindow() NetHackQtWindow::~NetHackQtWindow()
{ {
} }
@@ -1514,7 +1516,10 @@ void NetHackQtMapWindow::putMessage(int attr, const char* text)
messages += "\n"; messages += "\n";
messages += text; messages += text;
QFontMetrics fm = fontMetrics(); QFontMetrics fm = fontMetrics();
messages_rect = fm.boundingRect(viewport.contentsX(),viewport.contentsY(),viewport.width(),0, WordBreak|AlignTop|AlignLeft|DontClip, messages); messages_rect = fm.boundingRect(viewport.contentsX(), viewport.contentsY(),
viewport.width(), 0,
WordBreak|AlignTop|AlignLeft|DontClip,
messages);
update(messages_rect); update(messages_rect);
} }
@@ -1701,7 +1706,9 @@ void NetHackQtMapWindow::paintEvent(QPaintEvent* event)
&& ::iflags.hilite_pet && ::iflags.hilite_pet
#endif #endif
) { ) {
painter.drawPixmap(QPoint(i*qt_settings->glyphs().width(), j*qt_settings->glyphs().height()), pet_annotation); painter.drawPixmap(QPoint(i*qt_settings->glyphs().width(),
j*qt_settings->glyphs().height()),
pet_annotation);
} }
} }
} }
@@ -1717,7 +1724,9 @@ void NetHackQtMapWindow::paintEvent(QPaintEvent* event)
&& ::iflags.hilite_pet && ::iflags.hilite_pet
#endif #endif
) { ) {
painter.drawPixmap(QPoint(i*qt_settings->glyphs().width(), j*qt_settings->glyphs().height()), pet_annotation); painter.drawPixmap(QPoint(i*qt_settings->glyphs().width(),
j*qt_settings->glyphs().height()),
pet_annotation);
} }
} }
} }
@@ -2827,6 +2836,7 @@ void NetHackQtMenuWindow::Layout()
invert->setGeometry(x,0,butw,buth); x+=butw; butw=(dialog->width()-x)/1; invert->setGeometry(x,0,butw,buth); x+=butw; butw=(dialog->width()-x)/1;
search->setGeometry(x,0,butw,buth); search->setGeometry(x,0,butw,buth);
} }
int NetHackQtMenuWindow::SelectMenu(int h, MENU_ITEM_P **menu_list) int NetHackQtMenuWindow::SelectMenu(int h, MENU_ITEM_P **menu_list)
{ {
setFont(str_fixed ? setFont(str_fixed ?
@@ -2947,6 +2957,7 @@ int NetHackQtMenuWindow::SelectMenu(int h, MENU_ITEM_P **menu_list)
return -1; return -1;
} }
} }
void NetHackQtMenuWindow::keyPressEvent(QKeyEvent* event) void NetHackQtMenuWindow::keyPressEvent(QKeyEvent* event)
{ {
if (viewHeight() < totalHeight() && !(event->state()&ShiftButton)) { if (viewHeight() < totalHeight() && !(event->state()&ShiftButton)) {
@@ -2974,12 +2985,14 @@ void NetHackQtMenuWindow::ChooseNone()
if (item[i].selected) ToggleSelect(i); if (item[i].selected) ToggleSelect(i);
} }
} }
void NetHackQtMenuWindow::Invert() void NetHackQtMenuWindow::Invert()
{ {
for (int i=0; i<itemcount; i++) { for (int i=0; i<itemcount; i++) {
ToggleSelect(i); ToggleSelect(i);
} }
} }
void NetHackQtMenuWindow::Search() void NetHackQtMenuWindow::Search()
{ {
NetHackQtStringRequestor requestor(keysource,"Search for:"); NetHackQtStringRequestor requestor(keysource,"Search for:");
@@ -2991,6 +3004,7 @@ void NetHackQtMenuWindow::Search()
} }
} }
} }
void NetHackQtMenuWindow::ToggleSelect(int i) void NetHackQtMenuWindow::ToggleSelect(int i)
{ {
if (item[i].Selectable()) { if (item[i].Selectable()) {
@@ -3115,6 +3129,7 @@ void NetHackQtMenuWindow::mousePressEvent(QMouseEvent* event)
} }
} }
} }
void NetHackQtMenuWindow::mouseReleaseEvent(QMouseEvent* event) void NetHackQtMenuWindow::mouseReleaseEvent(QMouseEvent* event)
{ {
if (pressed>=0) { if (pressed>=0) {
@@ -3123,6 +3138,7 @@ void NetHackQtMenuWindow::mouseReleaseEvent(QMouseEvent* event)
updateCell(p,3); updateCell(p,3);
} }
} }
void NetHackQtMenuWindow::mouseMoveEvent(QMouseEvent* event) void NetHackQtMenuWindow::mouseMoveEvent(QMouseEvent* event)
{ {
if (pressed>=0) { if (pressed>=0) {
@@ -4274,8 +4290,9 @@ NetHackQtGlyphs::NetHackQtGlyphs()
} else { } else {
tiles_per_row = TILES_PER_ROW; tiles_per_row = TILES_PER_ROW;
if (img.width()%tiles_per_row) { if (img.width()%tiles_per_row) {
impossible("Tile file \"%s\" has %d columns, not multiple of row count (%d)", impossible(
tile_file, img.width(), tiles_per_row); "Tile file \"%s\" has %d columns, not multiple of row count (%d)",
tile_file, img.width(), tiles_per_row);
} }
} }
} else { } else {
@@ -4368,18 +4385,31 @@ QWidget* NetHackQtMenuOrTextWindow::Widget()
// Text // Text
void NetHackQtMenuOrTextWindow::Clear() void NetHackQtMenuOrTextWindow::Clear()
{ {
if (!actual) impossible("Clear called before we know if Menu or Text"); if (!actual)
actual->Clear(); impossible("Clear called before we know if Menu or Text");
else
actual->Clear();
} }
void NetHackQtMenuOrTextWindow::Display(bool block) void NetHackQtMenuOrTextWindow::Display(bool block)
{ {
if (!actual) impossible("Display called before we know if Menu or Text"); if (!actual)
actual->Display(block); impossible("Display called before we know if Menu or Text");
else
actual->Display(block);
} }
bool NetHackQtMenuOrTextWindow::Destroy() bool NetHackQtMenuOrTextWindow::Destroy()
{ {
if (!actual) impossible("Destroy called before we know if Menu or Text"); bool res;
return actual->Destroy();
if (!actual) {
/* impossible("Destroy called before we know if Menu or Text"); */
res = FALSE; // early Destroy is not impossible
} else
res = actual->Destroy();
return res;
} }
void NetHackQtMenuOrTextWindow::PutStr(int attr, const char* text) void NetHackQtMenuOrTextWindow::PutStr(int attr, const char* text)
@@ -4394,17 +4424,20 @@ void NetHackQtMenuOrTextWindow::StartMenu()
if (!actual) actual=new NetHackQtMenuWindow(keysource); if (!actual) actual=new NetHackQtMenuWindow(keysource);
actual->StartMenu(); actual->StartMenu();
} }
void NetHackQtMenuOrTextWindow::AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr, void NetHackQtMenuOrTextWindow::AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr,
const char* str, bool presel) const char* str, bool presel)
{ {
if (!actual) impossible("AddMenu called before we know if Menu or Text"); if (!actual) impossible("AddMenu called before we know if Menu or Text");
actual->AddMenu(glyph,identifier,ch,gch,attr,str,presel); actual->AddMenu(glyph,identifier,ch,gch,attr,str,presel);
} }
void NetHackQtMenuOrTextWindow::EndMenu(const char* prompt) void NetHackQtMenuOrTextWindow::EndMenu(const char* prompt)
{ {
if (!actual) impossible("EndMenu called before we know if Menu or Text"); if (!actual) impossible("EndMenu called before we know if Menu or Text");
actual->EndMenu(prompt); actual->EndMenu(prompt);
} }
int NetHackQtMenuOrTextWindow::SelectMenu(int how, MENU_ITEM_P **menu_list) int NetHackQtMenuOrTextWindow::SelectMenu(int how, MENU_ITEM_P **menu_list)
{ {
if (!actual) impossible("SelectMenu called before we know if Menu or Text"); if (!actual) impossible("SelectMenu called before we know if Menu or Text");