Skip to content

Commit 9c662ab

Browse files
committed
Added resolution override option to settings.json
1 parent 9e70cdb commit 9c662ab

5 files changed

Lines changed: 48 additions & 16 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "ultrawide-window-positioner"
3-
version = "1.3.0.1"
3+
version = "1.3.0.2"
44
description = "Application to manage window position, size and always-on-top status."
55
readme = "README.md"
66
requires-python = ">=3.12"

src/backend/config.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
# Local imports
1414
from backend.common import clean_window_title, format_coords, match_titles, parse_coords
15-
from backend.constants import AOT_HOTKEY, IGNORED_WINDOWS, LayoutDefaults
15+
from backend.constants import AOT_HOTKEY, IGNORED_WINDOWS, LayoutDefaults, UIConstants
1616

1717
DEFAULT_LAYOUTS = {
1818
1: LayoutDefaults.ONE_WINDOW,
@@ -27,6 +27,7 @@
2727
class ApplicationSettings:
2828
"""Application settings container."""
2929

30+
screen_resolution_override: str = ""
3031
compact: bool = False
3132
use_images: bool = False
3233
snap: int = 0
@@ -157,6 +158,7 @@ def load_settings(self)-> ApplicationSettings:
157158
try:
158159
settings = json.load(f)
159160
ui_settings = settings.get("ui", {})
161+
screen_resolution_override = ui_settings.get("screen_resolution_override", "")
160162
compact = ui_settings.get("compact", False)
161163
use_images = ui_settings.get("use_images", False)
162164
snap = ui_settings.get("snap", 0)
@@ -171,6 +173,7 @@ def load_settings(self)-> ApplicationSettings:
171173
return ApplicationSettings()
172174

173175
return ApplicationSettings(
176+
screen_resolution_override,
174177
compact,
175178
use_images,
176179
snap,
@@ -187,6 +190,7 @@ def load_settings(self)-> ApplicationSettings:
187190
def save_settings(self, app_settings: ApplicationSettings)->bool:
188191
"""Save application settings, optionally including layouts and overrides."""
189192
settings = {"ui": {
193+
"screen_resolution_override": app_settings.screen_resolution_override,
190194
"compact": app_settings.compact,
191195
"use_images": app_settings.use_images,
192196
"snap": app_settings.snap,
@@ -325,3 +329,16 @@ def delete_config(self, name:str)->bool:
325329
return False
326330
return True
327331
return True
332+
333+
def validate_screen_res_override(self, screen_resolution: str) -> bool:
334+
"""Validate the screen resolution override."""
335+
min_w = UIConstants.WINDOW_MIN_WIDTH
336+
min_h = UIConstants.WINDOW_MIN_HEIGHT
337+
if not screen_resolution:
338+
return False
339+
split_res = screen_resolution.split(",")
340+
if len(split_res) != 2:
341+
return False
342+
return all(res.strip().isdigit() for res in split_res) and (
343+
int(split_res[0]) >= min_w and int(split_res[1]) >= min_h
344+
)

src/gui/pyside_gui_manager.py

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ def __init__(
110110
self._init_managers()
111111

112112
self.settings = self.cfg_man.load_settings()
113+
self.valid_res_override = self.cfg_man.validate_screen_res_override(self.settings.screen_resolution_override)
114+
self.res_override_used = self.settings.screen_resolution_override != ""
113115

114116
low_ignore_list = [item.lower() for item in self.settings.ignored_windows]
115117
self.win_man.ignored_windows = low_ignore_list
@@ -141,14 +143,20 @@ def _init_managers(self) -> None:
141143

142144
def _init_screen(self) -> None:
143145
"""Initialize screen resolution variables."""
144-
screens = QApplication.screens()
145-
scale = screens[0].devicePixelRatio()
146-
total_rect = QRect()
147-
for screen in screens:
148-
geo = screen.geometry()
149-
total_rect = total_rect.united(geo)
150-
self.res_x = int(total_rect.width() * scale)
151-
self.res_y = int(total_rect.height() * scale)
146+
if self.res_override_used and self.valid_res_override:
147+
res = self.settings.screen_resolution_override.split(",")
148+
self.res_x = int(res[0])
149+
self.res_y = int(res[1])
150+
else:
151+
screens = QApplication.screens()
152+
scale = screens[0].devicePixelRatio()
153+
total_rect = QRect()
154+
for screen in screens:
155+
geo = screen.geometry()
156+
total_rect = total_rect.united(geo)
157+
self.res_x = int(total_rect.width() * scale)
158+
self.res_y = int(total_rect.height() * scale)
159+
152160
self.y_offset = self.res_y // 2
153161

154162
def _init_ui_containers(self) -> None:
@@ -299,7 +307,14 @@ def _build_header(self) -> None:
299307
header_layout.setContentsMargins(15, 0, 15, 0)
300308
header_layout.setSpacing(10)
301309

302-
self.resolution_label = QLabel(f"{self.res_x} x {self.res_y}", self)
310+
res_label_text = f"{self.res_x} x {self.res_y}"
311+
if self.res_override_used:
312+
if not self.valid_res_override:
313+
res_label_text += f" (invalid override ignored: {self.settings.screen_resolution_override})"
314+
else:
315+
res_label_text += " (override)"
316+
317+
self.resolution_label = QLabel(f"{res_label_text}", self)
303318

304319
header_layout.addWidget(self.resolution_label, alignment=Qt.AlignmentFlag.AlignLeft)
305320

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

version.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ VSVersionInfo(
66
ffi=FixedFileInfo(
77
# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
88
# Set not needed items to zero 0.
9-
filevers=(1, 3, 0, 1),
10-
prodvers=(1, 3, 0, 1),
9+
filevers=(1, 3, 0, 2),
10+
prodvers=(1, 3, 0, 2),
1111
# Contains a bitmask that specifies the valid bits 'flags'r
1212
mask=0x3f,
1313
# Contains a bitmask that specifies the Boolean attributes of the file.
@@ -31,12 +31,12 @@ VSVersionInfo(
3131
'040904B0',
3232
[StringStruct('CompanyName', 'MrMaelu'),
3333
StringStruct('FileDescription', 'Ultrawide Window Positioner'),
34-
StringStruct('FileVersion', '1.3.0.1'),
34+
StringStruct('FileVersion', '1.3.0.2'),
3535
StringStruct('InternalName', 'Ultrawide Window Positioner'),
3636
StringStruct('LegalCopyright', 'MrMaelu'),
3737
StringStruct('OriginalFilename', 'Ultrawide Window Positioner.Exe'),
3838
StringStruct('ProductName', 'Ultrawide Window Positioner'),
39-
StringStruct('ProductVersion', '1.3.0.1')])
39+
StringStruct('ProductVersion', '1.3.0.2')])
4040
]),
4141
VarFileInfo([VarStruct('Translation', [1033, 1200])])
4242
]

0 commit comments

Comments
 (0)