Просмотр исходного кода

force fancy progressbar redraw on window size change

We always reacted on the size change, but the bar is only redraw if the
precentage changes, which can take quiet a while in big upgrades, so
with a bit of refactoring we can now call for a redraw immediate to fix
this.

This refactor also helps in avoiding obscure pitfalls clangs static
analyser was complaining about (namely failure of ioctl resulting in
garbage values in the struct).
David Kalnischkies лет назад: 12
Родитель
Сommit
76bd63e2dc
2 измененных файлов с 26 добавлено и 12 удалено
  1. 23 12
      apt-pkg/install-progress.cc
  2. 3 0
      apt-pkg/install-progress.h

+ 23 - 12
apt-pkg/install-progress.cc

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

+ 3 - 0
apt-pkg/install-progress.h

@@ -1,6 +1,8 @@
 #ifndef PKGLIB_IPROGRESS_H
 #ifndef PKGLIB_IPROGRESS_H
 #define PKGLIB_IPROGRESS_H
 #define PKGLIB_IPROGRESS_H
 
 
+#include <apt-pkg/macros.h>
+
 #include <string>
 #include <string>
 #include <unistd.h>
 #include <unistd.h>
 #include <signal.h>
 #include <signal.h>
@@ -120,6 +122,7 @@ namespace Progress {
  private:
  private:
     static void staticSIGWINCH(int);
     static void staticSIGWINCH(int);
     static std::vector<PackageManagerFancy*> instances;
     static std::vector<PackageManagerFancy*> instances;
+    APT_HIDDEN bool DrawStatusLine();
 
 
  protected:
  protected:
     void SetupTerminalScrollArea(int nr_rows);
     void SetupTerminalScrollArea(int nr_rows);