From 91f046d85230106f039349bd62bf73d6e9b7a30a Mon Sep 17 00:00:00 2001 From: Tiziano Zito Date: Thu, 8 Aug 2024 16:26:47 +0200 Subject: [PATCH] add a --fullscreen CLI option and the "f" keyboard shortcut in TK to make the game window fullscreen --- pelita/game.py | 14 +++++++++----- pelita/scripts/pelita_main.py | 3 +++ pelita/scripts/pelita_tkviewer.py | 3 +++ pelita/ui/tk_canvas.py | 14 +++++++++++++- pelita/ui/tk_viewer.py | 14 +++++++++----- 5 files changed, 37 insertions(+), 11 deletions(-) diff --git a/pelita/game.py b/pelita/game.py index 1e42eb79a..cf7baeba5 100644 --- a/pelita/game.py +++ b/pelita/game.py @@ -34,10 +34,10 @@ class TkViewer: - def __init__(self, *, address, controller, geometry=None, delay=None, stop_after=None): - self.proc = self._run_external_viewer(address, controller, geometry=geometry, delay=delay, stop_after=stop_after) + def __init__(self, *, address, controller, geometry=None, delay=None, stop_after=None, fullscreen=False): + self.proc = self._run_external_viewer(address, controller, geometry=geometry, delay=delay, stop_after=stop_after, fullscreen=fullscreen) - def _run_external_viewer(self, subscribe_sock, controller, geometry, delay, stop_after): + def _run_external_viewer(self, subscribe_sock, controller, geometry, delay, stop_after, fullscreen): # Something on OS X prevents Tk from running in a forked process. # Therefore we cannot use multiprocessing here. subprocess works, though. viewer_args = [ str(subscribe_sock) ] @@ -45,6 +45,8 @@ def _run_external_viewer(self, subscribe_sock, controller, geometry, delay, stop viewer_args += ["--controller-address", str(controller)] if geometry: viewer_args += ["--geometry", "{0}x{1}".format(*geometry)] + if fullscreen: + viewer_args += ["--fullscreen"] if delay: viewer_args += ["--delay", str(delay)] if stop_after is not None: @@ -236,12 +238,14 @@ def setup_viewers(viewers=None, options=None, print_result=True): proc = TkViewer(address=zmq_publisher.socket_addr, controller=viewer_state['controller'].socket_addr, stop_after=options.get('stop_at'), geometry=options.get('geometry'), - delay=options.get('delay')) + delay=options.get('delay'), + fullscreen=options.get('fullscreen')) else: proc = TkViewer(address=zmq_publisher.socket_addr, controller=None, stop_after=options.get('stop_at'), geometry=options.get('geometry'), - delay=options.get('delay')) + delay=options.get('delay'), + fullscreen=options.get('fullscreen')) else: raise ValueError(f"Unknown viewer {viewer}.") diff --git a/pelita/scripts/pelita_main.py b/pelita/scripts/pelita_main.py index 30aef0598..3a984ed87 100755 --- a/pelita/scripts/pelita_main.py +++ b/pelita/scripts/pelita_main.py @@ -246,6 +246,8 @@ def long_help(s): viewer_settings = parser.add_argument_group('Viewer settings') viewer_settings.add_argument('--geometry', type=geometry_string, metavar='NxM', help='Set initial size of the game window.') +viewer_settings.add_argument('--fullscreen', const=True, action='store_const', + help='Make the game window run fullscreen') viewer_settings.add_argument('--fps', type=float, default=40, help='Set (approximate) number of frames per second in a graphical viewer.') @@ -359,6 +361,7 @@ def main(): stop_at = args.stop_at viewer_options = { + "fullscreen" : args.fullscreen, "geometry": geometry, "delay": delay, "stop_at": stop_at diff --git a/pelita/scripts/pelita_tkviewer.py b/pelita/scripts/pelita_tkviewer.py index 3ae7932a9..1725281bc 100755 --- a/pelita/scripts/pelita_tkviewer.py +++ b/pelita/scripts/pelita_tkviewer.py @@ -31,6 +31,8 @@ def geometry_string(s): help='controller address') parser.add_argument('--geometry', type=geometry_string, help='geometry') +parser.add_argument('--fullscreen', const=True, action='store_const', + help='fullscreen') parser.add_argument('--delay', type=int, help='delay') parser.add_argument('--stop-after', type=int, metavar="N", @@ -55,6 +57,7 @@ def main(): 'address': args.subscribe_sock, 'controller_address': args.controller_address, 'geometry': args.geometry, + 'fullscreen' : args.fullscreen, 'delay': args.delay, 'stop_after': args.stop_after } diff --git a/pelita/ui/tk_canvas.py b/pelita/ui/tk_canvas.py index a2befdacd..1351d3535 100644 --- a/pelita/ui/tk_canvas.py +++ b/pelita/ui/tk_canvas.py @@ -141,7 +141,7 @@ class UI: class TkApplication: def __init__(self, window, controller_address=None, - geometry=None, delay=1, stop_after=None): + geometry=None, delay=1, stop_after=None, fullscreen=False): self.window = window self.window.configure(background="white") @@ -159,6 +159,8 @@ def __init__(self, window, controller_address=None, self.mesh_graph = None self.geometry = geometry + self.fullscreen = fullscreen + self._fullscreen_enabled = fullscreen self._default_font = tkinter.font.nametofont("TkDefaultFont") self._default_font_size = self._default_font.cget('size') @@ -333,6 +335,7 @@ def __init__(self, window, controller_address=None, self.running = True + self.window.bind('f', lambda event: self.toggle_fullscreen()) self.window.bind('q', lambda event: self.quit()) self.window.bind('', lambda event: self.toggle_grid()) self.window.bind('', lambda event: self.delay_dec()) @@ -578,6 +581,15 @@ def toggle_grid(self): self._check_grid_toggle_state() self.update() + def toggle_fullscreen(self): + self._fullscreen_enabled = not self._fullscreen_enabled + self.size_changed = True + if self._fullscreen_enabled: + self.window.attributes('-fullscreen',True) + else: + self.window.attributes('-fullscreen',False) + self.update() + def _check_grid_toggle_state(self): if self._grid_enabled: self.ui.button_game_toggle_grid.config(text="debug") diff --git a/pelita/ui/tk_viewer.py b/pelita/ui/tk_viewer.py index 4bc6007b7..47eeab773 100644 --- a/pelita/ui/tk_viewer.py +++ b/pelita/ui/tk_viewer.py @@ -71,11 +71,12 @@ class TkViewer: app : The TkApplication class """ - def __init__(self, address, controller_address=None, geometry=None, delay=1, stop_after=None): + def __init__(self, address, controller_address=None, geometry=None, delay=1, stop_after=None, fullscreen=False): self.address = address self.controller_address = controller_address self.delay = delay self.geometry = geometry if geometry else (900, 580) + self.fullscreen = fullscreen self.stop_after = stop_after self.context = zmq.Context() @@ -101,15 +102,18 @@ def run(self): controller_socket.connect(self.controller_address) controller_socket.send_json({"__action__": "exit"}) sys.exit(-1) - root_geometry = str(self.geometry[0])+'x'+str(self.geometry[1]) - # put the root window in some sensible position - self.root.geometry(root_geometry+'+40+40') + if self.fullscreen: + self.root.attributes('-fullscreen',True) + else: + root_geometry = str(self.geometry[0])+'x'+str(self.geometry[1]) + # put the root window in some sensible position + self.root.geometry(root_geometry+'+40+40') self.app = TkApplication(window=self.root, controller_address=self.controller_address, geometry=self.geometry, delay=self.delay, - stop_after=self.stop_after) + stop_after=self.stop_after, fullscreen=self.fullscreen) # schedule next read self.root.after_idle(self.read_queue) try: