diff --git a/core/internal/config/deployer_test.go b/core/internal/config/deployer_test.go index cb99680d..8bba240d 100644 --- a/core/internal/config/deployer_test.go +++ b/core/internal/config/deployer_test.go @@ -406,7 +406,7 @@ func TestHyprlandConfigDeployment(t *testing.T) { content, err := os.ReadFile(result.Path) require.NoError(t, err) assert.Contains(t, string(content), "# MONITOR CONFIG") - assert.Contains(t, string(content), "bind = $mod, T, exec, $TERMINAL") + assert.Contains(t, string(content), "bind = $mod, T, exec, ghostty") assert.Contains(t, string(content), "exec-once = ") }) @@ -442,7 +442,7 @@ general { require.NoError(t, err) assert.Contains(t, string(newContent), "monitor = DP-1, 1920x1080@144") assert.Contains(t, string(newContent), "monitor = HDMI-A-1, 3840x2160@60") - assert.Contains(t, string(newContent), "bind = $mod, T, exec, $TERMINAL") + assert.Contains(t, string(newContent), "bind = $mod, T, exec, kitty") assert.NotContains(t, string(newContent), "monitor = eDP-2") }) } @@ -460,7 +460,10 @@ func TestHyprlandConfigStructure(t *testing.T) { assert.Contains(t, HyprlandConfig, "# STARTUP APPS") assert.Contains(t, HyprlandConfig, "# INPUT CONFIG") assert.Contains(t, HyprlandConfig, "# KEYBINDINGS") - assert.Contains(t, HyprlandConfig, "bind = $mod, T, exec, $TERMINAL") + assert.Contains(t, HyprlandConfig, "# ENVIRONMENT VARS") + assert.Contains(t, HyprlandConfig, "{{TERMINAL_COMMAND}}") + assert.Contains(t, HyprlandConfig, "exec-once = dms run") + assert.Contains(t, HyprlandConfig, "bind = $mod, T, exec,") assert.Contains(t, HyprlandConfig, "bind = $mod, space, exec, dms ipc call spotlight toggle") assert.Contains(t, HyprlandConfig, "windowrulev2 = noborder, class:^(com\\.mitchellh\\.ghostty)$") } diff --git a/core/internal/config/embedded/hyprland.conf b/core/internal/config/embedded/hyprland.conf index e4eabf24..ae11410b 100644 --- a/core/internal/config/embedded/hyprland.conf +++ b/core/internal/config/embedded/hyprland.conf @@ -7,10 +7,20 @@ # monitor = eDP-2, 2560x1600@239.998993, 2560x0, 1, vrr, 1 monitor = , preferred,auto,auto +# ================== +# ENVIRONMENT VARS +# ================== +env = QT_QPA_PLATFORM,wayland +env = ELECTRON_OZONE_PLATFORM_HINT,auto +env = QT_QPA_PLATFORMTHEME,gtk3 +env = QT_QPA_PLATFORMTHEME_QT6,gtk3 +env = TERMINAL,{{TERMINAL_COMMAND}} + # ================== # STARTUP APPS # ================== exec-once = bash -c "wl-paste --watch cliphist store &" +exec-once = dms run # ================== # INPUT CONFIG @@ -126,7 +136,7 @@ layerrule = noanim, ^(quickshell)$ $mod = SUPER # === Application Launchers === -bind = $mod, T, exec, $TERMINAL +bind = $mod, T, exec, {{TERMINAL_COMMAND}} bind = $mod, space, exec, dms ipc call spotlight toggle bind = $mod, V, exec, dms ipc call clipboard toggle bind = $mod, M, exec, dms ipc call processlist focusOrToggle diff --git a/core/internal/distros/arch.go b/core/internal/distros/arch.go index 10249128..33ee90c0 100644 --- a/core/internal/distros/arch.go +++ b/core/internal/distros/arch.go @@ -359,11 +359,11 @@ func (a *ArchDistribution) InstallPackages(ctx context.Context, dependencies []d } terminal := a.DetectTerminalFromDeps(dependencies) - if err := a.WriteEnvironmentConfig(terminal); err != nil { + if err := a.WriteEnvironmentConfig(terminal, wm); err != nil { a.log(fmt.Sprintf("Warning: failed to write environment config: %v", err)) } - if err := a.EnableDMSService(ctx); err != nil { + if err := a.EnableDMSService(ctx, wm); err != nil { a.log(fmt.Sprintf("Warning: failed to enable dms service: %v", err)) } diff --git a/core/internal/distros/base.go b/core/internal/distros/base.go index ee3aa866..a4ed53b6 100644 --- a/core/internal/distros/base.go +++ b/core/internal/distros/base.go @@ -563,7 +563,11 @@ func (b *BaseDistribution) DetectTerminalFromDeps(dependencies []deps.Dependency return deps.TerminalGhostty } -func (b *BaseDistribution) WriteEnvironmentConfig(terminal deps.Terminal) error { +func (b *BaseDistribution) WriteEnvironmentConfig(terminal deps.Terminal, wm deps.WindowManager) error { + if wm == deps.WindowManagerHyprland { + return nil + } + homeDir, err := os.UserHomeDir() if err != nil { return fmt.Errorf("failed to get home directory: %w", err) @@ -602,12 +606,25 @@ TERMINAL=%s return nil } -func (b *BaseDistribution) EnableDMSService(ctx context.Context) error { +func (b *BaseDistribution) EnableDMSService(ctx context.Context, wm deps.WindowManager) error { + if wm == deps.WindowManagerHyprland { + return nil + } + cmd := exec.CommandContext(ctx, "systemctl", "--user", "enable", "--now", "dms") if err := cmd.Run(); err != nil { return fmt.Errorf("failed to enable dms service: %w", err) } b.log("Enabled dms systemd user service") + + if wm == deps.WindowManagerNiri { + addWantsCmd := exec.CommandContext(ctx, "systemctl", "--user", "add-wants", "niri.service", "dms") + if err := addWantsCmd.Run(); err != nil { + return fmt.Errorf("failed to add dms as niri.service want: %w", err) + } + b.log("Added dms as niri.service want") + } + return nil } diff --git a/core/internal/distros/debian.go b/core/internal/distros/debian.go index 31f00802..a6a6369f 100644 --- a/core/internal/distros/debian.go +++ b/core/internal/distros/debian.go @@ -334,11 +334,11 @@ func (d *DebianDistribution) InstallPackages(ctx context.Context, dependencies [ } terminal := d.DetectTerminalFromDeps(dependencies) - if err := d.WriteEnvironmentConfig(terminal); err != nil { + if err := d.WriteEnvironmentConfig(terminal, wm); err != nil { d.log(fmt.Sprintf("Warning: failed to write environment config: %v", err)) } - if err := d.EnableDMSService(ctx); err != nil { + if err := d.EnableDMSService(ctx, wm); err != nil { d.log(fmt.Sprintf("Warning: failed to enable dms service: %v", err)) } diff --git a/core/internal/distros/fedora.go b/core/internal/distros/fedora.go index 48dfe788..92d8aaa9 100644 --- a/core/internal/distros/fedora.go +++ b/core/internal/distros/fedora.go @@ -358,11 +358,11 @@ func (f *FedoraDistribution) InstallPackages(ctx context.Context, dependencies [ } terminal := f.DetectTerminalFromDeps(dependencies) - if err := f.WriteEnvironmentConfig(terminal); err != nil { + if err := f.WriteEnvironmentConfig(terminal, wm); err != nil { f.log(fmt.Sprintf("Warning: failed to write environment config: %v", err)) } - if err := f.EnableDMSService(ctx); err != nil { + if err := f.EnableDMSService(ctx, wm); err != nil { f.log(fmt.Sprintf("Warning: failed to enable dms service: %v", err)) } diff --git a/core/internal/distros/gentoo.go b/core/internal/distros/gentoo.go index 1ddbf589..15f9548a 100644 --- a/core/internal/distros/gentoo.go +++ b/core/internal/distros/gentoo.go @@ -436,11 +436,11 @@ func (g *GentooDistribution) InstallPackages(ctx context.Context, dependencies [ } terminal := g.DetectTerminalFromDeps(dependencies) - if err := g.WriteEnvironmentConfig(terminal); err != nil { + if err := g.WriteEnvironmentConfig(terminal, wm); err != nil { g.log(fmt.Sprintf("Warning: failed to write environment config: %v", err)) } - if err := g.EnableDMSService(ctx); err != nil { + if err := g.EnableDMSService(ctx, wm); err != nil { g.log(fmt.Sprintf("Warning: failed to enable dms service: %v", err)) } diff --git a/core/internal/distros/opensuse.go b/core/internal/distros/opensuse.go index 4fc40c15..2ba7f51e 100644 --- a/core/internal/distros/opensuse.go +++ b/core/internal/distros/opensuse.go @@ -373,11 +373,11 @@ func (o *OpenSUSEDistribution) InstallPackages(ctx context.Context, dependencies } terminal := o.DetectTerminalFromDeps(dependencies) - if err := o.WriteEnvironmentConfig(terminal); err != nil { + if err := o.WriteEnvironmentConfig(terminal, wm); err != nil { o.log(fmt.Sprintf("Warning: failed to write environment config: %v", err)) } - if err := o.EnableDMSService(ctx); err != nil { + if err := o.EnableDMSService(ctx, wm); err != nil { o.log(fmt.Sprintf("Warning: failed to enable dms service: %v", err)) } diff --git a/core/internal/distros/ubuntu.go b/core/internal/distros/ubuntu.go index f69e0552..d23027c4 100644 --- a/core/internal/distros/ubuntu.go +++ b/core/internal/distros/ubuntu.go @@ -353,11 +353,11 @@ func (u *UbuntuDistribution) InstallPackages(ctx context.Context, dependencies [ } terminal := u.DetectTerminalFromDeps(dependencies) - if err := u.WriteEnvironmentConfig(terminal); err != nil { + if err := u.WriteEnvironmentConfig(terminal, wm); err != nil { u.log(fmt.Sprintf("Warning: failed to write environment config: %v", err)) } - if err := u.EnableDMSService(ctx); err != nil { + if err := u.EnableDMSService(ctx, wm); err != nil { u.log(fmt.Sprintf("Warning: failed to enable dms service: %v", err)) } diff --git a/core/internal/tui/views_install.go b/core/internal/tui/views_install.go index c61c3373..9088d81b 100644 --- a/core/internal/tui/views_install.go +++ b/core/internal/tui/views_install.go @@ -209,8 +209,12 @@ func (m Model) viewInstallComplete() string { labelStyle := lipgloss.NewStyle().Foreground(lipgloss.Color(theme.Subtle)) b.WriteString(labelStyle.Render("Troubleshooting:") + "\n") - b.WriteString(labelStyle.Render(" Disable autostart: ") + cmdStyle.Render("systemctl --user disable dms") + "\n") - b.WriteString(labelStyle.Render(" View logs: ") + cmdStyle.Render("journalctl --user -u dms") + "\n") + if m.selectedWM == 1 { + b.WriteString(labelStyle.Render(" Disable autostart: ") + cmdStyle.Render("remove 'exec-once = dms run' from hyprland.conf") + "\n") + } else { + b.WriteString(labelStyle.Render(" Disable autostart: ") + cmdStyle.Render("systemctl --user disable dms") + "\n") + b.WriteString(labelStyle.Render(" View logs: ") + cmdStyle.Render("journalctl --user -u dms") + "\n") + } if m.osInfo != nil { if cmd := uninstallCommand(m.osInfo.Distribution.ID, m.dependencies); cmd != "" {