Skip to content

Add scale factor setting for high DPI displays #47

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions bot_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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

Expand Down
2 changes: 2 additions & 0 deletions common/lan_str.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -174,6 +175,7 @@ class LanStrZHS(LanStr):
MITM_PORT = "MITM 服务端口"
UPSTREAM_PROXY = "上游代理"
CLIENT_SIZE = "客户端大小"
SCALE_FACTOR = "缩放比例"
MAJSOUL_URL = "雀魂网址"
ENABLE_CHROME_EXT = "启用浏览器插件"
LANGUAGE = "显示语言"
Expand Down
1 change: 1 addition & 0 deletions common/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
12 changes: 9 additions & 3 deletions game/browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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(
Expand Down Expand Up @@ -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=[
Expand All @@ -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"]
Expand Down
14 changes: 12 additions & 2 deletions gui/settings_window.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()

Expand Down Expand Up @@ -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
Expand Down