From: drh <> Date: Thu, 13 Nov 2025 11:52:34 +0000 (+0000) Subject: Get --screenwidth auto working on linux and windows. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bf891f707b1d1a2b620a4dd6770a5445c4b02ad5;p=thirdparty%2Fsqlite.git Get --screenwidth auto working on linux and windows. FossilOrigin-Name: 48a91f2067005f7f186484354be07384dd76bcfff8427c17579f6e32201e3742 --- diff --git a/manifest b/manifest index 3c3b66d99c..2bb2fc34c8 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index 7fb39ddb9c..8d0f55f15f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cc25643ebc516db0799406797e9961a2af574875ae9639178b722dbc280c96ad +48a91f2067005f7f186484354be07384dd76bcfff8427c17579f6e32201e3742 diff --git a/src/shell.c.in b/src/shell.c.in index 9f13d03c9a..7ded2051b5 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -108,6 +108,7 @@ typedef unsigned char u8; #include #ifndef _WIN32 # include +# include #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.eModemode.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");