From 04057e19e680c98e990a7512ca6378a472285ae8 Mon Sep 17 00:00:00 2001 From: constfold <65550294+constfold@users.noreply.github.com> Date: Tue, 14 May 2024 17:41:19 +0800 Subject: [PATCH] Add scale factor setting for high DPI displays --- bot_manager.py | 6 +++--- common/lan_str.py | 2 ++ common/settings.py | 1 + game/browser.py | 12 +++++++++--- gui/settings_window.py | 14 ++++++++++++-- 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/bot_manager.py b/bot_manager.py index b1c6ee5..b2297c9 100644 --- a/bot_manager.py +++ b/bot_manager.py @@ -40,7 +40,7 @@ def __init__(self, setting:Settings) -> None: self.liqi_parser = liqi.LiqiProto() self.mitm_server:mitm.MitmController = mitm.MitmController() # no domain restrictions for now self.proxy_injector = proxinject.ProxyInjector() - self.browser = GameBrowser(self.st.browser_width, self.st.browser_height) + self.browser = GameBrowser(self.st.browser_width, self.st.browser_height, self.st.scale_factor) self.automation = Automation(self.browser, self.st) self.bot:Bot = None @@ -126,14 +126,14 @@ def start_browser(self): """ Start the browser thread, open browser window """ ms_url = self.st.ms_url proxy = self.mitm_server.proxy_str - self.browser.start(ms_url, proxy, self.st.browser_width, self.st.browser_height, self.st.enable_chrome_ext) + self.browser.start(ms_url, proxy, self.st.browser_width, self.st.browser_height, self.st.scale_factor, self.st.enable_chrome_ext) def is_browser_zoom_off(self): """ check browser zoom level, return true if zoomlevel is not 1""" if self.browser and self.browser.is_page_normal(): zoom = self.browser.zoomlevel_check if zoom is not None: - if abs(zoom - 1) > 0.001: + if abs(zoom - self.browser.device_scale_factor) > 0.001: return True return False diff --git a/common/lan_str.py b/common/lan_str.py index 565f627..e8e5bfd 100644 --- a/common/lan_str.py +++ b/common/lan_str.py @@ -41,6 +41,7 @@ class LanStr: MITM_PORT = "MITM Server Port" UPSTREAM_PROXY = "Upstream Proxy" CLIENT_SIZE = "Client Size" + SCALE_FACTOR = "Scale Factor" MAJSOUL_URL = "Majsoul URL" ENABLE_CHROME_EXT = "Enable Chrome Extensioins" LANGUAGE = "Display Language" @@ -174,6 +175,7 @@ class LanStrZHS(LanStr): MITM_PORT = "MITM 服务端口" UPSTREAM_PROXY = "上游代理" CLIENT_SIZE = "客户端大小" + SCALE_FACTOR = "缩放比例" MAJSOUL_URL = "雀魂网址" ENABLE_CHROME_EXT = "启用浏览器插件" LANGUAGE = "显示语言" diff --git a/common/settings.py b/common/settings.py index 397a277..24bba9a 100644 --- a/common/settings.py +++ b/common/settings.py @@ -22,6 +22,7 @@ def __init__(self, json_file:str=DEFAULT_SETTING_FILE) -> None: self.gui_set_dpi:bool = self._get_value("gui_set_dpi", True, self.valid_bool) self.browser_width:int = self._get_value("browser_width", 1280, lambda x: 0 < x < 19999) self.browser_height:int = self._get_value("browser_height", 720, lambda x: 0 < x < 19999) + self.scale_factor:float = self._get_value("scale_factor", 1.0, lambda x: 0 < x < 10.0) self.ms_url:str = self._get_value("ms_url", "https://game.maj-soul.com/1/",self.valid_url) self.enable_chrome_ext:bool = self._get_value("enable_chrome_ext", False, self.valid_bool) self.mitm_port:int = self._get_value("mitm_port", 10999, self.valid_mitm_port) diff --git a/game/browser.py b/game/browser.py index ac8a0ee..30e7d19 100644 --- a/game/browser.py +++ b/game/browser.py @@ -16,10 +16,11 @@ class GameBrowser: """ Wrapper for Playwright browser controlling maj-soul operations Browser runs in a thread, and actions are queued to be processed by the thread""" - def __init__(self, width:int, height:int): - """ Set browser with viewport size (width, height)""" + def __init__(self, width:int, height:int, device_scale_factor:float): + """ Set browser with viewport size (width, height) and device scale factor""" self.width = width self.height = height + self.device_scale_factor = device_scale_factor self._action_queue = queue.Queue() # thread safe queue for actions self._stop_event = threading.Event() # set this event to stop processing actions self._browser_thread = None @@ -45,12 +46,13 @@ def init_vars(self): def __del__(self): self.stop() - def start(self, url:str, proxy:str=None, width:int=None, height:int=None, enable_chrome_ext:bool=False): + def start(self, url:str, proxy:str=None, width:int=None, height:int=None, device_scale_factor:float=None, enable_chrome_ext:bool=False): """ Launch the browser in a thread, and start processing action queue params: url(str): url of the page to open upon browser launch proxy(str): proxy server to use. e.g. http://1.2.3.4:555" width, height: viewport width and height + device_scale_factor: device scale factor enable_ext: True to enable chrome extensions """ # using thread here to avoid playwright sync api not usable in async context (textual) issue @@ -61,6 +63,8 @@ def start(self, url:str, proxy:str=None, width:int=None, height:int=None, enable self.width = width if height is not None: self.height = height + if device_scale_factor is not None: + self.device_scale_factor = device_scale_factor self._clear_action_queue() self._stop_event.clear() self._browser_thread = threading.Thread( @@ -100,6 +104,7 @@ def _run_browser_and_action_queue(self, url:str, proxy:str, enable_chrome_ext:bo user_data_dir=utils.sub_folder(Folder.BROWSER_DATA), headless=False, viewport={'width': self.width, 'height': self.height}, + device_scale_factor=self.device_scale_factor, proxy=proxy_object, ignore_default_args=["--enable-automation"], args=[ @@ -120,6 +125,7 @@ def _run_browser_and_action_queue(self, url:str, proxy:str, enable_chrome_ext:bo user_data_dir=utils.sub_folder(Folder.BROWSER_DATA), headless=False, viewport={'width': self.width, 'height': self.height}, + device_scale_factor=self.device_scale_factor, proxy=proxy_object, ignore_default_args=["--enable-automation"], args=["--noerrdialogs", "--no-sandbox"] diff --git a/gui/settings_window.py b/gui/settings_window.py index d63a81a..ba17db1 100644 --- a/gui/settings_window.py +++ b/gui/settings_window.py @@ -57,13 +57,21 @@ def create_widgets(self): auto_launch_entry.grid(row=cur_row, column=1, **args_entry) # Select client size + cur_row += 1 _label = ttk.Label(main_frame, text=self.st.lan().CLIENT_SIZE) - _label.grid(row=cur_row, column=2, **args_label) + _label.grid(row=cur_row, column=0, **args_label) options = ["960 x 540", "1280 x 720", "1600 x 900", "1920 x 1080", "2560 x 1440", "3840 x 2160"] setting_size = f"{self.st.browser_width} x {self.st.browser_height}" self.client_size_var = tk.StringVar(value=setting_size) select_menu = ttk.Combobox(main_frame, textvariable=self.client_size_var, values=options, state="readonly", width=std_wid) - select_menu.grid(row=cur_row, column=3, **args_entry) + select_menu.grid(row=cur_row, column=1, **args_entry) + + # scale factor + _label = ttk.Label(main_frame, text=self.st.lan().SCALE_FACTOR) + _label.grid(row=cur_row, column=2, **args_label) + self.scale_factor = tk.DoubleVar(value=self.st.scale_factor) + scale_entry = ttk.Entry(main_frame, textvariable=self.scale_factor, width=std_wid) + scale_entry.grid(row=cur_row, column=3, **args_entry) # majsoul url cur_row += 1 @@ -261,6 +269,7 @@ def _on_save(self): size_list = self.client_size_var.get().split(' x ') width_new = int(size_list[0]) height_new = int(size_list[1]) + scale_factor_new = self.scale_factor.get() # url ms_url_new = self.ms_url_var.get() @@ -325,6 +334,7 @@ def _on_save(self): self.st.auto_launch_browser = self.auto_launch_var.get() self.st.browser_width = width_new self.st.browser_height = height_new + self.st.scale_factor = scale_factor_new self.st.ms_url = ms_url_new self.st.enable_chrome_ext = self.enable_extension_var.get() self.st.mitm_port = mitm_port_new