commit 4f7483d053f5bab0a549b624ac42523799f383cc Author: ciomeczek Date: Mon Aug 4 21:27:37 2025 +0200 Initial commit diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..e1a94c5 --- /dev/null +++ b/build.sh @@ -0,0 +1,84 @@ +#!/bin/sh + +set -e +ORIG_PWD=$(pwd) + +# Elevate to root if needed +if [ "$(id -u)" -ne 0 ]; then + exec sudo "$0" "$@" +fi + +ORIG_USER=$(logname) +ORIG_HOME=$(getent passwd "$ORIG_USER" | cut -d: -f6) + +# === Update system === +echo "Updating system..." +pacman -Syu --noconfirm + +# === Essential tools === +ESSENTIAL_PACKAGES=" + python3 + neovim + ranger + firefox +" + +# === Display manager === +DISPLAY_MANAGER=" + sddm +" + +# === Wayland & Hyprland environment === +WAYLAND_ENVIRONMENT=" + hyprland + hyprpaper + waybar + kitty + wofi + mako + libnotify + grim + slurp + wl-clipboard + wayland-utils + xorg-xwayland +" + +# === Audio === +AUDIO_PACKAGES=" + pipewire + wireplumber + pipewire-pulse + pavucontrol +" + +# === Fonts & theming === +FONTS_AND_THEME=" + otf-font-awesome +" + +# === Multimedia === +MEDIA_PACKAGES=" + mpv +" + +# === Install all packages === +echo "Installing packages..." +pacman -S --noconfirm --needed \ + $ESSENTIAL_PACKAGES \ + $DISPLAY_MANAGER \ + $WAYLAND_ENVIRONMENT \ + $AUDIO_PACKAGES \ + $FONTS_AND_THEME \ + $MEDIA_PACKAGES + +# === Enable display manager === +echo "Enabling SDDM..." +systemctl enable sddm + +# === Run dotfiles setup === +echo "Running dotfiles setup as $ORIG_USER..." +cd "$ORIG_PWD" || exit 1 +sudo -u "$ORIG_USER" HOME="$ORIG_HOME" python3 setup.py + +echo "Dotfiles installed successfully." diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..3e89ecb --- /dev/null +++ b/setup.py @@ -0,0 +1,34 @@ +import os +import shutil + +SRC_DIR = "src" +HOME_DIR = os.path.expanduser("~") + +def ask_override(path): + resp = input(f"'{path}' already exists. Override? (Y/N): ").strip().lower() + return resp == 'y' + +def copy_with_structure(src_root, dst_root, override_all=False): + for root, dirs, files in os.walk(src_root): + rel_path = os.path.relpath(root, src_root) + target_dir = os.path.join(dst_root, rel_path) + + os.makedirs(target_dir, exist_ok=True) + + for file in files: + src_file = os.path.join(root, file) + dst_file = os.path.join(target_dir, file) + + if os.path.exists(dst_file): + if not override_all and not ask_override(dst_file): + continue + + shutil.copy2(src_file, dst_file) + print(f"Copied: {src_file} -> {dst_file}") + +def main(): + override_all = input('Override all existing files? (Y/N): ').strip().lower() == 'y' + copy_with_structure(SRC_DIR, HOME_DIR, override_all) + +if __name__ == '__main__': + main() diff --git a/src/.config/hypr/hyprland.conf b/src/.config/hypr/hyprland.conf new file mode 100644 index 0000000..5000fb7 --- /dev/null +++ b/src/.config/hypr/hyprland.conf @@ -0,0 +1,282 @@ +################ +### MONITORS ### +################ + +# See https://wiki.hyprland.org/Configuring/Monitors/ +source = /home/ciomek/.config/hypr/monitors.conf + +################### +### MY PROGRAMS ### +################### + +# See https://wiki.hyprland.org/Configuring/Keywords/ + +# Set programs that you use +$terminal = kitty +$fileManager = $terminal ranger +$menu = wofi --show drun +$browser = firefox +$screenshot = grim -g "$(slurp -d)" - | wl-copy + + +################# +### AUTOSTART ### +################# + +# Autostart necessary processes (like notifications daemons, status bars, etc.) +exec-once=waybar & hyprpaper +# & mako --config=$HOME/.config/mako/config + + +############################# +### ENVIRONMENT VARIABLES ### +############################# + +# See https://wiki.hyprland.org/Configuring/Environment-variables/ + +env = XCURSOR_SIZE,24 +env = HYPRCURSOR_SIZE,24 + + +################### +### PERMISSIONS ### +################### + +# See https://wiki.hyprland.org/Configuring/Permissions/ +# Please note permission changes here require a Hyprland restart and are not applied on-the-fly +# for security reasons + +# ecosystem { +# enforce_permissions = 1 +# } + +# permission = /usr/(bin|local/bin)/grim, screencopy, allow +# permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow +# permission = /usr/(bin|local/bin)/hyprpm, plugin, allow + + +##################### +### LOOK AND FEEL ### +##################### + +# Refer to https://wiki.hyprland.org/Configuring/Variables/ + +# https://wiki.hyprland.org/Configuring/Variables/#general +general { + gaps_in = 5 + gaps_out = 10 + + border_size = 5 + + # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors + col.active_border = rgb(4a5a6b) rgb(3a3f45) 45deg + col.inactive_border = rgba(595959aa) + + # Set to true enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = false + + # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on + allow_tearing = false + + layout = dwindle +} + +# https://wiki.hyprland.org/Configuring/Variables/#decoration +decoration { + rounding = 0 + rounding_power = 0 + + # Change transparency of focused and unfocused windows + active_opacity = 1.0 + inactive_opacity = 0.80 + + shadow { + enabled = true + range = 4 + render_power = 3 + color = rgba(1a1a1aee) + } + + # https://wiki.hyprland.org/Configuring/Variables/#blur + blur { + enabled = false + size = 3 + passes = 1 + + vibrancy = 0.1696 + } +} + +# https://wiki.hyprland.org/Configuring/Variables/#animations +animations { + enabled = true + + # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more + + 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 +} + +# Ref https://wiki.hyprland.org/Configuring/Workspace-Rules/ +# "Smart gaps" / "No gaps when only" +# uncomment all if you wish to use that. +# workspace = w[tv1], gapsout:0, gapsin:0 +# workspace = f[1], gapsout:0, gapsin:0 +# windowrule = bordersize 0, floating:0, onworkspace:w[tv1] +# windowrule = rounding 0, floating:0, onworkspace:w[tv1] +# windowrule = bordersize 0, floating:0, onworkspace:f[1] +# windowrule = rounding 0, floating:0, onworkspace:f[1] + +# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more +dwindle { + pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below + preserve_split = true # You probably want this +} + +# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more +master { + new_status = master +} + +# https://wiki.hyprland.org/Configuring/Variables/#misc +misc { + force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers + disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :( +} + + +############# +### INPUT ### +############# + +# https://wiki.hyprland.org/Configuring/Variables/#input +input { + kb_layout = pl + kb_variant = ,qwerty + kb_model = + kb_options = + kb_rules = + + follow_mouse = 1 + + sensitivity = 0 # -1.0 - 1.0, 0 means no modification. + + touchpad { + natural_scroll = false + } +} + +# https://wiki.hyprland.org/Configuring/Variables/#gestures +gestures { + workspace_swipe = false +} + +################### +### KEYBINDINGS ### +################### + +# See https://wiki.hyprland.org/Configuring/Keywords/ +$mainMod = SUPER # Sets "Windows" key as main modifier + +# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more +bind = $mainMod, Q, exec, $terminal +bind = $mainMod, C, killactive, +bind = $mainMod, M, exit, +bind = $mainMod, E, exec, $fileManager +bind = $mainMod, V, togglefloating, +bind = $mainMod, R, exec, $menu +bind = $mainMod, P, pseudo, # dwindle +bind = $mainMod, J, togglesplit, # dwindle +bind = $mainMod, F, fullscreen +bind = $mainMod, B, exec, $browser + +# 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 windows wiht mainMod + SHIFT + 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 + +# Switch workspaces with mainMod + [0-6] +bind=$mainMod,1,workspace,1 +bind=$mainMod,2,workspace,2 +bind=$mainMod,3,workspace,3 +bind=$mainMod,4,workspace,4 +bind=$mainMod,5,workspace,5 +bind=$mainMod,6,workspace,6 + +# Move active window to a workspace with mainMod + SHIFT + [0-6] +bind = $mainMod SHIFT, 1, movetoworkspace, 1 +bind = $mainMod SHIFT, 2, movetoworkspace, 2 +bind = $mainMod SHIFT, 3, movetoworkspace, 3 +bind = $mainMod SHIFT, 4, movetoworkspace, 4 +bind = $mainMod SHIFT, 5, movetoworkspace, 5 +bind = $mainMod SHIFT, 6, movetoworkspace, 6 + +# Scroll through existing workspaces with mainMod + scroll +bind = $mainMod, mouse_down, workspace, e+1 +bind = $mainMod, mouse_up, workspace, e-1 + +# Move/resize windows with mainMod + LMB/RMB and dragging +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod, mouse:273, resizewindow + +# Laptop multimedia keys for volume and LCD brightness +bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @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 -e4 -n2 set 5%+ +bindel = ,XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%- + +# Requires playerctl +bindl = , mouse:280, exec, playerctl next +bindl = , mouse:282, exec, playerctl play-pause +bindl = , mouse:281, exec, playerctl previous + +# Screenshots +bind = , Print, exec, $screenshot + +############################## +### WINDOWS AND WORKSPACES ### +############################## + +# Ignore maximize requests from apps. You'll probably like this. +windowrule = suppressevent maximize, class:.* + +# Fix some dragging issues with XWayland +windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0 + +# Make pavucontrol always floating +windowrule = float,class:org.pulseaudio.pavucontrol + +# Make some windows never opaque +windowrule = opacity 1 1 override,title:(?i).*YouTube.* +windowrule = opacity 1 1 override,class: Spotify +windowrule = opacity 1 1 override,class: jetbrains-idea-ce +windowrule = opacity 1 1 override,class: jetbrains-pycharm-ce \ No newline at end of file diff --git a/src/.config/hypr/hyprpaper.conf b/src/.config/hypr/hyprpaper.conf new file mode 100644 index 0000000..59c74c6 --- /dev/null +++ b/src/.config/hypr/hyprpaper.conf @@ -0,0 +1,2 @@ +preload = /home/ciomek/Pictures/wallpaper.png +wallpaper =,/home/ciomek/Pictures/wallpaper.png diff --git a/src/.config/hypr/monitor-1.conf b/src/.config/hypr/monitor-1.conf new file mode 100644 index 0000000..3ff7294 --- /dev/null +++ b/src/.config/hypr/monitor-1.conf @@ -0,0 +1,19 @@ +$mainMod = SUPER + +# MONITORS +monitor = , preferred, auto, 1 + +# Workspaces per monitor +workspace=1,persistent:true,default:true +workspace=2,persistent:true +workspace=3,persistent:true +workspace=4,persistent:true +workspace=5,persistent:true +workspace=6,persistent:true + +# The blank workspace +bind=$mainMod,S,workspace,name:S1 +bind=$mainMod SHIFT,S,workspace,1 + +# Secret workspaces +workspace=name:S1 \ No newline at end of file diff --git a/src/.config/hypr/monitors-2.conf b/src/.config/hypr/monitors-2.conf new file mode 100644 index 0000000..d92040e --- /dev/null +++ b/src/.config/hypr/monitors-2.conf @@ -0,0 +1,24 @@ +$mainMod = SUPER + +# MONITORS +monitor=DP-1,1920x1080,0x0,1 +monitor=HDMI-A-1,1920x1080,1920x0,1 + + +# Workspaces per monitor +workspace=1,monitor:DP-1,default:true,persistent:true +workspace=2,monitor:HDMI-A-1,default:true,persistent:true +workspace=3,monitor:DP-1,persistent:true +workspace=4,monitor:HDMI-A-1,persistent:true +workspace=5,monitor:DP-1,persistent:true +workspace=6,monitor:HDMI-A-1,persistent:true + +# The blank workspace +bind=$mainMod,S,workspace,name:S1 +bind=$mainMod,S,workspace,name:S2 +bind=$mainMod SHIFT,S,workspace,2 +bind=$mainMod SHIFT,S,workspace,1 + +# Secret workspaces +workspace=name:S1,monitor:DP-1 +workspace=name:S2,monitor:HDMI-A-1 \ No newline at end of file diff --git a/src/.config/kitty/kitty.conf b/src/.config/kitty/kitty.conf new file mode 100644 index 0000000..f1448cb --- /dev/null +++ b/src/.config/kitty/kitty.conf @@ -0,0 +1,13 @@ +font_family Terminus +bold_font auto +italic_font auto +bold_italic_font auto +font_size 12.0 + +foreground #ffffff +background #121418 +background_opacity 0.95 + +confirm_os_window_close 0 +enable_audio_bell no + diff --git a/src/.config/mako/config b/src/.config/mako/config new file mode 100644 index 0000000..b96ce70 --- /dev/null +++ b/src/.config/mako/config @@ -0,0 +1,24 @@ +font=FontAwesome 13 +format=%a ⏵ %s\n%b +sort=-time +layer=overlay +anchor=top-right +width=300 +height=110 +margin=10 +padding=20 +icons=0 +max-icon-size=64 +default-timeout=5000 +ignore-timeout=1 + +# Style +background-color=#1E2226 +border-size=2 +border-color=#4c5a66 +border-radius=10 +text-color=#e0e6ed + +[urgency=high] +border-color=#bf616a +default-timeout=0 diff --git a/src/.config/nvim/init.vim b/src/.config/nvim/init.vim new file mode 100644 index 0000000..c321e59 --- /dev/null +++ b/src/.config/nvim/init.vim @@ -0,0 +1,2 @@ +set clipboard=unnamedplus + diff --git a/src/.config/waybar/config.jsonc b/src/.config/waybar/config.jsonc new file mode 100644 index 0000000..c84f490 --- /dev/null +++ b/src/.config/waybar/config.jsonc @@ -0,0 +1,99 @@ +// -*- mode: jsonc -*- +{ + "layer": "top", + "position": "top", + "height": 30, + "spacing": 4, + "modules-left": [ + ], + "modules-center": [ + "hyprland/window" + ], + "modules-right": [ + "network", + "cpu", + "pulseaudio", + "tray", + "battery", + "clock", + "custom/power" + ], + "tray": { + // "icon-size": 21, + "spacing": 10, + // "icons": { + // "blueman": "bluetooth", + // "TelegramDesktop": "$HOME/.local/share/icons/hicolor/16x16/apps/telegram.png" + // } + }, + "clock": { + // "timezone": "America/New_York", + "tooltip-format": "{:%Y %B}\n{calendar}", + "format-alt": "{:%Y-%m-%d}" + }, + "cpu": { + "format": "{usage}% ", + "tooltip": false + }, + "memory": { + "format": "{}% " + }, + "battery": { + "states": { + "good": 95, + "warning": 30, + "critical": 15 + }, + "format": "{capacity}% {icon}", + "format-full": "{capacity}% {icon}", + "format-charging": "{capacity}% ", + "format-plugged": "{capacity}% ", + "format-alt": "{time} {icon}", + // "format-good": "", // An empty format will hide the module + // "format-full": "", + "format-icons": ["", "", "", "", ""] + }, + "battery#bat2": { + "bat": "BAT2" + }, + "network": { + // "interface": "wlp2*", // (Optional) To force the use of this interface + "format-wifi": "{essid} ({signalStrength}%) ", + "format-ethernet": "{ipaddr}/{cidr} ", + "tooltip-format": "{ifname} via {gwaddr} ", + "format-linked": "{ifname} (No IP) ", + "format-disconnected": "Disconnected ⚠", + "format-alt": "{ifname}: {ipaddr}/{cidr}" + }, + "pulseaudio": { + "scroll-step": 5, // %, can be a float + "format": "{volume}% {icon} {format_source}", + "format-bluetooth": "{volume}% {icon} {format_source}", + "format-bluetooth-muted": " {icon} {format_source}", + "format-muted": " {format_source}", + "format-source": "{volume}% ", + "format-source-muted": "", + "format-icons": { + "headphone": "", + "hands-free": "", + "headset": "", + "phone": "", + "portable": "", + "car": "", + "default": ["", "", ""] + }, + "on-click": "pavucontrol" + }, + "custom/power": { + "format" : " ⏻ ", + "tooltip": false, + "menu": "on-click", + "menu-file": "$HOME/.config/waybar/power_menu.xml", // Menu file in resources folder + "menu-actions": { + "shutdown": "shutdown -P now", + "reboot": "reboot", + "suspend": "systemctl suspend", + "hibernate": "systemctl hibernate" + } + } +} diff --git a/src/.config/waybar/power_menu.xml b/src/.config/waybar/power_menu.xml new file mode 100644 index 0000000..6d68e54 --- /dev/null +++ b/src/.config/waybar/power_menu.xml @@ -0,0 +1,28 @@ + + + + + + Shutdown + + + + + Reboot + + + + + + + + Suspend + + + + + Hibernate + + + + \ No newline at end of file diff --git a/src/.config/waybar/style.css b/src/.config/waybar/style.css new file mode 100644 index 0000000..da56d5e --- /dev/null +++ b/src/.config/waybar/style.css @@ -0,0 +1,118 @@ +* { + font-family: FontAwesome, Roboto, Helvetica, Arial, sans-serif; + font-size: 13px; +} + +window#waybar { + background-color: rgba(30, 34, 38, 1); + border-bottom: 2px solid #4c5a66; + color: #e0e6ed; + transition: background-color 0.5s; +} + +window#waybar.hidden { + opacity: 0.2; +} + +button { + box-shadow: inset 0 -2px transparent; + border: none; + border-radius: 0; +} + +button:hover { + background: rgba(76, 90, 102, 0.2); + box-shadow: inset 0 -2px #90a4b8; +} + +#workspaces button { + padding: 0 5px; + background-color: transparent; + color: #cbd3db; +} + +#workspaces button:hover { + background: rgba(144, 164, 184, 0.1); +} + +#workspaces button.focused { + background-color: #3b4651; + box-shadow: inset 0 -2px #90a4b8; + color: #ffffff; +} + +#workspaces button.urgent { + background-color: #b03c3c; + color: #ffffff; +} + +#mode { + background-color: #3b4651; + box-shadow: inset 0 -2px #90a4b8; + color: #ffffff; +} + +#clock, +#battery, +#cpu, +#temperature, +#backlight, +#network, +#pulseaudio, +#custom-media, +#tray, +#mode, +#scratchpad, +#keyboard-state { + padding: 0 10px; + color: #e0e6ed; +} + +#window, +#workspaces { + margin: 0 4px; +} + +.modules-left > widget:first-child > #workspaces { + margin-left: 0; +} +.modules-right > widget:last-child > #workspaces { + margin-right: 0; +} + +#clock { + background-color: rgba(76, 90, 102, 1); +} + +#custom-power { + background-color: rgba(76, 90, 102, 1); +} + +#cpu { + background-color: rgba(76, 90, 102, 1); +} + +#network { + background-color: rgba(76, 90, 102, 1); +} + +#network.disconnected { + background-color: rgba(176, 60, 60, 1); +} + +#pulseaudio { + background-color: rgba(76, 90, 102, 1); +} + +#pulseaudio.muted { + background-color: rgba(47, 57, 66, 1); + color: #aab4be; +} + +#tray { + background-color: rgba(76, 90, 102, 1); +} + +#tray > .needs-attention { + background-color: rgba(176, 60, 60, 1); +} diff --git a/src/.config/wofi/style.css b/src/.config/wofi/style.css new file mode 100644 index 0000000..ded3cb0 --- /dev/null +++ b/src/.config/wofi/style.css @@ -0,0 +1,57 @@ +* { + font-family: FontAwesome; + font-size: 13px; + color: #e0e6ed; +} + +window { + margin: 10px; + border: 2px solid #4c5a66; + background-color: rgba(30, 34, 38, 0.9); + padding: 20px; + border-top-left-radius: 10px; + border-top-right-radius: 10px; +} + +#input { + margin: 5px; + padding: 1px 5px; + border: 1px solid #90a4b8; + background-color: #2f3942; + color: #e0e6ed; + border-radius: 7px; +} + +#inner-box { + margin: 0px; + background-color: rgba(30 34 38, 0.75); + border: none; +} + +#outer-box { + margin: 5px; + background-color: transparent; +} + +#scroll { + display: none; + margin: 5px; + background-color: transparent; +} + +#text { + padding: 5px 10px; +} + +#entry:selected { + background-color: #3b4651; + border-left: 3px solid #90a4b8; + color: #ffffff; +} + +#entry { + padding: 5px 10px; + margin: 2px 0; + background-color: transparent; +} + diff --git a/src/Pictures/wallpaper.png b/src/Pictures/wallpaper.png new file mode 100644 index 0000000..fafb0dd Binary files /dev/null and b/src/Pictures/wallpaper.png differ