CShellWindow: use slots for ACKNOWLEDGE_EVENT mode results

This commit is contained in:
2015-03-24 14:46:18 +01:00
parent ae66014102
commit 982fbb962e
2 changed files with 49 additions and 15 deletions

View File

@@ -156,7 +156,8 @@ void CShellWindow::exec()
//callback for line handler
std::string s_output = std::string((output));
OnShellOutputLoop(s_output);
OnShellOutputLoop(s_output, res, &ok);
dprintf(DEBUG_NORMAL, "[CShellWindow] [%s - %d] res=%d ok=%d\n", __func__, __LINE__, *res, ok);
if (lines.size() > lines_max)
lines.pop_front();
txt = "";
@@ -201,12 +202,14 @@ void CShellWindow::exec()
int r = waitpid(pid, &s, 0);
if (res){
dprintf(DEBUG_NORMAL, "[CShellWindow] [%s - %d] res=%d, error[%d]: %s\n", __func__, __LINE__, *res, errno, strerror(errno));
//if res value was generated inside signal, then use foreign res from signal instead own res value
if (OnShellOutputLoop.empty()){
if (r == -1)
*res = errno;
else
*res = WEXITSTATUS(s);
}
}
showResult();
}
@@ -220,12 +223,14 @@ void CShellWindow::showResult()
if (mode & ACKNOWLEDGE){
show_button = true;
}
else if (mode & ACKNOWLEDGE_MSG){
else if (mode & ACKNOWLEDGE_EVENT){
if (*res != 0){
DisplayErrorMessage("Please press button");
OnResultError(res);
if (OnResultError.empty())
DisplayErrorMessage("Error while execution of task. Please see window for details!");
show_button = true;
}else{
DisplayInfoMessage("...ready. Please press OK");
OnResultOk(res);
exit = true;
}
}
@@ -235,7 +240,7 @@ void CShellWindow::showResult()
int b_height = 35;
int xpos = frameBuffer->getScreenWidth() - b_width;
int ypos = frameBuffer->getScreenHeight() - b_height;
CComponentsButton btn(xpos, ypos, b_width, b_height, LOCALE_MESSAGEBOX_OK, NEUTRINO_ICON_BUTTON_OKAY, NULL, true, true);
CComponentsButton btn(xpos, ypos, b_width, b_height, LOCALE_MESSAGEBOX_BACK, NEUTRINO_ICON_BUTTON_OKAY, NULL, true, true);
btn.paint();
}

View File

@@ -49,7 +49,7 @@ class CShellWindow : public sigc::trackable
{
VERBOSE = 1,
ACKNOWLEDGE = 2,
ACKNOWLEDGE_MSG = 4
ACKNOWLEDGE_EVENT = 4
};
CShellWindow(const std::string &Command, const int Mode = 0, int* Res = NULL, bool auto_exec = true);
~CShellWindow();
@@ -79,7 +79,36 @@ class CShellWindow : public sigc::trackable
shell.exec();
...other code...
*/
sigc::signal<void, std::string&> OnShellOutputLoop;
sigc::signal<void, std::string&, int*, bool*> OnShellOutputLoop;
/*!
signal/event handler runs after task is finished.
NOTE: works only with ACKNOWLEDGE_EVENT mode
After executed task comes a default messages (see method showResult()), but with these slots it is possible to use other messages
or any desired action without any touching this class.
Example for implementation in foreign class let show an alternate message than default message:
...your code...
//assuming in your foreign class is declared a member function named YourMemberFunction() without return value and int* as parmeter This method should run
instead the default message.
//declare a slot with return value as 'void' and wihout any parameter
sigc::slot<void, int*> sl;
//fill the slot with your member function in your class with your action
sl = sigc::mem_fun(*this, &CYourClass::YourMemberFunction);
//create the CShellWindow object in verbose mode, important: parameter 'auto_exec' must be set to 'false', so it is possible to connect the slot before engages the exec() methode
CShellWindow shell(cmd, (verbose ? CShellWindow::VERBOSE : 0) | (acknowledge ? CShellWindow::ACKNOWLEDGE_MSG : 0), &res, false);
//connect slot
shell1.OnResultError.connect(sl);
//now exec...
shell.exec();
...other code...
*/
sigc::signal<void, int*> OnResultError;
sigc::signal<void, int*> OnResultOk;
};
#endif