diff options
author | Tavian Barnes <tavianator@gmail.com> | 2010-11-30 23:46:52 -0500 |
---|---|---|
committer | Tavian Barnes <tavianator@gmail.com> | 2010-11-30 23:46:52 -0500 |
commit | 950fe8f2b1249369ab0b419b0063e6683bc8080e (patch) | |
tree | d1252a031054f8c8e7b2789966b625426be4f69a | |
parent | 4b9641002a7b0edac8d88762385315939d2ff753 (diff) | |
download | dimension-950fe8f2b1249369ab0b419b0063e6683bc8080e.tar.xz |
Check for platform support for ioctl(TIOCGWINSZ).
-rw-r--r-- | configure.ac | 18 | ||||
-rw-r--r-- | dimension/Makefile.am | 2 | ||||
-rw-r--r-- | dimension/platform.c | 40 | ||||
-rw-r--r-- | dimension/platform.h | 31 | ||||
-rw-r--r-- | dimension/progressbar.c | 12 |
5 files changed, 94 insertions, 9 deletions
diff --git a/configure.ac b/configure.ac index 81c299c..336c996 100644 --- a/configure.ac +++ b/configure.ac @@ -125,6 +125,24 @@ AC_COMPILE_IFELSE([ AC_MSG_RESULT([no])] ) +AC_MSG_CHECKING([for ioctl(TIOCGWINSZ)]) +AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM( + [ + #include <sys/ioctl.h> + #include <unistd.h> + ], + [ + struct winsize ws; + ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws); + ] + )], + [AC_DEFINE([DMNSN_TIOCGWINSZ], [1]) + AC_MSG_RESULT([yes])], + [AC_DEFINE([DMNSN_TIOCGWINSZ], [0]) + AC_MSG_RESULT([no])] +) + AC_CHECK_HEADER([GL/glx.h], [enable_glx=yes], [enable_glx=no]) AM_CONDITIONAL([GLX], [test "$enable_glx" != "no"]) diff --git a/dimension/Makefile.am b/dimension/Makefile.am index fdf6040..2f4ee88 100644 --- a/dimension/Makefile.am +++ b/dimension/Makefile.am @@ -65,6 +65,8 @@ dimension_SOURCES = directives.y \ main.c \ parse.c \ parse.h \ + platform.c \ + platform.h \ progressbar.c \ progressbar.h \ realize.c \ diff --git a/dimension/platform.c b/dimension/platform.c new file mode 100644 index 0000000..06c74bc --- /dev/null +++ b/dimension/platform.c @@ -0,0 +1,40 @@ +/************************************************************************* + * Copyright (C) 2009-2010 Tavian Barnes <tavianator@gmail.com> * + * * + * This file is part of Dimension. * + * * + * Dimension is free software; you can redistribute it and/or modify it * + * under the terms of the GNU General Public License as published by the * + * Free Software Foundation; either version 3 of the License, or (at * + * your option) any later version. * + * * + * Dimension is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *************************************************************************/ + +#include "platform.h" + +#if DMNSN_TIOCGWINSZ + #include <sys/ioctl.h> + #include <unistd.h> +#endif + +unsigned int +dmnsn_terminal_width() +{ +#if DMNSN_TIOCGWINSZ + struct winsize ws; + unsigned int width = 80; + if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) == 0) { + width = ws.ws_col; + } + return width; +#else + return 80; +#endif +} diff --git a/dimension/platform.h b/dimension/platform.h new file mode 100644 index 0000000..ffb3406 --- /dev/null +++ b/dimension/platform.h @@ -0,0 +1,31 @@ +/************************************************************************* + * Copyright (C) 2009-2010 Tavian Barnes <tavianator@gmail.com> * + * * + * This file is part of Dimension. * + * * + * Dimension is free software; you can redistribute it and/or modify it * + * under the terms of the GNU General Public License as published by the * + * Free Software Foundation; either version 3 of the License, or (at * + * your option) any later version. * + * * + * Dimension is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *************************************************************************/ + +#ifndef PLATFORM_H +#define PLATFORM_H + +#include "dimension.h" + +/** + * Get the width of the terminal. + * @return The width (in characters) of the terminal, defaulting to 80. + */ +unsigned int dmnsn_terminal_width(); + +#endif /* PLATFORM_H */ diff --git a/dimension/progressbar.c b/dimension/progressbar.c index 7ea1344..affb42f 100644 --- a/dimension/progressbar.c +++ b/dimension/progressbar.c @@ -18,10 +18,9 @@ *************************************************************************/ #include "progressbar.h" -#include <sys/ioctl.h> +#include "platform.h" #include <stdarg.h> #include <stdio.h> -#include <unistd.h> void dmnsn_progressbar(const char *format, const dmnsn_progress *progress, ...) @@ -38,13 +37,8 @@ dmnsn_progressbar(const char *format, const dmnsn_progress *progress, ...) fflush(stdout); - /* Try to fill the terminal with the progress bar; this is non-portable */ - struct winsize ws; - unsigned int width = 80; - if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) == 0) { - width = ws.ws_col; - } - + /* Try to fill the terminal with the progress bar */ + unsigned int width = dmnsn_terminal_width(); unsigned int increments = width - (len % width); for (unsigned int i = 0; i < increments; ++i) { dmnsn_wait_progress(progress, ((double)(i + 1))/increments); |