]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Get --screenwidth auto working on linux and windows.
authordrh <>
Thu, 13 Nov 2025 11:52:34 +0000 (11:52 +0000)
committerdrh <>
Thu, 13 Nov 2025 11:52:34 +0000 (11:52 +0000)
FossilOrigin-Name: 48a91f2067005f7f186484354be07384dd76bcfff8427c17579f6e32201e3742

manifest
manifest.uuid
src/shell.c.in

index 3c3b66d99c0ae2274401637add42a181662889e5..2bb2fc34c8865643e5f8a38609eaa64816e5a4a1 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Implement\sthe\s--titles\soption\sto\sthe\s.mode\scommand.
-D 2025-11-12T20:50:08.766
+C Get\s--screenwidth\sauto\sworking\son\slinux\sand\swindows.
+D 2025-11-13T11:52:34.054
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -735,7 +735,7 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c 5616fbcf3b833c7c705b24371828215ad0925d0c0073216c4f153348d5753f0a
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
 F src/select.c ba9cd07ffa3277883c1986085f6ddc4320f4d35d5f212ab58df79a7ecc1a576a
-F src/shell.c.in 38d89f01de5bc91c7434f78fcf4b94d3e66e277ceffb142dc5b5d23711f629f7
+F src/shell.c.in a583ee672e169092f74dd5b5a0162c048b2399fa668831b6fc14cd56b4a1d28d
 F src/sqlite.h.in 7403a952a8f1239de7525b73c4e3a0f9540ec0607ed24fec887f5832642d44b8
 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
 F src/sqlite3ext.h 7f236ca1b175ffe03316d974ef57df79b3938466c28d2f95caef5e08c57f3a52
@@ -2175,8 +2175,8 @@ F tool/version-info.c 33d0390ef484b3b1cb685d59362be891ea162123cea181cb8e6d2cf6dd
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 2b22321df9c2f51e4b0ab9e4da859c58bb3f194ad69c22b9d32b35831740f9dd
-R c068c55668f3795ef991708cb18d63fc
+P cc25643ebc516db0799406797e9961a2af574875ae9639178b722dbc280c96ad
+R 31066a85466510dad4651e3d0c66a67b
 U drh
-Z 7b64d6843e01c08dbcd5d8f2aef211b0
+Z 45c94c43aea0848aa5e0a4f6660d06e7
 # Remove this line to create a well-formed Fossil manifest.
index 7fb39ddb9c9df2c5887c4d28ffdd5f5f3c3f0f28..8d0f55f15f9578223c4137165556690284486244 100644 (file)
@@ -1 +1 @@
-cc25643ebc516db0799406797e9961a2af574875ae9639178b722dbc280c96ad
+48a91f2067005f7f186484354be07384dd76bcfff8427c17579f6e32201e3742
index 9f13d03c9a8ecc6db729948037e5238b53f3f038..7ded2051b52ba2ce2476521992433836b498b9f8 100644 (file)
@@ -108,6 +108,7 @@ typedef unsigned char u8;
 #include <stdarg.h>
 #ifndef _WIN32
 # include <sys/time.h>
+# include <sys/ioctl.h>
 #endif
 
 #if !defined(_WIN32) && !defined(WIN32)
@@ -1502,6 +1503,7 @@ static void modeFree(Mode *p){
   free(p->spec.zTableName);
   free(p->spec.zNull);
   memset(p, 0, sizeof(*p));
+  p->spec.iVersion = 1;
 }
 
 /*
@@ -2030,6 +2032,37 @@ static void interrupt_handler(int NotUsed){
   if( globalDb ) sqlite3_interrupt(globalDb);
 }
 
+/* Try to determine the screen width.  Use the default if unable.
+*/
+int shellScreenWidth(int dfltWidth){
+#if defined(TIOCGSIZE)
+  struct ttysize ts;
+  if( ioctl(STDIN_FILENO, TIOCGSIZE, &ts)>=0
+   || ioctl(STDOUT_FILENO, TIOCGSIZE, &ts)>=0
+   || ioctl(STDERR_FILENO, TIOCGSIZE, &ts)>=0
+  ){
+    return ts.ts_cols;
+  }
+#elif defined(TIOCGWINSZ)
+  struct winsize ws;
+  if( ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)>=0
+   || ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws)>=0
+   || ioctl(STDERR_FILENO, TIOCGWINSZ, &ws)>=0
+  ){
+    return ws.ws_col;
+  }
+#elif defined(_WIN32)
+  CONSOLE_SCREEN_BUFFER_INFO csbi;
+  if( GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)
+   || GetConsoleScreenBufferInfo(GetStdHandle(STD_ERROR_HANDLE), &csbi)
+   || GetConsoleScreenBufferInfo(GetStdHandle(STD_INPUT_HANDLE), &csbi)
+  ){
+    return csbi.srWindow.Right - csbi.srWindow.Left + 1;
+  }
+#endif
+  return dfltWidth;
+}
+
 #if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
 /*
 ** This routine runs for console events (e.g. Ctrl-C) on Win32
@@ -3072,28 +3105,14 @@ static int shell_exec(
   memcpy(&spec, &pArg->mode.spec, sizeof(spec));
   spec.xWrite = shellWriteQR;
   spec.pWriteArg = (void*)pArg;
-  switch( pArg->mode.eMode ){
-    case MODE_Insert: {
-      if( ShellHasFlag(pArg, SHFLG_PreserveRowid) ){
-        spec.bTitles = QRF_SW_On;
-      }
-      break;
-    }
-    case MODE_Tcl: {
-      spec.eText = QRF_TEXT_Tcl;
-      spec.eTitle = QRF_TEXT_Tcl;
-      spec.bTextNull = QRF_Yes;
-      break;
-    }
-    case MODE_Box:
-    case MODE_Table:
-    case MODE_Markdown: {
-      spec.bTitles = QRF_Yes;
-      break;
-    }
+  if( pArg->mode.eMode==MODE_Insert && ShellHasFlag(pArg, SHFLG_PreserveRowid) ){
+    spec.bTitles = QRF_SW_On;
   }
   assert( pArg->mode.eMode>=0 && pArg->mode.eMode<ArraySize(aModeInfo) );
   eStyle = aModeInfo[pArg->mode.eMode].eStyle;
+  if( pArg->mode.bAutoScreenWidth ){
+    spec.nScreenWidth = shellScreenWidth(80);
+  }
 
 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_AUTHORIZATION)
   if( pArg->expert.pExpert ){
@@ -7421,6 +7440,26 @@ static int dotCmdMode(ShellState *p){
       int eMode = p->mode.eMode;
       modeFree(&p->mode);
       modeChange(&p->mode, eMode);
+    }else if( optionMatch(z,"screenwidth") ){
+      if( i+1>=nArg ){
+        dotCmdError(p, i, "missing argument", 0);
+        return 1;
+      }
+      k = pickStr(azArg[i+1],0,"off","auto","");
+      if( k==0 ){
+        p->mode.bAutoScreenWidth = 0;
+        p->mode.spec.nScreenWidth = 0;
+      }else if( k==1 ){
+        p->mode.bAutoScreenWidth = 1;
+      }else{
+        i64 w = integerValue(azArg[i+1]);
+        p->mode.bAutoScreenWidth = 0;
+        if( w<0 ) w = 0;
+        if( w>QRF_MAX_WIDTH ) w = QRF_MAX_WIDTH;
+        p->mode.spec.nScreenWidth = w;
+      }
+      i++;
+      chng = 1;
     }else if( optionMatch(z,"textjsonb") ){
       if( i+1>=nArg ){
         dotCmdError(p, i, "missing argument", 0);
@@ -7560,7 +7599,7 @@ static int dotCmdMode(ShellState *p){
       append_c_string(pDesc, p->mode.spec.zRowSep);
     }
     if( bAll
-     || (pI->eCx && (p->mode.spec.nLineLimit>0 || p->mode.bAutoScreenWidth))
+     || (pI->eCx && (p->mode.spec.nScreenWidth>0 || p->mode.bAutoScreenWidth))
     ){
       if( p->mode.bAutoScreenWidth ){
         sqlite3_str_appendall(pDesc, " --screenwidth auto");