void finish (bool shouldKill) { String result; Array<URL> selection; if (shouldKill) child.kill(); else result = child.readAllProcessOutput().trim(); if (result.isNotEmpty()) { StringArray tokens; if (selectMultipleFiles) tokens.addTokens (result, separator, "\""); else tokens.add (result); for (auto& token : tokens) selection.add (URL (File::getCurrentWorkingDirectory().getChildFile (token))); } if (! shouldKill) { child.waitForProcessToFinish (60 * 1000); owner.finished (selection); } }
void AppsPageComponent::startOrFocusApp(AppIconButton* appButton) { if (debounce) return; bool shouldStart = true; int appIdx = runningAppsByButton[appButton]; bool hasLaunched = runningApps[appIdx] != nullptr; String windowId; if(hasLaunched) { const auto shellWords = split(appButton->shell, " "); const auto& cmdName = shellWords[0]; StringArray findCmd{"xdotool", "search", "--all", "--limit", "1", "--class", cmdName.toRawUTF8()}; ChildProcess findWindow; findWindow.start(findCmd); findWindow.waitForProcessToFinish(1000); windowId = findWindow.readAllProcessOutput().trimEnd(); // does xdotool find a window id? if so, we shouldn't start a new one shouldStart = (windowId.length() > 0) ? false : true; } if (shouldStart) { startApp(appButton); } else { focusApp(appButton, windowId); } };
static bool exeIsAvailable (const char* const executable) { ChildProcess child; const bool ok = child.start ("which " + String (executable)) && child.readAllProcessOutput().trim().isNotEmpty(); child.waitForProcessToFinish (60 * 1000); return ok; }
bool FileChooser::isPlatformDialogAvailable() { ChildProcess child; const bool ok = child.start ("which zenity") && child.readAllProcessOutput().trim().isNotEmpty(); child.waitForProcessToFinish (60 * 1000); return ok; }
bool runLameChildProcess (const TemporaryFile& tempMP3, const StringArray& processArgs) const { ChildProcess cp; if (cp.start (processArgs)) { const String childOutput (cp.readAllProcessOutput()); DBG (childOutput); ignoreUnused (childOutput); cp.waitForProcessToFinish (10000); return tempMP3.getFile().getSize() > 0; } return false; }
void FileChooser::showPlatformDialog (Array<File>& results, const String& title, const File& file, const String& filters, bool isDirectory, bool selectsFiles, bool isSave, bool warnAboutOverwritingExistingFiles, bool selectMultipleFiles, FilePreviewComponent* previewComponent) { const String separator (":"); String command ("zenity --file-selection"); if (title.isNotEmpty()) command << " --title=\"" << title << "\""; if (file != File::nonexistent) command << " --filename=\"" << file.getFullPathName () << "\""; if (isDirectory) command << " --directory"; if (isSave) command << " --save"; if (selectMultipleFiles) command << " --multiple --separator=" << separator; command << " 2>&1"; ChildProcess child; if (child.start (command)) { const String result (child.readAllProcessOutput().trim()); if (result.isNotEmpty()) { StringArray tokens; if (selectMultipleFiles) tokens.addTokens (result, separator, "\""); else tokens.add (result); for (int i = 0; i < tokens.size(); i++) results.add (File (tokens[i])); } child.waitForProcessToFinish (60 * 1000); } }
void FileChooser::showPlatformDialog (Array<File>& results, const String& title, const File& file, const String& filters, bool isDirectory, bool /* selectsFiles */, bool isSave, bool /* warnAboutOverwritingExistingFiles */, bool selectMultipleFiles, FilePreviewComponent*) { const File previousWorkingDirectory (File::getCurrentWorkingDirectory()); StringArray args; String separator; // use kdialog for KDE sessions or if zenity is missing if (exeIsAvailable ("kdialog") && (isKdeFullSession() || ! exeIsAvailable ("zenity"))) addKDialogArgs (args, separator, title, file, filters, isDirectory, isSave, selectMultipleFiles); else addZenityArgs (args, separator, title, file, filters, isDirectory, isSave, selectMultipleFiles); args.add ("2>/dev/null"); // (to avoid logging info ending up in the results) ChildProcess child; if (child.start (args, ChildProcess::wantStdOut)) { const String result (child.readAllProcessOutput().trim()); if (result.isNotEmpty()) { StringArray tokens; if (selectMultipleFiles) tokens.addTokens (result, separator, "\""); else tokens.add (result); for (int i = 0; i < tokens.size(); ++i) results.add (File::getCurrentWorkingDirectory().getChildFile (tokens[i])); } child.waitForProcessToFinish (60 * 1000); } previousWorkingDirectory.setAsCurrentWorkingDirectory(); }
void FileChooser::showPlatformDialog (Array<File>& results, const String& title, const File& file, const String& /* filters */, bool isDirectory, bool /* selectsFiles */, bool isSave, bool /* warnAboutOverwritingExistingFiles */, bool selectMultipleFiles, FilePreviewComponent* /* previewComponent */) { String separator; StringArray args; const File previousWorkingDirectory (File::getCurrentWorkingDirectory()); const bool isKdeFullSession = SystemStats::getEnvironmentVariable ("KDE_FULL_SESSION", String::empty) .equalsIgnoreCase ("true"); if (exeIsAvailable ("kdialog") && (isKdeFullSession || ! exeIsAvailable ("zenity"))) { // use kdialog for KDE sessions or if zenity is missing args.add ("kdialog"); if (title.isNotEmpty()) args.add ("--title=" + title); if (selectMultipleFiles) { separator = "\n"; args.add ("--multiple"); args.add ("--separate-output"); args.add ("--getopenfilename"); } else { if (isSave) args.add ("--getsavefilename"); else if (isDirectory) args.add ("--getexistingdirectory"); else args.add ("--getopenfilename"); } String startPath; if (file.exists() || file.getParentDirectory().exists()) { startPath = file.getFullPathName(); } else { startPath = File::getSpecialLocation (File::userHomeDirectory).getFullPathName(); if (isSave) startPath += "/" + file.getFileName(); } args.add (startPath); } else { // zenity args.add ("zenity"); args.add ("--file-selection"); if (title.isNotEmpty()) args.add ("--title=" + title); if (selectMultipleFiles) { separator = ":"; args.add ("--multiple"); args.add ("--separator=" + separator); } else { if (isDirectory) args.add ("--directory"); if (isSave) args.add ("--save"); } if (file.isDirectory()) file.setAsCurrentWorkingDirectory(); else if (file.getParentDirectory().exists()) file.getParentDirectory().setAsCurrentWorkingDirectory(); else File::getSpecialLocation (File::userHomeDirectory).setAsCurrentWorkingDirectory(); if (! file.getFileName().isEmpty()) args.add ("--filename=" + file.getFileName()); } ChildProcess child; if (child.start (args)) { const String result (child.readAllProcessOutput().trim()); if (result.isNotEmpty()) { StringArray tokens; if (selectMultipleFiles) tokens.addTokens (result, separator, "\""); else tokens.add (result); for (int i = 0; i < tokens.size(); i++) results.add (File (tokens[i])); } child.waitForProcessToFinish (60 * 1000); } previousWorkingDirectory.setAsCurrentWorkingDirectory(); }