* apt-pkg/deb/dpkgpm.cc:
[ntk/apt.git] / apt-pkg / install-progress.cc
index 8bb587f..cf6c859 100644 (file)
@@ -256,14 +256,14 @@ PackageManagerFancy::TermSize
 PackageManagerFancy::GetTerminalSize()
 {
    struct winsize win;
-   PackageManagerFancy::TermSize s;
+   PackageManagerFancy::TermSize s = { 0, 0 };
 
    // FIXME: get from "child_pty" instead?
    if(ioctl(STDOUT_FILENO, TIOCGWINSZ, (char *)&win) != 0)
       return s;
 
    if(_config->FindB("Debug::InstallProgress::Fancy", false) == true)
-      std::cerr << "GetTerminalSize: " << win.ws_row << std::endl;
+      std::cerr << "GetTerminalSize: " << win.ws_row << " x " << win.ws_col << std::endl;
 
    s.rows = win.ws_row;
    s.columns = win.ws_col;
@@ -275,6 +275,9 @@ void PackageManagerFancy::SetupTerminalScrollArea(int nr_rows)
      if(_config->FindB("Debug::InstallProgress::Fancy", false) == true)
         std::cerr << "SetupTerminalScrollArea: " << nr_rows << std::endl;
 
+     if (unlikely(nr_rows <= 1))
+       return;
+
      // scroll down a bit to avoid visual glitch when the screen
      // area shrinks by one row
      std::cout << "\n";
@@ -296,28 +299,30 @@ void PackageManagerFancy::SetupTerminalScrollArea(int nr_rows)
      // setup tty size to ensure xterm/linux console are working properly too
      // see bug #731738
      struct winsize win;
-     ioctl(child_pty, TIOCGWINSZ, (char *)&win);
-     win.ws_row = nr_rows - 1;
-     ioctl(child_pty, TIOCSWINSZ, (char *)&win);
+     if (ioctl(child_pty, TIOCGWINSZ, (char *)&win) != -1)
+     {
+       win.ws_row = nr_rows - 1;
+       ioctl(child_pty, TIOCSWINSZ, (char *)&win);
+     }
 }
 
 void PackageManagerFancy::HandleSIGWINCH(int)
 {
-   int nr_terminal_rows = GetTerminalSize().rows;
+   int const nr_terminal_rows = GetTerminalSize().rows;
    SetupTerminalScrollArea(nr_terminal_rows);
+   DrawStatusLine();
 }
 
 void PackageManagerFancy::Start(int a_child_pty)
 {
    child_pty = a_child_pty;
-   int nr_terminal_rows = GetTerminalSize().rows;
-   if (nr_terminal_rows > 0)
-      SetupTerminalScrollArea(nr_terminal_rows);
+   int const nr_terminal_rows = GetTerminalSize().rows;
+   SetupTerminalScrollArea(nr_terminal_rows);
 }
 
 void PackageManagerFancy::Stop()
 {
-   int nr_terminal_rows = GetTerminalSize().rows;
+   int const nr_terminal_rows = GetTerminalSize().rows;
    if (nr_terminal_rows > 0)
    {
       SetupTerminalScrollArea(nr_terminal_rows + 1);
@@ -358,7 +363,13 @@ bool PackageManagerFancy::StatusChanged(std::string PackageName,
           HumanReadableAction))
       return false;
 
-   PackageManagerFancy::TermSize size = GetTerminalSize();
+   return DrawStatusLine();
+}
+bool PackageManagerFancy::DrawStatusLine()
+{
+   PackageManagerFancy::TermSize const size = GetTerminalSize();
+   if (unlikely(size.rows < 1 || size.columns < 1))
+      return false;
 
    static std::string save_cursor = "\033[s";
    static std::string restore_cursor = "\033[u";
@@ -388,7 +399,7 @@ bool PackageManagerFancy::StatusChanged(std::string PackageName,
    {
       int padding = 4;
       float progressbar_size = size.columns - padding - progress_str.size();
-      float current_percent = (float)StepsDone/(float)TotalSteps;
+      float current_percent = percentage / 100.0;
       std::cout << " " 
                 << GetTextProgressStr(current_percent, progressbar_size)
                 << " ";