from os import environ from sys import maxsize, platform import pygame from pygame import display, image, mouse from pygame.locals import * from .GameChild import * class Display(GameChild): def __init__(self, game): GameChild.__init__(self, game) print(f"available fullscreen modes: {pygame.display.list_modes()}") self.delegate = self.get_delegate() self.load_configuration() self.align_window() self.init_screen() self.set_caption() self.set_icon() self.set_mouse_visibility() self.subscribe(self.toggle_fullscreen) def load_configuration(self): config = self.get_configuration("display") self.centered = config["centered"] self.fullscreen_enabled = config["fullscreen"] self.caption = config["caption"] self.windowed_flag = config["windowed-flag"] self.icon_path = self.get_resource("display", "icon-path") self.mouse_visibility = self.get_configuration("mouse", "visible") def align_window(self): if self.centered: environ["SDL_VIDEO_CENTERED"] = "1" def init_screen(self): full = False if self.fullscreen_requested(): full = True # Added pygame.SCALED to avoid fullscreen bug # try: self.set_screen(pygame.SCALED, fs=full) except AttributeError: self.set_screen(fs=full) def fullscreen_requested(self): return not self.check_command_line(self.windowed_flag) and self.fullscreen_enabled def set_screen(self, flags=0x0, dimensions=None, fs=False): self.dimensions_changed = dimensions is not None if dimensions is None: if display.get_surface(): dimensions = display.get_surface().get_size() else: dimensions = self.get_configuration("display", "dimensions") if fs: self.screen = display.set_mode(dimensions, flags | -0x80000000) else: self.screen = display.set_mode(dimensions, flags) if self.dimensions_changed: interpolator = self.get_game().interpolator if interpolator.gui_enabled: interpolator.gui.rearrange() def set_caption(self): display.set_caption(self.caption) def set_icon(self): if self.icon_path: display.set_icon(image.load(self.icon_path).convert_alpha()) def set_mouse_visibility(self, visibility=None): if visibility is None: visibility = self.mouse_visibility return mouse.set_visible(visibility) def get_screen(self): return self.screen def get_size(self): return self.screen.get_size() def toggle_fullscreen(self, event): if self.delegate.compare(event, "toggle-fullscreen"): pygame.display.toggle_fullscreen()