#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"
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()
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<Indexable*> &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; i<n; ++i ) {
+ Indexable *idxbl = args[i];
+ if( !idxbl->is_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)
{
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);
{
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()
{
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();
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();
}
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;
}