hyprwm / Hyprland

Hyprland is an independent, highly customizable, dynamic tiling Wayland compositor that doesn't sacrifice on its looks.
https://hyprland.org
BSD 3-Clause "New" or "Revised" License
21.09k stars 882 forks source link

Hyprland's exec launches applications without zshrc loaded, causing missing environment variables #8161

Closed zjeffer closed 2 days ago

zjeffer commented 2 days ago

Already reported ? *

I found this issue: https://github.com/hyprwm/Hyprland/issues/7963, but there was no solution and I do source zshrc through the SDDM wrapper script. Maybe I'm doing it wrong?

Regression?

No

System Info and Version

System/Version info ```sh Hyprland 0.44.0 built from branch main at commit ce62521883e217aab4da305d71e40e4a50567dfb (drm-lease: fix crashes and implementation (8116)). Date: Mon Oct 14 12:37:42 2024 Tag: v0.44.0-41-gce625218, commits: 5340 built against aquamarine 0.4.3 flags set: debug System Information: System name: Linux Node name: zjeffer Release: 6.11.3-arch1-1 Version: #1 SMP PREEMPT_DYNAMIC Thu, 10 Oct 2024 20:11:06 +0000 GPU information: 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA104M [GeForce RTX 3070 Mobile / Max-Q] [10de:24dd] (rev a1) (prog-if 00 [VGA controller]) NVRM version: NVIDIA UNIX x86_64 Kernel Module 560.35.03 Fri Aug 16 21:39:15 UTC 2024 os-release: NAME="Arch Linux" PRETTY_NAME="Arch Linux" ID=arch BUILD_ID=rolling ANSI_COLOR="38;2;23;147;209" HOME_URL="https://archlinux.org/" DOCUMENTATION_URL="https://wiki.archlinux.org/" SUPPORT_URL="https://bbs.archlinux.org/" BUG_REPORT_URL="https://gitlab.archlinux.org/groups/archlinux/-/issues" PRIVACY_POLICY_URL="https://terms.archlinux.org/docs/privacy-policy/" LOGO=archlinux-logo plugins: split-monitor-workspaces by Duckonaut ver 1.2.0 ======Config-Start====== Config File: /home/zjeffer/.config/hypr/hyprland.conf: Read Succeeded # ################################################################### # ██╗ ██╗██╗ ██╗██████╗ ██████╗ ██╗ █████╗ ███╗ ██╗██████╗ # ██║ ██║╚██╗ ██╔╝██╔══██╗██╔══██╗██║ ██╔══██╗████╗ ██║██╔══██╗ # ███████║ ╚████╔╝ ██████╔╝██████╔╝██║ ███████║██╔██╗ ██║██║ ██║ # ██╔══██║ ╚██╔╝ ██╔═══╝ ██╔══██╗██║ ██╔══██║██║╚██╗██║██║ ██║ # ██║ ██║ ██║ ██║ ██║ ██║███████╗██║ ██║██║ ╚████║██████╔╝ # ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═════╝ # ################################################################### $HYPR_FOLDER = ~/.config/hypr $APP_FOLDER = $HYPR_FOLDER/apps $CONFIG_FOLDER = $HYPR_FOLDER/configs source = $CONFIG_FOLDER/env.conf source = $CONFIG_FOLDER/general.conf source = $CONFIG_FOLDER/animations.conf source = $CONFIG_FOLDER/decoration.conf source = $CONFIG_FOLDER/monitors.conf source = $CONFIG_FOLDER/window_rules.conf source = $CONFIG_FOLDER/keybinds.conf source = $CONFIG_FOLDER/input.conf source = $CONFIG_FOLDER/workspace_rules.conf source = $CONFIG_FOLDER/plugins.conf # Execute your favorite apps at launch exec-once = xhost + local: exec-once = /usr/bin/gnome-keyring-daemon --start --components=gpg,pkcs11,secrets,ssh exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 exec-once = hyprpaper --config $APP_FOLDER/hyprpaper.conf exec-once = nm-applet exec-once = dunst exec-once = ~/.config/activePlayer/mediaplayers.sh 2>~/.config/activePlayer/.mediaplayer.err exec-once = hyprpm reload -n exec-once = ydotoold exec-once = bash $APP_FOLDER/waybar/launch.sh exec-once = swayosd-server exec-once = /home/zjeffer/.local/share/cargo/bin/hyprswitch init --show-title & # this should always be at the bottom exec-once = dbus-update-activation-environment --systemd --all Config File: /home/zjeffer/.config/hypr/configs/env.conf: Read Succeeded # Some default env vars. env = XCURSOR_SIZE,32 env = XCURSOR_THEME,Nordzy-cursors-white env = HYPRCURSOR_THEME,Nordzy-cursors-white env = HYPRCURSOR_SIZE,32 env = LIBVA_DRIVER_NAME,nvidia env = XDG_SESSION_TYPE,wayland env = GBM_BACKEND,nvidia-drm env = __GLX_VENDOR_LIBRARY_NAME,nvidia env = SDL_VIDEODRIVER,wayland env = _JAVA_AWT_WM_NONREPARENTING,1 env = __GL_GSYNC_ALLOWED,0 env = __GL_VRR_ALLOWED,0 env = __GLX_VENDOR_LIBRARY_NAME,nvidia env = WLR_DRM_NO_ATOMIC,1 env = GBM_BACKEND,nvidia-drm env = XDG_CURRENT_DESKTOP,Hyprland env = QT_AUTO_SCREEN_SCALE_FACTOR,1 env = QT_QPA_PLATFORM,wayland env = QT_QPA_PLATFORMTHEME,qt6ct env = QT_WAYLAND_DISABLE_WINDOWDECORATION,1 env = DESKTOP_SESSION,gnome env = MOZ_ENABLE_WAYLAND,1 # gtk env = GDK_BACKEND,wayland # xdg stuff env = XDG_CONFIG_HOME,$HOME/.config env = XDG_CACHE_HOME,$HOME/.cache env = XDG_DATA_HOME,$HOME/.local/share env = XDG_DATA_DIRS,/usr/local/share:/usr/share env = XDG_CONFIG_DIRS,/etc/xdg # environment variables to use in configs env = EWW_CONFIG_DIR,$HOME/.config/eww env = APP_FOLDER,$HOME/.config/hypr/apps env = PLUGIN_FOLDER,$HOME/.local/share/hyprload/plugins/bin # docking station workaround: use correct GPU # env = AQ_DRM_DEVICES,/dev/dri/card0:/dev/dri/card1 Config File: /home/zjeffer/.config/hypr/configs/general.conf: Read Succeeded general { # See https://wiki.hyprland.org/Configuring/Variables/ for more gaps_in = 5 gaps_out = 10 border_size = 4 col.active_border = rgba(5e81acff) col.inactive_border = rgba(00000000) layout = dwindle } dwindle { # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more pseudotile = true # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section preserve_split = true # you probably want this } misc { vrr = 2 render_ahead_of_time = false focus_on_activate = true force_default_wallpaper = 0 initial_workspace_tracking = 0 } debug { overlay = false disable_logs = false disable_time = false error_limit = 1 error_position = 2 # bottom } opengl { nvidia_anti_flicker = true } Config File: /home/zjeffer/.config/hypr/configs/animations.conf: Read Succeeded animations { enabled = true # Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more animation = windows, 1, 1, default animation = windowsOut, 1, 2, default animation = border, 1, 5, default animation = borderangle, 1, 8, default animation = fade, 1, 3, default animation = workspaces, 1, 4, default animation = specialWorkspace, 1, 4, default, slidevert } Config File: /home/zjeffer/.config/hypr/configs/decoration.conf: Read Succeeded decoration { # See https://wiki.hyprland.org/Configuring/Variables/ for more rounding = 5 blur { enabled = true size = 15 passes = 2 ignore_opacity = true new_optimizations = true } drop_shadow = true shadow_range = 4 shadow_render_power = 3 col.shadow = rgba(2e3440ee) col.shadow_inactive = rgba(00000000) } Config File: /home/zjeffer/.config/hypr/configs/monitors.conf: Read Succeeded # See https://wiki.hyprland.org/Configuring/Monitors/ monitor=desc:California Institute of Technology 0x1600, 2560x1600@165.018997, 1920x0, 1 monitor=desc:Acer Technologies K222HQL T0EEE0018512, 1920x1080@60, 4480x0, 1 monitor=desc:Philips Consumer Electronics Company PHL 240V5A UK01715035811, 1920x1080@60, 0x0, 1 monitor=desc:DENON Ltd. DENON-AVR 0x01010101, preferred, auto, 1, mirror, desc:California Institute of Technology 0x1600 # Denon # monitor=desc:DENON Ltd. DENON-AVR 0x01010101, preferred, auto, 1 # Denon monitor=,preferred,auto,1 Config File: /home/zjeffer/.config/hypr/configs/window_rules.conf: Read Succeeded windowrulev2 = float, title:^(Open Folder)$ windowrulev2 = float, title:^(Open File)$ windowrulev2 = float, title:^(Save As)$ windowrulev2 = float, title:^(Friends List)$ windowrulev2 = float, title:^(File Operation Progress)$ windowrulev2 = float, title:^(Firefox — Sharing Indicator)$ windowrulev2 = suppressevent fullscreen,float, title:^(Extension: (Bitwarden - Free Password Manager) - — Mozilla Firefox)$ windowrulev2 = suppressevent fullscreen,float, title:^(Extension: (Bitwarden - Free Password Manager) - Bitwarden — Mozilla Firefox)$ windowrulev2 = suppressevent fullscreen,float, title:^(Extension: (Bitwarden Password Manager) - Bitwarden — Mozilla Firefox)$ # windowrulev2 = suppressevent fullscreen,tile,class:^(libreoffice.*)$ windowrulev2 = float, class:^(flameshot)$ windowrulev2 = noanim, float, class:^(Rofi)$ windowrulev2 = float, class:^(org.gnome.Calculator)$ # opacity windowrulev2 = opacity 0.85, class:[gG]nome-terminal* windowrulev2 = opacity 0.85, class:kitty windowrulev2 = opacity 0.90, initialTitle:^(Spotify( Premium)?)$ windowrulev2 = opacity 0.90, class:Code windowrulev2 = opacity 0.90, class:Code - Insiders windowrulev2 = opacity 0.90, class:code-url-handler windowrulev2 = opacity 0.90, class:code-insiders-url-handler windowrulev2 = opacity 0.80, class:[Tt]hunar windowrulev2 = opacity 0.70, class:Dunst windowrulev2 = opacity 0.95, class:discord # flameshot workaround windowrulev2=move 0 0,title:^(flameshot) windowrulev2=suppressevent fullscreen,title:^(flameshot) # steam friends list workaround windowrulev2 = stayfocused, title:^()$,class:^(steam)$ windowrulev2 = minsize 320 600, initialTitle:^(Friends List)$,initialClass:^(steam)$ # jellyfin media player # windowrulev2 = tile, initialClass:^(Jellyfin Media Player)$ windowrulev2 = tile, initialTitle:^(Jellyfin Media Player)$ Config File: /home/zjeffer/.config/hypr/configs/keybinds.conf: Read Succeeded # See https://wiki.hyprland.org/Configuring/Keywords/ for more $mainMod = SUPER # window control bind = $mainMod, W, killactive, bind = $mainMod SHIFT, W, exec, kill -9 $(hyprctl activewindow -j | jq -r '.pid') bind = $mainMod CTRL SHIFT, Escape, exit, bind = $mainMod, S, togglefloating, bind = $mainMod, F, fullscreen bind = $mainMod, P, pseudo, # dwindle bind = $mainMod, J, togglesplit, # dwindle # reload hyprland and send a inotify reload to waybar at .config/waybar/config.json bind = $mainMod, Escape, exec, hyprctl reload && hyprpm reload && sleep 0.5 && touch -m $APP_FOLDER/waybar/config.jsonc # applications bindr =$mainMod, SUPER_L, exec, pkill rofi || ~/.config/rofi/bin/launcher_colorful bind = $mainMod, return, exec, kitty bind = $mainMod SHIFT, return, togglespecialworkspace bind = $mainMod, Z, exec, firefox bind = $mainMod SHIFT, Z, exec, chromium bind = $mainMod, X, exec, thunar bind = $mainMod, A, exec, /usr/bin/spotify --ozone-platform-hint=wayland bind = $mainMod, Q, exec, zsh -c '$HYPR_FOLDER/launch_app.sh "code"' bind = $mainMod, U, exec, zsh -c '$HYPR_FOLDER/launch_app.sh notify-send "test: $RUSTUP_HOME"' bind = $mainMod, J, exec, zsh -c 'env > /tmp/hyprland_env.txt' bind = $mainMod, D, exec, discord bind = ,Print,exec, grimblast copy area bind = $mainMod, Print, exec, grimblast copy output bind = $mainMod SHIFT, C, exec, hyprpicker -a -f hex bind = CTRL SHIFT, Escape, exec, gnome-system-monitor # hyprswitch bind = ALT, TAB, exec, /home/zjeffer/.local/share/cargo/bin/hyprswitch simple bind = $mainMod, TAB, exec, /home/zjeffer/.local/share/cargo/bin/hyprswitch gui --mod-key super_l --key TAB --close mod-key-release && /home/zjeffer/.local/share/cargo/bin/hyprswitch dispatch -r # Move focus with mainMod + arrow keys bind = $mainMod, left, movefocus, l bind = $mainMod, right, movefocus, r bind = $mainMod, up, movefocus, u bind = $mainMod, down, movefocus, d # move window with arrow keys bind = $mainMod SHIFT, left, movewindow, l bind = $mainMod SHIFT, right, movewindow, r bind = $mainMod SHIFT, up, movewindow, u bind = $mainMod SHIFT, down, movewindow, d # Tabbed windows bind = $mainMod, g, togglegroup # Switch workspaces with mainMod + [0-5] bind = $mainMod, 1, split-workspace, 1 bind = $mainMod, 2, split-workspace, 2 bind = $mainMod, 3, split-workspace, 3 bind = $mainMod, 4, split-workspace, 4 bind = $mainMod, 5, split-workspace, 5 # Move active window to a workspace with mainMod + SHIFT + [0-5] bind = $mainMod SHIFT, 1, split-movetoworkspacesilent, 1 bind = $mainMod SHIFT, 2, split-movetoworkspacesilent, 2 bind = $mainMod SHIFT, 3, split-movetoworkspacesilent, 3 bind = $mainMod SHIFT, 4, split-movetoworkspacesilent, 4 bind = $mainMod SHIFT, 5, split-movetoworkspacesilent, 5 # Scroll through existing workspaces with mainMod + scroll bind = $mainMod, mouse_down, workspace, r+1 bind = $mainMod, mouse_up, workspace, r-1 # focus with left/right bracket bind = $mainMod, bracketleft, workspace, r-1 bind = $mainMod, bracketright, workspace, r+1 # move with shift + left/right bracket bind = $mainMod SHIFT, bracketleft, movetoworkspace, r-1 bind = $mainMod SHIFT, bracketright, movetoworkspace, r+1 # Move/resize windows with mainMod + LMB/RMB and dragging bindm = $mainMod, mouse:272, movewindow bindm = $mainMod, mouse:273, resizewindow # media keys bindle = , XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ bindle = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- bind =, XF86AudioMute, exec, wpctl set-mute @DEFAULT_SINK@ toggle bind =, XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_SOURCE@ toggle bind =, XF86AudioPlay, exec, ~/.config/activePlayer/control.sh play-pause bind =, XF86AudioPrev, exec, ~/.config/activePlayer/control.sh previous bind =, XF86AudioNext, exec, ~/.config/activePlayer/control.sh next bind =, XF86AudioStop, exec, ~/.config/activePlayer/control.sh stop bind = SHIFT, XF86AudioPrev, exec, ~/.config/activePlayer/control.sh skipBackward bind = SHIFT, XF86AudioNext, exec, ~/.config/activePlayer/control.sh skipForward # dunst notifications bind = $mainMod, space, exec, dunstctl close bind = $mainMod SHIFT, space, exec, dunstctl history-pop # brightness binde = , XF86MonBrightnessUp, exec, brightnessctl -d nvidia* set +10% binde = , XF86MonBrightnessDown, exec, brightnessctl -d nvidia* set 10%- # screen lock bindl= , switch:on:Lid Switch, exec, $APP_FOLDER/swaylock/lock.sh && sleep 2 && systemctl suspend-then-hibernate bind = $mainMod, L, exec, hyprlock # forward and back with mouse buttons bind = $mainMod, 123, exec, ydotool key 159:1 159:0 bind = $mainMod, 122, exec, ydotool key 158:1 158:0 # forward global shortcuts bind = $mainMod SHIFT, N, pass, ^(io\.github\.nuttyartist\.notes)$ # passthrough mainMod to virtual machine bind = $mainMod, O, submap, passthru submap = passthru bind = $mainMod, I, submap, reset submap = reset # # ### swayosd ### bind = , XF86AudioRaiseVolume, exec, swayosd-client --output-volume bind = , XF86AudioLowerVolume, exec, swayosd-client --output-volume # # Sink volume toggle mute # bind = , XF86AudioMute, exec, swayosd-client --output-volume mute-toggle # # Source volume toggle mute # bind = , XF86AudioMicMute, exec, swayosd-client --input-volume mute-toggle # # Brightness raise # bind = , XF86MonBrightnessUp, exec, swayosd-client --brightness raise # # Brightness lower # bind = , XF86MonBrightnessDown, exec, swayosd-client --brightness lower Config File: /home/zjeffer/.config/hypr/configs/input.conf: Read Succeeded # For all categories, see https://wiki.hyprland.org/Configuring/Variables/ input { kb_layout = us kb_variant = kb_model = kb_options = kb_rules = follow_mouse = 1 touchpad { clickfinger_behavior = true scroll_factor = 0.25 middle_button_emulation = true tap-and-drag = true natural_scroll = true } sensitivity = -0.5 # -1.0 - 1.0, 0 means no modification. numlock_by_default = 1 repeat_rate = 50 repeat_delay = 200 accel_profile = flat } cursor { no_hardware_cursors = true } # Per-device config # See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more device { name = elan06fa:00-04f3:31ad-touchpad sensitivity = 0.4 accel_profile = flat natural_scroll = true } gestures { # See https://wiki.hyprland.org/Configuring/Variables/ for more workspace_swipe = true } misc { } Config File: /home/zjeffer/.config/hypr/configs/workspace_rules.conf: Read Succeeded workspace = special:special, on-created-empty:kitty, gapsout:48 Config File: /home/zjeffer/.config/hypr/configs/plugins.conf: Read Succeeded plugin { split-monitor-workspaces { count = 5 keep_focused = 1 enable_notifications = 0 enable_persistent_workspaces = 1 } # hyprexpo { # columns = 5 # gap_size = 5 # bg_col = rgb(111111) # workspace_method = center current # [center/first] [workspace] e.g. first 1 or center m+1 # enable_gesture = true # laptop touchpad # gesture_fingers = 3 # 3 or 4 # gesture_distance = 300 # how far is the "max" # gesture_positive = true # positive = swipe down. Negative = swipe up. # } # Hyprspace overview { panelColor = rgb(4c566a) gapsIn = 5 gapsOut = 5 hideRealLayers = 0 # don'd hide waybar onBottom = true } } ======Config-End======== ```

Description

I define my environment variables in ~/.zshrc. When I launch applications through Hyprland with exec=, the application will not get the environment variables. I noticed this when running vscode with the rust-analyzer extension: this requires RUSTUP_HOME to be defined, but it wasn't. When I run vscode through a terminal, it works fine.

I launch Hyprland through SDDM. I'm using a wrapper script in order to try to fix the issue, but it didn't help:

/usr/share/wayland-sessions/hyprland-custom.desktop:

[Desktop Entry]
Name=Hyprland-wrapper
Comment=An intelligent dynamic tiling Wayland compositor
Exec=/home/zjeffer/.config/hypr/run.sh
Type=Application

/usr/share/wayland-sessions/hyprland-custom.desktop:

cat .config/hypr/run.sh                                
#!/bin/zsh
source /home/zjeffer/.zshrc
Hyprland

Strangely,

bind = $mainMod, U, exec, zsh -c 'RUSTUP_HOME="asdf" notify-send "test: $RUSTUP_HOME"

will send a notification containing test:, and

bind = $mainMod, U, exec, zsh -c 'export RUSTUP_HOME="asdf" && notify-send "test: $RUSTUP_HOME"

will send a notification containing test: asdf.

But for some reason, zsh -c 'source ~/.zshrc && notify-send "test: $RUSTUP_HOME" doesn't show 'asdf'.

I also tried to launch my applications with a launch script that first sources zshrc:

cat .config/hypr/launch_app.sh

#!/bin/zsh
source ~/.zshrc
"$@" &

so I could then launch it through Hyprland using exec, zsh -c '$HYPR_FOLDER/launch_app.sh "code"', but that also doesn't help.

How can I ensure Hyprland launches applications through my zsh shell, including the environment variables declared in ~/.zshrc? I could also define all my variables using env =, but that would mean duplicating every single environment variable I have. Maintaining that is a pain.

How to reproduce

For example:

bind = SUPER, J, exec, env > /tmp/hyprland_env.txt

The /tmp/hyprland_env.txt file will not contain the environment variables defined in ~/.zshrc.

Crash reports, logs, images, videos

No response

vaxerski commented 2 days ago

this is not a hyprland issue man, we don't magically eat your env

idk whats wrong

zjeffer commented 1 day ago

I thought so too but I assumed someone here could help, didn't know where else to ask. I initally thought the problem was with the execAndGet function used to launch the commands.


I finally figured it out, this line was in my zshrc:

############ If not running interactively, don't do anything
[[ $- != *i* ]] && return

and this was above my exports. :facepalm: It's a line that's supposed to be at the bottom of the file, right above prompt-specific configurations (like oh-my-zsh stuff). Obviously because of this any non-interactive shell (like the one that launches Hyprland) will not get the environment variables I defined.

After moving that line down to below the exports, I can launch Hyprland without the wrapper .desktop file, and my applications can be run without any special script or zsh -c stuff:

bind = $mainMod, Q, exec, code