Skip to content

Mark notifications with the source qube's colour - #19

Open
oshogbo wants to merge 1 commit into
QubesOS:mainfrom
oshogbo:qube-mark-on-notifications
Open

oshogbo wants to merge 1 commit into
QubesOS:mainfrom
oshogbo:qube-mark-on-notifications

Conversation

@oshogbo

@oshogbo oshogbo commented Aug 18, 2026

Copy link
Copy Markdown

This is what I got:

image

Closes QubesOS/qubes-issues#9648

@oshogbo
oshogbo force-pushed the qube-mark-on-notifications branch from fafdb68 to ea60c06 Compare August 18, 2026 08:22
@marmarek

Copy link
Copy Markdown
Member

I like it, @marmarta what do you think?

@marmarek

Copy link
Copy Markdown
Member

PipelineRetry

@qubesos-bot

qubesos-bot commented Aug 19, 2026

Copy link
Copy Markdown

OpenQA test summary

Complete test suite and dependencies: https://openqa.qubes-os.org/tests/overview?distri=qubesos&version=4.3&build=2026091612-devel&flavor=pull-requests

Test run included the following:

New failures, excluding unstable

Compared to: https://openqa.qubes-os.org/tests/overview?distri=qubesos&version=4.3&build=2026050504-devel&flavor=update

  • system_tests_usbproxy

    • TC_20_USBProxy_core3_fedora-43-xfce: test_030_detach (error)
      qubesusbproxy.core3ext.QubesUSBException: Device detach failed: 20...
  • system_tests_dispvm

  • system_tests_guivm_vnc_gui_interactive

  • system_tests_audio@hw1

  • system_tests_gpu_passthrough@hw13

    • gpu_passthrough: Failed (test died)
      # Test died: command 'ansible-playbook -i inventory -e pci_devices=...
  • system_tests_qwt_win10@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...
  • system_tests_qwt_win10_seamless@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...

    • windows_install: Failed (test died + timed out)
      # Test died: Install timed out at qubesos/tests/windows_install.pm ...

  • system_tests_qwt_win11@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...

Failed tests

18 failures
  • system_tests_whonix

    • [unstable] whonixcheck: fail (unknown)
      Whonixcheck for anon-whonix failed...

    • [unstable] whonixcheck: fail (unknown)
      Whonixcheck for whonix-gateway-18 failed...

    • [unstable] whonixcheck: fail (unknown)
      Whonixcheck for sys-whonix failed...

    • [unstable] whonixcheck: Failed (test died)
      # Test died: systemcheck failed at qubesos/tests/whonixcheck.pm lin...

  • system_tests_usbproxy

    • TC_20_USBProxy_core3_fedora-43-xfce: test_030_detach (error)
      qubesusbproxy.core3ext.QubesUSBException: Device detach failed: 20...
  • system_tests_dispvm

  • system_tests_guivm_vnc_gui_interactive

    • guivm_manager: unnamed test (unknown)
    • [unstable] guivm_manager: Failed (test died)
      # Test died: no candidate needle with tag(s) 'menu-qubes-tools' mat...
  • system_tests_audio@hw1

  • system_tests_whonix@hw1

    • [unstable] whonixcheck: fail (unknown)
      Whonixcheck for whonix-gateway-18 failed...

    • [unstable] whonixcheck: Failed (test died)
      # Test died: systemcheck failed at qubesos/tests/whonixcheck.pm lin...

  • system_tests_gpu_passthrough@hw13

    • gpu_passthrough: Failed (test died)
      # Test died: command 'ansible-playbook -i inventory -e pci_devices=...
  • system_tests_qwt_win10@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...

    • windows_install: Failed (test died + timed out)
      # Test died: Install timed out at qubesos/tests/windows_install.pm ...

  • system_tests_qwt_win10_seamless@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...

    • windows_install: Failed (test died + timed out)
      # Test died: Install timed out at qubesos/tests/windows_install.pm ...

  • system_tests_qwt_win11@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...

    • windows_install: Failed (test died + timed out)
      # Test died: Install timed out at qubesos/tests/windows_install.pm ...

Fixed failures

Compared to: https://openqa.qubes-os.org/tests/176874#dependencies

32 fixed
  • system_tests_pvgrub_salt_storage

    • system_tests: Fail (unknown)
      Tests qubes.tests.integ.grub failed (exit code 1), details reported...

    • system_tests: Failed (test died)
      # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...

    • TC_41_HVMGrub_debian-13-xfce: test_000_standalone_vm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_41_HVMGrub_debian-13-xfce: test_001_standalone_vm_dracut (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_41_HVMGrub_debian-13-xfce: test_010_template_based_vm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_41_HVMGrub_debian-13-xfce: test_011_template_based_vm_dracut (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_41_HVMGrub_fedora-43-xfce: test_010_template_based_vm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

  • system_tests_extra

    • system_tests: Fail (unknown)
      Tests qubes.tests.extra failed (exit code 1), details reported sepa...

    • system_tests: Failed (test died)
      # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...

    • TC_01_InputProxyExclude_debian-13-xfce: test_000_qemu_tablet (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_01_InputProxyExclude_fedora-43-xfce: test_000_qemu_tablet (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_00_QVCTest_fedora-43-xfce: test_010_screenshare (failure + cleanup)
      ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^... AssertionError: 1179648 != 0

    • TC_00_QVCTest_whonix-gateway-18: test_010_screenshare (failure + cleanup)
      AssertionError: 2.3156185715769593 not less than 2.0

    • TC_00_PDFConverter_fedora-43-xfce: test_004_cancel_stops_conversion (failure)
      AssertionError: DispVM not cleaned up 10s after cancel: {<DispVM at...

  • system_tests_usbproxy

    • system_tests: wait_serial (wait serial expected)
      # wait_serial expected: qr/h3uXO-\d+-/...

    • TC_20_USBProxy_core3_fedora-43-xfce: test_090_attach_stubdom (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

  • system_tests_network_ipv6

    • system_tests: Fail (unknown)
      Tests qubes.tests.integ.network_ipv6 failed (exit code 1), details ...

    • system_tests: Failed (test died)
      # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...

    • VmIPv6Networking_fedora-43-xfce: test_001_simple_networking_paused_from_none_to_existent (error)
      raise TimeoutError from exc_val... TimeoutError

  • system_tests_audio

  • system_tests_audio@hw1

  • system_tests_guivm_gpu_gui_interactive@hw13

    • shutdown: unnamed test (unknown)
    • shutdown: Failed (test died)
      # Test died: no candidate needle with tag(s) 'text-logged-in-root' ...
  • system_tests_qwt_win10_seamless@hw13

    • windows_clipboard_and_filecopy: unnamed test (unknown)
    • windows_clipboard_and_filecopy: Failed (test died)
      # Test died: no candidate needle with tag(s) 'windows-Edge-address-...

Unstable tests

Details
  • system_tests_whonix

    whonixcheck/Failed (2/5 times with errors)
    • job 195145 # Test died: command 'qvm-run -ap anon-whonix 'LC_ALL=C whonixchec...
    • job 195438 # Test died: command 'qvm-run -ap anon-whonix 'LC_ALL=C whonixcheck...
    whonixcheck/Failed (1/5 times with errors)
    • job 194984 # Test died: command 'qvm-run -ap whonix-gateway-18 'LC_ALL=C whon...
    whonixcheck/Failed (1/5 times with errors)
    • job 196176 # Test died: systemcheck failed at qubesos/tests/whonixcheck.pm lin...
    whonixcheck/fail (2/5 times with errors)
    whonixcheck/fail (1/5 times with errors)
    whonixcheck/wait_serial (2/5 times with errors)
    • job 195145 # Command: qvm-run -ap anon-whonix 'LC_ALL=C whonixcheck --verbose...
    • job 195438 # Command: qvm-run -ap anon-whonix 'LC_ALL=C whonixcheck --verbose ...
    whonixcheck/wait_serial (1/5 times with errors)
    • job 194984 # Command: qvm-run -ap whonix-gateway-18 'LC_ALL=C whonixcheck --v...
  • system_tests_basic_vm_qrexec_gui

    system_tests/Fail (1/5 times with errors)
    • job 195163 Tests qubes.tests.integ.basic failed (exit code 1), details reporte...
    system_tests/Failed (1/5 times with errors)
    • job 195163 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    TC_30_Gui_daemon/test_002_clipboard_300k (1/5 times with errors)
    • job 195163 : Clipboard copy operation failed - content...
  • system_tests_pvgrub_salt_storage

    system_tests/Failed (1/5 times with errors)
    • job 195016 # Test died: command 'curl --form upload=@nose2-junit.xml --form up...
  • system_tests_splitgpg

    system_tests/Failed (1/5 times with errors)
    • job 195018 # Test died: command 'curl --form upload=@tests-qubes.tests.extra.l...
  • system_tests_extra

    system_tests/Fail (2/5 times with errors)
    • job 195463 Tests qubes.tests.extra failed (exit code 1), details reported sepa...
    • job 196201 Tests qubes.tests.extra failed (exit code 1), details reported sepa...
    system_tests/Failed (1/5 times with errors)
    • job 195170 # Test died: command 'testfunc qubes.tests.extra' timed out...
    system_tests/Failed (2/5 times with errors)
    • job 195463 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    • job 196201 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    TC_00_PDFConverter_debian-13-xfce/test_004_cancel_stops_conversion (1/5 times with errors)
    • job 196201 AssertionError: DispVM not cleaned up 10s after cancel: {<DispVM at...
    TC_00_PDFConverter_fedora-43-xfce/test_004_cancel_stops_conversion (1/5 times with errors)
    • job 196201 AssertionError: DispVM not cleaned up 10s after cancel: {<DispVM at...
    TC_00_PDFConverter_fedora-44-xfce/test_004_cancel_stops_conversion (1/5 times with errors)
    • job 195463 AssertionError: DispVM not cleaned up 10s after cancel: {<DispVM at...
    system_tests/wait_serial (1/5 times with errors)
    • job 195170 # Command: testfunc qubes.tests.extra...
  • system_tests_gui_interactive

    clipboard_and_web/ (1/5 times with errors)
    clipboard_and_web/Failed (1/5 times with errors)
    • job 195010 # Test died: no candidate needle with tag(s) 'personal-firefox' mat...
  • system_tests_guivm_gui_interactive

    clipboard_and_web/ (1/5 times with errors)
    update_guivm/ (1/5 times with errors)
    clipboard_and_web/Failed (1/5 times with errors)
    • job 195012 # Test died: no candidate needle with tag(s) 'personal-firefox' mat...
    update_guivm/Failed (1/5 times with errors)
    • job 195466 # Test died: no candidate needle with tag(s) 'xterm' matched...
  • system_tests_usbproxy

    system_tests/Fail (2/5 times with errors)
    • job 195144 Tests qubes.tests.extra failed (exit code 1), details reported sepa...
    • job 195437 Tests qubes.tests.extra failed (exit code 1), details reported sepa...
    system_tests/Failed (2/5 times with errors)
    • job 195144 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    • job 195437 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    TC_00_USBProxy_fedora-44-xfce/test_020_detach_on_remove (1/5 times with errors)
    • job 195437 AssertionError: 0 != 1 : Device not cleaned up
    TC_20_USBProxy_core3_fedora-44-xfce/test_030_detach (1/5 times with errors)
    • job 195144 qubesusbproxy.core3ext.QubesUSBException: Device detach failed: 20...
  • system_tests_qrexec

    system_tests/Fail (1/5 times with errors)
    • job 195017 Tests qubes.tests.integ.qrexec failed (exit code 1), details report...
    system_tests/Failed (1/5 times with errors)
    • job 195017 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    TC_00_Qrexec_whonix-gateway-18/test_055_qrexec_dom0_service_abort (1/5 times with errors)
    • job 195017 AssertionError: Timeout, probably stdout wasn't closed
  • system_tests_network_ipv6

    system_tests/Failed (1/5 times with errors)
    • job 195175 # Test died: command 'curl --form upload=@tests-qubes.tests.integ.n...
  • system_tests_network_updates

    system_tests/Fail (3/5 times with errors)
    • job 195176 Tests qubes.tests.integ.dom0_update failed (exit code 1), details r...
    • job 195727 Tests qubes.tests.integ.dom0_update failed (exit code 1), details r...
    • job 196207 Tests qubes.tests.integ.dom0_update failed (exit code 1), details r...
    system_tests/Failed (1/5 times with errors)
    • job 195469 # Test died: command 'curl --form upload=@tests-qubes.tests.integ.d...
    system_tests/Failed (3/5 times with errors)
    • job 195176 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    • job 195727 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    • job 196207 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    TC_11_QvmTemplateMgmtVM_whonix-gateway-18/test_000_template_list (1/5 times with errors)
    • job 195727 subprocess.CalledProcessError: Command 'timeout=120; while ! tor-ci...
    TC_00_Dom0Upgrade_whonix-gateway-18/test_000_update (2/5 times with errors)
    • job 195176 Error: Failed to download metadata for repo 'test': Cannot download...
    • job 196207 Error: Failed to download metadata for repo 'test': Cannot download...
    TC_00_Dom0Upgrade_whonix-gateway-18/test_006_update_flag_clear (1/5 times with errors)
    • job 196207 subprocess.CalledProcessError: Command 'timeout=120; while ! tor-ci...
    TC_00_Dom0Upgrade_whonix-gateway-18/test_010_instal (1/5 times with errors)
    • job 195727 Error: Failed to download metadata for repo 'test': Yum repo downlo...
    TC_11_QvmTemplateMgmtVM_fedora-44-xfce/test_010_template_install (1/5 times with errors)
    • job 195176 AssertionError: qvm-template failed: [Qrexec] ERROR: dnf command is...
  • system_tests_kde_gui_interactive

    clipboard_and_web/ (1/5 times with errors)
    clipboard_and_web/ (1/5 times with errors)
    clipboard_and_web/Failed (1/5 times with errors)
    • job 194988 # Test died: no candidate needle with tag(s) 'personal-firefox' mat...
    clipboard_and_web/Failed (1/5 times with errors)
    • job 195149 # Test died: no candidate needle with tag(s) 'personal-firefox' mat...
  • system_tests_guivm_vnc_gui_interactive

    gui_filecopy/ (1/5 times with errors)
    guivm_manager/ (1/5 times with errors)
    guivm_manager/ (1/5 times with errors)
    simple_gui_apps/ (1/5 times with errors)
    gui_filecopy/Failed (1/5 times with errors)
    • job 195547 # Test died: no candidate needle with tag(s) 'files-test-file' matc...
    guivm_manager/Failed (1/5 times with errors)
    • job 196184 # Test died: no candidate needle with tag(s) 'menu-qubes-tools' mat...
    guivm_manager/Failed (1/5 times with errors)
    • job 195732 # Test died: no candidate needle with tag(s) 'qubes-qube-manager' m...
    simple_gui_apps/Failed (1/5 times with errors)
    • job 195551 # Test died: no candidate needle with tag(s) 'vm-settings-applicati...
  • system_tests_gui_interactive@hw7

    clipboard_and_web/ (1/5 times with errors)
    clipboard_and_web/Failed (1/5 times with errors)
    • job 195010 # Test died: no candidate needle with tag(s) 'personal-firefox' mat...
  • system_tests_whonix@hw1

    whonixcheck/Failed (2/5 times with errors)
    • job 195145 # Test died: command 'qvm-run -ap anon-whonix 'LC_ALL=C whonixchec...
    • job 195438 # Test died: command 'qvm-run -ap anon-whonix 'LC_ALL=C whonixcheck...
    whonixcheck/Failed (1/5 times with errors)
    • job 194984 # Test died: command 'qvm-run -ap whonix-gateway-18 'LC_ALL=C whon...
    whonixcheck/Failed (1/5 times with errors)
    • job 196176 # Test died: systemcheck failed at qubesos/tests/whonixcheck.pm lin...
    whonixcheck/fail (2/5 times with errors)
    whonixcheck/fail (1/5 times with errors)
    whonixcheck/wait_serial (2/5 times with errors)
    • job 195145 # Command: qvm-run -ap anon-whonix 'LC_ALL=C whonixcheck --verbose...
    • job 195438 # Command: qvm-run -ap anon-whonix 'LC_ALL=C whonixcheck --verbose ...
    whonixcheck/wait_serial (1/5 times with errors)
    • job 194984 # Command: qvm-run -ap whonix-gateway-18 'LC_ALL=C whonixcheck --v...
  • system_tests_basic_vm_qrexec_gui_btrfs

    system_tests/Failed (1/5 times with errors)
    • job 195457 # Test died: command 'curl --form upload=@tests-qubes.tests.integ.b...
  • system_tests_basic_vm_qrexec_gui_ext4

    system_tests/Fail (1/5 times with errors)
    • job 195165 Tests qubes.tests.integ.vm_qrexec_gui failed (exit code 1), details...
    system_tests/Failed (1/5 times with errors)
    • job 195165 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    TC_20_NonAudio_fedora-44-xfce-pool/test_500_gui_agent_env_sync (1/5 times with errors)
    • job 195165 qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...
  • system_tests_basic_vm_qrexec_gui@hw7

    system_tests/Fail (1/5 times with errors)
    • job 195163 Tests qubes.tests.integ.basic failed (exit code 1), details reporte...
    system_tests/Failed (1/5 times with errors)
    • job 195163 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    TC_30_Gui_daemon/test_002_clipboard_300k (1/5 times with errors)
    • job 195163 : Clipboard copy operation failed - content...

Performance Tests

Performance degradation:

No issues

Remaining performance tests:

71 tests
  • debian-13-xfce_exec: 8.49
  • debian-13-xfce_exec-root: 27.03
  • debian-13-xfce_socket: 8.81
  • debian-13-xfce_socket-root: 8.85
  • debian-13-xfce_exec-data-simplex: 64.65
  • debian-13-xfce_exec-data-duplex: 62.83
  • debian-13-xfce_exec-data-duplex-root: 85.16
  • debian-13-xfce_socket-data-duplex: 94.55
  • fedora-44-xfce_exec: 9.16
  • fedora-44-xfce_exec-root: 73.57
  • fedora-44-xfce_socket: 8.85
  • fedora-44-xfce_socket-root: 8.64
  • fedora-44-xfce_exec-data-simplex: 68.03
  • fedora-44-xfce_exec-data-duplex: 71.82
  • fedora-44-xfce_exec-data-duplex-root: 110.49
  • fedora-44-xfce_socket-data-duplex: 80.79
  • whonix-gateway-18_exec: 8.63
  • whonix-gateway-18_exec-root: 155.56
  • whonix-gateway-18_socket: 8.14
  • whonix-gateway-18_socket-root: 9.54
  • whonix-gateway-18_exec-data-simplex: 72.87
  • whonix-gateway-18_exec-data-duplex: 71.84
  • whonix-gateway-18_exec-data-duplex-root: 151.47
  • whonix-gateway-18_socket-data-duplex: 106.50
  • whonix-workstation-18_exec: 8.91
  • whonix-workstation-18_exec-root: 170.13
  • whonix-workstation-18_socket: 9.53
  • whonix-workstation-18_socket-root: 9.51
  • whonix-workstation-18_exec-data-simplex: 69.01
  • whonix-workstation-18_exec-data-duplex: 72.40
  • whonix-workstation-18_exec-data-duplex-root: 163.78
  • whonix-workstation-18_socket-data-duplex: 95.15
  • debian-13-xfce_dom0-dispvm-api (mean:6.553): 78.64
  • debian-13-xfce_dom0-dispvm-gui-api (mean:8.69): 104.27
  • debian-13-xfce_dom0-dispvm-preload-2-api (mean:3.216): 38.59
  • debian-13-xfce_dom0-dispvm-preload-2-delay-0-api (mean:3.001): 36.01
  • debian-13-xfce_dom0-dispvm-preload-2-delay-minus-1d2-api (mean:3.225): 38.70
  • debian-13-xfce_dom0-dispvm-preload-4-api (mean:2.335): 28.02
  • debian-13-xfce_dom0-dispvm-preload-4-delay-0-api (mean:2.6): 31.20
  • debian-13-xfce_dom0-dispvm-preload-4-delay-minus-1d2-api (mean:2.511): 30.14
  • debian-13-xfce_dom0-dispvm-preload-2-gui-api (mean:4.762): 57.15
  • debian-13-xfce_dom0-dispvm-preload-4-gui-api (mean:3.748): 44.98
  • debian-13-xfce_dom0-dispvm-preload-6-gui-api (mean:3.281): 39.37
  • debian-13-xfce_dom0-vm-api (mean:0.026): 0.32
  • debian-13-xfce_dom0-vm-gui-api (mean:0.022): 0.26
  • fedora-44-xfce_dom0-dispvm-api (mean:8.484): 101.81
  • fedora-44-xfce_dom0-dispvm-gui-api (mean:10.365): 124.38
  • fedora-44-xfce_dom0-dispvm-preload-2-api (mean:4.09): 49.07
  • fedora-44-xfce_dom0-dispvm-preload-2-delay-0-api (mean:3.831): 45.97
  • fedora-44-xfce_dom0-dispvm-preload-2-delay-minus-1d2-api (mean:4.163): 49.96
  • fedora-44-xfce_dom0-dispvm-preload-4-api (mean:2.946): 35.35
  • fedora-44-xfce_dom0-dispvm-preload-4-delay-0-api (mean:2.652): 31.83
  • fedora-44-xfce_dom0-dispvm-preload-4-delay-minus-1d2-api (mean:3.183): 38.19
  • fedora-44-xfce_dom0-dispvm-preload-2-gui-api (mean:5.261): 63.14
  • fedora-44-xfce_dom0-dispvm-preload-4-gui-api (mean:4.344): 52.13
  • fedora-44-xfce_dom0-dispvm-preload-6-gui-api (mean:3.343): 40.11
  • fedora-44-xfce_dom0-vm-api (mean:0.019): 0.23
  • fedora-44-xfce_dom0-vm-gui-api (mean:0.023): 0.28
  • whonix-workstation-18_dom0-dispvm-api (mean:9.852): 118.22
  • whonix-workstation-18_dom0-dispvm-gui-api (mean:11.754): 141.05
  • whonix-workstation-18_dom0-dispvm-preload-2-api (mean:4.258): 51.09
  • whonix-workstation-18_dom0-dispvm-preload-2-delay-0-api (mean:4.316): 51.79
  • whonix-workstation-18_dom0-dispvm-preload-2-delay-minus-1d2-api (mean:5.226): 62.71
  • whonix-workstation-18_dom0-dispvm-preload-4-api (mean:3.511): 42.13
  • whonix-workstation-18_dom0-dispvm-preload-4-delay-0-api (mean:3.357): 40.28
  • whonix-workstation-18_dom0-dispvm-preload-4-delay-minus-1d2-api (mean:3.7): 44.41
  • whonix-workstation-18_dom0-dispvm-preload-2-gui-api (mean:6.121): 73.45
  • whonix-workstation-18_dom0-dispvm-preload-4-gui-api (mean:4.491): 53.89
  • whonix-workstation-18_dom0-dispvm-preload-6-gui-api (mean:3.753): 45.03
  • whonix-workstation-18_dom0-vm-api (mean:0.017): 0.20
  • whonix-workstation-18_dom0-vm-gui-api (mean:0.03): 0.36

@marmarta

Copy link
Copy Markdown
Member

I generally like it, but I have questions: how does it look when the icon has some transparency? I wonder if this remains readable with colorful icons - I don't see that many colorful icons in notifications in general, though.

@marmarek

Copy link
Copy Markdown
Member

It doesn't appear to work :(
First test: https://openqa.qubes-os.org/tests/192868#step/startup/9, but here nm-applet uses image-path, not image-data, so kinda expected.
For the second test, I opened firefox searched for notifications test and got cleverpush.com/en/test-notifications. dbus-monitor confirms this one sends image-data, but still got only qube icon. And a log entry on the server part: Ignoring unusablke image from guest: Width or height too large. It seems the icon is 256x256 here (BTW, that error could include that info...).

For the size, either the limit should be higher, or the client should scale it down to allowed size. The current limit seems to be 255, so almost... Maybe dbus notification spec includes suggested limits?

As for the image-path, if it's function is equivalent to image-data, maybe client could read the file and send as image-data?

@oshogbo

oshogbo commented Aug 20, 2026

Copy link
Copy Markdown
Author

I generally like it, but I have questions: how does it look when the icon has some transparency? I wonder if this remains readable with colorful icons - I don't see that many colorful icons in notifications in general, though.

It shouldn't have any problems with transparency. I tested it, for example, with this:
2026-08-19-163425_531x129_scrot

It doesn't appear to work :(

I haven't tested it with qubes, just directly on Debian. Let me try to address these problems.

@andrewdavidwong

Copy link
Copy Markdown
Member

Suggestion: If you intend for this pull request to resolve the associated issue and would like for it to be linked to the issue automatically, you can put Closes QubesOS/qubes-issues#XXXX in the PR message (where XXXX is the issue number). Closes is one of several special keywords that GitHub will recognize. If and when the PR is merged, GitHub will automatically close the associated issue.

@oshogbo

oshogbo commented Aug 26, 2026

Copy link
Copy Markdown
Author

Suggestion: If you intend for this pull request to resolve the associated issue and would like for it to be linked to the issue automatically, you can put Closes QubesOS/qubes-issues#XXXX in the PR message (where XXXX is the issue number). Closes is one of several special keywords that GitHub will recognize. If and when the PR is merged, GitHub will automatically close the associated issue.

Thank you changed.

@marmarek

Copy link
Copy Markdown
Member

nm-applet now looks to work: https://openqa.qubes-os.org/tests/194312#step/startup/8 (click the image icon to see colors) :)

Comment thread src/badge.rs Outdated
Comment on lines +111 to +227
fn mix(colour: [u8; 3], target: [u8; 3], amount: f32) -> [u8; 3] {
let mut out = [0; 3];
for i in 0..3 {
out[i] = (colour[i] as f32 + (target[i] as f32 - colour[i] as f32) * amount).round() as u8;
}
out
}

/// Averages each `factor` x `factor` block into one pixel.
fn downsample(src: &Image, factor: u32) -> Image {
let mut out = Image::new(src.width / factor, src.height / factor);
for y in 0..out.height {
for x in 0..out.width {
let (mut sa, mut sr, mut sg, mut sb) = (0u32, 0u32, 0u32, 0u32);
for dy in 0..factor {
for dx in 0..factor {
let p = src.pixel(x * factor + dx, y * factor + dy);
let a = p[3] as u32;
sa += a;
sr += p[0] as u32 * a;
sg += p[1] as u32 * a;
sb += p[2] as u32 * a;
}
}
let n = factor * factor;
let px = if sa == 0 {
[0, 0, 0, 0]
} else {
[
(sr / sa) as u8,
(sg / sa) as u8,
(sb / sa) as u8,
(sa / n) as u8,
]
};
out.set_pixel(x, y, px);
}
}
out
}

/// Where the solid cube sits.
const CUBE_MAIN_X: f32 = 0.46;
const CUBE_MAIN_Y: f32 = 0.56;
const CUBE_RADIUS: f32 = 0.26;
const CUBE_GHOST_X: f32 = 0.74;
const CUBE_GHOST_Y: f32 = 0.77;
const CUBE_GHOST_TINT: f32 = 0.62;
const CUBE_GHOST_ALPHA: f32 = 0.88;

const WHITE: [u8; 3] = [0xFF, 0xFF, 0xFF];
const BLACK: [u8; 3] = [0x00, 0x00, 0x00];

/// Draws one cube with its centre at `(cx, cy)`, on top of what is already
/// there.
fn draw_cube(img: &mut Image, cx: f32, cy: f32, r: f32, colour: [u8; 3], alpha: f32) {
let w = r * 0.866; // cos(30 degrees)

let top = mix(colour, WHITE, 0.34);
let right = mix(colour, WHITE, 0.05);
let left = mix(colour, BLACK, 0.32);
let a = (alpha.clamp(0.0, 1.0) * 255.0).round() as u8;

let lo_x = (cx - w).floor().max(0.0) as u32;
let hi_x = (cx + w).ceil().min(img.width as f32 - 1.0) as u32;
let lo_y = (cy - r).floor().max(0.0) as u32;
let hi_y = (cy + r).ceil().min(img.height as f32 - 1.0) as u32;

for y in lo_y..=hi_y {
for x in lo_x..=hi_x {
let dx = x as f32 - cx;
let dy = y as f32 - cy;
let slope = dx.abs() * r / (2.0 * w);
let [red, green, blue] = if dx.abs() > w || dy.abs() > r - slope {
continue;
} else if dy <= -slope {
top
} else if dx >= 0.0 {
right
} else {
left
};
let under = img.pixel(x, y);
img.set_pixel(x, y, blend(under, [red, green, blue, a]));
}
}
}

/// Draws the mark: a solid cube with a paler cube behind it, both in the
/// qube's label colour.
pub fn cube_mark(colour: [u8; 3]) -> Image {
const SS: u32 = 3;

let big = MARK_SIZE * SS;
let mut img = Image::new(big, big);
let edge = big as f32 - 1.0;
let r = big as f32 * CUBE_RADIUS;

// Pale cube first, so the solid one covers it and not the other way round.
draw_cube(
&mut img,
edge * CUBE_GHOST_X,
edge * CUBE_GHOST_Y,
r,
mix(colour, WHITE, CUBE_GHOST_TINT),
CUBE_GHOST_ALPHA,
);
draw_cube(
&mut img,
edge * CUBE_MAIN_X,
edge * CUBE_MAIN_Y,
r,
colour,
1.0,
);
downsample(&img, SS)
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The overlay was supposed to be just qube icon, which you can load from the icon theme based on default_icon of NotificationEmitter. You don't need to draw it manually...

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I somehow assumed that we wanted to support any color of the cube, not just the ones defined by the icons.

I’ll fix it then - to use the icons.

@marmarek

Copy link
Copy Markdown
Member

It is better now :)

Few more observations:

  • If an application sends a large icon as image-data, the notification has noticeable delay, and at this time notification-proxy-client uses a lot of CPU. With 1024x1024 icon I got about 3s delay (on admittedly quite slow system). And then, as expected, dom0 rejects the icon anyway...

  • After few more tests, it looks like lower right corner is unfortunate, as many icons use this area for various icon variants already (network manager for connection status (red cross if not disconnected), nextcloud for connection status, etc). So, maybe upper left corner instead?

Comment thread src/icon.rs
@oshogbo

oshogbo commented Sep 15, 2026

Copy link
Copy Markdown
Author

I have moved the mark to the top-left. I'm not sure if it looks best there. Maybe bottom-left?

The client now resizes images before sending them to dom0. I also optimized the client's parsing of the hints.
On my machine a 1024x1024 icon went from ~350 ms to ~67 ms.

@marmarek

Copy link
Copy Markdown
Member
22:35:35 [qb.build_rpm.notification-proxy.vm-fc44.build] error[E0583]: file not found for module `hints`
22:35:35 [qb.build_rpm.notification-proxy.vm-fc44.build]   --> src/lib.rs:26:1
22:35:35 [qb.build_rpm.notification-proxy.vm-fc44.build]    |
22:35:35 [qb.build_rpm.notification-proxy.vm-fc44.build] 26 | mod hints;
22:35:35 [qb.build_rpm.notification-proxy.vm-fc44.build]    | ^^^^^^^^^^
22:35:35 [qb.build_rpm.notification-proxy.vm-fc44.build]    |
22:35:35 [qb.build_rpm.notification-proxy.vm-fc44.build]    = help: to create the module `hints`, create file "src/hints.rs" or "src/hints/mod.rs"
22:35:35 [qb.build_rpm.notification-proxy.vm-fc44.build]    = note: if there is a `mod hints` elsewhere in the crate already, import it with `use crate::...` instead

forgot to git add a file?

@oshogbo
oshogbo force-pushed the qube-mark-on-notifications branch from c25e037 to 7a1709b Compare September 16, 2026 10:33
@oshogbo

oshogbo commented Sep 16, 2026

Copy link
Copy Markdown
Author
22:35:35 [qb.build_rpm.notification-proxy.vm-fc44.build] error[E0583]: file not found for module `hints`
22:35:35 [qb.build_rpm.notification-proxy.vm-fc44.build]   --> src/lib.rs:26:1
22:35:35 [qb.build_rpm.notification-proxy.vm-fc44.build]    |
22:35:35 [qb.build_rpm.notification-proxy.vm-fc44.build] 26 | mod hints;
22:35:35 [qb.build_rpm.notification-proxy.vm-fc44.build]    | ^^^^^^^^^^
22:35:35 [qb.build_rpm.notification-proxy.vm-fc44.build]    |
22:35:35 [qb.build_rpm.notification-proxy.vm-fc44.build]    = help: to create the module `hints`, create file "src/hints.rs" or "src/hints/mod.rs"
22:35:35 [qb.build_rpm.notification-proxy.vm-fc44.build]    = note: if there is a `mod hints` elsewhere in the crate already, import it with `use crate::...` instead

forgot to git add a file?

🤦‍♂️
Sorry for that, fixed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Improve qube indication in the notifications proxy

5 participants