X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fshbtnprefs.C;h=679d16f447040dc9ed5e541122e50dcf4a48e970;hp=5d719beb7c91486af8735ab973c1ca70392424d3;hb=fb661e853152fd63537629a20f493a4cdcd4f019;hpb=7fd85fb66168f6b518c5f2d73e04036e87faa0e1 diff --git a/cinelerra-5.1/cinelerra/shbtnprefs.C b/cinelerra-5.1/cinelerra/shbtnprefs.C index 5d719beb..679d16f4 100644 --- a/cinelerra-5.1/cinelerra/shbtnprefs.C +++ b/cinelerra-5.1/cinelerra/shbtnprefs.C @@ -1,8 +1,13 @@ #include "bcwindowbase.h" #include "bcdisplayinfo.h" #include "bcdialog.h" +#include "awindow.h" +#include "awindowgui.h" +#include "cstrdup.h" +#include "indexable.h" #include "language.h" #include "mainerror.h" +#include "mainsession.h" #include "mwindow.h" #include "shbtnprefs.h" #include "preferences.h" @@ -14,12 +19,21 @@ ShBtnRun::ShBtnRun(const char *nm, const char *cmds, int warn) : Thread(0, 0, 1) { + argv.set_array_delete(); strncpy(name, nm, sizeof(name)-1); name[sizeof(name)-1] = 0; strncpy(commands, cmds, sizeof(commands)-1); commands[sizeof(commands)-1] = 0; this->warn = warn; - start(); +} +ShBtnRun::~ShBtnRun() +{ + argv.remove_all_objects(); +} + +void ShBtnRun::add_arg(const char *v) +{ + argv.append(cstrdup(v)); } void ShBtnRun::run() @@ -29,33 +43,58 @@ void ShBtnRun::run() perror("fork"); return; } - if( pid > 0 ) { - int stat; waitpid(pid, &stat, 0); - if( warn && stat ) { - char msg[BCTEXTLEN]; - sprintf(msg, "%s: error exit status %d", name, stat); - MainError::show_error(msg); - } + char msg[BCTEXTLEN]; + if( !pid ) { + argv.append(0); + execvp(argv[0], &argv[0]); return; } - char *const argv[4] = { (char*) "/bin/bash", (char*) "-c", commands, 0 }; - execvp(argv[0], &argv[0]); + // warn <0:always, =0:never, >0:on err + if( !warn ) return; + int stat; waitpid(pid, &stat, 0); + if( !stat ) { + if( warn > 0 ) return; + sprintf(msg, "%s: completed", name); + } + else + sprintf(msg, "%s: error exit status %d", name, stat); + MainError::show_error(msg); } -ShBtnPref::ShBtnPref(const char *nm, const char *cmds, int warn) +ShBtnPref::ShBtnPref(const char *nm, const char *cmds, int warn, int run_script) { strncpy(name, nm, sizeof(name)); strncpy(commands, cmds, sizeof(commands)); this->warn = warn; + this->run_script = run_script; } ShBtnPref::~ShBtnPref() { } +void ShBtnPref::execute(ArrayList &args) +{ +// thread async+autodelete, no explicit delete + ShBtnRun *job = new ShBtnRun(name, commands, warn); + job->add_arg("/bin/bash"); + job->add_arg(commands); + int n = args.size(); + for( int i=0; iis_asset ) continue; + job->add_arg(idxbl->path); + } + job->start(); +} + void ShBtnPref::execute() { - new ShBtnRun(name, commands, warn); + ShBtnRun *job = new ShBtnRun(name, commands, warn); + job->add_arg("/bin/bash"); + job->add_arg("-c"); + job->add_arg(commands); + job->start(); } ShBtnEditDialog::ShBtnEditDialog(PreferencesWindow *pwindow) @@ -122,7 +161,7 @@ int ShBtnAddButton::handle_event() { Preferences *preferences = sb_window->shbtn_edit->pwindow->thread->preferences; - ShBtnPref *pref = new ShBtnPref(_("new"), "", 0); + ShBtnPref *pref = new ShBtnPref(_("new"), "", 0, 0); preferences->shbtn_prefs.append(pref); sb_window->list_update(); return sb_window->start_edit(pref); @@ -182,21 +221,60 @@ ShBtnTextWindow::ShBtnTextWindow(ShBtnEditWindow *sb_window, int x, int y) { this->sb_window = sb_window; warn = sb_window->sb_dialog->pref->warn; + run_script = sb_window->sb_dialog->pref->run_script; } ShBtnTextWindow::~ShBtnTextWindow() { } + +ShBtnErrWarnItem::ShBtnErrWarnItem(ShBtnErrWarn *popup, + const char *text, int warn) + : BC_MenuItem(text) +{ + this->popup = popup; + this->warn = warn; +} + +int ShBtnErrWarnItem::handle_event() +{ + popup->set_text(get_text()); + popup->st_window->warn = warn; + return 1; +} + ShBtnErrWarn::ShBtnErrWarn(ShBtnTextWindow *st_window, int x, int y) - : BC_CheckBox(x, y, &st_window->warn, _("Warn on err exit")) + : BC_PopupMenu(x, y, 120, st_window->warn < 0 ? _("Always"): + !st_window->warn ? _("Never") : _("On Error")) { this->st_window = st_window; } - ShBtnErrWarn::~ShBtnErrWarn() { } +int ShBtnErrWarn::handle_event() +{ + return 0; +} + +void ShBtnErrWarn::create_objects() +{ + add_item(new ShBtnErrWarnItem(this,_("Always"), -1)); + add_item(new ShBtnErrWarnItem(this,_("Never"), 0)); + add_item(new ShBtnErrWarnItem(this,_("On Error"), 1)); +} + + +ShBtnRunScript::ShBtnRunScript(ShBtnTextWindow *st_window, int x, int y) + : BC_CheckBox(x, y, &st_window->run_script, _("run /path/script.sh + argvs")) +{ + this->st_window = st_window; +} + +ShBtnRunScript::~ShBtnRunScript() +{ +} void ShBtnTextWindow::create_objects() { @@ -214,7 +292,12 @@ void ShBtnTextWindow::create_objects() cmd_text = new BC_ScrollTextBox(this, x1, y, get_w()-x1-20, 4, pref->commands); cmd_text->create_objects(); y += cmd_text->get_h() + 16; + add_subwindow(title = new BC_Title(x1,y, _("OnExit Notify:"))); + x1 += title->get_w() + 10; add_subwindow(st_err_warn = new ShBtnErrWarn(this, x1, y)); + st_err_warn->create_objects(); + x1 += st_err_warn->get_w() + 20; + add_subwindow(st_run_script = new ShBtnRunScript(this, x1, y)); y = get_h() - ShBtnTextOK::calculate_h() - 10; add_subwindow(new ShBtnTextOK(this, x, y)); show_window(); @@ -237,6 +320,7 @@ int ShBtnTextOK::handle_event() strcpy(pref->name, st_window->cmd_name->get_text()); strcpy(pref->commands, st_window->cmd_text->get_text()); pref->warn = st_window->warn; + pref->run_script = st_window->run_script; return BC_OKButton::handle_event(); } @@ -331,7 +415,16 @@ MainShBtnItem::MainShBtnItem(MainShBtns *shbtns, ShBtnPref *pref) int MainShBtnItem::handle_event() { - pref->execute(); + MWindow *mwindow = shbtns->mwindow; + if( pref->run_script ) { + AWindowGUI *agui = mwindow->awindow->gui; + agui->lock_window("MainShBtnItem::handle_event"); + mwindow->awindow->gui->collect_assets(); + pref->execute(*mwindow->session->drag_assets); + agui->unlock_window(); + } + else + pref->execute(); return 1; }