[vlc-commits] help: use direct ioctl() rather than spawning stty to get console width
Rémi Denis-Courmont
git at videolan.org
Fri Oct 25 22:02:52 CEST 2013
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Fri Oct 25 18:49:27 2013 +0300| [c8d46da15aeb0a1d7120de31017b81de869dcdd9] | committer: Rémi Denis-Courmont
help: use direct ioctl() rather than spawning stty to get console width
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c8d46da15aeb0a1d7120de31017b81de869dcdd9
---
src/config/help.c | 56 ++++++++++++++++++++++++++---------------------------
1 file changed, 27 insertions(+), 29 deletions(-)
diff --git a/src/config/help.c b/src/config/help.c
index 02f07bb..55cca4b 100644
--- a/src/config/help.c
+++ b/src/config/help.c
@@ -41,13 +41,39 @@ static void PauseConsole (void);
# define ShowConsole() (void)0
# define PauseConsole() (void)0
# include <unistd.h>
+# include <sys/ioctl.h>
#endif
static void Help (vlc_object_t *, const char *);
static void Usage (vlc_object_t *, const char *);
static void Version (void);
static void ListModules (vlc_object_t *, bool);
-static int ConsoleWidth (void);
+
+/**
+ * Returns the console width or a best guess.
+ */
+static unsigned ConsoleWidth(void)
+{
+#ifdef TIOCGWINSZ
+ struct winsize ws;
+
+ if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) == 0)
+ return ws.ws_col;
+#endif
+#ifdef WIOCGETD
+ struct uwdata uw;
+
+ if (ioctl(STDOUT_FILENO, WIOCGETD, &uw) == 0)
+ return uw.uw_height / uw.uw_vs;
+#endif
+#if defined (_WIN32) && !VLC_WINSTORE_APP
+ CONSOLE_SCREEN_BUFFER_INFO buf;
+
+ if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &buf))
+ return buf.dwSize.X;
+#endif
+ return 80;
+}
/**
* Checks for help command line options such as --help or --version.
@@ -819,31 +845,3 @@ static void PauseConsole( void )
fclose( stdout );
}
#endif
-
-/*****************************************************************************
- * ConsoleWidth: Return the console width in characters
- *****************************************************************************
- * We use the stty shell command to get the console width; if this fails or
- * if the width is less than 80, we default to 80.
- *****************************************************************************/
-static int ConsoleWidth( void )
-{
- unsigned i_width = 80;
-
-#ifndef _WIN32
- FILE *file = popen( "stty size 2>/dev/null", "r" );
- if (file != NULL)
- {
- if (fscanf (file, "%*u %u", &i_width) <= 0)
- i_width = 80;
- pclose( file );
- }
-#elif !VLC_WINSTORE_APP
- CONSOLE_SCREEN_BUFFER_INFO buf;
-
- if (GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &buf))
- i_width = buf.dwSize.X;
-#endif
-
- return i_width;
-}
More information about the vlc-commits
mailing list