Compare commits
30 Commits
cb86cb0723
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6dfd4eac43 | ||
|
|
f8c8536ce3 | ||
|
|
24b0c41ffb | ||
|
|
7bcd3220dd | ||
|
|
9f5eb82fe1 | ||
|
|
9d04b30629 | ||
|
|
225538148d | ||
|
|
553a7b3ad4 | ||
|
|
328dfa1786 | ||
|
|
3f27d6618a | ||
|
|
506aeeff43 | ||
|
|
406b8eb628 | ||
|
|
0d37adab9c | ||
|
|
04b8ccc690 | ||
|
|
a5937d78ca | ||
|
|
587b636e2f | ||
|
|
e72f9e50f6 | ||
|
|
16c90cb64d | ||
|
|
6c6ef8d74c | ||
|
|
8f4689d237 | ||
|
|
f504c6c87c | ||
|
|
b0a4408c65 | ||
|
|
b5fe4b0a5e | ||
|
|
5c995f7aa2 | ||
|
|
ddd9a93679 | ||
|
|
029cd7ae55 | ||
|
|
b566e0bdcb | ||
|
|
e1371c647e | ||
|
|
06477003e0 | ||
|
|
53bdb29c8c |
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal 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
330
cava/config
Normal 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
332
cava/example_config
Normal 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
|
||||||
73
cava/shaders/bar_spectrum.frag
Normal file
73
cava/shaders/bar_spectrum.frag
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
117
cava/shaders/eye_of_phi.frag
Normal file
117
cava/shaders/eye_of_phi.frag
Normal 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);
|
||||||
|
}
|
||||||
34
cava/shaders/northern_lights.frag
Normal file
34
cava/shaders/northern_lights.frag
Normal 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;
|
||||||
|
}
|
||||||
14
cava/shaders/pass_through.vert
Normal file
14
cava/shaders/pass_through.vert
Normal 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;
|
||||||
|
}
|
||||||
53
cava/shaders/spectrogram.frag
Normal file
53
cava/shaders/spectrogram.frag
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
112
cava/shaders/winamp_line_style_spectrum.frag
Normal file
112
cava/shaders/winamp_line_style_spectrum.frag
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
15
cava/themes/solarized_dark
Normal file
15
cava/themes/solarized_dark
Normal 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
10
cava/themes/tricolor
Normal 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
7
hypr/autostart.conf
Normal 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
5
hypr/environment.conf
Normal 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
|
||||||
@@ -17,339 +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
|
|
||||||
|
|
||||||
# authentication
|
|
||||||
exec-once = /usr/lib/hyprpolkitagent/hyprpolkitagent
|
|
||||||
# quickshell
|
|
||||||
exec-once = /usr/bin/qs &
|
|
||||||
# wallpaper
|
|
||||||
exec-once = hyprpaper
|
|
||||||
#############################
|
|
||||||
### 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
18
hypr/hyprsunset.conf
Normal 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
30
hypr/input.conf
Normal 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
87
hypr/keybindings.conf
Normal 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
141
hypr/look-and-feel.conf
Normal 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
15
hypr/permissions.conf
Normal 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
6
hypr/programs.conf
Normal 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
43
hypr/window-rules.conf
Normal 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
3156
kitty/kitty.conf
Normal file
File diff suppressed because it is too large
Load Diff
77
matugen/config.toml
Normal file
77
matugen/config.toml
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
[config]
|
||||||
|
# If set to enabled, it will check for updates when you run the matugen command, notifying you that an update is avaiable.
|
||||||
|
# WARNING: Matugen needs to be compiled with the `update-informer` feature for this to work.
|
||||||
|
version_check = false
|
||||||
|
|
||||||
|
# The color which should be used as the source_color if no good color was found from an image.
|
||||||
|
# Can be defined in any css format.
|
||||||
|
# The cli flag will override this if used.
|
||||||
|
fallback_color = "#ffbf9b"
|
||||||
|
|
||||||
|
# Which color to choose if multiple good colors were found from an image.
|
||||||
|
# choices: [darkness, lightness, saturation, less-saturation, value, closest-to-fallback]
|
||||||
|
# The cli flag will override this if used.
|
||||||
|
prefer = "value"
|
||||||
|
|
||||||
|
# Enables caching which will cache the colorscheme, custom colors, etc. into a cache folder located in
|
||||||
|
# Windows: C:\Users\user\AppData\Roaming\InioX\matugen\cache\images\<file>
|
||||||
|
# Linux: $XDG_CACHE_HOME/matugen/<file> or $HOME/.cache/matugen/images/<file>
|
||||||
|
# MacOS: $HOME/Library/Caches/matugen/images/<file>
|
||||||
|
# The file follows this naming: <image_name>.<image_extension>.<image_hash>.json
|
||||||
|
# For example: testimage.png.0cfd2d624b3d09bf6246b7be9ca79e207e7aa1189d961d44949628b99811bb9d.json
|
||||||
|
# You can modify the cache and it will then be loaded when using the same image.
|
||||||
|
# The colors are defined using the #RRGGBBAA format.
|
||||||
|
caching = false
|
||||||
|
|
||||||
|
# Changing the syntax
|
||||||
|
# Expr is for keywords like {{ <keyword> }}
|
||||||
|
expr_prefix = "{{"
|
||||||
|
expr_postfix = "}}"
|
||||||
|
|
||||||
|
# Block is for stuff like for loops etc.
|
||||||
|
block_prefix = "<*"
|
||||||
|
block_postfix = "*>"
|
||||||
|
|
||||||
|
# Imports json files just like `--import-json` does.
|
||||||
|
# Relative paths will be resolved from the path `config.toml` is in.
|
||||||
|
# import_json_files = ["./custom3.json"]
|
||||||
|
|
||||||
|
# Defaults to the contrast from CLI if unspecified.
|
||||||
|
# Value from -1 to 1.
|
||||||
|
# -1 represents minimum contrast, 0 represents standard (i.e. the design as spec'd),
|
||||||
|
# and 1 represents maximum contrast.
|
||||||
|
contrast = -1.0
|
||||||
|
|
||||||
|
[config.wallpaper]
|
||||||
|
# The base command to run for applying the wallpaper.
|
||||||
|
# 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.
|
||||||
|
command = "awww img {{ image }} --transition-type grow --transition-fps 60 --transition-duration 0.6"
|
||||||
|
# Whether to set the wallpaper or not
|
||||||
|
set = true
|
||||||
|
|
||||||
|
[templates.hyprland]
|
||||||
|
input_path = '~/linux-dotfiles/matugen/templates/hyprland-colors.conf'
|
||||||
|
output_path = '~/linux-dotfiles/hypr/colors.conf'
|
||||||
|
post_hook = "hyprctl reload && echo 'done'"
|
||||||
|
|
||||||
|
[templates.kitty]
|
||||||
|
input_path = '~/linux-dotfiles/matugen/templates/kitty-colors.conf'
|
||||||
|
output_path = '~/linux-dotfiles/kitty/themes/Matugen.conf'
|
||||||
|
post_hook = "kitty +kitten themes --reload-in=all Matugen"
|
||||||
|
|
||||||
|
[templates.qt5ct]
|
||||||
|
input_path = '~/linux-dotfiles/matugen/templates/qtct-colors.conf'
|
||||||
|
output_path = '~/linux-dotfiles/qt5ct/colors/matugen.conf'
|
||||||
|
|
||||||
|
[templates.qt6ct]
|
||||||
|
input_path = '~/linux-dotfiles/matugen/templates/qtct-colors.conf'
|
||||||
|
output_path = '~/linux-dotfiles/qt6ct/colors/matugen.conf'
|
||||||
|
|
||||||
|
[templates.rofi]
|
||||||
|
input_path = '~/linux-dotfiles/matugen/templates/rofi-colors.rasi'
|
||||||
|
output_path = '~/linux-dotfiles/rofi/colors.rasi'
|
||||||
|
|
||||||
|
[templates.quickshell]
|
||||||
|
input_path = '~/linux-dotfiles/matugen/templates/quickshell-colors.json'
|
||||||
|
output_path = '~/.local/state/quickshell/generated/colors.json'
|
||||||
4
matugen/templates/hyprland-colors.conf
Normal file
4
matugen/templates/hyprland-colors.conf
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<* for name, value in colors *>
|
||||||
|
$image = {{image}}
|
||||||
|
${{name}} = rgba({{value.default.hex_stripped}}ff)
|
||||||
|
<* endfor *>
|
||||||
49
matugen/templates/kitty-colors.conf
Normal file
49
matugen/templates/kitty-colors.conf
Normal 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
|
||||||
4
matugen/templates/qtct-colors.conf
Normal file
4
matugen/templates/qtct-colors.conf
Normal 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}}
|
||||||
11
matugen/templates/quickshell-colors.json
Normal file
11
matugen/templates/quickshell-colors.json
Normal 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 *>
|
||||||
|
}
|
||||||
|
}
|
||||||
47
matugen/templates/rofi-colors.rasi
Normal file
47
matugen/templates/rofi-colors.rasi
Normal 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
3
qt5ct/qt5ct.conf
Normal 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
32
qt6ct/qt6ct.conf
Normal 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()
|
||||||
212
quickshell/constants/Colors.qml
Normal file
212
quickshell/constants/Colors.qml
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
20
quickshell/constants/Constants.qml
Normal file
20
quickshell/constants/Constants.qml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
pragma Singleton
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: constants
|
||||||
|
|
||||||
|
//font
|
||||||
|
property string fontFamily: "JetBrainsMono Nerd Font"
|
||||||
|
property int fontSize: 14
|
||||||
|
|
||||||
|
//colors
|
||||||
|
property color backgroundColor: "#1a1b26"
|
||||||
|
property color colBg: "#1a1b26"
|
||||||
|
property color colMuted: "#444b6a"
|
||||||
|
property color colCyan: "#0db9d7"
|
||||||
|
property color colBlue: "#7aa2f7"
|
||||||
|
property color colMagenta: "#e528c2"
|
||||||
|
property color colYellow: "#e0af68"
|
||||||
|
}
|
||||||
22
quickshell/helpers/WorkspaceHelpers.qml
Normal file
22
quickshell/helpers/WorkspaceHelpers.qml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import QtQuick
|
||||||
|
import Quickshell.Hyprland
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
// =====================
|
||||||
|
// Helpers
|
||||||
|
// =====================
|
||||||
|
function getWorkspace(id) {
|
||||||
|
var list = Hyprland.workspaces.values;
|
||||||
|
for (var i = 0; i < list.length; i++) {
|
||||||
|
if (list[i].id === id)
|
||||||
|
return list[i];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isWorkspaceActive(id) {
|
||||||
|
return Hyprland.focusedWorkspace && Hyprland.focusedWorkspace.id === id;
|
||||||
|
}
|
||||||
|
}
|
||||||
66
quickshell/overview/config.json
Normal file
66
quickshell/overview/config.json
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
56
quickshell/services/BluetoothService.qml
Normal file
56
quickshell/services/BluetoothService.qml
Normal 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
|
||||||
|
}
|
||||||
25
quickshell/services/CavaService.qml
Normal file
25
quickshell/services/CavaService.qml
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
33
quickshell/services/FortuneService.qml
Normal file
33
quickshell/services/FortuneService.qml
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
59
quickshell/services/NowPlayingService.qml
Normal file
59
quickshell/services/NowPlayingService.qml
Normal 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
|
||||||
|
}
|
||||||
70
quickshell/services/RandomWallpaper.qml
Normal file
70
quickshell/services/RandomWallpaper.qml
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
import Quickshell.Io
|
||||||
|
import QtQuick
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: wallpaperHolder
|
||||||
|
|
||||||
|
// Store all wallpapers
|
||||||
|
property var wallpapers: []
|
||||||
|
|
||||||
|
// path to the current wallpaper
|
||||||
|
property string currentWallpaper: ""
|
||||||
|
|
||||||
|
// process to run the command to change the wallpaper
|
||||||
|
Process {
|
||||||
|
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
|
||||||
|
Process {
|
||||||
|
id: loadWallpapers
|
||||||
|
command: ["bash", "-c", "find ~/Pictures/wallpapers -type f"]
|
||||||
|
|
||||||
|
stdout: StdioCollector {
|
||||||
|
onStreamFinished: {
|
||||||
|
console.log("wallpapers loaded!");
|
||||||
|
wallpaperHolder.wallpapers = this.text.trim().split("\n");
|
||||||
|
wallpaperHolder.setRandomWallpaper();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setRandomWallpaper() {
|
||||||
|
if (wallpapers.length === 0) {
|
||||||
|
console.log("No wallpapers found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var index = Math.floor(Math.random() * wallpapers.length);
|
||||||
|
var path = wallpapers[index];
|
||||||
|
|
||||||
|
wallpaperHolder.currentWallpaper = path;
|
||||||
|
wallpaperProcess.command = ["matugen", "image", path]
|
||||||
|
console.log("Running command: " + wallpaperProcess.command);
|
||||||
|
|
||||||
|
wallpaperProcess.running = true;
|
||||||
|
currentWallpaper = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer {
|
||||||
|
interval: 1000 * 60 * 15 // every 15 minutes
|
||||||
|
running: true
|
||||||
|
repeat: true
|
||||||
|
onTriggered: wallpaperHolder.setRandomWallpaper()
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
loadWallpapers.running = true; // start loading wallpapers
|
||||||
|
}
|
||||||
|
}
|
||||||
92
quickshell/services/SystemStats.qml
Normal file
92
quickshell/services/SystemStats.qml
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
import Quickshell
|
||||||
|
import Quickshell.Io
|
||||||
|
import QtQuick
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
// =====================
|
||||||
|
// System stats
|
||||||
|
// =====================
|
||||||
|
property int cpuUsage: 0
|
||||||
|
property int memUsage: 0
|
||||||
|
property int gpuUsage: 0
|
||||||
|
|
||||||
|
property var lastCpuIdle: 0
|
||||||
|
property var lastCpuTotal: 0
|
||||||
|
|
||||||
|
Process {
|
||||||
|
id: cpuProc
|
||||||
|
command: ["cat", "/proc/stat"]
|
||||||
|
stdout: StdioCollector {
|
||||||
|
onStreamFinished: {
|
||||||
|
var line = this.text.split(/\r?\n/)[1].split(" ");
|
||||||
|
|
||||||
|
var user = parseInt(line[1]);
|
||||||
|
var nice = parseInt(line[2]);
|
||||||
|
var system = parseInt(line[3]);
|
||||||
|
var idle = parseInt(line[4]);
|
||||||
|
var iowait = parseInt(line[5]);
|
||||||
|
var irq = parseInt(line[6]);
|
||||||
|
var softirq = parseInt(line[7]);
|
||||||
|
|
||||||
|
var idleAll = idle + iowait;
|
||||||
|
var total = user + nice + system + idle + iowait + irq + softirq;
|
||||||
|
|
||||||
|
var diffIdle = idleAll - root.lastCpuIdle;
|
||||||
|
var diffTotal = total - root.lastCpuTotal;
|
||||||
|
|
||||||
|
if (diffTotal > 0) {
|
||||||
|
root.cpuUsage = Math.round(100 * (1 - diffIdle / diffTotal));
|
||||||
|
}
|
||||||
|
|
||||||
|
root.lastCpuIdle = idleAll;
|
||||||
|
root.lastCpuTotal = total;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Process {
|
||||||
|
id: memProc
|
||||||
|
command: ["sh", "-c", "free | grep Mem"]
|
||||||
|
stdout: SplitParser {
|
||||||
|
onRead: data => {
|
||||||
|
if (!data)
|
||||||
|
return;
|
||||||
|
var parts = data.trim().split(/\s+/);
|
||||||
|
var total = parseInt(parts[1]) || 1;
|
||||||
|
var used = parseInt(parts[2]) || 0;
|
||||||
|
root.memUsage = Math.round(100 * used / total);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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
|
||||||
|
Timer {
|
||||||
|
interval: 2000
|
||||||
|
running: true
|
||||||
|
repeat: true
|
||||||
|
onTriggered: {
|
||||||
|
cpuProc.running = true;
|
||||||
|
memProc.running = true;
|
||||||
|
gpuProc.running = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,113 +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 "constants"
|
||||||
|
import "ui"
|
||||||
|
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
|
||||||
// System stats
|
screen: modelData
|
||||||
// =====================
|
|
||||||
property int cpuUsage: 0
|
|
||||||
property int memUsage: 0
|
|
||||||
|
|
||||||
property var lastCpuIdle: 0
|
|
||||||
property var lastCpuTotal: 0
|
|
||||||
|
|
||||||
Process {
|
|
||||||
id: cpuProc
|
|
||||||
// get cpu usage, first line of /proc/stat
|
|
||||||
command: ["cat", "/proc/stat"]
|
|
||||||
stdout: StdioCollector {
|
|
||||||
onStreamFinished: {
|
|
||||||
var line = this.text.split(/\r?\n/)[1].split(" ");
|
|
||||||
console.log("the line is " + line);
|
|
||||||
|
|
||||||
var user = parseInt(line[1]);
|
|
||||||
var nice = parseInt(line[2]);
|
|
||||||
var system = parseInt(line[3]);
|
|
||||||
var idle = parseInt(line[4]);
|
|
||||||
var iowait = parseInt(line[5]);
|
|
||||||
var irq = parseInt(line[6]);
|
|
||||||
var softirq = parseInt(line[7]);
|
|
||||||
|
|
||||||
var idleAll = idle + iowait;
|
|
||||||
var total = user + nice + system + idle + iowait + irq + softirq;
|
|
||||||
|
|
||||||
var diffIdle = idleAll - root.lastCpuIdle;
|
|
||||||
var diffTotal = total - root.lastCpuTotal;
|
|
||||||
|
|
||||||
if (diffTotal > 0) {
|
|
||||||
root.cpuUsage = Math.round(100 * (1 - diffIdle / diffTotal));
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("diffTotal is " + diffTotal);
|
|
||||||
|
|
||||||
root.lastCpuIdle = idleAll;
|
|
||||||
root.lastCpuTotal = total;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Process {
|
|
||||||
id: memProc
|
|
||||||
command: ["sh", "-c", "free | grep Mem"]
|
|
||||||
stdout: SplitParser {
|
|
||||||
onRead: data => {
|
|
||||||
if (!data)
|
|
||||||
return;
|
|
||||||
var parts = data.trim().split(/\s+/);
|
|
||||||
var total = parseInt(parts[1]) || 1;
|
|
||||||
var used = parseInt(parts[2]) || 0;
|
|
||||||
memUsage = Math.round(100 * used / total);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Component.onCompleted: running = true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update loop
|
|
||||||
Timer {
|
|
||||||
interval: 2000
|
|
||||||
running: true
|
|
||||||
repeat: true
|
|
||||||
onTriggered: {
|
|
||||||
cpuProc.running = true;
|
|
||||||
memProc.running = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// =====================
|
|
||||||
// Theme
|
|
||||||
// =====================
|
|
||||||
property color colBg: "#1a1b26"
|
|
||||||
property color colMuted: "#444b6a"
|
|
||||||
property color colCyan: "#0db9d7"
|
|
||||||
property color colBlue: "#7aa2f7"
|
|
||||||
property color colMagenta: "#e528c2"
|
|
||||||
property color colYellow: "#e0af68"
|
|
||||||
|
|
||||||
property string fontFamily: "JetBrainsMono Nerd Font"
|
|
||||||
property int fontSize: 14
|
|
||||||
|
|
||||||
// =====================
|
|
||||||
// Helpers
|
|
||||||
// =====================
|
|
||||||
function getWorkspace(id) {
|
|
||||||
var list = Hyprland.workspaces.values;
|
|
||||||
for (var i = 0; i < list.length; i++) {
|
|
||||||
if (list[i].id === id)
|
|
||||||
return list[i];
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isWorkspaceActive(id) {
|
|
||||||
return Hyprland.focusedWorkspace && Hyprland.focusedWorkspace.id === id;
|
|
||||||
}
|
|
||||||
|
|
||||||
// =====================
|
// =====================
|
||||||
// Layout
|
// Layout
|
||||||
@@ -115,113 +38,38 @@ PanelWindow {
|
|||||||
anchors.top: true
|
anchors.top: true
|
||||||
anchors.left: true
|
anchors.left: true
|
||||||
anchors.right: true
|
anchors.right: true
|
||||||
implicitHeight: 30
|
implicitHeight: 25
|
||||||
color: root.colBg
|
color: Colors.md3.background
|
||||||
|
|
||||||
RowLayout {
|
Loader {
|
||||||
|
id: wallpaperLoader
|
||||||
|
sourceComponent: RandomWallpaper {}
|
||||||
|
active: false
|
||||||
|
}
|
||||||
|
|
||||||
|
TopBar {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.margins: 8
|
|
||||||
|
|
||||||
// =====================
|
cpuUsage: stats.cpuUsage
|
||||||
// LEFT: Workspaces
|
memUsage: stats.memUsage
|
||||||
// =====================
|
gpuUsage: stats.gpuUsage
|
||||||
RowLayout {
|
nowPlayingArtist: nowPlayingService.artist
|
||||||
spacing: 6
|
nowPlayingTitle: nowPlayingService.title
|
||||||
|
nowPlayingArtUrl: nowPlayingService.artUrl
|
||||||
Repeater {
|
nowPlaying: nowPlayingService.isPlaying
|
||||||
model: 9
|
|
||||||
|
|
||||||
Text {
|
|
||||||
required property int index
|
|
||||||
|
|
||||||
property int wsId: index + 1
|
|
||||||
property var ws: root.getWorkspace(wsId)
|
|
||||||
|
|
||||||
text: wsId
|
|
||||||
|
|
||||||
color: root.isWorkspaceActive(wsId) ? root.colCyan : (ws ? root.colMagenta : root.colMuted)
|
|
||||||
|
|
||||||
font {
|
|
||||||
family: root.fontFamily
|
|
||||||
pixelSize: root.fontSize
|
|
||||||
bold: true
|
|
||||||
}
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
onClicked: Hyprland.dispatch("workspace " + wsId)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Spacer
|
Variants {
|
||||||
Item {
|
model: Quickshell.screens
|
||||||
Layout.fillWidth: true
|
|
||||||
}
|
|
||||||
|
|
||||||
// =====================
|
FortuneBox {
|
||||||
// RIGHT: System info
|
id: fortuneBox
|
||||||
// =====================
|
anchors.right: true
|
||||||
RowLayout {
|
anchors.bottom: true
|
||||||
spacing: 10
|
margins.right: 10
|
||||||
|
margins.bottom: 10
|
||||||
// CPU (placeholder, hook later)
|
|
||||||
Text {
|
|
||||||
id: cpuText
|
|
||||||
text: "CPU: " + cpuUsage + "%"
|
|
||||||
color: root.colYellow
|
|
||||||
font.pixelSize: root.fontSize
|
|
||||||
font.family: root.fontFamily
|
|
||||||
font.bold: true
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
width: 1
|
|
||||||
height: 16
|
|
||||||
color: root.colMuted
|
|
||||||
}
|
|
||||||
|
|
||||||
// Memory (placeholder)
|
|
||||||
Text {
|
|
||||||
id: memText
|
|
||||||
text: "Mem: " + memUsage + "%"
|
|
||||||
color: root.colCyan
|
|
||||||
font.pixelSize: root.fontSize
|
|
||||||
font.family: root.fontFamily
|
|
||||||
font.bold: true
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
width: 1
|
|
||||||
height: 16
|
|
||||||
color: root.colMuted
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clock
|
|
||||||
Text {
|
|
||||||
id: clock
|
|
||||||
color: root.colBlue
|
|
||||||
|
|
||||||
font {
|
|
||||||
family: root.fontFamily
|
|
||||||
pixelSize: root.fontSize
|
|
||||||
bold: true
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateTime() {
|
|
||||||
text = Qt.formatDateTime(new Date(), "ddd, MMM dd - HH:mm");
|
|
||||||
}
|
|
||||||
|
|
||||||
Component.onCompleted: updateTime()
|
|
||||||
|
|
||||||
Timer {
|
|
||||||
interval: 1000
|
|
||||||
running: true
|
|
||||||
repeat: true
|
|
||||||
onTriggered: clock.updateTime()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
37
quickshell/ui/BarText.qml
Normal file
37
quickshell/ui/BarText.qml
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
64
quickshell/ui/BluetoothIcon.qml
Normal file
64
quickshell/ui/BluetoothIcon.qml
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
28
quickshell/ui/Clock.qml
Normal file
28
quickshell/ui/Clock.qml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import QtQuick
|
||||||
|
import "../constants"
|
||||||
|
|
||||||
|
// Clock
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: clock
|
||||||
|
color: Colors.md3.on_primary_fixed
|
||||||
|
|
||||||
|
font {
|
||||||
|
family: Constants.fontFamily
|
||||||
|
pixelSize: Constants.fontSize
|
||||||
|
bold: true
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateTime() {
|
||||||
|
text = Qt.formatDateTime(new Date(), "[dd-MM-yy] - [HH:mm]");
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: updateTime()
|
||||||
|
|
||||||
|
Timer {
|
||||||
|
interval: 1000
|
||||||
|
running: true
|
||||||
|
repeat: true
|
||||||
|
onTriggered: clock.updateTime()
|
||||||
|
}
|
||||||
|
}
|
||||||
77
quickshell/ui/FortuneBox.qml
Normal file
77
quickshell/ui/FortuneBox.qml
Normal 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
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
9
quickshell/ui/LineSeparator.qml
Normal file
9
quickshell/ui/LineSeparator.qml
Normal 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
|
||||||
|
}
|
||||||
51
quickshell/ui/MixerEntry.qml
Normal file
51
quickshell/ui/MixerEntry.qml
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
169
quickshell/ui/NowPlaying.qml
Normal file
169
quickshell/ui/NowPlaying.qml
Normal 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);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
96
quickshell/ui/TopBar.qml
Normal file
96
quickshell/ui/TopBar.qml
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
pragma ComponentBehavior: Bound
|
||||||
|
|
||||||
|
import Quickshell
|
||||||
|
import Quickshell.Wayland
|
||||||
|
import Quickshell.Hyprland
|
||||||
|
import Quickshell.Io
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
|
||||||
|
import "../constants"
|
||||||
|
import "../helpers"
|
||||||
|
import "."
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
property int cpuUsage: 0
|
||||||
|
property int memUsage: 0
|
||||||
|
property int gpuUsage: 0
|
||||||
|
property string nowPlayingArtist: ""
|
||||||
|
property string nowPlayingTitle: ""
|
||||||
|
property string nowPlayingArtUrl: ""
|
||||||
|
property bool nowPlaying: false
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
// anchors.centerIn: verticalCenter
|
||||||
|
anchors.leftMargin: 8
|
||||||
|
anchors.rightMargin: 8
|
||||||
|
|
||||||
|
WorkspaceHelpers {
|
||||||
|
id: workspaceHelpers
|
||||||
|
}
|
||||||
|
|
||||||
|
WorkspacesList {
|
||||||
|
id: workspacesList
|
||||||
|
}
|
||||||
|
|
||||||
|
// small spacer
|
||||||
|
Item {
|
||||||
|
anchors.leftMargin: 10
|
||||||
|
}
|
||||||
|
|
||||||
|
NowPlaying {
|
||||||
|
artist: root.nowPlayingArtist
|
||||||
|
title: root.nowPlayingTitle
|
||||||
|
artUrl: root.nowPlayingArtUrl
|
||||||
|
isPlaying: root.nowPlaying
|
||||||
|
Layout.fillHeight: true
|
||||||
|
Layout.alignment: Qt.AlignBottom
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spacer
|
||||||
|
Item {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
|
||||||
|
// =====================
|
||||||
|
// RIGHT: System info
|
||||||
|
// =====================
|
||||||
|
RowLayout {
|
||||||
|
spacing: 10
|
||||||
|
|
||||||
|
LineSeparator {}
|
||||||
|
|
||||||
|
BluetoothIcon {
|
||||||
|
parentWindow: root
|
||||||
|
}
|
||||||
|
|
||||||
|
LineSeparator {}
|
||||||
|
|
||||||
|
BarText {
|
||||||
|
prefix: "C"
|
||||||
|
value: cpuUsage
|
||||||
|
}
|
||||||
|
|
||||||
|
LineSeparator {}
|
||||||
|
|
||||||
|
BarText {
|
||||||
|
prefix: "M"
|
||||||
|
value: memUsage
|
||||||
|
}
|
||||||
|
|
||||||
|
LineSeparator {}
|
||||||
|
|
||||||
|
BarText {
|
||||||
|
prefix: "G"
|
||||||
|
value: gpuUsage
|
||||||
|
}
|
||||||
|
|
||||||
|
LineSeparator {}
|
||||||
|
|
||||||
|
Clock {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
35
quickshell/ui/WorkspacesList.qml
Normal file
35
quickshell/ui/WorkspacesList.qml
Normal 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
191
rofi/config.rasi
Normal 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
266
sddm/silent/custom.conf
Normal 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
|
||||||
Reference in New Issue
Block a user