diff --git a/src/gui/widget/shellwindow.cpp b/src/gui/widget/shellwindow.cpp index d7e4c7f9a..c108e3edf 100644 --- a/src/gui/widget/shellwindow.cpp +++ b/src/gui/widget/shellwindow.cpp @@ -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 = ""; @@ -200,12 +201,14 @@ void CShellWindow::exec() errno = 0; 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 (r == -1) - *res = errno; - else - *res = WEXITSTATUS(s); + if (res){ + //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(); } diff --git a/src/gui/widget/shellwindow.h b/src/gui/widget/shellwindow.h index 45d4cda84..9812c4b11 100644 --- a/src/gui/widget/shellwindow.h +++ b/src/gui/widget/shellwindow.h @@ -47,9 +47,9 @@ class CShellWindow : public sigc::trackable public: enum shellwindow_modes { - VERBOSE = 1, - ACKNOWLEDGE = 2, - ACKNOWLEDGE_MSG = 4 + VERBOSE = 1, + ACKNOWLEDGE = 2, + 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 OnShellOutputLoop; + sigc::signal 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 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 OnResultError; + sigc::signal OnResultOk; }; #endif