up su Gitea

This commit is contained in:
2026-04-19 17:07:18 +02:00
parent e78ce720bb
commit fe54b28378
298 changed files with 23460 additions and 0 deletions
+291
View File
@@ -0,0 +1,291 @@
# ┳┳┓┏┓┏┳┓┳┳┏┓┏┓┳┓ ┏┓┏┓┓┏┏┓
# ┃┃┃┣┫ ┃ ┃┃┃┓┣ ┃┃━━┃ ┣┫┃┃┣┫
# ┛ ┗┛┗ ┻ ┗┛┗┛┗┛┛┗ ┗┛┛┗┗┛┛┗
#
## Configuration file for CAVA.
# Remove the ; to change parameters.
[general]
# 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 = 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 calulate max number of bars.
; bar_width = 1
; bar_spacing = 0
# 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 if a too low band is specified.
; 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.
#
# 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 '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.
#
; sample_rate = 44100
; sample_bits = 16
; channels = 2
; autoconnect = 2
[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 200 bars, 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' or 'right'.
# Default is 'bottom'. Other orientations are only supported on sdl and ncruses
# output. Note: many fonts have weird glyphs for 'top' and 'right' characters,
# which can make ncurses 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 = stereo
; mono_option = average
; reverse = 0
# Raw output target. A fifo 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 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 = 1000
; sdl_height = 500
; 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 alacritty synchronized updates. 1 = on, 0 = off
# removes flickering in alacritty terminal emulator.
# defaults to off since the behaviour in other terminal emulators is unknown
; alacritty_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'
# these are default
# 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_count = 8
; 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'
# for matugen
gradient = 1
gradient_count = 2
gradient_color_1 = '#3b383e'
gradient_color_2 = '#d4bbfc'
[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 = 100
# 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
+73
View File
@@ -0,0 +1,73 @@
#version 330
in vec2 fragCoord;
out vec4 fragColor;
// bar values. defaults to left channels first (low to high), then right (high to low).
uniform float bars[512];
uniform int bars_count; // number of bars (left + right) (configurable)
uniform int bar_width; // bar width (configurable), not used here
uniform int bar_spacing; // space between bars (configurable)
uniform vec3 u_resolution; // window resolution
// colors, configurable in cava config file (r,g,b) (0.0 - 1.0)
uniform vec3 bg_color; // background color
uniform vec3 fg_color; // foreground color
uniform int gradient_count;
uniform vec3 gradient_colors[8]; // gradient colors
uniform float shader_time; // shader execution time s (not used here)
uniform sampler2D inputTexture; // Texture from the last render pass (not used here)
vec3 normalize_C(float y, vec3 col_1, vec3 col_2, float y_min, float y_max) {
// create color based on fraction of this color and next color
float yr = (y - y_min) / (y_max - y_min);
return col_1 * (1.0 - yr) + col_2 * yr;
}
void main() {
// find which bar to use based on where we are on the x axis
float x = u_resolution.x * fragCoord.x;
int bar = int(bars_count * fragCoord.x);
// calculate a bar size
float bar_size = u_resolution.x / bars_count;
// the y coordinate and bar values are the same
float y = bars[bar];
// make sure there is a thin line at bottom
if (y * u_resolution.y < 1.0) {
y = 1.0 / u_resolution.y;
}
// draw the bar up to current height
if (y > fragCoord.y) {
// make some space between bars basen on settings
if (x > (bar + 1) * (bar_size)-bar_spacing) {
fragColor = vec4(bg_color, 1.0);
} else {
if (gradient_count == 0) {
fragColor = vec4(fg_color, 1.0);
} else {
// find which color in the configured gradient we are at
int color = int((gradient_count - 1) * fragCoord.y);
// find where on y this and next color is supposed to be
float y_min = color / (gradient_count - 1.0);
float y_max = (color + 1.0) / (gradient_count - 1.0);
// make color
fragColor = vec4(normalize_C(fragCoord.y, gradient_colors[color],
gradient_colors[color + 1], y_min, y_max),
1.0);
}
}
} else {
fragColor = vec4(bg_color, 1.0);
}
}
+117
View File
@@ -0,0 +1,117 @@
#version 330
// this shader was stolen from shadertoy user ChunderFPV
#define SCALE 8.0
#define PI radians(180.0)
#define TAU (PI * 2.0)
#define CS(a) vec2(cos(a), sin(a))
#define PT(u, r) smoothstep(0.0, r, r - length(u))
in vec2 fragCoord;
out vec4 fragColor;
uniform float bars[512];
uniform int bars_count; // number of bars (left + right) (configurable)
uniform float shader_time; // shader execution time s
uniform int bar_width; // bar width (configurable), not used here
uniform int bar_spacing; // space between bars (configurable)
uniform vec3 u_resolution; // window resolution
// colors, configurable in cava config file (r,g,b) (0.0 - 1.0)
uniform vec3 bg_color; // background color
uniform vec3 fg_color; // foreground color
uniform int gradient_count;
uniform vec3 gradient_colors[8]; // gradient colors
// gradient map ( color, equation, time, width, shadow, reciprocal )
vec3 gm(vec3 c, float n, float t, float w, float d, bool i) {
float g = min(abs(n), 1.0 / abs(n));
float s = abs(sin(n * PI - t));
if (i)
s = min(s, abs(sin(PI / n + t)));
return (1.0 - pow(abs(s), w)) * c * pow(g, d) * 6.0;
}
// denominator spiral, use 1/n for numerator
// ( screen xy, spiral exponent, decimal, line width, hardness, rotation )
float ds(vec2 u, float e, float n, float w, float h, float ro) {
float ur = length(u); // unit radius
float sr = pow(ur, e); // spiral radius
float a = round(sr) * n * TAU; // arc
vec2 xy = CS(a + ro) * ur; // xy coords
float l = PT(u - xy, w); // line
float s = mod(sr + 0.5, 1.0); // gradient smooth
s = min(s, 1.0 - s); // darken filter
return l * s * h;
}
void main() {
float t = shader_time / PI * 2.0;
vec4 m = vec4(0, 0, 0, 0); // iMouse;
m.xy = m.xy * 2.0 / u_resolution.xy - 1.0; // ±1x, ±1y
if (m.z > 0.0)
t += m.y * SCALE; // move time with mouse y
float z = (m.z > 0.0) ? pow(1.0 - abs(m.y), sign(m.y)) : 1.0; // zoom (+)
float e = (m.z > 0.0) ? pow(1.0 - abs(m.x), -sign(m.x))
: 1.0; // screen exponent (+)
float se = (m.z > 0.0) ? e * -sign(m.y) : 1.0; // spiral exponent
vec3 bg = vec3(0); // black background
float aa = 3.0; // anti-aliasing
for (float j = 0.0; j < aa; j++)
for (float k = 0.0; k < aa; k++) {
vec3 c = vec3(0);
vec2 o = vec2(j, k) / aa;
vec2 uv = (fragCoord * u_resolution.xy - 0.5 * u_resolution.xy + o) /
u_resolution.y * SCALE * z; // apply cartesian, scale and zoom
if (m.z > 0.0)
uv =
exp(log(abs(uv)) * e) * sign(uv); // warp screen space with exponent
float px = length(fwidth(uv)); // pixel width
float x = uv.x; // every pixel on x
float y = uv.y; // every pixel on y
float l = length(uv); // hypot of xy: sqrt(x*x+y*y)
float mc = (x * x + y * y - 1.0) / y; // metallic circle at xy
float g = min(abs(mc), 1.0 / abs(mc)); // gradient
vec3 gold = vec3(1.0, 0.6, 0.0) * g * l;
vec3 blue = vec3(0.3, 0.5, 0.9) * (1.0 - g);
vec3 rgb = max(gold, blue);
float w = 0.1; // line width
float d = 0.4; // shadow depth
c = max(c, gm(rgb, mc, -t, w * bars[0], d, false)); // metallic
c = max(c, gm(rgb, abs(y / x) * sign(y), -t, w * bars[1], d,
false)); // tangent
c = max(c, gm(rgb, (x * x) / (y * y) * sign(y), -t, w * bars[2], d,
false)); // sqrt cotangent
c = max(c, gm(rgb, (x * x) + (y * y), t, w * bars[3], d,
true)); // sqrt circles
c += rgb * ds(uv, se, t / TAU, px * 2.0 * bars[4], 2.0, 0.0); // spiral 1a
c += rgb * ds(uv, se, t / TAU, px * 2.0 * bars[5], 2.0, PI); // spiral 1b
c +=
rgb * ds(uv, -se, t / TAU, px * 2.0 * bars[6], 2.0, 0.0); // spiral 2a
c += rgb * ds(uv, -se, t / TAU, px * 2.0 * bars[7], 2.0, PI); // spiral 2b
c = max(c, 0.0); // clear negative color
c += pow(max(1.0 - l, 0.0), 3.0 / z); // center glow
if (m.z > 0.0) // display grid on click
{
vec2 xyg = abs(fract(uv + 0.5) - 0.5) / px; // xy grid
c.gb += 0.2 * (1.0 - min(min(xyg.x, xyg.y), 1.0));
}
bg += c;
}
bg /= aa * aa;
bg *= sqrt(bg) * 1.5;
fragColor = vec4(bg, 1.0);
}
+34
View File
@@ -0,0 +1,34 @@
#version 330
in vec2 fragCoord;
out vec4 fragColor;
// bar values. defaults to left channels first (low to high), then right (high to low).
uniform float bars[512];
uniform int bars_count; // number of bars (left + right) (configurable)
uniform vec3 u_resolution; // window resolution, not used here
//colors, configurable in cava config file
uniform vec3 bg_color; // background color(r,g,b) (0.0 - 1.0), not used here
uniform vec3 fg_color; // foreground color, not used here
void main()
{
// find which bar to use based on where we are on the x axis
int bar = int(bars_count * fragCoord.x);
float bar_y = 1.0 - abs((fragCoord.y - 0.5)) * 2.0;
float y = (bars[bar]) * bar_y;
float bar_x = (fragCoord.x - float(bar) / float(bars_count)) * bars_count;
float bar_r = 1.0 - abs((bar_x - 0.5)) * 2;
bar_r = bar_r * bar_r * 2;
// set color
fragColor.r = fg_color.x * y * bar_r;
fragColor.g = fg_color.y * y * bar_r;
fragColor.b = fg_color.z * y * bar_r;
}
+129
View File
@@ -0,0 +1,129 @@
// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: 2026 rezky_nightky <with.rezky@gmail.com>
// Static Orion (non-rotating)
#version 330
in vec2 fragCoord;
out vec4 fragColor;
uniform float bars[512];
uniform int bars_count;
uniform int bar_width;
uniform int bar_spacing;
uniform vec3 u_resolution;
uniform vec3 bg_color;
uniform vec3 fg_color;
uniform int gradient_count;
uniform vec3 gradient_colors[8];
vec3 normalize_C(float y, vec3 col_1, vec3 col_2, float y_min, float y_max) {
const float EPS = 0.0001;
float yr = (y - y_min) / max(y_max - y_min, EPS);
yr = clamp(yr, 0.0, 1.0);
return col_1 * (1.0 - yr) + col_2 * yr;
}
void main() {
vec2 p = fragCoord - vec2(0.5);
p.x *= u_resolution.x / u_resolution.y;
float base_radius = 0.35;
float max_len = 0.15;
float pad = 2.0 / u_resolution.y;
float min_r = max(base_radius - pad, 0.0);
float max_r = base_radius + max_len + pad;
float r2 = dot(p, p);
if (r2 < min_r * min_r || r2 > max_r * max_r) {
fragColor = vec4(bg_color, 1.0);
return;
}
float r = sqrt(r2);
float theta = atan(p.y, p.x);
float pi = radians(180.0);
float tau = pi * 2.0;
float a = (theta + pi) / tau;
a = fract(a);
int bc = min(bars_count, 512);
if (bc <= 0) {
fragColor = vec4(bg_color, 1.0);
return;
}
float cell = a * float(bc);
int bar = int(floor(cell));
bar = clamp(bar, 0, bc - 1);
int bar_next = bar + 1;
if (bar_next >= bc) {
bar_next = 0;
}
float f = fract(cell);
float fill = float(bar_width) / max(float(bar_width + bar_spacing), 1.0);
float angular = abs(f - 0.5);
float px = max(length(dFdx(p)), length(dFdy(p)));
float df = 0.35 * (float(bc) * px) / (tau * max(r, px));
float gap_half = (1.0 - fill) * 0.5;
float eps = 1.0 / (float(bc) * 2048.0);
float gap_cap = max(gap_half - eps, 0.0);
float df_cap = min(gap_cap, fill * 0.15);
df = min(df, max(df_cap, 1e-6));
float angular_alpha = 1.0 - smoothstep(fill * 0.5 - df, fill * 0.5 + df, angular);
angular_alpha *= step(angular, fill * 0.5 + df);
angular_alpha *= step(0.01, angular_alpha);
float y0 = clamp(bars[bar], 0.0, 1.0);
float y1 = clamp(bars[bar_next], 0.0, 1.0);
float y = mix(y0, y1, f);
float amp = y * (1.0 + 0.8 * (1.0 - y));
float min_len = 1.0 / u_resolution.y;
float max_len_cap = max(max_len - min_len, min_len);
float len = min(max(amp * max_len, min_len), max_len_cap);
float act = smoothstep(0.0, min_len / max_len, amp);
float dr = clamp(px, min_len, 2.0 * min_len);
float inner = smoothstep(base_radius - dr, base_radius + dr, r);
float outer = 1.0 - smoothstep(base_radius + len - dr, base_radius + len + dr, r);
float radial_alpha = inner * outer * act;
float outer_cap = 1.0 - smoothstep(base_radius + max_len - dr, base_radius + max_len + dr, r);
radial_alpha *= outer_cap;
float alpha = angular_alpha * radial_alpha;
alpha *= step(0.0035, alpha);
if (alpha == 0.0) {
fragColor = vec4(bg_color, 1.0);
return;
}
vec3 col;
if (gradient_count == 0) {
col = fg_color;
} else {
if (gradient_count == 1) {
col = gradient_colors[0];
} else {
int color = int(floor((gradient_count - 1) * amp));
color = clamp(color, 0, gradient_count - 2);
float y_min = float(color) / (gradient_count - 1.0);
float y_max = float(color + 1) / (gradient_count - 1.0);
col =
normalize_C(amp, gradient_colors[color], gradient_colors[color + 1], y_min, y_max);
}
}
fragColor = vec4(mix(bg_color, col, alpha), 1.0);
}
+145
View File
@@ -0,0 +1,145 @@
// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: 2026 rezky_nightky <with.rezky@gmail.com>
// Rotate Orion
#version 330
in vec2 fragCoord;
out vec4 fragColor;
uniform float bars[512];
uniform int bars_count;
uniform int bar_width;
uniform int bar_spacing;
uniform vec3 u_resolution;
uniform vec3 bg_color;
uniform vec3 fg_color;
uniform int gradient_count;
uniform vec3 gradient_colors[8];
uniform float shader_time;
vec3 normalize_C(float y, vec3 col_1, vec3 col_2, float y_min, float y_max) {
const float EPS = 0.0001;
float yr = (y - y_min) / max(y_max - y_min, EPS);
yr = clamp(yr, 0.0, 1.0);
return col_1 * (1.0 - yr) + col_2 * yr;
}
void main() {
vec2 p = fragCoord - vec2(0.5);
p.x *= u_resolution.x / u_resolution.y;
float base_radius = 0.35;
float max_len = 0.15;
float pad = 2.0 / u_resolution.y;
float min_r = max(base_radius - pad, 0.0);
float max_r = base_radius + max_len + pad;
float r2 = dot(p, p);
if (r2 < min_r * min_r || r2 > max_r * max_r) {
fragColor = vec4(bg_color, 1.0);
return;
}
float r = sqrt(r2);
float theta = atan(p.y, p.x);
float pi = radians(180.0);
float tau = pi * 2.0;
float a = (theta + pi) / tau;
a = fract(a);
int bc = min(bars_count, 512);
if (bc <= 0) {
fragColor = vec4(bg_color, 1.0);
return;
}
// Note: rotation is achieved by phase-shifting bar sampling, not by rotating geometry.
float rotate_speed = 0.10;
float t = fract(shader_time * 0.1);
float phase = fract(t * (rotate_speed / 0.1));
float sweep_speed = 0.12;
float sweep_pos = fract(t * (sweep_speed / 0.1));
float da = abs(a - sweep_pos);
da = min(da, 1.0 - da);
float sweep = 1.0 - smoothstep(0.0, 0.08 + fwidth(a), da);
float a_sample = fract(a + phase);
float cell = a_sample * float(bc);
int bar = int(floor(cell));
bar = clamp(bar, 0, bc - 1);
int bar_next = bar + 1;
if (bar_next >= bc) {
bar_next = 0;
}
float f = fract(cell);
float fill = float(bar_width) / max(float(bar_width + bar_spacing), 1.0);
float angular = abs(f - 0.5);
float px = max(length(dFdx(p)), length(dFdy(p)));
float df = 0.35 * (float(bc) * px) / (tau * max(r, px));
float gap_half = (1.0 - fill) * 0.5;
float eps = 1.0 / (float(bc) * 2048.0);
float gap_cap = max(gap_half - eps, 0.0);
float df_cap = min(gap_cap, fill * 0.15);
df = min(df, max(df_cap, 1e-6));
float angular_alpha = 1.0 - smoothstep(fill * 0.5 - df, fill * 0.5 + df, angular);
angular_alpha *= step(angular, fill * 0.5 + df);
angular_alpha *= step(0.01, angular_alpha);
float y0 = clamp(bars[bar], 0.0, 1.0);
float y1 = clamp(bars[bar_next], 0.0, 1.0);
float y = mix(y0, y1, f);
float amp = y * (1.0 + 0.8 * (1.0 - y));
float min_len = 1.0 / u_resolution.y;
float max_len_cap = max(max_len - min_len, min_len);
float len = min(max(amp * max_len, min_len), max_len_cap);
float act = smoothstep(0.0, min_len / max_len, amp);
float dr = clamp(px, min_len, 2.0 * min_len);
float inner = smoothstep(base_radius - dr, base_radius + dr, r);
float outer = 1.0 - smoothstep(base_radius + len - dr, base_radius + len + dr, r);
float radial_alpha = inner * outer * act;
float outer_cap = 1.0 - smoothstep(base_radius + max_len - dr, base_radius + max_len + dr, r);
radial_alpha *= outer_cap;
float alpha = angular_alpha * radial_alpha;
alpha *= step(0.0035, alpha);
if (alpha == 0.0) {
fragColor = vec4(bg_color, 1.0);
return;
}
vec3 col;
if (gradient_count == 0) {
col = fg_color;
} else {
if (gradient_count == 1) {
col = gradient_colors[0];
} else {
int color = int(floor((gradient_count - 1) * amp));
color = clamp(color, 0, gradient_count - 2);
float y_min = float(color) / (gradient_count - 1.0);
float y_max = float(color + 1) / (gradient_count - 1.0);
col = normalize_C(amp, gradient_colors[color], gradient_colors[color + 1], y_min, y_max);
}
}
col = min(col * (1.0 + 0.35 * sweep * alpha), vec3(1.0));
fragColor = vec4(mix(bg_color, col, alpha), 1.0);
}
+153
View File
@@ -0,0 +1,153 @@
// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: 2026 rezky_nightky <with.rezky@gmail.com>
// Orion Saturn core
#version 330
in vec2 fragCoord;
out vec4 fragColor;
uniform float bars[512];
uniform int bars_count;
uniform int bar_width;
uniform int bar_spacing;
uniform vec3 u_resolution;
uniform vec3 bg_color;
uniform vec3 fg_color;
uniform int gradient_count;
uniform vec3 gradient_colors[8];
vec3 normalize_C(float y, vec3 col_1, vec3 col_2, float y_min, float y_max) {
const float EPS = 0.0001;
float yr = (y - y_min) / max(y_max - y_min, EPS);
yr = clamp(yr, 0.0, 1.0);
return col_1 * (1.0 - yr) + col_2 * yr;
}
vec3 gradient_map(float amp) {
if (gradient_count == 0) {
return fg_color;
}
if (gradient_count == 1) {
return gradient_colors[0];
}
int color = int(floor((gradient_count - 1) * amp));
color = clamp(color, 0, gradient_count - 2);
float y_min = float(color) / (gradient_count - 1.0);
float y_max = float(color + 1) / (gradient_count - 1.0);
return normalize_C(amp, gradient_colors[color], gradient_colors[color + 1], y_min, y_max);
}
void main() {
vec2 p = fragCoord - vec2(0.5);
p.x *= u_resolution.x / u_resolution.y;
float base_radius = 0.35;
float max_len = 0.15;
float pad = 2.0 / u_resolution.y;
float max_r = base_radius + max_len + pad;
float r2 = dot(p, p);
if (r2 > max_r * max_r) {
fragColor = vec4(bg_color, 1.0);
return;
}
int bc = min(bars_count, 512);
if (bc <= 0) {
fragColor = vec4(bg_color, 1.0);
return;
}
float r = sqrt(r2);
float pi = radians(180.0);
float tau = pi * 2.0;
float theta = atan(p.y, p.x);
float a = fract((theta + pi) / tau);
float cell = a * float(bc);
int bar = int(floor(cell));
bar = clamp(bar, 0, bc - 1);
int bar_next = bar + 1;
if (bar_next >= bc) {
bar_next = 0;
}
float f = fract(cell);
float fill = float(bar_width) / max(float(bar_width + bar_spacing), 1.0);
float angular = abs(f - 0.5);
float px_ang = max(length(dFdx(p)), length(dFdy(p)));
float df = 0.35 * (float(bc) * px_ang) / (tau * max(r, px_ang));
float gap_half = (1.0 - fill) * 0.5;
float eps = 1.0 / (float(bc) * 2048.0);
float gap_cap = max(gap_half - eps, 0.0);
float df_cap = min(gap_cap, fill * 0.15);
df = min(df, max(df_cap, 1e-6));
float angular_alpha = 1.0 - smoothstep(fill * 0.5 - df, fill * 0.5 + df, angular);
angular_alpha *= step(angular, fill * 0.5 + df);
angular_alpha *= step(0.01, angular_alpha);
float y0 = clamp(bars[bar], 0.0, 1.0);
float y1 = clamp(bars[bar_next], 0.0, 1.0);
float y = mix(y0, y1, f);
float amp = y * (1.0 + 0.8 * (1.0 - y));
float min_len = 1.0 / u_resolution.y;
float max_len_cap = max(max_len - min_len, min_len);
float len = min(max(amp * max_len, min_len), max_len_cap);
float act = smoothstep(0.0, min_len / max_len, amp);
float dr = clamp(px_ang, min_len, 2.0 * min_len);
float inner = smoothstep(base_radius - dr, base_radius + dr, r);
float outer = 1.0 - smoothstep(base_radius + len - dr, base_radius + len + dr, r);
float radial_alpha = inner * outer * act;
float outer_cap = 1.0 - smoothstep(base_radius + max_len - dr, base_radius + max_len + dr, r);
radial_alpha *= outer_cap;
float ring_alpha = angular_alpha * radial_alpha;
ring_alpha *= step(0.0035, ring_alpha);
float core_energy = 0.0;
int core_samples = 0;
int core_limit = min(bc, 64);
for (int i = 0; i < core_limit; i += 2) {
core_energy += clamp(bars[i], 0.0, 1.0);
core_samples++;
}
core_energy /= max(float(core_samples), 1.0);
float core_amp = core_energy * (1.0 + 0.8 * (1.0 - core_energy));
float core_radius = mix(0.07, 0.25, clamp(core_amp * 1.1, 0.0, 1.0));
float px = 1.0 / u_resolution.y;
float core_edge = max(px * 1.5, 0.003);
float core_act = smoothstep(0.0, 0.04, core_amp);
float core_feather = core_edge + dr;
float core_alpha = 1.0 - smoothstep(core_radius - core_feather, core_radius + core_feather, r);
core_alpha = clamp(core_alpha, 0.0, 1.0) * core_act;
if (ring_alpha == 0.0 && core_alpha == 0.0) {
fragColor = vec4(bg_color, 1.0);
return;
}
vec3 col_core = gradient_map(core_amp);
vec3 col_ring = gradient_map(amp);
vec3 col = mix(bg_color, col_core, core_alpha);
col = mix(col, col_ring, ring_alpha);
fragColor = vec4(col, 1.0);
}
+154
View File
@@ -0,0 +1,154 @@
// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: 2026 rezky_nightky <with.rezky@gmail.com>
// Orion Saturn subring
#version 330
in vec2 fragCoord;
out vec4 fragColor;
uniform float bars[512];
uniform int bars_count;
uniform int bar_width;
uniform int bar_spacing;
uniform vec3 u_resolution;
uniform vec3 bg_color;
uniform vec3 fg_color;
uniform int gradient_count;
uniform vec3 gradient_colors[8];
vec3 normalize_C(float y, vec3 col_1, vec3 col_2, float y_min, float y_max) {
const float EPS = 0.0001;
float yr = (y - y_min) / max(y_max - y_min, EPS);
yr = clamp(yr, 0.0, 1.0);
return col_1 * (1.0 - yr) + col_2 * yr;
}
vec3 gradient_map(float amp) {
if (gradient_count == 0) {
return fg_color;
}
if (gradient_count == 1) {
return gradient_colors[0];
}
int color = int(floor((gradient_count - 1) * amp));
color = clamp(color, 0, gradient_count - 2);
float y_min = float(color) / (gradient_count - 1.0);
float y_max = float(color + 1) / (gradient_count - 1.0);
return normalize_C(amp, gradient_colors[color], gradient_colors[color + 1], y_min, y_max);
}
void main() {
vec2 p = fragCoord - vec2(0.5);
p.x *= u_resolution.x / u_resolution.y;
float base_radius = 0.35;
float max_len = 0.15;
float pad = 2.0 / u_resolution.y;
float max_r = base_radius + max_len + pad;
float r2 = dot(p, p);
if (r2 > max_r * max_r) {
fragColor = vec4(bg_color, 1.0);
return;
}
int bc = min(bars_count, 512);
if (bc <= 0) {
fragColor = vec4(bg_color, 1.0);
return;
}
float r = sqrt(r2);
float pi = radians(180.0);
float tau = pi * 2.0;
float theta = atan(p.y, p.x);
float a = fract((theta + pi) / tau);
float cell = a * float(bc);
int bar = int(floor(cell));
bar = clamp(bar, 0, bc - 1);
int bar_next = bar + 1;
if (bar_next >= bc) {
bar_next = 0;
}
float f = fract(cell);
float fill = float(bar_width) / max(float(bar_width + bar_spacing), 1.0);
float angular = abs(f - 0.5);
float px = max(length(dFdx(p)), length(dFdy(p)));
float df = 0.35 * (float(bc) * px) / (tau * max(r, px));
float gap_half = (1.0 - fill) * 0.5;
float eps = 1.0 / (float(bc) * 2048.0);
float gap_cap = max(gap_half - eps, 0.0);
float df_cap = min(gap_cap, fill * 0.15);
df = min(df, max(df_cap, 1e-6));
float angular_alpha = 1.0 - smoothstep(fill * 0.5 - df, fill * 0.5 + df, angular);
angular_alpha *= step(angular, fill * 0.5 + df);
angular_alpha *= step(0.01, angular_alpha);
float y0 = clamp(bars[bar], 0.0, 1.0);
float y1 = clamp(bars[bar_next], 0.0, 1.0);
float y = mix(y0, y1, f);
float amp = y * (1.0 + 0.8 * (1.0 - y));
float min_len = 1.0 / u_resolution.y;
float max_len_cap = max(max_len - min_len, min_len);
float len = min(max(amp * max_len, min_len), max_len_cap);
float act = smoothstep(0.0, min_len / max_len, amp);
float dr = clamp(px, min_len, 2.0 * min_len);
float inner = smoothstep(base_radius - dr, base_radius + dr, r);
float outer = 1.0 - smoothstep(base_radius + len - dr, base_radius + len + dr, r);
float radial_alpha = inner * outer * act;
float outer_cap = 1.0 - smoothstep(base_radius + max_len - dr, base_radius + max_len + dr, r);
radial_alpha *= outer_cap;
float ring_alpha = angular_alpha * radial_alpha;
ring_alpha *= step(0.0035, ring_alpha);
float core_energy = 0.0;
int core_samples = 0;
int core_limit = min(bc, 64);
for (int i = 0; i < core_limit; i += 4) {
core_energy += clamp(bars[i], 0.0, 1.0);
core_samples++;
}
core_energy /= max(float(core_samples), 1.0);
float core_amp = core_energy * (1.0 + 0.8 * (1.0 - core_energy));
float core_radius = mix(0.05, 0.18, clamp(core_amp * 1.2, 0.0, 1.0));
float core_act = smoothstep(0.0, 0.04, core_amp);
float core_half_thickness = 0.007;
float core = smoothstep(core_radius - core_half_thickness - dr,
core_radius - core_half_thickness + dr, r) -
smoothstep(core_radius + core_half_thickness - dr,
core_radius + core_half_thickness + dr, r);
float core_alpha = clamp(core, 0.0, 1.0) * core_act;
if (ring_alpha == 0.0 && core_alpha == 0.0) {
fragColor = vec4(bg_color, 1.0);
return;
}
vec3 col_ring = gradient_map(amp);
vec3 col_core = gradient_map(core_amp);
vec3 col = mix(bg_color, col_ring, ring_alpha);
col = mix(col, col_core, core_alpha);
fragColor = vec4(col, 1.0);
}
+14
View File
@@ -0,0 +1,14 @@
#version 330
// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;
// Output data ; will be interpolated for each fragment.
out vec2 fragCoord;
void main()
{
gl_Position = vec4(vertexPosition_modelspace,1);
fragCoord = (vertexPosition_modelspace.xy+vec2(1,1))/2.0;
}
+53
View File
@@ -0,0 +1,53 @@
#version 330
in vec2 fragCoord;
out vec4 fragColor;
// bar values. defaults to left channels first (low to high), then right (high
// to low).
uniform float bars[512];
uniform int bars_count; // number of bars (left + right) (configurable)
uniform int bar_width; // bar width (configurable), not used here
uniform int bar_spacing; // space between bars (configurable)
uniform vec3 u_resolution; // window resolution
// colors, configurable in cava config file (r,g,b) (0.0 - 1.0)
uniform vec3 bg_color; // background color
uniform vec3 fg_color; // foreground color
uniform int gradient_count;
uniform vec3 gradient_colors[8]; // gradient colors
uniform sampler2D inputTexture; // Texture from the last render pass
vec3 normalize_C(float y, vec3 col_1, vec3 col_2, float y_min, float y_max) {
// create color based on fraction of this color and next color
float yr = (y - y_min) / (y_max - y_min);
return col_1 * (1.0 - yr) + col_2 * yr;
}
void main() {
// find which bar to use based on where we are on the y axis
int bar = int(bars_count * fragCoord.y);
float y = bars[bar];
float band_size = 1.0 / float(bars_count);
float current_band_min = bar * band_size;
float current_band_max = (bar + 1) * band_size;
int hist_length = 512;
float win_size = 1.0 / hist_length;
if (fragCoord.x > 1.0 - win_size) {
if (fragCoord.y > current_band_min && fragCoord.y < current_band_max) {
fragColor = vec4(fg_color * y, 1.0);
}
} else {
vec2 offsetCoord = fragCoord;
offsetCoord.x += float(win_size);
fragColor = texture(inputTexture, offsetCoord);
}
}
@@ -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
View File
@@ -0,0 +1,15 @@
[color]
background = '#001e26'
foreground = '#708183'
gradient = 1
gradient_color_1 = '#268bd2'
gradient_color_2 = '#6c71c4'
gradient_color_3 = '#cb4b16'
horizontal_gradient = 1
horizontal_gradient_color_1 = '#586e75'
horizontal_gradient_color_2 = '#b58900'
horizontal_gradient_color_3 = '#839496'
blend_direction = 'up'
+10
View File
@@ -0,0 +1,10 @@
[color]
horizontal_gradient = 1
horizontal_gradient_color_1 = '#c45161'
horizontal_gradient_color_2 = '#e094a0'
horizontal_gradient_color_3 = '#f2b6c0'
horizontal_gradient_color_4 = '#f2dde1'
horizontal_gradient_color_5 = '#cbc7d8'
horizontal_gradient_color_6 = '#8db7d2'
horizontal_gradient_color_7 = '#5e62a9'
horizontal_gradient_color_8 = '#434279'
+151
View File
@@ -0,0 +1,151 @@
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$background = rgba(151218ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$error = rgba(ffb4abff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$error_container = rgba(93000aff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$inverse_on_surface = rgba(322f35ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$inverse_primary = rgba(69548dff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$inverse_surface = rgba(e7e0e8ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_background = rgba(e7e0e8ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_error = rgba(690005ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_error_container = rgba(ffdad6ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_primary = rgba(3a255bff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_primary_container = rgba(ecdcffff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_primary_fixed = rgba(240e45ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_primary_fixed_variant = rgba(513c73ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_secondary = rgba(342d40ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_secondary_container = rgba(eadef7ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_secondary_fixed = rgba(1f182aff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_secondary_fixed_variant = rgba(4b4357ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_surface = rgba(e7e0e8ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_surface_variant = rgba(cbc4cfff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_tertiary = rgba(4a252fff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_tertiary_container = rgba(ffd9e0ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_tertiary_fixed = rgba(32101aff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$on_tertiary_fixed_variant = rgba(643b45ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$outline = rgba(958e99ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$outline_variant = rgba(49454eff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$primary = rgba(d4bbfcff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$primary_container = rgba(513c73ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$primary_fixed = rgba(ecdcffff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$primary_fixed_dim = rgba(d4bbfcff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$scrim = rgba(000000ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$secondary = rgba(cec2dbff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$secondary_container = rgba(4b4357ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$secondary_fixed = rgba(eadef7ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$secondary_fixed_dim = rgba(cec2dbff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$shadow = rgba(000000ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$source_color = rgba(533d78ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$surface = rgba(151218ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$surface_bright = rgba(3b383eff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$surface_container = rgba(211e24ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$surface_container_high = rgba(2c292fff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$surface_container_highest = rgba(37343aff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$surface_container_low = rgba(1d1a20ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$surface_container_lowest = rgba(0f0d12ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$surface_dim = rgba(151218ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$surface_tint = rgba(d4bbfcff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$surface_variant = rgba(49454eff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$tertiary = rgba(f1b7c3ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$tertiary_container = rgba(643b45ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$tertiary_fixed = rgba(ffd9e0ff)
$image = /home/sinsa/Pictures/wallpapers/viola-casa.jpg
$tertiary_fixed_dim = rgba(f1b7c3ff)
+26
View File
@@ -0,0 +1,26 @@
animations {
enabled = yes
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
bezier = been, 0.24, 0.9, 0.25, 0.91
bezier = been2, 0,0.94,0.5,0.99
bezier = menu_decel, 0.1, 1, 0, 1
bezier = linear, 0.0, 0.0, 1.0, 1.0
bezier = wind, 0.05, 0.9, 0.1, 1.05
bezier = winIn, 0.1, 1.1, 0.1, 1.1
bezier = winOut, 0.3, -0.3, 0, 1
bezier = slow, 0, 0.85, 0.3, 1
bezier = overshot, 0.7, 0.6, 0.1, 1.1
bezier = bounce, 1.1, 1.6, 0.1, 0.85
bezier = sligshot, 1, -1, 0.15, 1.25
bezier = nice, 0, 6.9, 0.5, -4.20
animation = windowsIn, 1, 5, slow, popin
animation = windowsOut, 1, 7, been, popin 70%
animation = windowsMove, 1, 5, wind, slide
animation = border, 1, 1, linear
animation = fade, 1, 5, overshot
animation = workspaces, 1, 5, wind
animation = windows, 1, 5, bounce, popin
}
+29
View File
@@ -0,0 +1,29 @@
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.
accel_profile=flat
follow_mouse=1
force_no_accel=1
touchpad {
natural_scroll = true
}
}
# https://wiki.hyprland.org/Configuring/Variables/#gestures
gestures {
workspace_swipe = true
}
# Example per-device config
# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more
device {
name = epic-mouse-v1
sensitivity = -0.5
}
+98
View File
@@ -0,0 +1,98 @@
###################
### KEYBINDINGS ###
###################
# See https://wiki.hyprland.org/Configuring/Keywords/
$mainMod = SUPER # Sets "Windows" key as main modifier
# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
bind = $mainMod, Return, exec, $terminal
bind = $mainMod SHIFT, RETURN, exec, [float; size 800 550] $terminal
bind = $mainMod, Q, killactive,
bind = CTRL ALT, Delete, exec, hyprctl dispatch exit 0 # exit Hyprland
bind = $mainMod, E, exec, $fileManager
bind = $mainMod, Space, togglefloating,
bind = $mainMod, D, exec, $menu
bind = $mainMod, P, pseudo, # dwindle
bind = $mainMod, J, togglesplit, # dwindle
bind = $mainMod, R, exec, ~/.config/hypr/scripts/wbrestart.sh
bind = $mainMod, B, exec, xdg-open "https://" # default browser
bind = $mainMod, L, exec, ~/.config/hypr/scripts/hyprlock.sh
bind = $mainMod SHIFT, F, fullscreen
bind = $mainMod SHIFT, S, exec, ~/.config/hypr/scripts/screenshot.sh
bind = $mainMod, W, exec, ~/.config/hypr/scripts/wppicker.sh
bind = $mainMod SHIFT, Q, exec, ~/.config/hypr/scripts/KillActiveProcess.sh # Kill active process
bind = $mainMod, C, exec, hyprpicker -a
bind = $mainMod CTRL, B, exec, ~/.config/hypr/scripts/WaybarStyles.sh # Waybar Styles Menu
bind = $mainMod ALT, B, exec, ~/.config/hypr/scripts/WaybarLayout.sh # Waybar Layout Menu
bind = $mainMod, H, exec, pkill -SIGUSR1 waybar # Hide Waybar
bind = $mainMod SHIFT, E, exec, kitty yazi # Yazi File Manager
# Move focus with mainMod + arrow keys
bind = $mainMod, left, movefocus, l
bind = $mainMod, right, movefocus, r
bind = $mainMod, up, movefocus, u
bind = $mainMod, down, movefocus, d
# Move Windows
bind = $mainMod CTRL, left, movewindow, l
bind = $mainMod CTRL, right, movewindow, r
bind = $mainMod CTRL, up, movewindow, u
bind = $mainMod CTRL, down, movewindow, d
# Resize windows
binde = $mainMod SHIFT, left, resizeactive,-50 0
binde = $mainMod SHIFT, right, resizeactive,50 0
binde = $mainMod SHIFT, up, resizeactive,0 -50
binde = $mainMod SHIFT, down, resizeactive,0 50
# 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, ~/.config/hypr/scripts/volume.sh --inc
bindel = ,XF86AudioLowerVolume, exec, ~/.config/hypr/scripts/volume.sh --dec
bindel = ,XF86AudioMute, exec, ~/.config/hypr/scripts/volume.sh --toggle
bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
bindel = ,XF86MonBrightnessUp, exec, ~/.config/hypr/scripts/brightness.sh --inc
bindel = ,XF86MonBrightnessDown, exec, ~/.config/hypr/scripts/brightness.sh --dec
# Requires playerctl
bindl = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioPause, exec, playerctl play-pause
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPrev, exec, playerctl previous
+50
View File
@@ -0,0 +1,50 @@
general {
gaps_in = 5
gaps_out = 10
border_size = 2
# col.active_border = $outline
col.active_border = $primary $secondary 45deg
col.inactive_border = $outline_variant
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = true
# Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
allow_tearing = false
layout = dwindle
}
# https://wiki.hyprland.org/Configuring/Variables/#decoration
decoration {
rounding = 10
rounding_power = 2
# Change transparency of focused and unfocused windows
active_opacity = 1.0
inactive_opacity = 1.0
shadow {
enabled = false
range = 4
render_power = 3
color = rgba(1a1a1aee)
}
# https://wiki.hyprland.org/Configuring/Variables/#blur
blur {
enabled = true
size = 5
passes = 3
ignore_opacity = true
new_optimizations = true
special = false
popups = true
xray = true
vibrancy = 0.1696
}
}
+14
View File
@@ -0,0 +1,14 @@
windowrule = match:class ^(mpv|vlc)$, tag +multimedia_video
windowrule = match:class ^(nm-applet|nm-connection-editor|blueman-manager|org.gnome.FileRoller)$, tag +settings
windowrule = match:class ^(org.gnome.DiskUtility|wihotspot(-gui)?)$, tag +settings
#windowrule = tag, +multimedia_video, class:(mpv|vlc)$
#windowrule = tag +settings, class:^(nm-applet|nm-connection-editor|blueman-manager|org.gnome.FileRoller)$
#windowrule = tag +settings, class:^(org.gnome.DiskUtility|wihotspot(-gui)?)$
#windowrule = tag +viewer, class:^(org.gnome.SystemMonitor)$ # system monitor
#windowrule = tag +viewer, class:^(org.gnome.Evince)$ # document viewer
#windowrule = tag +viewer, class:^(eog|org.gnome.Loupe)$ # image viewer
+41
View File
@@ -0,0 +1,41 @@
# APPLICATIONS OPACITY
# windowrule = opacity 0.8 override, match:class ^(org.gnome.Nautilus)$
windowrule = opacity 0.9 override, match:class ^(gedit|org.gnome.TextEditor|mousepad)$
windowrule = opacity 0.9 override, match:class ^(org.pulseaudio.pavucontrol)$
windowrule = opacity 0.9 override, match:class ^(kitty)$
windowrule = opacity 0.85 override 0.7 override 1 override, match:class ^(discord|vesktop|org.telegram.desktop)$
windowrule = opacity 0.8 override 0.6 override 1 override, match:class ^(Spotify)$
windowrule = opacity 0.9 override 0.7 override 1 override, match:class ^(zen)$
windowrule = opacity 1.0 override 1 override 1 override, match:class ^(zen-twilight)$
# FLOAT & SIZE
windowrule = size 900 506, float on, match:tag multimedia_video*
windowrule = float on, size 50% 60%, match:class ^(org.pulseaudio.pavucontrol)$
# Ignore maximize requests
windowrule = suppress_event maximize, match:class .*
## Fix XWayland dragging
#windowrule = no_focus on, match:class ^$,title ^$,xwayland 1,float 1,fullscreen 0,pin 0
#
## POP UPS AND DIALOGUES
#
#windowrulev2 = size 50%% 60%%, float, center, title:^(Save As|Save a File|Pick Files)$
#windowrulev2 = size 70%% 60%%, float, initialTitle:^(Open Files)$
#
# WAYBAR
layerrule = blur on, ignore_alpha 0.5, match:namespace waybar
# NOTIFICATIONS
layerrule = ignore_alpha 0.5, match:namespace tag:notif*
# LOGOUT
layerrule = blur on, match:namespace logout_dialog
# SWAYNC
layerrule = blur on, ignore_alpha on, ignore_alpha 0.5, xray 0, match:namespace swaync-control-center
layerrule = blur on, ignore_alpha on, ignore_alpha 0.5, xray 0, match:namespace swaync-notification-window
+58
View File
@@ -0,0 +1,58 @@
# APPLIACTIONS BLUR
#windowrule = noblur , tag:multimedia_video*
#windowrule = opacity 1.0, tag:multimedia_video*
#windowrule = opacity 0.8, tag:settings*
windowrule = opacity 0.8, class: ^(org.gnome.Nautilus)$
windowrule = opacity 0.9, class:^(gedit|org.gnome.TextEditor|mousepad)$
windowrule = opacity 0.9, class:^(org.pulseaudio.pavucontrol)$
windowrule = opacity 0.9, class:^(kitty)$
windowrule = opacity 0.85 override 0.7 override 1 override, class:^(discord|vesktop|org.telegram.desktop)$
windowrule = opacity 0.8 override 0.6 override 1 override, class:^(Spotify)$
windowrule = opacity 0.9 override 0.7 override 1 override, class:^(zen)$
#windowrule = opacity 0.8 override 0.6 override 1 override, tag:viewer*
# LAYER RULES
#layerrule = blur, rofi
#layerrule = ignorezero, rofi
#layerrule = ignorealpha 0.5, rofi
#layerrule = dimaround, rofi
#layerrule = animation popin 10%, rofi
#layerrule = blur, notifications
#layerrule = ignorezero, notifications
layerrule = blur, waybar
#layerrule = ignorezero, waybar
layerrule = ignorealpha 0.5, waybar
layerrule = ignorealpha 0.5, tag:notif*
layerrule = blur, logout_dialog
# SWAYNC BLUR & XRAY
layerrule = blur, swaync-control-center
layerrule = blur, swaync-notification-window
layerrule = ignorezero, swaync-control-center
layerrule = ignorezero, swaync-notification-window
layerrule = ignorealpha 0.5, swaync-control-center
layerrule = ignorealpha 0.5, swaync-notification-window
layerrule = xray 0, swaync-control-center
layerrule = xray 0, swaync-notification-window
#FLOAT
#windowrule = float, tag:settings*
#windowrule = float, tag:viewer*
#windowrule = float, tag:multimedia_video*
windowrule = size 900 506, tag:multimedia_video*
windowrule = float, class:^(org.pulseaudio.pavucontrol)$
windowrule = size 50% 60%, class:^(org.pulseaudio.pavucontrol)$
# Ignore maximize requests from apps. You'll probably like this.
windowrule = suppressevent maximize, class:.*
# Fix some dragging issues with XWayland
windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
# POP UPS AND DIALOGUES
windowrule = float, title:^(Save As|Save a File|Pick Files)$
windowrule = size 50% 60%, title:^(Save As|Save a File|Pick Files)$
windowrule = center, title:^(Save As|Save a File|Pick Files)$
windowrule = float, initialTitle:(Open Files)
windowrule = size 70% 60%, initialTitle:(Open Files)
+1
View File
@@ -0,0 +1 @@
/home/sinsa/Pictures/wallpapers/viola-casa.jpg
+35
View File
@@ -0,0 +1,35 @@
general {
lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances.
before_sleep_cmd = loginctl lock-session # lock before suspend.
after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display.
# unlock_cmd = /home/sinsa/.local/bin/eduroamcondizionale
}
listener {
timeout = 150 # 2.5min.
on-timeout = brightnessctl -s set 10 # set monitor backlight to minimum, avoid 0 on OLED monitor.
on-resume = brightnessctl -r # monitor backlight restore.
}
# turn off keyboard backlight, comment out this section if you dont have a keyboard backlight.
listener {
timeout = 150 # 2.5min.
on-timeout = brightnessctl -sd rgb:kbd_backlight set 0 # turn off keyboard backlight.
on-resume = brightnessctl -rd rgb:kbd_backlight # turn on keyboard backlight.
}
listener {
timeout = 300 # 5min
on-timeout = loginctl lock-session # lock screen when timeout has passed
}
listener {
timeout = 330 # 5.5min
on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed
on-resume = hyprctl dispatch dpms on && brightnessctl -r # screen on when activity is detected after timeout has fired.
}
listener {
timeout = 1800 # 30min
on-timeout = systemctl suspend # suspend pc
}
+450
View File
@@ -0,0 +1,450 @@
# #######################################################################################
# AUTOGENERATED HYPRLAND CONFIG.
# EDIT THIS CONFIG ACCORDING TO THE WIKI INSTRUCTIONS.
# #######################################################################################
# This is an example Hyprland config file.
# Refer to the wiki for more information.
# https://wiki.hypr.land/Configuring/
# Please note not all available settings / options are set here.
# For a full list, see the wiki
# You can split this configuration into multiple files
# Create your files separately and then link them to this file like this:
# source = ~/.config/hypr/myColors.conf
source = colors.conf
################
### MONITORS ###
################
# See https://wiki.hypr.land/Configuring/Monitors/
monitor= eDP-1, 3072x1920@60, auto, auto
###################
### MY PROGRAMS ###
###################
# See https://wiki.hypr.land/Configuring/Keywords/
# Set programs that you use
$terminal = kitty
$fileManager = nautilus
# $menu = hyprlauncher
$menu = 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
# exec-once = nm-applet
exec-once = awww-daemon
# exec-once = blueman-applet
exec-once = swaync
# exec-once = hyprpanel
# exec-once = hyprpaper
# exec-once = ashell & hyprpaper
exec-once = systemctl --user start hyprpolkitagent
#exec-once = nextcloud
exec-once =/usr/bin/nextcloud --background
exec-once = hypridle
exec-once = /home/sinsa/.local/bin/eduroamcondizionale
exec-once = sleep 0.5 ; waybar -c /home/sinsa/.config/waybar/configs/default -s /home/sinsa/.config/waybar/style/islands.css >> $HOME/.local/log/waybar.log
exec-once = wl-paste --type text --watch cliphist store
exec-once = wl-paste --type image --watch cliphist store
exec-once = vorta -d
exec-once = syncthing
#############################
### 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 ###
#####################
source= ~/.config/hypr/configs/looknfeel.conf
# ANIMATION
source= ~/.config/hypr/configs/UserAnimations.conf
# 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 = true # If true disables the random hyprland logo / anime girl background. :(
}
device {
name = royuan-rt100-wired-system-control
kb_layout = us
}
#############
### INPUT ###
#############
# https://wiki.hypr.land/Configuring/Variables/#input
input {
kb_layout = it
# kb_variant = intl
# kb_model =
# kb_options =
# kb_rules =
follow_mouse = 1
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
touchpad {
clickfinger_behavior = 0
natural_scroll = true
}
}
device {
name = royuan-rt100-wired-system-control
kb_layout = us
kb_variant = intl,
}
device {
name = royuan-rt100-wired-keyboard
kb_layout = us
kb_variant = intl
}
device {
name = royuan-rt100-wired-consumer-control
kb_layout = us
kb_variant = intl
}
device {
name = royuan-rt100-wired
kb_layout = us
kb_variant = intl
}
device {
name = at-translated-set-2-keyboard
kb_layout = it
}
#
#input {
# kb_layout = us
# kb_variant = intl
# device = royuan-rt100-wired-keyboard
#}
#
# See https://wiki.hypr.land/Configuring/Gestures
# -------- GESTURES ---------
# gesture = 3, horizontal, workspace
gesture = 3, swipe, move
gesture = 4, vertical, fullscreen, maximize
gesture = 4, horizontal, workspace
gesture = 3, pinchout, float
gesture = 3, pinchin, float
# 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, Q, exec, $terminal
bind = $mainMod, C, killactive,
bind = $mainMod, M, exec, command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch exit
bind = $mainMod, E, exec, $fileManager
bind = $mainMod, V, togglefloating,
bind = $mainMod, RETURN, exec, export PATH="$HOME/.local/bin:$PATH" && $menu
bind = $mainMod, P, pseudo, # dwindle
# bind = $mainMod, J, layoutmsg # dwindle
bind = $mainMod, J, layoutmsg, togglesplit
bind = $mainMod, N, exec, $HOME/.local/bin/hyprltm-net
bind = $mainMod, W, exec, /home/sinsa/.config/hypr/scripts/rw.sh
bind = $mainMod, O, exec, pkill waybar
bind = $mainMod SHIFT, O, exec, waybar -c $HOME/.config/waybar/configs/default -s $HOME/.config/waybar/style/islands.css
#OPEN COPY PASTE HYSTORY
bind = $mainMod SHIFT, V, exec, cliphist list | rofi -dmenu | cliphist decode | wl-copy
# CONNECT AUTOMATICALLY TO EDUROAM
bind = $mainMod, L, exec, $HOME/.local/bin/eduroam
# SWITCH KEYBOARD LAYOUT
# WIP!!!
# bind = $mainMod, space,
bind = $mainMod, Z, exec, $HOME/.local/bin/zen-twilight
binde = SUPER SHIFT, 201, exec, notify-send hello
# Fullscreen window
bind = $mainMod SHIFT, F, fullscreen, 0
bind = $mainMod , F, fullscreen, 1
# Move focus with mainMod + arrow keys
bind = $mainMod, left, movefocus, l
bind = $mainMod, right, movefocus, r
bind = $mainMod, up, movefocus, u
bind = $mainMod, down, movefocus, d
# 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
bind = $mainMod CTRL, left, workspace, r-1
bind = $mainMod CTRL, right, workspace, r+1
# 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 CTRL SHIFT, left, movetoworkspace, r-1
bind = $mainMod CTRL SHIFT, right, movetoworkspace, r+1
# Move window
bind = $mainMod SHIFT, left, movewindow, l
bind = $mainMod SHIFT, right, movewindow,r
bind = $mainMod SHIFT, up, movewindow, u
bind = $mainMod SHIFT, down, movewindow, d
# Resize window
binde = $mainMod ALT, right, resizeactive, 10 0
binde = $mainMod ALT, left, resizeactive, -10 0
binde = $mainMod ALT, up, resizeactive, 0 -10
binde = $mainMod ALT, down, resizeactive, 0 10
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
bindm = $mainMod SHIFT, mouse:272, resizewindow
bind = , Print, exec, hyprshot -m region -o /home/sinsa/Pictures/Screenshots/
bind = $mainMod ,Print, exec, hyprshot -zm region --clipboard-only -o /home/sinsa/Pictures/Screenshots/
# Laptop multimedia keys for volume and LCD brightness
bindel = ,XF86AudioRaiseVolume, exec, $HOME/.config/hypr/scripts/volume.sh --inc
bindel = ,XF86AudioLowerVolume, exec, $HOME/.config/hypr/scripts/volume.sh --dec
bindel = ,XF86AudioMute, exec, $HOME/.config/hypr/scripts/volume.sh --toggle
bindel = ,XF86AudioMicMute, exec, $HOME/.config/hypr/scripts/volume.sh --toggle-mic
bindel = ,XF86MonBrightnessUp, exec, $HOME/.config/hypr/scripts/brightness.sh --inc
bindel = ,XF86MonBrightnessDown, exec, $HOME/.config/hypr/scripts/brightness.sh --dec
#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
# Lock
bindl=,switch:Lid Switch, exec, hyprlock
##############################
### WINDOWS AND WORKSPACES ###
##############################
# See https://wiki.hypr.land/Configuring/Window-Rules/ for more
# See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules
### TAGS ###
source= ~/.config/hypr/configs/tags.conf
# Example windowrules that are useful
### WINDOWRULES AND LAYERRULES ###
source = ~/.config/hypr/configs/windowrules.conf
#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
#}
+480
View File
@@ -0,0 +1,480 @@
# #######################################################################################
# AUTOGENERATED HYPRLAND CONFIG.
# EDIT THIS CONFIG ACCORDING TO THE WIKI INSTRUCTIONS.
# #######################################################################################
# This is an example Hyprland config file.
# Refer to the wiki for more information.
# https://wiki.hypr.land/Configuring/
# Please note not all available settings / options are set here.
# For a full list, see the wiki
# You can split this configuration into multiple files
# Create your files separately and then link them to this file like this:
# source = ~/.config/hypr/myColors.conf
################
### MONITORS ###
################
# See https://wiki.hypr.land/Configuring/Monitors/
monitor= DP-1, 3072x1920@140, auto, auto
###################
### MY PROGRAMS ###
###################
# See https://wiki.hypr.land/Configuring/Keywords/
# Set programs that you use
$terminal = kitty
$fileManager = nautilus
# $menu = hyprlauncher
$menu = 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
# exec-once = nm-applet
exec-once = waybar -c /home/sinsa/.config/waybar/configs/default -s /home/sinsa/.config/waybar/style/islands.css
exec-once = swww-daemon
exec-once = blueman-applet
exec-once = swaync
# exec-once = hyprpanel
# exec-once = hyprpaper
# exec-once = ashell & hyprpaper
exec-once = systemctl --user start hyprpolkitagent
exec-once = nextcloud
exec-once = hypridle
exec-once = /home/sinsa/.local/bin/eduroamcondizionale
#############################
### 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
# CIANO TO BLU
# col.active_border = rgba(00ffffff) rgba(57a7e6ff) 45deg
col.active_border = rgba(00bbffff) rgba(57a7e6ff) 45deg
col.inactive_border = rgba(595959aa)
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = true
# 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 = 10
rounding_power = 2
# Change transparency of focused and unfocused windows
active_opacity = 1.0
inactive_opacity = 1.0
shadow {
enabled = true
range = 4
render_power = 3
color = rgba(1a1a1aee)
}
# https://wiki.hypr.land/Configuring/Variables/#blur
blur {
enabled = true
size = 3
passes = 1
vibrancy = 0.1696
}
}
# 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 = true # If true disables the random hyprland logo / anime girl background. :(
}
device {
name = royuan-rt100-wired-system-control
kb_layout = us
}
#############
### INPUT ###
#############
# https://wiki.hypr.land/Configuring/Variables/#input
input {
kb_layout = it
# kb_variant = intl
# kb_model =
# kb_options =
# kb_rules =
follow_mouse = 1
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
touchpad {
clickfinger_behavior = 0
natural_scroll = true
}
}
device {
name = royuan-rt100-wired-system-control
kb_layout = us
kb_variant = intl,
kb_options = altwin:swap_alt_win, nodeadkeys
}
device {
name = royuan-rt100-wired-keyboard
kb_layout = us
kb_variant = intl
kb_options = altwin:swap_alt_win, nodeadkeys
}
device {
name = royuan-rt100-wired-consumer-control
kb_layout = us
kb_variant = intl
kb_options = altwin:swap_alt_win, nodeadkeys
}
device {
name = royuan-rt100-wired
kb_layout = us
kb_variant = intl
kb_options = altwin:swap_alt_win, nodeadkeys
}
device {
name = at-translated-set-2-keyboard
kb_layout = it
}
#
#input {
# kb_layout = us
# kb_variant = intl
# device = royuan-rt100-wired-keyboard
#}
#
# See https://wiki.hypr.land/Configuring/Gestures
# -------- GESTURES ---------
# gesture = 3, horizontal, workspace
gesture = 3, swipe, move
gesture = 4, vertical, fullscreen, maximize
gesture = 4, horizontal, workspace
gesture = 3, pinchout, float
gesture = 3, pinchin, float
# 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, Q, exec, $terminal
bind = $mainMod, C, killactive,
bind = $mainMod, M, exec, command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch exit
bind = $mainMod, E, exec, $fileManager
bind = $mainMod, V, togglefloating,
bind = $mainMod, RETURN, exec, $menu
bind = $mainMod, P, pseudo, # dwindle
bind = $mainMod, J, layoutmsg # dwindle
bind = $mainMod, N, exec, $HOME/.local/bin/hyprltm-net
bind = $mainMod, W, exec, /home/sinsa/.config/hypr/scripts/rw.sh
# CONNECT AUTOMATICALLY TO EDUROAM
bind = $mainMod, L, exec, $HOME/.local/bin/eduroam
# SWITCH KEYBOARD LAYOUT
# WIP!!!
# bind = $mainMod, space,
bind = $mainMod, Z, exec, /home/sinsa/.local/bin/zen-twilight
# Fullscreen window
bind = $mainMod SHIFT, F, fullscreen, 0
bind = $mainMod , F, fullscreen, 1
# Move focus with mainMod + arrow keys
bind = $mainMod, left, movefocus, l
bind = $mainMod, right, movefocus, r
bind = $mainMod, up, movefocus, u
bind = $mainMod, down, movefocus, d
# 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 CTRL, 1, movetoworkspace, 1
bind = $mainMod CTRL, 2, movetoworkspace, 2
bind = $mainMod CTRL, 3, movetoworkspace, 3
bind = $mainMod CTRL, 4, movetoworkspace, 4
bind = $mainMod CTRL, 5, movetoworkspace, 5
bind = $mainMod CTRL, 6, movetoworkspace, 6
bind = $mainMod CTRL, 7, movetoworkspace, 7
bind = $mainMod CTRL, 8, movetoworkspace, 8
bind = $mainMod CTRL, 9, movetoworkspace, 9
bind = $mainMod CTRL, 0, movetoworkspace, 10
# Move window
bind = $mainMod SHIFT, left, movewindow, l
bind = $mainMod SHIFT, right, movewindow,r
bind = $mainMod SHIFT, up, movewindow, u
bind = $mainMod SHIFT, down, movewindow, d
# Resize window
bind = $mainMod ALT, right, resizeactive, 10 0
bind = $mainMod ALT, left, resizeactive, -10 0
bind = $mainMod ALT, up, resizeactive, 0 -10
bind = $mainMod ALT, down, resizeactive, 0 10
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
bindm = $mainMod SHIFT, mouse:272, 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
# Lock
bindl=,switch:Lid Switch, exec, hyprlock
##############################
### 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
}
+148
View File
@@ -0,0 +1,148 @@
source = colors.conf
$Scripts = $HOME/.config/hypr/scripts
auth {
pam {
enabled = true
}
fingerprint {
enabled = true
ready_message = "Scan fingerprint to unlock"
present_message = "Scanning"
retry_delay = 250
}
}
general {
grace = 1
fractional_scaling = 2
immediate_render = true
}
background {
monitor =
# NOTE: use only 1 path
# path = screenshot # screenshot of your desktop
#path = $HOME/.config/hypr/wallpaper_effects/.wallpaper_modified # by wallpaper effects
path = ~/.config/hypr/current_wallpaper # CURRENT WALLPAPER
color = rgb(0,0,0) # color will be rendered initially until path is available
# all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations
blur_size = 3
blur_passes = 2 # 0 disables blurring
noise = 0.0117
contrast = 1.3000 # Vibrant!!!
brightness = 0.6000
vibrancy = 0.2100
vibrancy_darkness = 0.0
}
# Hours
label {
monitor =
text = cmd[update:1000] echo "<b><big> $(date +"%H") </big></b>"
color = $on_secondary_container
font_size = 112
font_family = Adwaita Sans
shadow_passes = 0
shadow_size = 0
position = 0, 220
halign = center
valign = center
}
# Minutes
label {
monitor =
text = cmd[update:1000] echo "<b><big> $(date +"%M") </big></b>"
color = $on_secondary_container
font_size = 112
font_family = Adwaita Sans
shadow_passes = 0
shadow_size = 0
position = 0, 80
halign = center
valign = center
}
# Today
label {
monitor =
text = cmd[update:18000000] echo "<b><big> "$(date +'%A')" </big></b>"
color = $secondary
font_size = 18
font_family = JetBrainsMono NFM
position = 0, -15
halign = center
valign = center
}
# Week
label {
monitor =
text = cmd[update:18000000] echo "<b> "$(date +'%d %b')" </b>"
color = $secondary
font_size = 14
font_family = JetBrainsMono Nerd Font 10
position = 0, -40
halign = center
valign = center
}
# Degrees
#label {
monitor =
text = cmd[update:18000000] echo "<b>Feels like<big> $(curl -s 'wttr.in?format=%t' | tr -d '+') </big></b>"
color = $color8
font_size = 14
font_family = JetBrainsMono NFM
position = 0, 40
halign = center
valign = bottom
}
# USER
#label {
monitor =
text = $USER
color = $color8
font_size = 14
font_family = JetBrainsMono NFM Bold
position = 0, 200
halign = center
valign = bottom
}
input-field {
monitor =
size = 250, 50
outline_thickness = 3
dots_size = 0.26 # Scale of input-field height, 0.2 - 0.8
dots_spacing = 0.64 # Scale of dots' absolute size, 0.0 - 1.0
dots_center = true
dots_rouding = -1
rounding = 22
outer_color = $source_color
inner_color = rgba(255, 255, 255, 0.1)
font_color = $secondary
fade_on_empty = true
placeholder_text = <i>Password...</i> # Text rendered in the input box when it's empty.
position = 0, 120
halign = center
valign = bottom
}
+75
View File
@@ -0,0 +1,75 @@
auth {
pam {
enabled = true
}
fingerprint {
enabled = true
ready_message = "Scan fingerprint to unlock"
present_message = "Scanning"
retry_delay = 250
}
}
background {
monitor =
path = ~/Pictures/Sfondi/4.jpg
blur_passes = 3
contrast = 0.8916
brightness = 0.8172
vibrancy = 0.1696
vibrancy_darkness = 0.0
}
# Date display
label {
monitor =
text = cmd[update:1000] echo -e "$(LC_TIME=en_US.UTF-8 date +"%A, %B %d")"
color = rgba(216, 222, 233, 0.90)
font_size = 25
font_family = SF Pro Display Semibold
position = 0, 350
halign = center
valign = center
}
# Time display
label {
monitor =
text = cmd[update:1000] echo "<span>$(date +"%H:%M")</span>"
color = rgba(216, 222, 233, 0.90)
font_size = 120
font_family = SF Pro Display Bold
position = 0, 230
halign = center
valign = center
}
input-field {
monitor =
size = 280, 55
outline_thickness = 2
dots_size = 0.2
dots_spacing = 0.2
dots_center = true
outer_color = rgba(0, 0, 0, 0)
inner_color = rgba(255, 255, 255, 0.1)
font_color = rgb(200, 200, 200)
fade_on_empty = false
font_family = SF Pro Display Bold
placeholder_text = <i><span foreground="##ffffff99"> Hi Sinsa :)</span></i>
hide_input = false
position = 0, -210
halign = center
valign = center
}
+14
View File
@@ -0,0 +1,14 @@
preload=/home/sinsa/Pictures/hypr5.jpg
splash = false
# wallpaper {
# monitor =
# path = /home/sinsa/Pictures/Sfondi/6.jpg
# fit_mode = cover
# }
wallpaper {
monitor =
path = /home/sinsa/.config/hypr/current_wallpaper
fit_mode = cover
}
+16
View File
@@ -0,0 +1,16 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Airplane Mode. Turning on or off all wifi using rfkill.
notif="$HOME/.config/swaync/images/airplane.png"
# Check if any wireless device is blocked
wifi_blocked=$(rfkill list wifi | grep -o "Soft blocked: yes")
if [ -n "$wifi_blocked" ]; then
rfkill unblock wifi
notify-send -u low -i "$notif" " Airplane" " mode: OFF"
else
rfkill block wifi
notify-send -u low -i "$notif" " Airplane" " mode: ON"
fi
+11
View File
@@ -0,0 +1,11 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Copied from Discord post. Thanks to @Zorg
# Get id of an active window
active_pid=$(hyprctl activewindow | grep -o 'pid: [0-9]*' | cut -d' ' -f2)
# Close active window
kill $active_pid
+55
View File
@@ -0,0 +1,55 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Script for waybar layout or configs
IFS=$'\n\t'
# Define directories
waybar_layouts="$HOME/.config/waybar/configs"
waybar_config="$HOME/.config/waybar/config"
SCRIPTSDIR="$HOME/.config/hypr/scripts"
rofi_config="$HOME/.config/rofi/config.rasi"
msg=' Choose Waybar Layout '
# Function to display menu options
menu() {
options=()
while IFS= read -r file; do
options+=("$(basename "$file")")
done < <(find -L "$waybar_layouts" -maxdepth 1 -type f -exec basename {} \; | sort )
printf '%s\n' "${options[@]}"
}
# Apply selected configuration
apply_config() {
ln -sf "$waybar_layouts/$1" "$waybar_config"
"${SCRIPTSDIR}/wbrestart.sh" &
}
# Main function
main() {
choice=$(menu | rofi -i -dmenu -config "$rofi_config" -mesg "$msg")
if [[ -z "$choice" ]]; then
echo "No option selected. Exiting."
exit 0
fi
case $choice in
"no panel")
pgrep -x "waybar" && pkill waybar || true
;;
*)
apply_config "$choice"
;;
esac
}
# Kill Rofi if already running before execution
if pgrep -x "rofi" >/dev/null; then
pkill rofi
#exit 0
fi
main
+50
View File
@@ -0,0 +1,50 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Script for waybar styles
IFS=$'\n\t'
# Define directories
waybar_styles="$HOME/.config/waybar/style"
waybar_style="$HOME/.config/waybar/style.css"
SCRIPTSDIR="$HOME/.config/hypr/scripts"
rofi_config="$HOME/.config/rofi/config.rasi"
msg=' Choose Waybar Style'
# Function to display menu options
menu() {
options=()
while IFS= read -r file; do
if [ -f "$waybar_styles/$file" ]; then
options+=("$(basename "$file" .css)")
fi
done < <(find -L "$waybar_styles" -maxdepth 1 -type f -name '*.css' -exec basename {} \; | sort )
printf '%s\n' "${options[@]}"
}
# Apply selected style
apply_style() {
ln -sf "$waybar_styles/$1.css" "$waybar_style"
"${SCRIPTSDIR}/wbrestart.sh" &
}
# Main function
main() {
choice=$(menu | rofi -i -dmenu -config "$rofi_config" -mesg "$msg")
if [[ -z "$choice" ]]; then
echo "No option selected. Exiting."
exit 0
fi
apply_style "$choice"
}
# Kill Rofi if already running before execution
if pgrep -x "rofi" >/dev/null; then
pkill rofi
#exit 0
fi
main
+2
View File
@@ -0,0 +1,2 @@
#!/bin/zsh
wlogout
+74
View File
@@ -0,0 +1,74 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Script for Monitor backlights (if supported) using brightnessctl
iDIR="$HOME/.config/swaync/icons"
notification_timeout=1000
step=5 # INCREASE/DECREASE BY THIS VALUE
# Get brightness
get_backlight() {
brightnessctl -m | cut -d, -f4 | sed 's/%//'
}
# Get icons
get_icon() {
current=$(get_backlight)
if [ "$current" -le "20" ]; then
icon="$iDIR/brightness-20.png"
elif [ "$current" -le "40" ]; then
icon="$iDIR/brightness-40.png"
elif [ "$current" -le "60" ]; then
icon="$iDIR/brightness-60.png"
elif [ "$current" -le "80" ]; then
icon="$iDIR/brightness-80.png"
else
icon="$iDIR/brightness-100.png"
fi
}
# Notify
notify_user() {
notify-send -e -h string:x-canonical-private-synchronous:brightness_notif -h int:value:$current -u low -i $icon "Screen" "Brightness:$current%"
}
# Change brightness
change_backlight() {
local current_brightness
current_brightness=$(get_backlight)
# Calculate new brightness
if [[ "$1" == "+${step}%" ]]; then
new_brightness=$((current_brightness + step))
elif [[ "$1" == "${step}%-" ]]; then
new_brightness=$((current_brightness - step))
fi
# Ensure new brightness is within valid range
if ((new_brightness < 5)); then
new_brightness=5
elif ((new_brightness > 100)); then
new_brightness=100
fi
brightnessctl set "${new_brightness}%"
get_icon
current=$new_brightness
notify_user
}
# Execute accordingly
case "$1" in
"--get")
get_backlight
;;
"--inc")
change_backlight "+${step}%"
;;
"--dec")
change_backlight "${step}%-"
;;
*)
get_backlight
;;
esac
+2
View File
@@ -0,0 +1,2 @@
#!/bin/zsh
hyprlock
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
pkill waybar
waybar -c /home/sinsa/.config/waybar/configs/default -s /home/sinsa/.config/waybar/style/islands.css
+2
View File
@@ -0,0 +1,2 @@
!#/bin/zsh
grim -g "$(slurp)" &
+144
View File
@@ -0,0 +1,144 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Scripts for volume controls for audio and mic
iDIR="$HOME/.config/swaync/icons"
sDIR="$HOME/.config/hypr/scripts"
# Get Volume
get_volume() {
volume=$(pamixer --get-volume)
if [[ "$volume" -eq "0" ]]; then
echo "Muted"
else
echo "$volume %"
fi
}
# Get icons
get_icon() {
current=$(get_volume)
if [[ "$current" == "Muted" ]]; then
echo "$iDIR/volume-mute.png"
elif [[ "${current%\%}" -le 30 ]]; then
echo "$iDIR/volume-low.png"
elif [[ "${current%\%}" -le 60 ]]; then
echo "$iDIR/volume-mid.png"
else
echo "$iDIR/volume-high.png"
fi
}
# Notify
notify_user() {
if [[ "$(get_volume)" == "Muted" ]]; then
notify-send -e -h string:x-canonical-private-synchronous:volume_notif -u low -i "$(get_icon)" " Volume:" " Muted"
else
notify-send -e -h int:value:"$(get_volume | sed 's/%//')" -h string:x-canonical-private-synchronous:volume_notif -u low -i "$(get_icon)" " Volume Level:" " $(get_volume)" &&
"$sDIR/Sounds.sh" --volume
fi
}
# Increase Volume
inc_volume() {
if [ "$(pamixer --get-mute)" == "true" ]; then
toggle_mute
else
pamixer -i 5 --allow-boost --set-limit 150 && notify_user
fi
}
# Decrease Volume
dec_volume() {
if [ "$(pamixer --get-mute)" == "true" ]; then
toggle_mute
else
pamixer -d 5 && notify_user
fi
}
# Toggle Mute
toggle_mute() {
if [ "$(pamixer --get-mute)" == "false" ]; then
pamixer -m && notify-send -e -u low -i "$iDIR/volume-mute.png" " Mute"
elif [ "$(pamixer --get-mute)" == "true" ]; then
pamixer -u && notify-send -e -u low -i "$(get_icon)" " Volume:" " Switched ON"
fi
}
# Toggle Mic
toggle_mic() {
if [ "$(pamixer --default-source --get-mute)" == "false" ]; then
pamixer --default-source -m && notify-send -e -u low -i "$iDIR/microphone-mute.png" " Microphone:" " Switched OFF"
elif [ "$(pamixer --default-source --get-mute)" == "true" ]; then
pamixer -u --default-source u && notify-send -e -u low -i "$iDIR/microphone.png" " Microphone:" " Switched ON"
fi
}
# Get Mic Icon
get_mic_icon() {
current=$(pamixer --default-source --get-volume)
if [[ "$current" -eq "0" ]]; then
echo "$iDIR/microphone-mute.png"
else
echo "$iDIR/microphone.png"
fi
}
# Get Microphone Volume
get_mic_volume() {
volume=$(pamixer --default-source --get-volume)
if [[ "$volume" -eq "0" ]]; then
echo "Muted"
else
echo "$volume %"
fi
}
# Notify for Microphone
notify_mic_user() {
volume=$(get_mic_volume)
icon=$(get_mic_icon)
notify-send -e -h int:value:"$volume" -h "string:x-canonical-private-synchronous:volume_notif" -u low -i "$icon" " Mic Level:" " $volume"
}
# Increase MIC Volume
inc_mic_volume() {
if [ "$(pamixer --default-source --get-mute)" == "true" ]; then
toggle_mic
else
pamixer --default-source -i 5 && notify_mic_user
fi
}
# Decrease MIC Volume
dec_mic_volume() {
if [ "$(pamixer --default-source --get-mute)" == "true" ]; then
toggle-mic
else
pamixer --default-source -d 5 && notify_mic_user
fi
}
# Execute accordingly
if [[ "$1" == "--get" ]]; then
get_volume
elif [[ "$1" == "--inc" ]]; then
inc_volume
elif [[ "$1" == "--dec" ]]; then
dec_volume
elif [[ "$1" == "--toggle" ]]; then
toggle_mute
elif [[ "$1" == "--toggle-mic" ]]; then
toggle_mic
elif [[ "$1" == "--get-icon" ]]; then
get_icon
elif [[ "$1" == "--get-mic-icon" ]]; then
get_mic_icon
elif [[ "$1" == "--mic-inc" ]]; then
inc_mic_volume
elif [[ "$1" == "--mic-dec" ]]; then
dec_mic_volume
else
get_volume
fi
+14
View File
@@ -0,0 +1,14 @@
#!/bin/bash
ICON_CONN="󰒄"
ICON_DISCONN="󰲛"
a=$(nmcli connection show --active | grep "casa")
if [ $(nmcli connection show --active | grep "casa") ]; then
TEXT="$ICON_CONN"
else
TEXT="$ICON_DISCONN"
fi
printf '{"text":"%s"}\n' "$TEXT"
+42
View File
@@ -0,0 +1,42 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Not my own work. This was added through Github PR. Credit to original author
#----- Optimized bars animation without much CPU usage increase --------
bar="▁▂▃▄▅▆▇█"
dict="s/;//g"
# Calculate the length of the bar outside the loop
bar_length=${#bar}
# Create dictionary to replace char with bar
for ((i = 0; i < bar_length; i++)); do
dict+=";s/$i/${bar:$i:1}/g"
done
# Create cava config
config_file="/tmp/bar_cava_config"
cat >"$config_file" <<EOF
[general]
# Older systems show significant CPU use with default framerate
# Setting maximum framerate to 30
# You can increase the value if you wish
framerate = 30
bars = 10
[input]
method = pulse
source = auto
[output]
method = raw
raw_target = /dev/stdout
data_format = ascii
ascii_max_range = 7
EOF
# Kill cava if it's already running
pkill -f "cava -p $config_file"
# Read stdout from cava and perform substitution in a single sed command
cava -p "$config_file" | sed -u "$dict"
+7
View File
@@ -0,0 +1,7 @@
#!/bin/zsh
killall -9 swaync
killall -9 waybar
swaync &
waybar &
+22
View File
@@ -0,0 +1,22 @@
#!/bin/bash
# === CONFIG ===
WALLPAPER_DIR="$HOME/Pictures/wallpapers"
SYMLINK_PATH="$HOME/.config/hypr/current_wallpaper"
cd "$WALLPAPER_DIR" || exit 1
# === handle spaces name
IFS=$'\n'
# === ICON-PREVIEW SELECTION WITH ROFI, SORTED BY NEWEST ===
SELECTED_WALL=$(for a in $(ls -t *.jpg *.png *.gif *.jpeg 2>/dev/null); do echo -en "$a\0icon\x1f$a\n"; done | rofi -dmenu -p "")
[ -z "$SELECTED_WALL" ] && exit 1
SELECTED_PATH="$WALLPAPER_DIR/$SELECTED_WALL"
# === SET WALLPAPER ===
matugen image "$SELECTED_PATH"
# === CREATE SYMLINK ===
mkdir -p "$(dirname "$SYMLINK_PATH")"
ln -sf "$SELECTED_PATH" "$SYMLINK_PATH"
+27
View File
@@ -0,0 +1,27 @@
# Core Colors
background #151218
foreground #e7e0e8
selection_foreground #d4bbfc
selection_background #3a255b
cursor #d4bbfc
cursor_text_color #151218
# Regular Colors
color0 #151218
color1 #ffb4ab
color2 #d4bbfc
color3 #f1b7c3
color4 #ecdcff
color5 #eadef7
color6 #cec2db
color7 #e7e0e8
# Bright Colors
color8 #3b383e
color9 #ffb4ab
color10 #d4bbfc
color11 #f1b7c3
color12 #ecdcff
color13 #eadef7
color14 #cec2db
color15 #e7e0e8
+80
View File
@@ -0,0 +1,80 @@
# vim:ft=kitty
## name: Catppuccin-Mocha
## author: Pocco81 (https://github.com/Pocco81)
## license: MIT
## upstream: https://github.com/catppuccin/kitty/blob/main/themes/mocha.conf
## blurb: Soothing pastel theme for the high-spirited!
# The basic colors
foreground #CDD6F4
background #1E1E2E
selection_foreground #1E1E2E
selection_background #F5E0DC
# Cursor colors
cursor #F5E0DC
cursor_text_color #1E1E2E
# URL underline color when hovering with mouse
url_color #F5E0DC
# Kitty window border colors
active_border_color #B4BEFE
inactive_border_color #6C7086
bell_border_color #F9E2AF
# OS Window titlebar colors
wayland_titlebar_color system
macos_titlebar_color system
# Tab bar colors
active_tab_foreground #11111B
active_tab_background #CBA6F7
inactive_tab_foreground #CDD6F4
inactive_tab_background #181825
tab_bar_background #11111B
# Colors for marks (marked text in the terminal)
mark1_foreground #1E1E2E
mark1_background #B4BEFE
mark2_foreground #1E1E2E
mark2_background #CBA6F7
mark3_foreground #1E1E2E
mark3_background #74C7EC
# The 16 terminal colors
# black
color0 #45475A
color8 #585B70
# red
color1 #F38BA8
color9 #F38BA8
# green
color2 #A6E3A1
color10 #A6E3A1
# yellow
color3 #F9E2AF
color11 #F9E2AF
# blue
color4 #89B4FA
color12 #89B4FA
# magenta
color5 #F5C2E7
color13 #F5C2E7
# cyan
color6 #94E2D5
color14 #94E2D5
# white
color7 #BAC2DE
color15 #A6ADC8
+80
View File
@@ -0,0 +1,80 @@
# vim:ft=kitty
## name: Catppuccin-Mocha
## author: Pocco81 (https://github.com/Pocco81)
## license: MIT
## upstream: https://github.com/catppuccin/kitty/blob/main/themes/mocha.conf
## blurb: Soothing pastel theme for the high-spirited!
# The basic colors
foreground #CDD6F4
background #1E1E2E
selection_foreground #1E1E2E
selection_background #F5E0DC
# Cursor colors
cursor #F5E0DC
cursor_text_color #1E1E2E
# URL underline color when hovering with mouse
url_color #F5E0DC
# Kitty window border colors
active_border_color #B4BEFE
inactive_border_color #6C7086
bell_border_color #F9E2AF
# OS Window titlebar colors
wayland_titlebar_color system
macos_titlebar_color system
# Tab bar colors
active_tab_foreground #11111B
active_tab_background #CBA6F7
inactive_tab_foreground #CDD6F4
inactive_tab_background #181825
tab_bar_background #11111B
# Colors for marks (marked text in the terminal)
mark1_foreground #1E1E2E
mark1_background #B4BEFE
mark2_foreground #1E1E2E
mark2_background #CBA6F7
mark3_foreground #1E1E2E
mark3_background #74C7EC
# The 16 terminal colors
# black
color0 #45475A
color8 #585B70
# red
color1 #F38BA8
color9 #F38BA8
# green
color2 #A6E3A1
color10 #A6E3A1
# yellow
color3 #F9E2AF
color11 #F9E2AF
# blue
color4 #89B4FA
color12 #89B4FA
# magenta
color5 #F5C2E7
color13 #F5C2E7
# cyan
color6 #94E2D5
color14 #94E2D5
# white
color7 #BAC2DE
color15 #A6ADC8
+3020
View File
File diff suppressed because it is too large Load Diff
+3020
View File
File diff suppressed because it is too large Load Diff
+45
View File
@@ -0,0 +1,45 @@
[config.wallpaper]
command = "awww"
arguments = ["img", "--transition-type", "any", "--transition-fps", "60"]
set = true
[templates.waybar]
input_path = '~/.config/matugen/templates/colors.css'
output_path = '~/.config/waybar/colors.css'
post_hook = 'pkill -SIGUSR2 waybar'
[templates.kitty]
input_path = '~/.config/matugen/templates/kitty-colors.conf'
output_path = '~/.config/kitty/colors.conf'
post_hook = "kill -SIGUSR1 $(pidof kitty)"
[templates.hyprland]
input_path = '~/.config/matugen/templates/hyprland-colors.conf'
output_path = '~/.config/hypr/colors.conf'
post_hook = 'hyprctl reload'
[templates.gtk3]
input_path = '~/.config/matugen/templates/gtk-colors.css'
output_path = '~/.config/gtk-3.0/colors.css'
[templates.gtk4]
input_path = '~/.config/matugen/templates/gtk-colors.css'
output_path = '~/.config/gtk-4.0/colors.css'
[templates.rofi]
input_path = '~/.config/matugen/templates/rofi-colors.rasi'
output_path = '~/.config/rofi/colors.rasi'
[templates.cava]
input_path = '~/.config/matugen/templates/matugen-cava'
output_path = '~/.config/cava/config'
post_hook = "pkill -USR1 cava"
[templates.spicetify]
input_path = '~/.config/matugen/templates/spotify-colors.ini'
output_path = '~/.config/spicetify/Themes/text/color.ini'
[templates.vesktop]
input_path = '~/.config/matugen/templates/midnight-discord.css'
output_path = '~/.config/vesktop/themes/matugen.css'
+7
View File
@@ -0,0 +1,7 @@
/*
* Css Colors
* Generated with Matugen
*/
<* for name, value in colors *>
@define-color {{name}} {{value.default.hex}};
<* endfor *>
+23
View File
@@ -0,0 +1,23 @@
/*
* GTK Colors
* Generated with Matugen
*/
@define-color accent_color {{colors.primary_fixed_dim.default.hex}};
@define-color accent_fg_color {{colors.on_primary_fixed.default.hex}};
@define-color accent_bg_color {{colors.primary_fixed_dim.default.hex}};
@define-color window_bg_color {{colors.surface_dim.default.hex}};
@define-color window_fg_color {{colors.on_surface.default.hex}};
@define-color headerbar_bg_color {{colors.surface_dim.default.hex}};
@define-color headerbar_fg_color {{colors.on_surface.default.hex}};
@define-color popover_bg_color {{colors.surface_dim.default.hex}};
@define-color popover_fg_color {{colors.on_surface.default.hex}};
@define-color view_bg_color {{colors.surface.default.hex}};
@define-color view_fg_color {{colors.on_surface.default.hex}};
@define-color card_bg_color {{colors.surface.default.hex}};
@define-color card_fg_color {{colors.on_surface.default.hex}};
@define-color sidebar_bg_color @window_bg_color;
@define-color sidebar_fg_color @window_fg_color;
@define-color sidebar_border_color @window_bg_color;
@define-color sidebar_backdrop_color @window_bg_color;
+4
View File
@@ -0,0 +1,4 @@
<* for name, value in colors *>
$image = {{image}}
${{name}} = rgba({{value.default.hex_stripped}}ff)
<* endfor *>
+27
View File
@@ -0,0 +1,27 @@
# Core Colors
background {{ colors.background.default.hex }}
foreground {{ colors.on_surface.default.hex }}
selection_foreground {{ colors.primary.default.hex }}
selection_background {{ colors.on_primary.default.hex }}
cursor {{ colors.primary.default.hex }}
cursor_text_color {{ colors.surface.default.hex }}
# Regular Colors
color0 {{ colors.surface.default.hex }}
color1 {{ colors.error.default.hex }}
color2 {{ colors.primary.default.hex }}
color3 {{ colors.tertiary.default.hex }}
color4 {{ colors.on_primary_container.default.hex }}
color5 {{ colors.on_secondary_container.default.hex }}
color6 {{ colors.secondary.default.hex }}
color7 {{ colors.on_surface.default.hex }}
# Bright Colors
color8 {{ colors.surface_bright.default.hex }}
color9 {{ colors.error.default.hex }}
color10 {{ colors.primary.default.hex }}
color11 {{ colors.tertiary.default.hex }}
color12 {{ colors.on_primary_container.default.hex }}
color13 {{ colors.on_secondary_container.default.hex }}
color14 {{ colors.secondary.default.hex }}
color15 {{ colors.on_surface.default.hex }}
+291
View File
@@ -0,0 +1,291 @@
# ┳┳┓┏┓┏┳┓┳┳┏┓┏┓┳┓ ┏┓┏┓┓┏┏┓
# ┃┃┃┣┫ ┃ ┃┃┃┓┣ ┃┃━━┃ ┣┫┃┃┣┫
# ┛ ┗┛┗ ┻ ┗┛┗┛┗┛┛┗ ┗┛┛┗┗┛┛┗
#
## Configuration file for CAVA.
# Remove the ; to change parameters.
[general]
# 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 = 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 calulate max number of bars.
; bar_width = 1
; bar_spacing = 0
# 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 if a too low band is specified.
; 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.
#
# 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 '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.
#
; sample_rate = 44100
; sample_bits = 16
; channels = 2
; autoconnect = 2
[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 200 bars, 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' or 'right'.
# Default is 'bottom'. Other orientations are only supported on sdl and ncruses
# output. Note: many fonts have weird glyphs for 'top' and 'right' characters,
# which can make ncurses 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 = stereo
; mono_option = average
; reverse = 0
# Raw output target. A fifo 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 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 = 1000
; sdl_height = 500
; 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 alacritty synchronized updates. 1 = on, 0 = off
# removes flickering in alacritty terminal emulator.
# defaults to off since the behaviour in other terminal emulators is unknown
; alacritty_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'
# these are default
# 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_count = 8
; 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'
# for matugen
gradient = 1
gradient_count = 2
gradient_color_1 = '{{colors.surface_bright.default.hex}}'
gradient_color_2 = '{{colors.primary.default.hex}}'
[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 = 100
# 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
+99
View File
@@ -0,0 +1,99 @@
/**
* @name midnight
* @description A dark, rounded discord theme.
* @author refact0r
* @version 1.6.2
* @invite nz87hXyvcy
* @website https://github.com/refact0r/midnight-discord
* @source https://github.com/refact0r/midnight-discord/blob/master/midnight.theme.css
* @authorId 508863359777505290
* @authorLink https://www.refact0r.dev
*/
/* IMPORTANT: make sure to enable dark mode in discord settings for the theme to apply properly!!! */
@import url('https://raw.githubusercontent.com/refact0r/midnight-discord/refs/heads/master/themes/midnight.theme.css');
/* customize things here */
:root {
/* font, change to 'gg sans' for default discord font*/
--font: 'figtree';
/* top left corner text */
--corner-text: 'Midnight';
/* color of status indicators and window controls */
--online-indicator: {{colors.inverse_primary.default.hex}}; /* change to #23a55a for default green */
--dnd-indicator: {{colors.error.default.hex}}; /* change to #f13f43 for default red */
--idle-indicator: {{colors.tertiary_container.default.hex}}; /* change to #f0b232 for default yellow */
--streaming-indicator: {{colors.on_primary.default.hex}}; /* change to #593695 for default purple */
/* accent colors */
--accent-1: {{colors.tertiary.default.hex}}; /* links */
--accent-2: {{colors.primary.default.hex}}; /* general unread/mention elements, some icons when active */
--accent-3: {{colors.primary.default.hex}}; /* accent buttons */
--accent-4: {{colors.surface_bright.default.hex}}; /* accent buttons when hovered */
--accent-5: {{colors.primary_fixed_dim.default.hex}}; /* accent buttons when clicked */
--mention: {{colors.surface.default.hex}}; /* mentions & mention messages */
--mention-hover: {{colors.surface_bright.default.hex}}; /* mentions & mention messages when hovered */
/* text colors */
--text-0: {{colors.surface.default.hex}}; /* text on colored elements */
--text-1: {{colors.on_surface.default.hex}}; /* other normally white text */
--text-2: {{colors.on_surface.default.hex}}; /* headings and important text */
--text-3: {{colors.on_surface_variant.default.hex}}; /* normal text */
--text-4: {{colors.on_surface_variant.default.hex}}; /* icon buttons and channels */
--text-5: {{colors.outline.default.hex}}; /* muted channels/chats and timestamps */
/* background and dark colors */
--bg-1: {{colors.primary.default.hex}}; /* dark buttons when clicked */
--bg-2: {{colors.surface_container_high.default.hex}}; /* dark buttons */
--bg-3: {{colors.surface_container_low.default.hex}}; /* spacing, secondary elements */
--bg-4: {{colors.surface.default.hex}}; /* main background color */
--hover: {{colors.surface_bright.default.hex}}; /* channels and buttons when hovered */
--active: {{colors.surface_bright.default.hex}}; /* channels and buttons when clicked or selected */
--message-hover: {{colors.surface_bright.default.hex}}; /* messages when hovered */
/* amount of spacing and padding */
--spacing: 12px;
/* animations */
/* ALL ANIMATIONS CAN BE DISABLED WITH REDUCED MOTION IN DISCORD SETTINGS */
--list-item-transition: 0.2s ease; /* channels/members/settings hover transition */
--unread-bar-transition: 0.2s ease; /* unread bar moving into view transition */
--moon-spin-transition: 0.4s ease; /* moon icon spin */
--icon-spin-transition: 1s ease; /* round icon button spin (settings, emoji, etc.) */
/* corner roundness (border-radius) */
--roundness-xl: 22px; /* roundness of big panel outer corners */
--roundness-l: 20px; /* popout panels */
--roundness-m: 16px; /* smaller panels, images, embeds */
--roundness-s: 12px; /* members, settings inputs */
--roundness-xs: 10px; /* channels, buttons */
--roundness-xxs: 8px; /* searchbar, small elements */
/* direct messages moon icon */
/* change to block to show, none to hide */
--discord-icon: none; /* discord icon */
--moon-icon: block; /* moon icon */
--moon-icon-url: url('https://upload.wikimedia.org/wikipedia/commons/c/c4/Font_Awesome_5_solid_moon.svg'); /* custom icon url */
--moon-icon-size: auto;
/* filter uncolorable elements to fit theme */
/* (just set to none, they're too much work to configure) */
--login-bg-filter: saturate(0.3) hue-rotate(-15deg) brightness(0.4); /* login background artwork */
--green-to-accent-3-filter: hue-rotate(56deg) saturate(1.43); /* add friend page explore icon */
--blurple-to-accent-3-filter: hue-rotate(304deg) saturate(0.84) brightness(1.2); /* add friend page school icon */
}
/* Selected chat/friend text */
.selected_f5eb4b,
.selected_f6f816 .link_d8bfb3 {
color: var(--text-0) !important;
background: var(--accent-3) !important;
}
.selected_f6f816 .link_d8bfb3 * {
color: var(--text-0) !important;
fill: var(--text-0) !important;
}
+47
View File
@@ -0,0 +1,47 @@
* {
primary: {{colors.primary.default.hex}};
primary-fixed: {{colors.primary_fixed.default.hex}};
primary-fixed-dim: {{colors.primary_fixed_dim.default.hex}};
on-primary: {{colors.on_primary.default.hex}};
on-primary-fixed: {{colors.on_primary_fixed.default.hex}};
on-primary-fixed-variant: {{colors.on_primary_fixed_variant.default.hex}};
primary-container: {{colors.primary_container.default.hex}};
on-primary-container: {{colors.on_primary_container.default.hex}};
secondary: {{colors.secondary.default.hex}};
secondary-fixed: {{colors.secondary_fixed.default.hex}};
secondary-fixed-dim: {{colors.secondary_fixed_dim.default.hex}};
on-secondary: {{colors.on_secondary.default.hex}};
on-secondary-fixed: {{colors.on_secondary_fixed.default.hex}};
on-secondary-fixed-variant: {{colors.on_secondary_fixed_variant.default.hex}};
secondary-container: {{colors.secondary_container.default.hex}};
on-secondary-container: {{colors.on_secondary_container.default.hex}};
tertiary: {{colors.tertiary.default.hex}};
tertiary-fixed: {{colors.tertiary_fixed.default.hex}};
tertiary-fixed-dim: {{colors.tertiary_fixed_dim.default.hex}};
on-tertiary: {{colors.on_tertiary.default.hex}};
on-tertiary-fixed: {{colors.on_tertiary_fixed.default.hex}};
on-tertiary-fixed-variant: {{colors.on_tertiary_fixed_variant.default.hex}};
tertiary-container: {{colors.tertiary_container.default.hex}};
on-tertiary-container: {{colors.on_tertiary_container.default.hex}};
error: {{colors.error.default.hex}};
on-error: {{colors.on_error.default.hex}};
error-container: {{colors.error_container.default.hex}};
on-error-container: {{colors.on_error_container.default.hex}};
surface: {{colors.surface.default.hex}};
on-surface: {{colors.on_surface.default.hex}};
on-surface-variant: {{colors.on_surface_variant.default.hex}};
outline: {{colors.outline.default.hex}};
outline-variant: {{colors.outline_variant.default.hex}};
shadow: {{colors.shadow.default.hex}};
scrim: {{colors.scrim.default.hex}};
inverse-surface: {{colors.inverse_surface.default.hex}};
inverse-on-surface: {{colors.inverse_on_surface.default.hex}};
inverse-primary: {{colors.inverse_primary.default.hex}};
surface-dim: {{colors.surface_dim.default.hex}};
surface-bright: {{colors.surface_bright.default.hex}};
surface-container-lowest: {{colors.surface_container_lowest.default.hex}};
surface-container-low: {{colors.surface_container_low.default.hex}};
surface-container: {{colors.surface_container.default.hex}};
surface-container-high: {{colors.surface_container_high.default.hex}};
surface-container-highest: {{colors.surface_container_highest.default.hex}};
}
+14
View File
@@ -0,0 +1,14 @@
[Spicetify]
accent = {{ colors.on_surface.default.hex_stripped }}
accent-active = {{ colors.primary.default.hex_stripped }}
accent-inactive = {{ colors.surface.default.hex_stripped }}
banner = {{ colors.primary.default.hex_stripped }}
border-active = {{ colors.outline.default.hex_stripped }}
border-inactive = {{ colors.outline_variant.default.hex_stripped }}
header = {{ colors.on_surface.default.hex_stripped }}
highlight = {{ colors.surface_container_low.default.hex_stripped }}
main = {{ colors.surface.default.hex_stripped }}
notification = {{ colors.tertiary.default.hex_stripped }}
notification-error = {{ colors.error.default.hex_stripped }}
subtext = {{ colors.on_surface_variant.default.hex_stripped }}
text = {{ colors.on_surface.default.hex_stripped }}
+673
View File
@@ -0,0 +1,673 @@
// This config is in the KDL format: https://kdl.dev
// "/-" comments out the following node.
// Check the wiki for a full description of the configuration:
// https://yalter.github.io/niri/Configuration:-Introduction
// Input device configuration.
// Find the full list of options on the wiki:
// https://yalter.github.io/niri/Configuration:-Input
input {
keyboard {
xkb {
// You can set rules, model, layout, variant and options.
// For more information, see xkeyboard-config(7).
// For example:
layout "it,us"
// options "grp:win_space_toggle,compose:ralt,ctrl:nocaps"
// If this section is empty, niri will fetch xkb settings
// from org.freedesktop.locale1. You can control these using
// localectl set-x11-keymap.
}
// Enable numlock on startup, omitting this setting disables it.
numlock
}
// Next sections include libinput settings.
// Omitting settings disables them, or leaves them at their default values.
// All commented-out settings here are examples, not defaults.
touchpad {
// off
tap
// dwt
// dwtp
// drag false
// drag-lock
natural-scroll
// acel-speed 0.2
// accel-profile "flat"
// scroll-method "two-finger"
// disabled-on-external-mouse
}
mouse {
// off
// natural-scroll
// accel-speed 0.2
// accel-profile "flat"
// scroll-method "no-scroll"
}
trackpoint {
// off
// natural-scroll
// accel-speed 0.2
// accel-profile "flat"
// scroll-method "on-button-down"
// scroll-button 273
// scroll-button-lock
// middle-emulation
}
// Uncomment this to make the mouse warp to the center of newly focused windows.
// warp-mouse-to-focus
// Focus windows and outputs automatically when moving the mouse into them.
// Setting max-scroll-amount="0%" makes it work only on windows already fully on screen.
focus-follows-mouse max-scroll-amount="0%"
}
// You can configure outputs by their name, which you can find
// by running `niri msg outputs` while inside a niri instance.
// The built-in laptop monitor is usually called "eDP-1".
// Find more information on the wiki:
// https://yalter.github.io/niri/Configuration:-Outputs
// Remember to uncomment the node by removing "/-"!
output "eDP-1" {
// Uncomment this line to disable this output.
// off
// Resolution and, optionally, refresh rate of the output.
// The format is "<width>x<height>" or "<width>x<height>@<refresh rate>".
// If the refresh rate is omitted, niri will pick the highest refresh rate
// for the resolution.
// If the mode is omitted altogether or is invalid, niri will pick one automatically.
// Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.
mode "3072x1920@120.000"
// You can use integer or fractional scale, for example use 1.5 for 150% scale.
scale 2
// Transform allows to rotate the output counter-clockwise, valid values are:
// normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.
transform "normal"
// Position of the output in the global coordinate space.
// This affects directional monitor actions like "focus-monitor-left", and cursor movement.
// The cursor can only move between directly adjacent outputs.
// Output scale and rotation has to be taken into account for positioning:
// outputs are sized in logical, or scaled, pixels.
// For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,
// so to put another output directly adjacent to it on the right, set its x to 1920.
// If the position is unset or results in an overlap, the output is instead placed
// automatically.
position x=1280 y=0
}
// Settings that influence how windows are positioned and sized.
// Find more information on the wiki:
// https://yalter.github.io/niri/Configuration:-Layout
layout {
// Set gaps around windows in logical pixels.
gaps 16
// When to center a column when changing focus, options are:
// - "never", default behavior, focusing an off-screen column will keep at the left
// or right edge of the screen.
// - "always", the focused column will always be centered.
// - "on-overflow", focusing a column will center it if it doesn't fit
// together with the previously focused column.
center-focused-column "never"
// You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between.
preset-column-widths {
// Proportion sets the width as a fraction of the output width, taking gaps into account.
// For example, you can perfectly fit four windows sized "proportion 0.25" on an output.
// The default preset widths are 1/3, 1/2 and 2/3 of the output.
proportion 0.33333
proportion 0.5
proportion 0.66667
// Fixed sets the width in logical pixels exactly.
// fixed 1920
}
// You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between.
// preset-window-heights { }
// You can change the default width of the new windows.
default-column-width { proportion 0.5; }
// If you leave the brackets empty, the windows themselves will decide their initial width.
// default-column-width {}
// By default focus ring and border are rendered as a solid background rectangle
// behind windows. That is, they will show up through semitransparent windows.
// This is because windows using client-side decorations can have an arbitrary shape.
//
// If you don't like that, you should uncomment `prefer-no-csd` below.
// prefer-no-csd
// Niri will draw focus ring and border *around* windows that agree to omit their
// client-side decorations.
//
// Alternatively, you can override it with a window rule called
// draw-border-with-background
// You can change how the focus ring looks.
focus-ring {
// Uncomment this line to disable the focus ring.
// off
// How many logical pixels the ring extends out from the windows.
width 2
// Colors can be set in a variety of ways:
// - CSS named colors: "red"
// - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa"
// - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others.
// Color of the ring on the active monitor.
active-color "#7fc8ff"
// Color of the ring on inactive monitors.
//
// The focus ring only draws around the active window, so the only place
// where you can see its inactive-color is on other monitors.
inactive-color "#505050"
// You can also use gradients. They take precedence over solid colors.
// Gradients are rendered the same as CSS linear-gradient(angle, from, to).
// The angle is the same as in linear-gradient, and is optional,
// defaulting to 180 (top-to-bottom gradient).
// You can use any CSS linear-gradient tool on the web to set these up.
// Changing the color space is also supported, check the wiki for more info.
//
// active-gradient from="#80c8ff" to="#c7ff7f" angle=45
// You can also color the gradient relative to the entire view
// of the workspace, rather than relative to just the window itself.
// To do that, set relative-to="workspace-view".
//
// inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
}
// You can also add a border. It's similar to the focus ring, but always visible.
border {
// The settings are the same as for the focus ring.
// If you enable the border, you probably want to disable the focus ring.
off
width 4
active-color "#ffc87f"
inactive-color "#505050"
// Color of the border around windows that request your attention.
urgent-color "#9b0000"
// Gradients can use a few different interpolation color spaces.
// For example, this is a pastel rainbow gradient via in="oklch longer hue".
//
// active-gradient from="#e5989b" to="#ffb4a2" angle=45 relative-to="workspace-view" in="oklch longer hue"
// inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
}
// You can enable drop shadows for windows.
shadow {
// Uncomment the next line to enable shadows.
// on
// By default, the shadow draws only around its window, and not behind it.
// Uncomment this setting to make the shadow draw behind its window.
//
// Note that niri has no way of knowing about the CSD window corner
// radius. It has to assume that windows have square corners, leading to
// shadow artifacts inside the CSD rounded corners. This setting fixes
// those artifacts.
//
// However, instead you may want to set prefer-no-csd and/or
// geometry-corner-radius. Then, niri will know the corner radius and
// draw the shadow correctly, without having to draw it behind the
// window. These will also remove client-side shadows if the window
// draws any.
//
// draw-behind-window true
// You can change how shadows look. The values below are in logical
// pixels and match the CSS box-shadow properties.
// Softness controls the shadow blur radius.
softness 30
// Spread expands the shadow.
spread 5
// Offset moves the shadow relative to the window.
offset x=0 y=5
// You can also change the shadow color and opacity.
color "#0007"
}
// Struts shrink the area occupied by windows, similarly to layer-shell panels.
// You can think of them as a kind of outer gaps. They are set in logical pixels.
// Left and right struts will cause the next window to the side to always be visible.
// Top and bottom struts will simply add outer gaps in addition to the area occupied by
// layer-shell panels and regular gaps.
struts {
// left 64
// right 64
// top 64
// bottom 64
}
}
// Add lines like this to spawn processes at startup.
// Note that running niri as a session supports xdg-desktop-autostart,
// which may be more convenient to use.
// See the binds section below for more spawn examples.
// This line starts waybar, a commonly used bar for Wayland compositors.
// spawn-at-startup "waybar" "-c /home/sinsa/.config/waybar/configs/defaultNIRI" "-s /home/sinsa/.config/waybar/style/islands.css"
//spawn-sh-at-startup "waybar -c /home/sinsa/.config/waybar/configs/defaultNIRI -s /home/sinsa/.config/waybar/style/islands.css"
//spawn-sh-at-startup "awww-daemon"
//spawn-sh-at-startup "awww-daemon -n overlay"
//spawn-sh-at-startup "awww img /home/sinsa/.config/hypr/current_wallpaper"
//spawn-sh-at-startup "awww img -n overlay /home/sinsa/.config/hypr/current_wallpaper"
spawn-at-startup "/usr/lib/hyprpolkitagent/hyprpolkitagent"
spawn-at-startup "kitty"
spawn-sh-at-startup "qs -c noctalia-shell"
prefer-no-csd
// To run a shell command (with variables, pipes, etc.), use spawn-sh-at-startup:
// spawn-sh-at-startup "qs -c ~/source/qs/MyAwesomeShell"
hotkey-overlay {
// Uncomment this line to disable the "Important Hotkeys" pop-up at startup.
// skip-at-startup
}
// Uncomment this line to ask the clients to omit their client-side decorations if possible.
// If the client will specifically ask for CSD, the request will be honored.
// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.
// This option will also fix border/focus ring drawing behind some semitransparent windows.
// After enabling or disabling this, you need to restart the apps for this to take effect.
// prefer-no-csd
// You can change the path where screenshots are saved.
// A ~ at the front will be expanded to the home directory.
// The path is formatted with strftime(3) to give you the screenshot date and time.
screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
// You can also set this to null to disable saving screenshots to disk.
// screenshot-path null
// Animation settings.
// The wiki explains how to configure individual animations:
// https://yalter.github.io/niri/Configuration:-Animations
animations {
// Uncomment to turn off all animations.
// off
// Slow down all animations by this factor. Values below 1 speed them up instead.
// slowdown 3.0
}
// layer-rule {
// This is for swww; change for other wallpaper tools.
// Find the right namespace by running niri msg layers.
//match namespace="^awww-daemonoverlay$"
//place-within-backdrop true
//}
layer-rule {
match namespace="^noctalia-overview*"
place-within-backdrop true
}
/- window-rule {
open-maximized true
}
window-rule {
geometry-corner-radius 12
}
// Window rules let you adjust behavior for individual windows.
// Find more information on the wiki:
// https://yalter.github.io/niri/Configuration:-Window-Rules
// Work around WezTerm's initial configure bug
// by setting an empty default-column-width.
window-rule {
// This regular expression is intentionally made as specific as possible,
// since this is the default config, and we want no false positives.
// You can get away with just app-id="wezterm" if you want.
//matchatch app-id=r#"^org\.wezfurlong\.wezterm$"#
// default-column-width {}
}
// Open the Firefox picture-in-picture player as floating by default.
window-rule {
// This app-id regular expression will work for both:
// - host Firefox (app-id is "firefox")
// - Flatpak Firefox (app-id is "org.mozilla.firefox")
// match app-id=r#"firefox$"# title="^Picture-in-Picture$"
// open-floating true
}
// Example: block out two password managers from screen capture.
// (This example rule is commented out with a "/-" in front.)
/-window-rule {
match app-id=r#"^org\.keepassxc\.KeePassXC$"#
match app-id=r#"^org\.gnome\.World\.Secrets$"#
block-out-from "screen-capture"
// Use this instead if you want them visible on third-party screenshot tools.
// block-out-from "screencast"
}
// Example: enable rounded corners for all windows.
// (This example rule is commented out with a "/-" in front.)
window-rule {
geometry-corner-radius 12
clip-to-geometry true
}
switch-events {
lid-close {
spawn "qs" "-c" "noctalia-shell" "ipc" "call" "sessionMenu" "lockAndSuspend"
}
}
binds {
// Keys consist of modifiers separated by + signs, followed by an XKB key name
// in the end. To find an XKB name for a particular key, you may use a program
// like wev.
//
// "Mod" is a special modifier equal to Super when running on a TTY, and to Alt
// when running as a winit window.
//
// Most actions that you can bind here can also be invoked programmatically with
// `niri msg action do-something`.
// Mod-Shift-/, which is usually the same as Mod-?,
// shows a list of important hotkeys.
Mod+Shift+Slash { show-hotkey-overlay; }
// Suggested binds for running programs: terminal, app launcher, screen locker.
Mod+Q hotkey-overlay-title="Open a Terminal: kitty" { spawn "kitty"; }
Mod+D hotkey-overlay-title="Run an Application: fuzzel" { spawn "fuzzel"; }
Super+Alt+L hotkey-overlay-title="Lock the Screen: swaylock" { spawn "swaylock"; }
// Use spawn-sh to run a shell command. Do this if you need pipes, multiple commands, etc.
// Note: the entire command goes as a single argument. It's passed verbatim to `sh -c`.
// For example, this is a standard bind to toggle the screen reader (orca).
Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh "pkill orca || exec orca"; }
// Example volume keys mappings for PipeWire & WirePlumber.
// The allow-when-locked=true property makes them work even when the session is locked.
// Using spawn-sh allows to pass multiple arguments together with the command.
// "-l 1.0" limits the volume to 100%.
XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+ -l 1.0"; }
XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"; }
XF86AudioMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; }
XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; }
// Example media keys mapping using playerctl.
// This will work with any MPRIS-enabled media player.
XF86AudioPlay allow-when-locked=true { spawn-sh "playerctl play-pause"; }
XF86AudioStop allow-when-locked=true { spawn-sh "playerctl stop"; }
XF86AudioPrev allow-when-locked=true { spawn-sh "playerctl previous"; }
XF86AudioNext allow-when-locked=true { spawn-sh "playerctl next"; }
// Example brightness key mappings for brightnessctl.
// You can use regular spawn with multiple arguments too (to avoid going through "sh"),
// but you need to manually put each argument in separate "" quotes.
XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; }
XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; }
// Open/close the Overview: a zoomed-out view of workspaces and windows.
// You can also move the mouse into the top-left hot corner,
// or do a four-finger swipe up on a touchpad.
Mod+O repeat=false { toggle-overview; }
Mod+C repeat=false { close-window; }
Mod+return { spawn-sh "qs -c noctalia-shell ipc call launcher toggle"; }
Mod+Left { focus-column-left; }
Mod+Down { focus-window-down; }
Mod+Up { focus-window-up; }
Mod+Right { focus-column-right; }
Mod+H { focus-column-left; }
Mod+J { focus-window-down; }
Mod+K { focus-window-up; }
Mod+L { focus-column-right; }
Mod+Shift+Left { move-column-left-or-to-monitor-left; }
Mod+Shift+Down { move-window-down; }
Mod+Shift+Up { move-window-up; }
Mod+Shift+Right { move-column-right-or-to-monitor-right; }
Mod+Shift+H { move-column-left; }
Mod+Shift+J { move-window-down; }
Mod+Shift+K { move-window-up; }
Mod+Shift+L { move-column-right-or-to-monitor-right; }
// Alternative commands that move across workspaces when reaching
// the first or last window in a column.
// Mod+J { focus-window-or-workspace-down; }
// Mod+K { focus-window-or-workspace-up; }
// Mod+Ctrl+J { move-window-down-or-to-workspace-down; }
// Mod+Ctrl+K { move-window-up-or-to-workspace-up; }
Mod+Home { focus-column-first; }
Mod+End { focus-column-last; }
Mod+Ctrl+Home { move-column-to-first; }
Mod+Ctrl+End { move-column-to-last; }
Mod+Ctrl+Left { focus-monitor-left; }
//Mod+Alt+Ctrl+Down { focus-monitor-down; }
//Mod+Alt+Ctrl+Up { focus-monitor-up; }
Mod+Ctrl+Right { focus-monitor-right; }
//Mod+Alt+Ctrl+H { focus-monitor-left; }
//Mod+Alt+Ctrl+J { focus-monitor-down; }
//Mod+Alt+Ctrl+K { focus-monitor-up; }
//Mod+Alt+Ctrl+L { focus-monitor-right; }
Mod+Shift+Page_Up {move-column-to-monitor-left; }
Mod+Shift+Page_Down {move-column-to-monitor-right; }
//Mod+Shift+Ctrl+Left { move-column-to-monitor-left; }
//Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }
//Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }
//Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
//Mod+Shift+Ctrl+H { move-column-to-monitor-left; }
//Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
//Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
//Mod+Shift+Ctrl+L { move-column-to-monitor-right; }
// Alternatively, there are commands to move just a single window:
// Mod+Shift+Ctrl+Left { move-window-to-monitor-left; }
// ...
// And you can also move a whole workspace to another monitor:
// Mod+Shift+Ctrl+Left { move-workspace-to-monitor-left; }
// ...
Mod+Ctrl+down { focus-workspace-down; }
Mod+Ctrl+up {focus-workspace-up; }
Mod+U { focus-workspace-down; }
Mod+I { focus-workspace-up; }
Mod+Ctrl+Shift+down { move-column-to-workspace-down; }
Mod+Ctrl+Shift+up { move-column-to-workspace-up; }
Mod+Ctrl+U { move-column-to-workspace-down; }
Mod+Ctrl+I { move-column-to-workspace-up; }
// Alternatively, there are commands to move just a single window:
// Mod+Ctrl+Page_Down { move-window-to-workspace-down; }
// ...
//Mod+Shift+Page_Down { move-workspace-down; }
//Mod+Shift+Page_Up { move-workspace-up; }
Mod+Shift+U { move-workspace-down; }
Mod+Shift+I { move-workspace-up; }
// You can bind mouse wheel scroll ticks using the following syntax.
// These binds will change direction based on the natural-scroll setting.
//
// To avoid scrolling through workspaces really fast, you can use
// the cooldown-ms property. The bind will be rate-limited to this value.
// You can set a cooldown on any bind, but it's most useful for the wheel.
Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
Mod+WheelScrollRight { focus-column-right; }
Mod+WheelScrollLeft { focus-column-left; }
Mod+Ctrl+WheelScrollRight { move-column-right; }
Mod+Ctrl+WheelScrollLeft { move-column-left; }
// Usually scrolling up and down with Shift in applications results in
// horizontal scrolling; these binds replicate that.
Mod+Shift+WheelScrollDown { focus-column-right; }
Mod+Shift+WheelScrollUp { focus-column-left; }
Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
Mod+Ctrl+Shift+WheelScrollUp { move-column-left; }
// Similarly, you can bind touchpad scroll "ticks".
// Touchpad scrolling is continuous, so for these binds it is split into
// discrete intervals.
// These binds are also affected by touchpad's natural-scroll, so these
// example binds are "inverted", since we have natural-scroll enabled for
// touchpads by default.
// Mod+TouchpadScrollDown { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+"; }
// Mod+TouchpadScrollUp { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-"; }
// You can refer to workspaces by index. However, keep in mind that
// niri is a dynamic workspace system, so these commands are kind of
// "best effort". Trying to refer to a workspace index bigger than
// the current workspace count will instead refer to the bottommost
// (empty) workspace.
//
// For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on
// will all refer to the 3rd workspace.
Mod+1 { focus-workspace 1; }
Mod+2 { focus-workspace 2; }
Mod+3 { focus-workspace 3; }
Mod+4 { focus-workspace 4; }
Mod+5 { focus-workspace 5; }
Mod+6 { focus-workspace 6; }
Mod+7 { focus-workspace 7; }
Mod+8 { focus-workspace 8; }
Mod+9 { focus-workspace 9; }
Mod+Ctrl+1 { move-column-to-workspace 1; }
Mod+Ctrl+2 { move-column-to-workspace 2; }
Mod+Ctrl+3 { move-column-to-workspace 3; }
Mod+Ctrl+4 { move-column-to-workspace 4; }
Mod+Ctrl+5 { move-column-to-workspace 5; }
Mod+Ctrl+6 { move-column-to-workspace 6; }
Mod+Ctrl+7 { move-column-to-workspace 7; }
Mod+Ctrl+8 { move-column-to-workspace 8; }
Mod+Ctrl+9 { move-column-to-workspace 9; }
// Alternatively, there are commands to move just a single window:
// Mod+Ctrl+1 { move-window-to-workspace 1; }
// Switches focus between the current and the previous workspace.
// Mod+Tab { focus-workspace-previous; }
// The following binds move the focused window in and out of a column.
// If the window is alone, they will consume it into the nearby column to the side.
// If the window is already in a column, they will expel it out.
Mod+BracketLeft { consume-or-expel-window-left; }
Mod+BracketRight { consume-or-expel-window-right; }
// Consume one window from the right to the bottom of the focused column.
Mod+Comma { consume-window-into-column; }
// Expel the bottom window from the focused column to the right.
Mod+Period { expel-window-from-column; }
Mod+R { switch-preset-column-width; }
// Cycling through the presets in reverse order is also possible.
// Mod+R { switch-preset-column-width-back; }
Mod+Shift+R { switch-preset-window-height; }
Mod+Ctrl+R { reset-window-height; }
Mod+F { maximize-column; }
Mod+Shift+F { fullscreen-window; }
// Expand the focused column to space not taken up by other fully visible columns.
// Makes the column "fill the rest of the space".
Mod+Ctrl+F { expand-column-to-available-width; }
Mod+Shift+C { center-column; }
// Center all fully visible columns on screen.
Mod+Ctrl+C { center-visible-columns; }
// Finer width adjustments.
// This command can also:
// * set width in pixels: "1000"
// * adjust width in pixels: "-5" or "+5"
// * set width as a percentage of screen width: "25%"
// * adjust width as a percentage of screen width: "-10%" or "+10%"
// Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,
// set-column-width "100" will make the column occupy 200 physical screen pixels.
Mod+Minus { set-column-width "-10%"; }
Mod+Equal { set-column-width "+10%"; }
// Finer height adjustments when in column with other windows.
Mod+Shift+Minus { set-window-height "-10%"; }
Mod+Shift+Equal { set-window-height "+10%"; }
// Move the focused window between the floating and the tiling layout.
Mod+V { toggle-window-floating; }
Mod+Shift+V { switch-focus-between-floating-and-tiling; }
// Toggle tabbed column display mode.
// Windows in this column will appear as vertical tabs,
// rather than stacked on top of each other.
Mod+W { toggle-column-tabbed-display; }
// Actions to switch layouts.
// Note: if you uncomment these, make sure you do NOT have
// a matching layout switch hotkey configured in xkb options above.
// Having both at once on the same hotkey will break the switching,
// since it will switch twice upon pressing the hotkey (once by xkb, once by niri).
// Mod+Space { switch-layout "next"; }
// Mod+Shift+Space { switch-layout "prev"; }
Print { screenshot; }
Ctrl+Print { screenshot-screen; }
Alt+Print { screenshot-window; }
// Applications such as remote-desktop clients and software KVM switches may
// request that niri stops processing the keyboard shortcuts defined here
// so they may, for example, forward the key presses as-is to a remote machine.
// It's a good idea to bind an escape hatch to toggle the inhibitor,
// so a buggy application can't hold your session hostage.
//
// The allow-inhibiting=false property can be applied to other binds as well,
// which ensures niri always processes them, even when an inhibitor is active.
Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }
// The quit action will show a confirmation dialog to avoid accidental exits.
Mod+Shift+E { quit; }
Ctrl+Alt+Delete { quit; }
// Powers off the monitors. To turn them back on, do any input like
// moving the mouse or pressing any other key.
Mod+Shift+P { power-off-monitors; }
}
include "./noctalia.kdl"
+35
View File
@@ -0,0 +1,35 @@
layout {
focus-ring {
active-color "#d5bbff"
inactive-color "#141316"
urgent-color "#ffb4ab"
}
border {
active-color "#d5bbff"
inactive-color "#141316"
urgent-color "#ffb4ab"
}
shadow {
color "#00000070"
}
tab-indicator {
active-color "#d5bbff"
inactive-color "#543587"
urgent-color "#ffb4ab"
}
insert-hint {
color "#d5bbff80"
}
}
recent-windows {
highlight {
active-color "#d5bbff"
urgent-color "#ffb4ab"
}
}
+25
View File
@@ -0,0 +1,25 @@
{
"mPrimary": "#d5bbff",
"mOnPrimary": "#3d1c6f",
"mSecondary": "#cec2db",
"mOnSecondary": "#342d40",
"mTertiary": "#f1b7c3",
"mOnTertiary": "#4a252f",
"mError": "#ffb4ab",
"mOnError": "#690005",
"mSurface": "#141316",
"mOnSurface": "#e6e1e6",
"mSurfaceVariant": "#211f22",
"mOnSurfaceVariant": "#cbc4cf",
"mOutline": "#49454e",
"mShadow": "#000000",
"mHover": "#f1b7c3",
"mOnHover": "#4a252f"
}
@@ -0,0 +1,94 @@
{
"dark": {
"mPrimary": "#e8bcfb",
"mOnPrimary": "#8e0cc6",
"mSecondary": "#8e0cc6",
"mOnSecondary": "#e8bcfb",
"mTertiary": "#066f50",
"mOnTertiary": "#90f9d9",
"mError": "#e80e4f",
"mOnError": "#fee7ee",
"mSurface": "#300443",
"mOnSurface": "#fef7e7",
"mSurfaceVariant": "#50066f",
"mOnSurfaceVariant": "#e8bcfb",
"mOutline": "#8e0cc6",
"mShadow": "#110118",
"mHover": "#6f099a",
"mOnHover": "#fef7e7",
"terminal": {
"foreground": "#f7e7fe",
"background": "#110118",
"normal": {
"black": "#110118",
"red": "#e80e4f",
"green": "#cb62f8",
"yellow": "#e8a70e",
"blue": "#bc39f3",
"magenta": "#e80ebc",
"cyan": "#a70ee8",
"white": "#e8bcfb"
},
"bright": {
"black": "#310345",
"red": "#c73859",
"green": "#da8efa",
"yellow": "#f3bc39",
"blue": "#ca65f6",
"magenta": "#f339ce",
"cyan": "#bc39f3",
"white": "#f7e7fe"
},
"cursor": "#f7e7fe",
"cursorText": "#110118",
"selectionFg": "#f7e7fe",
"selectionBg": "#50066f"
}
},
"light": {
"mPrimary": "#8e0cc6",
"mOnPrimary": "#e8bcfb",
"mSecondary": "#ca65f6",
"mOnSecondary": "#a70ee8",
"mTertiary": "#bcfbe8",
"mOnTertiary": "#066f50",
"mError": "#f33971",
"mOnError": "#430417",
"mSurface": "#f7e7fe",
"mOnSurface": "#6f099a",
"mSurfaceVariant": "#e8bcfb",
"mOnSurfaceVariant": "#50066f",
"mOutline": "#ca65f6",
"mShadow": "#f7e7fe",
"mHover": "#d990f9",
"mOnHover": "#300443",
"terminal": {
"foreground": "#110118",
"background": "#f7e7fe",
"normal": {
"black": "#110118",
"red": "#e80e4f",
"green": "#cb62f8",
"yellow": "#e8a70e",
"blue": "#bc39f3",
"magenta": "#e80ebc",
"cyan": "#a70ee8",
"white": "#e8bcfb"
},
"bright": {
"black": "#310345",
"red": "#c73859",
"green": "#da8efa",
"yellow": "#f3bc39",
"blue": "#ca65f6",
"magenta": "#f339ce",
"cyan": "#bc39f3",
"white": "#f7e7fe"
},
"cursor": "#110118",
"cursorText": "#f7e7fe",
"selectionFg": "#50066f",
"selectionBg": "#e8bcfb"
}
}
}
+32
View File
@@ -0,0 +1,32 @@
{
"sources": [
{
"enabled": true,
"name": "Noctalia Plugins",
"url": "https://github.com/noctalia-dev/noctalia-plugins"
}
],
"states": {
"catwalk": {
"enabled": false,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
},
"fancy-audiovisualizer": {
"enabled": true,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
},
"file-search": {
"enabled": true,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
},
"kde-connect": {
"enabled": true,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
},
"slowbongo": {
"enabled": false,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
}
},
"version": 2
}
+193
View File
@@ -0,0 +1,193 @@
import QtQuick
import QtQuick.Effects
import Quickshell
import Quickshell.Io
import qs.Commons
import qs.Modules.Bar.Extras
import qs.Services.UI
import qs.Widgets
import qs.Services.System
Item {
id: root
property var pluginApi: null
property ShellScreen screen
property string widgetId: ""
property string section: ""
property int sectionWidgetIndex: -1
property int sectionWidgetsCount: 0
// Per-screen bar properties
readonly property string screenName: screen?.name ?? ""
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool barIsVertical: barPosition === "left" || barPosition === "right"
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screenName)
property url currentIconSource
property string tooltipText: {
if (!pluginApi) return "";
return root.isRunning ? (pluginApi.tr("tooltip.running") || "Running") : (pluginApi.tr("tooltip.sleeping") || "Sleeping");
}
property string tooltipDirection: BarService.getTooltipDirection()
property bool enabled: true
property bool allowClickWhenDisabled: false
property bool hovering: false
property color colorBg: Color.mSurfaceVariant
property color colorFg: Color.mPrimary
property color colorBgHover: Color.mHover
property color colorFgHover: Color.mOnHover
property color colorBorder: Color.mOutline
property color colorBorderHover: Color.mOutline
property real customRadius: Style.radiusL
signal entered
signal exited
signal clicked
signal rightClicked
signal middleClicked
signal wheel(int angleDelta)
readonly property real contentWidth: barIsVertical ? capsuleHeight : Math.round(capsuleHeight + Style.marginXS * 2)
readonly property real contentHeight: capsuleHeight
implicitWidth: contentWidth
implicitHeight: contentHeight
// --- Catwalk Specific Logic ---
property int frameIndex: 0
property int idleFrameIndex: 0
readonly property bool isRunning: root.pluginApi?.mainInstance?.isRunning ?? false
readonly property var icons: root.pluginApi?.mainInstance?.icons || []
readonly property var idleIcons: root.pluginApi?.mainInstance?.idleIcons || []
readonly property real cpuUsage: root.pluginApi?.mainInstance?.cpuUsage ?? 0
function openPanel() {
if (pluginApi) {
var result = pluginApi.openPanel(root.screen);
Logger.i("Catwalk", "OpenPanel result:", result);
} else {
Logger.e("Catwalk", "PluginAPI is null");
}
}
function openExternalMonitor() {
Quickshell.execDetached(["sh", "-c", Settings.data.systemMonitor.externalMonitor]);
}
Timer {
interval: Math.max(30, 200 - root.cpuUsage * 1.7)
running: root.isRunning
repeat: true
onTriggered: {
root.frameIndex = (root.frameIndex + 1) % root.icons.length
}
}
Timer {
interval: 400
running: !root.isRunning
repeat: true
onTriggered: {
root.idleFrameIndex = (root.idleFrameIndex + 1) % root.idleIcons.length
}
}
currentIconSource: (root.icons && root.icons.length > 0 && root.idleIcons && root.idleIcons.length > 0)
? (root.isRunning
? Qt.resolvedUrl(root.icons[root.frameIndex % root.icons.length])
: Qt.resolvedUrl(root.idleIcons[root.idleFrameIndex % root.idleIcons.length]))
: ""
Rectangle {
id: visualCapsule
x: Style.pixelAlignCenter(parent.width, width)
y: Style.pixelAlignCenter(parent.height, height)
width: root.contentWidth
height: root.contentHeight
opacity: root.enabled ? Style.opacityFull : Style.opacityMedium
color: mouseArea.containsMouse ? Color.mHover : Style.capsuleColor
radius: Math.min((customRadius >= 0 ? customRadius : Style.iRadiusL), width / 2)
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
Behavior on color {
ColorAnimation {
duration: Style.animationNormal
easing.type: Easing.InOutQuad
}
}
Image {
id: iconImage
source: root.currentIconSource
x: Style.pixelAlignCenter(parent.width, width)
y: Style.pixelAlignCenter(parent.height, height)
width: Style.toOdd(visualCapsule.width - Style.marginXS * 2)
height: width
// Render SVG at exact target size for crisp output
sourceSize: Qt.size(width, height)
fillMode: Image.PreserveAspectFit
smooth: true
mipmap: false
// This enables the "mask" behavior to recolor the icon
layer.enabled: true
layer.effect: MultiEffect {
colorization: 1.0
colorizationColor: Settings.data.colorSchemes.darkMode ? "white" : "black"
}
}
}
MouseArea {
id: mouseArea
anchors.fill: parent
cursorShape: root.enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
hoverEnabled: true
onEntered: {
root.hovering = true;
if (root.tooltipText) {
TooltipService.show(root, root.tooltipText, root.tooltipDirection);
}
root.entered();
}
onExited: {
root.hovering = false;
if (root.tooltipText) {
TooltipService.hide();
}
root.exited();
}
onClicked: function (mouse) {
if (root.tooltipText) {
TooltipService.hide();
}
Logger.i("Catwalk", "Clicked! API:", !!pluginApi, "Screen:", root.screen ? root.screen.name : "null");
if (!root.enabled && !root.allowClickWhenDisabled) {
return;
}
// Open Panel on left/right click
// Open external monitor on middle click
if (mouse.button === Qt.LeftButton) {
root.openPanel();
root.clicked();
} else if (mouse.button === Qt.RightButton) {
root.openPanel();
root.rightClicked();
} else if (mouse.button === Qt.MiddleButton) {
root.openExternalMonitor();
root.middleClicked();
}
}
onWheel: wheel => root.wheel(wheel.angleDelta.y)
}
}
@@ -0,0 +1,85 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Effects
import Quickshell
import qs.Commons
import qs.Modules.DesktopWidgets
import qs.Widgets
import qs.Services.System
DraggableDesktopWidget {
id: root
property var pluginApi: null
implicitWidth: 200
implicitHeight: 80
showBackground: !(root.pluginApi?.mainInstance?.hideBackground ?? false)
property int frameIndex: 0
readonly property var icons: root.pluginApi?.mainInstance?.icons || []
property int idleFrameIndex: 0
readonly property var idleIcons: root.pluginApi?.mainInstance?.idleIcons || []
readonly property bool isRunning: root.pluginApi?.mainInstance?.isRunning ?? false
readonly property real cpuUsage: root.pluginApi?.mainInstance?.cpuUsage ?? 0
Timer {
interval: Math.max(30, 200 - root.cpuUsage * 1.7)
running: root.isRunning
repeat: true
onTriggered: {
root.frameIndex = (root.frameIndex + 1) % root.icons.length
}
}
Timer {
interval: 400
running: !root.isRunning
repeat: true
onTriggered: {
root.idleFrameIndex = (root.idleFrameIndex + 1) % root.idleIcons.length
}
}
property url currentIconSource: (root.icons && root.icons.length > 0 && root.idleIcons && root.idleIcons.length > 0)
? (root.isRunning
? Qt.resolvedUrl(root.icons[root.frameIndex % root.icons.length])
: Qt.resolvedUrl(root.idleIcons[root.idleFrameIndex % root.idleIcons.length]))
: ""
RowLayout {
anchors.fill: parent
spacing: 5
Image {
id: iconImage
source: root.currentIconSource
Layout.fillHeight: true
Layout.preferredWidth: height
sourceSize.height: height
sourceSize.width: width
fillMode: Image.PreserveAspectFit
smooth: true
mipmap: false
layer.enabled: true
layer.effect: MultiEffect {
colorization: 1.0
colorizationColor: Settings.data.colorSchemes.darkMode ? "white" : "black"
}
}
Text {
text: Math.round(root.cpuUsage) + "%"
color: Settings.data.colorSchemes.darkMode ? "white" : "black"
font.bold: true
font.pixelSize: 40
Layout.alignment: Qt.AlignVCenter
}
}
}
+18
View File
@@ -0,0 +1,18 @@
import QtQuick
import Quickshell
import qs.Services.System
Item {
id: root
property var pluginApi: null
readonly property real minimumThreshold: pluginApi?.pluginSettings?.minimumThreshold || 10
readonly property bool hideBackground: pluginApi?.pluginSettings?.hideBackground ?? false
property real cpuUsage: SystemStatService.cpuUsage
readonly property bool isRunning: cpuUsage >= minimumThreshold
readonly property var icons: ["icons/my-active-0-symbolic.svg", "icons/my-active-1-symbolic.svg", "icons/my-active-2-symbolic.svg", "icons/my-active-3-symbolic.svg", "icons/my-active-4-symbolic.svg"]
readonly property var idleIcons: ["icons/my-idle-0-symbolic.svg", "icons/my-idle-1-symbolic.svg", "icons/my-idle-2-symbolic.svg", "icons/my-idle-3-symbolic.svg"]
}
+102
View File
@@ -0,0 +1,102 @@
import QtQuick
import QtQuick.Effects
import QtQuick.Layouts
import qs.Commons
import qs.Services.System
import qs.Widgets
Item {
id: root
property var pluginApi: null
// SmartPanel properties
readonly property var geometryPlaceholder: panelContainer
readonly property bool allowAttach: true
property real contentPreferredWidth: 300 * Style.uiScaleRatio
property real contentPreferredHeight: 300 * Style.uiScaleRatio
anchors.fill: parent
Rectangle {
id: panelContainer
anchors.fill: parent
color: "transparent"
Rectangle {
anchors.fill: parent
anchors.margins: Style.marginL
color: Color.mSurface
radius: Style.radiusL
border.color: Color.mOutline
border.width: Style.borderS
ColumnLayout {
anchors.centerIn: parent
spacing: Style.marginL
// Big Cat
Item {
id: bigCatItem
Layout.preferredWidth: 128 * Style.uiScaleRatio
Layout.preferredHeight: 128 * Style.uiScaleRatio
Layout.alignment: Qt.AlignHCenter
property int frameIndex: 0
readonly property bool isRunning: root.pluginApi?.mainInstance?.isRunning ?? false
readonly property var icons: root.pluginApi?.mainInstance?.icons || []
property int idleFrameIndex: 0
readonly property var idleIcons: root.pluginApi?.mainInstance?.idleIcons || []
readonly property real cpuUsage: root.pluginApi?.mainInstance?.cpuUsage ?? 0
Timer {
interval: Math.max(30, 200 - bigCatItem.cpuUsage * 1.7)
running: bigCatItem.isRunning
repeat: true
onTriggered: bigCatItem.frameIndex = (bigCatItem.frameIndex + 1) % bigCatItem.icons.length
}
Timer {
interval: 400
running: !bigCatItem.isRunning
repeat: true
onTriggered: bigCatItem.idleFrameIndex = (bigCatItem.idleFrameIndex + 1) % bigCatItem.idleIcons.length
}
Image {
id: bigCatImage
anchors.fill: parent
source: (bigCatItem.icons && bigCatItem.icons.length > 0 && bigCatItem.idleIcons && bigCatItem.idleIcons.length > 0)
? (bigCatItem.isRunning
? Qt.resolvedUrl(bigCatItem.icons[bigCatItem.frameIndex % bigCatItem.icons.length])
: Qt.resolvedUrl(bigCatItem.idleIcons[bigCatItem.idleFrameIndex % bigCatItem.idleIcons.length]))
: ""
fillMode: Image.PreserveAspectFit
smooth: true
mipmap: true
// This handles the programmatic coloring
layer.enabled: true
layer.effect: MultiEffect {
colorization: 1.0
colorizationColor: Settings.data.colorSchemes.darkMode ? "white" : "black"
}
}
}
// CPU Stats
Text {
Layout.alignment: Qt.AlignHCenter
text: (pluginApi?.tr("panel.cpuLabel") || "CPU: {usage}%").replace("{usage}", Math.round(root.pluginApi?.mainInstance?.cpuUsage ?? 0))
font.pointSize: Style.fontSizeXL
font.weight: Font.Bold
color: Settings.data.colorSchemes.darkMode ? "white" : "black"
}
}
}
}
}
+34
View File
@@ -0,0 +1,34 @@
# Catwalk Plugin for Noctalia
A cute animated cat for your Noctalia bar that reacts to your system's CPU usage.
## Features
- **Animated Cat**: The cat walks/runs on your bar based on CPU usage
- **CPU-Based Animation**:
- Below minimum threshold: Shows idle animation with "Zz" bubbles
- Above minimum threshold: Walks faster as CPU usage increases
- Speed scales continuously with CPU load
- **Popup Panel**: Click the cat to open a larger animated version with CPU stats
- **Theme Support**: Automatically switches between light/dark mode icons
- **Configurable Settings**: Adjust the minimum CPU threshold for running animation
## Installation
This plugin is part of the `noctalia-plugins` repository.
## Configuration
Access the plugin settings in Noctalia to configure:
- **Minimum CPU Threshold**: Set the CPU usage percentage (5-25%) above which the cat starts running. Below this, it stays idle with "Zz" animation.
## Usage
- The cat icon appears on your bar
- It automatically animates based on your CPU usage
- Click to open the CPU stats panel
## Requirements
- Noctalia 3.6.0 or later
+75
View File
@@ -0,0 +1,75 @@
import QtQuick
import QtQuick.Layouts
import qs.Widgets
import qs.Commons
ColumnLayout {
id: root
// Plugin API (injected by the settings dialog system)
property var pluginApi: null
// Local state - track changes before saving
property real valueMinimumThreshold: pluginApi?.mainInstance?.minimumThreshold ?? (pluginApi?.pluginSettings?.minimumThreshold || 10)
property bool valueHideBackground: pluginApi?.mainInstance?.hideBackground ?? (pluginApi?.pluginSettings?.hideBackground ?? false)
spacing: Style.marginM
Component.onCompleted: {
Logger.i("Catwalk", "Settings UI loaded");
}
ColumnLayout {
Layout.fillWidth: true
spacing: Style.marginS
NLabel {
label: pluginApi?.tr("settings.minimumThreshold.label") || "Minimum CPU Threshold"
description: pluginApi?.tr("settings.minimumThreshold.description") || "CPU usage must be above this percentage for the cat to start running"
}
NSlider {
id: thresholdSlider
from: 5
to: 25
value: root.valueMinimumThreshold
stepSize: 1
onValueChanged: {
root.valueMinimumThreshold = value
}
}
Text {
text: (pluginApi?.tr("settings.currentThreshold") || "Current threshold: {value}%").replace("{value}", thresholdSlider.value)
color: Color.mOnSurfaceVariant
font.pointSize: Style.fontSizeS
}
}
NToggle {
label: pluginApi?.tr("settings.hideBackground.label") || "Hide Background"
description: pluginApi?.tr("settings.hideBackground.description") || "Hide the background of the desktop widget"
checked: root.valueHideBackground
onToggled: function(checked) {
root.valueHideBackground = checked
}
}
// This function is called by the dialog to save settings
function saveSettings() {
if (!pluginApi) {
Logger.e("Catwalk", "Cannot save settings: pluginApi is null");
return;
}
// Update the plugin settings object
pluginApi.pluginSettings.minimumThreshold = root.valueMinimumThreshold;
pluginApi.pluginSettings.hideBackground = root.valueHideBackground;
// Save to disk
pluginApi.saveSettings();
Logger.i("Catwalk", "Settings saved successfully");
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"panel": {
"cpuLabel": "CPU: {usage}%",
"title": "Catwalk"
},
"settings": {
"currentThreshold": "Aktuelle Schwelle: {value}%",
"hideBackground": {
"description": "Verstecke den Hintergrund des Desktop-Widgets",
"label": "Hintergrund ausblenden"
},
"minimumThreshold": {
"description": "Die CPU-Auslastung muss über diesem Prozentsatz liegen, damit die Katze zu laufen beginnt",
"label": "Minimale CPU-Schwelle"
},
"title": "Catwalk-Einstellungen"
},
"tooltip": {
"running": "Katze läuft",
"sleeping": "Katze schläft"
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"panel": {
"cpuLabel": "CPU: {usage}%",
"title": "Catwalk"
},
"settings": {
"currentThreshold": "Current threshold: {value}%",
"hideBackground": {
"description": "Hide the background of the desktop widget",
"label": "Hide Background"
},
"minimumThreshold": {
"description": "CPU usage must be above this percentage for the cat to start running",
"label": "Minimum CPU Threshold"
},
"title": "Catwalk Settings"
},
"tooltip": {
"running": "Cat is running",
"sleeping": "Cat is sleeping"
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"panel": {
"cpuLabel": "CPU: {usage}%",
"title": "Catwalk"
},
"settings": {
"currentThreshold": "Umbral actual: {value}%",
"hideBackground": {
"description": "Ocultar el fondo del widget de escritorio",
"label": "Ocultar fondo"
},
"minimumThreshold": {
"description": "El uso de CPU debe estar por encima de este porcentaje para que el gato empiece a correr",
"label": "Umbral mínimo de CPU"
},
"title": "Configuración de Catwalk"
},
"tooltip": {
"running": "El gato está corriendo",
"sleeping": "El gato está durmiendo"
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"panel": {
"cpuLabel": "CPU : {usage}%",
"title": "Catwalk"
},
"settings": {
"currentThreshold": "Seuil actuel : {value}%",
"hideBackground": {
"description": "Masquer l'arrière-plan du widget de bureau",
"label": "Masquer l'arrière-plan"
},
"minimumThreshold": {
"description": "L'utilisation du CPU doit être supérieure à ce pourcentage pour que le chat commence à courir",
"label": "Seuil minimum CPU"
},
"title": "Paramètres Catwalk"
},
"tooltip": {
"running": "Le chat court",
"sleeping": "Le chat dort"
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"panel": {
"cpuLabel": "CPU: {usage}%",
"title": "Sétasáv"
},
"settings": {
"currentThreshold": "Aktuális küszöbérték: {value}%",
"hideBackground": {
"description": "Asztali widget hátterének elrejtése",
"label": "Háttér elrejtése"
},
"minimumThreshold": {
"description": "A processzorhasználatnak e fölött a százalék felett kell lennie, hogy a macska futni kezdjen",
"label": "Minimum CPU Küszöbérték"
},
"title": "Catwalk beállítások"
},
"tooltip": {
"running": "A Noctalia fut.",
"sleeping": "A macska alszik"
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"panel": {
"cpuLabel": "CPU: {usage}%",
"title": "Catwalk"
},
"settings": {
"currentThreshold": "Soglia attuale: {value}%",
"hideBackground": {
"description": "Nascondi lo sfondo del widget desktop",
"label": "Nascondi sfondo"
},
"minimumThreshold": {
"description": "L'utilizzo della CPU deve essere superiore a questa percentuale affinché il gatto inizi a correre",
"label": "Soglia minima CPU"
},
"title": "Impostazioni Catwalk"
},
"tooltip": {
"running": "Il gatto sta correndo",
"sleeping": "Il gatto sta dormendo"
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"panel": {
"cpuLabel": "CPU: {usage}%",
"title": "Catwalk"
},
"settings": {
"currentThreshold": "現在のしきい値: {value}%",
"hideBackground": {
"description": "デスクトップウィジェットの背景を隠す",
"label": "背景を隠す"
},
"minimumThreshold": {
"description": "猫が走り始めるにはCPU使用率がこの割合を超えている必要があります",
"label": "最小CPUしきい値"
},
"title": "Catwalk設定"
},
"tooltip": {
"running": "猫が走っています",
"sleeping": "猫が寝ています"
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"panel": {
"cpuLabel": "CPU: {usage}%",
"title": "Rêwînga pisîkan"
},
"settings": {
"currentThreshold": "Astana niha: {value}%",
"hideBackground": {
"description": "Paşxana wîceta sermaseyê veşêre",
"label": "Veşartina Paşxanê"
},
"minimumThreshold": {
"description": "Divê bikaranîna CPU ji vê rêjeyê bilindtir be da ku pisîk dest bi bezê bike",
"label": "Sînorê herî kêm ê CPU"
},
"title": "Mîhenên Catwalkê"
},
"tooltip": {
"running": "Pisîk direve",
"sleeping": "Pisîk radizê."
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"panel": {
"cpuLabel": "CPU: {usage}%",
"title": "Catwalk"
},
"settings": {
"currentThreshold": "Huidige drempelwaarde: {value}%",
"hideBackground": {
"description": "Verberg de achtergrond van de bureaubladwidget",
"label": "Achtergrond verbergen"
},
"minimumThreshold": {
"description": "CPU-gebruik moet boven dit percentage liggen voordat de kat begint te rennen.",
"label": "Minimale CPU-drempel"
},
"title": "Catwalk Instellingen"
},
"tooltip": {
"running": "Kat rent",
"sleeping": "Kat slaapt"
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"panel": {
"cpuLabel": "CPU: {usage}%",
"title": "Wybieg"
},
"settings": {
"currentThreshold": "Aktualny próg: {value}%",
"hideBackground": {
"description": "Ukryj tło widżetu pulpitu",
"label": "Ukryj tło"
},
"minimumThreshold": {
"description": "Użycie CPU musi przekraczać ten procent, aby kot zaczął biegać",
"label": "Minimalny próg użycia CPU"
},
"title": "Ustawienia Catwalk"
},
"tooltip": {
"running": "Kot jest uruchomiony",
"sleeping": "Kot śpi"
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"panel": {
"cpuLabel": "CPU: {usage}%",
"title": "Catwalk"
},
"settings": {
"currentThreshold": "Limite atual: {value}%",
"hideBackground": {
"description": "Ocultar o fundo do widget da área de trabalho",
"label": "Ocultar fundo"
},
"minimumThreshold": {
"description": "O uso da CPU deve estar acima desta porcentagem para o gato começar a correr",
"label": "Limite mínimo de CPU"
},
"title": "Configurações do Catwalk"
},
"tooltip": {
"running": "O gato está correndo",
"sleeping": "O gato está dormindo"
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"panel": {
"cpuLabel": "CPU: {usage}%",
"title": "Catwalk"
},
"settings": {
"currentThreshold": "Текущий порог: {value}%",
"hideBackground": {
"description": "Скрыть фон виджета рабочего стола",
"label": "Скрыть фон"
},
"minimumThreshold": {
"description": "Использование CPU должно быть выше этого процента, чтобы кот начал бежать",
"label": "Минимальный порог CPU"
},
"title": "Настройки Catwalk"
},
"tooltip": {
"running": "Кот бежит",
"sleeping": "Кот спит"
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"panel": {
"cpuLabel": "CPU: {usage}%",
"title": "Podyum"
},
"settings": {
"currentThreshold": "Mevcut eşik: {value}%",
"hideBackground": {
"description": "Masaüstü bileşeninin arka planını gizle",
"label": "Arka planı gizle"
},
"minimumThreshold": {
"description": "CPU kullanımı, kedinin koşmaya başlaması için bu yüzdeden yüksek olmalıdır.",
"label": "Minimum CPU Eşiği"
},
"title": "Podyum Ayarları"
},
"tooltip": {
"running": "Kedi koşuyor.",
"sleeping": "Kedi uyuyor."
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"panel": {
"cpuLabel": "ЦП: {usage}%",
"title": "Подіум"
},
"settings": {
"currentThreshold": "Поточний поріг: {value}%",
"hideBackground": {
"description": "Приховати фон віджета робочого столу",
"label": "Приховати фон"
},
"minimumThreshold": {
"description": "Використання ЦП має бути вище цього відсотка, щоб кіт почав бігати.",
"label": "Мінімальний поріг ЦП"
},
"title": "Налаштування подіуму"
},
"tooltip": {
"running": "Кіт біжить",
"sleeping": "Кіт спить"
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"panel": {
"cpuLabel": "CPU{usage}%",
"title": "猫步"
},
"settings": {
"currentThreshold": "当前阈值:{value}%",
"hideBackground": {
"description": "隐藏桌面小部件的背景",
"label": "隐藏背景"
},
"minimumThreshold": {
"description": "CPU 使用率必须高于此百分比,猫才能开始跑动。",
"label": "最低CPU阈值"
},
"title": "时装秀场布置"
},
"tooltip": {
"running": "猫在跑",
"sleeping": "猫在睡觉"
}
}
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
height="388"
width="388"
>
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#ffffff
}
</style>
</defs>
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title>RunCat: Frame 0</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<title>RunCat: Frame 0</title>
<path style="fill:currentColor"
d="m 321.24,116.28019 c -0.01,-13.464 1.661,-33.778997 -8.15,-35.162997 -9.811,-1.384 -25.074,26.578997 -25.074,26.578997 l -4.43,0.554 c 0,0 3.6,-26.025997 -8.86,-23.256997 -12.46,2.769 -27.687,41.810997 -27.687,41.810997 0,0 -5.538,4.429 -9.414,18.3 -3.876,13.871 -18.55,14.09 -42.915,11.045 -24.365,-3.045 -47.345,17.443 -47.345,17.443 -22.15,-0.831 -40.977,2.215 -55.374,7.752 -14.397,5.537 -32.117,23.811 -55.375,22.15 -23.258,-1.661 -34.332,2.492 -32.947,10.521 1.385,8.029 9.413,9.414 22.426,10.8 13.013,1.386 44.853,-7.476 65.342,-19.381 a 78.147,78.147 0 0 1 41.53,-10.143 c -2.768,24.19 6.646,21.218 5.538,45.029 -1.108,23.811 8.583,46.791 24.365,59.527 15.782,12.736 21.6,6.091 22.149,-1.661 0.549,-7.752 -15.781,-27.687 -16.335,-35.44 -0.554,-7.753 9.137,-1.384 10.244,0.554 1.107,1.938 16.889,17.166 29.9,20.489 13.011,3.323 7.2,-15.782 2.492,-27.134 -4.708,-11.352 3.6,-22.15 19.1,-24.641 15.5,-2.491 22.7,5.814 19.658,16.058 -3.042,10.244 -4.153,24.919 8.86,24.088 13.013,-0.831 34.332,-32.117 35.993,-50.668 1.661,-18.551 4.153,-28.794 16.059,-32.67 11.906,-3.876 33.5,-15.782 33.5,-37.932 0,-22.15 -23.25,-34.61 -23.25,-34.61 z m -46.722,1.107 c -1.592,6.091 -16.4,11.144 -16.4,11.144 0,0 1.873,-21.665 17.862,-26.28 a 43.462,43.462 0 0 1 -1.462,15.136 z m 16.182,39.385 c -5.433,0 -9.85,-5.237 -9.85,-11.673 0,-6.436 4.417,-11.671 9.85,-11.671 5.433,0 9.85,5.235 9.85,11.671 0,6.436 -4.418,11.673 -9.85,11.673 z m 21.311,-43.907 c -4.155,-2.006 -6.5,-3.074 -10.883,-3.517 0,0 2.808,-11.618997 11.345,-14.110997 a 36.68,36.68 0 0 1 -0.462,17.627997 z m 11.6,40.931 c -5.433,0 -9.85,-5.223 -9.85,-11.644 0,-6.421 4.419,-11.648 9.852,-11.648 5.433,0 9.847,5.225 9.847,11.646 0,6.421 -4.418,11.646 -9.847,11.646 z"
class="ColorScheme-Text"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
height="388"
width="388"
viewBox="0 0 388 388">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#ffffff
}
</style>
</defs>
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title>RunCat: Frame 1</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<title>RunCat: Frame 1</title>
<path style="fill:currentColor"
d="m 327.054,197.34487 1.662,-4.153 c 35.162,-4.43 46.517,-27.359 44.671,-42.219 -1.938,-15.6 -17.815,-29.352 -23.629,-31.705 0,0 4.43,-34.885998 -5.261,-34.885998 -11.365,0 -26.856,26.578998 -26.856,26.578998 h -4.153 c 0,0 -0.277,-24.363998 -7.2,-24.086998 -14.939,0.6 -31.01,42.083998 -31.01,42.083998 -3.6,3.876 -4.43,13.29 -14.951,24.088 -10.521,10.798 -36.244,9.357 -56.733,9.08 -20.489,-0.277 -40.724,16.669 -40.724,16.669 -6.368,0 -24.088,-3.323 -39.316,-4.43 -15.228,-1.107 -47.345,0.831 -55.928,1.938 -8.583,1.107 -60.358,12.459 -57.312,23.811 3.046,11.352 24.364,4.153 50.113,0 25.749,-4.153 65.342,-4.43 74.756,-1.384 9.414,3.046 -1.385,20.488 -18.551,25.2 -17.166,4.712 -32.117,22.421 -39.592,30.452 -7.475,8.031 -14.4,23.257 1.938,24.088 16.338,0.831 32.117,-16.613 39.869,-19.381 7.752,-2.768 2.215,8.306 -0.554,15.227 -2.769,6.921 -6.368,28.518 4.984,29.349 11.352,0.831 28.8,-25.472 32.117,-30.179 3.317,-4.707 18,-11.352 21.319,-14.4 3.319,-3.048 12.183,-12.46 12.183,-12.46 0,0 32.394,-0.83 48.729,-3.876 16.335,-3.046 31.84,-15.5 40.146,-16.612 8.306,-1.112 19.935,7.2 22.981,9.414 3.046,2.214 25.749,15.781 37.1,18.55 11.351,2.769 12.46,-12.182 12.46,-12.182 0,0 9.967,4.983 15.5,-6.368 5.533,-11.351 -38.758,-38.207 -38.758,-38.207 z m -28.425,-72.171 c -2.492,3.415 -12,4.984 -12,4.984 0,0 6.46,-19.2 16.8,-23.35 1.753,9.414 -1.739,14.174 -4.8,18.366 z m 53.251,7.5 c 5.5,0 9.967,5.578 9.967,12.459 0,6.881 -4.462,12.459 -9.967,12.459 -5.505,0 -9.967,-5.578 -9.967,-12.459 0,-6.881 4.462,-12.451 9.967,-12.451 z m -11.014,-32.22 c 0.655,6.977 -2.275,14.593 -2.275,14.593 a 30.833,30.833 0 0 0 -8.971,-1.753 c 4.614,-9.183 7.863,-11.931 11.246,-12.84 z m -22.118,58.868 c -5.5,0 -9.967,-5.579 -9.967,-12.46 0,-6.881 4.462,-12.459 9.967,-12.459 5.505,0 9.968,5.578 9.968,12.459 0,6.881 -4.463,12.46 -9.968,12.46 z"
class="ColorScheme-Text"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
height="388"
width="388"
viewBox="0 0 388 388">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#ffffff
}
</style>
</defs>
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title>RunCat: Frame 2</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<title>RunCat: Frame 2</title>
<path style="fill:currentColor"
d="m 382.705,182.19956 c 4.43,-19.381 -18,-37.654 -18,-37.654 0,0 6.645,-31.148 0,-33.779 -11.665,-4.617 -30.733,22.427 -30.733,22.427 l -4.707,-0.831 c 5.123,-32.531999 -5.676,-26.3 -18.965,-14.4 -13.289,11.9 -25.334,36.27 -33.917,44.3 -8.583,8.03 -18.827,5.26 -38.208,-3.887 -19.381,-9.147 -42.085,-6.081 -50.668,-1.374 -8.583,4.707 -15.777,1.941 -15.777,1.941 0,0 -24.642,-17.443 -32.394,-20.765 -7.752,-3.322 -28.518,-12.736 -53.99,-13.29 -25.472,-0.554 -46.792,9.967 -46.792,9.967 -10.521,9.137 1.385,16.889 12.737,14.4 11.352,-2.489 38.208,-6.092 56.758,-1.939 18.55,4.153 46.791,25.2 46.238,31.287 -0.553,6.087 -12.09,16.8 -25.2,19.658 -12.9,2.815 -48.175,29.071 -49.283,42.638 -1.108,13.567 14.4,14.4 29.626,6.645 15.226,-7.755 26.856,-1.384 26.856,-1.384 -14.12,13.843 -15.5,30.732 -3.6,33.224 11.9,2.492 22.149,-9.69 37.1,-23.257 14.951,-13.567 29.9,-19.935 53.437,-17.166 23.537,2.769 60.911,-0.554 60.911,-0.554 9.968,9.691 42.915,30.179 55.1,35.993 12.185,5.814 25.749,2.492 27.41,-3.6 1.661,-6.092 -16.612,-20.765 -14.951,-24.641 1.661,-3.876 19.461,3.225 26.411,-7.1 6.4,-9.509 -26.134,-24.46 -31.4,-25.844 -5.266,-1.384 -2.215,-5.814 -2.215,-5.814 17.451,-1.667 33.787,-5.82 38.216,-25.201 z m -18.39,-23.248 c 5.561,0 10.069,5.279 10.069,11.79 0,6.511 -4.508,11.79 -10.069,11.79 -5.561,0 -10.068,-5.278 -10.068,-11.79 0,-6.512 4.508,-11.79 10.068,-11.79 z m -4.728,-35.033 c 0,0 1.28,6.61 -5.019,15.47 a 48.782,48.782 0 0 0 -9.056,-3.089 c 0,0 8.26,-11.689 14.075,-12.381 z m -47.207,20.627 c -3.2,2.628 -10.936,3.184 -10.936,3.184 0,0 5.587,-16.156 19.084,-21.763 -0.277,8.583 -1.872,13.422 -8.148,18.579 z m 19.566,35.506 c -6.015,0 -10.89,-5.608 -10.89,-12.526 0,-6.918 4.875,-12.526 10.89,-12.526 6.015,0 10.89,5.608 10.89,12.526 0,6.918 -4.876,12.526 -10.89,12.526 z"
class="ColorScheme-Text"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
height="388"
width="388"
viewBox="0 0 388 388">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#ffffff
}
</style>
</defs>
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title>RunCat: Frame 3</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<title>RunCat: Frame 3</title>
<path style="fill:currentColor"
d="m 364.709,159.58645 c 0,0 13.013,-29.833 4.983,-32.117 -15.7,-4.465 -32.344,14.823 -32.344,14.823 l -4.018,-0.887 c 0,0 3.415,-14.766 2.861,-21.688 -0.554,-6.922 -18.55,0.83 -28.795,9.413 -10.245,8.583 -29.9,36.271 -41.807,41.531 -11.907,5.26 -25.472,-13.013 -43.746,-26.026 -18.274,-13.013 -44.576,-2.492 -44.576,-2.492 -4.43,-1.384 -11.075,-13.566 -24.088,-26.3 C 140.166,103.10945 126.6,93.137455 96.7,88.153455 c -29.9,-4.984 -44.166,4.789 -42.5,11.157 1.666,6.367995 4.3,6.147995 38.352,9.331995 39.125,3.658 50.114,23.534 59.528,34.886 9.414,11.352 -3.046,22.7 -13.844,38.208 -10.798,15.508 -6.922,26.3 -4.984,39.316 1.938,13.016 13.567,16.335 15.5,35.162 1.933,18.827 6.645,25.2 18.551,21.043 11.636,-4.06 6.876,-43.539 6.655,-45.322 0.112,0.294 1.322,0.967 13,-4.515 13.567,-6.368 26.857,3.322 44.3,7.752 17.443,4.43 30.179,-0.277 34.609,9.691 8.9,20.018 23.257,45.13 40.7,53.99 17.443,8.86 20.765,-8.86 14.674,-16.059 -6.091,-7.199 -7.2,-19.1 -7.2,-19.1 34.885,4.984 43.191,-1.661 44.3,-10.244 1.109,-8.583 -17.72,-13.29 -26.857,-18 -9.137,-4.71 -2.768,-12.182 -2.768,-12.182 29.071,-3.323 45.868,-11.352 48.452,-32.394 2.143,-17.453 -12.459,-31.288 -12.459,-31.288 z m -62.3,-8.029 c 0,0 10.429,-15.874 22.242,-19.012 0,0 -0.554,11.352 -5.907,15.69 -6.296,5.105 -16.331,3.324 -16.331,3.324 z m 26.026,37.008 c -5.811,0 -10.521,-5.33 -10.521,-11.905 0,-6.575 4.71,-11.906 10.521,-11.906 5.811,0 10.521,5.331 10.521,11.906 0,6.575 -4.707,11.905 -10.517,11.905 z m 34.516,-49.744 c 0.018,3.471 -4.4,12.116 -6.959,13.62 a 16.906,16.906 0 0 0 -7.883,-4.3 c 1.756,-2.193 8.571,-9.345 14.846,-9.32 z m -2.857,55.638 c -5.084,0 -9.206,-4.913 -9.206,-10.974 0,-6.061 4.122,-10.973 9.206,-10.973 5.084,0 9.207,4.913 9.207,10.973 0,6.06 -4.122,10.974 -9.207,10.974 z"
class="ColorScheme-Text"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
height="388"
width="388"
viewBox="0 0 388 388">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#ffffff
}
</style>
</defs>
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title>RunCat: Frame 4</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<title>RunCat: Frame 4</title>
<path style="fill:currentColor"
d="m 328.854,134.31128 c 0,0 9.967,-30.872 0.692,-34.194 -9.275,-3.322 -29.487,19.1 -29.487,19.1 l -4.983,-1.107 c 2.907,-25.057 0.277,-27.411 -14.536,-16.474 -14.813,10.937 -26.58,30.871 -29.625,34.055 -3.045,3.184 -5.953,14.951 -33.5,1.246 -27.547,-13.705 -44.714,-5.814 -60.635,-1.938 -15.921,3.876 -50.113,22.565 -68.941,29.763 -18.828,7.198 -37.931,4.154 -42.084,3.461 -4.153,-0.693 -23.4,-15.228 -30.594,-7.337 -7.194,7.891 0.692,16.336 8.583,22.7 7.891,6.364 27.272,9 43.745,8.444 16.473,-0.556 65.9,-18.273 65.9,-18.273 2.815,3.922 0.877,2.722 1.984,15.274 1.107,12.552 15.874,24 19.75,28.61 3.876,4.61 0.923,9.783 1.661,21.6 0.738,11.817 12,11.444 21.781,11.444 9.781,0 13.29,5.537 15.136,9.783 1.846,4.246 5.168,10.152 15.5,10.152 10.332,0 12.182,-4.061 14.951,-8.122 2.769,-4.061 12,-8.122 16.243,-7.752 4.243,0.37 7.014,21.042 11.259,28.24 4.245,7.198 19.75,11.26 22.519,9.045 2.769,-2.215 6.091,-3.323 1.292,-19.012 -4.799,-15.689 -1.292,-39.685 0.185,-47.253 1.477,-7.568 3.137,-18.458 30.271,-23.626 27.134,-5.168 40.608,-18.458 40.608,-36.178 0,-17.72 -17.675,-31.651 -17.675,-31.651 z m -49.468,-5.584 a 15.8,15.8 0 0 1 -11.905,3.921 c 0,0 7.752,-15.827 18.92,-18.412 -0.001,0.001 0.83,7.523 -7.015,14.491 z m 15.644,37.847 c -5.709,0 -10.337,-5.131 -10.337,-11.46 0,-6.329 4.628,-11.46 10.337,-11.46 5.709,0 10.336,5.131 10.336,11.46 0,6.329 -4.628,11.46 -10.336,11.46 z m 16.7,-41.908 c 0,0 7.16,-9.46 11.52,-10.429 0.277,5.446 -0.807,10.106 -4.453,13.8 a 26.262,26.262 0 0 0 -7.07,-3.371 z m 16.9,47.077 c -5.1,0 -9.229,-4.787 -9.229,-10.693 0,-5.906 4.132,-10.693 9.229,-10.693 5.097,0 9.229,4.788 9.229,10.693 0,5.905 -4.139,10.698 -9.236,10.698 z"
class="ColorScheme-Text"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
height="388"
width="388">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#ffffff
}
</style>
</defs>
<path style="fill:currentColor"
d="M 365.652,223.08199 c 0,0 11.752,-20.337 9.131,-34.046 -1.842,-9.637 -31.391,18.589 -31.391,18.589 l -6.092,-1.557 c 0,0 8.033,-29.068 0.383,-30.981 -7.65,-1.913 -29.451,15.3 -41.308,30.981 0,0 -20.654,5.119 -29.068,31.437 -8.414,26.318 -45.515,-29.142 -58.52,-37.939 -13.005,-8.797 -28.685,-26.773 -70.376,-13.769 -41.690997,13.004 -54.688997,34.988 -54.693997,53.549 0,15.3 2.677,22.184 -1.53,28.686 0,0 -47.427,-4.972 -43.6,-43.6 3.827,-38.628 32.129,-32.511 36.718,-32.893 4.589,-0.382 14.152,-4.972 12.24,-16.447 -1.912,-11.475 -19.51,-16.832 -33.279,-11.477 -13.769,5.355 -43.6,19.124 -43.6,61.579 0,42.455 25.626,61.937 69.229,74.966 43.602997,13.029 104.413997,13.025 123.533997,13.025 19.12,0 125.453,2.27 132.72,-5.762 0,0 41.251,-12.68 41.251,-44.347 0.004,-25.239 -3.591,-31.012 -11.748,-39.991 z M 326.829,202.74698999999998 c 0,0 -5.915,-2.07 -14.787,0 0,0 10.942,-11.534 14.787,-11.534 3.845,0 0,11.534 0,11.534 z M 358.53700000000003,217.33299 c -1.774,-2.366 -6.323,-4.549 -6.323,-4.549 0,0 8.775,-7.195 9.366,-5.124 0.591,2.071 -3.042,9.673 -3.042,9.673 z"
class="ColorScheme-Text"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
height="388"
width="388">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#ffffff
}
</style>
</defs>
<path style="fill:currentColor"
d="M 365.652,223.08199 c 0,0 11.752,-20.337 9.131,-34.046 -1.842,-9.637 -31.391,18.589 -31.391,18.589 l -6.092,-1.557 c 0,0 8.033,-29.068 0.383,-30.981 -7.65,-1.913 -29.451,15.3 -41.308,30.981 0,0 -20.654,5.119 -29.068,31.437 -8.414,26.318 -45.515,-29.142 -58.52,-37.939 -13.005,-8.797 -28.685,-26.773 -70.376,-13.769 -41.690997,13.004 -54.688997,34.988 -54.693997,53.549 0,15.3 2.677,22.184 -1.53,28.686 0,0 -47.427,-4.972 -43.6,-43.6 3.827,-38.628 32.129,-32.511 36.718,-32.893 4.589,-0.382 14.152,-4.972 12.24,-16.447 -1.912,-11.475 -19.51,-16.832 -33.279,-11.477 -13.769,5.355 -43.6,19.124 -43.6,61.579 0,42.455 25.626,61.937 69.229,74.966 43.602997,13.029 104.413997,13.025 123.533997,13.025 19.12,0 125.453,2.27 132.72,-5.762 0,0 41.251,-12.68 41.251,-44.347 0.004,-25.239 -3.591,-31.012 -11.748,-39.991 z M 326.829,202.74698999999998 c 0,0 -5.915,-2.07 -14.787,0 0,0 10.942,-11.534 14.787,-11.534 3.845,0 0,11.534 0,11.534 z M 358.53700000000003,217.33299 c -1.774,-2.366 -6.323,-4.549 -6.323,-4.549 0,0 8.775,-7.195 9.366,-5.124 0.591,2.071 -3.042,9.673 -3.042,9.673 z M 269.042,141.19398999999999 v -7.225 h 30.575 v 7.383 l -18.971,19.281 h 19.645 v 7.289 h -32.6 v -6.915 l 19.168,-19.811 z"
class="ColorScheme-Text"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
height="388"
width="388">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#ffffff
}
</style>
</defs>
<path style="fill:currentColor"
d="M 365.652,223.08199 c 0,0 11.752,-20.337 9.131,-34.046 -1.842,-9.637 -31.391,18.589 -31.391,18.589 l -6.092,-1.557 c 0,0 8.033,-29.068 0.383,-30.981 -7.65,-1.913 -29.451,15.3 -41.308,30.981 0,0 -20.654,5.119 -29.068,31.437 -8.414,26.318 -45.515,-29.142 -58.52,-37.939 -13.005,-8.797 -28.685,-26.773 -70.376,-13.769 -41.690997,13.004 -54.688997,34.988 -54.693997,53.549 0,15.3 2.677,22.184 -1.53,28.686 0,0 -47.427,-4.972 -43.6,-43.6 3.827,-38.628 32.129,-32.511 36.718,-32.893 4.589,-0.382 14.152,-4.972 12.24,-16.447 -1.912,-11.475 -19.51,-16.832 -33.279,-11.477 -13.769,5.355 -43.6,19.124 -43.6,61.579 0,42.455 25.626,61.937 69.229,74.966 43.602997,13.029 104.413997,13.025 123.533997,13.025 19.12,0 125.453,2.27 132.72,-5.762 0,0 41.251,-12.68 41.251,-44.347 0.004,-25.239 -3.591,-31.012 -11.748,-39.991 z M 326.829,202.74698999999998 c 0,0 -5.915,-2.07 -14.787,0 0,0 10.942,-11.534 14.787,-11.534 3.845,0 0,11.534 0,11.534 z M 358.53700000000003,217.33299 c -1.774,-2.366 -6.323,-4.549 -6.323,-4.549 0,0 8.775,-7.195 9.366,-5.124 0.591,2.071 -3.042,9.673 -3.042,9.673 z M 269.042,141.19398999999999 v -7.225 h 30.575 v 7.383 l -18.971,19.281 h 19.645 v 7.289 h -32.6 v -6.915 l 19.168,-19.811 z M 218.504,85.393992 v -10.809 h 40.16 v 11.042 l -24.918,28.837998 h 25.8 v 10.9 h -42.812 v -10.341 l 25.172,-29.629998 z"
class="ColorScheme-Text"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
height="388"
width="388">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#ffffff
}
</style>
</defs>
<path style="fill:currentColor"
d="M 365.652,223.08199 c 0,0 11.752,-20.337 9.131,-34.046 -1.842,-9.637 -31.391,18.589 -31.391,18.589 l -6.092,-1.557 c 0,0 8.033,-29.068 0.383,-30.981 -7.65,-1.913 -29.451,15.3 -41.308,30.981 0,0 -20.654,5.119 -29.068,31.437 -8.414,26.318 -45.515,-29.142 -58.52,-37.939 -13.005,-8.797 -28.685,-26.773 -70.376,-13.769 -41.690997,13.004 -54.688997,34.988 -54.693997,53.549 0,15.3 2.677,22.184 -1.53,28.686 0,0 -47.427,-4.972 -43.6,-43.6 3.827,-38.628 32.129,-32.511 36.718,-32.893 4.589,-0.382 14.152,-4.972 12.24,-16.447 -1.912,-11.475 -19.51,-16.832 -33.279,-11.477 -13.769,5.355 -43.6,19.124 -43.6,61.579 0,42.455 25.626,61.937 69.229,74.966 43.602997,13.029 104.413997,13.025 123.533997,13.025 19.12,0 125.453,2.27 132.72,-5.762 0,0 41.251,-12.68 41.251,-44.347 0.004,-25.239 -3.591,-31.012 -11.748,-39.991 z M 326.829,202.74698999999998 c 0,0 -5.915,-2.07 -14.787,0 0,0 10.942,-11.534 14.787,-11.534 3.845,0 0,11.534 0,11.534 z M 358.53700000000003,217.33299 c -1.774,-2.366 -6.323,-4.549 -6.323,-4.549 0,0 8.775,-7.195 9.366,-5.124 0.591,2.071 -3.042,9.673 -3.042,9.673 z M 218.504,85.393992 v -10.809 h 40.16 v 11.042 l -24.918,28.837998 h 25.8 v 10.9 h -42.812 v -10.341 l 25.172,-29.629998 z"
class="ColorScheme-Text"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+32
View File
@@ -0,0 +1,32 @@
{
"id": "catwalk",
"name": "Catwalk",
"version": "1.1.7",
"minNoctaliaVersion": "3.6.0",
"author": "MannuVilasara",
"license": "MIT",
"repository": "https://github.com/noctalia-dev/noctalia-plugins",
"description": "A cute animated cat for your bar.",
"tags": [
"Bar",
"Desktop",
"Panel",
"Fun"
],
"entryPoints": {
"main": "Main.qml",
"barWidget": "BarWidget.qml",
"desktopWidget": "DesktopWidget.qml",
"panel": "Panel.qml",
"settings": "Settings.qml"
},
"dependencies": {
"plugins": []
},
"metadata": {
"defaultSettings": {
"minimumThreshold": 10,
"hideBackground": false
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

+4
View File
@@ -0,0 +1,4 @@
{
"minimumThreshold": 5,
"hideBackground": false
}
@@ -0,0 +1,150 @@
import QtQuick
import Quickshell
import qs.Commons
import qs.Modules.DesktopWidgets
import qs.Services.Media
DraggableDesktopWidget {
id: root
property var pluginApi: null
implicitWidth: Math.round(300 * widgetScale)
implicitHeight: Math.round(300 * widgetScale)
showBackground: false
// Scaled dimensions
readonly property int scaledRadiusL: Math.round(Style.radiusL * widgetScale)
// Settings from plugin
readonly property real sensitivity: widgetData?.sensitivity ?? pluginApi?.pluginSettings?.sensitivity ?? pluginApi?.manifest?.metadata?.defaultSettings?.sensitivity
readonly property real rotationSpeed: widgetData?.rotationSpeed ?? pluginApi?.pluginSettings?.rotationSpeed ?? pluginApi?.manifest?.metadata?.defaultSettings?.rotationSpeed
readonly property real barWidth: widgetData?.barWidth ?? pluginApi?.pluginSettings?.barWidth ?? pluginApi?.manifest?.metadata?.defaultSettings?.barWidth
readonly property real ringOpacity: widgetData?.ringOpacity ?? pluginApi?.pluginSettings?.ringOpacity ?? pluginApi?.manifest?.metadata?.defaultSettings?.ringOpacity
readonly property real bloomIntensity: widgetData?.bloomIntensity ?? pluginApi.pluginSettings?.bloomIntensity ?? pluginApi?.manifest?.metadata?.defaultSettings?.bloomIntensity
readonly property int visualizationMode: widgetData?.visualizationMode ?? pluginApi?.pluginSettings?.visualizationMode ?? pluginApi?.manifest?.metadata?.defaultSettings?.visualizationMode ?? 3
readonly property real waveThickness: widgetData?.waveThickness ?? pluginApi?.pluginSettings?.waveThickness ?? pluginApi?.manifest?.metadata?.defaultSettings?.waveThickness ?? 1.0
readonly property real innerDiameter: widgetData?.innerDiameter ?? pluginApi?.pluginSettings?.innerDiameter ?? pluginApi?.manifest?.metadata?.defaultSettings?.innerDiameter ?? 0.7
readonly property bool fadeWhenIdle: widgetData?.fadeWhenIdle ?? pluginApi?.pluginSettings?.fadeWhenIdle ?? false
readonly property bool useCustomColors: widgetData?.useCustomColors ?? pluginApi?.pluginSettings?.useCustomColors ?? false
readonly property color customPrimaryColor: widgetData?.customPrimaryColor ?? pluginApi?.pluginSettings?.customPrimaryColor ?? "#6750A4"
readonly property color customSecondaryColor: widgetData?.customSecondaryColor ?? pluginApi?.pluginSettings?.customSecondaryColor ?? "#625B71"
// Animation time for shader (0 to 3600, 1 hour cycle)
property real shaderTime: 0
NumberAnimation on shaderTime {
loops: Animation.Infinite
from: 0
to: 3600
duration: 3600000
running: !SpectrumService.isIdle
}
// Hidden canvas that encodes audio data as a 32x1 texture
Canvas {
id: audioCanvas
width: 32
height: 1
visible: false
onPaint: {
var ctx = getContext("2d");
var values = SpectrumService.values;
if (!values || values.length === 0) {
ctx.fillStyle = "black";
ctx.fillRect(0, 0, 32, 1);
return;
}
for (var i = 0; i < 32; i++) {
var v = values[i] || 0;
// Encode amplitude in grayscale (R=G=B=amplitude)
var c = Math.floor(v * 255);
ctx.fillStyle = "rgb(" + c + "," + c + "," + c + ")";
ctx.fillRect(i, 0, 1, 1);
}
}
}
// Trigger canvas repaint when audio data changes
Connections {
target: SpectrumService
function onValuesChanged() {
if (!SpectrumService.isIdle) {
audioCanvas.requestPaint();
}
}
}
// Unique instance ID for SpectrumService registration
// This prevents the old widget's destruction from unregistering the new widget
readonly property string spectrumInstanceId: "plugin:fancy-audiovisualizer:" + Date.now() + Math.random()
// Register with SpectrumService when pluginApi becomes available
onPluginApiChanged: {
if (pluginApi) {
SpectrumService.registerComponent(spectrumInstanceId);
audioCanvas.requestPaint();
}
}
Component.onDestruction: {
SpectrumService.unregisterComponent(spectrumInstanceId);
}
// Audio texture source (outside ShaderEffect to avoid 'source' property warning)
ShaderEffectSource {
id: audioTextureSource
sourceItem: audioCanvas
live: true
hideSource: true
}
// The shader effect visualization
ShaderEffect {
id: visualizer
anchors.fill: parent
visible: pluginApi !== null
opacity: (root.fadeWhenIdle && SpectrumService.isIdle) ? 0 : 1
Behavior on opacity {
NumberAnimation { duration: 500; easing.type: Easing.InOutQuad }
}
// Audio texture - named 'source' to match ShaderEffectSource's property and avoid warning
property var source: audioTextureSource
// Uniforms passed to shader
property real time: root.shaderTime
property real itemWidth: visualizer.width
property real itemHeight: visualizer.height
property color primaryColor: root.useCustomColors ? root.customPrimaryColor : Color.mPrimary
property color secondaryColor: root.useCustomColors ? root.customSecondaryColor : Color.mSecondary
property real sensitivity: root.sensitivity
property real rotationSpeed: root.rotationSpeed
property real barWidth: root.barWidth
property real ringOpacity: root.ringOpacity
property real cornerRadius: scaledRadiusL
property real bloomIntensity: root.bloomIntensity
property real visualizationMode: root.visualizationMode
property real waveThickness: root.waveThickness
property real innerDiameter: root.innerDiameter
fragmentShader: pluginApi ? Qt.resolvedUrl(pluginApi.pluginDir + "/shaders/visualizer.frag.qsb") : ""
}
// Fallback when shader not loaded
Rectangle {
anchors.fill: parent
color: Color.mSurface
radius: scaledRadiusL
visible: !visualizer.visible || visualizer.fragmentShader === ""
Text {
anchors.centerIn: parent
text: "Loading..."
color: Color.mOnSurface
font.pointSize: Math.round(Style.fontSizeM * widgetScale)
}
}
}
@@ -0,0 +1,244 @@
import QtQuick
import QtQuick.Layouts
import qs.Commons
import qs.Widgets
ColumnLayout {
id: root
property var pluginApi: null
property var widgetSettings: null
property var screen: null
spacing: Style.marginM
// Local state for editing
property real valueSensitivity: widgetSettings?.data?.sensitivity ?? pluginApi?.pluginSettings?.sensitivity ?? 1.5
property real valueRotationSpeed: widgetSettings?.data?.rotationSpeed ?? pluginApi?.pluginSettings?.rotationSpeed ?? 0.5
property real valueBarWidth: widgetSettings?.data?.barWidth ?? pluginApi?.pluginSettings?.barWidth ?? 0.6
property real valueRingOpacity: widgetSettings?.data?.ringOpacity ?? pluginApi?.pluginSettings?.ringOpacity ?? 0.8
property real valueBloomIntensity: widgetSettings?.data?.bloomIntensity ?? pluginApi?.pluginSettings?.bloomIntensity ?? 0.5
property int valueVisualizationMode: widgetSettings?.data?.visualizationMode ?? pluginApi?.pluginSettings?.visualizationMode ?? 3
property real valueWaveThickness: widgetSettings?.data?.waveThickness ?? pluginApi?.pluginSettings?.waveThickness ?? 1.0
property real valueInnerDiameter: widgetSettings?.data?.innerDiameter ?? pluginApi?.pluginSettings?.innerDiameter ?? 0.7
property bool valueFadeWhenIdle: widgetSettings?.data?.fadeWhenIdle ?? pluginApi?.pluginSettings?.fadeWhenIdle ?? true
property bool valueUseCustomColors: widgetSettings?.data?.useCustomColors ?? pluginApi?.pluginSettings?.useCustomColors ?? false
property color valueCustomPrimaryColor: widgetSettings?.data?.customPrimaryColor ?? pluginApi?.pluginSettings?.customPrimaryColor ?? "#6750A4"
property color valueCustomSecondaryColor: widgetSettings?.data?.customSecondaryColor ?? pluginApi?.pluginSettings?.customSecondaryColor ?? "#625B71"
// Mode helpers
readonly property bool modeHasBars: valueVisualizationMode === 0 || valueVisualizationMode === 3 || valueVisualizationMode === 5
readonly property bool modeHasWave: valueVisualizationMode === 1 || valueVisualizationMode === 4 || valueVisualizationMode === 5
readonly property bool modeHasRings: valueVisualizationMode >= 2
NHeader {
label: pluginApi?.tr("settings.title") ?? "Visualizer Settings"
description: pluginApi?.tr("settings.description") ?? "Configure the audio visualizer appearance"
}
// Visualization mode selector
NComboBox {
Layout.fillWidth: true
label: pluginApi?.tr("settings.visualizationMode") ?? "Visualization Mode"
description: pluginApi?.tr("settings.visualizationMode-description") ?? "Choose visualization style"
model: [
{"key": "0", "name": pluginApi?.tr("settings.mode.bars") ?? "Bars"},
{"key": "1", "name": pluginApi?.tr("settings.mode.wave") ?? "Wave"},
{"key": "2", "name": pluginApi?.tr("settings.mode.rings") ?? "Rings"},
{"key": "3", "name": pluginApi?.tr("settings.mode.barsRings") ?? "Bars + Rings"},
{"key": "4", "name": pluginApi?.tr("settings.mode.waveRings") ?? "Wave + Rings"},
{"key": "5", "name": pluginApi?.tr("settings.mode.all") ?? "All"}
]
currentKey: String(root.valueVisualizationMode)
onSelected: key => {
root.valueVisualizationMode = parseInt(key);
root.saveSettings();
}
}
// Wave thickness slider (shown when mode includes wave)
NValueSlider {
Layout.fillWidth: true
visible: root.modeHasWave
label: pluginApi?.tr("settings.waveThickness") ?? "Wave Thickness"
value: root.valueWaveThickness
from: 0.3
to: 2.0
stepSize: 0.1
onMoved: value => {
root.valueWaveThickness = value;
root.saveSettings();
}
}
// Sensitivity slider
NValueSlider {
Layout.fillWidth: true
label: pluginApi?.tr("settings.sensitivity") ?? "Sensitivity"
value: root.valueSensitivity
from: 0.5
to: 3.0
stepSize: 0.1
onMoved: value => {
root.valueSensitivity = value;
root.saveSettings();
}
}
// Rotation speed slider
NValueSlider {
Layout.fillWidth: true
label: pluginApi?.tr("settings.rotationSpeed") ?? "Rotation Speed"
value: root.valueRotationSpeed
from: 0.0
to: 2.0
stepSize: 0.1
onMoved: value => {
root.valueRotationSpeed = value;
root.saveSettings();
}
}
// Bar width slider (shown when mode includes bars)
NValueSlider {
Layout.fillWidth: true
visible: root.modeHasBars
label: pluginApi?.tr("settings.barWidth") ?? "Bar Width"
value: root.valueBarWidth
from: 0.2
to: 1.0
stepSize: 0.1
onMoved: value => {
root.valueBarWidth = value;
root.saveSettings();
}
}
// Ring opacity slider (shown when mode includes rings)
NValueSlider {
Layout.fillWidth: true
visible: root.modeHasRings
label: pluginApi?.tr("settings.ringOpacity") ?? "Ring Opacity"
value: root.valueRingOpacity
from: 0.0
to: 1.0
stepSize: 0.1
onMoved: value => {
root.valueRingOpacity = value;
root.saveSettings();
}
}
// Base diameter slider
NValueSlider {
Layout.fillWidth: true
label: pluginApi?.tr("settings.innerDiameter") ?? "Inner Diameter"
value: root.valueInnerDiameter
from: 0
to: 1
stepSize: 0.05
onMoved: value => {
root.valueInnerDiameter = value;
root.saveSettings();
}
}
// Bloom intensity slider
NValueSlider {
Layout.fillWidth: true
label: pluginApi?.tr("settings.bloomIntensity") ?? "Bloom Intensity"
value: root.valueBloomIntensity
from: 0.0
to: 1.0
stepSize: 0.05
onMoved: value => {
root.valueBloomIntensity = value;
root.saveSettings();
}
}
// Fade when idle toggle
NToggle {
label: pluginApi?.tr("settings.fadeWhenIdle") ?? "Fade When Idle"
description: pluginApi?.tr("settings.fadeWhenIdle-description") ?? "Fade out visualizer when no audio is playing"
checked: root.valueFadeWhenIdle
onToggled: checked => {
root.valueFadeWhenIdle = checked;
root.saveSettings();
}
}
// Use custom colors toggle
NToggle {
label: pluginApi?.tr("settings.useCustomColors") ?? "Use Custom Colors"
description: pluginApi?.tr("settings.useCustomColors-description") ?? "Override theme colors with custom colors"
checked: root.valueUseCustomColors
onToggled: checked => {
root.valueUseCustomColors = checked;
root.saveSettings();
}
}
// Custom primary color picker
RowLayout {
Layout.fillWidth: true
visible: root.valueUseCustomColors
spacing: Style.marginM
NText {
text: pluginApi?.tr("settings.customPrimaryColor") ?? "Primary Color"
Layout.fillWidth: true
}
NColorPicker {
screen: Screen
selectedColor: root.valueCustomPrimaryColor
onColorSelected: color => {
root.valueCustomPrimaryColor = color;
root.saveSettings();
}
}
}
// Custom secondary color picker
RowLayout {
Layout.fillWidth: true
visible: root.valueUseCustomColors
spacing: Style.marginM
NText {
text: pluginApi?.tr("settings.customSecondaryColor") ?? "Secondary Color"
Layout.fillWidth: true
}
NColorPicker {
screen: Screen
selectedColor: root.valueCustomSecondaryColor
onColorSelected: color => {
root.valueCustomSecondaryColor = color;
root.saveSettings();
}
}
}
// Called when user clicks Apply/Save
function saveSettings() {
if (!widgetSettings)
return;
widgetSettings.data.sensitivity = root.valueSensitivity;
widgetSettings.data.rotationSpeed = root.valueRotationSpeed;
widgetSettings.data.barWidth = root.valueBarWidth;
widgetSettings.data.ringOpacity = root.valueRingOpacity;
widgetSettings.data.bloomIntensity = root.valueBloomIntensity;
widgetSettings.data.visualizationMode = root.valueVisualizationMode;
widgetSettings.data.waveThickness = root.valueWaveThickness;
widgetSettings.data.innerDiameter = root.valueInnerDiameter;
widgetSettings.data.fadeWhenIdle = root.valueFadeWhenIdle;
widgetSettings.data.useCustomColors = root.valueUseCustomColors;
widgetSettings.data.customPrimaryColor = root.valueCustomPrimaryColor.toString();
widgetSettings.data.customSecondaryColor = root.valueCustomSecondaryColor.toString();
widgetSettings.save();
}
}
@@ -0,0 +1,38 @@
# Fancy Audiovisualizer
A circular audio visualizer desktop widget for Noctalia Shell with shader-based rendering and multiple visualization modes.
## Features
- **Multiple Visualization Modes**: Bars, Wave, Rings, or combinations (Bars+Rings, Wave+Rings, All)
- **Shader-Based Rendering**: Smooth, GPU-accelerated visualization using custom fragment shaders
- **Theme Integration**: Automatically uses Noctalia theme colors, with optional custom color override
- **Configurable Appearance**: Adjust sensitivity, rotation speed, bar width, ring opacity, bloom intensity, and more
- **Idle Fade**: Optional fade-out when no audio is playing
## Installation
This plugin is part of the `noctalia-plugins` repository.
## Configuration
Access the plugin settings in Noctalia to configure the following options:
- **Visualization Mode**: Choose between Bars, Wave, Rings, Bars+Rings, Wave+Rings, or All
- **Wave Thickness**: Thickness of the wave visualization (when enabled)
- **Sensitivity**: Audio response sensitivity (0.5 - 3.0)
- **Rotation Speed**: Speed of visualization rotation (0.0 - 2.0)
- **Bar Width**: Width of audio bars (when enabled)
- **Ring Opacity**: Opacity of background rings (when enabled)
- **Inner Diameter**: Size of the inner empty area
- **Bloom Intensity**: Glow/bloom effect strength
- **Fade When Idle**: Fade out when no audio is playing
- **Custom Colors**: Override theme colors with custom primary and secondary colors
## Usage
Add the widget to your desktop via the Noctalia desktop widgets interface. The visualizer responds to system audio.
## Requirements
- Noctalia 3.7.2 or later
@@ -0,0 +1,29 @@
{
"settings": {
"barWidth": "Balkenbreite",
"bloomIntensity": "Blütenintensität",
"customPrimaryColor": "Primärfarbe",
"customSecondaryColor": "Sekundärfarbe",
"description": "Audiovisualisierungsdarstellung konfigurieren",
"fadeWhenIdle": "Ausblenden bei Inaktivität",
"fadeWhenIdle-description": "Visualisierer ausblenden, wenn keine Audioausgabe erfolgt",
"innerDiameter": "Innendurchmesser",
"mode": {
"all": "Alle",
"bars": "Bars",
"barsRings": "Barren + Ringe",
"rings": "Ringe",
"wave": "Welle",
"waveRings": "Welle + Ringe"
},
"ringOpacity": "Ring-Opazität",
"rotationSpeed": "Drehzahl",
"sensitivity": "Empfindlichkeit",
"title": "Visualisierungseinstellungen",
"useCustomColors": "Benutzerdefinierte Farben verwenden",
"useCustomColors-description": "Themenfarben mit benutzerdefinierten Farben überschreiben",
"visualizationMode": "Visualisierungsmodus",
"visualizationMode-description": "Visualisierungsstil wählen",
"waveThickness": "Wellendicke"
}
}
@@ -0,0 +1,29 @@
{
"settings": {
"barWidth": "Bar Width",
"bloomIntensity": "Bloom Intensity",
"customPrimaryColor": "Primary Color",
"customSecondaryColor": "Secondary Color",
"description": "Configure the audio visualizer appearance",
"fadeWhenIdle": "Fade When Idle",
"fadeWhenIdle-description": "Fade out visualizer when no audio is playing",
"innerDiameter": "Inner Diameter",
"mode": {
"all": "All",
"bars": "Bars",
"barsRings": "Bars + Rings",
"rings": "Rings",
"wave": "Wave",
"waveRings": "Wave + Rings"
},
"ringOpacity": "Ring Opacity",
"rotationSpeed": "Rotation Speed",
"sensitivity": "Sensitivity",
"title": "Visualizer Settings",
"useCustomColors": "Use Custom Colors",
"useCustomColors-description": "Override theme colors with custom colors",
"visualizationMode": "Visualization Mode",
"visualizationMode-description": "Choose visualization style",
"waveThickness": "Wave Thickness"
}
}
@@ -0,0 +1,29 @@
{
"settings": {
"barWidth": "Ancho de barra",
"bloomIntensity": "Intensidad de floración",
"customPrimaryColor": "Color primario",
"customSecondaryColor": "Color secundario",
"description": "Configurar la apariencia del visualizador de audio",
"fadeWhenIdle": "Desvanecer al estar inactivo",
"fadeWhenIdle-description": "Atenuar el visualizador cuando no se reproduce audio.",
"innerDiameter": "Diámetro interior",
"mode": {
"all": "Todo",
"bars": "Barras",
"barsRings": "Barras + Anillas",
"rings": "Anillos",
"wave": "Ola",
"waveRings": "Onda + Anillos"
},
"ringOpacity": "Opacidad del anillo",
"rotationSpeed": "Velocidad de rotación",
"sensitivity": "Sensibilidad",
"title": "Ajustes del Visualizador",
"useCustomColors": "Usar colores personalizados",
"useCustomColors-description": "Anular los colores del tema con colores personalizados",
"visualizationMode": "Modo de visualización",
"visualizationMode-description": "Elegir estilo de visualización",
"waveThickness": "Espesor de la onda"
}
}

Some files were not shown because too many files have changed in this diff Show More