Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package vdu_controls for openSUSE:Factory checked in at 2026-08-05 17:50:02 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/vdu_controls (Old) and /work/SRC/openSUSE:Factory/.vdu_controls.new.16738 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "vdu_controls" Wed Aug 5 17:50:02 2026 rev:22 rq:1369621 version:2.6.8 Changes: -------- --- /work/SRC/openSUSE:Factory/vdu_controls/vdu_controls.changes 2026-08-03 17:17:05.650295180 +0200 +++ /work/SRC/openSUSE:Factory/.vdu_controls.new.16738/vdu_controls.changes 2026-08-05 17:50:51.475021019 +0200 @@ -1,0 +2,8 @@ +Wed Aug 5 01:35:17 UTC 2026 - Michael Hamilton <[email protected]> + +- Version 2.6.8 + * Fix Qt session restoration state - set executable to be wrapper-script. + * Fix gnome QTextBrowser external http link following. + * Remove current working directory from python path (prevent accidental imports). + +------------------------------------------------------------------- Old: ---- vdu_controls-2.6.7.tar.gz New: ---- vdu_controls-2.6.8.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ vdu_controls.spec ++++++ --- /var/tmp/diff_new_pack.bc53J9/_old 2026-08-05 17:50:52.007039629 +0200 +++ /var/tmp/diff_new_pack.bc53J9/_new 2026-08-05 17:50:52.011039769 +0200 @@ -17,7 +17,7 @@ # Name: vdu_controls -Version: 2.6.7 +Version: 2.6.8 Release: 0 Summary: Visual Display Unit virtual control panel License: GPL-3.0-or-later ++++++ vdu_controls-2.6.7.tar.gz -> vdu_controls-2.6.8.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vdu_controls-2.6.7/CHANGELOG.md new/vdu_controls-2.6.8/CHANGELOG.md --- old/vdu_controls-2.6.7/CHANGELOG.md 2026-08-03 02:18:41.000000000 +0200 +++ new/vdu_controls-2.6.8/CHANGELOG.md 2026-08-05 02:57:02.000000000 +0200 @@ -4,6 +4,11 @@ --> # Changelog +## Version 2.6.8 <small>(2026-08-05)</small> +- Fix Qt session restoration state - set executable to be wrapper-script. +- Fix gnome QTextBrowser external http link following. +- Remove current working directory from python path (prevent accidental imports). + ## Version 2.6.7 <small>(2026-08-03)</small> - Ambient-light slider now works properly at night. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vdu_controls-2.6.7/README.md new/vdu_controls-2.6.8/README.md --- old/vdu_controls-2.6.7/README.md 2026-08-03 02:18:41.000000000 +0200 +++ new/vdu_controls-2.6.8/README.md 2026-08-05 02:57:02.000000000 +0200 @@ -8,7 +8,7 @@ A control panel for external monitors (*Visual Display Units*). -> __[vdu_controls 2.6.6 is now available](https://github.com/digitaltrails/vdu_controls/releases/tag/v2.6.6).__ +> __[vdu_controls 2.6.8 is now available](https://github.com/digitaltrails/vdu_controls/releases/tag/v2.6.8).__ > > [!TIP] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vdu_controls-2.6.7/docs/_build/man/vdu_controls.1 new/vdu_controls-2.6.8/docs/_build/man/vdu_controls.1 --- old/vdu_controls-2.6.7/docs/_build/man/vdu_controls.1 2026-08-03 02:18:41.000000000 +0200 +++ new/vdu_controls-2.6.8/docs/_build/man/vdu_controls.1 2026-08-05 02:57:02.000000000 +0200 @@ -2,10 +2,11 @@ .\" .TH "VDU_CONTROLS" "1" "" "vdu_controls 2.6.7" "vdu_controls Manual" .SS NAME -vdu_controls \- a DDC control panel for monitors +vdu_controls \- a DDC control panel for displays .PP -A control panel for DisplayPort, DVI, HDMI, or USB\-connected VDUs -(\f[I]Visual Display Units\f[R]). +A control panel for DisplayPort, DVI, HDMI, or USB\-connected displays +(\f[I]Visual Display Units\f[R]), with some limited support for +laptop\-panels. .SS Synopsis: .IP .EX @@ -211,7 +212,7 @@ When available, \f[B]vdu_controls\f[R] defaults to interacting with VDUs via the DBUS \f[B]ddcutil\-service\f[R] service rather than the \f[B]ddcutil\f[R] command. -With some older monitors, the \f[B]ddcutil\f[R] command can take a +With some older displays, the \f[B]ddcutil\f[R] command can take a couple of seconds to handshake a connection each time it is run. The service caches connections and should be both faster and more reliable than the command. @@ -598,11 +599,11 @@ .SS Presets \- remote control UNIX/Linux signals may be used to cause \f[B]vdu_controls\f[R] to restore a preset or to initiate a refresh of the application from the -connected monitors. +connected displays. Signals in the range 40 to 55 correspond to first to last presets (if any are defined). Additionally, SIGHUP can be used to initiate \(lqRefresh settings from -monitors\(rq. +displays\(rq. For example: .IP .EX diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vdu_controls-2.6.7/docs/_build/man/vdu_controls.1.html new/vdu_controls-2.6.8/docs/_build/man/vdu_controls.1.html --- old/vdu_controls-2.6.7/docs/_build/man/vdu_controls.1.html 2026-08-03 02:18:41.000000000 +0200 +++ new/vdu_controls-2.6.8/docs/_build/man/vdu_controls.1.html 2026-08-05 02:57:02.000000000 +0200 @@ -180,9 +180,10 @@ <h1 class="title">VDU_CONTROLS</h1> </header> <h2>NAME</h2> -<p>vdu_controls - a DDC control panel for monitors</p> -<p>A control panel for DisplayPort, DVI, HDMI, or USB-connected VDUs -(<em>Visual Display Units</em>).</p> +<p>vdu_controls - a DDC control panel for displays</p> +<p>A control panel for DisplayPort, DVI, HDMI, or USB-connected displays +(<em>Visual Display Units</em>), with some limited support for +laptop-panels.</p> <h2 id="synopsis">Synopsis:</h2> <pre><code> vdu_controls [--help|-h] [--about] [--detailed-help] @@ -450,7 +451,7 @@ <h3 id="dbus-ddcutil-service">DBUS ddcutil-service</h3> <p>When available, <strong>vdu_controls</strong> defaults to interacting with VDUs via the DBUS <strong>ddcutil-service</strong> service rather -than the <strong>ddcutil</strong> command. With some older monitors, the +than the <strong>ddcutil</strong> command. With some older displays, the <strong>ddcutil</strong> command can take a couple of seconds to handshake a connection each time it is run. The service caches connections and should be both faster and more reliable than the @@ -773,9 +774,9 @@ <h3 id="presets---remote-control">Presets - remote control</h3> <p>UNIX/Linux signals may be used to cause <strong>vdu_controls</strong> to restore a preset or to initiate a refresh of the application from the -connected monitors. Signals in the range 40 to 55 correspond to first to +connected displays. Signals in the range 40 to 55 correspond to first to last presets (if any are defined). Additionally, SIGHUP can be used to -initiate “Refresh settings from monitors”. For example:</p> +initiate “Refresh settings from displays”. For example:</p> <pre><code> Identify the running vdu_controls (assuming it is installed as /usr/bin/vdu_controls):: ps axwww | grep '[/]usr/bin/vdu_controls' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vdu_controls-2.6.7/packaging/PKGBUILD new/vdu_controls-2.6.8/packaging/PKGBUILD --- old/vdu_controls-2.6.7/packaging/PKGBUILD 2026-08-03 02:18:41.000000000 +0200 +++ new/vdu_controls-2.6.8/packaging/PKGBUILD 2026-08-05 02:57:02.000000000 +0200 @@ -1,6 +1,6 @@ # Maintainer: Mark Wagie <mark dot wagie at proton dot me> pkgname=vdu_controls -pkgver=2.6.7 +pkgver=2.6.8 pkgrel=1 pkgdesc="Visual Display Unit virtual control panel - a GUI front end to ddcutil" arch=('any') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vdu_controls-2.6.7/packaging/vdu_controls.spec new/vdu_controls-2.6.8/packaging/vdu_controls.spec --- old/vdu_controls-2.6.7/packaging/vdu_controls.spec 2026-08-03 02:18:41.000000000 +0200 +++ new/vdu_controls-2.6.8/packaging/vdu_controls.spec 2026-08-05 02:57:02.000000000 +0200 @@ -17,7 +17,7 @@ # Name: vdu_controls -Version: 2.6.7 +Version: 2.6.8 Release: 0 Summary: Visual Display Unit virtual control panel License: GPL-3.0-or-later diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vdu_controls-2.6.7/packaging/vdu_controls.wrapper new/vdu_controls-2.6.8/packaging/vdu_controls.wrapper --- old/vdu_controls-2.6.7/packaging/vdu_controls.wrapper 2026-08-03 02:18:41.000000000 +0200 +++ new/vdu_controls-2.6.8/packaging/vdu_controls.wrapper 2026-08-05 02:57:02.000000000 +0200 @@ -1,5 +1,8 @@ #!/bin/bash # SPDX-FileCopyrightText: 2021-2026 Contributors to vdu_controls <https://github.com/digitaltrails/vdu_controls> # SPDX-License-Identifier: GPL-3.0-or-later + +# Pass script name for use in session restoration. +export VDU_CONTROLS_WRAPPER="$(realpath "$0")" export PYTHONPATH="/usr/share/vdu_controls:${PYTHONPATH}" exec /usr/bin/python3 -m vdu_controls "$@" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vdu_controls-2.6.7/pyproject.toml new/vdu_controls-2.6.8/pyproject.toml --- old/vdu_controls-2.6.7/pyproject.toml 2026-08-03 02:18:41.000000000 +0200 +++ new/vdu_controls-2.6.8/pyproject.toml 2026-08-05 02:57:02.000000000 +0200 @@ -7,7 +7,7 @@ [project] name = "vdu_controls" -version = "2.6.7" +version = "2.6.8" description = "Visual Display Unit virtual control panel" requires-python = ">=3.9" dependencies = [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vdu_controls-2.6.7/src/vdu_controls/__main__.py new/vdu_controls-2.6.8/src/vdu_controls/__main__.py --- old/vdu_controls-2.6.7/src/vdu_controls/__main__.py 2026-08-03 02:18:41.000000000 +0200 +++ new/vdu_controls-2.6.8/src/vdu_controls/__main__.py 2026-08-05 02:57:02.000000000 +0200 @@ -2,6 +2,9 @@ # SPDX-License-Identifier: GPL-3.0-or-later import sys +# Prevent stray vdu_controls in current working folder from being pulled in +sys.path = [p for p in sys.path if p not in ('', '.')] + from vdu_controls.vdu_controls_application import main if __name__ == '__main__': diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vdu_controls-2.6.7/src/vdu_controls/constants.py new/vdu_controls-2.6.8/src/vdu_controls/constants.py --- old/vdu_controls-2.6.7/src/vdu_controls/constants.py 2026-08-03 02:18:41.000000000 +0200 +++ new/vdu_controls-2.6.8/src/vdu_controls/constants.py 2026-08-05 02:57:02.000000000 +0200 @@ -38,7 +38,7 @@ # the version reported in the About Dialog). In this way, wider packaging # doesn't require hacks to copy with rc/beta suffixes which we are # never going to appear in delivered distro releases. -VDU_CONTROLS_VERSION = '2.6.7' +VDU_CONTROLS_VERSION = '2.6.8' VDU_CONTROLS_VERSION_TUPLE = tuple(int(i) for i in _re.split(r'[.-]', VDU_CONTROLS_VERSION)[:3]) VDU_CONTROLS_BASE_VERSION = VDU_CONTROLS_VERSION.split('-')[0] VDU_CONTROLS_PRE_RELEASE = (VDU_CONTROLS_VERSION.split('-') + [ '' ])[1] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vdu_controls-2.6.7/src/vdu_controls/gui_misc.py new/vdu_controls-2.6.8/src/vdu_controls/gui_misc.py --- old/vdu_controls-2.6.7/src/vdu_controls/gui_misc.py 2026-08-03 02:18:41.000000000 +0200 +++ new/vdu_controls-2.6.8/src/vdu_controls/gui_misc.py 2026-08-05 02:57:02.000000000 +0200 @@ -12,6 +12,7 @@ assert gui_thread is None gui_thread = thread + def is_running_in_gui_thread() -> bool: # print(f">>>>>>>>>>>>>>>>>>>>>Checking if GUI thread is running... {QThread.currentThread()} {gui_thread}") assert gui_thread is not None diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vdu_controls-2.6.7/src/vdu_controls/help_dialog.py new/vdu_controls-2.6.8/src/vdu_controls/help_dialog.py --- old/vdu_controls-2.6.7/src/vdu_controls/help_dialog.py 2026-08-03 02:18:41.000000000 +0200 +++ new/vdu_controls-2.6.8/src/vdu_controls/help_dialog.py 2026-08-05 02:57:02.000000000 +0200 @@ -2,19 +2,23 @@ # SPDX-License-Identifier: GPL-3.0-or-later from __future__ import annotations +import subprocess +from functools import partial + from vdu_controls import constants from vdu_controls.app_locale import tr from vdu_controls.constants import VDU_CONTROLS_HELP_URL -from vdu_controls.misc import generate_slug +from vdu_controls.misc import generate_slug, is_gnome from vdu_controls.qt_imports import ( QVBoxLayout, QSize, QTextBrowser, - QUrl, QDesktopServices, + QUrl, QDesktopServices, QTimer, QDialogButtonBox, QTabWidget, QWidget, QHBoxLayout, QListWidget, QListWidgetItem, Qt, QSplitter, ) from vdu_controls.scaling import dpx from vdu_controls.widgets import SubWinDialog, DialogSingletonMixin import vdu_controls.app_locale as app_locale +import vdu_controls.app_logging as log import re class MarkdownHelpViewer(QWidget): @@ -100,8 +104,13 @@ super().__init__() self.setReadOnly(True) self.setViewportMargins(dpx(40), dpx(40), dpx(25), dpx(15)) - self.setOpenExternalLinks(True) self.setHtml(self.localized_text()) + if is_gnome(): + self.setOpenLinks(False) + self.setOpenExternalLinks(False) + self.anchorClicked.connect(self.gnome_open_url_safely) + else: + self.setOpenExternalLinks(True) def localized_text(self): # Doing this dynamically to more easily get translations @@ -130,6 +139,24 @@ (tr("License"), "https://digitaltrails.github.io/vdu_controls/LICENSE/"), ] + # Fix for browser opening - safer for gnome if running + # under xwayland. + @staticmethod + def gnome_open_url_safely(url: QUrl): + log.debug("OnlineHelpViewer: Using gnome url open") + def _open_url_with_xdg(url: QUrl): + try: + # Start xdg-open as a detached process + subprocess.Popen(['xdg-open', url.toString()], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL) + except Exception as e: + print(f"Failed to open URL: {e}") + + # Use a single-shot timer to prevent event loop reentrancy + QTimer.singleShot(0, partial(_open_url_with_xdg, url)) + + class HelpDialog(SubWinDialog, DialogSingletonMixin): @staticmethod diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vdu_controls-2.6.7/src/vdu_controls/installer.py new/vdu_controls-2.6.8/src/vdu_controls/installer.py --- old/vdu_controls-2.6.7/src/vdu_controls/installer.py 2026-08-03 02:18:41.000000000 +0200 +++ new/vdu_controls-2.6.8/src/vdu_controls/installer.py 2026-08-05 02:57:02.000000000 +0200 @@ -60,11 +60,11 @@ log.info(f"Creating zipapp {installed_script_path.as_posix()}") zipapp.create_archive(origin_script_path.parent.parent, target=installed_script_path, main='vdu_controls.__main__:main', interpreter=sys.executable) - elif origin_script_path.name.encode(".pyz"): + elif origin_script_path.name.endswith(".pyz"): log.info(f"Copying existing zipapp {sys.argv[0]} to {installed_script_path.as_posix()}") shutil.copy2(sys.argv[0], installed_script_path) else: - log.error("Unrecognized installable") + log.error(f"Unrecognized installable: {origin_script_path}") sys.exit(0) log.info(f"chmod u+rwx {installed_script_path.as_posix()}") os.chmod(installed_script_path, stat.S_IRWXU) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vdu_controls-2.6.7/src/vdu_controls/misc.py new/vdu_controls-2.6.8/src/vdu_controls/misc.py --- old/vdu_controls-2.6.7/src/vdu_controls/misc.py 2026-08-03 02:18:41.000000000 +0200 +++ new/vdu_controls-2.6.8/src/vdu_controls/misc.py 2026-08-05 02:57:02.000000000 +0200 @@ -2,6 +2,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later from __future__ import annotations +import os import re import sys import unicodedata @@ -80,4 +81,9 @@ # 2. Lowercase, strip punctuation, collapse spaces/dashes text = re.sub(r'[^\w\s-]', '', text).lower().strip() - return re.sub(r'[-\s]+', '-', text) \ No newline at end of file + return re.sub(r'[-\s]+', '-', text) + +def is_gnome(): + # Check environment variables + desktop = os.environ.get('XDG_CURRENT_DESKTOP', '').lower() + return 'gnome' in desktop or 'unity' in desktop # Unity also uses GNOME bits \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vdu_controls-2.6.7/src/vdu_controls/resources/docs/help.md new/vdu_controls-2.6.8/src/vdu_controls/resources/docs/help.md --- old/vdu_controls-2.6.7/src/vdu_controls/resources/docs/help.md 2026-08-03 02:18:41.000000000 +0200 +++ new/vdu_controls-2.6.8/src/vdu_controls/resources/docs/help.md 2026-08-05 02:57:02.000000000 +0200 @@ -7,9 +7,10 @@ footer: vdu_controls 2.6.7 --- -# vdu_controls - a DDC control panel for monitors +# vdu_controls - a DDC control panel for displays -A control panel for DisplayPort, DVI, HDMI, or USB-connected VDUs (*Visual Display Units*). +A control panel for DisplayPort, DVI, HDMI, or USB-connected displays (*Visual Display Units*), +with some limited support for laptop-panels. ## Synopsis: @@ -192,7 +193,7 @@ ### DBUS ddcutil-service When available, ``vdu_controls`` defaults to interacting with VDUs via the DBUS ``ddcutil-service`` -service rather than the ``ddcutil`` command. With some older monitors, the ``ddcutil`` command +service rather than the ``ddcutil`` command. With some older displays, the ``ddcutil`` command can take a couple of seconds to handshake a connection each time it is run. The service caches connections and should be both faster and more reliable than the command. Whether to use the service can be controlled by the ``DBUS client`` checkbox in the *Settings-Dialog*. @@ -493,9 +494,9 @@ ### Presets - remote control UNIX/Linux signals may be used to cause ``vdu_controls`` to restore a preset or to initiate a -refresh of the application from the connected monitors. Signals in the range 40 to 55 correspond to +refresh of the application from the connected displays. Signals in the range 40 to 55 correspond to first to last presets (if any are defined). Additionally, SIGHUP can be used to initiate "Refresh -settings from monitors". For example: +settings from displays". For example: Identify the running vdu_controls (assuming it is installed as /usr/bin/vdu_controls):: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vdu_controls-2.6.7/src/vdu_controls/vdu_controls_application.py new/vdu_controls-2.6.8/src/vdu_controls/vdu_controls_application.py --- old/vdu_controls-2.6.7/src/vdu_controls/vdu_controls_application.py 2026-08-03 02:18:41.000000000 +0200 +++ new/vdu_controls-2.6.8/src/vdu_controls/vdu_controls_application.py 2026-08-05 02:57:02.000000000 +0200 @@ -1619,6 +1619,22 @@ return app_instance +def fix_session_restoration_path(sys_args: List[str]) -> List[str]: + """ + Ensure that sys.argv[0] points to the wrapper script (blah/bin/vdu_controls) + instead of the full path to __main__.py. This fixes session restoration + on all desktop environments (KDE, GNOME, XFCE, LXQt, etc.) by ensuring + the session manager saves the correct restart command. + """ + # Prefer the environment variable set by the wrapper. + wrapper = getenv_logged("VDU_CONTROLS_WRAPPER", '') + if wrapper: + log.info(f"Wrapper script in use. Session restart executable: VDU_CONTROLS_WRAPPER={wrapper}.") + return [ wrapper ] + sys_args[1:] + log.info(f"Not started by wrapper script. Session restart executable: {sys.argv[0]}") + return sys_args + + def main() -> None: # Allow control-c to terminate the program signal.signal(signal.SIGINT, signal.SIG_DFL) @@ -1657,7 +1673,8 @@ QGuiApplication.setDesktopFileName("vdu_controls") # Wayland needs this set to find/use the app's desktop icon. # Call QApplication before parsing arguments, it will parse and remove Qt session restoration arguments. - app = QApplication(sys.argv) + restartable_argv = fix_session_restoration_path(sys.argv) + app = QApplication(restartable_argv) assert app is not None app.setApplicationName('vdu_controls') app_thread = app.thread() @@ -1668,7 +1685,7 @@ global unix_signal_handler unix_signal_handler = SignalWakeupHandler(app) - log.info(f"{APPNAME} {VDU_CONTROLS_VERSION} {sys.argv[0]} ") + log.info(f"{APPNAME} {VDU_CONTROLS_VERSION} {restartable_argv[0]} ") log.info(f"python-locale: {locale.getlocale()} Qt-locale: {QLocale.system().name()}") log.info(f"desktop: {getenv_logged('XDG_CURRENT_DESKTOP', default='unknown')}; " f"session-type: {getenv_logged('XDG_SESSION_TYPE', default='unknown')}; "
