mirror of
https://github.com/ankitects/anki.git
synced 2025-09-18 22:12:21 -04:00
make console optional on Windows
This commit is contained in:
parent
5a8e064a7d
commit
568dbe798a
6 changed files with 65 additions and 3 deletions
13
qt/package/Cargo.lock
generated
13
qt/package/Cargo.lock
generated
|
@ -17,9 +17,12 @@ version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"embed-resource",
|
"embed-resource",
|
||||||
"jemallocator",
|
"jemallocator",
|
||||||
|
"libc",
|
||||||
|
"libc-stdhandle",
|
||||||
"mimalloc",
|
"mimalloc",
|
||||||
"pyembed",
|
"pyembed",
|
||||||
"snmalloc-rs",
|
"snmalloc-rs",
|
||||||
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -204,6 +207,16 @@ version = "0.2.105"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "869d572136620d55835903746bcb5cdc54cb2851fd0aeec53220b4bb65ef3013"
|
checksum = "869d572136620d55835903746bcb5cdc54cb2851fd0aeec53220b4bb65ef3013"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc-stdhandle"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6dac2473dc28934c5e0b82250dab231c9d3b94160d91fe9ff483323b05797551"
|
||||||
|
dependencies = [
|
||||||
|
"cc",
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libmimalloc-sys"
|
name = "libmimalloc-sys"
|
||||||
version = "0.1.22"
|
version = "0.1.22"
|
||||||
|
|
|
@ -4,7 +4,10 @@ version = "0.1.0"
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
[target.'cfg(windows)'.dependencies]
|
||||||
|
winapi = {version = "0.3", features = ["wincon"]}
|
||||||
|
libc = "0.2"
|
||||||
|
libc-stdhandle = "=0.1.0"
|
||||||
|
|
||||||
[dependencies.pyembed]
|
[dependencies.pyembed]
|
||||||
git = "https://github.com/ankitects/PyOxidizer.git"
|
git = "https://github.com/ankitects/PyOxidizer.git"
|
||||||
|
|
4
qt/package/rustfmt.toml
Normal file
4
qt/package/rustfmt.toml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
# this is not supported on stable Rust, and is ignored by the Bazel rules; it is only
|
||||||
|
# useful for manual invocation with 'cargo +nightly fmt'
|
||||||
|
imports_granularity = "Crate"
|
||||||
|
group_imports = "StdExternalCrate"
|
35
qt/package/src/anki.rs
Normal file
35
qt/package/src/anki.rs
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
// Copyright: Ankitects Pty Ltd and contributors
|
||||||
|
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
|
pub(super) fn init() {
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
attach_console();
|
||||||
|
|
||||||
|
println!("Anki starting...");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If parent process has a console (eg cmd.exe), redirect our output there.
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
fn attach_console() {
|
||||||
|
use std::ffi::CString;
|
||||||
|
|
||||||
|
use libc_stdhandle::*;
|
||||||
|
use winapi::um::wincon;
|
||||||
|
|
||||||
|
let console_attached = unsafe { wincon::AttachConsole(wincon::ATTACH_PARENT_PROCESS) };
|
||||||
|
if console_attached == 0 {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let conin = CString::new("CONIN$").unwrap();
|
||||||
|
let conout = CString::new("CONOUT$").unwrap();
|
||||||
|
let r = CString::new("r").unwrap();
|
||||||
|
let w = CString::new("w").unwrap();
|
||||||
|
|
||||||
|
// Python uses the CRT for I/O, and it requires the descriptors are reopened.
|
||||||
|
unsafe {
|
||||||
|
libc::freopen(conin.as_ptr(), r.as_ptr(), stdin());
|
||||||
|
libc::freopen(conout.as_ptr(), w.as_ptr(), stdout());
|
||||||
|
libc::freopen(conout.as_ptr(), w.as_ptr(), stderr());
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,7 +3,9 @@
|
||||||
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
#![windows_subsystem = "console"]
|
#![windows_subsystem = "windows"]
|
||||||
|
|
||||||
|
mod anki;
|
||||||
|
|
||||||
use pyembed::{MainPythonInterpreter, OxidizedPythonInterpreterConfig};
|
use pyembed::{MainPythonInterpreter, OxidizedPythonInterpreterConfig};
|
||||||
|
|
||||||
|
@ -14,7 +16,7 @@ static GLOBAL: jemallocator::Jemalloc = jemallocator::Jemalloc;
|
||||||
include!(env!("DEFAULT_PYTHON_CONFIG_RS"));
|
include!(env!("DEFAULT_PYTHON_CONFIG_RS"));
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("Anki starting...");
|
anki::init();
|
||||||
|
|
||||||
let exit_code = {
|
let exit_code = {
|
||||||
let config: OxidizedPythonInterpreterConfig = default_python_config();
|
let config: OxidizedPythonInterpreterConfig = default_python_config();
|
||||||
|
|
5
qt/package/win/anki-console.bat
Normal file
5
qt/package/win/anki-console.bat
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
@echo off
|
||||||
|
anki
|
||||||
|
pause
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue