void ProcessInputChannel::initialize() { _backgroundOutputPipe = new QLocalSocket(); QObject::connect(_backgroundOutputPipe, SIGNAL(connected()), this, SLOT(onOutputPipeConnectionMade())); _backgroundOutputPipe->connectToServer(_mainProcessServerName,QLocalSocket::ReadWrite); _backgroundIPCServer = new QLocalServer(); QObject::connect(_backgroundIPCServer,SIGNAL(newConnection()),this,SLOT(onNewConnectionPending())); QString serverName; { QTemporaryFile tmpf(QDir::tempPath() + QDir::separator() + NATRON_APPLICATION_NAME "_INPUT_SOCKET" + QString::number(QCoreApplication::applicationPid())); tmpf.open(); serverName = tmpf.fileName(); } _backgroundIPCServer->listen(serverName); if(!_backgroundOutputPipe->waitForConnected(5000)){ //< blocking, we wait for the server to respond std::cout << "WARNING: The GUI application failed to respond, canceling this process will not be possible" " unless it finishes or you kill it." << std::endl; } writeToOutputChannel(QString(kBgProcessServerCreatedShort) + _backgroundIPCServer->fullServerName()); ///we wait for the GUI app to connect its socket to this server, we let it 5 sec to reply _backgroundIPCServer->waitForNewConnection(5000); ///since we're still not returning the event loop, just process them manually in case ///Qt didn't caught the new connection pending. QCoreApplication::processEvents(); }
void FileLoader::readParagraphStyle(ParagraphStyle& vg, const QDomElement& pg, SCFonts &avail, ScribusDoc *currDoc) { vg.setName(pg.attribute("NAME")); vg.setLineSpacingMode(static_cast<ParagraphStyle::LineSpacingMode>(pg.attribute("LINESPMode", "0").toInt())); vg.setLineSpacing(ScCLocale::toDoubleC(pg.attribute("LINESP"))); vg.setLeftMargin(ScCLocale::toDoubleC(pg.attribute("INDENT"), 0.0)); if (pg.hasAttribute("RMARGIN")) vg.setRightMargin(ScCLocale::toDoubleC(pg.attribute("RMARGIN"), 0.0)); else vg.setRightMargin(0); vg.setFirstIndent(ScCLocale::toDoubleC(pg.attribute("FIRST"), 0.0)); vg.setAlignment(static_cast<ParagraphStyle::AlignmentType>(pg.attribute("ALIGN").toInt())); vg.setGapBefore(ScCLocale::toDoubleC(pg.attribute("VOR"), 0.0)); vg.setGapAfter(ScCLocale::toDoubleC(pg.attribute("NACH"), 0.0)); QString tmpf(pg.attribute("FONT", currDoc->itemToolPrefs().textFont)); currDoc->AllFonts->findFont(tmpf, currDoc); vg.charStyle().setFont((*currDoc->AllFonts)[tmpf]); vg.charStyle().setFontSize(qRound(ScCLocale::toDoubleC(pg.attribute("FONTSIZE"), 12.0) * 10.0)); vg.setHasDropCap(static_cast<bool>(pg.attribute("DROP", "0").toInt())); vg.setDropCapLines(pg.attribute("DROPLIN", "2").toInt()); vg.setDropCapOffset(ScCLocale::toDoubleC(pg.attribute("DROPDIST"), 0.0)); vg.charStyle().setFeatures(static_cast<StyleFlag>(pg.attribute("EFFECT", "0").toInt()).featureList()); vg.charStyle().setFillColor(pg.attribute("FCOLOR", currDoc->itemToolPrefs().shapeFillColor)); vg.charStyle().setFillShade(pg.attribute("FSHADE", "100").toInt()); vg.charStyle().setStrokeColor(pg.attribute("SCOLOR", currDoc->itemToolPrefs().shapeLineColor)); vg.charStyle().setStrokeShade(pg.attribute("SSHADE", "100").toInt()); if (static_cast<bool>(pg.attribute("BASE", "0").toInt())) vg.setLineSpacingMode(ParagraphStyle::BaselineGridLineSpacing); vg.charStyle().setShadowXOffset(qRound(ScCLocale::toDoubleC(pg.attribute("TXTSHX"), 5.0)) * 10); vg.charStyle().setShadowYOffset(qRound(ScCLocale::toDoubleC(pg.attribute("TXTSHY"), -5.0)) * 10); vg.charStyle().setOutlineWidth(qRound(ScCLocale::toDoubleC(pg.attribute("TXTOUT"), 1.0)) * 10); vg.charStyle().setUnderlineOffset(qRound(ScCLocale::toDoubleC(pg.attribute("TXTULP"), -0.1)) * 10); vg.charStyle().setUnderlineWidth(qRound(ScCLocale::toDoubleC(pg.attribute("TXTULW"), -0.1)) * 10); vg.charStyle().setStrikethruOffset(qRound(ScCLocale::toDoubleC(pg.attribute("TXTSTP"), -0.1)) * 10); vg.charStyle().setStrikethruWidth(qRound(ScCLocale::toDoubleC(pg.attribute("TXTSTW"), -0.1)) * 10); vg.charStyle().setScaleH(qRound(ScCLocale::toDoubleC(pg.attribute("SCALEH"), 100.0)) * 10); vg.charStyle().setScaleV(qRound(ScCLocale::toDoubleC(pg.attribute("SCALEV"), 100.0)) * 10); vg.charStyle().setBaselineOffset(qRound(ScCLocale::toDoubleC(pg.attribute("BASEO"), 0.0)) * 10); vg.charStyle().setTracking(qRound(ScCLocale::toDoubleC(pg.attribute("KERN"), 0.0)) * 10); if ((pg.hasAttribute("NUMTAB")) && (pg.attribute("NUMTAB", "0").toInt() != 0)) { QList<ParagraphStyle::TabRecord> tbs; ParagraphStyle::TabRecord tb; QString tmp = pg.attribute("TABS"); QTextStream tgv(&tmp, QIODevice::ReadOnly); QString xf, xf2; for (int cxv = 0; cxv < pg.attribute("NUMTAB", "0").toInt(); cxv += 2) { tgv >> xf; tgv >> xf2; tb.tabPosition = ScCLocale::toDoubleC(xf2); tb.tabType = static_cast<int>(ScCLocale::toDoubleC(xf)); tb.tabFillChar = QChar(); tbs.append(tb); } vg.setTabValues(tbs); tmp = ""; }
void ProcessInputChannel::initialize() { _backgroundOutputPipe = new QLocalSocket(); QObject::connect( _backgroundOutputPipe, SIGNAL(connected()), this, SLOT(onOutputPipeConnectionMade()) ); _backgroundOutputPipe->connectToServer(_mainProcessServerName,QLocalSocket::ReadWrite); std::cout << "Attempting connection to " << _mainProcessServerName.toStdString() << std::endl; _backgroundIPCServer = new QLocalServer(); QObject::connect( _backgroundIPCServer,SIGNAL(newConnection()),this,SLOT(onNewConnectionPending()) ); QString tmpFileName; #if defined(Q_OS_WIN) tmpFileName += QString::fromUtf8("//./pipe"); tmpFileName += QLatin1Char('/'); tmpFileName += QString::fromUtf8(NATRON_APPLICATION_NAME); tmpFileName += QString::fromUtf8("_INPUT_SOCKET"); #endif { #if defined(Q_OS_UNIX) QTemporaryFile tmpf(tmpFileName); tmpFileName = tmpf.fileName(); tmpf.remove(); #else QTemporaryFile tmpf; tmpf.open(); QString tmpFilePath = tmpf.fileName(); QString baseName; int lastSlash = tmpFilePath.lastIndexOf(QLatin1Char('/')); if (lastSlash != -1 && lastSlash < tmpFilePath.size() - 1) { baseName = tmpFilePath.mid(lastSlash + 1); } else { baseName = tmpFilePath; } tmpFileName += baseName; tmpf.remove(); #endif } _backgroundIPCServer->listen(tmpFileName); if ( !_backgroundOutputPipe->waitForConnected(5000) ) { //< blocking, we wait for the server to respond std::cout << "WARNING: The GUI application failed to respond, canceling this process will not be possible" " unless it finishes or you kill it." << std::endl; } writeToOutputChannel( QString::fromUtf8(kBgProcessServerCreatedShort) + tmpFileName ); ///we wait for the GUI app to connect its socket to this server, we let it 5 sec to reply _backgroundIPCServer->waitForNewConnection(5000); ///since we're still not returning the event loop, just process them manually in case ///Qt didn't caught the new connection pending. QCoreApplication::processEvents(); }
ProcessHandler::ProcessHandler(AppInstance* app, const QString& projectPath, Natron::OutputEffectInstance* writer) : _app(app) ,_process(new QProcess) ,_writer(writer) ,_ipcServer(0) ,_bgProcessOutputSocket(0) ,_bgProcessInputSocket(0) ,_earlyCancel(false) ,_processLog() { ///setup the server used to listen the output of the background process _ipcServer = new QLocalServer(); QObject::connect(_ipcServer,SIGNAL(newConnection()),this,SLOT(onNewConnectionPending())); QString serverName; int randomNumber = std::rand(); { QTemporaryFile tmpf(NATRON_APPLICATION_NAME "_OUTPUT_PIPE_" + QString::number(randomNumber)); tmpf.open(); serverName = tmpf.fileName(); tmpf.remove(); } _ipcServer->listen(serverName); QStringList processArgs; processArgs << projectPath << "-b" << "-w" << writer->getName().c_str(); processArgs << "--IPCpipe" << (_ipcServer->fullServerName()); ///connect the useful slots of the process QObject::connect(_process,SIGNAL(readyReadStandardOutput()),this,SLOT(onStandardOutputBytesWritten())); QObject::connect(_process,SIGNAL(readyReadStandardError()),this,SLOT(onStandardErrorBytesWritten())); QObject::connect(_process,SIGNAL(error(QProcess::ProcessError)),this,SLOT(onProcessError(QProcess::ProcessError))); QObject::connect(_process,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(onProcessEnd(int,QProcess::ExitStatus))); ///start the process _processLog.push_back("Starting background rendering: " + QCoreApplication::applicationFilePath()); _processLog.push_back(" "); for (int i = 0; i < processArgs.size(); ++i) { _processLog.push_back(processArgs[i] + " "); } _process->start(QCoreApplication::applicationFilePath(),processArgs); }
void MainWidget::on_saveButton_clicked() { QString format = "png"; QString folder = savePath; QDir temp(folder); if (!temp.exists()) { qDebug() << folder; bool ok = temp.mkpath(folder); qDebug() << ok; if (!ok) { folder = QDir::currentPath(); } } QString initialPath; while (true) { initialPath = folder + ("/screenshot_"+ QString::number(count, 10) +".") + format; QFile tmpf(initialPath); if (tmpf.exists()) count++; else break; } QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), initialPath, tr("%1 Files (*.%2);;All Files (*)") .arg(format.toUpper()) .arg(format)); if (!fileName.isEmpty()) { bool ok = originalPixmap.save(fileName, format.toAscii()); if (ok) count++; } }
ProcessHandler::ProcessHandler(const QString & projectPath, const NodePtr& writer) : _process(new QProcess) , _writer(writer) , _ipcServer(0) , _bgProcessOutputSocket(0) , _bgProcessInputSocket(0) , _earlyCancel(false) , _processLog() , _processArgs() { ///setup the server used to listen the output of the background process _ipcServer = new QLocalServer(); QObject::connect( _ipcServer, SIGNAL(newConnection()), this, SLOT(onNewConnectionPending()) ); QString tmpFileName; #if defined(Q_OS_WIN) tmpFileName += QString::fromUtf8("//./pipe"); tmpFileName += QLatin1Char('/'); tmpFileName += QString::fromUtf8(NATRON_APPLICATION_NAME); tmpFileName += QString::fromUtf8("_INPUT_SOCKET"); #endif { #if defined(Q_OS_UNIX) QTemporaryFile tmpf(tmpFileName); tmpf.open(); tmpFileName = tmpf.fileName(); tmpf.remove(); #else QTemporaryFile tmpf; tmpf.open(); QString tmpFilePath = tmpf.fileName(); QString baseName; int lastSlash = tmpFilePath.lastIndexOf( QLatin1Char('/') ); if ( (lastSlash != -1) && (lastSlash < tmpFilePath.size() - 1) ) { baseName = tmpFilePath.mid(lastSlash + 1); } else { baseName = tmpFilePath; } tmpFileName += baseName; tmpf.remove(); #endif } _ipcServer->listen(tmpFileName); _processArgs << QString::fromUtf8("-b") << QString::fromUtf8("-w") << QString::fromUtf8( writer->getScriptName_mt_safe().c_str() ); _processArgs << QString::fromUtf8("--IPCpipe") << tmpFileName; _processArgs << projectPath; ///connect the useful slots of the process QObject::connect( _process, SIGNAL(readyReadStandardOutput()), this, SLOT(onStandardOutputBytesWritten()) ); QObject::connect( _process, SIGNAL(readyReadStandardError()), this, SLOT(onStandardErrorBytesWritten()) ); QObject::connect( _process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(onProcessError(QProcess::ProcessError)) ); QObject::connect( _process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(onProcessEnd(int,QProcess::ExitStatus)) ); ///start the process _processLog.push_back( tr("Starting background rendering: %1 %2") .arg( QCoreApplication::applicationFilePath() ) .arg( _processArgs.join( QString::fromUtf8(" ") ) ) ); }