diff --git a/app/configuration/configure-gnome.sh b/app/configuration/configure-gnome.sh index cb94eb0..df83dc8 100644 --- a/app/configuration/configure-gnome.sh +++ b/app/configuration/configure-gnome.sh @@ -1,3 +1,8 @@ +if [[ ! $(get_window_manager) == "gnome" ]] ; then + status "GNOME is not the current window manager. Skipping..." + return +fi + setup_gnome=$(gum confirm "Do you want to configure GNOME and extensions?" --affirmative "Yes" --negative "No" --default=false && echo "true" || echo "false") if [[ $setup_gnome == "true" ]]; then diff --git a/app/configuration/select-window-manager b/app/configuration/select-window-manager new file mode 100644 index 0000000..d6ab965 --- /dev/null +++ b/app/configuration/select-window-manager @@ -0,0 +1,45 @@ +#!/bin/bash +set -e + +current_window_manager=$(get_window_manager) + +status "Current window manager: $current_window_manager" + +SELECTED_WINDOW_MANAGER=$(gum choose "gnome" "hyprland" --header "Select your window manager" --selected "$current_window_manager" --limit 1 --height 20) + +if [ -z "$SELECTED_WINDOW_MANAGER" ]; then + status "No window manager selected. Skipping..." + return +fi + +if [ "$SELECTED_WINDOW_MANAGER" == "$current_window_manager" ]; then + status "Window manager is already set to: $SELECTED_WINDOW_MANAGER. No further action required." + return +fi + +if [[ "$SELECTED_WINDOW_MANAGER" == "hyprland" ]]; then + if ! is_installed "hyprland"; then + status "Hyprland is not installed. Hyprland needs to be installed before enabling it. Do you want to install Hyprland now? (This will install Hyprland and all related packages)" + if ! gum confirm "Do you want to install Hyprland?"; then + status "Hyprland installation cancelled." + return + fi + source $MANJIKAZE_DIR/app/installations/hyprland/hyprland.sh + return + fi +fi + +if gum confirm "Do you want to change the window manager to $SELECTED_WINDOW_MANAGER?"; then + set_window_manager "$SELECTED_WINDOW_MANAGER" + status "Window manager changed to: $SELECTED_WINDOW_MANAGER" + + USER_FILE="/var/lib/AccountsService/users/$USER" + if [[ -f "$USER_FILE" ]]; then + status "Setting auto-login session to: $SELECTED_WINDOW_MANAGER" + sudo sed -i -E "s/^Session=.*/Session=$SELECTED_WINDOW_MANAGER/" "$USER_FILE" + else + status "Warning: AccountsService entry $USER_FILE not found – unable to adjust auto-login session automatically." + fi +else + status "Window manager not changed." +fi \ No newline at end of file diff --git a/app/installations/optional/hyprland.sh b/app/installations/optional/hyprland.sh new file mode 100644 index 0000000..de64a32 --- /dev/null +++ b/app/installations/optional/hyprland.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +install_package "hyprland" "repo" +install_package "hyprpaper" "repo" +install_package "hypridle" "repo" +install_package "hyprlock" "repo" +install_package "hyprpolkitagent" "repo" +install_package "hyprpicker" "repo" +install_package "slurp" "repo" +install_package "waybar" "repo" +install_package "rofi-wayland" "repo" + + +if [ ! -d ~/.config/hypr ]; then + rsync -a --ignore-existing configs/hypr/ ~/.config/hypr/ + rsync -a --ignore-existing assets/background.jpg ~/.config/hypr/background.jpg +fi + +if [ ! -d ~/.config/rofi ]; then + rsync -a --ignore-existing configs/rofi/ ~/.config/rofi/ +fi + +if [ ! -d ~/.config/waybar ]; then + rsync -a --ignore-existing configs/waybar/ ~/.config/waybar/ +fi \ No newline at end of file diff --git a/app/installations/recommended/alacritty.sh b/app/installations/recommended/alacritty.sh index 3ddde37..3ca286f 100644 --- a/app/installations/recommended/alacritty.sh +++ b/app/installations/recommended/alacritty.sh @@ -11,7 +11,7 @@ if [ ! -d ~/.config/alacritty ]; then fi # Pin Alacritty to dock and remove default terminal if using GNOME -if [[ "$XDG_CURRENT_DESKTOP" == *"GNOME"* ]]; then +if [[ $(get_window_manager) == "gnome" ]]; then status "Pinning Alacritty to dock and removing default terminal..." # Get current favorites diff --git a/configs/hypr/base.conf b/configs/hypr/base.conf new file mode 100644 index 0000000..835149e --- /dev/null +++ b/configs/hypr/base.conf @@ -0,0 +1,111 @@ +############################# +### ENVIRONMENT VARIABLES ### +############################# + +env = XCURSOR_SIZE,24 +env = HYPRCURSOR_SIZE,24 + +##################### +### LOOK AND FEEL ### +##################### + +general { + gaps_in = 4 + gaps_out = 8 + border_size = 2 + col.active_border = $gb_light0 + col.inactive_border = $gb_dark1 + resize_on_border = true + allow_tearing = false + layout = dwindle + no_focus_fallback = true + extend_border_grab_area = 15 + hover_icon_on_border = true +} + +decoration { + rounding = 8 + + shadow { + enabled = true + render_power = 2 + ignore_window = true + color = $gb_dark0_hard + } + + blur { + enabled = true + size = 6 + passes = 2 + new_optimizations = true + ignore_opacity = true + noise = 0.0117 + contrast = 0.8916 + brightness = 0.8916 + vibrancy = 0.1696 + special = false + } + + active_opacity = 1.0 + inactive_opacity = 0.93 + fullscreen_opacity = 1.0 +} + +animations { + enabled = true + + bezier = easeOutQuint,0.23,1,0.32,1 + bezier = easeInOutCubic,0.65,0.05,0.36,1 + bezier = linear,0,0,1,1 + bezier = almostLinear,0.5,0.5,0.75,1.0 + bezier = quick,0.15,0,0.1,1 + + animation = global, 1, 10, default + animation = border, 1, 5.39, easeOutQuint + animation = windows, 1, 4.79, easeOutQuint + animation = windowsIn, 1, 4.1, easeOutQuint, popin 87% + animation = windowsOut, 1, 1.49, linear, popin 87% + animation = fadeIn, 1, 1.73, almostLinear + animation = fadeOut, 1, 1.46, almostLinear + animation = fade, 1, 3.03, quick + animation = layers, 1, 3.81, easeOutQuint + animation = layersIn, 1, 4, easeOutQuint, fade + animation = layersOut, 1, 1.5, linear, fade + animation = fadeLayersIn, 1, 1.79, almostLinear + animation = fadeLayersOut, 1, 1.39, almostLinear + animation = workspaces, 1, 1.94, almostLinear, fade + animation = workspacesIn, 1, 1.21, almostLinear, fade + animation = workspacesOut, 1, 1.94, almostLinear, fade +} + +dwindle { + pseudotile = true + preserve_split = true + permanent_direction_override = true + split_width_multiplier = 1.4 +} + +misc { + force_default_wallpaper = 0 + disable_hyprland_logo = false + disable_splash_rendering = true + animate_manual_resizes = true + animate_mouse_windowdragging = true + enable_swallow = false + swallow_regex = ^(kitty)$ + focus_on_activate = true + mouse_move_enables_dpms = true + key_press_enables_dpms = true + initial_workspace_tracking = 2 +} + +############# +### INPUT ### +############# + +input { + kb_layout = us + follow_mouse = 1 + sensitivity = 0 + numlock_by_default = true +} diff --git a/configs/hypr/custom.conf b/configs/hypr/custom.conf new file mode 100644 index 0000000..e69de29 diff --git a/configs/hypr/hypridle.conf b/configs/hypr/hypridle.conf new file mode 100644 index 0000000..23e364e --- /dev/null +++ b/configs/hypr/hypridle.conf @@ -0,0 +1,7 @@ +general { + lock_cmd = pidof hyprlock || hyprlock + unlock_cmd = pkill -USR1 hyprlock + + before_sleep_cmd = loginctl lock-session + after_sleep_cmd = hyprctl dispatch dpms on +} diff --git a/configs/hypr/hyprland.conf b/configs/hypr/hyprland.conf new file mode 100644 index 0000000..61173b0 --- /dev/null +++ b/configs/hypr/hyprland.conf @@ -0,0 +1,25 @@ +# Hyprland Configuration +# This is the main configuration file that imports all other configs. +# Refer to the wiki for more information: https://wiki.hyprland.org/Configuring/ + +monitor=DP-3, 1920x1200, 0x0, 1 +monitor=DP-2, 1920x1200, 1920x0, 1 +monitor=DP-1, 1920x1200, 3840x0, 1 + +# Basic programs +$terminal = kitty +$fileManager = dolphin +$browser = firefox +$menu = rofi -show run + +# Source shared configuration files +source = ~/.config/hypr/theme.conf +source = ~/.config/hypr/base.conf +source = ~/.config/hypr/keybindings.conf +source = ~/.config/hypr/rules.conf +source = ~/.config/hypr/custom.conf + +## Start On Launch ## +exec-once = waybar +exec = hyprpaper & +exec-once = hypridle \ No newline at end of file diff --git a/configs/hypr/hyprlock.conf b/configs/hypr/hyprlock.conf new file mode 100644 index 0000000..ea65049 --- /dev/null +++ b/configs/hypr/hyprlock.conf @@ -0,0 +1,45 @@ +background { + monitor = + path = screenshot + blur_size = 4 + blur_passes = 1 + noise = 0.0117 + contrast = 0.8916 + brightness = 0.8172 + vibrancy = 0.1696 + vibrancy_darkness = 0.0 +} + +input-field { + monitor = + size = 265, 50 + outline_thickness = 3 + dots_size = 0.33 + dots_spacing = 0.15 + dots_center = false + outer_color = rgb(151515) + inner_color = rgb(200, 200, 200) + font_color = rgb(10, 10, 10) + fade_on_empty = true + placeholder_text = Input Password... + hide_input = false + position = 0, -20 + halign = center + valign = center +} + +label { + monitor = + text = cmd[update:1000] date "+%H:%M:%S" + color = rgba(200, 200, 200, 1.0) + font_size = 25 + font_family = JetBrains Mono Nerd Font + position = 0, 80 + halign = center + valign = center +} + +auth { + pam:enabled = true + pam:module = login +} \ No newline at end of file diff --git a/configs/hypr/hyprpaper.conf b/configs/hypr/hyprpaper.conf new file mode 100644 index 0000000..aa460f4 --- /dev/null +++ b/configs/hypr/hyprpaper.conf @@ -0,0 +1,2 @@ +preload = ~/.config/hypr/background.jpg +wallpaper = , ~/.config/hypr/background.jpg \ No newline at end of file diff --git a/configs/hypr/keybindings.conf b/configs/hypr/keybindings.conf new file mode 100644 index 0000000..a4abe4a --- /dev/null +++ b/configs/hypr/keybindings.conf @@ -0,0 +1,82 @@ +################### +### KEYBINDINGS ### +################### + +$mainMod = SUPER + +bind = $mainMod, Return, exec, $terminal # Open terminal +bind = $mainMod SHIFT, Return, exec, $browser # Open browser +bind = $mainMod, Space, exec, $menu # Open Application Menu + +# System control +bind = $mainMod, Escape, exec, hyprctl reload +bind = $mainMod SHIFT, Escape, exec, hyprctl reload +bind = $mainMod ALT, Escape, exit + +# Window management +bind = $mainMod, R, killactive +bind = $mainMod SHIFT, R, killactive +bind = $mainMod, Z, exec, hyprlock + +# Workspace management +bind = $mainMod, E, workspace, emptym +bind = $mainMod SHIFT, E, movetoworkspace, emptym + +bind = $mainMod, Q, workspace, m-1 +bind = $mainMod, W, workspace, m+1 +bind = $mainMod SHIFT, Q, movetoworkspace, m-1 +bind = $mainMod SHIFT, W, movetoworkspace, m+1 + +# Monitor focus +bind = $mainMod, A, focusmonitor, +1 +bind = $mainMod, S, focusmonitor, -1 +bind = $mainMod SHIFT, A, movewindow, mon:+1 +bind = $mainMod SHIFT, S, movewindow, mon:-1 + +# Window states +bind = $mainMod, T, togglefloating, +bind = $mainMod SHIFT, T, pseudo, +bind = $mainMod ALT, T, fullscreen, + +# Focus/move windows +bind = $mainMod, H, movefocus, l +bind = $mainMod, J, movefocus, d +bind = $mainMod, K, movefocus, u +bind = $mainMod, L, movefocus, r +bind = $mainMod SHIFT, H, movewindow, l +bind = $mainMod SHIFT, J, movewindow, d +bind = $mainMod SHIFT, K, movewindow, u +bind = $mainMod SHIFT, L, movewindow, r + +# Move floating windows +bind = $mainMod, left, moveactive, -20 0 +bind = $mainMod, down, moveactive, 0 20 +bind = $mainMod, up, moveactive, 0 -20 +bind = $mainMod, right, moveactive, 20 0 + +# Resize windows +bind = $mainMod ALT, H, resizeactive, -20 0 +bind = $mainMod ALT, J, resizeactive, 0 20 +bind = $mainMod ALT, K, resizeactive, 0 -20 +bind = $mainMod ALT, L, resizeactive, 20 0 + +# Move/resize windows with mainMod + LMB/RMB and dragging +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod, mouse:273, resizewindow + +# Multimedia keys +bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ +bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- +bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle +bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle +bindel = ,XF86MonBrightnessUp, exec, brightnessctl s 10%+ +bindel = ,XF86MonBrightnessDown, exec, brightnessctl s 10%- + +# Media controls +bindl = , XF86AudioNext, exec, playerctl next +bindl = , XF86AudioPause, exec, playerctl play-pause +bindl = , XF86AudioPlay, exec, playerctl play-pause +bindl = , XF86AudioPrev, exec, playerctl previous + +# Screenshot binding +bind = , Print, exec, mkdir -p ~/Pictures/Screenshots/$(date +%Y-%m)/$(date +%d)/ && grim -g "$(slurp -d)" - | tee ~/Pictures/Screenshots/$(date +%Y-%m)/$(date +%d)/$(date +%H-%M-%S).png | wl-copy diff --git a/configs/hypr/rules.conf b/configs/hypr/rules.conf new file mode 100644 index 0000000..9b3ea66 --- /dev/null +++ b/configs/hypr/rules.conf @@ -0,0 +1,16 @@ +############################## +### WINDOWS AND WORKSPACES ### +############################## + +# Layer rules for rofi (shared launcher) +layerrule = blur,rofi +layerrule = dimaround,rofi +layerrule = animation slide,rofi + +# Common window rules +windowrulev2 = noblur 1, floating:1 + +# Utility window rules +windowrulev2 = opacity 0.9 0.1, tag:invisible +windowrulev2 = noborder, tag:invisible +windowrulev2 = decorate, tag:invisible diff --git a/configs/hypr/theme.conf b/configs/hypr/theme.conf new file mode 100644 index 0000000..bb6e9e2 --- /dev/null +++ b/configs/hypr/theme.conf @@ -0,0 +1,15 @@ +################### +### COLORSCHEME ### +################### + +# Gruvbox Dark Colors +$gb_dark0_hard = 0xff1d2021 +$gb_dark0 = 0xff282828 +$gb_dark1 = 0xff3c3836 +$gb_light0 = 0xfffbf1c7 +$gb_light1 = 0xffebdbb2 + +$gb_neutral_red = 0xffcc241d +$gb_bright_red = 0xfffb4934 +$gb_neutral_green = 0xff98971a +$gb_neutral_yellow = 0xffd79921 \ No newline at end of file diff --git a/configs/rofi/config.rasi b/configs/rofi/config.rasi new file mode 100644 index 0000000..c15d8e4 --- /dev/null +++ b/configs/rofi/config.rasi @@ -0,0 +1,28 @@ +configuration { + modes: "run"; + modi: "run,Projects:$HOME/.config/rofi/run_code.sh"; + font: "JetBrainsMono Nerd Font 12"; + location: 6; + drun-display-format: "{name}"; + disable-history: false; + sidebar-mode: true; + display-run: "Applications"; + kb-move-char-back: "Control+b"; + kb-move-char-forward: "Control+f"; + kb-mode-next: "Right,Control+Tab"; + kb-mode-previous: "Left,Control+ISO_Left_Tab"; + timeout { + action: "kb-cancel"; + delay: 0; + } + filebrowser { + directories-first: true; + sorting-method: "name"; + } + animation { + enabled: true; + window-enter: "slide-down"; + window-exit: "slide-up"; + } +} +@theme "$HOME/.config/rofi/theme.rasi" diff --git a/configs/rofi/run_code.sh b/configs/rofi/run_code.sh new file mode 100755 index 0000000..53a567d --- /dev/null +++ b/configs/rofi/run_code.sh @@ -0,0 +1,15 @@ +#!/usr/bin/bash + +# This script requires a certain structure in the Projects directory. +# This works for me, but you might need to adjust it to your own structure. + +if [ $# -eq 0 ] +then + for i in $(ls -dft $HOME/Projects/*/*); do + echo "$i" | sed -e 's/^\/home\/$USER\/Projects\///g'; + done +else + coproc ( cursor $HOME/Projects/$1 > /dev/null 2>&1 ) + exec 1>&- + exit +fi diff --git a/configs/rofi/theme.rasi b/configs/rofi/theme.rasi new file mode 100644 index 0000000..e0b34a9 --- /dev/null +++ b/configs/rofi/theme.rasi @@ -0,0 +1,84 @@ +/** + * Modern Gruvbox theme for Rofi + * Inspired by Waybar styling + */ +* { + /* Core colors */ + background: rgba(40, 40, 40, 0.5); + foreground: #ebdbb2; + selected-bg: #504945; + selected-fg: #ebdbb2; + border: rgba(168, 153, 132, 0.5); + + /* Theme colors */ + background-color: transparent; + text-color: var(foreground); + border-color: var(border); +} + +window { + background-color: var(background); + // border: 2px 0px 0px; + // border-color: var(border); + border-radius: 10px 10px 0px 0px; + padding: 0px 8px 0px 8px; + width: 40%; + transparency: "real"; + margin: 0px; +} + +mainbox { + padding: 0; +} + +listview { + border: 0px; + scrollbar: false; + padding: 8px 4px; +} + +element { + padding: 8px 8px; + border-radius: 8px 8px 8px 8px; +} + +element selected { + border: 2px; + background-color: var(selected-bg); + text-color: var(selected-fg); +} + +inputbar { + border: 2px; + border-radius: 0px 0px 8px 8px; + background-color: var(selected-bg); + text-color: var(selected-fg); + spacing: 0; + padding: 8px 12px; + margin: 0 0 8px 0; + children: [ prompt, textbox-prompt-sep, entry ]; +} + +prompt, +entry { + text-color: var(foreground); +} + +textbox-prompt-sep { + expand: false; + str: ":"; + text-color: var(foreground); + margin: 0 0.3em 0 0; +} + +button { + border: 2px 2px 0px 2px; + border-color: var(border); + border-radius: 8px 8px 0px 0px; + margin: 0px 56px; +} + +button selected { + background-color: var(selected-bg); + text-color: var(selected-fg); +} \ No newline at end of file diff --git a/configs/waybar/bar_DP-1.jsonc b/configs/waybar/bar_DP-1.jsonc new file mode 100644 index 0000000..3a2ffdd --- /dev/null +++ b/configs/waybar/bar_DP-1.jsonc @@ -0,0 +1,8 @@ +{ + "height": 30, + "spacing": 8, + "modules-center": [ + "hyprland/workspaces" + ], + "include": "~/.config/waybar/modules.jsonc" +} \ No newline at end of file diff --git a/configs/waybar/bar_DP-2.jsonc b/configs/waybar/bar_DP-2.jsonc new file mode 100644 index 0000000..f8c7115 --- /dev/null +++ b/configs/waybar/bar_DP-2.jsonc @@ -0,0 +1,16 @@ +{ + "output": "DP-2", + "height": 30, + "spacing": 8, + "modules-center": [ + "hyprland/workspaces" + ], + "modules-right": [ + "custom/colorpicker", + "clock" + ], + "include": [ + "~/.config/waybar/modules.jsonc", + "~/.config/waybar/modules/waymisu.jsonc" + ] +} \ No newline at end of file diff --git a/configs/waybar/bar_DP-3.jsonc b/configs/waybar/bar_DP-3.jsonc new file mode 100644 index 0000000..3a2ffdd --- /dev/null +++ b/configs/waybar/bar_DP-3.jsonc @@ -0,0 +1,8 @@ +{ + "height": 30, + "spacing": 8, + "modules-center": [ + "hyprland/workspaces" + ], + "include": "~/.config/waybar/modules.jsonc" +} \ No newline at end of file diff --git a/configs/waybar/config.jsonc b/configs/waybar/config.jsonc new file mode 100644 index 0000000..fd59164 --- /dev/null +++ b/configs/waybar/config.jsonc @@ -0,0 +1,17 @@ +[ + { + "output": "DP-1", + "name": "DP-1", + "include": "~/.config/waybar/bar_DP-1.jsonc" + }, + { + "output": "DP-2", + "name": "DP-2", + "include": "~/.config/waybar/bar_DP-2.jsonc" + }, + { + "output": "DP-3", + "name": "DP-3", + "include": "~/.config/waybar/bar_DP-3.jsonc" + } +] \ No newline at end of file diff --git a/configs/waybar/modules.jsonc b/configs/waybar/modules.jsonc new file mode 100644 index 0000000..f020cec --- /dev/null +++ b/configs/waybar/modules.jsonc @@ -0,0 +1,21 @@ +{ + "user": { + "format": "{work_H}:{work_M}:{work_S}", + "interval": 1 + }, + "clock": { + "interval": 1, + "format": "{:%Y-%m-%d %H:%M:%S}", + "tooltip-format": "{:%Y %B}\n{calendar}", + "format-alt": "{:%Y-%m-%d}" + }, + "custom/colorpicker": { + "format": "", + "on-click": "hyprpicker -a", + "tooltip": false + }, + "hyprland/workspaces": { + "format": "{name}", + "on-click": "activate" + } +} \ No newline at end of file diff --git a/configs/waybar/style.css b/configs/waybar/style.css new file mode 100644 index 0000000..cedbdb7 --- /dev/null +++ b/configs/waybar/style.css @@ -0,0 +1,97 @@ +* { + border: none; + border-radius: 0; + font-family: "JetBrainsMono Nerd Font", "Roboto", sans-serif; + font-size: 14px; + min-height: 0; + transition: all 0.3s ease; + color: #ebdbb2; +} + +window#waybar { + background: rgba(40, 40, 40, 0.0); + border-radius: 10px; + margin: 8px; + padding: 4px; +} + +#workspaces button { + border: 2px solid rgba(168, 153, 132, 0.5); + padding: 0 8px; + margin: 4px 2px; + margin-top: 0; + background: #504945; + border-radius: 8px; + color: #ebdbb2; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +#workspaces button.active { + background: #7c6f64; + color: #ebdbb2; + border-top: 2px solid #ebdbb2; +} + +#workspaces button.urgent { + background: rgba(204, 36, 29, 0.6); + box-shadow: inset 0 -3px #fb4934; +} + +#clock, +#custom-colorpicker, +#user, +#custom-waymisu { + background: #504945; + padding: 0 12px; + margin: 4px 4px; + margin-top: 0; + border-radius: 8px; + border-top-left-radius: 0; + border-top-right-radius: 0; + border: 2px solid rgba(168, 153, 132, 0.5); +} + +tooltip { + background: rgba(40, 40, 40, 0.95); + border: 2px solid rgba(168, 153, 132, 0.2); + border-radius: 8px; +} + +#user { + background: rgba(40, 40, 40, 0.0); + border: 0px; +} + +#user label { + color: rgba(40, 40, 40, 0.0); +} + +#custom-colorpicker { + padding-right: 16px; +} + +tooltip label { + color: #ebdbb2; +} + +#custom-waymisu.empty { + background: transparent; + border: none; + padding: 0; + margin: 0; + opacity: 0; +} + +#custom-waymisu.low { + background: #ebdbb2; + border: 1px solid #ebdbb2; + color: #7c6f64; +} + +#custom-waymisu.high { + background: #cc241d; + border: 2px solid #ebdbb2; + color: #ebdbb2; +} + diff --git a/docs/README.md b/docs/README.md index 785bb51..4125579 100644 --- a/docs/README.md +++ b/docs/README.md @@ -19,6 +19,7 @@ Welcome to the Manjikaze documentation. This guide will help you understand and - [GUIs](features/gui.md) - [Runtimes](features/mise-runtime-manager.md) - [AWS tools](features/aws-tools.md) +- [Hyprland](feature/hyprland.md) ### [Security](security/README.md) diff --git a/docs/features/README.md b/docs/features/README.md index ee03443..e77d98e 100644 --- a/docs/features/README.md +++ b/docs/features/README.md @@ -12,6 +12,7 @@ This section documents the various features and capabilities of Manjikaze. - [Runtimes](mise-runtime-manager.md) - Language runtimes and package managers - [AWS Tools](aws-tools.md) - AWS CLI and AWS Vault configuration - [Cursor Installation](cursor-installation.md) - Cursor AI-editor installation +- [Hyprland](hyprland.md) - Setup for Hyprland ecosystem --- diff --git a/docs/features/cursor-installation.md b/docs/features/cursor-installation.md index d820a0f..465d712 100644 --- a/docs/features/cursor-installation.md +++ b/docs/features/cursor-installation.md @@ -52,4 +52,4 @@ install_cursor --- -[← AWS Tools](aws-tools.md) | [Documentation Home](../README.md) \ No newline at end of file +[← AWS Tools](aws-tools.md) | [Hyprland](hyprland.md) \ No newline at end of file diff --git a/docs/features/hyprland.md b/docs/features/hyprland.md new file mode 100644 index 0000000..b90ade4 --- /dev/null +++ b/docs/features/hyprland.md @@ -0,0 +1,86 @@ +# Hyprland, Waybar & Rofi + +This page explains how Manjikaze sets up the **Hyprland** Wayland compositor together with **Waybar** and **Rofi**, and how you can adapt the defaults to your liking. + +--- + +## 1. Installing & Enabling Hyprland + +1. Run `manjikaze` in a terminal. +2. Choose **Setup → Choose optional apps** and select **hyprland** (this also installs Waybar and Rofi). This also sets default configurations for Hyprland, Waybar and Rofi. +3. After the installation, open **Configuration → Select window manager** and pick **Hyprland**. + +--- + +## 2. File Layout + +| Path | Purpose | +|-----------------------------------|-------------------------------------------------------------------| +| `~/.config/hypr/hyprland.conf` | Root file – imports the rest and starts Waybar/Hyprpaper/Hypridle | +| `~/.config/hypr/base.conf` | Gaps, borders, animations, input defaults | +| `~/.config/hypr/keybindings.conf` | All shortcuts (see next section) | +| `~/.config/hypr/theme.conf` | Gruvbox colour palette | +| `~/.config/hypr/rules.conf` | Per-app rules (floating, size, etc.) | +| `~/.config/hypr/custom.conf` | Empty – put your own overrides here (it is **never** overwritten) | +| `~/.config/waybar/*` | Per-monitor Waybar config + CSS | +| `~/.config/rofi/*` | Rofi behaviour and theme | + +Hyprland will automatically enable hot reloading, so any change in config will immediatly take effect. + +--- + +## 3. Default Keybindings + +`$mainMod` is `SUPER` (the *Windows/Command* key). + +Which applications are launched on a keybind can easily be changed by setting `$terminal`, `$fileManager`, `$browser` and `$menu` in `~/.config/hyprland.conf`. + +| Action | Keys | +|----------------------------------------|---------------------------| +| Open terminal (`kitty`) | `Super + Enter` | +| Open browser (`firefox`) | `Super + Shift + Enter` | +| Application launcher (Rofi) | `Super + Space` | +| Reload config | `Super + Esc` | +| Close window | `Super + R` | +| Lock screen | `Super + Z` | +| Toggle floating | `Super + T` | +| Move focus | `Super + H/J/K/L` | +| Move window | `Super + Shift + H/J/K/L` | +| Resize window | `Super + Alt + H/J/K/L` | +| Next / previous workspace | `Super + W / Q` | +| Move window to next / prev workspace | `Super + Shift + W / Q` | +| Focus next / prev monitor | `Super + A / S` | +| Move window to next / prev monitor | `Super + Shift + A / S` | +| Create new workspace | `Super + E` | +| Move window into a new empty workspace | `Super + Shift + E` | + +--- + +## 4. Waybar + +Waybar sits at the top of each monitor. +Configuration is JSONC (JSON with comments) and split per output (e.g. `bar_DP-2.jsonc`). +The default assumes 3 monitors, this can easily be configured. + +* Modules are defined in `modules.jsonc` once and then referenced by each bar. +* Styling is done via `style.css` – regular CSS. +* Reload by running `pkill -SIGUSR2 waybar` or simply `hyprctl reload`. + +A lot of information can be found on the [Waybar Wiki](https://github.com/Alexays/Waybar/wiki) + +--- + +## 5. Rofi + +Rofi provides the application launcher and a *Projects* mode that searches the `~/Projects` folder via a small shell script. + +* Global settings live in `config.rasi`. +* Colours and spacing are in `theme.rasi`. +* Launch manually with `rofi -show run`. + +To experiment, duplicate `theme.rasi`, update the path in `config.rasi`, reload (`Super + Esc`) and try it. + +The script assumes a specific folder structure. It might not initially work, but it easily customizable to your flow. + +--- +[Cursor Installation →](cursor-installation.md) | [← Documentation Home](../README.md) \ No newline at end of file diff --git a/lib/common.sh b/lib/common.sh index 009ded2..5595f5a 100644 --- a/lib/common.sh +++ b/lib/common.sh @@ -13,7 +13,7 @@ is_installed() { } disable_sleep() { - if [[ "$XDG_CURRENT_DESKTOP" == *"GNOME"* ]]; then + if [[ $(get_window_manager) == "gnome" ]]; then status "Disabling screen lock and sleep during installation..." gsettings set org.gnome.desktop.screensaver lock-enabled false gsettings set org.gnome.desktop.session idle-delay 0 @@ -21,7 +21,7 @@ disable_sleep() { } enable_sleep() { - if [[ "$XDG_CURRENT_DESKTOP" == *"GNOME"* ]]; then + if [[ $(get_window_manager) == "gnome" ]]; then status "Re-enabling screen lock and sleep..." gsettings set org.gnome.desktop.screensaver lock-enabled true gsettings set org.gnome.desktop.session idle-delay 300 diff --git a/lib/menus.sh b/lib/menus.sh index 7686e91..5539a57 100644 --- a/lib/menus.sh +++ b/lib/menus.sh @@ -25,11 +25,12 @@ setup_menu=( ) declare -A configuration_menu=( - ["1:GNOME desktop"]="load_module configuration/configure-gnome.sh" - ["2:Nautilus file manager"]="load_module configuration/configure-nautilus.sh" - ["3:Monospace font"]="load_module configuration/configure-font.sh" - ["4:Git"]="load_module configuration/configure-git.sh" - ["5:Network printer discovery"]="load_module configuration/configure-printing.sh" + ["1:Select window manager"]="load_module configuration/select-window-manager.sh" + ["2:GNOME desktop"]="load_module configuration/configure-gnome.sh" + ["3:Nautilus file manager"]="load_module configuration/configure-nautilus.sh" + ["4:Monospace font"]="load_module configuration/configure-font.sh" + ["5:Git"]="load_module configuration/configure-git.sh" + ["6:Network printer discovery"]="load_module configuration/configure-printing.sh" ) declare -A security_menu=( diff --git a/lib/state.sh b/lib/state.sh index c9af4f2..c32686c 100644 --- a/lib/state.sh +++ b/lib/state.sh @@ -5,7 +5,7 @@ STATE_FILE="$MANJIKAZE_DIR/.manjikaze_state.json" init_state_file() { if [[ ! -f "$STATE_FILE" ]]; then - echo '{"migrations": {}, "audits": {}, "updates": {}}' > "$STATE_FILE" + echo '{"migrations": {}, "audits": {}, "updates": {}, "window_manager": "gnome"}' > "$STATE_FILE" fi } @@ -48,3 +48,15 @@ set_update_check_time() { local temp_state=$(mktemp) jq --arg ts "$timestamp" '.updates.last_check = $ts' "$STATE_FILE" > "$temp_state" && mv "$temp_state" "$STATE_FILE" } + +get_window_manager() { + init_state_file + jq -r '.window_manager // ""' "$STATE_FILE" +} + +set_window_manager() { + local window_manager="$1" + init_state_file + local temp_state=$(mktemp) + jq --arg wm "$window_manager" '.window_manager = $wm' "$STATE_FILE" > "$temp_state" && mv "$temp_state" "$STATE_FILE" +} diff --git a/migrations/1751551513_add_window_manager_state.sh b/migrations/1751551513_add_window_manager_state.sh new file mode 100644 index 0000000..6aa7fe5 --- /dev/null +++ b/migrations/1751551513_add_window_manager_state.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -e + +current_window_manager=$(get_window_manager) + +if [ -z "$current_window_manager" ]; then + status "No window manager found, setting to gnome" + set_window_manager "gnome" +fi