Skip to content

[BUG] NO_DECOR not working as expected #11

Description

@c360e5f1

Is there an existing issue for this?

  • I have searched the existing issues

Current Behavior

Setting NO_DECOR=true as an environment variable in compose.yml does not actually remove window decorations on startup; however, window decorations can still be toggled with CTRL-SHIFT-D in the application.

There is a relevant log entry detecting the setting during startup:

freecad  | [ls.io-init] Creating initial backup of system rc.xml
freecad  | [ls.io-init] Removing window decorations
freecad  | [ls.io-init] Disabling maximization 

Expected Behavior

No window decoration (nice-to-have when used as PWA)
Image

This is actually what happens (see window title bar)
Image

Steps To Reproduce

  1. Create container with compose.yml
  2. docker compose up
  3. Start the application and connect with web browser
  4. see window decorations; toggle window decorations with CTRL-SHIFT-D - window decorations should be disabled by default on startup according to NO_DECOR=true in my compose.yml

Environment

- OS: Debian Trixie
- How docker service was installed: docker shell installer via APT repo

CPU architecture

x86-64

Docker creation

---
services:
  freecad:
    image: lscr.io/linuxserver/freecad:latest
    container_name: freecad
    environment:
      - PUID=0
      - PGID=0
      - TZ=America/Chicago
      - NO_FULL=true
      - NO_DECOR=true
    volumes:
      - ./volumes/config:/config
    ports:
      - 8087:3000
    devices:
      - /dev/dri:/dev/dri
    shm_size: "1gb"
    restart: unless-stopped

Container logs

freecad  | [migrations] started
freecad  | [migrations] no migrations found
freecad  | usermod: user abc is currently used by process 1
freecad  | ───────────────────────────────────────
freecad  |
freecad  |       ██╗     ███████╗██╗ ██████╗
freecad  |       ██║     ██╔════╝██║██╔═══██╗
freecad  |       ██║     ███████╗██║██║   ██║
freecad  |       ██║     ╚════██║██║██║   ██║
freecad  |       ███████╗███████║██║╚██████╔╝
freecad  |       ╚══════╝╚══════╝╚═╝ ╚═════╝
freecad  |
freecad  |    Brought to you by linuxserver.io
freecad  | ───────────────────────────────────────
freecad  |
freecad  | To support LSIO projects visit:
freecad  | https://www.linuxserver.io/donate/
freecad  |
freecad  | ───────────────────────────────────────
freecad  | GID/UID
freecad  | ───────────────────────────────────────
freecad  |
freecad  | User UID:    0
freecad  | User GID:    0
freecad  | ───────────────────────────────────────
freecad  | [ls.io-init] Creating initial backup of system rc.xml
freecad  | [ls.io-init] Removing window decorations
freecad  | [ls.io-init] Disabling maximization
freecad  | **** permissions for /dev/dri/renderD128 are good ****
freecad  | **** permissions for /dev/dri/card0 are good ****
freecad  | [custom-init] No custom files found, skipping...
freecad  | xsettingsd: Loaded 5 settings from /config/.xsettingsd
freecad  | xsettingsd: Unable to open connection to X server
freecad  | [ls.io-init] done.
freecad  | screen 0 shmid 0
freecad  | amdgpu: os_same_file_description couldn't determine if two DRM fds reference the same file description.
freecad  | If they do, bad things may happen!
freecad  | 17
freecad  | 18
freecad  | INFO:selkies.__main__:Starting mode 'websockets'...
freecad  | INFO:selkies.__main__:Starting Selkies in 'websockets' mode.
freecad  | INFO:data_websocket:pcmflux library found. Audio capture is available.
freecad  | INFO:data_websocket:pixelflux library found. Striped encoding modes available.
freecad  | INFO:root:Expected C js_config_t size (from ctypes): 1354 bytes
freecad  | INFO:main:Upload directory ensured: /config/Desktop
freecad  | INFO:main:Legacy Mode ENABLED (SELKIES_MASTER_TOKEN is not set).
freecad  | INFO:main:Starting Selkies (WebSocket Mode) with settings: {'_setting_definitions': [{'name': 'audio_enabled', 'type': 'bool', 'default': True, 'help': 'Enable server-to-client audio streaming.'}, {'name': 'microphone_enabled', 'type': 'bool', 'default': True, 'help': 'Enable client-to-server microphone forwarding.'}, {'name': 'gamepad_enabled', 'type': 'bool', 'default': True, 'help': 'Enable gamepad support.'}, {'name': 'clipboard_enabled', 'type': 'bool', 'default': True, 'help': 'Enable clipboard synchronization.'}, {'name': 'command_enabled', 'type': 'bool', 'default': True, 'help': 'Enable parsing of command websocket messages.'}, {'name': 'file_transfers', 'type': 'list', 'default': 'upload,download', 'meta': {'allowed': ['upload', 'download']}, 'help': 'Allowed file transfer directions (comma-separated: "upload,download"). Set to "" or "none" to disable.'}, {'name': 'framerate', 'type': 'range', 'default': '8-120', 'meta': {'default_value': 60}, 'help': 'Allowed framerate range (e.g., "8-165") or a fixed value (e.g., "60").'}, {'name': 'audio_bitrate', 'type': 'enum', 'default': '320000', 'meta': {'allowed': ['64000', '128000', '265000', '320000']}, 'help': 'The default audio bitrate.'}, {'name': 'is_manual_resolution_mode', 'type': 'bool', 'default': False, 'help': 'Lock the resolution to the manual width/height values.'}, {'name': 'manual_width', 'type': 'int', 'default': 0, 'help': 'Lock width to a fixed value. Setting this forces manual resolution mode.'}, {'name': 'manual_height', 'type': 'int', 'default': 0, 'help': 'Lock height to a fixed value. Setting this forces manual resolution mode.'}, {'name': 'scaling_dpi', 'type': 'enum', 'default': '96', 'meta': {'allowed': ['96', '120', '144', '168', '192', '216', '240', '264', '288']}, 'help': 'The default DPI for UI scaling.'}, {'name': 'enable_binary_clipboard', 'type': 'bool', 'default': False, 'help': 'Allow binary data (e.g., images) on the clipboard.'}, {'name': 'use_browser_cursors', 'type': 'bool', 'default': False, 'help': 'Use browser CSS cursors instead of rendering to canvas.'}, {'name': 'use_css_scaling', 'type': 'bool', 'default': False, 'help': 'HiDPI when false, if true a lower resolution is sent from the client and the canvas is stretched.'}, {'name': 'ui_title', 'type': 'str', 'default': 'Selkies', 'help': 'Title in top left corner of sidebar.'}, {'name': 'ui_show_logo', 'type': 'bool', 'default': True, 'help': 'Show the Selkies logo in the sidebar.'}, {'name': 'ui_show_core_buttons', 'type': 'bool', 'default': True, 'help': 'Show the core components buttons display, audio, microphone, and gamepad.'}, {'name': 'ui_show_sidebar', 'type': 'bool', 'default': True, 'help': 'Show the main sidebar UI.'}, {'name': 'ui_sidebar_show_video_settings', 'type': 'bool', 'default': True, 'help': 'Show the video settings section in the sidebar.'}, {'name': 'ui_sidebar_show_screen_settings', 'type': 'bool', 'default': True, 'help': 'Show the screen settings section in the sidebar.'}, {'name': 'ui_sidebar_show_audio_settings', 'type': 'bool', 'default': True, 'help': 'Show the audio settings section in the sidebar.'}, {'name': 'ui_sidebar_show_stats', 'type': 'bool', 'default': True, 'help': 'Show the stats section in the sidebar.'}, {'name': 'ui_sidebar_show_clipboard', 'type': 'bool', 'default': True, 'help': 'Show the clipboard section in the sidebar.'}, {'name': 'ui_sidebar_show_files', 'type': 'bool', 'default': True, 'help': 'Show the file transfer section in the sidebar.'}, {'name': 'ui_sidebar_show_apps', 'type': 'bool', 'default': True, 'help': 'Show the applications section in the sidebar.'}, {'name': 'ui_sidebar_show_sharing', 'type': 'bool', 'default': True, 'help': 'Show the sharing section in the sidebar.'}, {'name': 'ui_sidebar_show_gamepads', 'type': 'bool', 'default': True, 'help': 'Show the gamepads section in the sidebar.'}, {'name': 'ui_sidebar_show_fullscreen', 'type': 'bool', 'default': True, 'help': 'Show the fullscreen button in the sidebar.'}, {'name': 'ui_sidebar_show_gaming_mode', 'type': 'bool', 'default': True, 'help': 'Show the gaming mode button in the sidebar.'}, {'name': 'ui_sidebar_show_trackpad', 'type': 'bool', 'default': True, 'help': 'Show the virtual trackpad button in the sidebar.'}, {'name': 'ui_sidebar_show_keyboard_button', 'type': 'bool', 'default': True, 'help': 'Show the on-screen keyboard button in the display area.'}, {'name': 'ui_sidebar_show_soft_buttons', 'type': 'bool', 'default': True, 'help': 'Show the soft buttons section in the sidebar.'}, {'name': 'enable_sharing', 'type': 'bool', 'default': True, 'help': 'Master toggle for all sharing features.'}, {'name': 'enable_collab', 'type': 'bool', 'default': True, 'help': 'Enable collaborative (read-write) sharing link.'}, {'name': 'enable_shared', 'type': 'bool', 'default': True, 'help': 'Enable view-only sharing links.'}, {'name': 'enable_player2', 'type': 'bool', 'default': True, 'help': 'Enable sharing link for gamepad player 2.'}, {'name': 'enable_player3', 'type': 'bool', 'default': True, 'help': 'Enable sharing link for gamepad player 3.'}, {'name': 'enable_player4', 'type': 'bool', 'default': True, 'help': 'Enable sharing link for gamepad player 4.'}, {'name': 'debug', 'type': 'bool', 'default': False, 'help': 'Enable debug logging.'}, {'name': 'mode', 'type': 'str', 'default': 'websockets', 'help': "Specify the mode: 'webrtc' or 'websockets'; defaults to websockets"}, {'name': 'enable_dual_mode', 'type': 'bool', 'default': False, 'help': 'Enable switching Streaming modes from UI'}, {'name': 'encoder', 'type': 'enum', 'default': 'x264enc', 'meta': {'allowed': ['x264enc', 'x264enc-striped', 'jpeg']}, 'help': 'The default video encoder.'}, {'name': 'h264_crf', 'type': 'range', 'default': '5-50', 'meta': {'default_value': 25}, 'help': 'Allowed H.264 CRF range (e.g., "5-50") or a fixed value.'}, {'name': 'jpeg_quality', 'type': 'range', 'default': '1-100', 'meta': {'default_value': 40}, 'help': 'Allowed JPEG quality range (e.g., "1-100") or a fixed value.'}, {'name': 'h264_fullcolor', 'type': 'bool', 'default': False, 'help': 'Enable H.264 full color range for pixelflux encoders.'}, {'name': 'h264_streaming_mode', 'type': 'bool', 'default': False, 'help': 'Enable H.264 streaming mode for pixelflux encoders.'}, {'name': 'use_cpu', 'type': 'bool', 'default': False, 'help': 'Force CPU-based encoding for pixelflux.'}, {'name': 'use_paint_over_quality', 'type': 'bool', 'default': True, 'help': 'Enable high-quality paint-over for static scenes.'}, {'name': 'paint_over_jpeg_quality', 'type': 'range', 'default': '1-100', 'meta': {'default_value': 90}, 'help': 'Allowed JPEG paint-over quality range or a fixed value.'}, {'name': 'h264_paintover_crf', 'type': 'range', 'default': '5-50', 'meta': {'default_value': 18}, 'help': 'Allowed H.264 paint-over CRF range or a fixed value.'}, {'name': 'h264_paintover_burst_frames', 'type': 'range', 'default': '1-30', 'meta': {'default_value': 5}, 'help': 'Allowed H.264 paint-over burst frames range or a fixed value.'}, {'name': 'second_screen', 'type': 'bool', 'default': True, 'help': 'Enable support for a second monitor/display.'}, {'name': 'port', 'type': 'int', 'default': 8081, 'env_var': 'CUSTOM_WS_PORT', 'help': 'Port for the data websocket server.'}, {'name': 'control_port', 'type': 'int', 'default': 8083, 'help': 'Port for the internal control plane API.'}, {'name': 'master_token', 'type': 'str', 'default': '', 'help': 'Master token to enable secure mode and protect the control plane API.'}, {'name': 'dri_node', 'type': 'str', 'default': '', 'env_var': 'DRI_NODE', 'help': 'Path to the DRI render node for VA-API.'}, {'name': 'audio_device_name', 'type': 'str', 'default': 'output.monitor', 'help': 'Audio device name for pcmflux capture.'}, {'name': 'watermark_path', 'type': 'str', 'default': '', 'env_var': 'WATERMARK_PNG', 'help': 'Absolute path to the watermark PNG file.'}, {'name': 'watermark_location', 'type': 'int', 'default': -1, 'env_var': 'WATERMARK_LOCATION', 'help': 'Watermark location enum (0-6).'}], 'audio_enabled': (True, False), 'microphone_enabled': (True, False), 'gamepad_enabled': (True, False), 'clipboard_enabled': (True, False), 'command_enabled': (True, False), 'file_transfers': ['upload', 'download'], 'framerate': (8, 120), 'audio_bitrate': '320000', 'is_manual_resolution_mode': (False, False), 'manual_width': 0, 'manual_height': 0, 'scaling_dpi': '96', 'enable_binary_clipboard': (False, False), 'use_browser_cursors': (False, False), 'use_css_scaling': (False, False), 'ui_title': 'Selkies', 'ui_show_logo': (True, False), 'ui_show_core_buttons': (True, False), 'ui_show_sidebar': (True, False), 'ui_sidebar_show_video_settings': (True, False), 'ui_sidebar_show_screen_settings': (True, False), 'ui_sidebar_show_audio_settings': (True, False), 'ui_sidebar_show_stats': (True, False), 'ui_sidebar_show_clipboard': (True, False), 'ui_sidebar_show_files': (True, False), 'ui_sidebar_show_apps': (True, False), 'ui_sidebar_show_sharing': (True, False), 'ui_sidebar_show_gamepads': (True, False), 'ui_sidebar_show_fullscreen': (True, False), 'ui_sidebar_show_gaming_mode': (True, False), 'ui_sidebar_show_trackpad': (True, False), 'ui_sidebar_show_keyboard_button': (True, False), 'ui_sidebar_show_soft_buttons': (True, False), 'enable_sharing': (True, False), 'enable_collab': (True, False), 'enable_shared': (True, False), 'enable_player2': (True, False), 'enable_player3': (True, False), 'enable_player4': (True, False), 'debug': (False, False), 'mode': 'websockets', 'enable_dual_mode': (False, False), 'encoder': 'x264enc', 'h264_crf': (5, 50), 'jpeg_quality': (1, 100), 'h264_fullcolor': (False, False), 'h264_streaming_mode': (False, False), 'use_cpu': (False, False), 'use_paint_over_quality': (True, False), 'paint_over_jpeg_quality': (1, 100), 'h264_paintover_crf': (5, 50), 'h264_paintover_burst_frames': (1, 30), 'second_screen': (True, False), 'port': 8082, 'control_port': 8083, 'master_token': '', 'dri_node': '/dev/dri/renderD128', 'audio_device_name': 'output.monitor', 'watermark_path': '', 'watermark_location': -1}
freecad  | INFO:main:Initial Encoder: x264enc, Framerate: 60
freecad  | INFO:main:SelkiesStreamingApp initialized: encoder=x264enc, display=1024x768
freecad  | INFO:main:All main components initialized. Running server...
freecad  | INFO:webrtc_input:System DPI detected as ~96. Cursor size cap set to 32x32px.
freecad  | INFO:webrtc_input:Resetting keyboard modifiers.
freecad  | INFO:webrtc_input:Clipboard monitor running (binary mode: False)
freecad  | INFO:webrtc_input:Found XFIXES version 4.0
freecad  | INFO:webrtc_input:starting cursor monitor
freecad  | INFO:webrtc_input:watching for cursor changes
freecad  | WARNING:data_websocket:Cannot broadcast cursor data: no clients connected or server not ready.
freecad  | INFO:data_websocket:Data WebSocket Server listening on port 8082
freecad  | INFO:webrtc_input:Initializing 4 persistent gamepad instances...
freecad  | INFO:root:Packed js_config payload for 'Microsoft X-Box 360 pad' (js0): len=1360 bytes. Name='Microsoft X-Box 360 pad', Vendor=0x045e, Product=0x028e, Version=0x0100, Reported Buttons=11 (Array capacity: 512), Reported Axes=8 (Array capacity: 64)
freecad  | INFO:selkies_gamepad:Gamepad configured. JS socket: /tmp/selkies_js0.sock, EVDEV socket: /tmp/selkies_event1000.sock. Using fixed config: Microsoft X-Box 360 pad
freecad  | INFO:webrtc_input:Initialized and started persistent gamepad instance for index 0 (Name: 'Microsoft X-Box 360 pad', JS: /tmp/selkies_js0.sock, EVDEV: /tmp/selkies_event1000.sock).
freecad  | INFO:root:Packed js_config payload for 'Microsoft X-Box 360 pad' (js1): len=1360 bytes. Name='Microsoft X-Box 360 pad', Vendor=0x045e, Product=0x028e, Version=0x0100, Reported Buttons=11 (Array capacity: 512), Reported Axes=8 (Array capacity: 64)
freecad  | INFO:selkies_gamepad:Gamepad configured. JS socket: /tmp/selkies_js1.sock, EVDEV socket: /tmp/selkies_event1001.sock. Using fixed config: Microsoft X-Box 360 pad
freecad  | INFO:webrtc_input:Initialized and started persistent gamepad instance for index 1 (Name: 'Microsoft X-Box 360 pad', JS: /tmp/selkies_js1.sock, EVDEV: /tmp/selkies_event1001.sock).
freecad  | INFO:root:Packed js_config payload for 'Microsoft X-Box 360 pad' (js2): len=1360 bytes. Name='Microsoft X-Box 360 pad', Vendor=0x045e, Product=0x028e, Version=0x0100, Reported Buttons=11 (Array capacity: 512), Reported Axes=8 (Array capacity: 64)
freecad  | INFO:selkies_gamepad:Gamepad configured. JS socket: /tmp/selkies_js2.sock, EVDEV socket: /tmp/selkies_event1002.sock. Using fixed config: Microsoft X-Box 360 pad
freecad  | INFO:webrtc_input:Initialized and started persistent gamepad instance for index 2 (Name: 'Microsoft X-Box 360 pad', JS: /tmp/selkies_js2.sock, EVDEV: /tmp/selkies_event1002.sock).
freecad  | INFO:root:Packed js_config payload for 'Microsoft X-Box 360 pad' (js3): len=1360 bytes. Name='Microsoft X-Box 360 pad', Vendor=0x045e, Product=0x028e, Version=0x0100, Reported Buttons=11 (Array capacity: 512), Reported Axes=8 (Array capacity: 64)
freecad  | INFO:selkies_gamepad:Gamepad configured. JS socket: /tmp/selkies_js3.sock, EVDEV socket: /tmp/selkies_event1003.sock. Using fixed config: Microsoft X-Box 360 pad
freecad  | INFO:webrtc_input:Initialized and started persistent gamepad instance for index 3 (Name: 'Microsoft X-Box 360 pad', JS: /tmp/selkies_js3.sock, EVDEV: /tmp/selkies_event1003.sock).
freecad  | INFO:selkies_gamepad:Gamepad /tmp/selkies_js0.sock: Event processor started.
freecad  | INFO:selkies_gamepad:JS interposer server listening on /tmp/selkies_js0.sock
freecad  | INFO:selkies_gamepad:Gamepad /tmp/selkies_js1.sock: Event processor started.
freecad  | INFO:selkies_gamepad:JS interposer server listening on /tmp/selkies_js1.sock
freecad  | INFO:selkies_gamepad:Gamepad /tmp/selkies_js2.sock: Event processor started.
freecad  | INFO:selkies_gamepad:JS interposer server listening on /tmp/selkies_js2.sock
freecad  | INFO:selkies_gamepad:Gamepad /tmp/selkies_js3.sock: Event processor started.
freecad  | INFO:selkies_gamepad:JS interposer server listening on /tmp/selkies_js3.sock
freecad  | INFO:selkies_gamepad:EVDEV interposer server listening on /tmp/selkies_event1000.sock
freecad  | INFO:selkies_gamepad:EVDEV interposer server listening on /tmp/selkies_event1001.sock
freecad  | INFO:selkies_gamepad:EVDEV interposer server listening on /tmp/selkies_event1002.sock
freecad  | INFO:selkies_gamepad:EVDEV interposer server listening on /tmp/selkies_event1003.sock
freecad  | xsettingsd: Loaded 5 settings from /config/.xsettingsd
freecad  | xsettingsd: Created window 0x1400001 on screen 0 with timestamp 756515010
freecad  | xsettingsd: Selection _XSETTINGS_S0 is owned by 0x0
freecad  | xsettingsd: Took ownership of selection _XSETTINGS_S0q

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    Status
    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions