Compare commits
9 Commits
9999dc3baf
...
master
Author | SHA1 | Date | |
---|---|---|---|
![]() |
f0abdb3a2c | ||
![]() |
cf447ad966 | ||
![]() |
0cd39b3b42 | ||
![]() |
a8e801e040 | ||
![]() |
7bbb1a9921 | ||
![]() |
c3aba30c34 | ||
![]() |
160ea2abc7 | ||
![]() |
4747ba1c58 | ||
![]() |
a4a76bd91f |
flake.nix
hosts
default
default.nix
home
system
bootloader.nixchromium.nixdefault.nix
editors/nvim
gaming.nixhw.nixnetworking.nixpkgs.nixradio.nixsec.nixservices.nixusers.nixvirt.nixwindowManager
iridium
meteor
@ -14,10 +14,10 @@
|
|||||||
home-manager,
|
home-manager,
|
||||||
nvf,
|
nvf,
|
||||||
}: {
|
}: {
|
||||||
nixosConfigurations.sputnik = nixpkgs.lib.nixosSystem {
|
nixosConfigurations.iridium = nixpkgs.lib.nixosSystem {
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
modules = [
|
modules = [
|
||||||
./hosts/sputnik/configuration.nix
|
./hosts/iridium/configuration.nix
|
||||||
nvf.nixosModules.default
|
nvf.nixosModules.default
|
||||||
home-manager.nixosModules.home-manager
|
home-manager.nixosModules.home-manager
|
||||||
{
|
{
|
||||||
|
@ -1,8 +1,19 @@
|
|||||||
{ config, pkgs, ... }:
|
{ config, pkgs, ... }:
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./windowManager/dwm/default.nix
|
|
||||||
./editors/nvim/default.nix
|
|
||||||
./system/default.nix
|
./system/default.nix
|
||||||
];
|
];
|
||||||
|
hardware = {
|
||||||
|
bluetooth = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
graphics = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
virtualisation = {
|
||||||
|
docker = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./alacritty.nix
|
./alacritty.nix
|
||||||
./shell.nix
|
|
||||||
./git.nix
|
./git.nix
|
||||||
./tmux.nix
|
./tmux.nix
|
||||||
./mpd.nix
|
./sway.nix
|
||||||
|
./waybar.nix
|
||||||
];
|
];
|
||||||
}
|
}
|
@ -4,8 +4,7 @@
|
|||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
imports = [
|
imports = [
|
||||||
./nix
|
./default.nix
|
||||||
./../windowManager/sway/default.nix
|
|
||||||
];
|
];
|
||||||
home = {
|
home = {
|
||||||
enableNixpkgsReleaseCheck = false;
|
enableNixpkgsReleaseCheck = false;
|
||||||
|
@ -1,85 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
mpc
|
|
||||||
mpd-discord-rpc
|
|
||||||
mpv
|
|
||||||
];
|
|
||||||
services = {
|
|
||||||
mpd = {
|
|
||||||
enable = true;
|
|
||||||
musicDirectory = "/home/fabian/.music";
|
|
||||||
extraConfig = ''
|
|
||||||
audio_output {
|
|
||||||
type "pipewire"
|
|
||||||
name "Pipewire Output"
|
|
||||||
}
|
|
||||||
audio_output {
|
|
||||||
type "fifo"
|
|
||||||
name "Visualizer feed"
|
|
||||||
path "/tmp/mpd.fifo"
|
|
||||||
format "44100:16:2"
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
programs = {
|
|
||||||
ncmpcpp = {
|
|
||||||
enable = true;
|
|
||||||
package = pkgs.ncmpcpp.override { visualizerSupport = true; };
|
|
||||||
mpdMusicDir = "/home/fabian/.music";
|
|
||||||
settings = {
|
|
||||||
mpd_port = 6600;
|
|
||||||
mpd_crossfade_time = 2;
|
|
||||||
mouse_support = "yes";
|
|
||||||
visualizer_data_source = "/tmp/mpd.fifo";
|
|
||||||
visualizer_output_name = "my_fifo";
|
|
||||||
visualizer_in_stereo = "no";
|
|
||||||
visualizer_type = "spectrum";
|
|
||||||
visualizer_look = "█┇";
|
|
||||||
visualizer_color = "7, 5, 4, 3";
|
|
||||||
startup_screen = "browser";
|
|
||||||
startup_slave_screen = "visualizer";
|
|
||||||
playlist_disable_highlight_delay = "1";
|
|
||||||
now_playing_prefix = "$8$b ➤ ";
|
|
||||||
song_list_format = "{$2%a$9} $1|$9 {$5%t$9} $R {$6%b$9} $1|$9 {$2%l$9}";
|
|
||||||
song_library_format = "{%n - }{%t}|{%f}";
|
|
||||||
song_status_format = "$b{$6%a$9 $1|$9} {$7%t$9} $1|$9 {$2%b$9} $1|$9 {$6%y$9} $1|$9";
|
|
||||||
song_window_title_format = "{%a-%t}";
|
|
||||||
song_columns_list_format = "(6)[magenta]{l} (30)[red]{a} (30)[blue]{b} (53)[magenta]{t}";
|
|
||||||
playlist_display_mode = "classic";
|
|
||||||
titles_visibility = "no";
|
|
||||||
browser_display_mode = "columns";
|
|
||||||
incremental_seeking = "yes";
|
|
||||||
autocenter_mode = "yes";
|
|
||||||
header_visibility = "no";
|
|
||||||
statusbar_visibility = "yes";
|
|
||||||
cyclic_scrolling = "yes";
|
|
||||||
display_bitrate = "yes";
|
|
||||||
ignore_leading_the = "yes";
|
|
||||||
enable_window_title = "yes";
|
|
||||||
progressbar_look = ":: ";
|
|
||||||
user_interface = "alternative";
|
|
||||||
alternative_header_first_line_format = "{$b$2%a$9} $1|$9 {$5%t$9}";
|
|
||||||
alternative_header_second_line_format = "{$6%b$9} $1|$9 {$2(%y)$9}";
|
|
||||||
alternative_ui_separator_color = "black";
|
|
||||||
playlist_separate_albums = "no";
|
|
||||||
colors_enabled = "yes";
|
|
||||||
empty_tag_color = "blue";
|
|
||||||
header_window_color = "black";
|
|
||||||
volume_color = "black";
|
|
||||||
display_volume_level = "yes";
|
|
||||||
state_line_color = "cyan";
|
|
||||||
state_flags_color = "red";
|
|
||||||
main_window_color = "blue";
|
|
||||||
color1 = "white";
|
|
||||||
color2 = "blue";
|
|
||||||
progressbar_color = "black";
|
|
||||||
statusbar_color = "black";
|
|
||||||
window_border_color = "red";
|
|
||||||
active_window_border = "red";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
grc
|
|
||||||
];
|
|
||||||
programs = {
|
|
||||||
fish = {
|
|
||||||
enable = true;
|
|
||||||
generateCompletions = true;
|
|
||||||
interactiveShellInit = ''
|
|
||||||
set -gx DEVKITPRO "/opt/devkitpro";
|
|
||||||
set -gx DEVKITPPC "/opt/devkitpro/devkitPPC";
|
|
||||||
set -gx DEVKITA64 "/opt/devkitpro/devkitA64";
|
|
||||||
set -gx DEVKITARM "/opt/devkitpro/devkitARM";
|
|
||||||
set -gx PATH "/opt/devkitpro/tools/bin:$PATH";
|
|
||||||
'';
|
|
||||||
shellAliases = {
|
|
||||||
g = "git";
|
|
||||||
gc = "git commit";
|
|
||||||
ga = "git add -A";
|
|
||||||
http = "python3 -m http.server";
|
|
||||||
ls = "${pkgs.eza}/bin/eza -l --icons";
|
|
||||||
tree = "${pkgs.eza}/bin/eza --tree --icons";
|
|
||||||
cp = "cp -rv";
|
|
||||||
mv = "mv -v";
|
|
||||||
mkdir = "mkdir -pv";
|
|
||||||
update = "sudo nixos-rebuild switch --flake /etc/nixos --impure";
|
|
||||||
};
|
|
||||||
plugins = [
|
|
||||||
{
|
|
||||||
name = "fzf-fish";
|
|
||||||
src = pkgs.fishPlugins.fzf-fish.src;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "git-abbr";
|
|
||||||
src = pkgs.fishPlugins.git-abbr.src;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "forgit";
|
|
||||||
src = pkgs.fishPlugins.forgit.src;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "colored-man-pages";
|
|
||||||
src = pkgs.fishPlugins.colored-man-pages.src;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -6,6 +6,7 @@
|
|||||||
package = pkgs.swayfx-unwrapped;
|
package = pkgs.swayfx-unwrapped;
|
||||||
wrapperFeatures.gtk = true;
|
wrapperFeatures.gtk = true;
|
||||||
checkConfig = false;
|
checkConfig = false;
|
||||||
|
|
||||||
extraSessionCommands = ''
|
extraSessionCommands = ''
|
||||||
export _JAVA_AWT_WM_NONREPARENTING=1
|
export _JAVA_AWT_WM_NONREPARENTING=1
|
||||||
export QT_QPA_PLATFORM=wayland
|
export QT_QPA_PLATFORM=wayland
|
||||||
@ -15,27 +16,25 @@
|
|||||||
config = rec {
|
config = rec {
|
||||||
modifier = "Mod4";
|
modifier = "Mod4";
|
||||||
terminal = "alacritty";
|
terminal = "alacritty";
|
||||||
menu = "${pkgs.rofi}/bin/rofi -show run -c .config/rofi/config.rasi";
|
menu = "${pkgs.rofi}/bin/rofi -show drun -c .config/rofi/config.rasi";
|
||||||
startup = [
|
startup = [
|
||||||
{command = "swaybg -i $HOME/.wp/soyuz.png";}
|
{command = "${pkgs.swaybg}/bin/swaybg -i $HOME/.wp/gruvbox-dark-blue.png";}
|
||||||
];
|
];
|
||||||
bars = [{ command = "waybar"; }];
|
bars = [{ command = "${pkgs.waybar}/bin/waybar"; }];
|
||||||
gaps = {
|
gaps = {
|
||||||
outer = 5;
|
outer = 5;
|
||||||
inner = 10;
|
inner = 10;
|
||||||
};
|
};
|
||||||
|
|
||||||
window = {
|
window = {
|
||||||
border = 0;
|
border = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
keybindings = {
|
keybindings = {
|
||||||
# IMPORTANT STUFF #
|
# IMPORTANT STUFF #
|
||||||
"${modifier}+Return" = "exec ${terminal}";
|
"${modifier}+Return" = "exec ${terminal}";
|
||||||
"${modifier}+space" = "exec ${menu}";
|
"${modifier}+space" = "exec ${menu}";
|
||||||
"${modifier}+Q" = "kill";
|
"${modifier}+Q" = "kill";
|
||||||
"${modifier}+Shift+R" = "reload";
|
"${modifier}+Shift+R" = "reload";
|
||||||
"${modifier}+Shift+S" = "${pkgs.grim}/bin/grim -g '$(${pkgs.slurp}/bin/slurp)'";
|
"${modifier}+Shift+S" = "grim -g '$(slurp)'";
|
||||||
# WINDOW STUFF #
|
# WINDOW STUFF #
|
||||||
"${modifier}+Shift+space" = "floating toggle";
|
"${modifier}+Shift+space" = "floating toggle";
|
||||||
"${modifier}+Shift+F" = "fullscreen toggle";
|
"${modifier}+Shift+F" = "fullscreen toggle";
|
||||||
@ -74,33 +73,28 @@
|
|||||||
"${modifier}+Shift+6" = "move container to workspace number 6";
|
"${modifier}+Shift+6" = "move container to workspace number 6";
|
||||||
"${modifier}+Shift+7" = "move container to workspace number 7";
|
"${modifier}+Shift+7" = "move container to workspace number 7";
|
||||||
"${modifier}+Shift+8" = "move container to workspace number 8";
|
"${modifier}+Shift+8" = "move container to workspace number 8";
|
||||||
"${modifier}+Shift+9" = "move container to workspace number 9";
|
"${modifier}+Shift+9" = "move container to workspace number 9";
|
||||||
|
|
||||||
# Audio
|
# Audio
|
||||||
"XF86AudioRaiseVolume" = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ +10%";
|
"XF86AudioRaiseVolume" = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ +5%";
|
||||||
"XF86AudioLowerVolume" = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ -10%";
|
"XF86AudioLowerVolume" = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ -5%";
|
||||||
"XF86AudioMute" = "exec ${pkgs.pulseaudio}/bin/pactl set-volume toggle-mute";
|
"XF86AudioMute" = "exec ${pkgs.pulseaudio}/bin/pactl set-volume toggle-mute";
|
||||||
"XF86AudioStop" = "exec ${pkgs.playerctl}/bin/playerctl stop";
|
"XF86AudioStop" = "exec ${pkgs.playerctl}/bin/playerctl stop";
|
||||||
"XF86AudioPrev" = "exec ${pkgs.playerctl}/bin/playerctl previous";
|
"XF86AudioPrev" = "exec ${pkgs.playerctl}/bin/playerctl previous";
|
||||||
"XF86AudioNext" = "exec ${pkgs.playerctl}/bin/playerctl next";
|
"XF86AudioNext" = "exec ${pkgs.playerctl}/bin/playerctl next";
|
||||||
"XF86AudioPlay" = "exec ${pkgs.playerctl}/bin/playerctl play-pause";
|
"XF86AudioPlay" = "exec ${pkgs.playerctl}/bin/playerctl play-pause";
|
||||||
|
|
||||||
"XF86MonBrightnessDown" = "exec ${pkgs.brightnessctl}/bin/brightnessctl set 15%-";
|
"XF86MonBrightnessDown" = "exec ${pkgs.brightnessctl}/bin/brightnessctl set 5%-";
|
||||||
"XF86MonBrightnessUp" = "exec ${pkgs.brightnessctl}/bin/brightnessctl set +15%";
|
"XF86MonBrightnessUp" = "exec ${pkgs.brightnessctl}/bin/brightnessctl set +5%";
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
shadows enable
|
shadows enable
|
||||||
corner_radius 12
|
corner_radius 12
|
||||||
blur_radius 7
|
|
||||||
blur_passes 4
|
|
||||||
default_dim_inactive 0.2
|
default_dim_inactive 0.2
|
||||||
|
|
||||||
for_window [app_id="wezterm"] blur enable
|
|
||||||
for_window [app_id="code"] blur enable
|
|
||||||
for_window [app_id="rofi"] blur enable
|
|
||||||
|
|
||||||
default_border pixel 0px
|
default_border pixel 0px
|
||||||
default_floating_border none
|
default_floating_border none
|
||||||
titlebar_border_thickness 0
|
titlebar_border_thickness 0
|
@ -27,7 +27,6 @@
|
|||||||
bind -n M-Up select-pane -U
|
bind -n M-Up select-pane -U
|
||||||
bind -n M-Down select-pane -D
|
bind -n M-Down select-pane -D
|
||||||
|
|
||||||
set-option -s status-interval 1
|
|
||||||
set -g status-left-length 100
|
set -g status-left-length 100
|
||||||
set -g status-right-length 100
|
set -g status-right-length 100
|
||||||
set -g status-position top
|
set -g status-position top
|
||||||
@ -37,8 +36,6 @@
|
|||||||
set -g @plugin 'o0th/tmux-nova'
|
set -g @plugin 'o0th/tmux-nova'
|
||||||
|
|
||||||
set -g @nova-nerdfonts true
|
set -g @nova-nerdfonts true
|
||||||
set -g @nova-nerdfonts-left
|
|
||||||
set -g @nova-nerdfonts-right
|
|
||||||
|
|
||||||
set -g @nova-pane-active-border-style "#44475a"
|
set -g @nova-pane-active-border-style "#44475a"
|
||||||
set -g @nova-pane-border-style "#282a36"
|
set -g @nova-pane-border-style "#282a36"
|
325
hosts/default/home/waybar.nix
Normal file
325
hosts/default/home/waybar.nix
Normal file
@ -0,0 +1,325 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
programs.waybar = {
|
||||||
|
enable = true;
|
||||||
|
style = ''
|
||||||
|
@define-color foreground #f2f4f8;
|
||||||
|
@define-color background #161616;
|
||||||
|
@define-color alt_background #1a1a1a;
|
||||||
|
@define-color accent #3ddbd9;
|
||||||
|
|
||||||
|
@define-color black #262626;
|
||||||
|
@define-color red #ee5396;
|
||||||
|
@define-color green #42be65;
|
||||||
|
@define-color yellow #ffab91;
|
||||||
|
@define-color blue #33b1ff;
|
||||||
|
@define-color magenta #be95ff;
|
||||||
|
@define-color cyan #3ddbd9;
|
||||||
|
@define-color white #dde1e6;
|
||||||
|
|
||||||
|
@define-color alt_black #262626;
|
||||||
|
@define-color alt_red #ee5396;
|
||||||
|
@define-color alt_green #42be65;
|
||||||
|
@define-color alt_yellow #ffab91;
|
||||||
|
@define-color alt_blue #33b1ff;
|
||||||
|
@define-color alt_magenta #be95ff;
|
||||||
|
@define-color alt_cyan #3ddbd9;
|
||||||
|
@define-color alt_white #dde1e6;
|
||||||
|
|
||||||
|
* {
|
||||||
|
|
||||||
|
border: none;
|
||||||
|
font-family: JetBrainsMono Nerd Font, sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
window#waybar {
|
||||||
|
/* background-color: rgba(0, 0, 0, 0); */
|
||||||
|
/* background-color: rgba(18, 21, 29, 0.98); */
|
||||||
|
background-color: @background;
|
||||||
|
border-radius: 6px;
|
||||||
|
color: @foreground;
|
||||||
|
opacity: 1;
|
||||||
|
transition-property: background-color;
|
||||||
|
transition-duration: .5s;
|
||||||
|
margin-bottom: -7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
window#waybar.hidden {
|
||||||
|
opacity: 0.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
window#hyprland-window {
|
||||||
|
background-color: @background;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces,
|
||||||
|
#mode,
|
||||||
|
#window,
|
||||||
|
#cpu,
|
||||||
|
#memory,
|
||||||
|
#temperature,
|
||||||
|
#custom-media,
|
||||||
|
#custom-powermenu,
|
||||||
|
#custom-fans,
|
||||||
|
#custom-distro,
|
||||||
|
#clock,
|
||||||
|
#idle_inhibitor,
|
||||||
|
#language,
|
||||||
|
#pulseaudio,
|
||||||
|
#backlight,
|
||||||
|
#battery,
|
||||||
|
#network,
|
||||||
|
#tray {
|
||||||
|
background-color: @alt_background;
|
||||||
|
padding: 0 10px;
|
||||||
|
margin: 5px 2px 5px 2px;
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0);
|
||||||
|
border-radius: 6px;
|
||||||
|
background-clip: padding-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button {
|
||||||
|
background-color: @alt_background;
|
||||||
|
padding: 0 5px;
|
||||||
|
min-width: 20px;
|
||||||
|
color: @foreground;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button:hover {
|
||||||
|
background-color: rgba(0, 0, 0, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button.active {
|
||||||
|
color: @accent;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button.urgent {
|
||||||
|
color: @red;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cpu {
|
||||||
|
padding: 0 10px;
|
||||||
|
color: @alt_cyan;
|
||||||
|
}
|
||||||
|
|
||||||
|
#memory {
|
||||||
|
padding: 0 10px;
|
||||||
|
color: @alt_cyan;
|
||||||
|
}
|
||||||
|
|
||||||
|
#temperature {
|
||||||
|
padding: 0 10px;
|
||||||
|
color: @blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
#temperature.critical {
|
||||||
|
background-color: @red;
|
||||||
|
padding: 0 10px;
|
||||||
|
color: @background;
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-media {
|
||||||
|
color: #c678dd;
|
||||||
|
padding: 0 10px;
|
||||||
|
color: @background;
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-fans {
|
||||||
|
padding: 0 10px;
|
||||||
|
color: @blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
#clock {
|
||||||
|
padding: 0 10px;
|
||||||
|
color: @blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
#idle_inhibitor {
|
||||||
|
padding: 0 10px;
|
||||||
|
color: @foreground;
|
||||||
|
}
|
||||||
|
|
||||||
|
#language {
|
||||||
|
padding: 0 10px;
|
||||||
|
color: @blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pulseaudio {
|
||||||
|
padding: 0 10px;
|
||||||
|
color: @yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pulseaudio.muted {
|
||||||
|
padding: 0 10px;
|
||||||
|
background-color: @red;
|
||||||
|
color: @background;
|
||||||
|
}
|
||||||
|
|
||||||
|
#backlight {
|
||||||
|
padding: 0 10px;
|
||||||
|
color: @yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery {
|
||||||
|
padding: 0 10px;
|
||||||
|
color: @alt_green;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.charging, #battery.plugged {
|
||||||
|
padding: 0 10px;
|
||||||
|
background-color: @alt_green;
|
||||||
|
color: @background;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes blink {
|
||||||
|
to {
|
||||||
|
background-color: @background;
|
||||||
|
color: @red;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.critical:not(.charging) {
|
||||||
|
padding: 0 10px;
|
||||||
|
background-color: @red;
|
||||||
|
color: @background;
|
||||||
|
animation-name: blink;
|
||||||
|
animation-duration: 0.5s;
|
||||||
|
animation-timing-function: linear;
|
||||||
|
animation-iteration-count: infinite;
|
||||||
|
animation-direction: alternate;
|
||||||
|
}
|
||||||
|
|
||||||
|
#network {
|
||||||
|
padding: 0 10px;
|
||||||
|
color: @blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-distro {
|
||||||
|
color: @accent;
|
||||||
|
background-color: @background;
|
||||||
|
font-size: 25px;
|
||||||
|
margin: 1px;
|
||||||
|
padding: 0px 0px 0px 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#network.disconnected {
|
||||||
|
padding: 0 10px;
|
||||||
|
background-color: @red;
|
||||||
|
color: @background;
|
||||||
|
}
|
||||||
|
#custom-powermenu {
|
||||||
|
background-color: @red;
|
||||||
|
color: @background;
|
||||||
|
font-size: 15px;
|
||||||
|
padding-right: 6px;
|
||||||
|
padding-left: 11px;
|
||||||
|
margin: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
'';
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
mainBar = {
|
||||||
|
#margin = "8px 10px -2px 10px";
|
||||||
|
margin = "0px 10px 8px 10px";
|
||||||
|
layer = "top";
|
||||||
|
position = "bottom";
|
||||||
|
|
||||||
|
modules-left = [ "custom/distro" "battery" "sway/workspaces" ];
|
||||||
|
modules-center = [ "sway/window" ];
|
||||||
|
modules-right = [ "cpu" "memory" "backlight" "pulseaudio" "network" "tray" "clock" ];
|
||||||
|
|
||||||
|
"sway/workspaces" = {
|
||||||
|
active-only = "false";
|
||||||
|
disable-scroll = "true";
|
||||||
|
all-outputs = "true";
|
||||||
|
format = "{icon}";
|
||||||
|
on-click = "activate";
|
||||||
|
};
|
||||||
|
|
||||||
|
"idle_inhibitor" = {
|
||||||
|
format = "{icon}";
|
||||||
|
format-icons = {
|
||||||
|
activated = " ";
|
||||||
|
deactivated = " ";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
"tray" = {
|
||||||
|
spacing = 8;
|
||||||
|
};
|
||||||
|
|
||||||
|
"clock" = {
|
||||||
|
tooltip-format = "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>";
|
||||||
|
format = " {:%H:%M:%S}";
|
||||||
|
format-alt = " {:%A, %B %d, %Y}";
|
||||||
|
};
|
||||||
|
|
||||||
|
"cpu" = {
|
||||||
|
format = " {usage}%";
|
||||||
|
tooltip = "false";
|
||||||
|
};
|
||||||
|
|
||||||
|
"memory" = {
|
||||||
|
format = " {}%";
|
||||||
|
};
|
||||||
|
|
||||||
|
"backlight" = {
|
||||||
|
format = "{icon}{percent}%";
|
||||||
|
format-icons = [" " " " " "];
|
||||||
|
on-scroll-up = "light -A 1";
|
||||||
|
on-scroll-down = "light -U 1";
|
||||||
|
};
|
||||||
|
|
||||||
|
"battery" = {
|
||||||
|
states = {
|
||||||
|
warning = "30";
|
||||||
|
critical = "15";
|
||||||
|
};
|
||||||
|
format = "{icon}{capacity}%";
|
||||||
|
tooltip-format = "{timeTo} {capacity}%";
|
||||||
|
format-charging = "{capacity}%";
|
||||||
|
format-plugged = " {capacity}%";
|
||||||
|
format-alt = "{time} {icon}";
|
||||||
|
format-icons = [" " " " " " " " " "];
|
||||||
|
};
|
||||||
|
|
||||||
|
"network" = {
|
||||||
|
format-wifi = " {essid} {signalStrength}%";
|
||||||
|
format-ethernet = "{ifname}: {ipaddr}/{cidr} ";
|
||||||
|
format-linked = "{ifname} (No IP) ";
|
||||||
|
format-disconnected = " Disconnected";
|
||||||
|
on-click-release = "sleep 0";
|
||||||
|
tooltip-format = "{essid} {signalStrength}%";
|
||||||
|
};
|
||||||
|
|
||||||
|
"pulseaudio" = {
|
||||||
|
format = "{icon}{volume}% {format_source}";
|
||||||
|
format-bluetooth = "{icon} {volume}%";
|
||||||
|
format-bluetooth-muted = " {volume}%";
|
||||||
|
format-source = "";
|
||||||
|
format-source-muted = "";
|
||||||
|
format-muted = " {format_source}";
|
||||||
|
format-icons = {
|
||||||
|
headphone = " ";
|
||||||
|
phone = " ";
|
||||||
|
portable = " ";
|
||||||
|
default = [" " " " " "];
|
||||||
|
};
|
||||||
|
tooltip-format = "{desc} {volume}%";
|
||||||
|
on-click = "wpctl set-sink-mute @DEFAULT_SINK@ toggle";
|
||||||
|
on-click-right = "wpctl set-source-mute @DEFAULT_SOURCE@ toggle";
|
||||||
|
on-click-middle = "${pkgs.pavucontrol}/bin/pavucontrol";
|
||||||
|
on-click-release = "sleep 0";
|
||||||
|
on-click-middle-release = "sleep 0";
|
||||||
|
};
|
||||||
|
|
||||||
|
"custom/distro" = {
|
||||||
|
format = " ";
|
||||||
|
on-click-release = "sleep 0";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -4,12 +4,6 @@
|
|||||||
loader = {
|
loader = {
|
||||||
systemd-boot = {
|
systemd-boot = {
|
||||||
enable = true;
|
enable = true;
|
||||||
extraEntries = {
|
|
||||||
"mint.conf" = ''
|
|
||||||
title Linux Mint
|
|
||||||
efi /EFI/ubuntu/shimx64.efi
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
supportedFilesystems = [ "ntfs" ];
|
supportedFilesystems = [ "ntfs" ];
|
@ -1,17 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
{
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
chromium
|
|
||||||
];
|
|
||||||
programs.chromium = {
|
|
||||||
enable = true;
|
|
||||||
extensions = [
|
|
||||||
"eimadpbcbfnmbkopoojfekhnkhdbieeh" # Dark Reader
|
|
||||||
];
|
|
||||||
extraOpts = {
|
|
||||||
"BrowserSignin" = 0;
|
|
||||||
"SyncDisabled" = true;
|
|
||||||
"PasswordManagerEnabled" = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -4,17 +4,11 @@
|
|||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
imports = [
|
imports = [
|
||||||
|
./editors/nvim/default.nix
|
||||||
./networking.nix
|
./networking.nix
|
||||||
./users.nix
|
./users.nix
|
||||||
./services.nix
|
./services.nix
|
||||||
./gaming.nix
|
|
||||||
./firefox.nix
|
./firefox.nix
|
||||||
./pkgs.nix
|
./pkgs.nix
|
||||||
./sec.nix
|
|
||||||
./virt.nix
|
|
||||||
./boot.nix
|
|
||||||
./hw.nix
|
|
||||||
./radio.nix
|
|
||||||
./chromium.nix
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
./cmp.nix
|
./cmp.nix
|
||||||
./lualine.nix
|
./lualine.nix
|
||||||
./snip.nix
|
./snip.nix
|
||||||
./extraPlugins.nix
|
#./extraPlugins.nix
|
||||||
];
|
];
|
||||||
programs.nvf = {
|
programs.nvf = {
|
||||||
enable = true;
|
enable = true;
|
@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
programs = {
|
|
||||||
steam = {
|
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
{
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
hackrf
|
|
||||||
];
|
|
||||||
|
|
||||||
hardware = {
|
|
||||||
bluetooth = {
|
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
graphics = {
|
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -13,17 +13,6 @@
|
|||||||
};
|
};
|
||||||
networking = {
|
networking = {
|
||||||
networkmanager.enable = true;
|
networkmanager.enable = true;
|
||||||
firewall = {
|
|
||||||
enable = false;
|
|
||||||
allowedTCPPorts = [
|
|
||||||
80
|
|
||||||
1337
|
|
||||||
5001
|
|
||||||
8080
|
|
||||||
3000
|
|
||||||
8000
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
# System utilities
|
# System utilities
|
||||||
unzip
|
unzip
|
||||||
yt-dlp
|
|
||||||
inetutils
|
inetutils
|
||||||
git
|
git
|
||||||
wget
|
wget
|
||||||
@ -93,6 +92,7 @@
|
|||||||
cubicsdr
|
cubicsdr
|
||||||
gqrx
|
gqrx
|
||||||
multimon-ng
|
multimon-ng
|
||||||
|
stellarium
|
||||||
|
|
||||||
# Miscellaneous
|
# Miscellaneous
|
||||||
cava
|
cava
|
||||||
|
@ -1,11 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
{
|
|
||||||
hardware = {
|
|
||||||
rtl-sdr = {
|
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
hackrf = {
|
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
{
|
|
||||||
security = {
|
|
||||||
doas = {
|
|
||||||
enable = true;
|
|
||||||
extraRules = [
|
|
||||||
{
|
|
||||||
users = [ "fabian" ];
|
|
||||||
noPass = true;
|
|
||||||
keepEnv = true;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -9,12 +9,12 @@
|
|||||||
pulse.enable = true;
|
pulse.enable = true;
|
||||||
wireplumber.enable = true;
|
wireplumber.enable = true;
|
||||||
};
|
};
|
||||||
|
dbus.enable = true;
|
||||||
mullvad-vpn = {
|
mullvad-vpn = {
|
||||||
enable = true;
|
enable = true;
|
||||||
package = pkgs.mullvad-vpn;
|
package = pkgs.mullvad-vpn;
|
||||||
};
|
};
|
||||||
sdrplayApi = {
|
gnome.gnome-keyring.enable = true;
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
security.rtkit.enable = true;
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,47 @@
|
|||||||
{ config, pkgs, ... }:
|
{ config, pkgs, ... }:
|
||||||
{
|
{
|
||||||
|
security = {
|
||||||
|
doas = {
|
||||||
|
enable = true;
|
||||||
|
extraRules = [
|
||||||
|
{
|
||||||
|
users = [ "fabian" ];
|
||||||
|
noPass = true;
|
||||||
|
keepEnv = true;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs = {
|
||||||
|
bash = {
|
||||||
|
enableLsColors = true;
|
||||||
|
completion = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.bash-completion;
|
||||||
|
};
|
||||||
|
shellInit = ''
|
||||||
|
case "$TERM" in
|
||||||
|
xterm-color|*-256color) color_prompt=yes;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
export DEVKITPRO="/opt/devkitpro"
|
||||||
|
export DEVKITA64="$DEVKITPRO/devkitA64"
|
||||||
|
export DEVKITARM="$DEVKITPRO/devkitARM"
|
||||||
|
export DEVKITPPC="$DEVKITPRO/devkitPPC"
|
||||||
|
'';
|
||||||
|
|
||||||
|
shellAliases = {
|
||||||
|
update = "sudo nixos-rebuild switch --flake /etc/nixos --impure";
|
||||||
|
http = "python3 -m http.server 1337";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
users = {
|
users = {
|
||||||
defaultUserShell = pkgs.fish;
|
|
||||||
users = {
|
users = {
|
||||||
fabian = {
|
fabian = {
|
||||||
useDefaultShell = true;
|
useDefaultShell = true;
|
||||||
shell = pkgs.fish;
|
|
||||||
isNormalUser = true;
|
isNormalUser = true;
|
||||||
initialPassword = "1601";
|
initialPassword = "1601";
|
||||||
extraGroups = [
|
extraGroups = [
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
{
|
|
||||||
virtualisation = {
|
|
||||||
docker = {
|
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
{
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
dmenu
|
|
||||||
];
|
|
||||||
services = {
|
|
||||||
xserver = {
|
|
||||||
enable = true;
|
|
||||||
displayManager.startx.enable = true;
|
|
||||||
windowManager = {
|
|
||||||
dwm = {
|
|
||||||
enable = true;
|
|
||||||
package = pkgs.dwm.overrideAttrs {
|
|
||||||
src = ./source/dwm;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
# dwm - dynamic window manager
|
|
||||||
# See LICENSE file for copyright and license details.
|
|
||||||
|
|
||||||
include config.mk
|
|
||||||
|
|
||||||
SRC = drw.c dwm.c util.c
|
|
||||||
OBJ = ${SRC:.c=.o}
|
|
||||||
|
|
||||||
all: dwm
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
${CC} -c ${CFLAGS} $<
|
|
||||||
|
|
||||||
${OBJ}: config.h config.mk
|
|
||||||
|
|
||||||
config.h:
|
|
||||||
cp config.def.h $@
|
|
||||||
|
|
||||||
dwm: ${OBJ}
|
|
||||||
${CC} -o $@ ${OBJ} ${LDFLAGS}
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f config.h dwm ${OBJ} dwm-${VERSION}.tar.gz
|
|
||||||
|
|
||||||
dist: clean
|
|
||||||
mkdir -p dwm-${VERSION}
|
|
||||||
cp -R LICENSE Makefile README config.def.h config.mk\
|
|
||||||
dwm.1 drw.h util.h ${SRC} dwm.png transient.c dwm-${VERSION}
|
|
||||||
tar -cf dwm-${VERSION}.tar dwm-${VERSION}
|
|
||||||
gzip dwm-${VERSION}.tar
|
|
||||||
rm -rf config.h dwm-${VERSION}
|
|
||||||
install: all
|
|
||||||
mkdir -p ${DESTDIR}${PREFIX}/bin
|
|
||||||
cp -f dwm ${DESTDIR}${PREFIX}/bin
|
|
||||||
chmod 755 ${DESTDIR}${PREFIX}/bin/dwm
|
|
||||||
mkdir -p ${DESTDIR}${MANPREFIX}/man1
|
|
||||||
sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1
|
|
||||||
chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1
|
|
||||||
|
|
||||||
uninstall:
|
|
||||||
rm -f ${DESTDIR}${PREFIX}/bin/dwm\
|
|
||||||
${DESTDIR}${MANPREFIX}/man1/dwm.1
|
|
||||||
|
|
||||||
.PHONY: all clean dist install uninstall
|
|
@ -1,168 +0,0 @@
|
|||||||
static const unsigned int borderpx = 1; /* border pixel of windows */
|
|
||||||
static const unsigned int snap = 32; /* snap pixel */
|
|
||||||
static const unsigned int gappih = 10; /* horiz inner gap between windows */
|
|
||||||
static const unsigned int gappiv = 10; /* vert inner gap between windows */
|
|
||||||
static const unsigned int gappoh =
|
|
||||||
10; /* horiz outer gap between windows and screen edge */
|
|
||||||
static const unsigned int gappov =
|
|
||||||
10; /* vert outer gap between windows and screen edge */
|
|
||||||
static int smartgaps =
|
|
||||||
0; /* 1 means no outer gap when there is only one window */
|
|
||||||
static const int showbar = 1; /* 0 means no bar */
|
|
||||||
static const int topbar = 1; /* 0 means bottom bar */
|
|
||||||
static const char *fonts[] = {"Fantasque Sans Mono:size=10"};
|
|
||||||
static const char dmenufont[] = "Fantasque Sans Mono:size=10";
|
|
||||||
|
|
||||||
//static const char col_gray1[] = "#262626";
|
|
||||||
//static const char col_gray2[] = "#ffffff";
|
|
||||||
//static const char col_gray3[] = "#dde1e6";
|
|
||||||
//static const char col_gray4[] = "#ffffff";
|
|
||||||
//static const char col_cyan[] = "#262626";
|
|
||||||
|
|
||||||
static const char col_gray1[] = "#121212";
|
|
||||||
static const char col_gray2[] = "#ffffff";
|
|
||||||
static const char col_gray3[] = "#dde1e6";
|
|
||||||
static const char col_gray4[] = "#ffffff";
|
|
||||||
static const char col_cyan[] = "#121212";
|
|
||||||
|
|
||||||
|
|
||||||
static const char *colors[][3] = {
|
|
||||||
/* fg bg border */
|
|
||||||
[SchemeNorm] = {col_gray3, col_gray1, col_gray1},
|
|
||||||
[SchemeSel] = {col_gray4, col_cyan, col_gray2},
|
|
||||||
};
|
|
||||||
|
|
||||||
/* tagging */
|
|
||||||
static const char *tags[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
|
|
||||||
|
|
||||||
static const Rule rules[] = {
|
|
||||||
{"Gimp", NULL, NULL, 0, 1, -1},
|
|
||||||
};
|
|
||||||
|
|
||||||
/* layout(s) */
|
|
||||||
static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
|
|
||||||
static const int nmaster = 1; /* number of clients in master area */
|
|
||||||
static const int resizehints =
|
|
||||||
1; /* 1 means respect size hints in tiled resizals */
|
|
||||||
static const int lockfullscreen =
|
|
||||||
1; /* 1 will force focus on the fullscreen window */
|
|
||||||
|
|
||||||
#define FORCE_VSPLIT \
|
|
||||||
1 /* nrowgrid layout: force two clients to always split vertically */
|
|
||||||
#include "vanitygaps.c"
|
|
||||||
#include <X11/XF86keysym.h>
|
|
||||||
|
|
||||||
static const Layout layouts[] = {
|
|
||||||
{"[\\]", dwindle},
|
|
||||||
{NULL, centeredfloatingmaster},
|
|
||||||
{"|M|", centeredmaster},
|
|
||||||
{"[]=", tile}, /* first entry is default */
|
|
||||||
{"[M]", monocle},
|
|
||||||
{"[@]", spiral},
|
|
||||||
{"H[]", deck},
|
|
||||||
{"TTT", bstack},
|
|
||||||
{"===", bstackhoriz},
|
|
||||||
{"HHH", grid},
|
|
||||||
{"###", nrowgrid},
|
|
||||||
{"---", horizgrid},
|
|
||||||
{":::", gaplessgrid},
|
|
||||||
{"><>", NULL}, /* no layout function means floating behavior */
|
|
||||||
{NULL, NULL},
|
|
||||||
};
|
|
||||||
|
|
||||||
#define MODKEY Mod4Mask
|
|
||||||
|
|
||||||
#define TAGKEYS(KEY, TAG) \
|
|
||||||
{MODKEY, KEY, view, {.ui = 1 << TAG}}, \
|
|
||||||
{MODKEY | ControlMask, KEY, toggleview, {.ui = 1 << TAG}}, \
|
|
||||||
{MODKEY | ShiftMask, KEY, tag, {.ui = 1 << TAG}}, \
|
|
||||||
{MODKEY | ControlMask | ShiftMask, KEY, toggletag, {.ui = 1 << TAG}},
|
|
||||||
|
|
||||||
#define SHCMD(cmd) \
|
|
||||||
{ \
|
|
||||||
.v = (const char *[]) { "/bin/sh", "-c", cmd, NULL } \
|
|
||||||
}
|
|
||||||
|
|
||||||
static char dmenumon[2] =
|
|
||||||
"0"; /* component of dmenucmd, manipulated in spawn() */
|
|
||||||
static const char *termcmd[] = {"alacritty", NULL};
|
|
||||||
static const char *dmenucmd[] = {
|
|
||||||
"dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1,
|
|
||||||
"-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL};
|
|
||||||
static const char *upvol[] = {"wpctl", "set-volume", "@DEFAULT_AUDIO_SINK@",
|
|
||||||
"5%+", NULL};
|
|
||||||
static const char *downvol[] = {"wpctl", "set-volume", "@DEFAULT_AUDIO_SINK@",
|
|
||||||
"5%-", NULL};
|
|
||||||
static const char *mutevol[] = {"wpctl", "set-mute", "@DEFAULT_AUDIO_SINK@",
|
|
||||||
"toggle", NULL};
|
|
||||||
static const char *screenshot[] = {"flameshot", "gui", NULL};
|
|
||||||
|
|
||||||
static const Key keys[] = {
|
|
||||||
/* modifier key function argument */
|
|
||||||
{MODKEY, XK_space, spawn, {.v = dmenucmd}},
|
|
||||||
{MODKEY, XK_Return, spawn, {.v = termcmd}},
|
|
||||||
{MODKEY|ShiftMask, XK_s, spawn, {.v = screenshot}},
|
|
||||||
{MODKEY | ShiftMask, XK_m, quit, {0}},
|
|
||||||
{MODKEY, XK_Right, focusstack, {.i = +1}},
|
|
||||||
{MODKEY, XK_Left, focusstack, {.i = -1}},
|
|
||||||
{MODKEY, XK_i, incnmaster, {.i = +1}},
|
|
||||||
{MODKEY, XK_d, incnmaster, {.i = -1}},
|
|
||||||
{MODKEY, XK_r, rotatestack, {.i = -1}},
|
|
||||||
{MODKEY | ShiftMask, XK_Left, setmfact, {.f = -0.05}},
|
|
||||||
{MODKEY | ShiftMask, XK_Right, setmfact, {.f = +0.05}},
|
|
||||||
{MODKEY, XK_Tab, view, {0}},
|
|
||||||
{MODKEY, XK_q, killclient, {0}},
|
|
||||||
{MODKEY | ShiftMask, XK_space, togglefloating, {0}},
|
|
||||||
{MODKEY, XK_0, view, {.ui = ~0}},
|
|
||||||
{MODKEY | ShiftMask, XK_0, tag, {.ui = ~0}},
|
|
||||||
{MODKEY, XK_comma, focusmon, {.i = -1}},
|
|
||||||
{MODKEY, XK_period, focusmon, {.i = +1}},
|
|
||||||
{MODKEY | ShiftMask, XK_comma, tagmon, {.i = -1}},
|
|
||||||
{MODKEY | ShiftMask, XK_period, tagmon, {.i = +1}},
|
|
||||||
{MODKEY, XK_b, togglebar, {0}},
|
|
||||||
|
|
||||||
// Vanity Gaps shit //
|
|
||||||
{MODKEY | ShiftMask, XK_h, setcfact, {.f = +0.25}},
|
|
||||||
{MODKEY | ShiftMask, XK_l, setcfact, {.f = -0.25}},
|
|
||||||
{MODKEY | ShiftMask, XK_o, setcfact, {.f = 0.00}},
|
|
||||||
{MODKEY | Mod1Mask, XK_u, incrgaps, {.i = +3}},
|
|
||||||
{MODKEY | Mod1Mask | ShiftMask, XK_u, incrgaps, {.i = -3}},
|
|
||||||
{MODKEY | Mod1Mask, XK_i, incrigaps, {.i = +1}},
|
|
||||||
{MODKEY | Mod1Mask | ShiftMask, XK_i, incrigaps, {.i = -1}},
|
|
||||||
{MODKEY | Mod1Mask, XK_o, incrogaps, {.i = +1}},
|
|
||||||
{MODKEY | Mod1Mask | ShiftMask, XK_o, incrogaps, {.i = -1}},
|
|
||||||
{MODKEY | Mod1Mask, XK_6, incrihgaps, {.i = +1}},
|
|
||||||
{MODKEY | Mod1Mask | ShiftMask, XK_6, incrihgaps, {.i = -1}},
|
|
||||||
{MODKEY | Mod1Mask, XK_7, incrivgaps, {.i = +5}},
|
|
||||||
{MODKEY | Mod1Mask | ShiftMask, XK_7, incrivgaps, {.i = -5}},
|
|
||||||
{MODKEY | Mod1Mask, XK_8, incrohgaps, {.i = +1}},
|
|
||||||
{MODKEY | Mod1Mask | ShiftMask, XK_8, incrohgaps, {.i = -1}},
|
|
||||||
{MODKEY | Mod1Mask, XK_9, incrovgaps, {.i = +1}},
|
|
||||||
{MODKEY | Mod1Mask | ShiftMask, XK_9, incrovgaps, {.i = -1}},
|
|
||||||
{MODKEY | Mod1Mask, XK_0, togglegaps, {0}},
|
|
||||||
{MODKEY | Mod1Mask | ShiftMask, XK_0, defaultgaps, {0}},
|
|
||||||
|
|
||||||
// WS
|
|
||||||
TAGKEYS(XK_1, 0) TAGKEYS(XK_2, 1) TAGKEYS(XK_3, 2) TAGKEYS(XK_4, 3)
|
|
||||||
TAGKEYS(XK_5, 4) TAGKEYS(XK_6, 5) TAGKEYS(XK_7, 6) TAGKEYS(XK_8, 7)
|
|
||||||
TAGKEYS(XK_9, 8)
|
|
||||||
|
|
||||||
// Media Keys //
|
|
||||||
{0, XF86XK_AudioLowerVolume, spawn, {.v = downvol}},
|
|
||||||
{0, XF86XK_AudioMute, spawn, {.v = mutevol}},
|
|
||||||
{0, XF86XK_AudioRaiseVolume, spawn, {.v = upvol}},
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
static const Button buttons[] = {
|
|
||||||
{ClkLtSymbol, 0, Button1, setlayout, {0}},
|
|
||||||
{ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]}},
|
|
||||||
{ClkWinTitle, 0, Button2, zoom, {0}},
|
|
||||||
{ClkStatusText, 0, Button2, spawn, {.v = termcmd}},
|
|
||||||
{ClkClientWin, MODKEY, Button1, movemouse, {0}},
|
|
||||||
{ClkClientWin, MODKEY, Button3, resizemouse, {0}},
|
|
||||||
{ClkTagBar, 0, Button1, view, {0}},
|
|
||||||
{ClkTagBar, 0, Button3, toggleview, {0}},
|
|
||||||
{ClkTagBar, MODKEY, Button1, tag, {0}},
|
|
||||||
{ClkTagBar, MODKEY, Button3, toggletag, {0}},
|
|
||||||
};
|
|
@ -1,39 +0,0 @@
|
|||||||
# dwm version
|
|
||||||
VERSION = 6.5
|
|
||||||
|
|
||||||
# Customize below to fit your system
|
|
||||||
|
|
||||||
# paths
|
|
||||||
PREFIX = /usr/local
|
|
||||||
MANPREFIX = ${PREFIX}/share/man
|
|
||||||
|
|
||||||
X11INC = ${PREFIX}/include
|
|
||||||
X11LIB = ${PREFIX}/lib
|
|
||||||
|
|
||||||
# Xinerama, comment if you don't want it
|
|
||||||
XINERAMALIBS = -lXinerama
|
|
||||||
XINERAMAFLAGS = -DXINERAMA
|
|
||||||
|
|
||||||
# freetype
|
|
||||||
FREETYPELIBS = -lfontconfig -lXft
|
|
||||||
FREETYPEINC = ${PREFIX}/include/freetype2
|
|
||||||
# OpenBSD (uncomment)
|
|
||||||
FREETYPEINC = ${X11INC}/freetype2
|
|
||||||
MANPREFIX = ${PREFIX}/man
|
|
||||||
|
|
||||||
# includes and libs
|
|
||||||
INCS = -I${X11INC} -I${FREETYPEINC}
|
|
||||||
LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
|
|
||||||
|
|
||||||
# flags
|
|
||||||
CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
|
|
||||||
#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
|
|
||||||
CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS}
|
|
||||||
LDFLAGS = ${LIBS}
|
|
||||||
|
|
||||||
# Solaris
|
|
||||||
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
|
|
||||||
#LDFLAGS = ${LIBS}
|
|
||||||
|
|
||||||
# compiler and linker
|
|
||||||
CC = cc
|
|
@ -1,425 +0,0 @@
|
|||||||
/* See LICENSE file for copyright and license details. */
|
|
||||||
#include <X11/Xft/Xft.h>
|
|
||||||
#include <X11/Xlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "drw.h"
|
|
||||||
#include "util.h"
|
|
||||||
|
|
||||||
#define UTF_INVALID 0xFFFD
|
|
||||||
#define UTF_SIZ 4
|
|
||||||
|
|
||||||
static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0};
|
|
||||||
static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0,
|
|
||||||
0xF8};
|
|
||||||
static const long utfmin[UTF_SIZ + 1] = {0, 0, 0x80, 0x800, 0x10000};
|
|
||||||
static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF,
|
|
||||||
0x10FFFF};
|
|
||||||
|
|
||||||
static long utf8decodebyte(const char c, size_t *i) {
|
|
||||||
for (*i = 0; *i < (UTF_SIZ + 1); ++(*i))
|
|
||||||
if (((unsigned char)c & utfmask[*i]) == utfbyte[*i])
|
|
||||||
return (unsigned char)c & ~utfmask[*i];
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t utf8validate(long *u, size_t i) {
|
|
||||||
if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF))
|
|
||||||
*u = UTF_INVALID;
|
|
||||||
for (i = 1; *u > utfmax[i]; ++i)
|
|
||||||
;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t utf8decode(const char *c, long *u, size_t clen) {
|
|
||||||
size_t i, j, len, type;
|
|
||||||
long udecoded;
|
|
||||||
|
|
||||||
*u = UTF_INVALID;
|
|
||||||
if (!clen)
|
|
||||||
return 0;
|
|
||||||
udecoded = utf8decodebyte(c[0], &len);
|
|
||||||
if (!BETWEEN(len, 1, UTF_SIZ))
|
|
||||||
return 1;
|
|
||||||
for (i = 1, j = 1; i < clen && j < len; ++i, ++j) {
|
|
||||||
udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type);
|
|
||||||
if (type)
|
|
||||||
return j;
|
|
||||||
}
|
|
||||||
if (j < len)
|
|
||||||
return 0;
|
|
||||||
*u = udecoded;
|
|
||||||
utf8validate(u, len);
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
Drw *drw_create(Display *dpy, int screen, Window root, unsigned int w,
|
|
||||||
unsigned int h) {
|
|
||||||
Drw *drw = ecalloc(1, sizeof(Drw));
|
|
||||||
|
|
||||||
drw->dpy = dpy;
|
|
||||||
drw->screen = screen;
|
|
||||||
drw->root = root;
|
|
||||||
drw->w = w;
|
|
||||||
drw->h = h;
|
|
||||||
drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
|
|
||||||
drw->gc = XCreateGC(dpy, root, 0, NULL);
|
|
||||||
XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
|
|
||||||
|
|
||||||
return drw;
|
|
||||||
}
|
|
||||||
|
|
||||||
void drw_resize(Drw *drw, unsigned int w, unsigned int h) {
|
|
||||||
if (!drw)
|
|
||||||
return;
|
|
||||||
|
|
||||||
drw->w = w;
|
|
||||||
drw->h = h;
|
|
||||||
if (drw->drawable)
|
|
||||||
XFreePixmap(drw->dpy, drw->drawable);
|
|
||||||
drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h,
|
|
||||||
DefaultDepth(drw->dpy, drw->screen));
|
|
||||||
}
|
|
||||||
|
|
||||||
void drw_free(Drw *drw) {
|
|
||||||
XFreePixmap(drw->dpy, drw->drawable);
|
|
||||||
XFreeGC(drw->dpy, drw->gc);
|
|
||||||
drw_fontset_free(drw->fonts);
|
|
||||||
free(drw);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This function is an implementation detail. Library users should use
|
|
||||||
* drw_fontset_create instead.
|
|
||||||
*/
|
|
||||||
static Fnt *xfont_create(Drw *drw, const char *fontname,
|
|
||||||
FcPattern *fontpattern) {
|
|
||||||
Fnt *font;
|
|
||||||
XftFont *xfont = NULL;
|
|
||||||
FcPattern *pattern = NULL;
|
|
||||||
|
|
||||||
if (fontname) {
|
|
||||||
/* Using the pattern found at font->xfont->pattern does not yield the
|
|
||||||
* same substitution results as using the pattern returned by
|
|
||||||
* FcNameParse; using the latter results in the desired fallback
|
|
||||||
* behaviour whereas the former just results in missing-character
|
|
||||||
* rectangles being drawn, at least with some fonts. */
|
|
||||||
if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) {
|
|
||||||
fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (!(pattern = FcNameParse((FcChar8 *)fontname))) {
|
|
||||||
fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n",
|
|
||||||
fontname);
|
|
||||||
XftFontClose(drw->dpy, xfont);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
} else if (fontpattern) {
|
|
||||||
if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) {
|
|
||||||
fprintf(stderr, "error, cannot load font from pattern.\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
die("no font specified.");
|
|
||||||
}
|
|
||||||
|
|
||||||
font = ecalloc(1, sizeof(Fnt));
|
|
||||||
font->xfont = xfont;
|
|
||||||
font->pattern = pattern;
|
|
||||||
font->h = xfont->ascent + xfont->descent;
|
|
||||||
font->dpy = drw->dpy;
|
|
||||||
|
|
||||||
return font;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void xfont_free(Fnt *font) {
|
|
||||||
if (!font)
|
|
||||||
return;
|
|
||||||
if (font->pattern)
|
|
||||||
FcPatternDestroy(font->pattern);
|
|
||||||
XftFontClose(font->dpy, font->xfont);
|
|
||||||
free(font);
|
|
||||||
}
|
|
||||||
|
|
||||||
Fnt *drw_fontset_create(Drw *drw, const char *fonts[], size_t fontcount) {
|
|
||||||
Fnt *cur, *ret = NULL;
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
if (!drw || !fonts)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
for (i = 1; i <= fontcount; i++) {
|
|
||||||
if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) {
|
|
||||||
cur->next = ret;
|
|
||||||
ret = cur;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (drw->fonts = ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
void drw_fontset_free(Fnt *font) {
|
|
||||||
if (font) {
|
|
||||||
drw_fontset_free(font->next);
|
|
||||||
xfont_free(font);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void drw_clr_create(Drw *drw, Clr *dest, const char *clrname) {
|
|
||||||
if (!drw || !dest || !clrname)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
|
|
||||||
DefaultColormap(drw->dpy, drw->screen), clrname, dest))
|
|
||||||
die("error, cannot allocate color '%s'", clrname);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wrapper to create color schemes. The caller has to call free(3) on the
|
|
||||||
* returned color scheme when done using it. */
|
|
||||||
Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) {
|
|
||||||
size_t i;
|
|
||||||
Clr *ret;
|
|
||||||
|
|
||||||
/* need at least two colors for a scheme */
|
|
||||||
if (!drw || !clrnames || clrcount < 2 ||
|
|
||||||
!(ret = ecalloc(clrcount, sizeof(XftColor))))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
for (i = 0; i < clrcount; i++)
|
|
||||||
drw_clr_create(drw, &ret[i], clrnames[i]);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void drw_setfontset(Drw *drw, Fnt *set) {
|
|
||||||
if (drw)
|
|
||||||
drw->fonts = set;
|
|
||||||
}
|
|
||||||
|
|
||||||
void drw_setscheme(Drw *drw, Clr *scm) {
|
|
||||||
if (drw)
|
|
||||||
drw->scheme = scm;
|
|
||||||
}
|
|
||||||
|
|
||||||
void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h,
|
|
||||||
int filled, int invert) {
|
|
||||||
if (!drw || !drw->scheme)
|
|
||||||
return;
|
|
||||||
XSetForeground(drw->dpy, drw->gc,
|
|
||||||
invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel);
|
|
||||||
if (filled)
|
|
||||||
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
|
|
||||||
else
|
|
||||||
XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h,
|
|
||||||
unsigned int lpad, const char *text, int invert) {
|
|
||||||
int i, ty, ellipsis_x = 0;
|
|
||||||
unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len;
|
|
||||||
XftDraw *d = NULL;
|
|
||||||
Fnt *usedfont, *curfont, *nextfont;
|
|
||||||
int utf8strlen, utf8charlen, render = x || y || w || h;
|
|
||||||
long utf8codepoint = 0;
|
|
||||||
const char *utf8str;
|
|
||||||
FcCharSet *fccharset;
|
|
||||||
FcPattern *fcpattern;
|
|
||||||
FcPattern *match;
|
|
||||||
XftResult result;
|
|
||||||
int charexists = 0, overflow = 0;
|
|
||||||
/* keep track of a couple codepoints for which we have no match. */
|
|
||||||
enum { nomatches_len = 64 };
|
|
||||||
static struct {
|
|
||||||
long codepoint[nomatches_len];
|
|
||||||
unsigned int idx;
|
|
||||||
} nomatches;
|
|
||||||
static unsigned int ellipsis_width = 0;
|
|
||||||
|
|
||||||
if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (!render) {
|
|
||||||
w = invert ? invert : ~invert;
|
|
||||||
} else {
|
|
||||||
XSetForeground(drw->dpy, drw->gc,
|
|
||||||
drw->scheme[invert ? ColFg : ColBg].pixel);
|
|
||||||
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
|
|
||||||
d = XftDrawCreate(drw->dpy, drw->drawable,
|
|
||||||
DefaultVisual(drw->dpy, drw->screen),
|
|
||||||
DefaultColormap(drw->dpy, drw->screen));
|
|
||||||
x += lpad;
|
|
||||||
w -= lpad;
|
|
||||||
}
|
|
||||||
|
|
||||||
usedfont = drw->fonts;
|
|
||||||
if (!ellipsis_width && render)
|
|
||||||
ellipsis_width = drw_fontset_getwidth(drw, "...");
|
|
||||||
while (1) {
|
|
||||||
ew = ellipsis_len = utf8strlen = 0;
|
|
||||||
utf8str = text;
|
|
||||||
nextfont = NULL;
|
|
||||||
while (*text) {
|
|
||||||
utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ);
|
|
||||||
for (curfont = drw->fonts; curfont; curfont = curfont->next) {
|
|
||||||
charexists = charexists ||
|
|
||||||
XftCharExists(drw->dpy, curfont->xfont, utf8codepoint);
|
|
||||||
if (charexists) {
|
|
||||||
drw_font_getexts(curfont, text, utf8charlen, &tmpw, NULL);
|
|
||||||
if (ew + ellipsis_width <= w) {
|
|
||||||
/* keep track where the ellipsis still fits */
|
|
||||||
ellipsis_x = x + ew;
|
|
||||||
ellipsis_w = w - ew;
|
|
||||||
ellipsis_len = utf8strlen;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ew + tmpw > w) {
|
|
||||||
overflow = 1;
|
|
||||||
/* called from drw_fontset_getwidth_clamp():
|
|
||||||
* it wants the width AFTER the overflow
|
|
||||||
*/
|
|
||||||
if (!render)
|
|
||||||
x += tmpw;
|
|
||||||
else
|
|
||||||
utf8strlen = ellipsis_len;
|
|
||||||
} else if (curfont == usedfont) {
|
|
||||||
utf8strlen += utf8charlen;
|
|
||||||
text += utf8charlen;
|
|
||||||
ew += tmpw;
|
|
||||||
} else {
|
|
||||||
nextfont = curfont;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (overflow || !charexists || nextfont)
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
charexists = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (utf8strlen) {
|
|
||||||
if (render) {
|
|
||||||
ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent;
|
|
||||||
XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg],
|
|
||||||
usedfont->xfont, x, ty, (XftChar8 *)utf8str,
|
|
||||||
utf8strlen);
|
|
||||||
}
|
|
||||||
x += ew;
|
|
||||||
w -= ew;
|
|
||||||
}
|
|
||||||
if (render && overflow)
|
|
||||||
drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", invert);
|
|
||||||
|
|
||||||
if (!*text || overflow) {
|
|
||||||
break;
|
|
||||||
} else if (nextfont) {
|
|
||||||
charexists = 0;
|
|
||||||
usedfont = nextfont;
|
|
||||||
} else {
|
|
||||||
/* Regardless of whether or not a fallback font is found, the
|
|
||||||
* character must be drawn. */
|
|
||||||
charexists = 1;
|
|
||||||
|
|
||||||
for (i = 0; i < nomatches_len; ++i) {
|
|
||||||
/* avoid calling XftFontMatch if we know we won't find a match */
|
|
||||||
if (utf8codepoint == nomatches.codepoint[i])
|
|
||||||
goto no_match;
|
|
||||||
}
|
|
||||||
|
|
||||||
fccharset = FcCharSetCreate();
|
|
||||||
FcCharSetAddChar(fccharset, utf8codepoint);
|
|
||||||
|
|
||||||
if (!drw->fonts->pattern) {
|
|
||||||
/* Refer to the comment in xfont_create for more information. */
|
|
||||||
die("the first font in the cache must be loaded from a font string.");
|
|
||||||
}
|
|
||||||
|
|
||||||
fcpattern = FcPatternDuplicate(drw->fonts->pattern);
|
|
||||||
FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset);
|
|
||||||
FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue);
|
|
||||||
|
|
||||||
FcConfigSubstitute(NULL, fcpattern, FcMatchPattern);
|
|
||||||
FcDefaultSubstitute(fcpattern);
|
|
||||||
match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result);
|
|
||||||
|
|
||||||
FcCharSetDestroy(fccharset);
|
|
||||||
FcPatternDestroy(fcpattern);
|
|
||||||
|
|
||||||
if (match) {
|
|
||||||
usedfont = xfont_create(drw, NULL, match);
|
|
||||||
if (usedfont &&
|
|
||||||
XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) {
|
|
||||||
for (curfont = drw->fonts; curfont->next; curfont = curfont->next)
|
|
||||||
; /* NOP */
|
|
||||||
curfont->next = usedfont;
|
|
||||||
} else {
|
|
||||||
xfont_free(usedfont);
|
|
||||||
nomatches.codepoint[++nomatches.idx % nomatches_len] = utf8codepoint;
|
|
||||||
no_match:
|
|
||||||
usedfont = drw->fonts;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (d)
|
|
||||||
XftDrawDestroy(d);
|
|
||||||
|
|
||||||
return x + (render ? w : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void drw_map(Drw *drw, Window win, int x, int y, unsigned int w,
|
|
||||||
unsigned int h) {
|
|
||||||
if (!drw)
|
|
||||||
return;
|
|
||||||
|
|
||||||
XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y);
|
|
||||||
XSync(drw->dpy, False);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int drw_fontset_getwidth(Drw *drw, const char *text) {
|
|
||||||
if (!drw || !drw->fonts || !text)
|
|
||||||
return 0;
|
|
||||||
return drw_text(drw, 0, 0, 0, 0, 0, text, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text,
|
|
||||||
unsigned int n) {
|
|
||||||
unsigned int tmp = 0;
|
|
||||||
if (drw && drw->fonts && text && n)
|
|
||||||
tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n);
|
|
||||||
return MIN(n, tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void drw_font_getexts(Fnt *font, const char *text, unsigned int len,
|
|
||||||
unsigned int *w, unsigned int *h) {
|
|
||||||
XGlyphInfo ext;
|
|
||||||
|
|
||||||
if (!font || !text)
|
|
||||||
return;
|
|
||||||
|
|
||||||
XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext);
|
|
||||||
if (w)
|
|
||||||
*w = ext.xOff;
|
|
||||||
if (h)
|
|
||||||
*h = font->h;
|
|
||||||
}
|
|
||||||
|
|
||||||
Cur *drw_cur_create(Drw *drw, int shape) {
|
|
||||||
Cur *cur;
|
|
||||||
|
|
||||||
if (!drw || !(cur = ecalloc(1, sizeof(Cur))))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
cur->cursor = XCreateFontCursor(drw->dpy, shape);
|
|
||||||
|
|
||||||
return cur;
|
|
||||||
}
|
|
||||||
|
|
||||||
void drw_cur_free(Drw *drw, Cur *cursor) {
|
|
||||||
if (!cursor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
XFreeCursor(drw->dpy, cursor->cursor);
|
|
||||||
free(cursor);
|
|
||||||
}
|
|
@ -1,64 +0,0 @@
|
|||||||
/* See LICENSE file for copyright and license details. */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
Cursor cursor;
|
|
||||||
} Cur;
|
|
||||||
|
|
||||||
typedef struct Fnt {
|
|
||||||
Display *dpy;
|
|
||||||
unsigned int h;
|
|
||||||
XftFont *xfont;
|
|
||||||
FcPattern *pattern;
|
|
||||||
struct Fnt *next;
|
|
||||||
} Fnt;
|
|
||||||
|
|
||||||
enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */
|
|
||||||
typedef XftColor Clr;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned int w, h;
|
|
||||||
Display *dpy;
|
|
||||||
int screen;
|
|
||||||
Window root;
|
|
||||||
Drawable drawable;
|
|
||||||
GC gc;
|
|
||||||
Clr *scheme;
|
|
||||||
Fnt *fonts;
|
|
||||||
} Drw;
|
|
||||||
|
|
||||||
/* Drawable abstraction */
|
|
||||||
Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w,
|
|
||||||
unsigned int h);
|
|
||||||
void drw_resize(Drw *drw, unsigned int w, unsigned int h);
|
|
||||||
void drw_free(Drw *drw);
|
|
||||||
|
|
||||||
/* Fnt abstraction */
|
|
||||||
Fnt *drw_fontset_create(Drw *drw, const char *fonts[], size_t fontcount);
|
|
||||||
void drw_fontset_free(Fnt *set);
|
|
||||||
unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
|
|
||||||
unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text,
|
|
||||||
unsigned int n);
|
|
||||||
void drw_font_getexts(Fnt *font, const char *text, unsigned int len,
|
|
||||||
unsigned int *w, unsigned int *h);
|
|
||||||
|
|
||||||
/* Colorscheme abstraction */
|
|
||||||
void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
|
|
||||||
Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
|
|
||||||
|
|
||||||
/* Cursor abstraction */
|
|
||||||
Cur *drw_cur_create(Drw *drw, int shape);
|
|
||||||
void drw_cur_free(Drw *drw, Cur *cursor);
|
|
||||||
|
|
||||||
/* Drawing context manipulation */
|
|
||||||
void drw_setfontset(Drw *drw, Fnt *set);
|
|
||||||
void drw_setscheme(Drw *drw, Clr *scm);
|
|
||||||
|
|
||||||
/* Drawing functions */
|
|
||||||
void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h,
|
|
||||||
int filled, int invert);
|
|
||||||
int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h,
|
|
||||||
unsigned int lpad, const char *text, int invert);
|
|
||||||
|
|
||||||
/* Map functions */
|
|
||||||
void drw_map(Drw *drw, Window win, int x, int y, unsigned int w,
|
|
||||||
unsigned int h);
|
|
@ -1,176 +0,0 @@
|
|||||||
.TH DWM 1 dwm\-VERSION
|
|
||||||
.SH NAME
|
|
||||||
dwm \- dynamic window manager
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B dwm
|
|
||||||
.RB [ \-v ]
|
|
||||||
.SH DESCRIPTION
|
|
||||||
dwm is a dynamic window manager for X. It manages windows in tiled, monocle
|
|
||||||
and floating layouts. Either layout can be applied dynamically, optimising the
|
|
||||||
environment for the application in use and the task performed.
|
|
||||||
.P
|
|
||||||
In tiled layouts windows are managed in a master and stacking area. The master
|
|
||||||
area on the left contains one window by default, and the stacking area on the
|
|
||||||
right contains all other windows. The number of master area windows can be
|
|
||||||
adjusted from zero to an arbitrary number. In monocle layout all windows are
|
|
||||||
maximised to the screen size. In floating layout windows can be resized and
|
|
||||||
moved freely. Dialog windows are always managed floating, regardless of the
|
|
||||||
layout applied.
|
|
||||||
.P
|
|
||||||
Windows are grouped by tags. Each window can be tagged with one or multiple
|
|
||||||
tags. Selecting certain tags displays all windows with these tags.
|
|
||||||
.P
|
|
||||||
Each screen contains a small status bar which displays all available tags, the
|
|
||||||
layout, the title of the focused window, and the text read from the root window
|
|
||||||
name property, if the screen is focused. A floating window is indicated with an
|
|
||||||
empty square and a maximised floating window is indicated with a filled square
|
|
||||||
before the windows title. The selected tags are indicated with a different
|
|
||||||
color. The tags of the focused window are indicated with a filled square in the
|
|
||||||
top left corner. The tags which are applied to one or more windows are
|
|
||||||
indicated with an empty square in the top left corner.
|
|
||||||
.P
|
|
||||||
dwm draws a small border around windows to indicate the focus state.
|
|
||||||
.SH OPTIONS
|
|
||||||
.TP
|
|
||||||
.B \-v
|
|
||||||
prints version information to stderr, then exits.
|
|
||||||
.SH USAGE
|
|
||||||
.SS Status bar
|
|
||||||
.TP
|
|
||||||
.B X root window name
|
|
||||||
is read and displayed in the status text area. It can be set with the
|
|
||||||
.BR xsetroot (1)
|
|
||||||
command.
|
|
||||||
.TP
|
|
||||||
.B Button1
|
|
||||||
click on a tag label to display all windows with that tag, click on the layout
|
|
||||||
label toggles between tiled and floating layout.
|
|
||||||
.TP
|
|
||||||
.B Button3
|
|
||||||
click on a tag label adds/removes all windows with that tag to/from the view.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Button1
|
|
||||||
click on a tag label applies that tag to the focused window.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Button3
|
|
||||||
click on a tag label adds/removes that tag to/from the focused window.
|
|
||||||
.SS Keyboard commands
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Shift\-Return
|
|
||||||
Start
|
|
||||||
.BR st(1).
|
|
||||||
.TP
|
|
||||||
.B Mod1\-p
|
|
||||||
Spawn
|
|
||||||
.BR dmenu(1)
|
|
||||||
for launching other programs.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-,
|
|
||||||
Focus previous screen, if any.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-.
|
|
||||||
Focus next screen, if any.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Shift\-,
|
|
||||||
Send focused window to previous screen, if any.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Shift\-.
|
|
||||||
Send focused window to next screen, if any.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-b
|
|
||||||
Toggles bar on and off.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-t
|
|
||||||
Sets tiled layout.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-f
|
|
||||||
Sets floating layout.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-m
|
|
||||||
Sets monocle layout.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-space
|
|
||||||
Toggles between current and previous layout.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-j
|
|
||||||
Focus next window.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-k
|
|
||||||
Focus previous window.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-i
|
|
||||||
Increase number of windows in master area.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-d
|
|
||||||
Decrease number of windows in master area.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-l
|
|
||||||
Increase master area size.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-h
|
|
||||||
Decrease master area size.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Return
|
|
||||||
Zooms/cycles focused window to/from master area (tiled layouts only).
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Shift\-c
|
|
||||||
Close focused window.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Shift\-space
|
|
||||||
Toggle focused window between tiled and floating state.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Tab
|
|
||||||
Toggles to the previously selected tags.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Shift\-[1..n]
|
|
||||||
Apply nth tag to focused window.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Shift\-0
|
|
||||||
Apply all tags to focused window.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Control\-Shift\-[1..n]
|
|
||||||
Add/remove nth tag to/from focused window.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-[1..n]
|
|
||||||
View all windows with nth tag.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-0
|
|
||||||
View all windows with any tag.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Control\-[1..n]
|
|
||||||
Add/remove all windows with nth tag to/from the view.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Shift\-q
|
|
||||||
Quit dwm.
|
|
||||||
.SS Mouse commands
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Button1
|
|
||||||
Move focused window while dragging. Tiled windows will be toggled to the floating state.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Button2
|
|
||||||
Toggles focused window between floating and tiled state.
|
|
||||||
.TP
|
|
||||||
.B Mod1\-Button3
|
|
||||||
Resize focused window while dragging. Tiled windows will be toggled to the floating state.
|
|
||||||
.SH CUSTOMIZATION
|
|
||||||
dwm is customized by creating a custom config.h and (re)compiling the source
|
|
||||||
code. This keeps it fast, secure and simple.
|
|
||||||
.SH SEE ALSO
|
|
||||||
.BR dmenu (1),
|
|
||||||
.BR st (1)
|
|
||||||
.SH ISSUES
|
|
||||||
Java applications which use the XToolkit/XAWT backend may draw grey windows
|
|
||||||
only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early
|
|
||||||
JDK 1.6 versions, because it assumes a reparenting window manager. Possible workarounds
|
|
||||||
are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the
|
|
||||||
environment variable
|
|
||||||
.BR AWT_TOOLKIT=MToolkit
|
|
||||||
(to use the older Motif backend instead) or running
|
|
||||||
.B xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D
|
|
||||||
or
|
|
||||||
.B wmname LG3D
|
|
||||||
(to pretend that a non-reparenting window manager is running that the
|
|
||||||
XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable
|
|
||||||
.BR _JAVA_AWT_WM_NONREPARENTING=1 .
|
|
||||||
.SH BUGS
|
|
||||||
Send all bug reports with a patch to hackers@suckless.org.
|
|
File diff suppressed because it is too large
Load Diff
@ -1,42 +0,0 @@
|
|||||||
/* cc transient.c -o transient -lX11 */
|
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
|
||||||
#include <X11/Xutil.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
Display *d;
|
|
||||||
Window r, f, t = None;
|
|
||||||
XSizeHints h;
|
|
||||||
XEvent e;
|
|
||||||
|
|
||||||
d = XOpenDisplay(NULL);
|
|
||||||
if (!d)
|
|
||||||
exit(1);
|
|
||||||
r = DefaultRootWindow(d);
|
|
||||||
|
|
||||||
f = XCreateSimpleWindow(d, r, 100, 100, 400, 400, 0, 0, 0);
|
|
||||||
h.min_width = h.max_width = h.min_height = h.max_height = 400;
|
|
||||||
h.flags = PMinSize | PMaxSize;
|
|
||||||
XSetWMNormalHints(d, f, &h);
|
|
||||||
XStoreName(d, f, "floating");
|
|
||||||
XMapWindow(d, f);
|
|
||||||
|
|
||||||
XSelectInput(d, f, ExposureMask);
|
|
||||||
while (1) {
|
|
||||||
XNextEvent(d, &e);
|
|
||||||
|
|
||||||
if (t == None) {
|
|
||||||
sleep(5);
|
|
||||||
t = XCreateSimpleWindow(d, r, 50, 50, 100, 100, 0, 0, 0);
|
|
||||||
XSetTransientForHint(d, t, f);
|
|
||||||
XStoreName(d, t, "transient");
|
|
||||||
XMapWindow(d, t);
|
|
||||||
XSelectInput(d, t, ExposureMask);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
XCloseDisplay(d);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
/* See LICENSE file for copyright and license details. */
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "util.h"
|
|
||||||
|
|
||||||
void die(const char *fmt, ...) {
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
va_start(ap, fmt);
|
|
||||||
vfprintf(stderr, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
if (fmt[0] && fmt[strlen(fmt) - 1] == ':') {
|
|
||||||
fputc(' ', stderr);
|
|
||||||
perror(NULL);
|
|
||||||
} else {
|
|
||||||
fputc('\n', stderr);
|
|
||||||
}
|
|
||||||
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *ecalloc(size_t nmemb, size_t size) {
|
|
||||||
void *p;
|
|
||||||
|
|
||||||
if (!(p = calloc(nmemb, size)))
|
|
||||||
die("calloc:");
|
|
||||||
return p;
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
/* See LICENSE file for copyright and license details. */
|
|
||||||
|
|
||||||
#define MAX(A, B) ((A) > (B) ? (A) : (B))
|
|
||||||
#define MIN(A, B) ((A) < (B) ? (A) : (B))
|
|
||||||
#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B))
|
|
||||||
|
|
||||||
void die(const char *fmt, ...);
|
|
||||||
void *ecalloc(size_t nmemb, size_t size);
|
|
@ -1,778 +0,0 @@
|
|||||||
/* Key binding functions */
|
|
||||||
static void defaultgaps(const Arg *arg);
|
|
||||||
static void incrgaps(const Arg *arg);
|
|
||||||
static void incrigaps(const Arg *arg);
|
|
||||||
static void incrogaps(const Arg *arg);
|
|
||||||
static void incrohgaps(const Arg *arg);
|
|
||||||
static void incrovgaps(const Arg *arg);
|
|
||||||
static void incrihgaps(const Arg *arg);
|
|
||||||
static void incrivgaps(const Arg *arg);
|
|
||||||
static void togglegaps(const Arg *arg);
|
|
||||||
/* Layouts (delete the ones you do not need) */
|
|
||||||
static void bstack(Monitor *m);
|
|
||||||
static void bstackhoriz(Monitor *m);
|
|
||||||
static void centeredmaster(Monitor *m);
|
|
||||||
static void centeredfloatingmaster(Monitor *m);
|
|
||||||
static void deck(Monitor *m);
|
|
||||||
static void dwindle(Monitor *m);
|
|
||||||
static void fibonacci(Monitor *m, int s);
|
|
||||||
static void grid(Monitor *m);
|
|
||||||
static void nrowgrid(Monitor *m);
|
|
||||||
static void spiral(Monitor *m);
|
|
||||||
static void tile(Monitor *m);
|
|
||||||
/* Internals */
|
|
||||||
static void getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv,
|
|
||||||
unsigned int *nc);
|
|
||||||
static void getfacts(Monitor *m, int msize, int ssize, float *mf, float *sf,
|
|
||||||
int *mr, int *sr);
|
|
||||||
static void setgaps(int oh, int ov, int ih, int iv);
|
|
||||||
|
|
||||||
/* Settings */
|
|
||||||
#if !PERTAG_PATCH
|
|
||||||
static int enablegaps = 1;
|
|
||||||
#endif // PERTAG_PATCH
|
|
||||||
|
|
||||||
void setgaps(int oh, int ov, int ih, int iv) {
|
|
||||||
if (oh < 0)
|
|
||||||
oh = 0;
|
|
||||||
if (ov < 0)
|
|
||||||
ov = 0;
|
|
||||||
if (ih < 0)
|
|
||||||
ih = 0;
|
|
||||||
if (iv < 0)
|
|
||||||
iv = 0;
|
|
||||||
|
|
||||||
selmon->gappoh = oh;
|
|
||||||
selmon->gappov = ov;
|
|
||||||
selmon->gappih = ih;
|
|
||||||
selmon->gappiv = iv;
|
|
||||||
arrange(selmon);
|
|
||||||
}
|
|
||||||
|
|
||||||
void togglegaps(const Arg *arg) {
|
|
||||||
#if PERTAG_PATCH
|
|
||||||
selmon->pertag->enablegaps[selmon->pertag->curtag] =
|
|
||||||
!selmon->pertag->enablegaps[selmon->pertag->curtag];
|
|
||||||
#else
|
|
||||||
enablegaps = !enablegaps;
|
|
||||||
#endif // PERTAG_PATCH
|
|
||||||
arrange(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void defaultgaps(const Arg *arg) { setgaps(gappoh, gappov, gappih, gappiv); }
|
|
||||||
|
|
||||||
void incrgaps(const Arg *arg) {
|
|
||||||
setgaps(selmon->gappoh + arg->i, selmon->gappov + arg->i,
|
|
||||||
selmon->gappih + arg->i, selmon->gappiv + arg->i);
|
|
||||||
}
|
|
||||||
|
|
||||||
void incrigaps(const Arg *arg) {
|
|
||||||
setgaps(selmon->gappoh, selmon->gappov, selmon->gappih + arg->i,
|
|
||||||
selmon->gappiv + arg->i);
|
|
||||||
}
|
|
||||||
|
|
||||||
void incrogaps(const Arg *arg) {
|
|
||||||
setgaps(selmon->gappoh + arg->i, selmon->gappov + arg->i, selmon->gappih,
|
|
||||||
selmon->gappiv);
|
|
||||||
}
|
|
||||||
|
|
||||||
void incrohgaps(const Arg *arg) {
|
|
||||||
setgaps(selmon->gappoh + arg->i, selmon->gappov, selmon->gappih,
|
|
||||||
selmon->gappiv);
|
|
||||||
}
|
|
||||||
|
|
||||||
void incrovgaps(const Arg *arg) {
|
|
||||||
setgaps(selmon->gappoh, selmon->gappov + arg->i, selmon->gappih,
|
|
||||||
selmon->gappiv);
|
|
||||||
}
|
|
||||||
|
|
||||||
void incrihgaps(const Arg *arg) {
|
|
||||||
setgaps(selmon->gappoh, selmon->gappov, selmon->gappih + arg->i,
|
|
||||||
selmon->gappiv);
|
|
||||||
}
|
|
||||||
|
|
||||||
void incrivgaps(const Arg *arg) {
|
|
||||||
setgaps(selmon->gappoh, selmon->gappov, selmon->gappih,
|
|
||||||
selmon->gappiv + arg->i);
|
|
||||||
}
|
|
||||||
|
|
||||||
void getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv, unsigned int *nc) {
|
|
||||||
unsigned int n, oe, ie;
|
|
||||||
#if PERTAG_PATCH
|
|
||||||
oe = ie = selmon->pertag->enablegaps[selmon->pertag->curtag];
|
|
||||||
#else
|
|
||||||
oe = ie = enablegaps;
|
|
||||||
#endif // PERTAG_PATCH
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
|
|
||||||
;
|
|
||||||
if (smartgaps && n == 1) {
|
|
||||||
oe = 0; // outer gaps disabled when only one client
|
|
||||||
}
|
|
||||||
|
|
||||||
*oh = m->gappoh * oe; // outer horizontal gap
|
|
||||||
*ov = m->gappov * oe; // outer vertical gap
|
|
||||||
*ih = m->gappih * ie; // inner horizontal gap
|
|
||||||
*iv = m->gappiv * ie; // inner vertical gap
|
|
||||||
*nc = n; // number of clients
|
|
||||||
}
|
|
||||||
|
|
||||||
void getfacts(Monitor *m, int msize, int ssize, float *mf, float *sf, int *mr,
|
|
||||||
int *sr) {
|
|
||||||
unsigned int n;
|
|
||||||
float mfacts = 0, sfacts = 0;
|
|
||||||
int mtotal = 0, stotal = 0;
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
|
|
||||||
if (n < m->nmaster)
|
|
||||||
mfacts += c->cfact;
|
|
||||||
else
|
|
||||||
sfacts += c->cfact;
|
|
||||||
|
|
||||||
for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
|
|
||||||
if (n < m->nmaster)
|
|
||||||
mtotal += msize * (c->cfact / mfacts);
|
|
||||||
else
|
|
||||||
stotal += ssize * (c->cfact / sfacts);
|
|
||||||
|
|
||||||
*mf = mfacts; // total factor of master area
|
|
||||||
*sf = sfacts; // total factor of stack area
|
|
||||||
*mr = msize -
|
|
||||||
mtotal; // the remainder (rest) of pixels after a cfacts master split
|
|
||||||
*sr = ssize -
|
|
||||||
stotal; // the remainder (rest) of pixels after a cfacts stack split
|
|
||||||
}
|
|
||||||
|
|
||||||
/***
|
|
||||||
* Layouts
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Bottomstack layout + gaps
|
|
||||||
* https://dwm.suckless.org/patches/bottomstack/
|
|
||||||
*/
|
|
||||||
static void bstack(Monitor *m) {
|
|
||||||
unsigned int i, n;
|
|
||||||
int oh, ov, ih, iv;
|
|
||||||
int mx = 0, my = 0, mh = 0, mw = 0;
|
|
||||||
int sx = 0, sy = 0, sh = 0, sw = 0;
|
|
||||||
float mfacts, sfacts;
|
|
||||||
int mrest, srest;
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
|
||||||
if (n == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
sx = mx = m->wx + ov;
|
|
||||||
sy = my = m->wy + oh;
|
|
||||||
sh = mh = m->wh - 2 * oh;
|
|
||||||
mw = m->ww - 2 * ov - iv * (MIN(n, m->nmaster) - 1);
|
|
||||||
sw = m->ww - 2 * ov - iv * (n - m->nmaster - 1);
|
|
||||||
|
|
||||||
if (m->nmaster && n > m->nmaster) {
|
|
||||||
sh = (mh - ih) * (1 - m->mfact);
|
|
||||||
mh = mh - ih - sh;
|
|
||||||
sx = mx;
|
|
||||||
sy = my + mh + ih;
|
|
||||||
}
|
|
||||||
|
|
||||||
getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest);
|
|
||||||
|
|
||||||
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
|
|
||||||
if (i < m->nmaster) {
|
|
||||||
resize(c, mx, my,
|
|
||||||
mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2 * c->bw),
|
|
||||||
mh - (2 * c->bw), 0);
|
|
||||||
mx += WIDTH(c) + iv;
|
|
||||||
} else {
|
|
||||||
resize(c, sx, sy,
|
|
||||||
sw * (c->cfact / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) -
|
|
||||||
(2 * c->bw),
|
|
||||||
sh - (2 * c->bw), 0);
|
|
||||||
sx += WIDTH(c) + iv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void bstackhoriz(Monitor *m) {
|
|
||||||
unsigned int i, n;
|
|
||||||
int oh, ov, ih, iv;
|
|
||||||
int mx = 0, my = 0, mh = 0, mw = 0;
|
|
||||||
int sx = 0, sy = 0, sh = 0, sw = 0;
|
|
||||||
float mfacts, sfacts;
|
|
||||||
int mrest, srest;
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
|
||||||
if (n == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
sx = mx = m->wx + ov;
|
|
||||||
sy = my = m->wy + oh;
|
|
||||||
mh = m->wh - 2 * oh;
|
|
||||||
sh = m->wh - 2 * oh - ih * (n - m->nmaster - 1);
|
|
||||||
mw = m->ww - 2 * ov - iv * (MIN(n, m->nmaster) - 1);
|
|
||||||
sw = m->ww - 2 * ov;
|
|
||||||
|
|
||||||
if (m->nmaster && n > m->nmaster) {
|
|
||||||
sh = (mh - ih) * (1 - m->mfact);
|
|
||||||
mh = mh - ih - sh;
|
|
||||||
sy = my + mh + ih;
|
|
||||||
sh = m->wh - mh - 2 * oh - ih * (n - m->nmaster);
|
|
||||||
}
|
|
||||||
|
|
||||||
getfacts(m, mw, sh, &mfacts, &sfacts, &mrest, &srest);
|
|
||||||
|
|
||||||
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
|
|
||||||
if (i < m->nmaster) {
|
|
||||||
resize(c, mx, my,
|
|
||||||
mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2 * c->bw),
|
|
||||||
mh - (2 * c->bw), 0);
|
|
||||||
mx += WIDTH(c) + iv;
|
|
||||||
} else {
|
|
||||||
resize(c, sx, sy, sw - (2 * c->bw),
|
|
||||||
sh * (c->cfact / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) -
|
|
||||||
(2 * c->bw),
|
|
||||||
0);
|
|
||||||
sy += HEIGHT(c) + ih;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Centred master layout + gaps
|
|
||||||
* https://dwm.suckless.org/patches/centeredmaster/
|
|
||||||
*/
|
|
||||||
void centeredmaster(Monitor *m) {
|
|
||||||
unsigned int i, n;
|
|
||||||
int oh, ov, ih, iv;
|
|
||||||
int mx = 0, my = 0, mh = 0, mw = 0;
|
|
||||||
int lx = 0, ly = 0, lw = 0, lh = 0;
|
|
||||||
int rx = 0, ry = 0, rw = 0, rh = 0;
|
|
||||||
float mfacts = 0, lfacts = 0, rfacts = 0;
|
|
||||||
int mtotal = 0, ltotal = 0, rtotal = 0;
|
|
||||||
int mrest = 0, lrest = 0, rrest = 0;
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
|
||||||
if (n == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* initialize areas */
|
|
||||||
mx = m->wx + ov;
|
|
||||||
my = m->wy + oh;
|
|
||||||
mh = m->wh - 2 * oh - ih * ((!m->nmaster ? n : MIN(n, m->nmaster)) - 1);
|
|
||||||
mw = m->ww - 2 * ov;
|
|
||||||
lh = m->wh - 2 * oh - ih * (((n - m->nmaster) / 2) - 1);
|
|
||||||
rh = m->wh - 2 * oh -
|
|
||||||
ih * (((n - m->nmaster) / 2) - ((n - m->nmaster) % 2 ? 0 : 1));
|
|
||||||
|
|
||||||
if (m->nmaster && n > m->nmaster) {
|
|
||||||
/* go mfact box in the center if more than nmaster clients */
|
|
||||||
if (n - m->nmaster > 1) {
|
|
||||||
/* ||<-S->|<---M--->|<-S->|| */
|
|
||||||
mw = (m->ww - 2 * ov - 2 * iv) * m->mfact;
|
|
||||||
lw = (m->ww - mw - 2 * ov - 2 * iv) / 2;
|
|
||||||
rw = (m->ww - mw - 2 * ov - 2 * iv) - lw;
|
|
||||||
mx += lw + iv;
|
|
||||||
} else {
|
|
||||||
/* ||<---M--->|<-S->|| */
|
|
||||||
mw = (mw - iv) * m->mfact;
|
|
||||||
lw = 0;
|
|
||||||
rw = m->ww - mw - iv - 2 * ov;
|
|
||||||
}
|
|
||||||
lx = m->wx + ov;
|
|
||||||
ly = m->wy + oh;
|
|
||||||
rx = mx + mw + iv;
|
|
||||||
ry = m->wy + oh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* calculate facts */
|
|
||||||
for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) {
|
|
||||||
if (!m->nmaster || n < m->nmaster)
|
|
||||||
mfacts += c->cfact;
|
|
||||||
else if ((n - m->nmaster) % 2)
|
|
||||||
lfacts += c->cfact; // total factor of left hand stack area
|
|
||||||
else
|
|
||||||
rfacts += c->cfact; // total factor of right hand stack area
|
|
||||||
}
|
|
||||||
|
|
||||||
for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
|
|
||||||
if (!m->nmaster || n < m->nmaster)
|
|
||||||
mtotal += mh * (c->cfact / mfacts);
|
|
||||||
else if ((n - m->nmaster) % 2)
|
|
||||||
ltotal += lh * (c->cfact / lfacts);
|
|
||||||
else
|
|
||||||
rtotal += rh * (c->cfact / rfacts);
|
|
||||||
|
|
||||||
mrest = mh - mtotal;
|
|
||||||
lrest = lh - ltotal;
|
|
||||||
rrest = rh - rtotal;
|
|
||||||
|
|
||||||
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
|
|
||||||
if (!m->nmaster || i < m->nmaster) {
|
|
||||||
/* nmaster clients are stacked vertically, in the center of the screen */
|
|
||||||
resize(c, mx, my, mw - (2 * c->bw),
|
|
||||||
mh * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2 * c->bw), 0);
|
|
||||||
my += HEIGHT(c) + ih;
|
|
||||||
} else {
|
|
||||||
/* stack clients are stacked vertically */
|
|
||||||
if ((i - m->nmaster) % 2) {
|
|
||||||
resize(c, lx, ly, lw - (2 * c->bw),
|
|
||||||
lh * (c->cfact / lfacts) +
|
|
||||||
((i - 2 * m->nmaster) < 2 * lrest ? 1 : 0) - (2 * c->bw),
|
|
||||||
0);
|
|
||||||
ly += HEIGHT(c) + ih;
|
|
||||||
} else {
|
|
||||||
resize(c, rx, ry, rw - (2 * c->bw),
|
|
||||||
rh * (c->cfact / rfacts) +
|
|
||||||
((i - 2 * m->nmaster) < 2 * rrest ? 1 : 0) - (2 * c->bw),
|
|
||||||
0);
|
|
||||||
ry += HEIGHT(c) + ih;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void centeredfloatingmaster(Monitor *m) {
|
|
||||||
unsigned int i, n;
|
|
||||||
float mfacts, sfacts;
|
|
||||||
float mivf = 1.0; // master inner vertical gap factor
|
|
||||||
int oh, ov, ih, iv, mrest, srest;
|
|
||||||
int mx = 0, my = 0, mh = 0, mw = 0;
|
|
||||||
int sx = 0, sy = 0, sh = 0, sw = 0;
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
|
||||||
if (n == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
sx = mx = m->wx + ov;
|
|
||||||
sy = my = m->wy + oh;
|
|
||||||
sh = mh = m->wh - 2 * oh;
|
|
||||||
mw = m->ww - 2 * ov - iv * (n - 1);
|
|
||||||
sw = m->ww - 2 * ov - iv * (n - m->nmaster - 1);
|
|
||||||
|
|
||||||
if (m->nmaster && n > m->nmaster) {
|
|
||||||
mivf = 0.8;
|
|
||||||
/* go mfact box in the center if more than nmaster clients */
|
|
||||||
if (m->ww > m->wh) {
|
|
||||||
mw = m->ww * m->mfact - iv * mivf * (MIN(n, m->nmaster) - 1);
|
|
||||||
mh = m->wh * 0.9;
|
|
||||||
} else {
|
|
||||||
mw = m->ww * 0.9 - iv * mivf * (MIN(n, m->nmaster) - 1);
|
|
||||||
mh = m->wh * m->mfact;
|
|
||||||
}
|
|
||||||
mx = m->wx + (m->ww - mw) / 2;
|
|
||||||
my = m->wy + (m->wh - mh - 2 * oh) / 2;
|
|
||||||
|
|
||||||
sx = m->wx + ov;
|
|
||||||
sy = m->wy + oh;
|
|
||||||
sh = m->wh - 2 * oh;
|
|
||||||
}
|
|
||||||
|
|
||||||
getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest);
|
|
||||||
|
|
||||||
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
|
||||||
if (i < m->nmaster) {
|
|
||||||
/* nmaster clients are stacked horizontally, in the center of the screen
|
|
||||||
*/
|
|
||||||
resize(c, mx, my,
|
|
||||||
mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2 * c->bw),
|
|
||||||
mh - (2 * c->bw), 0);
|
|
||||||
mx += WIDTH(c) + iv * mivf;
|
|
||||||
} else {
|
|
||||||
/* stack clients are stacked horizontally */
|
|
||||||
resize(c, sx, sy,
|
|
||||||
sw * (c->cfact / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) -
|
|
||||||
(2 * c->bw),
|
|
||||||
sh - (2 * c->bw), 0);
|
|
||||||
sx += WIDTH(c) + iv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Deck layout + gaps
|
|
||||||
* https://dwm.suckless.org/patches/deck/
|
|
||||||
*/
|
|
||||||
void deck(Monitor *m) {
|
|
||||||
unsigned int i, n;
|
|
||||||
int oh, ov, ih, iv;
|
|
||||||
int mx = 0, my = 0, mh = 0, mw = 0;
|
|
||||||
int sx = 0, sy = 0, sh = 0, sw = 0;
|
|
||||||
float mfacts, sfacts;
|
|
||||||
int mrest, srest;
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
|
||||||
if (n == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
sx = mx = m->wx + ov;
|
|
||||||
sy = my = m->wy + oh;
|
|
||||||
sh = mh = m->wh - 2 * oh - ih * (MIN(n, m->nmaster) - 1);
|
|
||||||
sw = mw = m->ww - 2 * ov;
|
|
||||||
|
|
||||||
if (m->nmaster && n > m->nmaster) {
|
|
||||||
sw = (mw - iv) * (1 - m->mfact);
|
|
||||||
mw = mw - iv - sw;
|
|
||||||
sx = mx + mw + iv;
|
|
||||||
sh = m->wh - 2 * oh;
|
|
||||||
}
|
|
||||||
|
|
||||||
getfacts(m, mh, sh, &mfacts, &sfacts, &mrest, &srest);
|
|
||||||
|
|
||||||
if (n - m->nmaster > 0) /* override layout symbol */
|
|
||||||
snprintf(m->ltsymbol, sizeof m->ltsymbol, "D %d", n - m->nmaster);
|
|
||||||
|
|
||||||
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
|
||||||
if (i < m->nmaster) {
|
|
||||||
resize(c, mx, my, mw - (2 * c->bw),
|
|
||||||
mh * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2 * c->bw), 0);
|
|
||||||
my += HEIGHT(c) + ih;
|
|
||||||
} else {
|
|
||||||
resize(c, sx, sy, sw - (2 * c->bw), sh - (2 * c->bw), 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Fibonacci layout + gaps
|
|
||||||
* https://dwm.suckless.org/patches/fibonacci/
|
|
||||||
*/
|
|
||||||
void fibonacci(Monitor *m, int s) {
|
|
||||||
unsigned int i, n;
|
|
||||||
int nx, ny, nw, nh;
|
|
||||||
int oh, ov, ih, iv;
|
|
||||||
int nv, hrest = 0, wrest = 0, r = 1;
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
|
||||||
if (n == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
nx = m->wx + ov;
|
|
||||||
ny = m->wy + oh;
|
|
||||||
nw = m->ww - 2 * ov;
|
|
||||||
nh = m->wh - 2 * oh;
|
|
||||||
|
|
||||||
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next)) {
|
|
||||||
if (r) {
|
|
||||||
if ((i % 2 && (nh - ih) / 2 <= (bh + 2 * c->bw)) ||
|
|
||||||
(!(i % 2) && (nw - iv) / 2 <= (bh + 2 * c->bw))) {
|
|
||||||
r = 0;
|
|
||||||
}
|
|
||||||
if (r && i < n - 1) {
|
|
||||||
if (i % 2) {
|
|
||||||
nv = (nh - ih) / 2;
|
|
||||||
hrest = nh - 2 * nv - ih;
|
|
||||||
nh = nv;
|
|
||||||
} else {
|
|
||||||
nv = (nw - iv) / 2;
|
|
||||||
wrest = nw - 2 * nv - iv;
|
|
||||||
nw = nv;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((i % 4) == 2 && !s)
|
|
||||||
nx += nw + iv;
|
|
||||||
else if ((i % 4) == 3 && !s)
|
|
||||||
ny += nh + ih;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((i % 4) == 0) {
|
|
||||||
if (s) {
|
|
||||||
ny += nh + ih;
|
|
||||||
nh += hrest;
|
|
||||||
} else {
|
|
||||||
nh -= hrest;
|
|
||||||
ny -= nh + ih;
|
|
||||||
}
|
|
||||||
} else if ((i % 4) == 1) {
|
|
||||||
nx += nw + iv;
|
|
||||||
nw += wrest;
|
|
||||||
} else if ((i % 4) == 2) {
|
|
||||||
ny += nh + ih;
|
|
||||||
nh += hrest;
|
|
||||||
if (i < n - 1)
|
|
||||||
nw += wrest;
|
|
||||||
} else if ((i % 4) == 3) {
|
|
||||||
if (s) {
|
|
||||||
nx += nw + iv;
|
|
||||||
nw -= wrest;
|
|
||||||
} else {
|
|
||||||
nw -= wrest;
|
|
||||||
nx -= nw + iv;
|
|
||||||
nh += hrest;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i == 0) {
|
|
||||||
if (n != 1) {
|
|
||||||
nw = (m->ww - iv - 2 * ov) - (m->ww - iv - 2 * ov) * (1 - m->mfact);
|
|
||||||
wrest = 0;
|
|
||||||
}
|
|
||||||
ny = m->wy + oh;
|
|
||||||
} else if (i == 1)
|
|
||||||
nw = m->ww - nw - iv - 2 * ov;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
resize(c, nx, ny, nw - (2 * c->bw), nh - (2 * c->bw), False);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void dwindle(Monitor *m) { fibonacci(m, 1); }
|
|
||||||
|
|
||||||
void spiral(Monitor *m) { fibonacci(m, 0); }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Gappless grid layout + gaps (ironically)
|
|
||||||
* https://dwm.suckless.org/patches/gaplessgrid/
|
|
||||||
*/
|
|
||||||
void gaplessgrid(Monitor *m) {
|
|
||||||
unsigned int i, n;
|
|
||||||
int x, y, cols, rows, ch, cw, cn, rn, rrest, crest; // counters
|
|
||||||
int oh, ov, ih, iv;
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
|
||||||
if (n == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* grid dimensions */
|
|
||||||
for (cols = 0; cols <= n / 2; cols++)
|
|
||||||
if (cols * cols >= n)
|
|
||||||
break;
|
|
||||||
if (n ==
|
|
||||||
5) /* set layout against the general calculation: not 1:2:2, but 2:3 */
|
|
||||||
cols = 2;
|
|
||||||
rows = n / cols;
|
|
||||||
cn = rn = 0; // reset column no, row no, client count
|
|
||||||
|
|
||||||
ch = (m->wh - 2 * oh - ih * (rows - 1)) / rows;
|
|
||||||
cw = (m->ww - 2 * ov - iv * (cols - 1)) / cols;
|
|
||||||
rrest = (m->wh - 2 * oh - ih * (rows - 1)) - ch * rows;
|
|
||||||
crest = (m->ww - 2 * ov - iv * (cols - 1)) - cw * cols;
|
|
||||||
x = m->wx + ov;
|
|
||||||
y = m->wy + oh;
|
|
||||||
|
|
||||||
for (i = 0, c = nexttiled(m->clients); c; i++, c = nexttiled(c->next)) {
|
|
||||||
if (i / rows + 1 > cols - n % cols) {
|
|
||||||
rows = n / cols + 1;
|
|
||||||
ch = (m->wh - 2 * oh - ih * (rows - 1)) / rows;
|
|
||||||
rrest = (m->wh - 2 * oh - ih * (rows - 1)) - ch * rows;
|
|
||||||
}
|
|
||||||
resize(c, x, y + rn * (ch + ih) + MIN(rn, rrest),
|
|
||||||
cw + (cn < crest ? 1 : 0) - 2 * c->bw,
|
|
||||||
ch + (rn < rrest ? 1 : 0) - 2 * c->bw, 0);
|
|
||||||
rn++;
|
|
||||||
if (rn >= rows) {
|
|
||||||
rn = 0;
|
|
||||||
x += cw + ih + (cn < crest ? 1 : 0);
|
|
||||||
cn++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Gridmode layout + gaps
|
|
||||||
* https://dwm.suckless.org/patches/gridmode/
|
|
||||||
*/
|
|
||||||
void grid(Monitor *m) {
|
|
||||||
unsigned int i, n;
|
|
||||||
int cx, cy, cw, ch, cc, cr, chrest, cwrest, cols, rows;
|
|
||||||
int oh, ov, ih, iv;
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
|
||||||
|
|
||||||
/* grid dimensions */
|
|
||||||
for (rows = 0; rows <= n / 2; rows++)
|
|
||||||
if (rows * rows >= n)
|
|
||||||
break;
|
|
||||||
cols = (rows && (rows - 1) * rows >= n) ? rows - 1 : rows;
|
|
||||||
|
|
||||||
/* window geoms (cell height/width) */
|
|
||||||
ch = (m->wh - 2 * oh - ih * (rows - 1)) / (rows ? rows : 1);
|
|
||||||
cw = (m->ww - 2 * ov - iv * (cols - 1)) / (cols ? cols : 1);
|
|
||||||
chrest = (m->wh - 2 * oh - ih * (rows - 1)) - ch * rows;
|
|
||||||
cwrest = (m->ww - 2 * ov - iv * (cols - 1)) - cw * cols;
|
|
||||||
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
|
|
||||||
cc = i / rows;
|
|
||||||
cr = i % rows;
|
|
||||||
cx = m->wx + ov + cc * (cw + iv) + MIN(cc, cwrest);
|
|
||||||
cy = m->wy + oh + cr * (ch + ih) + MIN(cr, chrest);
|
|
||||||
resize(c, cx, cy, cw + (cc < cwrest ? 1 : 0) - 2 * c->bw,
|
|
||||||
ch + (cr < chrest ? 1 : 0) - 2 * c->bw, False);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Horizontal grid layout + gaps
|
|
||||||
* https://dwm.suckless.org/patches/horizgrid/
|
|
||||||
*/
|
|
||||||
void horizgrid(Monitor *m) {
|
|
||||||
Client *c;
|
|
||||||
unsigned int n, i;
|
|
||||||
int oh, ov, ih, iv;
|
|
||||||
int mx = 0, my = 0, mh = 0, mw = 0;
|
|
||||||
int sx = 0, sy = 0, sh = 0, sw = 0;
|
|
||||||
int ntop, nbottom = 1;
|
|
||||||
float mfacts = 0, sfacts = 0;
|
|
||||||
int mrest, srest, mtotal = 0, stotal = 0;
|
|
||||||
|
|
||||||
/* Count windows */
|
|
||||||
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
|
||||||
if (n == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (n <= 2)
|
|
||||||
ntop = n;
|
|
||||||
else {
|
|
||||||
ntop = n / 2;
|
|
||||||
nbottom = n - ntop;
|
|
||||||
}
|
|
||||||
sx = mx = m->wx + ov;
|
|
||||||
sy = my = m->wy + oh;
|
|
||||||
sh = mh = m->wh - 2 * oh;
|
|
||||||
sw = mw = m->ww - 2 * ov;
|
|
||||||
|
|
||||||
if (n > ntop) {
|
|
||||||
sh = (mh - ih) / 2;
|
|
||||||
mh = mh - ih - sh;
|
|
||||||
sy = my + mh + ih;
|
|
||||||
mw = m->ww - 2 * ov - iv * (ntop - 1);
|
|
||||||
sw = m->ww - 2 * ov - iv * (nbottom - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* calculate facts */
|
|
||||||
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
|
||||||
if (i < ntop)
|
|
||||||
mfacts += c->cfact;
|
|
||||||
else
|
|
||||||
sfacts += c->cfact;
|
|
||||||
|
|
||||||
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
|
||||||
if (i < ntop)
|
|
||||||
mtotal += mh * (c->cfact / mfacts);
|
|
||||||
else
|
|
||||||
stotal += sw * (c->cfact / sfacts);
|
|
||||||
|
|
||||||
mrest = mh - mtotal;
|
|
||||||
srest = sw - stotal;
|
|
||||||
|
|
||||||
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
|
||||||
if (i < ntop) {
|
|
||||||
resize(c, mx, my,
|
|
||||||
mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2 * c->bw),
|
|
||||||
mh - (2 * c->bw), 0);
|
|
||||||
mx += WIDTH(c) + iv;
|
|
||||||
} else {
|
|
||||||
resize(c, sx, sy,
|
|
||||||
sw * (c->cfact / sfacts) + ((i - ntop) < srest ? 1 : 0) -
|
|
||||||
(2 * c->bw),
|
|
||||||
sh - (2 * c->bw), 0);
|
|
||||||
sx += WIDTH(c) + iv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* nrowgrid layout + gaps
|
|
||||||
* https://dwm.suckless.org/patches/nrowgrid/
|
|
||||||
*/
|
|
||||||
void nrowgrid(Monitor *m) {
|
|
||||||
unsigned int n;
|
|
||||||
int ri = 0, ci = 0; /* counters */
|
|
||||||
int oh, ov, ih, iv; /* vanitygap settings */
|
|
||||||
unsigned int cx, cy, cw, ch; /* client geometry */
|
|
||||||
unsigned int uw = 0, uh = 0, uc = 0; /* utilization trackers */
|
|
||||||
unsigned int cols, rows = m->nmaster + 1;
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
/* count clients */
|
|
||||||
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
|
||||||
|
|
||||||
/* nothing to do here */
|
|
||||||
if (n == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* force 2 clients to always split vertically */
|
|
||||||
if (FORCE_VSPLIT && n == 2)
|
|
||||||
rows = 1;
|
|
||||||
|
|
||||||
/* never allow empty rows */
|
|
||||||
if (n < rows)
|
|
||||||
rows = n;
|
|
||||||
|
|
||||||
/* define first row */
|
|
||||||
cols = n / rows;
|
|
||||||
uc = cols;
|
|
||||||
cy = m->wy + oh;
|
|
||||||
ch = (m->wh - 2 * oh - ih * (rows - 1)) / rows;
|
|
||||||
uh = ch;
|
|
||||||
|
|
||||||
for (c = nexttiled(m->clients); c; c = nexttiled(c->next), ci++) {
|
|
||||||
if (ci == cols) {
|
|
||||||
uw = 0;
|
|
||||||
ci = 0;
|
|
||||||
ri++;
|
|
||||||
|
|
||||||
/* next row */
|
|
||||||
cols = (n - uc) / (rows - ri);
|
|
||||||
uc += cols;
|
|
||||||
cy = m->wy + oh + uh + ih;
|
|
||||||
uh += ch + ih;
|
|
||||||
}
|
|
||||||
|
|
||||||
cx = m->wx + ov + uw;
|
|
||||||
cw = (m->ww - 2 * ov - uw) / (cols - ci);
|
|
||||||
uw += cw + iv;
|
|
||||||
|
|
||||||
resize(c, cx, cy, cw - (2 * c->bw), ch - (2 * c->bw), 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Default tile layout + gaps
|
|
||||||
*/
|
|
||||||
static void tile(Monitor *m) {
|
|
||||||
unsigned int i, n;
|
|
||||||
int oh, ov, ih, iv;
|
|
||||||
int mx = 0, my = 0, mh = 0, mw = 0;
|
|
||||||
int sx = 0, sy = 0, sh = 0, sw = 0;
|
|
||||||
float mfacts, sfacts;
|
|
||||||
int mrest, srest;
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
|
||||||
if (n == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
sx = mx = m->wx + ov;
|
|
||||||
sy = my = m->wy + oh;
|
|
||||||
mh = m->wh - 2 * oh - ih * (MIN(n, m->nmaster) - 1);
|
|
||||||
sh = m->wh - 2 * oh - ih * (n - m->nmaster - 1);
|
|
||||||
sw = mw = m->ww - 2 * ov;
|
|
||||||
|
|
||||||
if (m->nmaster && n > m->nmaster) {
|
|
||||||
sw = (mw - iv) * (1 - m->mfact);
|
|
||||||
mw = mw - iv - sw;
|
|
||||||
sx = mx + mw + iv;
|
|
||||||
}
|
|
||||||
|
|
||||||
getfacts(m, mh, sh, &mfacts, &sfacts, &mrest, &srest);
|
|
||||||
|
|
||||||
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
|
||||||
if (i < m->nmaster) {
|
|
||||||
resize(c, mx, my, mw - (2 * c->bw),
|
|
||||||
mh * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2 * c->bw), 0);
|
|
||||||
my += HEIGHT(c) + ih;
|
|
||||||
} else {
|
|
||||||
resize(c, sx, sy, sw - (2 * c->bw),
|
|
||||||
sh * (c->cfact / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) -
|
|
||||||
(2 * c->bw),
|
|
||||||
0);
|
|
||||||
sy += HEIGHT(c) + ih;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./sway.nix
|
|
||||||
];
|
|
||||||
home = {
|
|
||||||
packages = with pkgs; [
|
|
||||||
waybar
|
|
||||||
swaybg
|
|
||||||
slurp
|
|
||||||
grim
|
|
||||||
];
|
|
||||||
file = {
|
|
||||||
".config/rofi/config.rasi".source = ./raw/config.rasi;
|
|
||||||
".config/waybar/style.css".source = ./raw/style.css;
|
|
||||||
".config/waybar/config".source = ./raw/config;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,189 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"battery": {
|
|
||||||
"format": "{icon} {capacity}%",
|
|
||||||
"format-alt": "{icon} {time}",
|
|
||||||
"format-charging": " {capacity}%",
|
|
||||||
"format-icons": [
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
""
|
|
||||||
],
|
|
||||||
"format-plugged": " {capacity}% ",
|
|
||||||
"states": {
|
|
||||||
"critical": 15,
|
|
||||||
"good": 95,
|
|
||||||
"warning": 30
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"cava#left": {
|
|
||||||
"autosens": 1,
|
|
||||||
"bar_delimiter": 0,
|
|
||||||
"bars": 18,
|
|
||||||
"format-icons": [
|
|
||||||
"<span foreground='#cba6f7'>▁</span>",
|
|
||||||
"<span foreground='#cba6f7'>▂</span>",
|
|
||||||
"<span foreground='#cba6f7'>▃</span>",
|
|
||||||
"<span foreground='#cba6f7'>▄</span>",
|
|
||||||
"<span foreground='#89b4fa'>▅</span>",
|
|
||||||
"<span foreground='#89b4fa'>▆</span>",
|
|
||||||
"<span foreground='#89b4fa'>▇</span>",
|
|
||||||
"<span foreground='#89b4fa'>█</span>"
|
|
||||||
],
|
|
||||||
"framerate": 60,
|
|
||||||
"higher_cutoff_freq": 10000,
|
|
||||||
"input_delay": 2,
|
|
||||||
"lower_cutoff_freq": 50,
|
|
||||||
"method": "pulse",
|
|
||||||
"monstercat": false,
|
|
||||||
"reverse": false,
|
|
||||||
"source": "auto",
|
|
||||||
"stereo": true,
|
|
||||||
"waves": false
|
|
||||||
},
|
|
||||||
"cava#right": {
|
|
||||||
"autosens": 1,
|
|
||||||
"bar_delimiter": 0,
|
|
||||||
"bars": 18,
|
|
||||||
"format-icons": [
|
|
||||||
"<span foreground='#cba6f7'>▁</span>",
|
|
||||||
"<span foreground='#cba6f7'>▂</span>",
|
|
||||||
"<span foreground='#cba6f7'>▃</span>",
|
|
||||||
"<span foreground='#cba6f7'>▄</span>",
|
|
||||||
"<span foreground='#89b4fa'>▅</span>",
|
|
||||||
"<span foreground='#89b4fa'>▆</span>",
|
|
||||||
"<span foreground='#89b4fa'>▇</span>",
|
|
||||||
"<span foreground='#89b4fa'>█</span>"
|
|
||||||
],
|
|
||||||
"framerate": 60,
|
|
||||||
"higher_cutoff_freq": 10000,
|
|
||||||
"input_delay": 2,
|
|
||||||
"lower_cutoff_freq": 50,
|
|
||||||
"method": "pulse",
|
|
||||||
"monstercat": false,
|
|
||||||
"reverse": false,
|
|
||||||
"source": "auto",
|
|
||||||
"stereo": true,
|
|
||||||
"waves": false
|
|
||||||
},
|
|
||||||
"clock": {
|
|
||||||
"format": " {:%a, %d %b, %I:%M %p}",
|
|
||||||
"format-alt": " {:%d/%m}",
|
|
||||||
"tooltip": "true",
|
|
||||||
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>"
|
|
||||||
},
|
|
||||||
"cpu": {
|
|
||||||
"format": " {usage}%",
|
|
||||||
"format-alt": " {avg_frequency} GHz",
|
|
||||||
"interval": 5
|
|
||||||
},
|
|
||||||
"custom/launcher": {
|
|
||||||
"format": "",
|
|
||||||
"tooltip": "false"
|
|
||||||
},
|
|
||||||
"custom/playerctl#backward": {
|
|
||||||
"format": " ",
|
|
||||||
"on-click": "playerctl previous",
|
|
||||||
"on-scroll-down": "playerctl volume .05-",
|
|
||||||
"on-scroll-up": "playerctl volume .05+"
|
|
||||||
},
|
|
||||||
"custom/playerctl#foward": {
|
|
||||||
"format": " ",
|
|
||||||
"on-click": "playerctl next",
|
|
||||||
"on-scroll-down": "playerctl volume .05-",
|
|
||||||
"on-scroll-up": "playerctl volume .05+"
|
|
||||||
},
|
|
||||||
"custom/playerctl#play": {
|
|
||||||
"exec": "playerctl -a metadata --format '{\"text\": \"{{artist}} - {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F",
|
|
||||||
"format": "{icon}",
|
|
||||||
"format-icons": {
|
|
||||||
"Paused": "<span> </span>",
|
|
||||||
"Playing": "<span> </span>",
|
|
||||||
"Stopped": "<span> </span>"
|
|
||||||
},
|
|
||||||
"on-click": "playerctl play-pause",
|
|
||||||
"on-scroll-down": "playerctl volume .05-",
|
|
||||||
"on-scroll-up": "playerctl volume .05+",
|
|
||||||
"return-type": "json"
|
|
||||||
},
|
|
||||||
"custom/playerlabel": {
|
|
||||||
"exec": "playerctl -a metadata --format '{\"text\": \"{{artist}} - {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F",
|
|
||||||
"format": "<span> {} </span>",
|
|
||||||
"max-length": 40,
|
|
||||||
"on-click": "",
|
|
||||||
"return-type": "json"
|
|
||||||
},
|
|
||||||
"custom/randwall": {
|
|
||||||
"format": ""
|
|
||||||
},
|
|
||||||
"height": 35,
|
|
||||||
"layer": "top",
|
|
||||||
"margin-bottom": 0,
|
|
||||||
"margin-left": 0,
|
|
||||||
"margin-right": 0,
|
|
||||||
"margin-top": 0,
|
|
||||||
"memory": {
|
|
||||||
"format": " {}%",
|
|
||||||
"format-alt": " {used}/{total} GiB",
|
|
||||||
"interval": 5
|
|
||||||
},
|
|
||||||
"modules-center": [
|
|
||||||
"custom/playerlabel",
|
|
||||||
],
|
|
||||||
"modules-left": [
|
|
||||||
"cava#left",
|
|
||||||
"custom/playerctl#backward",
|
|
||||||
"custom/playerctl#play",
|
|
||||||
"custom/playerctl#foward",
|
|
||||||
],
|
|
||||||
"modules-right": [
|
|
||||||
"tray",
|
|
||||||
"battery",
|
|
||||||
"pulseaudio",
|
|
||||||
"network",
|
|
||||||
],
|
|
||||||
|
|
||||||
"network": {
|
|
||||||
"format-disconnected": " 0% ",
|
|
||||||
"format-ethernet": " 100% ",
|
|
||||||
"format-linked": "{ifname} (No IP)",
|
|
||||||
"format-wifi": " {signalStrength}%",
|
|
||||||
"tooltip-format": "Connected to {essid} {ifname} via {gwaddr}"
|
|
||||||
},
|
|
||||||
"position": "top",
|
|
||||||
"pulseaudio": {
|
|
||||||
"format": "{icon} {volume}%",
|
|
||||||
"format-icons": {
|
|
||||||
"default": [
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
""
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"format-muted": "",
|
|
||||||
"on-click": "pavucontrol",
|
|
||||||
"scroll-step": 5
|
|
||||||
},
|
|
||||||
"tray": {
|
|
||||||
"icon-size": 20,
|
|
||||||
"spacing": 8
|
|
||||||
},
|
|
||||||
"wlr/workspaces": {
|
|
||||||
"active-only": false,
|
|
||||||
"all-outputs": false,
|
|
||||||
"disable-scroll": false,
|
|
||||||
"format": "{name}",
|
|
||||||
"format-icons": {
|
|
||||||
"active": "",
|
|
||||||
"default": "",
|
|
||||||
"sort-by-number": true,
|
|
||||||
"urgent": ""
|
|
||||||
},
|
|
||||||
"on-click": "activate",
|
|
||||||
"on-scroll-down": "hyprctl dispatch workspace e+1",
|
|
||||||
"on-scroll-up": "hyprctl dispatch workspace e-1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
@ -1,76 +0,0 @@
|
|||||||
configuration {
|
|
||||||
display-drun: "Applications:";
|
|
||||||
drun-display-format: "{icon} {name}";
|
|
||||||
font: "JetBrainsMono Nerd Font Medium 10";
|
|
||||||
show-icons: true;
|
|
||||||
modi: "drun";
|
|
||||||
}
|
|
||||||
|
|
||||||
@theme "/dev/null"
|
|
||||||
|
|
||||||
* {
|
|
||||||
|
|
||||||
opacity: 0.5;
|
|
||||||
color0: #39305320;
|
|
||||||
color1: #494d6420;
|
|
||||||
color3: #d8dee9;
|
|
||||||
color4: #7b68ee;
|
|
||||||
color5: #cbe3e7;
|
|
||||||
|
|
||||||
|
|
||||||
background-color: transparent;
|
|
||||||
text-color: @color3;
|
|
||||||
accent-color: @color5;
|
|
||||||
|
|
||||||
margin: 0px;
|
|
||||||
border: 0px;
|
|
||||||
padding: 0px;
|
|
||||||
spacing: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
window {
|
|
||||||
background-color: @color0;
|
|
||||||
border-color: @accent-color;
|
|
||||||
|
|
||||||
width: 50%;
|
|
||||||
border: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
inputbar {
|
|
||||||
padding: 10px 12px;
|
|
||||||
spacing: 12px;
|
|
||||||
children: [ prompt, entry ];
|
|
||||||
}
|
|
||||||
|
|
||||||
prompt, entry, element-text, element-icon {
|
|
||||||
vertical-align: 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
prompt {
|
|
||||||
text-color: @accent-color;
|
|
||||||
enabled: true;
|
|
||||||
text-color: @color4;
|
|
||||||
}
|
|
||||||
|
|
||||||
listview {
|
|
||||||
lines: 8;
|
|
||||||
columns: 2;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
element {
|
|
||||||
padding: 8px;
|
|
||||||
spacing: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
element selected {
|
|
||||||
text-color: @color4;
|
|
||||||
}
|
|
||||||
|
|
||||||
element-icon {
|
|
||||||
size: 20;
|
|
||||||
}
|
|
||||||
|
|
||||||
element-text {
|
|
||||||
text-color: inherit;
|
|
||||||
}
|
|
@ -1,134 +0,0 @@
|
|||||||
* {
|
|
||||||
border: none;
|
|
||||||
border-radius: 0px;
|
|
||||||
font-family: RobotoMono Nerd Font;
|
|
||||||
font-size: 14px;
|
|
||||||
min-height: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
window#waybar {
|
|
||||||
/* background: rgba(17,17,27,1); */
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
#cava.left, #cava.right {
|
|
||||||
/* background: #25253a; */
|
|
||||||
|
|
||||||
/*background: #25253a;*/
|
|
||||||
background: #010101;
|
|
||||||
margin: 5px;
|
|
||||||
padding: 8px 16px;
|
|
||||||
color: #cba6f7;
|
|
||||||
}
|
|
||||||
#cava.left {
|
|
||||||
border-radius: 24px 24px 24px 24px;
|
|
||||||
}
|
|
||||||
#cava.right {
|
|
||||||
border-radius: 10px 24px 10px 24px;
|
|
||||||
}
|
|
||||||
#workspaces {
|
|
||||||
background: #11111b;
|
|
||||||
margin: 5px 5px;
|
|
||||||
padding: 8px 5px;
|
|
||||||
border-radius: 16px;
|
|
||||||
color: #cba6f7
|
|
||||||
}
|
|
||||||
#workspaces button {
|
|
||||||
padding: 0px 5px;
|
|
||||||
margin: 0px 3px;
|
|
||||||
border-radius: 16px;
|
|
||||||
color: transparent;
|
|
||||||
background: rgba(17,17,27,1);
|
|
||||||
transition: all 0.3s ease-in-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.active {
|
|
||||||
background-color: #89b4fa;
|
|
||||||
color: #11111B;
|
|
||||||
border-radius: 16px;
|
|
||||||
min-width: 50px;
|
|
||||||
background-size: 400% 400%;
|
|
||||||
transition: all 0.3s ease-in-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button:hover {
|
|
||||||
background-color: #f5f5f5;
|
|
||||||
color: #11111B;
|
|
||||||
border-radius: 16px;
|
|
||||||
min-width: 50px;
|
|
||||||
background-size: 400% 400%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#tray, #pulseaudio, #network, #battery,
|
|
||||||
#custom-playerctl.backward, #custom-playerctl.play, #custom-playerctl.foward{
|
|
||||||
background: #010101;
|
|
||||||
font-weight: bold;
|
|
||||||
margin: 5px 0px;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
#tray, #pulseaudio, #network, #battery{
|
|
||||||
color: #f5f5f5;
|
|
||||||
border-radius: 24px 24px 24px 24px;
|
|
||||||
padding: 0 20px;
|
|
||||||
margin-left: 7px;
|
|
||||||
}
|
|
||||||
#clock {
|
|
||||||
color: #f5f5f5;
|
|
||||||
background: #010101;
|
|
||||||
border-radius: 0px 0px 0px 40px;
|
|
||||||
padding: 10px 10px 15px 25px;
|
|
||||||
margin-left: 7px;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
#custom-launcher {
|
|
||||||
color: #89b4fa;
|
|
||||||
background: #010101;
|
|
||||||
border-radius: 0px 0px 40px 0px;
|
|
||||||
margin: 0px;
|
|
||||||
padding: 0px 35px 0px 15px;
|
|
||||||
font-size: 28px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-playerctl.backward, #custom-playerctl.play, #custom-playerctl.foward {
|
|
||||||
background: #010101;
|
|
||||||
font-size: 22px;
|
|
||||||
}
|
|
||||||
#custom-playerctl.backward:hover, #custom-playerctl.play:hover, #custom-playerctl.foward:hover{
|
|
||||||
color: #f5f5f5;
|
|
||||||
}
|
|
||||||
#custom-playerctl.backward {
|
|
||||||
color: #cba6f7;
|
|
||||||
border-radius: 24px 0px 0px 24px;
|
|
||||||
padding-left: 16px;
|
|
||||||
margin-left: 7px;
|
|
||||||
}
|
|
||||||
#custom-playerctl.play {
|
|
||||||
color: #89b4fa;
|
|
||||||
padding: 0 5px;
|
|
||||||
}
|
|
||||||
#custom-playerctl.foward {
|
|
||||||
color: #cba6f7;
|
|
||||||
border-radius: 0px 24px 24px 0px;
|
|
||||||
padding-right: 12px;
|
|
||||||
margin-right: 7px
|
|
||||||
}
|
|
||||||
#custom-playerlabel {
|
|
||||||
background: #010101;
|
|
||||||
color: #f5f5f5;
|
|
||||||
padding: 0 20px;
|
|
||||||
border-radius: 24px 24px 24px 24px;
|
|
||||||
margin: 5px 0;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
#window{
|
|
||||||
/*background: #25253a; */
|
|
||||||
padding-left: 15px;
|
|
||||||
padding-right: 15px;
|
|
||||||
border-radius: 16px;
|
|
||||||
margin-top: 5px;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
font-weight: normal;
|
|
||||||
font-style: normal;
|
|
||||||
opacity: 0.1;
|
|
||||||
}
|
|
@ -5,13 +5,28 @@
|
|||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
{
|
{
|
||||||
networking.hostName = "sputnik";
|
networking.hostName = "iridium";
|
||||||
|
|
||||||
imports = [
|
imports = [
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
../default/default.nix
|
../default/default.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
loader = {
|
||||||
|
systemd-boot = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
supportedFilesystems = [ "ntfs" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
programs = {
|
||||||
|
steam = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
nixpkgs = {
|
nixpkgs = {
|
||||||
config = {
|
config = {
|
||||||
allowUnfree = true;
|
allowUnfree = true;
|
||||||
@ -49,7 +64,6 @@
|
|||||||
|
|
||||||
programs = {
|
programs = {
|
||||||
nix-ld.enable = true;
|
nix-ld.enable = true;
|
||||||
fish.enable = true;
|
|
||||||
dconf = {
|
dconf = {
|
||||||
enable = true;
|
enable = true;
|
||||||
};
|
};
|
||||||
@ -59,7 +73,7 @@
|
|||||||
"makepkg.conf".source = "${pkgs.pacman}/etc/makepkg.conf";
|
"makepkg.conf".source = "${pkgs.pacman}/etc/makepkg.conf";
|
||||||
"pacman.conf".text = ''
|
"pacman.conf".text = ''
|
||||||
[options]
|
[options]
|
||||||
HoldPkg = pacman glibc
|
HoldPkg = pacman glibc
|
||||||
UseSyslog
|
UseSyslog
|
||||||
Color
|
Color
|
||||||
ILoveCandy
|
ILoveCandy
|
@ -12,6 +12,21 @@
|
|||||||
../default/default.nix
|
../default/default.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
loader = {
|
||||||
|
systemd-boot = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
supportedFilesystems = [ "ntfs" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
programs = {
|
||||||
|
steam = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
nixpkgs = {
|
nixpkgs = {
|
||||||
config = {
|
config = {
|
||||||
allowUnfree = true;
|
allowUnfree = true;
|
||||||
@ -20,17 +35,11 @@
|
|||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
nix = {
|
nix.settings.experimental-features = [
|
||||||
gc = {
|
"nix-command"
|
||||||
automatic = true;
|
"flakes"
|
||||||
dates = "daily";
|
];
|
||||||
options = "--delete-older-than 3d";
|
|
||||||
};
|
|
||||||
settings.experimental-features = [
|
|
||||||
"nix-command"
|
|
||||||
"flakes"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
systemd = {
|
systemd = {
|
||||||
services = {
|
services = {
|
||||||
modem-manager.enable = false;
|
modem-manager.enable = false;
|
||||||
@ -55,14 +64,16 @@
|
|||||||
|
|
||||||
programs = {
|
programs = {
|
||||||
nix-ld.enable = true;
|
nix-ld.enable = true;
|
||||||
fish.enable = true;
|
dconf = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
environment.etc = {
|
environment.etc = {
|
||||||
"makepkg.conf".source = "${pkgs.pacman}/etc/makepkg.conf";
|
"makepkg.conf".source = "${pkgs.pacman}/etc/makepkg.conf";
|
||||||
"pacman.conf".text = ''
|
"pacman.conf".text = ''
|
||||||
[options]
|
[options]
|
||||||
HoldPkg = pacman glibc
|
HoldPkg = pacman glibc
|
||||||
UseSyslog
|
UseSyslog
|
||||||
Color
|
Color
|
||||||
ILoveCandy
|
ILoveCandy
|
||||||
|
@ -24,11 +24,6 @@
|
|||||||
options = [ "fmask=0022" "dmask=0022" ];
|
options = [ "fmask=0022" "dmask=0022" ];
|
||||||
};
|
};
|
||||||
|
|
||||||
fileSystems."/media/STUFF" =
|
|
||||||
{ device = "/dev/disk/by-label/STUFF";
|
|
||||||
fsType = "ext4";
|
|
||||||
};
|
|
||||||
|
|
||||||
swapDevices = [ ];
|
swapDevices = [ ];
|
||||||
|
|
||||||
networking.useDHCP = lib.mkDefault true;
|
networking.useDHCP = lib.mkDefault true;
|
||||||
|
Reference in New Issue
Block a user