msys2-runtime: console: tty::restore really restores the previous mode
Previously, tty::restore sets the console mode to a predetermined console mode that is widely common for many non-cygwin console apps. So, if a non-cygwin app that is started from cygwin process changes the console mode and executes cygwin sub-process, the console mode is changed to the predetermined mode rather than being restored the original mode that is set by the non-cygwin app. With this patch, the console mode is stored when a cygwin process is started from non-cygwin app, then tty::restore restores the previous console mode that is used by the previous non-cygwin app when the cygwin app exits. This is a companion of https://github.com/msys2/msys2-runtime/pull/269. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This commit is contained in:
parent
30a68e6a73
commit
04202bd717
@ -0,0 +1,180 @@
|
||||
From c1770e171505eb674626c2b7abf3403e6b4b7b79 Mon Sep 17 00:00:00 2001
|
||||
From: Takashi Yano <takashi.yano@nifty.ne.jp>
|
||||
Date: Fri, 21 Mar 2025 13:58:23 +0900
|
||||
Subject: [PATCH 41/N] Cygwin: console: tty::restore really restores the
|
||||
previous mode
|
||||
|
||||
Previously, tty::restore sets the console mode to a predetermined
|
||||
console mode that is widely common for many non-cygwin console apps.
|
||||
So, if a non-cygwin app that is started from cygwin process changes
|
||||
the console mode and executes cygwin sub-process, the console mode
|
||||
is changed to the predetermined mode rather than being restored the
|
||||
original mode that is set by the non-cygwin app.
|
||||
With this patch, the console mode is stored when a cygwin process is
|
||||
started from non-cygwin app, then tty::restore restores the previous
|
||||
console mode that is used by the previous non-cygwin app when the
|
||||
cygwin app exits.
|
||||
|
||||
Addresses: https://github.com/msys2/msys2-runtime/issues/268
|
||||
Fixes: 3312f2d21f13 ("Cygwin: console: Redesign mode set strategy on close().")
|
||||
Reported-by: Eu Pin Tien, Jeremy Drake <cygwin@jdrake.com>
|
||||
Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
|
||||
Signed-off-by: Eu-Pin Tien <eu-pin.tien@diamond.ac.uk>
|
||||
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
|
||||
---
|
||||
winsup/cygwin/fhandler/console.cc | 49 ++++++++++++-------------
|
||||
winsup/cygwin/local_includes/fhandler.h | 4 +-
|
||||
winsup/cygwin/release/3.6.1 | 5 +++
|
||||
3 files changed, 32 insertions(+), 26 deletions(-)
|
||||
create mode 100644 winsup/cygwin/release/3.6.1
|
||||
|
||||
diff --git a/winsup/cygwin/fhandler/console.cc b/winsup/cygwin/fhandler/console.cc
|
||||
index da335b3..f162698 100644
|
||||
--- a/winsup/cygwin/fhandler/console.cc
|
||||
+++ b/winsup/cygwin/fhandler/console.cc
|
||||
@@ -804,6 +804,9 @@ fhandler_console::rabuflen ()
|
||||
return con_ra.rabuflen;
|
||||
}
|
||||
|
||||
+static DWORD prev_input_mode_backup;
|
||||
+static DWORD prev_output_mode_backup;
|
||||
+
|
||||
/* The function set_{in,out}put_mode() should be static so that they
|
||||
can be called even after the fhandler_console instance is deleted. */
|
||||
void
|
||||
@@ -818,11 +821,11 @@ fhandler_console::set_input_mode (tty::cons_mode m, const termios *t,
|
||||
GetConsoleMode (p->input_handle, &oflags);
|
||||
DWORD flags = oflags
|
||||
& (ENABLE_EXTENDED_FLAGS | ENABLE_INSERT_MODE | ENABLE_QUICK_EDIT_MODE);
|
||||
- con.curr_input_mode = m;
|
||||
switch (m)
|
||||
{
|
||||
case tty::restore:
|
||||
- flags |= ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT;
|
||||
+ flags = con.prev_input_mode;
|
||||
+ con.prev_input_mode = prev_input_mode_backup;
|
||||
break;
|
||||
case tty::cygwin:
|
||||
flags |= ENABLE_WINDOW_INPUT;
|
||||
@@ -846,6 +849,12 @@ fhandler_console::set_input_mode (tty::cons_mode m, const termios *t,
|
||||
flags |= ENABLE_PROCESSED_INPUT;
|
||||
break;
|
||||
}
|
||||
+ if (con.curr_input_mode != tty::cygwin && m == tty::cygwin)
|
||||
+ {
|
||||
+ prev_input_mode_backup = con.prev_input_mode;
|
||||
+ con.prev_input_mode = oflags;
|
||||
+ }
|
||||
+ con.curr_input_mode = m;
|
||||
SetConsoleMode (p->input_handle, flags);
|
||||
if (!(oflags & ENABLE_VIRTUAL_TERMINAL_INPUT)
|
||||
&& (flags & ENABLE_VIRTUAL_TERMINAL_INPUT)
|
||||
@@ -868,10 +877,11 @@ fhandler_console::set_output_mode (tty::cons_mode m, const termios *t,
|
||||
if (con.orig_virtual_terminal_processing_mode)
|
||||
flags |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
|
||||
WaitForSingleObject (p->output_mutex, mutex_timeout);
|
||||
- con.curr_output_mode = m;
|
||||
switch (m)
|
||||
{
|
||||
case tty::restore:
|
||||
+ flags = con.prev_output_mode;
|
||||
+ con.prev_output_mode = prev_output_mode_backup;
|
||||
break;
|
||||
case tty::cygwin:
|
||||
if (wincap.has_con_24bit_colors () && !con_is_legacy)
|
||||
@@ -883,6 +893,12 @@ fhandler_console::set_output_mode (tty::cons_mode m, const termios *t,
|
||||
flags |= DISABLE_NEWLINE_AUTO_RETURN;
|
||||
break;
|
||||
}
|
||||
+ if (con.curr_output_mode != tty::cygwin && m == tty::cygwin)
|
||||
+ {
|
||||
+ prev_output_mode_backup = con.prev_output_mode;
|
||||
+ GetConsoleMode (p->output_handle, &con.prev_output_mode);
|
||||
+ }
|
||||
+ con.curr_output_mode = m;
|
||||
acquire_attach_mutex (mutex_timeout);
|
||||
DWORD resume_pid = attach_console (con.owner);
|
||||
SetConsoleMode (p->output_handle, flags);
|
||||
@@ -916,7 +932,7 @@ fhandler_console::cleanup_for_non_cygwin_app (handle_set_t *p)
|
||||
/* Cleaning-up console mode for non-cygwin app. */
|
||||
/* conmode can be tty::restore when non-cygwin app is
|
||||
exec'ed from login shell. */
|
||||
- tty::cons_mode conmode = cons_mode_on_close (p);
|
||||
+ tty::cons_mode conmode = cons_mode_on_close ();
|
||||
set_output_mode (conmode, ti, p);
|
||||
set_input_mode (conmode, ti, p);
|
||||
set_disable_master_thread (con.owner == GetCurrentProcessId ());
|
||||
@@ -1978,9 +1994,8 @@ fhandler_console::close (int flag)
|
||||
if (shared_console_info[unit] && myself->ppid == 1
|
||||
&& (dev_t) myself->ctty == get_device ())
|
||||
{
|
||||
- tty::cons_mode conmode = cons_mode_on_close (&handle_set);
|
||||
- set_output_mode (conmode, &get_ttyp ()->ti, &handle_set);
|
||||
- set_input_mode (conmode, &get_ttyp ()->ti, &handle_set);
|
||||
+ set_output_mode (tty::restore, &get_ttyp ()->ti, &handle_set);
|
||||
+ set_input_mode (tty::restore, &get_ttyp ()->ti, &handle_set);
|
||||
set_disable_master_thread (true, this);
|
||||
}
|
||||
|
||||
@@ -4687,26 +4702,10 @@ fhandler_console::fstat (struct stat *st)
|
||||
}
|
||||
|
||||
tty::cons_mode
|
||||
-fhandler_console::cons_mode_on_close (handle_set_t *p)
|
||||
+fhandler_console::cons_mode_on_close ()
|
||||
{
|
||||
- const _minor_t unit = p->unit;
|
||||
-
|
||||
if (myself->ppid != 1) /* Execed from normal cygwin process. */
|
||||
return tty::cygwin;
|
||||
|
||||
- if (!process_alive (con.owner)) /* The Master process already died. */
|
||||
- return tty::restore;
|
||||
- if (con.owner == GetCurrentProcessId ()) /* Master process */
|
||||
- return tty::restore;
|
||||
-
|
||||
- PROCESS_BASIC_INFORMATION pbi;
|
||||
- NTSTATUS status =
|
||||
- NtQueryInformationProcess (GetCurrentProcess (), ProcessBasicInformation,
|
||||
- &pbi, sizeof (pbi), NULL);
|
||||
- if (NT_SUCCESS (status)
|
||||
- && con.owner == (DWORD) pbi.InheritedFromUniqueProcessId)
|
||||
- /* The parent is the stub process. */
|
||||
- return tty::restore;
|
||||
-
|
||||
- return tty::native; /* Otherwise */
|
||||
+ return tty::restore; /* otherwise, restore */
|
||||
}
|
||||
diff --git a/winsup/cygwin/local_includes/fhandler.h b/winsup/cygwin/local_includes/fhandler.h
|
||||
index b00a1a1..8c71d84 100644
|
||||
--- a/winsup/cygwin/local_includes/fhandler.h
|
||||
+++ b/winsup/cygwin/local_includes/fhandler.h
|
||||
@@ -2146,6 +2146,8 @@ class dev_console
|
||||
bool disable_master_thread;
|
||||
tty::cons_mode curr_input_mode;
|
||||
tty::cons_mode curr_output_mode;
|
||||
+ DWORD prev_input_mode;
|
||||
+ DWORD prev_output_mode;
|
||||
bool master_thread_suspended;
|
||||
int num_processed; /* Number of input events in the current input buffer
|
||||
already processed by cons_master_thread(). */
|
||||
@@ -2366,7 +2368,7 @@ private:
|
||||
|
||||
void setup_pcon_hand_over ();
|
||||
static void pcon_hand_over_proc ();
|
||||
- static tty::cons_mode cons_mode_on_close (handle_set_t *);
|
||||
+ static tty::cons_mode cons_mode_on_close ();
|
||||
|
||||
friend tty_min * tty_list::get_cttyp ();
|
||||
};
|
||||
diff --git a/winsup/cygwin/release/3.6.1 b/winsup/cygwin/release/3.6.1
|
||||
new file mode 100644
|
||||
index 0000000..0b54b5f
|
||||
--- /dev/null
|
||||
+++ b/winsup/cygwin/release/3.6.1
|
||||
@@ -0,0 +1,5 @@
|
||||
+Fixes:
|
||||
+------
|
||||
+
|
||||
+- Console mode is really restored to the previous mode.
|
||||
+ Addresses: https://github.com/msys2/msys2-runtime/issues/268
|
||||
@ -4,7 +4,7 @@
|
||||
pkgbase=msys2-runtime
|
||||
pkgname=('msys2-runtime' 'msys2-runtime-devel')
|
||||
pkgver=3.6.0
|
||||
pkgrel=1
|
||||
pkgrel=2
|
||||
pkgdesc="Cygwin POSIX emulation engine"
|
||||
arch=('x86_64')
|
||||
url="https://www.cygwin.com/"
|
||||
@ -69,9 +69,10 @@ source=('msys2-runtime'::git://sourceware.org/git/newlib-cygwin.git#tag=cygwin-$
|
||||
0037-Avoid-sharing-cygheaps-across-Cygwin-versions.patch
|
||||
0038-uname-report-msys2-runtime-commit-hash-too.patch
|
||||
0039-fixup-Instead-of-creating-Cygwin-symlinks-use-deep-c.patch
|
||||
0040-Cygwin-Adjust-CWD-magic-to-accommodate-for-the-lates.patch)
|
||||
0040-Cygwin-Adjust-CWD-magic-to-accommodate-for-the-lates.patch
|
||||
0041-Cygwin-console-tty-restore-really-restores-the-previ.patch)
|
||||
sha256sums=('89d856fbf9f8d753a644651f95ccd769a43135d93b1bc322582f6fb87ebf4cea'
|
||||
'fd9705555296df0bb56be1976b29f3f244829d17face92f9d1a9b04edd227dbd'
|
||||
'564998f09ca51148aba183e52ac8e78169c98d3e1a92e163f56a00cd7c840a68'
|
||||
'5945b95c6b3caf18cc8356802e9af1770746a76c27d0931b897d48d072603fcf'
|
||||
'8f2def0add5397487e2470fd7219bd80233e4d43e9f78d92d042907fede0570a'
|
||||
'0cebee2ed462579029512e46e4bd3c7bddd4d92823ef69803a938007c66d2843'
|
||||
@ -111,7 +112,8 @@ sha256sums=('89d856fbf9f8d753a644651f95ccd769a43135d93b1bc322582f6fb87ebf4cea'
|
||||
'4850fd4c82bc090726f57d1a1c562cb5a5e654172444ee4eba6abe3021880abb'
|
||||
'eafc8a892ad6cd89b2d0c2ae6e788ede27c42501b82650d569a95671b0046fa3'
|
||||
'384001ba02f597aad992624aed9d63cc7f1c70af842b09eac6ea628aa24947ad'
|
||||
'278461f45bf55fa054a7f59feb87bf6a4ed251b03bf91edc12c088c85418f4e3')
|
||||
'278461f45bf55fa054a7f59feb87bf6a4ed251b03bf91edc12c088c85418f4e3'
|
||||
'ff3c524f8802b79d268ad94ba7d0c2684741dc047c1ef5781081b02218333252')
|
||||
|
||||
# Helper macros to help make tasks easier #
|
||||
apply_patch_with_msg() {
|
||||
@ -188,7 +190,8 @@ prepare() {
|
||||
0037-Avoid-sharing-cygheaps-across-Cygwin-versions.patch \
|
||||
0038-uname-report-msys2-runtime-commit-hash-too.patch \
|
||||
0039-fixup-Instead-of-creating-Cygwin-symlinks-use-deep-c.patch \
|
||||
0040-Cygwin-Adjust-CWD-magic-to-accommodate-for-the-lates.patch
|
||||
0040-Cygwin-Adjust-CWD-magic-to-accommodate-for-the-lates.patch \
|
||||
0041-Cygwin-console-tty-restore-really-restores-the-previ.patch
|
||||
}
|
||||
|
||||
build() {
|
||||
|
||||
@ -1 +1 @@
|
||||
7878787624144cd3b9cbd8a41b25d7d266b7173c
|
||||
c1770e171505eb674626c2b7abf3403e6b4b7b79
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user