Ctrl-C and quitting in general now behave well everywhere

This commit is contained in:
Eric Froemling 2020-04-29 02:05:10 -07:00
parent 466f97e623
commit 763d5aa5c3
7 changed files with 57 additions and 34 deletions

View File

@ -4132,16 +4132,16 @@
"assets/build/windows/x64/python.exe": "https://files.ballistica.net/cache/ba1/25/a7/dc87c1be41605eb6fefd0145144c",
"assets/build/windows/x64/python37.dll": "https://files.ballistica.net/cache/ba1/b9/e4/d912f56e42e9991bcbb4c804cfcb",
"assets/build/windows/x64/pythonw.exe": "https://files.ballistica.net/cache/ba1/6c/bb/b6f52c306aa4e88061510e96cefe",
"build/prefab/linux-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/6d/34/c17e186c1ab6a21f9c27250ec522",
"build/prefab/linux-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/24/01/cdf0206ccaaa4999d887631683d9",
"build/prefab/linux/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/20/ec/0cf2db1fccd23db8813353ead7b5",
"build/prefab/linux/release/ballisticacore": "https://files.ballistica.net/cache/ba1/71/f3/fe9bc55d33255ad3197795da820f",
"build/prefab/mac-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/48/3c/8eb7975b35d68e2303d3fee4e949",
"build/prefab/mac-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/2b/05/11fc566e712691f90a7d3db207f2",
"build/prefab/mac/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/aa/1a/642123b5642b33b91570c3dd0c1d",
"build/prefab/mac/release/ballisticacore": "https://files.ballistica.net/cache/ba1/49/53/28acc8c627c2c22e8f7a20e38321",
"build/prefab/windows-server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/1d/cd/35b9a612245a642f36f5ec1b0966",
"build/prefab/windows-server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/1e/98/d1156cd3718aa52c59ed972170ca",
"build/prefab/windows/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/e1/73/cf488e42313eb5cef34d9f2eacd5",
"build/prefab/windows/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/d2/65/7f2e288a5cfb7ffe566691175784"
"build/prefab/linux-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/7a/c6/7bc8b2eeae7439ff56f01cc88090",
"build/prefab/linux-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/35/65/12d682473b0092cfc423146e4100",
"build/prefab/linux/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/94/33/a0dbcd5d1f77bde4bf1a8952d329",
"build/prefab/linux/release/ballisticacore": "https://files.ballistica.net/cache/ba1/aa/f3/253f73cf509c39a930ca041eb455",
"build/prefab/mac-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/fa/4d/83dd706c3ea327cbf89504130197",
"build/prefab/mac-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/33/f0/9687bdb5b1dac0dbb934261e987b",
"build/prefab/mac/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/f0/d4/ef1e004aefe9a2a45cfb98d53df1",
"build/prefab/mac/release/ballisticacore": "https://files.ballistica.net/cache/ba1/f3/d3/189e54e5de63411b66dae4851add",
"build/prefab/windows-server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/f1/41/8203dd42e85b8cfde0141715de3b",
"build/prefab/windows-server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/56/46/86ea1b38475a43dc95a65db0623a",
"build/prefab/windows/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/8f/28/7d7560edfe6b862003a699cd72d9",
"build/prefab/windows/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/d8/f0/03642738f87df03341a196132cc8"
}

View File

@ -360,6 +360,7 @@
<w>cpus</w>
<w>cpython</w>
<w>crashlytics</w>
<w>creationflags</w>
<w>creditslist</w>
<w>cryptmodule</w>
<w>cssclass</w>
@ -1456,6 +1457,7 @@
<w>rcfile</w>
<w>rdict</w>
<w>rdir</w>
<w>readline</w>
<w>readlines</w>
<w>realpath</w>
<w>realsies</w>

View File

@ -33,6 +33,7 @@
<option value="E125" />
<option value="E128" />
<option value="E741" />
<option value="E402" />
</list>
</option>
</inspection_tool>

View File

@ -34,7 +34,7 @@ NOTE: This file was autogenerated by gendummymodule; do not edit by hand.
"""
# (hash we can use to see if this file is out of date)
# SOURCES_HASH=177701719410791819540343481052188120508
# SOURCES_HASH=10577028919433802623543258674047257154
# I'm sorry Pylint. I know this file saddens you. Be strong.
# pylint: disable=useless-suppression
@ -3491,6 +3491,14 @@ def set_ui_input_device(input_device: Optional[ba.InputDevice]) -> None:
return None
def setup_sigint() -> None:
"""setup_sigint() -> None
(internal)
"""
return None
def show_ad(purpose: str,
on_completion_call: Callable[[], None] = None) -> None:
"""show_ad(purpose: str, on_completion_call: Callable[[], None] = None)

View File

@ -42,7 +42,7 @@ from bacommon.serverutils import (ServerConfig, ServerCommand,
make_server_command)
if TYPE_CHECKING:
from typing import Optional, List
from typing import Optional, List, Dict
from types import FrameType
@ -86,6 +86,17 @@ class ServerManagerApp:
return path
raise RuntimeError('Unable to locate ballisticacore_headless binary.')
def _enable_tab_completion(self, locs: Dict) -> None:
"""Enable tab-completion on platforms where available (linux/mac)."""
try:
import readline
import rlcompleter
readline.set_completer(rlcompleter.Completer(locs).complete)
readline.parse_and_bind('tab:complete')
except ImportError:
# readline doesn't exist under windows; this is expected.
pass
def run_interactive(self) -> None:
"""Run the app loop to completion."""
import code
@ -116,6 +127,9 @@ class ServerManagerApp:
# https://docs.python.org/3/library/code.html
locs = {'__name__': '__console__', '__doc__': None, 'mgr': self}
# Enable tab-completion if possible.
self._enable_tab_completion(locs)
# Now just sit in an interpreter.
try:
code.interact(local=locs, banner='', exitmsg='')
@ -176,26 +190,27 @@ class ServerManagerApp:
# we'll use this to feed it commands.
self._process_launch_time = time.time()
# Set an environment var so the server process knows its being
# run under us. This causes it to ignore ctrl-c presses and other
# slight behavior tweaks.
os.environ['BA_SERVER_WRAPPER_MANAGED'] = '1'
# We don't want our subprocess to respond to Ctrl-C; we want to handle
# that ourself. So we need to do a bit of magic to accomplish that.
# FIXME: should just have the server itself handle that
args = [self._binary_path, '-cfgdir', 'ba_root']
if sys.platform.startswith('win'):
# https://msdn.microsoft.com/en-us/library/windows/
# desktop/ms684863(v=vs.85).aspx
# CREATE_NEW_PROCESS_GROUP=0x00000200 -> If this flag is
# specified, CTRL+C signals will be disabled
self._process = subprocess.Popen(args,
stdin=subprocess.PIPE,
creationflags=0x00000200)
else:
# Note: Python docs tell us preexec_fn is unsafe with threads.
# https://docs.python.org/3/library/subprocess.html
# Perhaps we should just give the ballistica binary itself an
# option to ignore interrupt signals.
self._process = subprocess.Popen( # pylint: disable=W1509
self._process = subprocess.Popen(
args,
stdin=subprocess.PIPE,
preexec_fn=self._subprocess_pre_exec)
# creationflags=0x00000200
)
else:
self._process = subprocess.Popen(args, stdin=subprocess.PIPE)
# Set quit to True any time after launching the server
# to gracefully quit it at the next clean opportunity
@ -210,10 +225,10 @@ class ServerManagerApp:
finally:
self._kill_process()
def _subprocess_pre_exec(self) -> None:
"""To ignore CTRL+C signal in the new process."""
import signal
signal.signal(signal.SIGINT, signal.SIG_IGN)
# def _subprocess_pre_exec(self) -> None:
# """To ignore CTRL+C signal in the new process."""
# import signal
# signal.signal(signal.SIGINT, signal.SIG_IGN)
def _prep_process_environment(self) -> None:
"""Write files that must exist at process launch."""
@ -280,7 +295,7 @@ class ServerManagerApp:
if self._process is None:
return
print('Stopping server subprocess...')
print('Stopping server process...')
# First, ask it nicely to die and give it a moment.
# If that doesn't work, bring down the hammer.
@ -290,7 +305,7 @@ class ServerManagerApp:
except subprocess.TimeoutExpired:
self._process.kill()
self._process = self._process_launch_time = None
print('Server subprocess stopped.')
print('Server process stopped.')
if __name__ == '__main__':

View File

@ -1,5 +1,5 @@
<!-- THIS FILE IS AUTO GENERATED; DO NOT EDIT BY HAND -->
<h4><em>last updated on 2020-04-27 for Ballistica version 1.5.0 build 20001</em></h4>
<h4><em>last updated on 2020-04-29 for Ballistica version 1.5.0 build 20001</em></h4>
<p>This page documents the Python classes and functions in the 'ba' module,
which are the ones most relevant to modding in Ballistica. If you come across something you feel should be included here or could be better explained, please <a href="mailto:support@froemling.net">let me know</a>. Happy modding!</p>
<hr>

View File

@ -115,9 +115,6 @@ def resize_image() -> None:
if not src.endswith('.png'):
raise Exception('src must be a png')
print('Creating: ' + os.path.basename(dst), file=sys.stderr)
# Switching to imagemagick from sips - hopefully this goes well
# so we'll be nice and cross-platform...
efrotools.run('convert "' + src + '" -resize ' + str(width) + 'x' +
str(height) + ' "' + dst + '"')