git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 1/7] Move term_columns() to pager.c and save terminal width before pager

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Feb 8, 2011, 15:22 UTC
Message-ID
<1297178541-31124-2-git-send-email-pclouds@gmail.com>
In-Reply-To
<1297178541-31124-1-git-send-email-pclouds@gmail.com>

term_columns() checks for terminal width via ioctl(1). After redirecting, stdin is no longer terminal to get terminal width.

Check terminal width and save it before redirect stdin in setup_pager() and let term_columns() reuse the value.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 cache.h |    1 +
 help.c  |   22 ----------------------
 pager.c |   32 ++++++++++++++++++++++++++++++++
 3 files changed, 33 insertions(+), 22 deletions(-)
diff --git a/cache.h b/cache.h
index d83d68c..bcbd5f2 100644
--- a/cache.h
+++ b/cache.h
@@ -1045,6 +1045,7 @@ extern void setup_pager(void);
 extern const char *pager_program;
 extern int pager_in_use(void);
 extern int pager_use_color;
+extern int term_columns();
 
 extern const char *editor_program;
 extern const char *askpass_program;
diff --git a/help.c b/help.c
index 7654f1b..1344208 100644
--- a/help.c
+++ b/help.c
@@ -5,28 +5,6 @@
 #include "help.h"
 #include "common-cmds.h"
 
-/* most GUI terminals set COLUMNS (although some don't export it) */
-static int term_columns(void)
-{
-	char *col_string = getenv("COLUMNS");
-	int n_cols;
-
-	if (col_string && (n_cols = atoi(col_string)) > 0)
-		return n_cols;
-
-#ifdef TIOCGWINSZ
-	{
-		struct winsize ws;
-		if (!ioctl(1, TIOCGWINSZ, &ws)) {
-			if (ws.ws_col)
-				return ws.ws_col;
-		}
-	}
-#endif
-
-	return 80;
-}
-
 void add_cmdname(struct cmdnames *cmds, const char *name, int len)
 {
 	struct cmdname *ent = xmalloc(sizeof(*ent) + len + 1);
diff --git a/pager.c b/pager.c
index dac358f..ad447cf 100644
--- a/pager.c
+++ b/pager.c
@@ -12,6 +12,7 @@
  */
 
 static int spawned_pager;
+static int max_columns;
 
 #ifndef WIN32
 static void pager_preexec(void)
@@ -80,6 +81,15 @@ void setup_pager(void)
 
 	spawned_pager = 1; /* means we are emitting to terminal */
 
+#ifdef TIOCGWINSZ
+	{
+		struct winsize ws;
+		if (!ioctl(1, TIOCGWINSZ, &ws)) {
+			if (ws.ws_col)
+				max_columns = ws.ws_col;
+		}
+	}
+#endif
 	/* spawn the pager */
 	pager_argv[0] = pager;
 	pager_process.use_shell = 1;
@@ -116,3 +126,25 @@ int pager_in_use(void)
 	env = getenv("GIT_PAGER_IN_USE");
 	return env ? git_config_bool("GIT_PAGER_IN_USE", env) : 0;
 }
+
+int term_columns()
+{
+	char *col_string = getenv("COLUMNS");
+	int n_cols;
+
+	if (col_string && (n_cols = atoi(col_string)) > 0)
+		return n_cols;
+
+	else if (spawned_pager && max_columns)
+		return max_columns;
+#ifdef TIOCGWINSZ
+	else {
+		struct winsize ws;
+		if (!ioctl(1, TIOCGWINSZ, &ws)) {
+			if (ws.ws_col)
+				return ws.ws_col;
+		}
+	}
+#endif
+	return 80;
+}
-- 
1.7.2.2
Previous: Nguyễn Thái Ngọc DuyNext: Jonathan Nieder
Message 2 of 20 in “Column output”
  1. 0/7 Column outputNguyễn Thái Ngọc Duy, Feb 8, 2011
  2. 1/7 Move term_columns() to pager.c and save terminal width before pagerNguyễn Thái Ngọc Duy, Feb 8, 2011
  3. Jonathan NiederFeb 9, 2011
  4. 2/7 Add column layoutNguyễn Thái Ngọc Duy, Feb 8, 2011
  5. Jonathan NiederFeb 9, 2011
  6. Nguyen Thai Ngoc DuyFeb 9, 2011
  7. 3/7 parseopt: OPT_COLUMN to set struct column_layout.modeNguyễn Thái Ngọc Duy, Feb 8, 2011
  8. 4/7 add core.columnNguyễn Thái Ngọc Duy, Feb 8, 2011
  9. 5/7 help: reuse struct column_layoutNguyễn Thái Ngọc Duy, Feb 8, 2011
  10. Jonathan NiederFeb 9, 2011
  11. Nguyen Thai Ngoc DuyFeb 9, 2011
  12. 6/7 tag: support column output with --columnNguyễn Thái Ngọc Duy, Feb 8, 2011
  13. Junio C HamanoFeb 9, 2011
  14. Nguyen Thai Ngoc DuyFeb 10, 2011
  15. Miles BaderFeb 10, 2011
  16. 7/7 branch: support column output with --columnNguyễn Thái Ngọc Duy, Feb 8, 2011
  17. Jeff KingFeb 8, 2011
  18. Nguyen Thai Ngoc DuyFeb 9, 2011
  19. Jonathan NiederFeb 9, 2011
  20. Nguyen Thai Ngoc DuyFeb 9, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.