Skip to content

Commit

Permalink
lua: Handle file dialogs completely on main gui thread
Browse files Browse the repository at this point in the history
wx doesn't seem to like the dialogs being created on some other worker
thread, which makes file dialogs opened by lua scripts crash in various
ways on Linux. Doing everything on the main thread hopefully fixes this.

Fixes #51 .
  • Loading branch information
arch1t3cht committed Dec 3, 2023
1 parent d8910f5 commit 71fce77
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 33 deletions.
7 changes: 0 additions & 7 deletions src/auto4_base.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -220,13 +220,6 @@ namespace Automation4 {
});
}

int ProgressSink::ShowDialog(wxDialog *dialog)
{
int ret = 0;
agi::dispatch::Main().Sync([&] { ret = dialog->ShowModal(); });
return ret;
}

BackgroundScriptRunner::BackgroundScriptRunner(wxWindow *parent, std::string const& title)
: impl(new DialogProgress(parent, to_wx(title)))
{
Expand Down
1 change: 0 additions & 1 deletion src/auto4_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,6 @@ namespace Automation4 {
/// Show the passed dialog on the GUI thread, blocking the calling
/// thread until it closes
void ShowDialog(ScriptDialog *config_dialog);
int ShowDialog(wxDialog *dialog);
wxWindow *GetParentWindow() const { return bsr->GetParentWindow(); }

/// Get the current automation trace level
Expand Down
50 changes: 25 additions & 25 deletions src/auto4_lua_progresssink.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@

#include "compat.h"

#include <libaegisub/dispatch.h>
#include <libaegisub/lua/utils.h>

#include <wx/filedlg.h>
Expand Down Expand Up @@ -197,7 +198,6 @@ namespace Automation4 {

int LuaProgressSink::LuaDisplayOpenDialog(lua_State *L)
{
ProgressSink *ps = GetObjPointer(L, lua_upvalueindex(1));
wxString message(check_wxstring(L, 1));
wxString dir(check_wxstring(L, 2));
wxString file(check_wxstring(L, 3));
Expand All @@ -211,26 +211,24 @@ namespace Automation4 {
if (must_exist)
flags |= wxFD_FILE_MUST_EXIST;

wxFileDialog diag(nullptr, message, dir, file, wildcard, flags);
if (ps->ShowDialog(&diag) == wxID_CANCEL) {
lua_pushnil(L);
return 1;
}

if (multiple) {
wxArrayString files;
diag.GetPaths(files);

lua_createtable(L, files.size(), 0);
for (size_t i = 0; i < files.size(); ++i) {
lua_pushstring(L, files[i].utf8_str());
lua_rawseti(L, -2, i + 1);
agi::dispatch::Main().Sync([&] {
wxFileDialog diag(nullptr, message, dir, file, wildcard, flags);
if (diag.ShowModal() == wxID_CANCEL) {
lua_pushnil(L);
} else if (multiple) {
wxArrayString files;
diag.GetPaths(files);

lua_createtable(L, files.size(), 0);
for (size_t i = 0; i < files.size(); ++i) {
lua_pushstring(L, files[i].utf8_str());
lua_rawseti(L, -2, i + 1);
}
} else {
lua_pushstring(L, diag.GetPath().utf8_str());
}
});

return 1;
}

lua_pushstring(L, diag.GetPath().utf8_str());
return 1;
}

Expand All @@ -247,13 +245,15 @@ namespace Automation4 {
if (prompt_overwrite)
flags |= wxFD_OVERWRITE_PROMPT;

wxFileDialog diag(ps->GetParentWindow(), message, dir, file, wildcard, flags);
if (ps->ShowDialog(&diag) == wxID_CANCEL) {
lua_pushnil(L);
return 1;
}
agi::dispatch::Main().Sync([&] {
wxFileDialog diag(ps->GetParentWindow(), message, dir, file, wildcard, flags);
if (diag.ShowModal() == wxID_CANCEL) {
lua_pushnil(L);
} else {
lua_pushstring(L, diag.GetPath().utf8_str());
}
});

lua_pushstring(L, diag.GetPath().utf8_str());
return 1;
}
}

0 comments on commit 71fce77

Please sign in to comment.