From d0ccc3bf4cacd073d507154ccf57f6c15d83dda3 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:22:14 +0900 Subject: [PATCH 01/24] feat: add notebook to ExceptionDialog --- dzgui/views/dialogs/generic.py | 54 ++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/dzgui/views/dialogs/generic.py b/dzgui/views/dialogs/generic.py index c9b890c..19e6b44 100644 --- a/dzgui/views/dialogs/generic.py +++ b/dzgui/views/dialogs/generic.py @@ -196,17 +196,49 @@ class ExceptionDialog(GenericDialog): propagate_natural_height=True, max_content_height=500 ) box = Gtk.Box(hexpand=True, vexpand=True, orientation=Gtk.Orientation.VERTICAL) - # TODO: wrap/truncate long messages textview = Gtk.TextView( - wrap_mode=Gtk.WrapMode.WORD, editable=False, left_margin=10, right_margin=10 + wrap_mode=Gtk.WrapMode.WORD, + editable=False, + left_margin=10, + right_margin=10, + top_margin=15, ) textview.set_buffer(Gtk.TextBuffer(text=self.trace)) - box.pack_start(textview, EXPAND, FILL, 10) - scrollable.add(box) + box.pack_start(textview, EXPAND, FILL, 0) + + self.error_details = Gtk.ScrolledWindow( + overlay_scrolling=False, + max_content_height=150, + propagate_natural_height=False, + ) + details_box = Gtk.Box( + hexpand=True, + vexpand=True, + margin_right=5, + orientation=Gtk.Orientation.VERTICAL, + ) + + self.details_buffer = Gtk.TextBuffer() + details_textview = Gtk.TextView( + wrap_mode=Gtk.WrapMode.WORD_CHAR, + editable=False, + left_margin=10, + right_margin=10, + top_margin=15, + ) + + details_textview.set_buffer(self.details_buffer) + details_box.pack_start(details_textview, EXPAND, FILL, 10) + self.error_details.add(details_box) + + self.error_notebook = Gtk.Notebook(show_tabs=False, margin_bottom=15) + self.error_notebook.append_page(box, Gtk.Label(label="Error")) + self.error_notebook.append_page(self.error_details, Gtk.Label(label="Details")) + self.error_notebook.connect("switch-page", self._on_page_changed) + scrollable.add(self.error_notebook) content = self.get_content_area() content.set_spacing(0) - # TODO: padding around top of content area when traceback is long content.add(scrollable) copy_button = ClipboardButton(controller, self.get_trace) @@ -219,6 +251,18 @@ class ExceptionDialog(GenericDialog): self.ok.grab_focus() self.connect("response", self._on_response) + def _on_page_changed( + self, notebook: Gtk.Notebook, child: Gtk.Widget, index: int + ) -> None: + if child == self.error_details: + child.set_propagate_natural_height(True) + else: + self.error_details.set_propagate_natural_height(False) + + def set_secondary_text(self, text: str) -> None: + self.details_buffer.set_text(text) + self.error_notebook.set_show_tabs(True) + def get_trace(self) -> str: return self.trace From 067b77bf92d639c3b2f280f873983b8111c29103 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:26:42 +0900 Subject: [PATCH 02/24] fix: clear typehinting errors --- dzgui/views/dialogs/generic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dzgui/views/dialogs/generic.py b/dzgui/views/dialogs/generic.py index 19e6b44..16d0e8e 100644 --- a/dzgui/views/dialogs/generic.py +++ b/dzgui/views/dialogs/generic.py @@ -252,10 +252,10 @@ class ExceptionDialog(GenericDialog): self.connect("response", self._on_response) def _on_page_changed( - self, notebook: Gtk.Notebook, child: Gtk.Widget, index: int + self, notebook: Gtk.Notebook, child: Gtk.Box | Gtk.ScrolledWindow, index: int ) -> None: if child == self.error_details: - child.set_propagate_natural_height(True) + self.error_details.set_propagate_natural_height(True) else: self.error_details.set_propagate_natural_height(False) From 1e8a423ec346a1d5c7e9dd167959458bb59292be Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:38:45 +0900 Subject: [PATCH 03/24] fix: add bottom padding --- dzgui/views/dialogs/generic.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dzgui/views/dialogs/generic.py b/dzgui/views/dialogs/generic.py index 16d0e8e..f3174eb 100644 --- a/dzgui/views/dialogs/generic.py +++ b/dzgui/views/dialogs/generic.py @@ -202,6 +202,7 @@ class ExceptionDialog(GenericDialog): left_margin=10, right_margin=10, top_margin=15, + bottom_margin=10, ) textview.set_buffer(Gtk.TextBuffer(text=self.trace)) box.pack_start(textview, EXPAND, FILL, 0) From 8098c4b68c7833a9074ec02621b1eae32dfd9073 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:40:02 +0900 Subject: [PATCH 04/24] feat: internal knowledeat: add knowledge base text to specific exception dialogs --- dzgui/managers/connection.py | 6 +++++- dzgui/managers/mods.py | 3 ++- dzgui/model/servers.py | 3 ++- dzgui/strings/kb.py | 15 +++++++++++++++ 4 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 dzgui/strings/kb.py diff --git a/dzgui/managers/connection.py b/dzgui/managers/connection.py index c96abc2..9baf109 100644 --- a/dzgui/managers/connection.py +++ b/dzgui/managers/connection.py @@ -45,6 +45,7 @@ from dzgui.strings.dialogs import ( waiting_for_mods, waiting_for_directories, ) +from dzgui.strings import kb from dzgui.strings.server_mods import checkmark, resync from dzgui.util.format import format_mib from dzgui.util.strings import dialog, server_timeout @@ -193,7 +194,9 @@ class ConnectionManager: is_last = self.is_last_server() # TODO: strings - invalid_mods = [(mod[0], mod[1]) for mod in remote_mods if mod[2] == "Invalid mod"] + invalid_mods = [ + (mod[0], mod[1]) for mod in remote_mods if mod[2] == "Invalid mod" + ] prereqs = Prerequisites( name=info.server_name, @@ -298,6 +301,7 @@ class ConnectionManager: def _server_timeout(self) -> None: dialog = ExceptionDialog(self.controller, server_timeout) + dialog.set_secondary_text(kb.DZG_006) dialog.run() def _connect_steam(self, menu_only: bool) -> None: diff --git a/dzgui/managers/mods.py b/dzgui/managers/mods.py index da31385..522c340 100644 --- a/dzgui/managers/mods.py +++ b/dzgui/managers/mods.py @@ -20,7 +20,7 @@ from dzgui.const.constants import ( from dzgui.const.enum import Preferences from dzgui.managers.threading import call_on_thread, StoredFunc, ThreadingManager from dzgui.model.model_factory import FastInsertListStore, ModelFactory -from dzgui.strings import dialogs +from dzgui.strings import dialogs, kb from dzgui.util.format import format_mods from dzgui.util.strings import server_timeout from dzgui.util.symlink import rebuild_symlinks @@ -215,6 +215,7 @@ class ModManager: def _server_timeout(self) -> None: dialog = ExceptionDialog(self.controller, server_timeout) + dialog.set_seconary_text(kb.DZG_006) dialog.run() def select_colorized(self) -> None: diff --git a/dzgui/model/servers.py b/dzgui/model/servers.py index bc5d616..cfb2c0a 100644 --- a/dzgui/model/servers.py +++ b/dzgui/model/servers.py @@ -14,7 +14,7 @@ from dzgui.const.constants import ( ) from dzgui.const.enum import FilterMode, Preferences, ServerTab from dzgui.managers.threading import call_on_thread, StoredFunc, ThreadingManager -from dzgui.strings import dialogs +from dzgui.strings import dialogs, kb from dzgui.util.strings import server_timeout, dialog from dzgui.views.dialogs.generic import ExceptionDialog @@ -420,6 +420,7 @@ class ServerModelManager: # customize statusbar and dialog accordingly if show_dialog: dialog = ExceptionDialog(self.controller, server_timeout) + dialog.set_secondary_text(kb.DZG_006) dialog.run() def _push_data(self, data: list[Any]) -> None: diff --git a/dzgui/strings/kb.py b/dzgui/strings/kb.py new file mode 100644 index 0000000..42f300b --- /dev/null +++ b/dzgui/strings/kb.py @@ -0,0 +1,15 @@ +DZG_006 = """The leading cause of specific servers periodically timing out is local network configuration. + +Many third-party DayZ servers use a server rental/hosting provider with DDoS protection. + +This can cause responses from servers to originate from a server other than the one originally queried. + +Consumer-grade routers are likely to drop this traffic as invalid due to how they handle NAT (network address translation). + +By contrast, wireless routers and enterprise-grade routers may be less likely to have this issue. + +If you find that a specific server is unresponsive for you when it shouldn't be, add a port forwarding rule to your router's settings for the server's query port. + +In addition, packets received from server responses are expected to be a standard size: MTU (maximum transmission unit) of 1500. + +Deviation from this may cause your router to discard incoming responses from the server.""" From 250da7a635e77a2bde2d8bd094d673208487c5b8 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:40:34 +0900 Subject: [PATCH 05/24] fix: typo --- dzgui/managers/mods.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dzgui/managers/mods.py b/dzgui/managers/mods.py index 522c340..742873a 100644 --- a/dzgui/managers/mods.py +++ b/dzgui/managers/mods.py @@ -215,7 +215,7 @@ class ModManager: def _server_timeout(self) -> None: dialog = ExceptionDialog(self.controller, server_timeout) - dialog.set_seconary_text(kb.DZG_006) + dialog.set_secondary_text(kb.DZG_006) dialog.run() def select_colorized(self) -> None: From 1e073af27ab548ee8dd2e91e596d71873808dfdb Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:22:14 +0900 Subject: [PATCH 06/24] feat: add notebook to ExceptionDialog --- dzgui/views/dialogs/generic.py | 54 ++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/dzgui/views/dialogs/generic.py b/dzgui/views/dialogs/generic.py index c9b890c..19e6b44 100644 --- a/dzgui/views/dialogs/generic.py +++ b/dzgui/views/dialogs/generic.py @@ -196,17 +196,49 @@ class ExceptionDialog(GenericDialog): propagate_natural_height=True, max_content_height=500 ) box = Gtk.Box(hexpand=True, vexpand=True, orientation=Gtk.Orientation.VERTICAL) - # TODO: wrap/truncate long messages textview = Gtk.TextView( - wrap_mode=Gtk.WrapMode.WORD, editable=False, left_margin=10, right_margin=10 + wrap_mode=Gtk.WrapMode.WORD, + editable=False, + left_margin=10, + right_margin=10, + top_margin=15, ) textview.set_buffer(Gtk.TextBuffer(text=self.trace)) - box.pack_start(textview, EXPAND, FILL, 10) - scrollable.add(box) + box.pack_start(textview, EXPAND, FILL, 0) + + self.error_details = Gtk.ScrolledWindow( + overlay_scrolling=False, + max_content_height=150, + propagate_natural_height=False, + ) + details_box = Gtk.Box( + hexpand=True, + vexpand=True, + margin_right=5, + orientation=Gtk.Orientation.VERTICAL, + ) + + self.details_buffer = Gtk.TextBuffer() + details_textview = Gtk.TextView( + wrap_mode=Gtk.WrapMode.WORD_CHAR, + editable=False, + left_margin=10, + right_margin=10, + top_margin=15, + ) + + details_textview.set_buffer(self.details_buffer) + details_box.pack_start(details_textview, EXPAND, FILL, 10) + self.error_details.add(details_box) + + self.error_notebook = Gtk.Notebook(show_tabs=False, margin_bottom=15) + self.error_notebook.append_page(box, Gtk.Label(label="Error")) + self.error_notebook.append_page(self.error_details, Gtk.Label(label="Details")) + self.error_notebook.connect("switch-page", self._on_page_changed) + scrollable.add(self.error_notebook) content = self.get_content_area() content.set_spacing(0) - # TODO: padding around top of content area when traceback is long content.add(scrollable) copy_button = ClipboardButton(controller, self.get_trace) @@ -219,6 +251,18 @@ class ExceptionDialog(GenericDialog): self.ok.grab_focus() self.connect("response", self._on_response) + def _on_page_changed( + self, notebook: Gtk.Notebook, child: Gtk.Widget, index: int + ) -> None: + if child == self.error_details: + child.set_propagate_natural_height(True) + else: + self.error_details.set_propagate_natural_height(False) + + def set_secondary_text(self, text: str) -> None: + self.details_buffer.set_text(text) + self.error_notebook.set_show_tabs(True) + def get_trace(self) -> str: return self.trace From 0ebc25b3b4b0669be63cf92acaf6e9f9153b550d Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:26:42 +0900 Subject: [PATCH 07/24] fix: clear typehinting errors --- dzgui/views/dialogs/generic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dzgui/views/dialogs/generic.py b/dzgui/views/dialogs/generic.py index 19e6b44..16d0e8e 100644 --- a/dzgui/views/dialogs/generic.py +++ b/dzgui/views/dialogs/generic.py @@ -252,10 +252,10 @@ class ExceptionDialog(GenericDialog): self.connect("response", self._on_response) def _on_page_changed( - self, notebook: Gtk.Notebook, child: Gtk.Widget, index: int + self, notebook: Gtk.Notebook, child: Gtk.Box | Gtk.ScrolledWindow, index: int ) -> None: if child == self.error_details: - child.set_propagate_natural_height(True) + self.error_details.set_propagate_natural_height(True) else: self.error_details.set_propagate_natural_height(False) From 8087f3a707b120da95a797908e2e0e7974276ab5 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:38:45 +0900 Subject: [PATCH 08/24] fix: add bottom padding --- dzgui/views/dialogs/generic.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dzgui/views/dialogs/generic.py b/dzgui/views/dialogs/generic.py index 16d0e8e..f3174eb 100644 --- a/dzgui/views/dialogs/generic.py +++ b/dzgui/views/dialogs/generic.py @@ -202,6 +202,7 @@ class ExceptionDialog(GenericDialog): left_margin=10, right_margin=10, top_margin=15, + bottom_margin=10, ) textview.set_buffer(Gtk.TextBuffer(text=self.trace)) box.pack_start(textview, EXPAND, FILL, 0) From 0bb8f3206f4048375da2a78e21189c20896eb90d Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:40:02 +0900 Subject: [PATCH 09/24] feat: internal knowledeat: add knowledge base text to specific exception dialogs --- dzgui/managers/connection.py | 6 +++++- dzgui/managers/mods.py | 3 ++- dzgui/model/servers.py | 3 ++- dzgui/strings/kb.py | 15 +++++++++++++++ 4 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 dzgui/strings/kb.py diff --git a/dzgui/managers/connection.py b/dzgui/managers/connection.py index c96abc2..9baf109 100644 --- a/dzgui/managers/connection.py +++ b/dzgui/managers/connection.py @@ -45,6 +45,7 @@ from dzgui.strings.dialogs import ( waiting_for_mods, waiting_for_directories, ) +from dzgui.strings import kb from dzgui.strings.server_mods import checkmark, resync from dzgui.util.format import format_mib from dzgui.util.strings import dialog, server_timeout @@ -193,7 +194,9 @@ class ConnectionManager: is_last = self.is_last_server() # TODO: strings - invalid_mods = [(mod[0], mod[1]) for mod in remote_mods if mod[2] == "Invalid mod"] + invalid_mods = [ + (mod[0], mod[1]) for mod in remote_mods if mod[2] == "Invalid mod" + ] prereqs = Prerequisites( name=info.server_name, @@ -298,6 +301,7 @@ class ConnectionManager: def _server_timeout(self) -> None: dialog = ExceptionDialog(self.controller, server_timeout) + dialog.set_secondary_text(kb.DZG_006) dialog.run() def _connect_steam(self, menu_only: bool) -> None: diff --git a/dzgui/managers/mods.py b/dzgui/managers/mods.py index da31385..522c340 100644 --- a/dzgui/managers/mods.py +++ b/dzgui/managers/mods.py @@ -20,7 +20,7 @@ from dzgui.const.constants import ( from dzgui.const.enum import Preferences from dzgui.managers.threading import call_on_thread, StoredFunc, ThreadingManager from dzgui.model.model_factory import FastInsertListStore, ModelFactory -from dzgui.strings import dialogs +from dzgui.strings import dialogs, kb from dzgui.util.format import format_mods from dzgui.util.strings import server_timeout from dzgui.util.symlink import rebuild_symlinks @@ -215,6 +215,7 @@ class ModManager: def _server_timeout(self) -> None: dialog = ExceptionDialog(self.controller, server_timeout) + dialog.set_seconary_text(kb.DZG_006) dialog.run() def select_colorized(self) -> None: diff --git a/dzgui/model/servers.py b/dzgui/model/servers.py index bc5d616..cfb2c0a 100644 --- a/dzgui/model/servers.py +++ b/dzgui/model/servers.py @@ -14,7 +14,7 @@ from dzgui.const.constants import ( ) from dzgui.const.enum import FilterMode, Preferences, ServerTab from dzgui.managers.threading import call_on_thread, StoredFunc, ThreadingManager -from dzgui.strings import dialogs +from dzgui.strings import dialogs, kb from dzgui.util.strings import server_timeout, dialog from dzgui.views.dialogs.generic import ExceptionDialog @@ -420,6 +420,7 @@ class ServerModelManager: # customize statusbar and dialog accordingly if show_dialog: dialog = ExceptionDialog(self.controller, server_timeout) + dialog.set_secondary_text(kb.DZG_006) dialog.run() def _push_data(self, data: list[Any]) -> None: diff --git a/dzgui/strings/kb.py b/dzgui/strings/kb.py new file mode 100644 index 0000000..42f300b --- /dev/null +++ b/dzgui/strings/kb.py @@ -0,0 +1,15 @@ +DZG_006 = """The leading cause of specific servers periodically timing out is local network configuration. + +Many third-party DayZ servers use a server rental/hosting provider with DDoS protection. + +This can cause responses from servers to originate from a server other than the one originally queried. + +Consumer-grade routers are likely to drop this traffic as invalid due to how they handle NAT (network address translation). + +By contrast, wireless routers and enterprise-grade routers may be less likely to have this issue. + +If you find that a specific server is unresponsive for you when it shouldn't be, add a port forwarding rule to your router's settings for the server's query port. + +In addition, packets received from server responses are expected to be a standard size: MTU (maximum transmission unit) of 1500. + +Deviation from this may cause your router to discard incoming responses from the server.""" From b300b614a09ed7eccd06247b957fbdd96575bdc2 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:40:34 +0900 Subject: [PATCH 10/24] fix: typo --- dzgui/managers/mods.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dzgui/managers/mods.py b/dzgui/managers/mods.py index 522c340..742873a 100644 --- a/dzgui/managers/mods.py +++ b/dzgui/managers/mods.py @@ -215,7 +215,7 @@ class ModManager: def _server_timeout(self) -> None: dialog = ExceptionDialog(self.controller, server_timeout) - dialog.set_seconary_text(kb.DZG_006) + dialog.set_secondary_text(kb.DZG_006) dialog.run() def select_colorized(self) -> None: From 7cc8076df1ae989a6328d951b511ecdd87f54bef Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 19 Aug 2026 15:36:56 +0900 Subject: [PATCH 11/24] chore: backport DebugDialog --- dzgui/views/dialogs/generic.py | 60 ++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/dzgui/views/dialogs/generic.py b/dzgui/views/dialogs/generic.py index f3174eb..e6c98c4 100644 --- a/dzgui/views/dialogs/generic.py +++ b/dzgui/views/dialogs/generic.py @@ -169,6 +169,66 @@ class QuitDialog(GenericDialog): self.controller.save_res_and_quit() +class TextBufferDialog(GenericDialog): + def __init__( + self, controller: "Controller", heading: str, secondary: str, text: str + ): + super().__init__( + controller=controller, + text=heading, + mtype=Gtk.MessageType.INFO, + buttons=Gtk.ButtonsType.NONE, + secondary=secondary, + ) + self.text = text + copy_button = ClipboardButton(controller, self.get_text) + self.add_action_widget(copy_button, Gtk.ResponseType.NONE) + self.add_button("OK", Gtk.ResponseType.OK) + self.connect("response", self._on_response) + + def get_text(self) -> str: + return self.text + + def _on_response( + self, dialog: Self, response: Gtk.ResponseType + ) -> None | Literal[True]: + match response: + case Gtk.ResponseType.OK: + self.destroy() + return None + case Gtk.ResponseType.NONE: + return True + case Gtk.ResponseType.DELETE_EVENT: + self.destroy() + return None + case _: + return None + + +class DebugDialog(TextBufferDialog): + def __init__(self, controller: "Controller", debug: str): + super().__init__( + controller=controller, + heading="Debug", + secondary="Debug args", + text=debug, + ) + scrollable = Gtk.ScrolledWindow( + propagate_natural_height=True, max_content_height=500 + ) + box = Gtk.Box(hexpand=True, vexpand=True, orientation=Gtk.Orientation.VERTICAL) + textview = Gtk.TextView( + wrap_mode=Gtk.WrapMode.WORD, editable=False, left_margin=10, right_margin=10 + ) + textview.set_buffer(Gtk.TextBuffer(text=debug)) + box.pack_start(textview, EXPAND, FILL, 10) + scrollable.add(box) + content = self.get_content_area() + content.set_spacing(0) + content.add(scrollable) + self.show_all() + + class ExceptionDialog(GenericDialog): """ Error dialog with rich traceback. From 5eb89a172d01573d9476cb7688f576b879eb7b52 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 19 Aug 2026 15:46:02 +0900 Subject: [PATCH 12/24] feat: add DebugDialog to preconnect --- dzgui/api/steam.py | 16 ++++++++++++++++ dzgui/controllers/mc.py | 3 +++ dzgui/managers/connection.py | 8 ++++++++ dzgui/views/pages/preconnect.py | 12 ++++++++++++ 4 files changed, 39 insertions(+) diff --git a/dzgui/api/steam.py b/dzgui/api/steam.py index c5b0074..6139e9a 100644 --- a/dzgui/api/steam.py +++ b/dzgui/api/steam.py @@ -150,6 +150,22 @@ def get_remote_signatures(mods: list[str]) -> list[tuple[str, str, int, int]]: return hashes +def connect_debug(client: str, addr: str, appid: int, name: str, mods: list[str]) -> str: + concat = concat_mods(mods) + client_args = concat_bash_args(client) + params = [ + "-applaunch", + str(appid), + f"-connect={addr}", + "-nolauncher", + "-nosplash", + "-skipintro", + f"-name={name}", + f"-mod={concat}", + ] + client_args.extend(params) + return " ".join(client_args) + # TODO: set config to name=user, use official server and no mods, # ensure that formatted string is identical to fixture with same hash def connect(client: str, addr: str, appid: int, name: str, mods: list[str]) -> int: diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index b8b69fc..e6af0d6 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -526,6 +526,9 @@ class Controller(GObject.GObject): ind = self.config_man.get_start_tab() self.get_servers().notebook.set_current_page(ind) + def get_debug_args(self) -> str: + return self.connection_man.get_debug_args() + def update_and_load_to_menu(self) -> None: self.connection_man.update_and_connect(menu_only=True) diff --git a/dzgui/managers/connection.py b/dzgui/managers/connection.py index 9baf109..44cde10 100644 --- a/dzgui/managers/connection.py +++ b/dzgui/managers/connection.py @@ -13,6 +13,7 @@ from dzgui.api.shortcuts import Shortcuts from dzgui.api.steam import ( connect, + connect_debug, get_app_allows_downloads, get_app_name, get_needs_update, @@ -304,6 +305,13 @@ class ConnectionManager: dialog.set_secondary_text(kb.DZG_006) dialog.run() + def get_debug_args(self) -> str: + addr = f"{self.record.ip}:{self.record.gameport}" + playername = self.controller.query_config(Preferences.NAME) + return connect_debug( + self.client, addr, self.appid, playername, self.remote_mod_ids + ) + def _connect_steam(self, menu_only: bool) -> None: addr = f"{self.record.ip}:{self.record.gameport}" playername = self.controller.query_config(Preferences.NAME) diff --git a/dzgui/views/pages/preconnect.py b/dzgui/views/pages/preconnect.py index 2e07de0..b9f7bd9 100644 --- a/dzgui/views/pages/preconnect.py +++ b/dzgui/views/pages/preconnect.py @@ -11,6 +11,7 @@ from dzgui.util.keys import is_ctrl_mask from dzgui.util.localize import number from dzgui.strings.server_mods import checkmark from dzgui.strings import preconnect +from dzgui.views.dialogs.generic import DebugDialog from dzgui.views.components.frame import HeadingFrame from dzgui.views.trees.tree_server_mods import ServerModTreeView @@ -120,6 +121,12 @@ class PreConnectionAssistant(Gtk.Box): spacing=5, ) box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + # TODO: + if self.controller.get_prefs().is_debug: + # TODO: strings + debug = Gtk.Button(label="Debug", halign=Gtk.Align.START) + debug.connect("clicked", self._on_debug_clicked) + box.add(debug) for button in self.back, self.ok, self.connect_last: box.add(button) self.button_box.add(box) @@ -221,6 +228,11 @@ class PreConnectionAssistant(Gtk.Box): def _on_connect_last_clicked(self, button: Gtk.Button) -> None: self.controller.update_and_load_to_menu() + def _on_debug_clicked(self, button: Gtk.Button) -> None: + args = self.controller.get_debug_args() + d = DebugDialog(self.controller, args) + d.run() + def _on_ok_clicked(self, button: Gtk.Button) -> None: self.controller.update_and_connect() From 48b0660ebd874a8cc8bce8c33b8d30631c1fc4d8 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:00:28 +0900 Subject: [PATCH 13/24] chore: update strings --- dzgui/strings/dialogs.py | 3 +++ dzgui/strings/preconnect.py | 1 + 2 files changed, 4 insertions(+) diff --git a/dzgui/strings/dialogs.py b/dzgui/strings/dialogs.py index 460250d..3ab9a04 100644 --- a/dzgui/strings/dialogs.py +++ b/dzgui/strings/dialogs.py @@ -20,3 +20,6 @@ ok = "OK" mission_dialog = "Set a mission folder location" custom_mod_dialog = "Set location to a custom mods folder" + +debug_heading = "Debug" +debug_secondary = "Launch arguments" diff --git a/dzgui/strings/preconnect.py b/dzgui/strings/preconnect.py index 9e0f764..274c4b0 100644 --- a/dzgui/strings/preconnect.py +++ b/dzgui/strings/preconnect.py @@ -2,6 +2,7 @@ update_mods = "Update mods and connect" connect = "Connect" connect_last = "Load to menu screen" connect_last_tooltip = "Launch DayZ with these mods (if any) and\ngo to the menu screen without connecting." +debug = "Debug" back = "Back" cancel = "Cancel" warnings = "Warnings" From a2938c17f501ec78460625e54ed6d124ef8a8a07 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:00:53 +0900 Subject: [PATCH 14/24] chore: subclass ExceptionDialog from TextBufferDialog --- dzgui/views/dialogs/generic.py | 52 +++++++++++----------------------- 1 file changed, 16 insertions(+), 36 deletions(-) diff --git a/dzgui/views/dialogs/generic.py b/dzgui/views/dialogs/generic.py index e6c98c4..bf020f2 100644 --- a/dzgui/views/dialogs/generic.py +++ b/dzgui/views/dialogs/generic.py @@ -1,6 +1,7 @@ from typing import Literal, Self, TYPE_CHECKING from dzgui.const.constants import NO_EXPAND, NO_FILL, NO_PADDING, EXPAND, FILL +from dzgui.strings import dialogs from dzgui.util import strings from dzgui.views.components.buttons import ClipboardButton @@ -171,12 +172,17 @@ class QuitDialog(GenericDialog): class TextBufferDialog(GenericDialog): def __init__( - self, controller: "Controller", heading: str, secondary: str, text: str + self, + controller: "Controller", + mtype: Gtk.MessageType, + heading: str, + secondary: str, + text: str, ): super().__init__( controller=controller, text=heading, - mtype=Gtk.MessageType.INFO, + mtype=mtype, buttons=Gtk.ButtonsType.NONE, secondary=secondary, ) @@ -209,8 +215,9 @@ class DebugDialog(TextBufferDialog): def __init__(self, controller: "Controller", debug: str): super().__init__( controller=controller, - heading="Debug", - secondary="Debug args", + mtype=Gtk.MessageType.INFO, + heading=dialogs.debug_heading, + secondary=dialogs.debug_secondary, text=debug, ) scrollable = Gtk.ScrolledWindow( @@ -229,7 +236,7 @@ class DebugDialog(TextBufferDialog): self.show_all() -class ExceptionDialog(GenericDialog): +class ExceptionDialog(TextBufferDialog): """ Error dialog with rich traceback. Usage: @@ -244,13 +251,12 @@ class ExceptionDialog(GenericDialog): def __init__(self, controller: "Controller", trace: str): super().__init__( controller=controller, - text=strings.error_heading, - mtype=Gtk.MessageType.ERROR, - buttons=Gtk.ButtonsType.NONE, + heading=strings.error_heading, secondary=strings.something_wrong, + text=trace, + mtype=Gtk.MessageType.ERROR, ) - self.trace = trace # NOTE: box expands to end of content area scrollable = Gtk.ScrolledWindow( propagate_natural_height=True, max_content_height=500 @@ -264,7 +270,7 @@ class ExceptionDialog(GenericDialog): top_margin=15, bottom_margin=10, ) - textview.set_buffer(Gtk.TextBuffer(text=self.trace)) + textview.set_buffer(Gtk.TextBuffer(text=trace)) box.pack_start(textview, EXPAND, FILL, 0) self.error_details = Gtk.ScrolledWindow( @@ -302,15 +308,7 @@ class ExceptionDialog(GenericDialog): content.set_spacing(0) content.add(scrollable) - copy_button = ClipboardButton(controller, self.get_trace) - self.add_action_widget(copy_button, Gtk.ResponseType.NONE) - self.add_button("OK", Gtk.ResponseType.OK) - self.show_all() - self.ok = self.get_widget_for_response(Gtk.ResponseType.OK) - if self.ok is not None: - self.ok.grab_focus() - self.connect("response", self._on_response) def _on_page_changed( self, notebook: Gtk.Notebook, child: Gtk.Box | Gtk.ScrolledWindow, index: int @@ -323,21 +321,3 @@ class ExceptionDialog(GenericDialog): def set_secondary_text(self, text: str) -> None: self.details_buffer.set_text(text) self.error_notebook.set_show_tabs(True) - - def get_trace(self) -> str: - return self.trace - - def _on_response( - self, dialog: Self, response: Gtk.ResponseType - ) -> None | Literal[True]: - match response: - case Gtk.ResponseType.OK: - self.destroy() - return None - case Gtk.ResponseType.NONE: - return True - case Gtk.ResponseType.DELETE_EVENT: - self.destroy() - return None - case _: - return None From 22c9be36a6a97ea184d2a657293d83e2896df0c1 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:01:06 +0900 Subject: [PATCH 15/24] chore: add strings to preconnect page --- dzgui/views/pages/preconnect.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dzgui/views/pages/preconnect.py b/dzgui/views/pages/preconnect.py index b9f7bd9..4d6e6eb 100644 --- a/dzgui/views/pages/preconnect.py +++ b/dzgui/views/pages/preconnect.py @@ -121,10 +121,10 @@ class PreConnectionAssistant(Gtk.Box): spacing=5, ) box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - # TODO: + + # NOTE: -d flag if self.controller.get_prefs().is_debug: - # TODO: strings - debug = Gtk.Button(label="Debug", halign=Gtk.Align.START) + debug = Gtk.Button(label=preconnect.debug, halign=Gtk.Align.START) debug.connect("clicked", self._on_debug_clicked) box.add(debug) for button in self.back, self.ok, self.connect_last: From 3932a3aed4515e7a6cb117c41e863d39179c02af Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:01:40 +0900 Subject: [PATCH 16/24] chore: drop debug key from prefs enum --- dzgui/const/enum.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/dzgui/const/enum.py b/dzgui/const/enum.py index 28a4cdf..4e77740 100644 --- a/dzgui/const/enum.py +++ b/dzgui/const/enum.py @@ -76,9 +76,6 @@ class Preferences(EnumWithAttrs): INSTALL = { "key": "auto_install", } - DEBUG = { - "key": "debug", - } DEFAULT = { "key": "default_steam_path", } From 027e6c0781aaec4259cd30ff11a1698ec6b24173 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:02:59 +0900 Subject: [PATCH 17/24] chore: drop unused enums --- dzgui/const/enum.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/dzgui/const/enum.py b/dzgui/const/enum.py index 4e77740..05a9763 100644 --- a/dzgui/const/enum.py +++ b/dzgui/const/enum.py @@ -73,9 +73,6 @@ class Preferences(EnumWithAttrs): NAME = { "key": "name", } - INSTALL = { - "key": "auto_install", - } DEFAULT = { "key": "default_steam_path", } @@ -88,9 +85,6 @@ class Preferences(EnumWithAttrs): IP_LIST = { "key": "ip_list", } - BRANCH = { - "key": "branch", - } START_TAB = { "key": "start_tab", } From cca1006efbd5ac84a544fcdb3297a1654f18bd05 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:03:08 +0900 Subject: [PATCH 18/24] chore: drop unused method --- dzgui/controllers/mc.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index e6af0d6..d8ca3d6 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -114,9 +114,6 @@ class Controller(GObject.GObject): def query_config(self, key: Preferences) -> Any: return self.config_man.lookup(key) - def is_auto_install(self) -> bool: - return bool(self.query_config(Preferences.INSTALL)) - def suppress_signal( self, owner: Any, child: Any, func_name: str, state: bool ) -> None: From 0f59d92bc302dbdca4434b387558fa897693109a Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:33:05 +0900 Subject: [PATCH 19/24] chore: drop unused method --- dzgui/managers/mods.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/dzgui/managers/mods.py b/dzgui/managers/mods.py index 742873a..8689072 100644 --- a/dzgui/managers/mods.py +++ b/dzgui/managers/mods.py @@ -213,11 +213,6 @@ class ModManager: func = StoredFunc(self._on_stale_mods_found, stale) self.thread_man.set_cleanup_func(func) - def _server_timeout(self) -> None: - dialog = ExceptionDialog(self.controller, server_timeout) - dialog.set_secondary_text(kb.DZG_006) - dialog.run() - def select_colorized(self) -> None: model = self.treeview.get_model() if model is None: From 9f8b760c79616231c54dcf2585e4c04d9c26eb1b Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:33:42 +0900 Subject: [PATCH 20/24] fix: defer propagation until size allocation --- dzgui/views/dialogs/generic.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/dzgui/views/dialogs/generic.py b/dzgui/views/dialogs/generic.py index bf020f2..2257873 100644 --- a/dzgui/views/dialogs/generic.py +++ b/dzgui/views/dialogs/generic.py @@ -221,19 +221,19 @@ class DebugDialog(TextBufferDialog): text=debug, ) scrollable = Gtk.ScrolledWindow( - propagate_natural_height=True, max_content_height=500 + propagate_natural_height=False, + min_content_height=200, + max_content_height=200, + margin_bottom=10, ) - box = Gtk.Box(hexpand=True, vexpand=True, orientation=Gtk.Orientation.VERTICAL) textview = Gtk.TextView( - wrap_mode=Gtk.WrapMode.WORD, editable=False, left_margin=10, right_margin=10 + wrap_mode=Gtk.WrapMode.CHAR, editable=False, left_margin=10, right_margin=10 ) textview.set_buffer(Gtk.TextBuffer(text=debug)) - box.pack_start(textview, EXPAND, FILL, 10) - scrollable.add(box) + scrollable.add(textview) content = self.get_content_area() content.set_spacing(0) content.add(scrollable) - self.show_all() class ExceptionDialog(TextBufferDialog): @@ -308,15 +308,13 @@ class ExceptionDialog(TextBufferDialog): content.set_spacing(0) content.add(scrollable) - self.show_all() - def _on_page_changed( self, notebook: Gtk.Notebook, child: Gtk.Box | Gtk.ScrolledWindow, index: int ) -> None: if child == self.error_details: - self.error_details.set_propagate_natural_height(True) + GLib.idle_add(self.error_details.set_propagate_natural_height, True) else: - self.error_details.set_propagate_natural_height(False) + GLib.idle_add(self.error_details.set_propagate_natural_height, False) def set_secondary_text(self, text: str) -> None: self.details_buffer.set_text(text) From 1a3154712f57cd313bf06716375988be7b51fe48 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:36:35 +0900 Subject: [PATCH 21/24] fix: draw dialog outside of init --- dzgui/controllers/mc.py | 2 ++ dzgui/managers/config.py | 1 + dzgui/managers/connection.py | 1 + dzgui/managers/mods.py | 4 +--- dzgui/managers/update.py | 1 + dzgui/model/servers.py | 2 ++ dzgui/views/pages/options.py | 1 + dzgui/views/pages/preconnect.py | 1 + 8 files changed, 10 insertions(+), 3 deletions(-) diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index d8ca3d6..9effd3c 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -263,6 +263,7 @@ class Controller(GObject.GObject): self.open_page(NotebookPage.LOG) except Exception as e: dialog = ExceptionDialog(self, str(e)) + dialog.show_all() dialog.run() def select_colorized(self) -> None: @@ -296,6 +297,7 @@ class Controller(GObject.GObject): write_diagnostic(self.prefs.paths.config, file) except Exception as e: dialog = ExceptionDialog(self, str(e)) + dialog.show_all() dialog.run() def update_steam_api_key(self, text: str) -> None: diff --git a/dzgui/managers/config.py b/dzgui/managers/config.py index ac559b2..9128579 100644 --- a/dzgui/managers/config.py +++ b/dzgui/managers/config.py @@ -178,6 +178,7 @@ class ConfigManager: logger.critical(e) trace = traceback.format_exc() dialog = ExceptionDialog(self.controller, trace) + dialog.show_all() dialog.run() raise e diff --git a/dzgui/managers/connection.py b/dzgui/managers/connection.py index 44cde10..fc5b65a 100644 --- a/dzgui/managers/connection.py +++ b/dzgui/managers/connection.py @@ -303,6 +303,7 @@ class ConnectionManager: def _server_timeout(self) -> None: dialog = ExceptionDialog(self.controller, server_timeout) dialog.set_secondary_text(kb.DZG_006) + dialog.show_all() dialog.run() def get_debug_args(self) -> str: diff --git a/dzgui/managers/mods.py b/dzgui/managers/mods.py index 8689072..c04d231 100644 --- a/dzgui/managers/mods.py +++ b/dzgui/managers/mods.py @@ -20,11 +20,9 @@ from dzgui.const.constants import ( from dzgui.const.enum import Preferences from dzgui.managers.threading import call_on_thread, StoredFunc, ThreadingManager from dzgui.model.model_factory import FastInsertListStore, ModelFactory -from dzgui.strings import dialogs, kb +from dzgui.strings import dialogs from dzgui.util.format import format_mods -from dzgui.util.strings import server_timeout from dzgui.util.symlink import rebuild_symlinks -from dzgui.views.dialogs.generic import ExceptionDialog import dzgui.api.pefile as PeFile diff --git a/dzgui/managers/update.py b/dzgui/managers/update.py index 3c0f928..ff64fb4 100644 --- a/dzgui/managers/update.py +++ b/dzgui/managers/update.py @@ -64,4 +64,5 @@ class UpdateManager: def _on_update_failure(self, msg: str) -> None: dialog = ExceptionDialog(self.controller, msg) + dialog.show_all() dialog.run() diff --git a/dzgui/model/servers.py b/dzgui/model/servers.py index cfb2c0a..e2c9430 100644 --- a/dzgui/model/servers.py +++ b/dzgui/model/servers.py @@ -405,6 +405,7 @@ class ServerModelManager: if show_dialog: dialog = ExceptionDialog(self.controller, dialogs.load_error_lan) + dialog.show_all() dialog.run() def _cleanup_on_failure(self, show_dialog: bool = True) -> None: @@ -421,6 +422,7 @@ class ServerModelManager: if show_dialog: dialog = ExceptionDialog(self.controller, server_timeout) dialog.set_secondary_text(kb.DZG_006) + dialog.show_all() dialog.run() def _push_data(self, data: list[Any]) -> None: diff --git a/dzgui/views/pages/options.py b/dzgui/views/pages/options.py index 277c13e..93341ec 100644 --- a/dzgui/views/pages/options.py +++ b/dzgui/views/pages/options.py @@ -430,6 +430,7 @@ class Options(ScrollableMixin, Gtk.ScrolledWindow): # type: ignore # NOTE: re-check in case file was removed by user between runs if prefs.paths.config.is_file() is False: dialog = ExceptionDialog(self.controller, strings.config_not_found) + dialog.show_all() dialog.run() raise OSError(f"Config file '{prefs.paths.config}' not found") diff --git a/dzgui/views/pages/preconnect.py b/dzgui/views/pages/preconnect.py index 4d6e6eb..93b0fb6 100644 --- a/dzgui/views/pages/preconnect.py +++ b/dzgui/views/pages/preconnect.py @@ -231,6 +231,7 @@ class PreConnectionAssistant(Gtk.Box): def _on_debug_clicked(self, button: Gtk.Button) -> None: args = self.controller.get_debug_args() d = DebugDialog(self.controller, args) + d.show_all() d.run() def _on_ok_clicked(self, button: Gtk.Button) -> None: From 6ded9a3eec1b3424ca2d90b96bfd8ce2b2e836f1 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:59:00 +0900 Subject: [PATCH 22/24] chore: disambiguate buffer setter method --- dzgui/managers/connection.py | 2 +- dzgui/model/servers.py | 2 +- dzgui/views/dialogs/generic.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dzgui/managers/connection.py b/dzgui/managers/connection.py index fc5b65a..7d2047e 100644 --- a/dzgui/managers/connection.py +++ b/dzgui/managers/connection.py @@ -302,7 +302,7 @@ class ConnectionManager: def _server_timeout(self) -> None: dialog = ExceptionDialog(self.controller, server_timeout) - dialog.set_secondary_text(kb.DZG_006) + dialog.set_details_buffer(kb.DZG_006) dialog.show_all() dialog.run() diff --git a/dzgui/model/servers.py b/dzgui/model/servers.py index e2c9430..a429ffb 100644 --- a/dzgui/model/servers.py +++ b/dzgui/model/servers.py @@ -421,7 +421,7 @@ class ServerModelManager: # customize statusbar and dialog accordingly if show_dialog: dialog = ExceptionDialog(self.controller, server_timeout) - dialog.set_secondary_text(kb.DZG_006) + dialog.set_details_buffer(kb.DZG_006) dialog.show_all() dialog.run() diff --git a/dzgui/views/dialogs/generic.py b/dzgui/views/dialogs/generic.py index 2257873..4e871ff 100644 --- a/dzgui/views/dialogs/generic.py +++ b/dzgui/views/dialogs/generic.py @@ -316,6 +316,6 @@ class ExceptionDialog(TextBufferDialog): else: GLib.idle_add(self.error_details.set_propagate_natural_height, False) - def set_secondary_text(self, text: str) -> None: + def set_details_buffer(self, text: str) -> None: self.details_buffer.set_text(text) self.error_notebook.set_show_tabs(True) From 5b83a26f6a7959bb27137b1e56bbef35e8b9c7aa Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 19 Aug 2026 17:44:55 +0900 Subject: [PATCH 23/24] chore: reword remarks on MTU --- docs/source/kb.rst | 4 ++-- dzgui/strings/kb.py | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/source/kb.rst b/docs/source/kb.rst index afaa68f..7ab8bb2 100644 --- a/docs/source/kb.rst +++ b/docs/source/kb.rst @@ -16,8 +16,8 @@ By contrast, wireless routers and enterprise-grade routers may be less likely to If you find that a specific server is unresponsive for you when it shouldn't be, add a port forwarding rule to your router's settings for the server's query port. -In addition, packets sent from server responses are expected to be a standard size (see warning below). -Deviation from this may cause your router to discard incoming responses from the server. +In addition, a uniform packet size is expected. If your router's MTU setting differs from the default of 1,500, +it could lead to incoming responses being discarded (see warning below). .. important:: diff --git a/dzgui/strings/kb.py b/dzgui/strings/kb.py index 42f300b..68ad2e5 100644 --- a/dzgui/strings/kb.py +++ b/dzgui/strings/kb.py @@ -10,6 +10,4 @@ By contrast, wireless routers and enterprise-grade routers may be less likely to If you find that a specific server is unresponsive for you when it shouldn't be, add a port forwarding rule to your router's settings for the server's query port. -In addition, packets received from server responses are expected to be a standard size: MTU (maximum transmission unit) of 1500. - -Deviation from this may cause your router to discard incoming responses from the server.""" +In addition, a uniform packet size is expected. If your router's MTU (maximum transmission unit) setting differs from the default of 1500, it could lead to incoming responses being discarded.""" From 2b394553b31927a610716f19ba777ff7ecbd0124 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Thu, 20 Aug 2026 07:55:43 +0900 Subject: [PATCH 24/24] chore: normalize docstring --- dzgui/managers/config.py | 1 - dzgui/views/dialogs/generic.py | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/dzgui/managers/config.py b/dzgui/managers/config.py index 9128579..576f809 100644 --- a/dzgui/managers/config.py +++ b/dzgui/managers/config.py @@ -180,7 +180,6 @@ class ConfigManager: dialog = ExceptionDialog(self.controller, trace) dialog.show_all() dialog.run() - raise e def save_res_and_quit(self, tv: "ServerTreeView", window: "OuterWindow") -> None: columns = tv.get_columns() diff --git a/dzgui/views/dialogs/generic.py b/dzgui/views/dialogs/generic.py index 4e871ff..b504955 100644 --- a/dzgui/views/dialogs/generic.py +++ b/dzgui/views/dialogs/generic.py @@ -245,6 +245,7 @@ class ExceptionDialog(TextBufferDialog): except Exception: trace = traceback.format_exc() dialog = ExceptionDialog(Controller, trace) + dialog.show_all() dialog.run() """