Compare commits

...

25 Commits

Author SHA1 Message Date
Sem
6dfd4eac43 Add base of sddm theme 2026-04-20 21:21:03 +02:00
Sem
f8c8536ce3 added a lil' fella 2026-04-18 00:40:26 +02:00
Sem
24b0c41ffb improve config for cava and add base for equalizer. It works but needs some performance fixes 2026-04-18 00:06:45 +02:00
Sem
7bcd3220dd WIP cava process 2026-04-10 23:58:23 +02:00
Sem
9f5eb82fe1 Add cava and TODO for frequency graph 2026-04-10 00:05:30 +02:00
Sem
9d04b30629 add now playing info 2026-04-07 23:48:02 +02:00
Sem
225538148d Add separate file for workspaces list 2026-04-07 23:37:14 +02:00
Sem
553a7b3ad4 Add comment for nerd fonts cheat sheet 2026-04-07 22:58:10 +02:00
Sem
328dfa1786 Add bluetooth icon 2026-04-07 22:10:33 +02:00
Sem
3f27d6618a Add date and time parsing and add colors from matugen to all current elements of top bar 2026-04-03 21:29:47 +02:00
Sem
506aeeff43 Add showing level of value through bar 2026-04-03 19:52:27 +02:00
Sem
406b8eb628 add overview and use matugen colors on workspace switcher 2026-04-03 18:03:11 +02:00
Sem
0d37adab9c use international layout 2026-04-03 16:55:06 +02:00
Sem
04b8ccc690 Fix font 2026-04-03 16:52:23 +02:00
Sem
a5937d78ca add short and all flags for fortune 2026-04-02 22:54:57 +02:00
Sem
587b636e2f Add matugen config for quickshell and add futures box 2026-04-02 22:52:23 +02:00
Sem
e72f9e50f6 update keybindings and animations a lil 2026-04-02 17:38:52 +02:00
Sem
16c90cb64d use arrow keys to switch workspace 2026-04-01 23:30:36 +02:00
Sem
6c6ef8d74c fix rofi image and add screenshot tool 2026-04-01 23:24:04 +02:00
Sem
8f4689d237 Use separate conf file for each section 2026-04-01 22:59:07 +02:00
Sem
f504c6c87c update gitignore 2026-04-01 22:48:53 +02:00
Sem
b0a4408c65 Fix rofi rice and gitignore generated files 2026-04-01 22:36:05 +02:00
Sem
b5fe4b0a5e Add template for rofi 2026-03-31 23:55:03 +02:00
Sem
5c995f7aa2 Add matugen config for kitty and wip for QT 2026-03-30 22:00:29 +02:00
Sem
ddd9a93679 add matugen support for hyprland 2026-03-30 20:56:59 +02:00
50 changed files with 6276 additions and 485 deletions

7
.gitignore vendored Normal file
View File

@@ -0,0 +1,7 @@
hypr/current_wallpaper
hypr/colors.conf
kitty/current-theme.conf
kitty/themes/Matugen.conf
qt5ct/colors/matugen.conf
qt6ct/colors/matugen.conf
rofi/colors.rasi

330
cava/config Normal file
View File

@@ -0,0 +1,330 @@
## Configuration file for CAVA.
# Remove the ; to change parameters.
[general]
# Auto reload config if the configuration file has changed. 1 = on, 0 = off.
; live-config = 0
# Smoothing mode. Can be 'normal', 'scientific' or 'waves'. DEPRECATED as of 0.6.0
; mode = normal
# Accepts only non-negative values.
framerate = 60
# 'autosens' will attempt to decrease sensitivity if the bars peak. 1 = on, 0 = off
# new as of 0.6.0 autosens of low values (dynamic range)
# 'overshoot' allows bars to overshoot (in % of terminal height) without initiating autosens. DEPRECATED as of 0.6.0
autosens = 1
; overshoot = 20
# Manual sensitivity in %. If autosens is enabled, this will only be the initial value.
# 200 means double height. Accepts only non-negative values.
sensitivity = 40
# The number of bars (0-512). 0 sets it to auto (fill up console).
# Bars' width and space between bars in number of characters.
bars = 32
; bar_width = 2
; bar_spacing = 1
# bar_height is only used for output in "noritake" format
; bar_height = 32
# For SDL width and space between bars is in pixels, defaults are:
; bar_width = 20
; bar_spacing = 5
# sdl_glsl have these default values, they are only used to calculate max number of bars.
; bar_width = 1
; bar_spacing = 0
# ceter bars in terminal, if there is space.
center_align = 0
# max height of bars in terminal, in percent of terminal height.
; max_height = 100
# Lower and higher cutoff frequencies for lowest and highest bars
# the bandwidth of the visualizer.
# Note: there is a minimum total bandwidth of 43Mhz x number of bars.
# Cava will automatically increase the higher cutoff frequency if needed to satisfy the minimum bandwidth.
; lower_cutoff_freq = 50
; higher_cutoff_freq = 10000
# Seconds with no input before cava goes to sleep mode. Cava will not perform FFT or drawing and
# only check for input once per second. Cava will wake up once input is detected. 0 = disable.
; sleep_timer = 0
[input]
# Audio capturing method. Possible methods are: 'fifo', 'portaudio', 'pipewire', 'alsa', 'pulse', 'sndio', 'oss', 'jack' or 'shmem'
# Defaults to 'oss', 'pipewire', 'sndio', 'jack', 'pulse', 'alsa', 'portaudio' or 'fifo', in that order, dependent on what support cava was built with.
# On Mac it defaults to 'portaudio' or 'fifo'
# On windows this is automatic and no input settings are needed.
#
# All input methods uses the same config variable 'source'
# to define where it should get the audio.
#
# For pulseaudio and pipewire 'source' will be the source. Default: 'auto', which uses the monitor source of the default sink
# (all pulseaudio sinks(outputs) have 'monitor' sources(inputs) associated with them).
#
# For pipewire 'source' will be the object name or object.serial of the device to capture from.
# Both input and output devices are supported. To capture the monitor source of a sink node, append '.monitor' to the sink's object name.
#
# For alsa 'source' will be the capture device.
# For fifo 'source' will be the path to fifo-file.
# For shmem 'source' will be /squeezelite-AA:BB:CC:DD:EE:FF where 'AA:BB:CC:DD:EE:FF' will be squeezelite's MAC address
#
# For sndio 'source' will be a raw recording audio descriptor or a monitoring sub-device, e.g. 'rsnd/2' or 'snd/1'. Default: 'default'.
# README.md contains further information on how to setup CAVA for sndio.
#
# For oss 'source' will be the path to a audio device, e.g. '/dev/dsp2'. Default: '/dev/dsp', i.e. the default audio device.
# README.md contains further information on how to setup CAVA for OSS on FreeBSD.
#
# For jack 'source' will be the name of the JACK server to connect to, e.g. 'foobar'. Default: 'default'.
# README.md contains further information on how to setup CAVA for JACK.
#
; method = pulse
; source = auto
; method = pipewire
; source = auto
; method = alsa
; source = hw:Loopback,1
; method = fifo
; source = /tmp/mpd.fifo
; method = shmem
; source = /squeezelite-AA:BB:CC:DD:EE:FF
; method = portaudio
; source = auto
; method = sndio
; source = default
; method = oss
; source = /dev/dsp
; method = jack
; source = default
# The options 'sample_rate', 'sample_bits', 'channels' and 'autoconnect' can be configured for some input methods:
# sample_rate: fifo, pipewire, sndio, oss
# sample_bits: fifo, pipewire, sndio, oss
# channels: sndio, oss, jack
# autoconnect: jack
# Other methods ignore these settings.
# For pipewire, sample_rate will default to 48000, for all other input methods, sample_rate will default to 44100.
#
# For 'sndio' and 'oss' they are only preferred values, i.e. if the values are not supported
# by the chosen audio device, the device will use other supported values instead.
# Example: 48000, 32 and 2, but the device only supports 44100, 16 and 1, then it
# will use 44100, 16 and 1.
#
#
# The 'pipewire' input method has three options to control linking and mixing:
# active: Force the node to always process. Useful for monitoring sources when no other application is active.
# remix: Allow pipewire to remix audio channels to match cava's channel count. Useful for surround sound.
# virtual: Set the node to virtual, to avoid recording notifications from the DE.
#
; sample_rate = 44100
; sample_bits = 16
; channels = 2
; autoconnect = 2
; active = 1
; remix = 1
; virtual = 1
[output]
# Output method. Can be 'ncurses', 'noncurses', 'raw', 'noritake', 'sdl'
# or 'sdl_glsl'.
# 'noncurses' (default) uses a buffer and cursor movements to only print
# changes from frame to frame in the terminal. Uses less resources and is less
# prone to tearing (vsync issues) than 'ncurses'.
#
# 'raw' is an 8 or 16 bit (configurable via the 'bit_format' option) data
# stream of the bar heights that can be used to send to other applications.
# 'raw' defaults to 1024 bars stereo (512 bars mono), which can be adjusted in the 'bars' option above.
#
# 'noritake' outputs a bitmap in the format expected by a Noritake VFD display
# in graphic mode. It only support the 3000 series graphical VFDs for now.
#
# 'sdl' uses the Simple DirectMedia Layer to render in a graphical context.
# 'sdl_glsl' uses SDL to create an OpenGL context. Write your own shaders or
# use one of the predefined ones.
method = raw
# Orientation of the visualization. Can be 'bottom', 'top', 'left', 'right' or
# 'horizontal'. Default is 'bottom'. 'left and 'right' are only supported on sdl
# and ncruses output. 'horizontal' (bars go up and down from center) is only supported
# on noncurses output.
# Note: many fonts have weird or missing glyphs for characters used in orientations
# other than 'bottom', which can make output not look right.
; orientation = bottom
# Visual channels. Can be 'stereo' or 'mono'.
# 'stereo' mirrors both channels with low frequencies in center.
# 'mono' outputs left to right lowest to highest frequencies.
# 'mono_option' set mono to either take input from 'left', 'right' or 'average'.
# set 'reverse' to 1 to display frequencies the other way around.
channels = mono
mono_option = average
reverse = 0
# Only valid if orientation is set to 'horizontal'.
# Set 'horizontal_stereo' to 1 to have left channel bars at top and right channel at bottom.
# Set 'left_bottom' to 0 to have right channel at top and left channel at bottom.
; horizontal_stereo = 0
; left_bottom = 1
# Raw output target.
# On Linux, a fifo will be created if target does not exist.
# On Windows, a named pipe will be created if target does not exist.
raw_target = /tmp/cava.fifo
# Raw data format. Can be 'binary' or 'ascii'.
data_format = ascii
# Binary bit format, can be '8bit' (0-255) or '16bit' (0-65530).
; bit_format = 16bit
# Ascii max value. In 'ascii' mode range will run from 0 to value specified here
ascii_max_range = 100
# Ascii delimiters. In ascii format each bar and frame is separated by a delimiters.
# Use decimal value in ascii table (i.e. 59 = ';' and 10 = '\n' (line feed)).
bar_delimiter = 59
frame_delimiter = 10
# sdl window size and position. -1,-1 is centered.
; sdl_width = 1024
; sdl_height = 512
; sdl_x = -1
; sdl_y= -1
; sdl_full_screen = 0
# set label on bars on the x-axis. Can be 'frequency' or 'none'. Default: 'none'
# 'frequency' displays the lower cut off frequency of the bar above.
# Only supported on ncurses and noncurses output.
; xaxis = none
# enable synchronized sync. 1 = on, 0 = off
# removes flickering in alacritty terminal emulator.
# defaults to off since the behaviour in other terminal emulators is unknown
; synchronized_sync = 0
# Shaders for sdl_glsl, located in $HOME/.config/cava/shaders
; vertex_shader = pass_through.vert
; fragment_shader = bar_spectrum.frag
; for glsl output mode, keep rendering even if no audio
; continuous_rendering = 0
# disable console blank (screen saver) in tty
# (Not supported on FreeBSD)
; disable_blanking = 0
# show a flat bar at the bottom of the screen when idle, 1 = on, 0 = off
; show_idle_bar_heads = 1
# show waveform instead of frequency spectrum, 1 = on, 0 = off
; waveform = 0
[color]
# Colors can be one of seven predefined: black, blue, cyan, green, magenta, red, white, yellow.
# Or defined by hex code '#xxxxxx' (hex code must be within ''). User defined colors requires
# a terminal that can change color definitions such as Gnome-terminal or rxvt.
# default is to keep current terminal color
; background = default
; foreground = default
# SDL and sdl_glsl only support hex code colors, these are the default:
; background = '#111111'
; foreground = '#33ffff'
# Gradient mode, only hex defined colors are supported,
# background must also be defined in hex or remain commented out. 1 = on, 0 = off.
# You can define as many as 8 different colors. They range from bottom to top of screen
; gradient = 0
; gradient_color_1 = '#59cc33'
; gradient_color_2 = '#80cc33'
; gradient_color_3 = '#a6cc33'
; gradient_color_4 = '#cccc33'
; gradient_color_5 = '#cca633'
; gradient_color_6 = '#cc8033'
; gradient_color_7 = '#cc5933'
; gradient_color_8 = '#cc3333'
# Horizontal is only supported on noncurses output.
# Only one color will be calculated per bar.
; horizontal_gradient = 0
; horizontal_gradient_color_1 = '#c45161'
; horizontal_gradient_color_2 = '#e094a0'
; horizontal_gradient_color_3 = '#f2b6c0'
; horizontal_gradient_color_4 = '#f2dde1'
; horizontal_gradient_color_5 = '#cbc7d8'
; horizontal_gradient_color_6 = '#8db7d2'
; horizontal_gradient_color_7 = '#5e62a9'
; horizontal_gradient_color_8 = '#434279'
# If both vertical and horizontal gradient is enabled, vertical will be blended in this direction.
# Can be 'up', 'down', 'left' or 'right'. 'up' means the vertical gradient will be blended in from
# bottom to top. I.e. the bottom will be only the horizontal
# and top will be only the color of the vertical gradient.
; blend_direction = 'up'
# use theme file instead of defining colors in this file
# themes are located in $HOME/.config/cava/themes
; theme = 'none'
[smoothing]
# Percentage value for integral smoothing. Takes values from 0 - 100.
# Higher values means smoother, but less precise. 0 to disable.
# DEPRECATED as of 0.8.0, use noise_reduction instead
; integral = 77
# Disables or enables the so-called "Monstercat smoothing" with or without "waves". Set to 0 to disable.
; monstercat = 0
; waves = 0
# Set gravity percentage for "drop off". Higher values means bars will drop faster.
# Accepts only non-negative values. 50 means half gravity, 200 means double. Set to 0 to disable "drop off".
# DEPRECATED as of 0.8.0, use noise_reduction instead
gravity = 150
# In bar height, bars that would have been lower that this will not be drawn.
# DEPRECATED as of 0.8.0
; ignore = 0
# Noise reduction, int 0 - 100. default 77
# the raw visualization is very noisy, this factor adjusts the integral and gravity filters to keep the signal smooth
# 100 will be very slow and smooth, 0 will be fast but noisy.
; noise_reduction = 77
[eq]
# This one is tricky. You can have as much keys as you want.
# Remember to uncomment more than one key! More keys = more precision.
# Look at readme.md on github for further explanations and examples.
; 1 = 1 # bass
; 2 = 1
; 3 = 1 # midtone
; 4 = 1
; 5 = 1 # treble

332
cava/example_config Normal file
View File

@@ -0,0 +1,332 @@
## Configuration file for CAVA.
# Lines starting with ; show config parameters and default values.
# Remove the ; to change parameters.
[general]
# Auto reload config if the configuration file has changed. 1 = on, 0 = off.
; live-config = 0
# Accepts only non-negative values.
; framerate = 60
# 'autosens' will attempt to decrease sensitivity if the bars peak and increase slowly as
# long as the bars don't peak. 0 = off, 1 = normal, 2..n = more aggressive.
# increase to make sensitivity increase even faster.
; autosens = 1
# Manual sensitivity in %. If autosens is enabled, this will only be the initial value.
# 200 means double height. Accepts only non-negative values.
; sensitivity = 100
# The number of bars (0-512). 0 sets it to auto (fill up console).
# Bars' width and space between bars in number of characters.
; bars = 0
; bar_width = 2
; bar_spacing = 1
# bar_height is only used for output in "noritake" format
; bar_height = 32
# For SDL width and space between bars is in pixels, defaults are:
; bar_width = 20
; bar_spacing = 5
# sdl_glsl have these default values, they are only used to calculate max number of bars.
; bar_width = 1
; bar_spacing = 0
# center bars in terminal, if there is space.
center_align = 0
# max height of bars in terminal, in percent of terminal height.
; max_height = 100
# Lower and higher cutoff frequencies for lowest and highest bars
# the bandwidth of the visualizer.
# Note: there is a minimum total bandwidth of 43Mhz x number of bars.
# Cava will automatically increase the higher cutoff frequency if needed to satisfy the minimum bandwidth.
; lower_cutoff_freq = 50
; higher_cutoff_freq = 10000
# Seconds with no input before cava goes to sleep mode. Cava will not perform FFT or drawing and
# only check for input once per second. Cava will wake up once input is detected. 0 = disable.
; sleep_timer = 0
[input]
# Audio capturing method. Possible methods are: 'fifo', 'portaudio', 'pipewire', 'alsa', 'pulse', 'sndio', 'oss', 'jack' or 'shmem'
# Defaults to 'oss', 'pipewire', 'sndio', 'jack', 'pulse', 'alsa', 'portaudio' or 'fifo', in that order, dependent on what support cava was built with.
# On Mac it defaults to 'portaudio' or 'fifo'
# On Windows this is automatic and no input settings are needed.
#
# Each input method uses the same config variable 'source'
# to define where it should get the audio.
#
# For pulseaudio and pipewire 'source' will be the source. Default: 'auto', which uses the monitor source of the default sink
# (all pulseaudio sinks(outputs) have 'monitor' sources(inputs) associated with them).
#
# For pipewire 'source' will be the object name or object.serial of the device to capture from.
# Both input and output devices are supported. To capture the monitor source of a sink node, append '.monitor' to the sink's object name.
#
# For alsa 'source' will be the capture device.
# For fifo 'source' will be the path to fifo-file.
# For shmem 'source' will be /squeezelite-AA:BB:CC:DD:EE:FF where 'AA:BB:CC:DD:EE:FF' will be squeezelite's MAC address
#
# For sndio 'source' will be a raw recording audio descriptor or a monitoring sub-device, e.g. 'rsnd/2' or 'snd/1'. Default: 'default'.
# README.md contains further information on how to setup CAVA for sndio.
#
# For oss 'source' will be the path to a audio device, e.g. '/dev/dsp2'. Default: '/dev/dsp', i.e. the default audio device.
# README.md contains further information on how to setup CAVA for OSS on FreeBSD.
#
# For jack 'source' will be the name of the JACK server to connect to, e.g. 'foobar'. Default: 'default'.
# README.md contains further information on how to setup CAVA for JACK.
#
; method = pulse
; source = auto
; method = pipewire
; source = auto
; method = alsa
; source = hw:Loopback,1
; method = fifo
; source = /tmp/mpd.fifo
; method = shmem
; source = /squeezelite-AA:BB:CC:DD:EE:FF
; method = portaudio
; source = auto
; method = sndio
; source = default
; method = oss
; source = /dev/dsp
; method = jack
; source = default
# The options 'sample_rate', 'sample_bits', 'channels' and 'autoconnect' can be configured for some input methods:
# sample_rate: fifo, pipewire, sndio, oss
# sample_bits: fifo, pipewire, sndio, oss
# channels: sndio, oss, jack
# autoconnect: jack
# Other methods ignore these settings.
# For pipewire, sample_rate will default to 48000, for all other input methods, sample_rate will default to 44100.
#
# For 'sndio' and 'oss' they are only preferred values, i.e. if the values are not supported
# by the chosen audio device, the device will use other supported values instead.
# Example: 48000, 32 and 2, but the device only supports 44100, 16 and 1, then it
# will use 44100, 16 and 1.
#
#
# The 'pipewire' input method has three options to control linking and mixing:
# active: Force the node to always process. Useful for monitoring sources when no other application is active.
# remix: Allow pipewire to remix audio channels to match cava's channel count. Useful for surround sound.
# virtual: Set the node to virtual, to avoid recording notifications from the DE.
#
; sample_rate = 44100
; sample_bits = 16
; channels = 2
; autoconnect = 2
; active = 1
; remix = 1
; virtual = 1
[output]
# Output method. Can be 'ncurses', 'noncurses', 'raw', 'noritake', 'sdl'
# or 'sdl_glsl'.
# 'noncurses' (default) uses a buffer and cursor movements to only print
# changes from frame to frame in the terminal. Uses less resources and is less
# prone to tearing (vsync issues) than 'ncurses'.
#
# 'raw' is an 8 or 16 bit (configurable via the 'bit_format' option) data
# stream of the bar heights that can be used to send to other applications.
# 'raw' defaults to 1024 bars stereo (512 bars mono), which can be adjusted in the 'bars' option above.
#
# 'noritake' outputs a bitmap in the format expected by a Noritake VFD display
# in graphic mode. It only support the 3000 series graphical VFDs for now.
#
# 'sdl' uses the Simple DirectMedia Layer to render in a graphical context.
# 'sdl_glsl' uses SDL to create an OpenGL context. Write your own shaders or
# use one of the predefined ones.
; method = noncurses
# Orientation of the visualization. Can be 'bottom', 'top', 'left', 'right' or
# 'horizontal'. Default is 'bottom'. 'left and 'right' are only supported on sdl
# and ncurses output. 'horizontal' (bars go up and down from center) is only supported
# on noncurses output.
# Note: many fonts have weird or missing glyphs for characters used in orientations
# other than 'bottom', which can make output not look right.
orientation = bottom
# Visual channels. Can be 'stereo' or 'mono'.
# 'stereo' mirrors both channels with low frequencies in center.
# 'mono' outputs left to right lowest to highest frequencies.
# 'mono_option' set mono to either take input from 'left', 'right' or 'average'.
# set 'reverse' to 1 to display frequencies the other way around.
channels = mono
mono_option = average
reverse = 0
# Only valid if orientation is set to 'horizontal'.
# Set 'horizontal_stereo' to 1 to have left channel bars at top and right channel at bottom.
# Set 'left_bottom' to 0 to have right channel at top and left channel at bottom.
; horizontal_stereo = 0
; left_bottom = 1
# Raw output target.
# On Linux, a fifo will be created if target does not exist.
# On Windows, a named pipe will be created if target does not exist.
; raw_target = /dev/stdout
# Raw data format. Can be 'binary' or 'ascii'.
; data_format = binary
# Binary bit format, can be '8bit' (0-255) or '16bit' (0-65530).
; bit_format = 16bit
# Ascii max value. In 'ascii' mode range will run from 0 to value specified here
; ascii_max_range = 1000
# Ascii delimiters. In ascii format each bar and frame is separated by a delimiter.
# Use decimal value in ascii table (i.e. 59 = ';' and 10 = '\n' (line feed)).
; bar_delimiter = 59
; frame_delimiter = 10
# sdl window size and position. -1,-1 is centered.
; sdl_width = 1024
; sdl_height = 512
; sdl_x = -1
; sdl_y= -1
; sdl_full_screen = 0
# set label on bars on the x-axis. Can be 'frequency' or 'none'. Default: 'none'
# 'frequency' displays the lower cut off frequency of the bar above.
# Only supported on ncurses and noncurses output.
; xaxis = none
# enable synchronized sync. 1 = on, 0 = off
# removes flickering in alacritty terminal emulator.
# defaults to off since the behaviour in other terminal emulators is unknown
; synchronized_sync = 0
# Shaders for sdl_glsl, located in $HOME/.config/cava/shaders
; vertex_shader = pass_through.vert
# Default spectrum shader
# default value: bar_spectrum.frag
; fragment_shader = bar_spectrum.frag
# other styles shaders
; fragment_shader = eye_of_phi.frag
; fragment_shader = northern_lights.frag
; fragment_shader = spectrogram.frag
; fragment_shader = winamp_line_style_spectrum.frag
# Orion shaders (use with: method = sdl_glsl)
# Static Orion
; fragment_shader = orion_circle.frag
# Rotating Orion
; fragment_shader = orion_circle_rotate.frag
# Orion saturn subring
; fragment_shader = orion_saturn_subring.frag
# Orion saturn core
; fragment_shader = orion_saturn_core.frag
# For glsl output mode, keep rendering even if no audio. 1 = on, 0 = off. Default: 0
# Enable for animated shaders so time-based effects keep updating.
; continuous_rendering = 0
# SDL_GLSL only: gain applied to bar amplitudes before sending to shaders, in percent. Default: 100
# 0 = mute, 100 = unchanged, >100 = amplify (shader input is clamped to the [0..1] range).
; sdl_glsl_gain = 100
# disable console blank (screen saver) in tty. 1 = on, 0 = off. Default: 0
# (Not supported on FreeBSD)
; disable_blanking = 0
# show a flat bar at the bottom of the screen when idle, 1 = on, 0 = off
; show_idle_bar_heads = 1
# show waveform instead of frequency spectrum, 1 = on, 0 = off
; waveform = 0
[color]
# Colors can be one of seven predefined: black, blue, cyan, green, magenta, red, white, yellow.
# Or defined by hex code '#xxxxxx' (hex code must be within ''). User defined colors require
# a terminal that can change color definitions such as Gnome-terminal or rxvt.
# default is to keep current terminal color
; background = default
; foreground = default
# SDL and sdl_glsl only support hex code colors, these are the default:
; background = '#111111'
; foreground = '#33ffff'
# Gradient mode, only hex defined colors are supported,
# background must also be defined in hex or remain commented out. 1 = on, 0 = off.
# You can define as many as 8 different colors. They range from bottom to top of the screen
; gradient = 0
; gradient_color_1 = '#59cc33'
; gradient_color_2 = '#80cc33'
; gradient_color_3 = '#a6cc33'
; gradient_color_4 = '#cccc33'
; gradient_color_5 = '#cca633'
; gradient_color_6 = '#cc8033'
; gradient_color_7 = '#cc5933'
; gradient_color_8 = '#cc3333'
# Horizontal is only supported on noncurses output.
# Only one color will be calculated per bar.
; horizontal_gradient = 0
; horizontal_gradient_color_1 = '#c45161'
; horizontal_gradient_color_2 = '#e094a0'
; horizontal_gradient_color_3 = '#f2b6c0'
; horizontal_gradient_color_4 = '#f2dde1'
; horizontal_gradient_color_5 = '#cbc7d8'
; horizontal_gradient_color_6 = '#8db7d2'
; horizontal_gradient_color_7 = '#5e62a9'
; horizontal_gradient_color_8 = '#434279'
# If both vertical and horizontal gradients are enabled, the vertical one will be blended in this direction.
# Can be 'up', 'down', 'left' or 'right'. 'up' means the vertical gradient will be blended in from
# bottom to top. I.e. the bottom will only be the horizontal
# and top will only be the vertical color of the gradient.
; blend_direction = 'up'
# use theme file instead of defining colors in this file
# themes are located in $HOME/.config/cava/themes
; theme = 'none'
[smoothing]
# Disables or enables the so-called "Monstercat smoothing" with or without "waves". Set to 0 to disable.
; monstercat = 0
; waves = 0
# Noise reduction, int 0 - 100. default 77
# the raw visualization is very noisy, this factor adjusts the integral and gravity filters to keep the signal smooth
# 100 will be very slow and smooth, 0 will be fast but noisy.
; noise_reduction = 77
[eq]
# This one is tricky. You can have as many keys as you want.
# Remember to uncomment more than one key! More keys = more precision.
# Look at readme.md on github for further explanations and examples.
; 1 = 1 # bass
; 2 = 1
; 3 = 1 # midtone
; 4 = 1
; 5 = 1 # treble

View File

@@ -0,0 +1,73 @@
#version 330
in vec2 fragCoord;
out vec4 fragColor;
// bar values. defaults to left channels first (low to high), then right (high to low).
uniform float bars[512];
uniform int bars_count; // number of bars (left + right) (configurable)
uniform int bar_width; // bar width (configurable), not used here
uniform int bar_spacing; // space between bars (configurable)
uniform vec3 u_resolution; // window resolution
// colors, configurable in cava config file (r,g,b) (0.0 - 1.0)
uniform vec3 bg_color; // background color
uniform vec3 fg_color; // foreground color
uniform int gradient_count;
uniform vec3 gradient_colors[8]; // gradient colors
uniform float shader_time; // shader execution time s (not used here)
uniform sampler2D inputTexture; // Texture from the last render pass (not used here)
vec3 normalize_C(float y, vec3 col_1, vec3 col_2, float y_min, float y_max) {
// create color based on fraction of this color and next color
float yr = (y - y_min) / (y_max - y_min);
return col_1 * (1.0 - yr) + col_2 * yr;
}
void main() {
// find which bar to use based on where we are on the x axis
float x = u_resolution.x * fragCoord.x;
int bar = int(bars_count * fragCoord.x);
// calculate a bar size
float bar_size = u_resolution.x / bars_count;
// the y coordinate and bar values are the same
float y = bars[bar];
// make sure there is a thin line at bottom
if (y * u_resolution.y < 1.0) {
y = 1.0 / u_resolution.y;
}
// draw the bar up to current height
if (y > fragCoord.y) {
// make some space between bars basen on settings
if (x > (bar + 1) * (bar_size)-bar_spacing) {
fragColor = vec4(bg_color, 1.0);
} else {
if (gradient_count == 0) {
fragColor = vec4(fg_color, 1.0);
} else {
// find which color in the configured gradient we are at
int color = int((gradient_count - 1) * fragCoord.y);
// find where on y this and next color is supposed to be
float y_min = color / (gradient_count - 1.0);
float y_max = (color + 1.0) / (gradient_count - 1.0);
// make color
fragColor = vec4(normalize_C(fragCoord.y, gradient_colors[color],
gradient_colors[color + 1], y_min, y_max),
1.0);
}
}
} else {
fragColor = vec4(bg_color, 1.0);
}
}

View File

@@ -0,0 +1,117 @@
#version 330
// this shader was stolen from shadertoy user ChunderFPV
#define SCALE 8.0
#define PI radians(180.0)
#define TAU (PI * 2.0)
#define CS(a) vec2(cos(a), sin(a))
#define PT(u, r) smoothstep(0.0, r, r - length(u))
in vec2 fragCoord;
out vec4 fragColor;
uniform float bars[512];
uniform int bars_count; // number of bars (left + right) (configurable)
uniform float shader_time; // shader execution time s
uniform int bar_width; // bar width (configurable), not used here
uniform int bar_spacing; // space between bars (configurable)
uniform vec3 u_resolution; // window resolution
// colors, configurable in cava config file (r,g,b) (0.0 - 1.0)
uniform vec3 bg_color; // background color
uniform vec3 fg_color; // foreground color
uniform int gradient_count;
uniform vec3 gradient_colors[8]; // gradient colors
// gradient map ( color, equation, time, width, shadow, reciprocal )
vec3 gm(vec3 c, float n, float t, float w, float d, bool i) {
float g = min(abs(n), 1.0 / abs(n));
float s = abs(sin(n * PI - t));
if (i)
s = min(s, abs(sin(PI / n + t)));
return (1.0 - pow(abs(s), w)) * c * pow(g, d) * 6.0;
}
// denominator spiral, use 1/n for numerator
// ( screen xy, spiral exponent, decimal, line width, hardness, rotation )
float ds(vec2 u, float e, float n, float w, float h, float ro) {
float ur = length(u); // unit radius
float sr = pow(ur, e); // spiral radius
float a = round(sr) * n * TAU; // arc
vec2 xy = CS(a + ro) * ur; // xy coords
float l = PT(u - xy, w); // line
float s = mod(sr + 0.5, 1.0); // gradient smooth
s = min(s, 1.0 - s); // darken filter
return l * s * h;
}
void main() {
float t = shader_time / PI * 2.0;
vec4 m = vec4(0, 0, 0, 0); // iMouse;
m.xy = m.xy * 2.0 / u_resolution.xy - 1.0; // ±1x, ±1y
if (m.z > 0.0)
t += m.y * SCALE; // move time with mouse y
float z = (m.z > 0.0) ? pow(1.0 - abs(m.y), sign(m.y)) : 1.0; // zoom (+)
float e = (m.z > 0.0) ? pow(1.0 - abs(m.x), -sign(m.x))
: 1.0; // screen exponent (+)
float se = (m.z > 0.0) ? e * -sign(m.y) : 1.0; // spiral exponent
vec3 bg = vec3(0); // black background
float aa = 3.0; // anti-aliasing
for (float j = 0.0; j < aa; j++)
for (float k = 0.0; k < aa; k++) {
vec3 c = vec3(0);
vec2 o = vec2(j, k) / aa;
vec2 uv = (fragCoord * u_resolution.xy - 0.5 * u_resolution.xy + o) /
u_resolution.y * SCALE * z; // apply cartesian, scale and zoom
if (m.z > 0.0)
uv =
exp(log(abs(uv)) * e) * sign(uv); // warp screen space with exponent
float px = length(fwidth(uv)); // pixel width
float x = uv.x; // every pixel on x
float y = uv.y; // every pixel on y
float l = length(uv); // hypot of xy: sqrt(x*x+y*y)
float mc = (x * x + y * y - 1.0) / y; // metallic circle at xy
float g = min(abs(mc), 1.0 / abs(mc)); // gradient
vec3 gold = vec3(1.0, 0.6, 0.0) * g * l;
vec3 blue = vec3(0.3, 0.5, 0.9) * (1.0 - g);
vec3 rgb = max(gold, blue);
float w = 0.1; // line width
float d = 0.4; // shadow depth
c = max(c, gm(rgb, mc, -t, w * bars[0], d, false)); // metallic
c = max(c, gm(rgb, abs(y / x) * sign(y), -t, w * bars[1], d,
false)); // tangent
c = max(c, gm(rgb, (x * x) / (y * y) * sign(y), -t, w * bars[2], d,
false)); // sqrt cotangent
c = max(c, gm(rgb, (x * x) + (y * y), t, w * bars[3], d,
true)); // sqrt circles
c += rgb * ds(uv, se, t / TAU, px * 2.0 * bars[4], 2.0, 0.0); // spiral 1a
c += rgb * ds(uv, se, t / TAU, px * 2.0 * bars[5], 2.0, PI); // spiral 1b
c +=
rgb * ds(uv, -se, t / TAU, px * 2.0 * bars[6], 2.0, 0.0); // spiral 2a
c += rgb * ds(uv, -se, t / TAU, px * 2.0 * bars[7], 2.0, PI); // spiral 2b
c = max(c, 0.0); // clear negative color
c += pow(max(1.0 - l, 0.0), 3.0 / z); // center glow
if (m.z > 0.0) // display grid on click
{
vec2 xyg = abs(fract(uv + 0.5) - 0.5) / px; // xy grid
c.gb += 0.2 * (1.0 - min(min(xyg.x, xyg.y), 1.0));
}
bg += c;
}
bg /= aa * aa;
bg *= sqrt(bg) * 1.5;
fragColor = vec4(bg, 1.0);
}

View File

@@ -0,0 +1,34 @@
#version 330
in vec2 fragCoord;
out vec4 fragColor;
// bar values. defaults to left channels first (low to high), then right (high to low).
uniform float bars[512];
uniform int bars_count; // number of bars (left + right) (configurable)
uniform vec3 u_resolution; // window resolution, not used here
//colors, configurable in cava config file
uniform vec3 bg_color; // background color(r,g,b) (0.0 - 1.0), not used here
uniform vec3 fg_color; // foreground color, not used here
void main()
{
// find which bar to use based on where we are on the x axis
int bar = int(bars_count * fragCoord.x);
float bar_y = 1.0 - abs((fragCoord.y - 0.5)) * 2.0;
float y = (bars[bar]) * bar_y;
float bar_x = (fragCoord.x - float(bar) / float(bars_count)) * bars_count;
float bar_r = 1.0 - abs((bar_x - 0.5)) * 2;
bar_r = bar_r * bar_r * 2;
// set color
fragColor.r = fg_color.x * y * bar_r;
fragColor.g = fg_color.y * y * bar_r;
fragColor.b = fg_color.z * y * bar_r;
}

View File

@@ -0,0 +1,14 @@
#version 330
// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;
// Output data ; will be interpolated for each fragment.
out vec2 fragCoord;
void main()
{
gl_Position = vec4(vertexPosition_modelspace,1);
fragCoord = (vertexPosition_modelspace.xy+vec2(1,1))/2.0;
}

View File

@@ -0,0 +1,53 @@
#version 330
in vec2 fragCoord;
out vec4 fragColor;
// bar values. defaults to left channels first (low to high), then right (high
// to low).
uniform float bars[512];
uniform int bars_count; // number of bars (left + right) (configurable)
uniform int bar_width; // bar width (configurable), not used here
uniform int bar_spacing; // space between bars (configurable)
uniform vec3 u_resolution; // window resolution
// colors, configurable in cava config file (r,g,b) (0.0 - 1.0)
uniform vec3 bg_color; // background color
uniform vec3 fg_color; // foreground color
uniform int gradient_count;
uniform vec3 gradient_colors[8]; // gradient colors
uniform sampler2D inputTexture; // Texture from the last render pass
vec3 normalize_C(float y, vec3 col_1, vec3 col_2, float y_min, float y_max) {
// create color based on fraction of this color and next color
float yr = (y - y_min) / (y_max - y_min);
return col_1 * (1.0 - yr) + col_2 * yr;
}
void main() {
// find which bar to use based on where we are on the y axis
int bar = int(bars_count * fragCoord.y);
float y = bars[bar];
float band_size = 1.0 / float(bars_count);
float current_band_min = bar * band_size;
float current_band_max = (bar + 1) * band_size;
int hist_length = 512;
float win_size = 1.0 / hist_length;
if (fragCoord.x > 1.0 - win_size) {
if (fragCoord.y > current_band_min && fragCoord.y < current_band_max) {
fragColor = vec4(fg_color * y, 1.0);
}
} else {
vec2 offsetCoord = fragCoord;
offsetCoord.x += float(win_size);
fragColor = texture(inputTexture, offsetCoord);
}
}

View File

@@ -0,0 +1,112 @@
#version 330
// Emulate the "line style" spectrum analyzer from Winamp 2.
// Try this config for a demonstration:
/*
[general]
bar_width = 2
bar_spacing = 0
higher_cutoff_freq = 22000
[output]
method = sdl_glsl
channels = mono
fragment_shader = winamp_line_style_spectrum.frag
[color]
background = '#000000'
gradient = 1
gradient_color_1 = '#319C08'
gradient_color_2 = '#29CE10'
gradient_color_3 = '#BDDE29'
gradient_color_4 = '#DEA518'
gradient_color_5 = '#D66600'
gradient_color_6 = '#CE2910'
[smoothing]
noise_reduction = 10
*/
in vec2 fragCoord;
out vec4 fragColor;
// bar values. defaults to left channels first (low to high), then right (high to low).
uniform float bars[512];
uniform int bars_count; // number of bars (left + right) (configurable)
uniform int bar_width; // bar width (configurable), not used here
uniform int bar_spacing; // space between bars (configurable)
uniform vec3 u_resolution; // window resolution
//colors, configurable in cava config file (r,g,b) (0.0 - 1.0)
uniform vec3 bg_color; // background color
uniform vec3 fg_color; // foreground color
uniform int gradient_count;
uniform vec3 gradient_colors[8]; // gradient colors
vec3 normalize_C(float y,vec3 col_1, vec3 col_2, float y_min, float y_max)
{
//create color based on fraction of this color and next color
float yr = (y - y_min) / (y_max - y_min);
return col_1 * (1.0 - yr) + col_2 * yr;
}
void main()
{
// find which bar to use based on where we are on the x axis
float x = u_resolution.x * fragCoord.x;
int bar = int(bars_count * fragCoord.x);
//calculate a bar size
float bar_size = u_resolution.x / bars_count;
//the y coordinate is stretched by 4X to resemble Winamp
float y = min(bars[bar] * 4.0, 1.0);
// make sure there is a thin line at bottom
if (y * u_resolution.y < 1.0)
{
y = 1.0 / u_resolution.y;
}
vec4 bar_color;
if (gradient_count == 0)
{
bar_color = vec4(fg_color,1.0);
}
else
{
//find color in the configured gradient for the top of the bar
int color = int((gradient_count - 1) * y);
//find where on y this and next color is supposed to be
float y_min = float(color) / (gradient_count - 1.0);
float y_max = float(color + 1) / (gradient_count - 1.0);
//make a solid color for the entire bar
bar_color = vec4(normalize_C(y, gradient_colors[color], gradient_colors[color + 1], y_min, y_max), 1.0);
}
//draw the bar up to current height
if (y > fragCoord.y)
{
//make some space between bars based on settings
if (x > (bar + 1) * (bar_size) - bar_spacing)
{
fragColor = vec4(bg_color,1.0);
}
else
{
fragColor = bar_color;
}
}
else
{
fragColor = vec4(bg_color,1.0);
}
}

View File

@@ -0,0 +1,15 @@
[color]
background = '#001e26'
foreground = '#708183'
gradient = 1
gradient_color_1 = '#268bd2'
gradient_color_2 = '#6c71c4'
gradient_color_3 = '#cb4b16'
horizontal_gradient = 1
horizontal_gradient_color_1 = '#586e75'
horizontal_gradient_color_2 = '#b58900'
horizontal_gradient_color_3 = '#839496'
blend_direction = 'up'

10
cava/themes/tricolor Normal file
View File

@@ -0,0 +1,10 @@
[color]
horizontal_gradient = 1
horizontal_gradient_color_1 = '#c45161'
horizontal_gradient_color_2 = '#e094a0'
horizontal_gradient_color_3 = '#f2b6c0'
horizontal_gradient_color_4 = '#f2dde1'
horizontal_gradient_color_5 = '#cbc7d8'
horizontal_gradient_color_6 = '#8db7d2'
horizontal_gradient_color_7 = '#5e62a9'
horizontal_gradient_color_8 = '#434279'

7
hypr/autostart.conf Normal file
View File

@@ -0,0 +1,7 @@
exec-once = /usr/lib/hyprpolkitagent/hyprpolkitagent # authentication
exec-once = /usr/bin/qs & # quickshell
# exec-once = hyprpaper # wallpaper
exec-once = awww-daemon # wallpaper
exec-once = hyprsunset # night light
exec-once = qs -c overview # workspace switcher https://github.com/Shanu-Kumawat/quickshell-overview
# exec-once = cava -p ~/.config/cava/config

5
hypr/environment.conf Normal file
View File

@@ -0,0 +1,5 @@
# See https://wiki.hypr.land/Configuring/Environment-variables/
env = XCURSOR_SIZE,24
env = HYPRCURSOR_SIZE,24
env = QT_QPA_PLATFORMTHEME,qt6ct

View File

@@ -17,337 +17,13 @@
# source = ~/.config/hypr/myColors.conf # source = ~/.config/hypr/myColors.conf
source = ~/linux-dotfiles/hypr/monitors.conf source = ~/linux-dotfiles/hypr/monitors.conf
source = colors.conf
################### source = programs.conf
### MY PROGRAMS ### source = autostart.conf
################### source = environment.conf
# See https://wiki.hypr.land/Configuring/Keywords/ source = permissions.conf
source = look-and-feel.conf
# Set programs that you use source = input.conf
$terminal = kitty source = keybindings.conf
$fileManager = dolphin source = window-rules.conf
$menu = rofi -show run
$programs = rofi -show drun
#################
### AUTOSTART ###
#################
# Autostart necessary processes (like notifications daemons, status bars, etc.)
# Or execute your favorite apps at launch like this:
# exec-once = $terminal
# exec-once = nm-applet &
# exec-once = waybar & hyprpaper & firefox
exec-once = /usr/lib/hyprpolkitagent/hyprpolkitagent # authentication
exec-once = /usr/bin/qs & # quickshell
# exec-once = hyprpaper # wallpaper
exec-once = awww-daemon # wallpaper
#############################
### ENVIRONMENT VARIABLES ###
#############################
# See https://wiki.hypr.land/Configuring/Environment-variables/
env = XCURSOR_SIZE,24
env = HYPRCURSOR_SIZE,24
###################
### PERMISSIONS ###
###################
# See https://wiki.hypr.land/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.hypr.land/Configuring/Variables/
# https://wiki.hypr.land/Configuring/Variables/#general
general {
gaps_in = 5
gaps_out = 20
border_size = 2
# https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors
col.active_border = rgba(d2519cee) rgba(dd94ffee) 45deg
col.inactive_border = rgba(d2519caa)
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = false
# Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on
allow_tearing = false
layout = dwindle
}
# https://wiki.hypr.land/Configuring/Variables/#decoration
decoration {
rounding = 5
rounding_power = 2
# Change transparency of focused and unfocused windows
active_opacity = 1.0
inactive_opacity = 0.85
shadow {
enabled = true
range = 4
render_power = 3
color = rgba(1a1a1aee)
}
# https://wiki.hypr.land/Configuring/Variables/#blur
blur {
enabled = truef
size = 10
passes = 2
noise = 0.0117
popups = false
vibrancy = 0.1696
new_optimizations = true
}
}
# https://wiki.hypr.land/Configuring/Variables/#animations
animations {
enabled = yes, please :)
# Default curves, see https://wiki.hypr.land/Configuring/Animations/#curves
# NAME, X0, Y0, X1, Y1
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
bezier = quick, 0.15, 0, 0.1, 1
# Default animations, see https://wiki.hypr.land/Configuring/Animations/
# NAME, ONOFF, SPEED, CURVE, [STYLE]
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
animation = zoomFactor, 1, 7, quick
}
# Ref https://wiki.hypr.land/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 {
# name = no-gaps-wtv1
# match:float = false
# match:workspace = w[tv1]
#
# border_size = 0
# rounding = 0
# }
#
# windowrule {
# name = no-gaps-f1
# match:float = false
# match:workspace = f[1]
#
# border_size = 0
# rounding = 0
# }
# See https://wiki.hypr.land/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.hypr.land/Configuring/Master-Layout/ for more
master {
new_status = master
}
# https://wiki.hypr.land/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.hypr.land/Configuring/Variables/#input
input {
kb_layout = us
kb_variant =
kb_model =
kb_options =
kb_rules =
follow_mouse = 1
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
touchpad {
natural_scroll = false
}
}
# See https://wiki.hypr.land/Configuring/Gestures
gesture = 3, horizontal, workspace
# Example per-device config
# See https://wiki.hypr.land/Configuring/Keywords/#per-device-input-configs for more
device {
name = epic-mouse-v1
sensitivity = -0.5
}
###################
### KEYBINDINGS ###
###################
# See https://wiki.hypr.land/Configuring/Keywords/
$mainMod = SUPER # Sets "Windows" key as main modifier
# Example binds, see https://wiki.hypr.land/Configuring/Binds/ for more
bind = $mainMod, Return, exec, $terminal
bind = $mainMod SHIFT, C, killactive,
bind = $mainMod ALT SHIFT, L, exec, command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch exit
bind = $mainMod, E, exec, $fileManager
bind = $mainMod, M, fullscreen, 1
bind = $mainMod SHIFT, M, togglefloating,
bind = $mainMod, R, exec, $menu
bind = $mainMod, P, exec, $programs
bind = $mainMod, L, layoutmsg, togglesplit # dwindle
# Move focus with mainMod + arrow keys
bind = $mainMod, J, cyclenext
bind = $mainMod, K, cyclenext, prev
# bind = $mainMod, o, movefocus, u
bind = $mainMod SHIFT, o, movefocus, d
bind = $mainMod SHIFT, J, swapnext
bind = $mainMod SHIFT, K, swapnext, prev
# Switch workspaces with mainMod + [0-9]
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
bind = $mainMod, 7, workspace, 7
bind = $mainMod, 8, workspace, 8
bind = $mainMod, 9, workspace, 9
bind = $mainMod, 0, workspace, 10
# Move active window to a workspace with mainMod + SHIFT + [0-9]
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
bind = $mainMod SHIFT, 7, movetoworkspace, 7
bind = $mainMod SHIFT, 8, movetoworkspace, 8
bind = $mainMod SHIFT, 9, movetoworkspace, 9
bind = $mainMod SHIFT, 0, movetoworkspace, 10
# Example special workspace (scratchpad)
# bind = $mainMod, S, togglespecialworkspace, magic
# bind = $mainMod SHIFT, S, movetoworkspace, special:magic
# 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 = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioPause, exec, playerctl play-pause
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPrev, exec, playerctl previous
# applications
bind = $mainMod SHIFT, S, exec, flameshot
##############################
### WINDOWS AND WORKSPACES ###
##############################
# See https://wiki.hypr.land/Configuring/Window-Rules/ for more
# See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules
# Example windowrules that are useful
windowrule {
# Ignore maximize requests from all apps. You'll probably like this.
name = suppress-maximize-events
match:class = .*
suppress_event = maximize
}
windowrule {
# Fix some dragging issues with XWayland
name = fix-xwayland-drags
match:class = ^$
match:title = ^$
match:xwayland = true
match:float = true
match:fullscreen = false
match:pin = false
no_focus = true
}
# Hyprland-run windowrule
windowrule {
name = move-hyprland-run
match:class = hyprland-run
move = 20 monitor_h-120
float = yes
}

18
hypr/hyprsunset.conf Normal file
View File

@@ -0,0 +1,18 @@
max-gamma = 150
profile {
time = 6:00
identity = true
}
profile {
time = 18:00
temperature = 3500
gamma = 1.0
}
profile {
time = 23:00
temperature = 3000
gamma = 0.8
}

30
hypr/input.conf Normal file
View File

@@ -0,0 +1,30 @@
#############
### INPUT ###
#############
# https://wiki.hypr.land/Configuring/Variables/#input
input {
kb_layout = us
kb_variant = intl
kb_model =
kb_options =
kb_rules =
follow_mouse = 1
sensitivity = -0.8 # -1.0 - 1.0, 0 means no modification.
touchpad {
natural_scroll = false
}
}
# See https://wiki.hypr.land/Configuring/Gestures
gesture = 3, horizontal, workspace
# Example per-device config
# See https://wiki.hypr.land/Configuring/Keywords/#per-device-input-configs for more
device {
name = epic-mouse-v1
sensitivity = -0.5
}

87
hypr/keybindings.conf Normal file
View File

@@ -0,0 +1,87 @@
###################
### KEYBINDINGS ###
###################
# See https://wiki.hypr.land/Configuring/Keywords/
$mainMod = SUPER # Sets "Windows" key as main modifier
# Example binds, see https://wiki.hypr.land/Configuring/Binds/ for more
bind = $mainMod, Return, exec, $terminal
bind = $mainMod SHIFT, C, killactive,
bind = $mainMod ALT SHIFT, L, exec, command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch exit
bind = $mainMod, E, exec, $fileManager
bind = $mainMod, M, fullscreen, 1
bind = $mainMod SHIFT, M, togglefloating,
bind = $mainMod, R, exec, $menu
bind = $mainMod, P, exec, $programs
bind = $mainMod, L, layoutmsg, togglesplit # dwindle
bind = $mainMod, code:47, exec, rofi -show emoji
bind = $mainMod, TAB, exec, qs ipc -c overview call overview toggle
# Move focus with mainMod + arrow keys
bind = $mainMod, J, cyclenext
bind = $mainMod, K, cyclenext, prev
# bind = $mainMod, o, movefocus, u
bind = $mainMod SHIFT, o, movefocus, d
bind = $mainMod SHIFT, J, swapnext
bind = $mainMod SHIFT, K, swapnext, prev
bind = $mainMod, F, fullscreen, toggle
# Switch workspaces with mainMod + [0-9]
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
bind = $mainMod, 7, workspace, 7
bind = $mainMod, 8, workspace, 8
bind = $mainMod, 9, workspace, 9
bind = $mainMod, 0, workspace, 10
# Move active window to a workspace with mainMod + SHIFT + [0-9]
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
bind = $mainMod SHIFT, 7, movetoworkspace, 7
bind = $mainMod SHIFT, 8, movetoworkspace, 8
bind = $mainMod SHIFT, 9, movetoworkspace, 9
bind = $mainMod SHIFT, 0, movetoworkspace, 10
bind = $mainMod, left, workspace, -1
bind = $mainMod, right, workspace, +1
bind = $mainMod SHIFT, left, movetoworkspace, -1
bind = $mainMod SHIFT, right, movetoworkspace, +1
# Example special workspace (scratchpad)
# bind = $mainMod, S, togglespecialworkspace, magic
# bind = $mainMod SHIFT, S, movetoworkspace, special:magic
# 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 = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioPause, exec, playerctl play-pause
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPrev, exec, playerctl previous
# applications
bind = $mainMod SHIFT, S, exec, grimblast copysave area

141
hypr/look-and-feel.conf Normal file
View File

@@ -0,0 +1,141 @@
#####################
### LOOK AND FEEL ###
#####################
# Refer to https://wiki.hypr.land/Configuring/Variables/
# https://wiki.hypr.land/Configuring/Variables/#general
general {
gaps_in = 5
gaps_out = 20
border_size = 2
# https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors
col.active_border = $inverse_primary
col.inactive_border = $on_secondary
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = false
# Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on
allow_tearing = false
layout = dwindle
}
# https://wiki.hypr.land/Configuring/Variables/#decoration
decoration {
rounding = 5
rounding_power = 2
# Change transparency of focused and unfocused windows
active_opacity = 1.0
inactive_opacity = 0.85
shadow {
enabled = true
range = 4
render_power = 3
color = rgba(1a1a1aee)
}
# https://wiki.hypr.land/Configuring/Variables/#blur
blur {
enabled = true
size = 10
passes = 2
noise = 0.0117
popups = false
vibrancy = 0.1696
new_optimizations = true
}
}
# https://wiki.hypr.land/Configuring/Variables/#animations
animations {
enabled = yes, please :)
# Default curves, see https://wiki.hypr.land/Configuring/Animations/#curves
# NAME, X0, Y0, X1, Y1
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
bezier = quick, 0.15, 0, 0.1, 1
# Default animations, see https://wiki.hypr.land/Configuring/Animations/
# NAME, ONOFF, SPEED, CURVE, [STYLE]
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, easeOutQuint, slide
animation = workspacesIn, 1, 1.21, easeOutQuint, slide
animation = workspacesOut, 1, 1.94, easeOutQuint, slide
animation = zoomFactor, 1, 7, quick
}
# Ref https://wiki.hypr.land/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 {
# name = no-gaps-wtv1
# match:float = false
# match:workspace = w[tv1]
#
# border_size = 0
# rounding = 0
# }
#
# windowrule {
# name = no-gaps-f1
# match:float = false
# match:workspace = f[1]
#
# border_size = 0
# rounding = 0
# }
# See https://wiki.hypr.land/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.hypr.land/Configuring/Master-Layout/ for more
master {
new_status = master
}
###################
### PERMISSIONS ###
###################
# See https://wiki.hypr.land/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
# https://wiki.hypr.land/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. :(
}

15
hypr/permissions.conf Normal file
View File

@@ -0,0 +1,15 @@
###################
### PERMISSIONS ###
###################
# See https://wiki.hypr.land/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

6
hypr/programs.conf Normal file
View File

@@ -0,0 +1,6 @@
# See https://wiki.hypr.land/Configuring/Keywords/
$terminal = kitty
$fileManager = dolphin
$menu = rofi -show run
$programs = rofi -show drun

43
hypr/window-rules.conf Normal file
View File

@@ -0,0 +1,43 @@
##############################
### WINDOWS AND WORKSPACES ###
##############################
# See https://wiki.hypr.land/Configuring/Window-Rules/ for more
# See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules
# Example windowrules that are useful
windowrule {
# Ignore maximize requests from all apps. You'll probably like this.
name = suppress-maximize-events
match:class = .*
suppress_event = maximize
}
windowrule {
# Fix some dragging issues with XWayland
name = fix-xwayland-drags
match:class = ^$
match:title = ^$
match:xwayland = true
match:float = true
match:fullscreen = false
match:pin = false
no_focus = true
}
# Hyprland-run windowrule
windowrule {
name = move-hyprland-run
match:class = hyprland-run
move = 20 monitor_h-120
float = yes
}
debug {
disable_logs = false
}

3156
kitty/kitty.conf Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -40,85 +40,38 @@ block_postfix = "*>"
# Value from -1 to 1. # Value from -1 to 1.
# -1 represents minimum contrast, 0 represents standard (i.e. the design as spec'd), # -1 represents minimum contrast, 0 represents standard (i.e. the design as spec'd),
# and 1 represents maximum contrast. # and 1 represents maximum contrast.
contrast = 1.0 contrast = -1.0
[config.wallpaper] [config.wallpaper]
# Whether to set the wallpaper or not
set = true
# The base command to run for applying the wallpaper. # The base command to run for applying the wallpaper.
# Keywords like {{ image }} or anything that works inside of hooks works here. # Keywords like {{ image }} or anything that works inside of hooks works here.
# You could also set a static color if you use the color keywords and the wallpaper setter supports it. # You could also set a static color if you use the color keywords and the wallpaper setter supports it.
command = "swww img --transition-type center {{ image }}" command = "awww img {{ image }} --transition-type grow --transition-fps 60 --transition-duration 0.6"
# Whether to set the wallpaper or not
set = true
# For example, killing the wallpaper daemon. Usage is like a normal hook. [templates.hyprland]
# pre_hook = "" input_path = '~/linux-dotfiles/matugen/templates/hyprland-colors.conf'
output_path = '~/linux-dotfiles/hypr/colors.conf'
post_hook = "hyprctl reload && echo 'done'"
# If you don't want to use the other colors that are automatically generated (on_color, on_color_container) you can just import a custom json with the colors instead. [templates.kitty]
# For an example of importing json see: https://iniox.github.io/#matugen/usage/importing-json input_path = '~/linux-dotfiles/matugen/templates/kitty-colors.conf'
[config.custom_colors] output_path = '~/linux-dotfiles/kitty/themes/Matugen.conf'
red = "#ff0000" post_hook = "kitty +kitten themes --reload-in=all Matugen"
blue = "#0000ff"
green = "#00ff00"
[templates.includeme] [templates.qt5ct]
input_path = "./include.txt" input_path = '~/linux-dotfiles/matugen/templates/qtct-colors.conf'
# The output path is optional if you just want to import the template anyways. output_path = '~/linux-dotfiles/qt5ct/colors/matugen.conf'
# output_path = "./a/include.txt"
[templates.name1] [templates.qt6ct]
# Relative paths will be resolved from the path `config.toml` is in. input_path = '~/linux-dotfiles/matugen/templates/qtct-colors.conf'
input_path = "./colors.whatever-extension" output_path = '~/linux-dotfiles/qt6ct/colors/matugen.conf'
output_path = "./a/colors-generated.whatever-extension"
# Defaults to a value of 0 if unspecified, determines the order that each template is processed. [templates.rofi]
# You can use index = n to force a particular template hook to run after everything else, and index = -n for before everything else input_path = '~/linux-dotfiles/matugen/templates/rofi-colors.rasi'
index = 1 output_path = '~/linux-dotfiles/rofi/colors.rasi'
# Defaults to the type from CLI if unspecified. [templates.quickshell]
# One of `SchemeContent`, `SchemeExpressive`, `SchemeFidelity`, `SchemeFruitSalad`, `SchemeMonochrome`, `SchemeNeutral`, `SchemeRainbow`, `SchemeTonalSpot`, `SchemeVibrant` input_path = '~/linux-dotfiles/matugen/templates/quickshell-colors.json'
type = "SchemeExpressive" output_path = '~/.local/state/quickshell/generated/colors.json'
# For testing of the `--continue-on-error` flag
# [templates.ishoulderror]
# Relative paths will be resolved from the path `config.toml` is in.
# input_path = "./error-testing.txt"
# output_path = "./a/error-testing.txt"
# This will use a different input path depending on what mode you use.
# input_path_modes = { dark = "./colors.whatever-extension", light = "./colors.whatever-extension" }
# This will compare all of the colors inside the array with the color you set as `compare_to`, and returns the closest color to it.
# You can then use `{{closest_color}}` inside hooks.
colors_to_compare = [
{ name = "black", color = "#000000" },
{ name = "red", color = "#ff0000" },
{ name = "maroon", color = "#800000" },
{ name = "yellow", color = "#ffff00" },
{ name = "olive", color = "#808000" },
{ name = "lime", color = "#00ff00" },
{ name = "green", color = "#008000" },
{ name = "aqua", color = "#00ffff" },
{ name = "teal", color = "#008080" },
{ name = "blue", color = "#0000ff" },
{ name = "navy", color = "#000080" },
{ name = "fuchsia", color = "#ff00ff" },
{ name = "purple", color = "#800080" },
]
compare_to = "{{colors.primary.default.hex}}"
# Runs before the template is exported. You can use keywords here.
# If you want the command to be async, add an & symbol to the end of the command on unix.
pre_hook = 'echo "source color {{colors.source_color.default.hex}}, source image {{image}}, closest color {{closest_color}}"'
# Runs after the template is exported. You can use keywords here.
# If you want the command to be async, add an & symbol to the end of the command on unix.
post_hook = 'echo "after gen"'
# For overriding the prefix for a specific template only
expr_prefix = "{{"
expr_postfix = "}}"
# Only hex values
# https://m3.material.io/styles/color/advanced/adjust-existing-colors#1cc12e43-237b-45b9-8fe0-9a3549c1f61e
# If you want to use the original color without any harmonization, add `_source` after the name like: `{{ color_source }}`
# Example: To use the original red color you would use `{{ red_source }}` instead of `{{ red }}`

View File

@@ -0,0 +1,4 @@
<* for name, value in colors *>
$image = {{image}}
${{name}} = rgba({{value.default.hex_stripped}}ff)
<* endfor *>

View File

@@ -0,0 +1,49 @@
cursor {{ colors.primary.dark.hex }}
cursor_text_color {{ colors.on_primary.dark.hex }}
foreground {{ colors.on_surface.dark.hex }}
background {{ colors.surface_container_lowest.dark.hex }}
selection_foreground {{ colors.on_secondary.dark.hex }}
selection_background {{ colors.secondary.dark.hex }}
url_color {{ colors.secondary.dark.hex }}
#: black 000000 767676
color0 {{ colors.surface.dark.hex }}
color8 {{ colors.surface_container_highest.dark.hex }}
#: red cc0403 f2201f
color1 {{ base16.base08.dark.hex | lighten: -20.0 }}
color9 {{ base16.base08.dark.hex | lighten: 10.0 }}
#: green 19cb00 23fd00
color2 {{ colors.secondary_fixed_dim.dark.hex }}
color10 {{ colors.secondary_fixed.dark.hex }}
#: yellow cecb00 fffd00
color3 {{ colors.tertiary_fixed_dim.dark.hex }}
color11 {{ colors.tertiary_fixed.dark.hex }}
#: blue 0d73cc 1a8fff
color4 {{ colors.on_primary_fixed_variant.dark.hex }}
color12 {{ colors.primary.dark.hex }}
#: magenta cb1ed1 fd28ff
color5 {{ colors.on_secondary_fixed_variant.dark.hex }}
color13 {{ colors.secondary.dark.hex }}
#: cyan 0dcdcd 14ffff
color6 {{ colors.on_tertiary_fixed_variant.dark.hex }}
color14 {{ colors.tertiary.dark.hex }}
#: white dddddd ffffff
color7 {{ colors.on_surface_variant.dark.hex }}
color15 {{ colors.on_surface.dark.hex }}
mark1_foreground {{ colors.on_primary_fixed.dark.hex }}
mark1_background {{ colors.primary_fixed.dark.hex }}
mark2_foreground {{ colors.on_secondary_fixed.dark.hex }}
mark2_background {{ colors.secondary_fixed.dark.hex }}
mark3_foreground {{ colors.on_tertiary_fixed.dark.hex }}
mark3_background {{ colors.tertiary_fixed.dark.hex }}
active_tab_foreground {{ colors.on_primary.dark.hex }}
active_tab_background {{ colors.primary.dark.hex }}
inactive_tab_foreground {{ colors.on_primary_container.dark.hex }}
inactive_tab_background {{ colors.primary_container.dark.hex }}
active_border_color {{ colors.primary.dark.hex }}
inactive_border_color {{ colors.on_primary.dark.hex }}
# bell_border_color #ff5a00

View File

@@ -0,0 +1,4 @@
[ColorScheme]
active_colors={{colors.on_background.default.hex}}, {{colors.surface.default.hex}}, #ffffff, #cacaca, #9f9f9f, #b8b8b8, {{colors.on_background.default.hex}}, #ffffff, {{colors.on_surface.default.hex}}, {{colors.background.default.hex}}, {{colors.background.default.hex}}, {{colors.shadow.default.hex}}, {{colors.primary_container.default.hex}}, {{colors.on_primary_container.default.hex}}, {{colors.secondary.default.hex}}, {{colors.primary.default.hex}}, {{colors.surface.default.hex}}, {{colors.scrim.default.hex}}, {{colors.surface.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.secondary.default.hex}}
disabled_colors={{colors.on_background.default.hex}}, {{colors.surface.default.hex}}, #ffffff, #cacaca, #9f9f9f, #b8b8b8, {{colors.on_background.default.hex}}, #ffffff, {{colors.on_surface.default.hex}}, {{colors.background.default.hex}}, {{colors.background.default.hex}}, {{colors.shadow.default.hex}}, {{colors.primary_container.default.hex}}, {{colors.on_primary_container.default.hex}}, {{colors.secondary.default.hex}}, {{colors.primary.default.hex}}, {{colors.surface.default.hex}}, {{colors.scrim.default.hex}}, {{colors.surface.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.secondary.default.hex}}
inactive_colors={{colors.on_background.default.hex}}, {{colors.surface.default.hex}}, #ffffff, #cacaca, #9f9f9f, #b8b8b8, {{colors.on_background.default.hex}}, #ffffff, {{colors.on_surface.default.hex}}, {{colors.background.default.hex}}, {{colors.background.default.hex}}, {{colors.shadow.default.hex}}, {{colors.primary_container.default.hex}}, {{colors.on_primary_container.default.hex}}, {{colors.secondary.default.hex}}, {{colors.primary.default.hex}}, {{colors.surface.default.hex}}, {{colors.scrim.default.hex}}, {{colors.surface.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.secondary.default.hex}}

View File

@@ -0,0 +1,11 @@
{
"md3": {<* for name, color in colors *>
"{{ name }}": "{{ color.default.hex }}"<* if {{ loop.last }} *><* else *>,<* endif *><* endfor *>
},
"palette": {<* for name, palette in palettes *><* for shade, color in palette *>
"{{ name }}{{ shade }}": "{{ color.hex }}"<* if {{ loop.last }} *><* else *>,<* endif *><* endfor *><* if {{ loop.last }} *><* else *>,<* endif *><* endfor *>
},
"base16": {<* for name, color in base16 *>
"{{ name }}": "{{ color.default.hex }}"<* if {{ loop.last }} *><* else *>,<* endif *><* endfor *>
}
}

View File

@@ -0,0 +1,47 @@
* {
primary: {{colors.primary.default.hex}};
primary-fixed: {{colors.primary_fixed.default.hex}};
primary-fixed-dim: {{colors.primary_fixed_dim.default.hex}};
on-primary: {{colors.on_primary.default.hex}};
on-primary-fixed: {{colors.on_primary_fixed.default.hex}};
on-primary-fixed-variant: {{colors.on_primary_fixed_variant.default.hex}};
primary-container: {{colors.primary_container.default.hex}};
on-primary-container: {{colors.on_primary_container.default.hex}};
secondary: {{colors.secondary.default.hex}};
secondary-fixed: {{colors.secondary_fixed.default.hex}};
secondary-fixed-dim: {{colors.secondary_fixed_dim.default.hex}};
on-secondary: {{colors.on_secondary.default.hex}};
on-secondary-fixed: {{colors.on_secondary_fixed.default.hex}};
on-secondary-fixed-variant: {{colors.on_secondary_fixed_variant.default.hex}};
secondary-container: {{colors.secondary_container.default.hex}};
on-secondary-container: {{colors.on_secondary_container.default.hex}};
tertiary: {{colors.tertiary.default.hex}};
tertiary-fixed: {{colors.tertiary_fixed.default.hex}};
tertiary-fixed-dim: {{colors.tertiary_fixed_dim.default.hex}};
on-tertiary: {{colors.on_tertiary.default.hex}};
on-tertiary-fixed: {{colors.on_tertiary_fixed.default.hex}};
on-tertiary-fixed-variant: {{colors.on_tertiary_fixed_variant.default.hex}};
tertiary-container: {{colors.tertiary_container.default.hex}};
on-tertiary-container: {{colors.on_tertiary_container.default.hex}};
error: {{colors.error.default.hex}};
on-error: {{colors.on_error.default.hex}};
error-container: {{colors.error_container.default.hex}};
on-error-container: {{colors.on_error_container.default.hex}};
surface: {{colors.surface.default.hex}};
on-surface: {{colors.on_surface.default.hex}};
on-surface-variant: {{colors.on_surface_variant.default.hex}};
outline: {{colors.outline.default.hex}};
outline-variant: {{colors.outline_variant.default.hex}};
shadow: {{colors.shadow.default.hex}};
scrim: {{colors.scrim.default.hex}};
inverse-surface: {{colors.inverse_surface.default.hex}};
inverse-on-surface: {{colors.inverse_on_surface.default.hex}};
inverse-primary: {{colors.inverse_primary.default.hex}};
surface-dim: {{colors.surface_dim.default.hex}};
surface-bright: {{colors.surface_bright.default.hex}};
surface-container-lowest: {{colors.surface_container_lowest.default.hex}};
surface-container-low: {{colors.surface_container_low.default.hex}};
surface-container: {{colors.surface_container.default.hex}};
surface-container-high: {{colors.surface_container_high.default.hex}};
surface-container-highest: {{colors.surface_container_highest.default.hex}};
}

3
qt5ct/qt5ct.conf Normal file
View File

@@ -0,0 +1,3 @@
[Appearance]
color_scheme_path=/home/sem/linux-dotfiles/qt5ct/colors/matugen.conf
custom_palette=true

32
qt6ct/qt6ct.conf Normal file
View File

@@ -0,0 +1,32 @@
[Appearance]
color_scheme_path=/home/sem/.config/qt6ct/colors/matugen.conf
custom_palette=true
icon_theme=breeze-dark
standard_dialogs=default
style=Breeze
[Fonts]
fixed="Sans Serif,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,,0,0"
general="Sans Serif,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,,0,0"
[Interface]
activate_item_on_single_click=1
buttonbox_layout=0
cursor_flash_time=1000
dialog_buttons_have_icons=1
double_click_interval=400
gui_effects=@Invalid()
keyboard_scheme=2
menus_have_icons=true
show_shortcuts_in_context_menus=true
stylesheets=@Invalid()
toolbutton_style=4
underline_shortcut=1
wheel_scroll_lines=3
[SettingsWindow]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x4\xe2\0\0\x2\xa6\0\0\0\0\0\0\0\0\0\0\x4\xe2\0\0\x2\xa6\0\0\0\x1\x2\0\0\0\n\0\0\0\0\0\0\0\0\0\0\0\x4\xe2\0\0\x2\xa6)
[Troubleshooting]
force_raster_widgets=1
ignored_applications=@Invalid()

View File

@@ -0,0 +1,212 @@
pragma Singleton
import QtQuick
import Quickshell
import Quickshell.Io
Singleton {
property alias md3: jsonAdapter.md3
property alias base16: jsonAdapter.base16
property alias palette: jsonAdapter.palette
FileView {
path: Quickshell.env("HOME") + "/.local/state/quickshell/generated/colors.json"
watchChanges: true
onFileChanged: reload()
JsonAdapter {
id: jsonAdapter
readonly property Md3 md3: Md3 {}
readonly property Base16 base16: Base16 {}
readonly property Palette palette: Palette {}
}
}
component Md3: JsonObject {
property string background: "transparent"
property string error: "transparent"
property string error_container: "transparent"
property string inverse_on_surface: "transparent"
property string inverse_primary: "transparent"
property string inverse_surface: "transparent"
property string on_background: "transparent"
property string on_error: "transparent"
property string on_error_container: "transparent"
property string on_primary: "transparent"
property string on_primary_container: "transparent"
property string on_primary_fixed: "transparent"
property string on_primary_fixed_variant: "transparent"
property string on_secondary: "transparent"
property string on_secondary_container: "transparent"
property string on_secondary_fixed: "transparent"
property string on_secondary_fixed_variant: "transparent"
property string on_surface: "transparent"
property string on_surface_variant: "transparent"
property string on_tertiary: "transparent"
property string on_tertiary_container: "transparent"
property string on_tertiary_fixed: "transparent"
property string on_tertiary_fixed_variant: "transparent"
property string outline: "transparent"
property string outline_variant: "transparent"
property string primary: "transparent"
property string primary_container: "transparent"
property string primary_fixed: "transparent"
property string primary_fixed_dim: "transparent"
property string scrim: "transparent"
property string secondary: "transparent"
property string secondary_container: "transparent"
property string secondary_fixed: "transparent"
property string secondary_fixed_dim: "transparent"
property string shadow: "transparent"
property string surface: "transparent"
property string surface_bright: "transparent"
property string surface_container: "transparent"
property string surface_container_high: "transparent"
property string surface_container_highest: "transparent"
property string surface_container_low: "transparent"
property string surface_container_lowest: "transparent"
property string surface_dim: "transparent"
property string surface_tint: "transparent"
property string surface_variant: "transparent"
property string tertiary: "transparent"
property string tertiary_container: "transparent"
property string tertiary_fixed: "transparent"
property string tertiary_fixed_dim: "transparent"
}
component Palette: JsonObject {
property string error0: "transparent"
property string error5: "transparent"
property string error10: "transparent"
property string error15: "transparent"
property string error20: "transparent"
property string error25: "transparent"
property string error30: "transparent"
property string error35: "transparent"
property string error40: "transparent"
property string error50: "transparent"
property string error60: "transparent"
property string error70: "transparent"
property string error80: "transparent"
property string error90: "transparent"
property string error95: "transparent"
property string error98: "transparent"
property string error99: "transparent"
property string error100: "transparent"
property string neutral0: "transparent"
property string neutral5: "transparent"
property string neutral10: "transparent"
property string neutral15: "transparent"
property string neutral20: "transparent"
property string neutral25: "transparent"
property string neutral30: "transparent"
property string neutral35: "transparent"
property string neutral40: "transparent"
property string neutral50: "transparent"
property string neutral60: "transparent"
property string neutral70: "transparent"
property string neutral80: "transparent"
property string neutral90: "transparent"
property string neutral95: "transparent"
property string neutral98: "transparent"
property string neutral99: "transparent"
property string neutral100: "transparent"
property string neutral_variant0: "transparent"
property string neutral_variant5: "transparent"
property string neutral_variant10: "transparent"
property string neutral_variant15: "transparent"
property string neutral_variant20: "transparent"
property string neutral_variant25: "transparent"
property string neutral_variant30: "transparent"
property string neutral_variant35: "transparent"
property string neutral_variant40: "transparent"
property string neutral_variant50: "transparent"
property string neutral_variant60: "transparent"
property string neutral_variant70: "transparent"
property string neutral_variant80: "transparent"
property string neutral_variant90: "transparent"
property string neutral_variant95: "transparent"
property string neutral_variant98: "transparent"
property string neutral_variant99: "transparent"
property string neutral_variant100: "transparent"
property string primary0: "transparent"
property string primary5: "transparent"
property string primary10: "transparent"
property string primary15: "transparent"
property string primary20: "transparent"
property string primary25: "transparent"
property string primary30: "transparent"
property string primary35: "transparent"
property string primary40: "transparent"
property string primary50: "transparent"
property string primary60: "transparent"
property string primary70: "transparent"
property string primary80: "transparent"
property string primary90: "transparent"
property string primary95: "transparent"
property string primary98: "transparent"
property string primary99: "transparent"
property string primary100: "transparent"
property string secondary0: "transparent"
property string secondary5: "transparent"
property string secondary10: "transparent"
property string secondary15: "transparent"
property string secondary20: "transparent"
property string secondary25: "transparent"
property string secondary30: "transparent"
property string secondary35: "transparent"
property string secondary40: "transparent"
property string secondary50: "transparent"
property string secondary60: "transparent"
property string secondary70: "transparent"
property string secondary80: "transparent"
property string secondary90: "transparent"
property string secondary95: "transparent"
property string secondary98: "transparent"
property string secondary99: "transparent"
property string secondary100: "transparent"
property string tertiary0: "transparent"
property string tertiary5: "transparent"
property string tertiary10: "transparent"
property string tertiary15: "transparent"
property string tertiary20: "transparent"
property string tertiary25: "transparent"
property string tertiary30: "transparent"
property string tertiary35: "transparent"
property string tertiary40: "transparent"
property string tertiary50: "transparent"
property string tertiary60: "transparent"
property string tertiary70: "transparent"
property string tertiary80: "transparent"
property string tertiary90: "transparent"
property string tertiary95: "transparent"
property string tertiary98: "transparent"
property string tertiary99: "transparent"
property string tertiary100: "transparent"
}
component Base16: JsonObject {
property string base00: "transparent"
property string base01: "transparent"
property string base02: "transparent"
property string base03: "transparent"
property string base04: "transparent"
property string base05: "transparent"
property string base06: "transparent"
property string base07: "transparent"
property string base08: "transparent"
property string base09: "transparent"
property string base0a: "transparent"
property string base0b: "transparent"
property string base0c: "transparent"
property string base0d: "transparent"
property string base0e: "transparent"
property string base0f: "transparent"
}
}

View File

@@ -0,0 +1,66 @@
{
"appearance": {
"colorSource": "default",
"caelestia": {
"autoRefresh": true,
"refreshInterval": 2000,
"accentProfile": "vibrant"
},
"rounding": {
"unsharpen": 2,
"verysmall": 8,
"small": 12,
"normal": 17,
"large": 23,
"full": 9999,
"screenRounding": 23,
"windowRounding": 18
},
"font": {
"family": {
"main": "JetBrainsMono Nerd Font",
"title": "JetBrainsMono Nerd Font",
"expressive": "JetBrainsMono Nerd Font"
},
"pixelSize": {
"smaller": 12,
"small": 15,
"normal": 16,
"larger": 19,
"huge": 22
}
},
"animation": {
"duration": {
"elementMove": 500,
"elementMoveEnter": 400,
"elementMoveFast": 200
}
},
"sizes": {
"elevationMargin": 10
}
},
"overview": {
"rows": 2,
"columns": 5,
"scale": 0.16,
"enable": true,
"hideEmptyRows": false,
"workspaceSpacing": 5,
"backgroundPadding": 10,
"workspaceNumberBaseSize": 250
},
"position": {
"topMargin": 100
},
"windowPreview": {
"iconToWindowRatio": 0.25,
"iconToWindowRatioCompact": 0.45,
"xwaylandIndicatorToIconRatio": 0.35,
"inactiveMonitorOpacity": 0.4
},
"hacks": {
"arbitraryRaceConditionDelay": 150
}
}

View File

@@ -0,0 +1,56 @@
import QtQuick
import Quickshell.Io
Item {
id: root
signal devicesFound(var devices)
property var connectedDevices: []
function deviceListChanged(newList) {
if (newList.length !== root.connectedDevices.length) {
return true;
}
for (let i = 0; i < newList.length; i++) {
if (newList[i].mac !== root.connectedDevices[i].mac ||
newList[i].name !== root.connectedDevices[i].name) {
return true;
}
}
return false;
}
Process {
id: bluetoothConnectedDevicesProcess
command: ["bluetoothctl", "devices", "Connected"]
stdout: StdioCollector {
onStreamFinished: {
if (!this.text) {
root.connectedDevices = [];
root.devicesFound([]);
return;
}
var devices = this.text.trim().split("\n").map(line => {
var parts = line.split(" ");
return {
mac: parts[1],
name: parts.slice(2).join(" ")
};
});
if (root.deviceListChanged(devices)) {
root.connectedDevices = devices;
root.devicesFound(devices);
}
}
}
}
Timer {
interval: 2000
running: true
repeat: true
onTriggered: bluetoothConnectedDevicesProcess.running = true
}
Component.onCompleted: bluetoothConnectedDevicesProcess.running = true
}

View File

@@ -0,0 +1,25 @@
import QtQuick
import Quickshell
import Quickshell.Io
Item {
id: root
signal cavaDataChanged(string data)
Process {
id: cavaProcess
command: ["cat", "/tmp/cava.fifo"]
stdout: SplitParser {
splitMarker: "\n" // fires onRead() for each newline-delimited chunk
onRead: data => {
root.cavaDataChanged(data);
}
}
}
Component.onCompleted: {
cavaProcess.running = true;
}
}

View File

@@ -0,0 +1,33 @@
import QtQuick
import Quickshell.Io
Item {
id: fortuneService
property string fortuneText: "Loading..."
Process {
id: fortuneProcess
command: ["fortune", "-s", "-a"]
stdout: StdioCollector {
onStreamFinished: {
fortuneService.fortuneText = this.text.trim();
}
}
}
Component.onCompleted: {
fortuneProcess.running = true;
}
Timer {
interval: 60000 // update fortune every minute
repeat: true
running: true
onTriggered: {
fortuneProcess.running = true; // run the process again to get a new fortune
}
}
}

View File

@@ -0,0 +1,59 @@
import Quickshell.Io
import QtQuick
Item {
id: root
property string artist: ""
property string title: ""
property string artUrl: ""
property bool isPlaying: false
Process {
id: playerctlProc
// we need a separator, so use |||
command: ["playerctl", "metadata", "--format", "{{artist}}|||{{title}}|||{{mpris:artUrl}}|||{{status}}"]
stdout: StdioCollector {
onStreamFinished: {
var text = this.text.trim();
if (!text) {
root.artist = "";
root.title = "";
root.artUrl = "";
return;
}
var parts = text.split("|||");
root.artist = parts[0] || "";
root.title = parts[1] || "";
root.artUrl = parts[2] || "";
}
}
}
Process {
id: playerCtlPlayingProc
command: ["playerctl", "status"]
stdout: StdioCollector {
onStreamFinished: {
var status = this.text.trim();
root.isPlaying = (status === "Playing");
}
}
}
Timer {
interval: 2000
running: true
repeat: true
onTriggered: playerctlProc.running = true
}
Timer {
interval: 1000
running: true
repeat: true
onTriggered: playerCtlPlayingProc.running = true
}
Component.onCompleted: playerctlProc.running = true
}

View File

@@ -1,4 +1,3 @@
import Quickshell
import Quickshell.Io import Quickshell.Io
import QtQuick import QtQuick
@@ -8,9 +7,23 @@ Item {
// Store all wallpapers // Store all wallpapers
property var wallpapers: [] property var wallpapers: []
// path to the current wallpaper
property string currentWallpaper: ""
// process to run the command to change the wallpaper // process to run the command to change the wallpaper
Process { Process {
id: wallpaperProcess id: wallpaperProcess
onRunningChanged: {
if (!running) {
updateCurrentWallpaperProcess.running = true; // update the current wallpaper file after changing it
}
}
}
Process {
id: updateCurrentWallpaperProcess
command: ["bash", "-c", "cp " + wallpaperHolder.currentWallpaper + " ~/.config/hypr/current_wallpaper"]
} }
// Load wallpaper list once at startup // Load wallpaper list once at startup
@@ -36,15 +49,16 @@ Item {
var index = Math.floor(Math.random() * wallpapers.length); var index = Math.floor(Math.random() * wallpapers.length);
var path = wallpapers[index]; var path = wallpapers[index];
// console.log("wallpaper set to " + path); wallpaperHolder.currentWallpaper = path;
wallpaperProcess.command = ["matugen", "image", path]
wallpaperProcess.command = ["awww", "img", path, "--transition-type", "grow", "--transition-fps", "60", "--transition-duration", "0.6"]; console.log("Running command: " + wallpaperProcess.command);
wallpaperProcess.running = true; wallpaperProcess.running = true;
currentWallpaper = path;
} }
Timer { Timer {
interval: 60000 interval: 1000 * 60 * 15 // every 15 minutes
running: true running: true
repeat: true repeat: true
onTriggered: wallpaperHolder.setRandomWallpaper() onTriggered: wallpaperHolder.setRandomWallpaper()

View File

@@ -10,13 +10,13 @@ Item {
// ===================== // =====================
property int cpuUsage: 0 property int cpuUsage: 0
property int memUsage: 0 property int memUsage: 0
property int gpuUsage: 0
property var lastCpuIdle: 0 property var lastCpuIdle: 0
property var lastCpuTotal: 0 property var lastCpuTotal: 0
Process { Process {
id: cpuProc id: cpuProc
// get cpu usage, first line of /proc/stat
command: ["cat", "/proc/stat"] command: ["cat", "/proc/stat"]
stdout: StdioCollector { stdout: StdioCollector {
onStreamFinished: { onStreamFinished: {
@@ -56,12 +56,28 @@ Item {
var parts = data.trim().split(/\s+/); var parts = data.trim().split(/\s+/);
var total = parseInt(parts[1]) || 1; var total = parseInt(parts[1]) || 1;
var used = parseInt(parts[2]) || 0; var used = parseInt(parts[2]) || 0;
memUsage = Math.round(100 * used / total); root.memUsage = Math.round(100 * used / total);
} }
} }
Component.onCompleted: running = true Component.onCompleted: running = true
} }
Process {
id: gpuProc
command: ["cat", "/sys/class/drm/card1/device/gpu_busy_percent"]
stdout: StdioCollector {
onStreamFinished: {
if (!this.text) {
return;
}
var gpuUsage = parseInt(this.text.trim()) || 0;
root.gpuUsage = gpuUsage;
}
}
}
// Update loop // Update loop
Timer { Timer {
interval: 2000 interval: 2000
@@ -70,6 +86,7 @@ Item {
onTriggered: { onTriggered: {
cpuProc.running = true; cpuProc.running = true;
memProc.running = true; memProc.running = true;
gpuProc.running = true;
} }
} }
} }

View File

@@ -1,18 +1,36 @@
pragma ComponentBehavior: Bound
import Quickshell import Quickshell
import Quickshell.Wayland
import Quickshell.Hyprland
import Quickshell.Io
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Window
import "." import "."
import "constants" import "constants"
import "ui" import "ui"
import "services" import "services"
ShellRoot {
id: root
// put RandomWallpaper and SystemStats here so they only get instantiated once
RandomWallpaper {}
SystemStats {
id: stats
}
NowPlayingService {
id: nowPlayingService
}
Variants {
model: Quickshell.screens
// qmllint disable uncreatable-type // qmllint disable uncreatable-type
PanelWindow { PanelWindow {
id: root id: rootPanel
required property ShellScreen modelData
screen: modelData
// ===================== // =====================
// Layout // Layout
@@ -21,17 +39,37 @@ PanelWindow {
anchors.left: true anchors.left: true
anchors.right: true anchors.right: true
implicitHeight: 25 implicitHeight: 25
color: Constants.colBg color: Colors.md3.background
RandomWallpaper {} Loader {
id: wallpaperLoader
SystemStats { sourceComponent: RandomWallpaper {}
id: stats active: false
} }
TopBar { TopBar {
anchors.fill: parent anchors.fill: parent
cpuUsage: stats.cpuUsage cpuUsage: stats.cpuUsage
memUsage: stats.memUsage memUsage: stats.memUsage
gpuUsage: stats.gpuUsage
nowPlayingArtist: nowPlayingService.artist
nowPlayingTitle: nowPlayingService.title
nowPlayingArtUrl: nowPlayingService.artUrl
nowPlaying: nowPlayingService.isPlaying
}
}
}
Variants {
model: Quickshell.screens
FortuneBox {
id: fortuneBox
anchors.right: true
anchors.bottom: true
margins.right: 10
margins.bottom: 10
}
} }
} }

37
quickshell/ui/BarText.qml Normal file
View File

@@ -0,0 +1,37 @@
import QtQuick
import Quickshell
import "../constants"
Item {
id: root
property int value: 0
property string prefix: ""
property string separator: "-"
property int valuePadding: 3
property int padding: 4
property string paddingChar: "0"
width: textItem.implicitWidth + padding
height: textItem.implicitHeight + padding
Rectangle {
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
width: parent.width
height: Math.max(1, root.value / 100 * parent.height)
color: Colors.md3.on_secondary
opacity: 1.0
}
Text {
id: textItem
anchors.centerIn: parent
z: 1
text: root.prefix + root.separator + String(root.value).padStart(root.valuePadding, root.paddingChar)
color: Colors.md3.inverse_primary
font.pixelSize: Constants.fontSize
font.family: Constants.fontFamily
font.bold: true
}
}

View File

@@ -0,0 +1,64 @@
import Quickshell
import Quickshell.Io
import QtQuick
import QtQuick.Layouts
import "../constants"
import "../services"
Text {
id: root
required property TopBar parentWindow;
// Nerd Font Bluetooth icon (nf-fa-bluetooth)
// cheat sheet: https://www.nerdfonts.com/cheat-sheet
// TODO make custom floating panel with animation and buttons to connect/disconnect devices
property string iconGlyph: "\udb80\udcaf"
property string connectedIconGlyph: "\udb80\udcb1"
property string disconnectedIconGlyph: "\udb80\udcaf"
property BluetoothService bluetoothService: BluetoothService {
onDevicesFound: function(devices) {
if (devices.length > 0) {
root.iconGlyph = root.connectedIconGlyph;
root.color = Colors.md3.on_primary_fixed;
} else {
root.iconGlyph = root.disconnectedIconGlyph;
root.color = Colors.md3.primary;
}
}
}
text: iconGlyph
color: Colors.md3.on_primary_fixed
font {
family: Constants.fontFamily
pixelSize: Constants.fontSize
bold: true
}
Process {
id: bluemanManagerProcess
command: ["blueman-manager"]
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
onClicked: {
bluemanManagerProcess.running = true;
popupWindow.visible = true;
}
}
PopupWindow {
id: popupWindow
visible: false
implicitWidth: 200
implicitHeight: 100
anchor.window: parentWindow
}
}

View File

@@ -5,7 +5,7 @@ import "../constants"
Text { Text {
id: clock id: clock
color: Constants.colBlue color: Colors.md3.on_primary_fixed
font { font {
family: Constants.fontFamily family: Constants.fontFamily
@@ -14,7 +14,7 @@ Text {
} }
function updateTime() { function updateTime() {
text = Qt.formatDateTime(new Date(), "ddd, MMM dd - HH:mm"); text = Qt.formatDateTime(new Date(), "[dd-MM-yy] - [HH:mm]");
} }
Component.onCompleted: updateTime() Component.onCompleted: updateTime()

View File

@@ -0,0 +1,77 @@
import QtQuick
import Quickshell
import QtQuick.Window
import "../services"
import "../constants"
PanelWindow {
id: fortuneBox
required property ShellScreen modelData
screen: modelData
property int horizontalPadding: 12
property int verticalPadding: 8
property real backgroundOpacity: 0.8
implicitWidth: fortuneText.implicitWidth + (horizontalPadding * 2)
implicitHeight: fortuneText.implicitHeight + (verticalPadding * 2)
aboveWindows: false
color: Qt.alpha(Colors.md3.on_secondary, backgroundOpacity)
FortuneService {
id: fortuneService
}
// Canvas {
// id: gradientCanvas
// anchors.fill: parent
// onPaint: {
// var ctx = getContext("2d");
// ctx.reset();
// var grad = ctx.createLinearGradient(0, 0, width, height);
// grad.addColorStop(0.0, "rgba(0, 0, 0, 0.0)");
// grad.addColorStop(0.3, "rgba(0, 0, 0, 0.55)");
// grad.addColorStop(1.0, "rgba(0, 0, 0, 0.80)");
// ctx.fillStyle = grad;
// ctx.fillRect(0, 0, width, height);
// // Fade all sides out so panel edges are not visible.
// var edgeFade = Math.max(10, Math.min(width, height) * 0.4);
// ctx.globalCompositeOperation = "destination-in";
// var maskX = ctx.createLinearGradient(0, 0, width, 0);
// maskX.addColorStop(0.0, "rgba(0, 0, 0, 0.0)");
// maskX.addColorStop(edgeFade / width, "rgba(0, 0, 0, 1.0)");
// maskX.addColorStop(1.0 - (edgeFade / width), "rgba(0, 0, 0, 1.0)");
// maskX.addColorStop(1.0, "rgba(0, 0, 0, 0.0)");
// ctx.fillStyle = maskX;
// ctx.fillRect(0, 0, width, height);
// var maskY = ctx.createLinearGradient(0, 0, 0, height);
// maskY.addColorStop(0.0, "rgba(0, 0, 0, 0.0)");
// maskY.addColorStop(edgeFade / height, "rgba(0, 0, 0, 0.6)");
// maskY.addColorStop(1.0 - (edgeFade / height), "rgba(0, 0, 0, 0.6)");
// maskY.addColorStop(1.0, "rgba(0, 0, 0, 0.0)");
// ctx.fillStyle = maskY;
// ctx.fillRect(0, 0, width, height);
// }
// onWidthChanged: requestPaint()
// onHeightChanged: requestPaint()
// }
Text {
id: fortuneText
anchors.centerIn: parent
text: fortuneService.fortuneText
color: Colors.md3.primary
font.pixelSize: 12
font.family: Constants.fontFamily
}
}

View File

@@ -0,0 +1,9 @@
import QtQuick
import "../constants"
// vertical line separator for top bar
Rectangle {
width: 1
height: 16
color: Colors.md3.on_background
}

View File

@@ -0,0 +1,51 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Quickshell.Services.Pipewire
ColumnLayout {
required property PwNode node;
// bind the node so we can read its properties
PwObjectTracker { objects: [ node ] }
RowLayout {
Image {
visible: source != ""
source: {
const icon = node.properties["application.icon-name"] ?? "audio-volume-high-symbolic";
return `image://icon/${icon}`;
}
sourceSize.width: 20
sourceSize.height: 20
}
Label {
text: {
// application.name -> description -> name
const app = node.properties["application.name"] ?? (node.description != "" ? node.description : node.name);
const media = node.properties["media.name"];
return media != undefined ? `${app} - ${media}` : app;
}
}
Button {
text: node.audio.muted ? "unmute" : "mute"
onClicked: node.audio.muted = !node.audio.muted
}
}
RowLayout {
Label {
Layout.preferredWidth: 50
text: `${Math.floor(node.audio.volume * 100)}%`
}
Slider {
Layout.fillWidth: true
value: node.audio.volume
onValueChanged: node.audio.volume = value
}
}
}

View File

@@ -0,0 +1,169 @@
import QtQuick
import QtQuick.Layouts
import "../constants"
import "../services"
Row {
id: root
property string artist: ""
property string title: ""
property string artUrl: ""
property bool isPlaying: false
property int maxTextLength: 50
property int numBands: 32
// if the artist - title text is too long, truncate it
readonly property string displayText: {
const fullText = artist !== "" ? (artist + " - " + title) : title;
return fullText.length > maxTextLength ? fullText.substring(0, maxTextLength - 3) + "..." : fullText;
}
property string dancingLeft: "└(ಠ_ಠ )┐"
property string dancingRight: "┌( ಠ_ಠ)┘"
property string notDancing: "(ಠ ∩ ಠ)"
visible: title !== ""
spacing: 6
Text {
id: littleFella
text: root.dancingLeft
color: Colors.md3.primary
anchors.verticalCenter: parent.verticalCenter
}
//TODO add service that reads the data from cava
// the fifo buffer is in /tmp/cava.fifo. Example data is:
// 5;3;3;3;2;1;1;3;6;18;42;16;6;6;1;1;2;6;2;3;6;6;5;11;11;12;13;66;4;4;24;2;2;24;4;4;66;13;12;11;11;5;6;6;3;2;3;2;1;1;6;6;16;42;19;5;2;1;1;2;3;4;3;7;
// where each number represents the amplitude of a frequency band.
// this can be used to create a simple visualizer
// also add cava to autostart
Image {
width: 18
height: 18
source: root.artUrl
fillMode: Image.PreserveAspectCrop
anchors.verticalCenter: parent.verticalCenter
}
Text {
id: titleText
text: root.displayText
color: Colors.md3.primary
font.family: Constants.fontFamily
font.pixelSize: Constants.fontSize
anchors.verticalCenter: parent.verticalCenter
// z: 1
}
Timer {
interval: 400
running: true
repeat: true
onTriggered: {
if (root.isPlaying) {
littleFella.text = littleFella.text === root.dancingLeft ? root.dancingRight : root.dancingLeft;
} else {
littleFella.text = root.notDancing;
}
}
}
// Item {
// id: titleArea
// anchors.bottom: parent.bottom
// width: titleText.implicitWidth
// height: Math.max(titleText.implicitHeight, visualizer.height)
// Canvas {
// id: visualizer
// anchors.fill: parent
// property var cavaData: []
// property var smoothedData: []
// property real inputMax: 20
// property real attackAlpha: 1.0
// property real releaseAlpha: 0.9
// property real maxStepPerFrame: 50
// property bool needsInit: true
// Component.onCompleted: {
// for (let i = 0; i < root.numBands; i++) {
// cavaData[i] = 0;
// smoothedData[i] = 0;
// }
// needsInit = false;
// }
// function updateData(csvLine) {
// // Fast in-place parse: split once, parse directly into pre-allocated array
// let parts = csvLine.split(";");
// let idx = 0;
// for (let j = 0; j < parts.length && idx < root.numBands; j++) {
// let val = Number(parts[j]);
// if (!isNaN(val))
// cavaData[idx++] = Math.min(100, Math.max(0, val));
// }
// while (idx < root.numBands)
// cavaData[idx++] = 0;
// if (needsInit) {
// for (let i = 0; i < root.numBands; i++)
// smoothedData[i] = cavaData[i];
// needsInit = false;
// } else {
// // Two-speed smoothing in place with early exit if no significant change
// let changed = false;
// for (let i = 0; i < root.numBands; i++) {
// let prev = smoothedData[i];
// let next = cavaData[i];
// let alpha = next >= prev ? attackAlpha : releaseAlpha;
// let blended = prev + (next - prev) * alpha;
// let delta = blended - prev;
// if (Math.abs(delta) > 0.1)
// changed = true;
// if (delta > maxStepPerFrame)
// blended = prev + maxStepPerFrame;
// else if (delta < -maxStepPerFrame)
// blended = prev - maxStepPerFrame;
// smoothedData[i] = blended;
// }
// if (!changed)
// return;
// }
// visualizer.requestPaint();
// }
// onPaint: {
// var ctx = getContext("2d");
// ctx.clearRect(0, 0, width, height);
// if (smoothedData.length === 0) {
// return;
// }
// var barWidth = width / root.numBands;
// ctx.fillStyle = Colors.md3.on_primary;
// for (let i = 0; i < root.numBands; i++) {
// let normalized = (smoothedData[i] || 0) / inputMax;
// if (normalized > 1)
// normalized = 1;
// let barHeight = normalized * height;
// ctx.fillRect(Math.floor(i * barWidth), Math.floor(height - barHeight), Math.ceil(barWidth), Math.floor(barHeight));
// }
// }
// }
// }
// CavaService {
// id: cavaService
// onCavaDataChanged: data => {
// visualizer.updateData(data);
// }
// }
}

View File

@@ -16,6 +16,11 @@ Item {
property int cpuUsage: 0 property int cpuUsage: 0
property int memUsage: 0 property int memUsage: 0
property int gpuUsage: 0
property string nowPlayingArtist: ""
property string nowPlayingTitle: ""
property string nowPlayingArtUrl: ""
property bool nowPlaying: false
RowLayout { RowLayout {
anchors.fill: parent anchors.fill: parent
@@ -27,37 +32,22 @@ Item {
id: workspaceHelpers id: workspaceHelpers
} }
// ===================== WorkspacesList {
// LEFT: Workspaces id: workspacesList
// =====================
RowLayout {
spacing: 10
Repeater {
model: 9
Text {
required property int index
property int wsId: index + 1
property var ws: workspaceHelpers.getWorkspace(wsId)
text: wsId
color: workspaceHelpers.isWorkspaceActive(wsId) ? Constants.colCyan : (ws ? Constants.colMagenta : Constants.colMuted)
font {
family: Constants.fontFamily
pixelSize: Constants.fontSize
bold: true
} }
MouseArea { // small spacer
anchors.fill: parent Item {
onClicked: Hyprland.dispatch("workspace " + wsId) anchors.leftMargin: 10
}
}
} }
NowPlaying {
artist: root.nowPlayingArtist
title: root.nowPlayingTitle
artUrl: root.nowPlayingArtUrl
isPlaying: root.nowPlaying
Layout.fillHeight: true
Layout.alignment: Qt.AlignBottom
} }
// Spacer // Spacer
@@ -71,37 +61,35 @@ Item {
RowLayout { RowLayout {
spacing: 10 spacing: 10
//TODO put this in separate component LineSeparator {}
Text {
id: cpuText BluetoothIcon {
text: "CPU: " + cpuUsage + "%" parentWindow: root
color: Constants.colYellow
font.pixelSize: Constants.fontSize
font.family: Constants.fontFamily
font.bold: true
} }
Rectangle { LineSeparator {}
width: 1
height: 16 BarText {
color: Constants.colMuted prefix: "C"
value: cpuUsage
} }
Text { LineSeparator {}
id: memText
text: "Mem: " + memUsage + "%" BarText {
color: Constants.colCyan prefix: "M"
font.pixelSize: Constants.fontSize value: memUsage
font.family: Constants.fontFamily
font.bold: true
} }
Rectangle { LineSeparator {}
width: 1
height: 16 BarText {
color: Constants.colMuted prefix: "G"
value: gpuUsage
} }
LineSeparator {}
Clock {} Clock {}
} }
} }

View File

@@ -0,0 +1,35 @@
import Quickshell.Hyprland
import QtQuick
import QtQuick.Layouts
import "../constants"
RowLayout {
spacing: 10
Repeater {
model: 10
Text {
required property int index
property int wsId: index + 1
property var ws: workspaceHelpers.getWorkspace(wsId)
text: wsId
color: workspaceHelpers.isWorkspaceActive(wsId) ? Colors.md3.primary : (ws ? Colors.md3.on_background : Colors.md3.on_secondary)
font {
family: Constants.fontFamily
pixelSize: Constants.fontSize
bold: true
}
MouseArea {
anchors.fill: parent
onClicked: Hyprland.dispatch("workspace " + wsId)
}
}
}
}

191
rofi/config.rasi Normal file
View File

@@ -0,0 +1,191 @@
@theme "/dev/null"
@import "colors.rasi"
configuration {
modi: "drun,filebrowser,window,emoji";
display-drun: "apps";
display-window: "windows";
display-filebrowser: "files";
display-emoji: "emoji";
drun-display-format: "{name}";
font: "JetBrainsMono Nerd Font 10";
// show-icons: true;
icon-theme: "Colloid";
}
window {
/* properties for window widget */
transparency: "real";
location: center;
anchor: center;
fullscreen: false;
width: 1000px;
x-offset: 0px;
y-offset: 0px;
/* properties for all widgets */
enabled: true;
border: 2px solid;
border-color: @secondary-container;
border-radius: 5px;
cursor: "default";
background-color: @on-primary;
// background-color: transparent;
}
mainbox {
enabled: true;
spacing: 0px;
background-color: transparent;
orientation: horizontal;
children: [ "imagebox", "listbox" ];
}
imagebox {
padding: 5px;
background-color: transparent;
// Current wallpaper should be set by the process that changes the wallpaper (like mutagen or quickshell)
background-image: url("~/.config/hypr/current_wallpaper", height);
orientation: vertical;
children: [ "inputbar", "dummy", "mode-switcher" ];
}
listbox {
spacing: 20px;
padding: 5px;
background-color: transparent;
orientation: vertical;
children: [ "message", "listview" ];
}
// Dummy element to create space between inputbar and mode-switcher
dummy {
background-color: transparent;
}
inputbar {
enabled: true;
spacing: 2px;
padding: 5px;
border-radius: 5px;
background-color: @on-primary;
text-color: @on-surface;
children: [ "textbox-prompt-colon", "entry" ];
}
textbox-prompt-colon {
enabled: true;
expand: false;
str: "  ";
background-color: inherit;
text-color: inherit;
}
entry {
enabled: true;
background-color: inherit;
text-color: inherit;
cursor: text;
placeholder: "Whaddup?";
placeholder-color: inherit;
}
mode-switcher{
enabled: true;
spacing: 5px;
background-color: transparent;
text-color: @inverse-on-surface;
}
button {
padding: 5px;
border-radius: 5px;
background-color: @on-primary;
text-color: inherit;
cursor: pointer;
}
button selected {
background-color: @tertiary;
text-color: @on-secondary;
}
listview {
enabled: true;
columns: 1;
lines: 12;
cycle: true;
dynamic: true;
scrollbar: false;
layout: vertical;
reverse: false;
fixed-height: true;
fixed-columns: true;
spacing: 2px;
background-color: transparent;
text-color: @on-surface;
cursor: "default";
}
element {
enabled: true;
spacing: 5px;
padding: 5px;
border-radius: 5px;
background-color: transparent;
text-color: @on-surface;
cursor: pointer;
}
element normal.normal {
background-color: inherit;
text-color: inherit;
}
element normal.urgent {
background-color: @error;
text-color: @on-surface;
}
element normal.active {
background-color: @primary;
text-color: @on-surface;
}
element selected.normal {
background-color: @tertiary;
text-color: @on-secondary;
}
element selected.urgent {
background-color: @error;
text-color: @on-secondary;
}
element selected.active {
background-color: @error;
text-color: @on-secondary;
}
element-icon {
background-color: transparent;
text-color: inherit;
// size: 20px;
cursor: inherit;
}
element-text {
background-color: transparent;
text-color: inherit;
cursor: inherit;
vertical-align: 0.5;
horizontal-align: 0.0;
}
message {
background-color: transparent;
}
textbox {
padding: 15px;
border-radius: 5px;
background-color: @on-primary;
text-color: @on-surface;
vertical-align: 0.5;
horizontal-align: 0.0;
}
error-message {
padding: 15px;
border-radius: 20px;
background-color: @on-primary;
text-color: @on-surface;
}

266
sddm/silent/custom.conf Normal file
View File

@@ -0,0 +1,266 @@
; https://github.com/uiriansan/SilentSDDM/wiki/Customizing
; symlinked this file to /usr/share/sddm/themes/silent/configs/custom.conf
[General]
scale = 1.0
enable-animations = true
animated-background-placeholder = "okarun-turbo-granny-form-and-momo-ayase-from-dandadan-wallpaper-2560x1440_51.jpg"
background-fill-mode = "fill"
[LockScreen]
display = true
padding-top = 0
padding-right = 0
padding-bottom = 0
padding-left = 0
background = "okarun-turbo-granny-form-and-momo-ayase-from-dandadan-wallpaper-2560x1440_51.jpg"
use-background-color = false
background-color = "#000000"
blur = 32
brightness = 0.0
saturation = 0.0
[LockScreen.Clock]
display = true
position = "center-left"
align = "center"
format = "hh:mm:ss"
font-family = "JetBrains Mono Nerd Font"
font-size = 120
font-weight = 900
color = "#cbcbcb"
[LockScreen.Date]
display = true
format = "dddd, MMMM dd, yyyy"
locale = "en_US"
font-family = "JetBrains Mono Nerd Font"
font-size = 25
font-weight = 600
color = "#fbc3c3"
margin-top = -15
[LockScreen.Message]
display = false
position = "bottom-center"
align = "center"
text = "Press da button"
font-family = "JetBrains Mono Nerd Font"
font-size = 12
font-weight = 400
display-icon = true
icon = "enter.svg"
icon-size = 16
color = "#FFFFFF"
paint-icon = true
spacing = 0
[LoginScreen]
background = "okarun-turbo-granny-form-and-momo-ayase-from-dandadan-wallpaper-2560x1440_51.jpg"
use-background-color = false
background-color = "#000000"
blur = 0
brightness = 0.0
saturation = 0.0
[LoginScreen.LoginArea]
position = "left"
margin = 50
[LoginScreen.LoginArea.Avatar]
shape = "circle"
border-radius = 30
active-size = 120
inactive-size = 80
inactive-opacity = 0.35
active-border-size = 3
inactive-border-size = 3
active-border-color = "#fbc3c3"
inactive-border-color = "#c6b3b3"
[LoginScreen.LoginArea.Username]
font-family = "JetBrains Mono Nerd Font"
font-size = 16
font-weight = 700
color = "#ff9e9e"
margin = 10
[LoginScreen.LoginArea.PasswordInput]
width = 200
height = 30
display-icon = true
font-family = "JetBrains Mono Nerd Font"
font-size = 12
icon = "password.svg"
icon-size = 16
content-color = "#f78f8f"
background-color = "#000000"
background-opacity = 0.0
border-size = 2
border-color = "#ffb0b0"
border-radius-left = 10
border-radius-right = 10
margin-top = 10
masked-character = "●"
[LoginScreen.LoginArea.LoginButton]
background-color = "#C3C6FB"
background-opacity = 0.0
active-background-color = "#C3C6FB"
active-background-opacity = 1.0
icon = "arrow-right.svg"
icon-size = 18
content-color = "#C3C6FB"
active-content-color = "#000000"
border-size = 2
border-color = "#C3C6FB"
border-radius-left = 10
border-radius-right = 10
margin-left = 5
show-text-if-no-password = true
hide-if-not-needed = true
font-family = "JetBrains Mono Nerd Font"
font-size = 12
font-weight = 600
[LoginScreen.LoginArea.Spinner]
display-text = true
text = "Logging in"
font-family = "JetBrains Mono Nerd Font"
font-weight = 600
font-size = 14
icon-size = 30
icon = "spinner.svg"
color = "#FFFFFF"
spacing = 5
[LoginScreen.LoginArea.WarningMessage]
font-family = "JetBrains Mono Nerd Font"
font-size = 11
font-weight = 400
normal-color = "#FFFFFF"
warning-color = "#FFFFFF"
error-color = "#FFFFFF"
margin-top = 10
[LoginScreen.MenuArea.Buttons]
margin-top = 0
margin-right = 0
margin-bottom = 100
margin-left = 100
size = 30
border-radius = 5
spacing = 10
font-family = "JetBrains Mono Nerd Font"
[LoginScreen.MenuArea.Popups]
max-height = 300
item-height = 30
item-spacing = 2
padding = 5
display-scrollbar = false
margin = 5
background-color = "#000000"
background-opacity = 1.0
active-option-background-color = "#c3c6fb"
active-option-background-opacity = 1.0
content-color = "#c3c6fb"
active-content-color = "#000000"
font-family = "JetBrains Mono Nerd Font"
border-size = 2
border-color = "#c3c6fb"
font-size = 11
icon-size = 16
[LoginScreen.MenuArea.Session]
display = true
position = "bottom-left"
index = 4
popup-direction = "up"
popup-align = "center"
display-session-name = true
button-width = 100
popup-width = 200
background-color = "#c3c6fb"
background-opacity = 0.0
active-background-opacity = 1.0
content-color = "#C3C6FB"
active-content-color = "#000000"
border-size = 0
font-size = 10
icon-size = 16
[LoginScreen.MenuArea.Layout]
display = true
position = "bottom-left"
index = 3
popup-direction = "up"
popup-align = "center"
popup-width = 180
display-layout-name = true
background-color = "#C3C6FB"
background-opacity = 0.0
active-background-opacity = 1.0
content-color = "#C3C6FB"
active-content-color = "#000000"
border-size = 0
font-size = 10
icon = "language.svg"
icon-size = 16
[LoginScreen.MenuArea.Keyboard]
display = true
position = "bottom-left"
index = 2
background-color = "#C3C6FB"
background-opacity = 0.0
active-background-opacity = 1.0
content-color = "#C3C6FB"
active-content-color = "#000000"
border-size = 0
icon = "keyboard.svg"
icon-size = 16
[LoginScreen.MenuArea.Power]
display = true
position = "bottom-left"
index = 1
popup-direction = "up"
popup-align = "center"
popup-width = 100
background-color = "#C3C6FB"
background-opacity = 0.0
active-background-opacity = 1.0
content-color = "#C3C6FB"
active-content-color = "#000000"
border-size = 0
icon = "power.svg"
icon-size = 16
[LoginScreen.VirtualKeyboard]
scale = 1.0
position = "login"
start-hidden = true
background-color = "#000000"
background-opacity = 1.0
key-content-color = "#C3C6FB"
key-color = "#000000"
key-opacity = 1.0
key-active-background-color = "#000000"
key-active-opacity = 0.0
selection-background-color = "#303030"
selection-content-color = "#C3C6FB"
primary-color = "#8c90c2"
border-size = 2
border-color = "#C3C6FB"
[Tooltips]
enable = true
font-family = "JetBrains Mono Nerd Font"
font-size = 11
content-color = "#C3C6FB"
background-color = "#000000"
background-opacity = 1.0
border-radius = 5
disable-user = false
disable-login-button = false