]> err.no Git - dpkg/commitdiff
fix crash in dselect on window resize
authorWichert Akkerman <wakkerma@debian.org>
Wed, 13 Oct 1999 15:52:49 +0000 (15:52 +0000)
committerWichert Akkerman <wakkerma@debian.org>
Wed, 13 Oct 1999 15:52:49 +0000 (15:52 +0000)
ChangeLog
dselect/dselect.h
dselect/main.cc
dselect/pkglist.cc

index 22874b8f7a896fbdc3f0c6d92961395b667e0227..20232f03763e0942b9d2e7fcd7ef833594617eef 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Wed Oct 13 17:51:17 CEST 1999 Wichert Akkerman <wakkerma@debian.org>
+
+  * Merge patch from Ben Collins to fix windowresizing in dselect
+
 Tue Oct 12 17:15:08 CEST 1999 Wichert Akkerman <wakkerma@debian.org>
 
   * don't die if we can't open a package in dpkg-scanpackages, just print
index e11130917843942e03c7ea6862627be2e2d6d8d1..f82427275f71d43a4c6769dac3f54ee95112b180 100644 (file)
 
 #include <signal.h>
 
+#if defined(SIGWINCH) && defined(TIOCGWINSZ) && defined(NCURSES_VERSION)
+#define CAN_RESIZE 1
+#else
+#define CAN_RESIZE 0
+#endif
+
+#if CAN_RESIZE
+static RETSIGTYPE adjust(int sig);
+static int          interrupted;
+#endif
+
 struct helpmenuentry {
   char key;
   const struct helpmessage *msg;
index dbad037b101f32c7b4777f8298865e2c6dc225a9..84ae6f389fdc323b6304c140ab3db2c0b278e4f8 100644 (file)
@@ -96,6 +96,32 @@ static void usage(void) {
        stdout)) werr("stdout");
 }
 
+#if CAN_RESIZE
+/*
+ * This uses functions that are "unsafe", but it seems to work on SunOS and
+ * Linux.  The 'wrefresh(curscr)' is needed to force the refresh to start from
+ * the top of the screen -- some xterms mangle the bitmap while resizing.
+ *
+ * Borrowed from the ncurses example view.c
+ */
+static RETSIGTYPE adjust(int sig)
+{
+  if (waiting || sig == 0) {
+    struct winsize size;
+
+    if (ioctl(fileno(stdout), TIOCGWINSZ, &size) == 0) {
+      resizeterm(size.ws_row, size.ws_col);
+      wrefresh(curscr);       /* Linux needs this */
+      show_all();
+    }
+    interrupted = FALSE;
+  } else {
+    interrupted = TRUE;
+  }
+  (void) signal(SIGWINCH, adjust);        /* some systems need this */
+}
+#endif  /* CAN_RESIZE */
+
 /* These are called by C code, so need to have C calling convention */
 extern "C" {
 
@@ -280,6 +306,10 @@ urqresult urq_quit(void) {
 int main(int, const char *const *argv) {
   jmp_buf ejbuf;
 
+#if CAN_RESIZE
+  (void) signal(SIGWINCH, adjust); /* arrange interrupts to resize */
+#endif
+
   if (setjmp(ejbuf)) { /* expect warning about possible clobbering of argv */
     cursesoff();
     error_unwind(ehflag_bombout); exit(2);
index cdc3a2b086032f66bd95c8b5c44c674d3fb98aaf..81f1710942daf0d2277caef8387aa99b095cb57f 100644 (file)
@@ -493,6 +493,10 @@ pkginfo **packagelist::display() {
 
   if (debug) fprintf(debug,"packagelist[%p]::display() entering loop\n",this);
   for (;;) {
+#if CAN_RESIZE
+    if (interrupted)
+      adjust(0);
+#endif
     if (whatinfo_height) wcursyncup(whatinfowin);
     if (doupdate() == ERR) ohshite("doupdate failed");
     signallist= this;