Fix runtime with NTOS apps and improve code involved (#53779)

There exists a specific state where ui.open() can be called yet the 
result would be a null window and such behaviour would be intentional. 
The following CRASH in ui.send_asset() would thus be misleading, 
because send_asset() was called after open().

This PR adds more information to the CRASH about when the failure state 
can occur, makes open() return a value based on whether it actually 
opened a new pooled window or not, and makes sure modular computer apps 
don't send_assets unless a new pooled window was created.
This commit is contained in:
Timberpoes
2020-09-18 01:46:33 +01:00
committed by GitHub
parent 8f17ee3ae4
commit 29e8852428
3 changed files with 13 additions and 9 deletions

View File

@@ -37,7 +37,7 @@
if (!ui)
ui = new(user, src, "NtosMain")
ui.set_autoupdate(TRUE)
ui.open()
if(ui.open())
ui.send_asset(get_asset_datum(/datum/asset/simple/headers))

View File

@@ -179,7 +179,7 @@
ui = SStgui.try_update_ui(user, src, ui)
if(!ui && tgui_id)
ui = new(user, src, tgui_id, filedesc)
ui.open()
if(ui.open())
ui.send_asset(get_asset_datum(/datum/asset/simple/headers))
// CONVENTIONS, READ THIS WHEN CREATING NEW PROGRAM AND OVERRIDING THIS PROC:

View File

@@ -67,18 +67,20 @@
* public
*
* Open this UI (and initialize it with data).
*
* return bool - TRUE if a new pooled window is opened, FALSE in all other situations including if a new pooled window didn't open because one already exists.
*/
/datum/tgui/proc/open()
if(!user.client)
return null
return FALSE
if(window)
return null
return FALSE
process_status()
if(status < UI_UPDATE)
return null
return FALSE
window = SStgui.request_pooled_window(user)
if(!window)
return null
return FALSE
opened_at = world.time
window.acquire_lock(src)
if(!window.is_ready())
@@ -101,6 +103,8 @@
with_static_data = TRUE))
SStgui.on_open(src)
return TRUE
/**
* public
*
@@ -156,7 +160,7 @@
*/
/datum/tgui/proc/send_asset(datum/asset/asset)
if(!window)
CRASH("send_asset() can only be called after open().")
CRASH("send_asset() was called either without calling open() first or when open() did not return TRUE.")
return window.send_asset(asset)
/**