Create the ContextWriter+Tx from UI thread on filters (related to #2122)

When we create a Tx the active site is queried, and the UIContext
needs access to the UI to calculate the active site correctly.
This commit is contained in:
David Capello 2019-07-29 12:13:53 -03:00
parent b5547251f5
commit 4264f199cd
4 changed files with 24 additions and 5 deletions

View File

@ -280,10 +280,6 @@ void FilterManagerImpl::applyToTarget()
return;
}
// Initialize writting operation
ContextWriter writer(m_reader);
m_tx.reset(new Tx(writer.context(), m_filter->getName(), ModifyDocument));
m_progressBase = 0.0f;
m_progressWidth = (cels.size() > 0 ? 1.0f / cels.size(): 1.0f);
@ -322,9 +318,18 @@ void FilterManagerImpl::applyToTarget()
m_oldPalette.reset(nullptr);
}
void FilterManagerImpl::initTransaction()
{
ASSERT(!m_tx);
m_writer.reset(new ContextWriter(m_reader));
m_tx.reset(new Tx(m_writer->context(),
m_filter->getName(),
ModifyDocument));
}
bool FilterManagerImpl::isTransaction() const
{
return m_tx != nullptr;
return (m_tx != nullptr);
}
// This must be executed in the main UI thread.
@ -333,6 +338,7 @@ void FilterManagerImpl::commitTransaction()
{
ASSERT(m_tx);
m_tx->commit();
m_writer.reset();
}
#ifdef ENABLE_UI

View File

@ -90,6 +90,8 @@ namespace app {
void end();
bool applyStep();
void applyToTarget();
void initTransaction();
bool isTransaction() const;
void commitTransaction();
@ -141,6 +143,7 @@ namespace app {
#endif
ContextReader m_reader;
std::unique_ptr<ContextWriter> m_writer;
Site& m_site;
Filter* m_filter;
doc::Cel* m_cel;

View File

@ -135,6 +135,9 @@ FilterWorker::~FilterWorker()
void FilterWorker::run()
{
// Initialize writting transaction
m_filterMgr->initTransaction();
#ifdef ENABLE_UI
std::thread thread;
// Open the alert window in foreground (this is modal, locks the main thread)

View File

@ -28,6 +28,7 @@
#include "app/ui/workspace_tabs.h"
#include "base/mutex.h"
#include "doc/sprite.h"
#include "ui/system.h"
#include <algorithm>
@ -282,6 +283,12 @@ void UIContext::onRemoveDocument(Doc* doc)
void UIContext::onGetActiveSite(Site* site) const
{
// We can use the activeView only from the UI thread.
#ifdef _DEBUG
if (isUIAvailable())
ui::assert_ui_thread();
#endif
DocView* view = activeView();
if (view) {
view->getSite(site);