mirror of
https://github.com/alacritty/alacritty.git
synced 2024-11-25 14:05:41 -05:00
Make start_daemon behaviour on Windows consistent with Unix
In cases where the Alacritty process had invalid std handles then the ConPTY subprocess would fail to spawn. By setting appropriate flags we prevent these handles from being passed to the ConPTY subprocess.
This commit is contained in:
parent
ba9aaa0539
commit
9ba7c4fae4
3 changed files with 35 additions and 6 deletions
|
@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Command keybindings on Windows will no longer open new cmd.exe console windows
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- MSI installer for Windows is now available
|
- MSI installer for Windows is now available
|
||||||
|
@ -22,6 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
- Text lingering around when resetting while scrolled up in the history
|
- Text lingering around when resetting while scrolled up in the history
|
||||||
- Terminfo support for extended capabilities
|
- Terminfo support for extended capabilities
|
||||||
- Allow mouse presses and beginning of mouse selection in padding
|
- Allow mouse presses and beginning of mouse selection in padding
|
||||||
|
- Windows: Conpty backend could close immediately on startup in certain situations
|
||||||
|
|
||||||
## Version 0.2.9
|
## Version 0.2.9
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ use winapi::um::processthreadsapi::{
|
||||||
CreateProcessW, InitializeProcThreadAttributeList, UpdateProcThreadAttribute,
|
CreateProcessW, InitializeProcThreadAttributeList, UpdateProcThreadAttribute,
|
||||||
PROCESS_INFORMATION, STARTUPINFOW,
|
PROCESS_INFORMATION, STARTUPINFOW,
|
||||||
};
|
};
|
||||||
use winapi::um::winbase::{EXTENDED_STARTUPINFO_PRESENT, STARTUPINFOEXW};
|
use winapi::um::winbase::{EXTENDED_STARTUPINFO_PRESENT, STARTF_USESTDHANDLES, STARTUPINFOEXW};
|
||||||
use winapi::um::wincon::COORD;
|
use winapi::um::wincon::COORD;
|
||||||
|
|
||||||
use crate::cli::Options;
|
use crate::cli::Options;
|
||||||
|
@ -149,6 +149,10 @@ pub fn new<'a>(
|
||||||
let mut startup_info_ex: STARTUPINFOEXW = Default::default();
|
let mut startup_info_ex: STARTUPINFOEXW = Default::default();
|
||||||
startup_info_ex.StartupInfo.cb = mem::size_of::<STARTUPINFOEXW>() as u32;
|
startup_info_ex.StartupInfo.cb = mem::size_of::<STARTUPINFOEXW>() as u32;
|
||||||
|
|
||||||
|
// Setting this flag but leaving all the handles as default (null) ensures the
|
||||||
|
// pty process does not inherit any handles from this Alacritty process.
|
||||||
|
startup_info_ex.StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
|
||||||
|
|
||||||
// Create the appropriately sized thread attribute list.
|
// Create the appropriately sized thread attribute list.
|
||||||
unsafe {
|
unsafe {
|
||||||
success =
|
success =
|
||||||
|
@ -226,7 +230,7 @@ pub fn new<'a>(
|
||||||
cmdline as LPWSTR,
|
cmdline as LPWSTR,
|
||||||
ptr::null_mut(),
|
ptr::null_mut(),
|
||||||
ptr::null_mut(),
|
ptr::null_mut(),
|
||||||
true as i32,
|
false as i32,
|
||||||
EXTENDED_STARTUPINFO_PRESENT,
|
EXTENDED_STARTUPINFO_PRESENT,
|
||||||
ptr::null_mut(),
|
ptr::null_mut(),
|
||||||
cwd_ptr,
|
cwd_ptr,
|
||||||
|
|
28
src/util.rs
28
src/util.rs
|
@ -11,11 +11,20 @@
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
|
use std::{cmp, io};
|
||||||
|
use std::ffi::OsStr;
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
#[cfg(not(windows))]
|
#[cfg(not(windows))]
|
||||||
use std::os::unix::process::CommandExt;
|
use std::os::unix::process::CommandExt;
|
||||||
use std::process::Command;
|
|
||||||
use std::ffi::OsStr;
|
#[cfg(windows)]
|
||||||
use std::{cmp, io};
|
use std::os::windows::process::CommandExt;
|
||||||
|
#[cfg(windows)]
|
||||||
|
use std::process::Stdio;
|
||||||
|
#[cfg(windows)]
|
||||||
|
use winapi::um::winbase::{CREATE_NEW_PROCESS_GROUP, CREATE_NO_WINDOW};
|
||||||
|
|
||||||
/// Threading utilities
|
/// Threading utilities
|
||||||
pub mod thread {
|
pub mod thread {
|
||||||
|
@ -100,7 +109,18 @@ pub fn start_daemon<I, S>(program: &str, args: I) -> io::Result<()>
|
||||||
I: IntoIterator<Item = S>,
|
I: IntoIterator<Item = S>,
|
||||||
S: AsRef<OsStr>,
|
S: AsRef<OsStr>,
|
||||||
{
|
{
|
||||||
Command::new(program).args(args).spawn().map(|_| ())
|
// Setting all the I/O handles to null and setting the
|
||||||
|
// CREATE_NEW_PROCESS_GROUP and CREATE_NO_WINDOW has the effect
|
||||||
|
// that console applications will run without opening a new
|
||||||
|
// console window.
|
||||||
|
Command::new(program)
|
||||||
|
.args(args)
|
||||||
|
.stdin(Stdio::null())
|
||||||
|
.stdout(Stdio::null())
|
||||||
|
.stderr(Stdio::null())
|
||||||
|
.creation_flags(CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW)
|
||||||
|
.spawn()
|
||||||
|
.map(|_| ())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
Loading…
Reference in a new issue