Merge pull request #1 from elkowar/gruvbox

merge
This commit is contained in:
ElKowar 2020-06-21 12:30:20 +02:00 committed by GitHub
commit 2fddf3c34a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
127 changed files with 13715 additions and 847 deletions

2
.gitignore vendored
View file

@ -16,3 +16,5 @@ xfce4
yay
.stack-work
**/.surf/cache
xmonad-x86_64-linux
__pycache__

View file

@ -1,3 +1,17 @@
*.background: #282828
color5: #ff0000
Xcursor.size: 16
Xcursor.theme: capitaine-cursors-light
Xft.autohint: 0
Xft.antialias: 1
Xft.hinting: true
Xft.hintstyle: hintslight
Xft.dpi: 96
Xft.rgba: rgb
Xft.lcdfilter: lcddefault
rofi.lines: 5
rofi.eh: 2
rofi.padding: 200
@ -16,3 +30,43 @@ rofi.color-active: argb:031d1f21, #f3f4f5, argb:031d1f21, argb:031d1f21, #9575cd
rofi.font: System San Francisco Display 18
dzen.font: -*-fixed-medium-r-s*--12-87-*-*-*-*-iso10???-1
URxvt.font: xft:scientifica
!URxvt.color24: #076678
!URxvt.color66: #427b58
!URxvt.color88: #9d0006
!URxvt.color96: #8f3f71
!URxvt.color100: #79740e
!URxvt.color108: #8ec07c
!URxvt.color109: #83a598
!URxvt.color130: #af3a03
!URxvt.color136: #b57614
!URxvt.color142: #b8bb26
!URxvt.color167: #fb4934
!URxvt.color175: #d3869b
!URxvt.color208: #fe8019
!URxvt.color214: #fabd2f
!URxvt.color223: #ebdbb2
!URxvt.color228: #f2e5bc
!URxvt.color229: #fbf1c7
!URxvt.color230: #f9f5d7
!URxvt.color234: #1d2021
!URxvt.color235: #282828
!URxvt.color236: #32302f
!URxvt.color237: #3c3836
!URxvt.color239: #504945
!URxvt.color241: #665c54
!URxvt.color243: #7c6f64
!URxvt.color244: #928374
!URxvt.color245: #928374
!URxvt.color246: #a89984
!URxvt.color248: #bdae93
!URxvt.color250: #d5c4a1

View file

@ -1 +1 @@
{"anti_track":{"enabled":false},"avatar_links":{"enabled":false},"char_count":{"enabled":false},"css_loader":{"path":"glasscord_css.css"},"direct_download":{"enabled":false},"double_click_edit":{"enabled":false},"double_click_mention":{"enabled":false},"ed_settings":{"enabled":true},"friend_count":{"onlineOnly":false,"enabled":false},"guild_count":{"enabled":false},"hidden_channels":{"enabled":false},"quick_save":{"enabled":false},"silence":{"enabled":false},"silent_typing":{"enabled":false},"tag_all":{"enabled":false}}
{"anti_track":{"enabled":false},"avatar_links":{"enabled":false},"char_count":{"enabled":false},"css_loader":{"path":"glasscord_css.css","enabled":false},"direct_download":{"enabled":false},"double_click_edit":{"enabled":false},"double_click_mention":{"enabled":false},"ed_settings":{"enabled":true},"friend_count":{"onlineOnly":false,"enabled":false},"guild_count":{"enabled":false},"hidden_channels":{"enabled":false},"quick_save":{"enabled":false},"silence":{"enabled":false},"silent_typing":{"enabled":false},"tag_all":{"enabled":false}}

View file

@ -27,7 +27,7 @@
/* unread indicators */
.theme-dark .unread-2OHH1w:not(.selected-nT-gM3):before {
background: transparent;
background: #282828;
opacity: 0.5;
height: 50px;
width: 50px;

View file

@ -0,0 +1,57 @@
@import url(https://enhanceddiscord.com/theme.css);
/* theme settings - uncomment (by removing the /*) and modify these lines in order to change things */
:root {
/* --bg: url(https://i.imgur.com/ybRUHPc.jpg); /* background for the entire window. Almost everything is transparent to this image. */
/* --bg-overlay: rgba(0, 0, 0, 0.8); /* overlay for the background. Generally, this should darken the picture to make text more readable. */
/* --accent-color: #900; /* color of buttons, misc. text, etc. */
/* --mention-color: #f00; /* color of mention text */
/* --mention-bg: rgba(255, 0, 0, 0.15); /* mention background color */
/* --mention-bgh: rgba(255, 0, 0, 0.4); /* mention backgroung while hovering over it */
/* --link-color: #faa61a; /* color of all links */
/* --link-color-hover: #fad61a; /* color of all links while hovering over them */
/* --tag-color: #fff; /* text color of tags (bot tags and custom) */
/* --tag-bg: rgba(255, 0, 0, 0.3); /* background of tags (bot tags and custom) */
/* --popup-background: #222; /* background of modals, confirmation messages etc. */
/* --popup-highlight: #333; /* color of headers and footers of "popouts" (linked to above) */
/* --context-menu-bg: #333; /* color of context (right-click) menus. */
/* --unread-color: #f00; /* color of unread/selected server indicators. */
}
/* nitrofag badge */
.profileBadgePremium-3kZ9Qj, .topSectionNormal-2-vo2m .profileBadgePremium-3kZ9Qj,
.profileBadgePremium-3kZ9Qj, .topSectionPlaying-1J5E4n .profileBadgePremium-3kZ9Qj {
background-image: url(https://discordapp.com/assets/9c252d28ca4980d65054a0258052983b.svg);
}
/* unread indicators */
.theme-dark .unread-2OHH1w:not(.selected-nT-gM3):before {
background: transparent;
opacity: 0.5;
height: 50px;
width: 50px;
left: 0px;
bottom: 0px;
top: 0px;
margin-top: 0;
border-radius: 50%;
border-top-right-radius: 5px;
border-bottom-left-radius: 5px;
/* box-shadow: 16px -16px 10px -14px #f00; */
/* background: -webkit-radial-gradient(transparent 15px, #f00 25px, transparent 40px); */
box-shadow: inset 0 0 12px 2px var(--unread-color);
}
.theme-dark .selected-nT-gM3:before {
background: var(--unread-color);
}
.theme-dark .unread-2OHH1w:hover::before {
border-radius: 15px;
border-top-right-radius: 5px;
border-bottom-left-radius: 5px;
transition: border-radius 150ms;
}
/* uncomment the following lines to hide gif picker */
/*button[aria-label="Open GIF picker"] {
display: none;
}*/

View file

@ -1,6 +1,6 @@
env:
# if not set, it supposedly check's if a alacritty entry exists and uses xterm-256color otherwise
#TERM: alacritty
# TERM: alacritty
TERM: xterm-256color
window:
@ -12,8 +12,8 @@ window:
# y: 0
padding:
x: 0
y: 0
x: 20
y: 20
#Spread additional padding evenly around the terminal content.
dynamic_padding: true
@ -230,6 +230,37 @@ mouse:
# schemes --------------------------------------------------------- {{{
schemes:
blueish: &blueish
colors:
# Default colors
primary:
background: '0x3f5163'
foreground: '0xe2efe6'
# Normal colors
normal:
black: '0x111111'
red: '0xa54242'
green: '0xa9b254'
yellow: '0xde935f'
blue: '0x1bcdee'
magenta: '0xbd88ce'
cyan: '0x5bc5b7'
white: '0xbceff7'
# Bright colors
bright:
black: '0xc5d2e6'
red: '0xff8484'
green: '0xebf39c'
yellow: '0xf4c76e'
blue: '0x97cfff'
magenta: '0xc3a2cd'
cyan: '0xa5f9ee'
white: '0xe7fcff'
dracula: &dracula
primary:
background: '#282a36'
@ -254,6 +285,7 @@ schemes:
white: '#e6e6e6'
gruvbox: &gruvbox
primary:
#background: '#1d2021' # hard contrast: background = '#1d2021'
background: '#282828' # hard contrast: background = '#1d2021'
foreground: '#ebdbb2' # soft contrast: background = '#32302f'
normal:
@ -301,12 +333,21 @@ schemes:
# }}}
# https://github.com/alacritty/alacritty/wiki/Color-schemes
colors: *onedark
background_opacity: 0.95
colors: *gruvbox
#background_opacity: 0.95
background_opacity: 1.0
font:
size: 13
normal: # >>= >=
family: Iosevka
#size: 10
size: 12
normal:
#family: JetBrainsMono Nerd Font
style: Normal
#family: Iosevka Term
#family: cozette
family: Terminus (TTF)
#family: cherry
#family: lucy tewi2a
#family: Scientifica
offset:
x: 0
y: 0

View file

@ -0,0 +1,25 @@
#!/bin/bash
case $1 in "-a") PROMPT="Goto:"; MODE="go" ;; "-R") PROMPT="Bring:"; MODE="bring" ;; esac
if [ -n "$2" ]; then
WINDOW="$2"
else
WINDOW=$(paste \
<(xdotool search .) \
<(xdotool search . get_desktop_for_window %@ 2> /dev/null) \
<(xdotool search . getwindowname %@) |\
awk '{FS="\t"; if($2 != -1) printf "%10d [%d] %s\n",$1,$2+1,$3}' |\
vmenu --no-refocus -p $PROMPT |\
sed 's/^ *//g' |\
cut -d ' ' -f 1)
fi
if [ -n "$WINDOW" ]; then
if [ bring = $MODE ]; then
if DESK=$(xdotool get_desktop 2> /dev/null); then
xdotool set_desktop_for_window "$WINDOW" $DESK
sleep 0.005 # wait for wm to notice
fi
fi
xdotool windowmap "$WINDOW" windowactivate "$WINDOW" windowfocus "$WINDOW" windowraise "$WINDOW"
fi

View file

@ -0,0 +1,11 @@
#!/bin/bash
if [ -z "$1" ]; then
echo "Usage: $0 <name of hidden scratchpad window>"
exit 1
fi
pids=$(xdotool search --class "${1}")
for pid in $pids; do
echo "Toggle $pid"
bspc node "$pid" --flag hidden -f
done

View file

@ -0,0 +1,107 @@
#!/bin/bash
# Config
# ======
# Where to look for wid files:
TMPDIR="$XDG_RUNTIME_DIR/drawers.wids/"
# Find and show/hide the window if it exists
# ==========================================
NAME=$1
if [[ -e $TMPDIR$NAME ]]; then
read -r WINDOW < "$TMPDIR$NAME"
# Window exists? Show/hide it and we're done.
if xdotool getwindowname "$WINDOW" &> /dev/null; then
if xdotool search --onlyvisible . | grep -q "$WINDOW"; then
xdotool windowminimize "$WINDOW"
else
~/.config/bspwm/bspwm_scripts/bringwindow -R "$WINDOW"
fi
exit
fi
fi
if [[ $# -lt 5 ]]; then
echo "Not enough args to launch a new $NAME."
exit 1
fi
# No window to show/hide, better create it. Do setup for that.
# ============================================================
# no xinerama for now
CFG=($(xdotool getdisplaygeometry))
SCR_WIDTH=${CFG[0]}
SCR_HEIGHT=${CFG[1]}
SCR_LEFT=0 #${CFG[2]}
SCR_TOP=0 #${CFG[3]}
SIDE=$2
WIDTH=$3
HEIGHT=$4
shift 4
# Handle fractions of screen size for width and height
# ====================================================
if [[ $WIDTH == *% ]]; then
WIDTH=${WIDTH:0:-1} # chomp '%'
WIDTH=$(( (WIDTH*10*SCR_WIDTH)/1000 ))
fi
if [[ $HEIGHT == *% ]]; then
HEIGHT=${HEIGHT:0:-1} # chomp '%'
HEIGHT=$(( (HEIGHT*10*SCR_HEIGHT)/1000 ))
fi
# Figure out where to put the window
# ==================================
TOP_ADJ=$(( (SCR_HEIGHT-HEIGHT)/2 ))
LEFT_ADJ=$(( (SCR_WIDTH-WIDTH)/2 ))
case $SIDE in
"left")
LEFT=$SCR_LEFT
TOP=$(( SCR_TOP + TOP_ADJ ))
;;
"right")
LEFT=$(( SCR_WIDTH - WIDTH ))
TOP=$(( SCR_TOP + TOP_ADJ ))
;;
"bottom")
LEFT=$(( SCR_LEFT + LEFT_ADJ ))
TOP=$(( SCR_HEIGHT - HEIGHT ))
;;
"top")
LEFT=$(( SCR_LEFT + LEFT_ADJ ))
TOP=$SCR_TOP
esac
# Create the window
# =================
$@ &
# await new window:
countWins() {
xdotool search --onlyvisible . 2> /dev/null | wc -l
}
WIN_CNT="$(countWins)"
while [[ $(countWins) = "$WIN_CNT" ]]; do sleep 0.1; done
sleep 0.25
# new window should now be active, make it our window:
WINDOW="$(xdotool getactivewindow)"
xdotool set_window --role "drawer" $WINDOW
mkdir -p "$TMPDIR"
echo "$WINDOW" > "$TMPDIR$NAME"
border_width="$(xgetres awesome border_width)"
which awesome-client &> /dev/null && echo "client.focus.floating = true; client.focus.border_width=$border_width" | awesome-client
xdotool windowmove $WINDOW $LEFT $TOP windowsize $WINDOW $WIDTH $HEIGHT windowfocus $WINDOW windowraise $WINDOW

View file

@ -0,0 +1,14 @@
#!/bin/bash
options="screenshot\nscreengif"
selected="$(echo -e "$options" | rofi -dmenu -i -theme ~/scripts/rofi-scripts/default_theme.rasi)"
case "$selected" in
screenshot)
~/scripts/screenshot.sh
;;
screengif)
notify-send gif "press M-S-C-g to end gif"
~/scripts/screengif.sh
;;
esac

View file

@ -0,0 +1,2 @@
#!/bin/bash
pgrep "$@" > /dev/null || ("$@" &)

View file

@ -0,0 +1,2 @@
#!/bin/dash
appres "$1" | grep "$2" | cut -f 2-

34
files/.config/bspwm/bspwmrc Executable file
View file

@ -0,0 +1,34 @@
#! /bin/sh
sxhkd &
killall -q picom && picom --config ~/.config/picom.conf --experimental-backends --no-fading-openclose &
killall -q pasystray && pasystray &
killall -q nm-applet && nm-applet &
killall -q clipmenud && clipmenud &
xset r rate 300 50 &
/home/leon/.config/polybar/launch.sh &
feh --bg-fill /home/leon/Bilder/wallpapers/mountains_with_clounds.jpg &
bspc monitor -d 1 2 3 4 5 6 7 8 9 10
bspc config border_width 2
bspc config window_gap 14
bspc config focus_follows_pointer true
bspc config split_ratio 0.50
bspc config borderless_monocle false
bspc config gapless_monocle false
bspc config automatic_scheme alternate
bspc rule -a mplayer2 state=floating
bspc rule -a Kupfer.py focus=on
bspc rule -a Screenkey manage=off
bspc rule -a feh state=floating
bspc rule -a Sxiv state=floating
#bspc rule -a kitty_scratchpad sticky=on state=floating hidden=on
#kitty --class kitty_scratchpad &

View file

@ -1,4 +1,4 @@
{
"optOut": false,
"lastUpdateCheck": 1587026795290
"lastUpdateCheck": 1592658266558
}

View file

@ -1,13 +1,30 @@
fish_vi_key_bindings
# fish_default_key_bindings
# disable truecolor for dvtm
# set -e fish_term24bit
#source /home/leon/.config/fish/gruvbox-colors.fish
#set -U FZF_TMUX 1
set -U FZF_DEFAULT_COMMANDS "--filepath-word --cycle"
set -U FZF_PREVIEW_FILE_CMD "head -n 10 | bat --color=always --decorations=never"
set -U fish_greeting
#function fish_greeting
#end
alias ls=lsd
alias tcolors="env TERM=xterm-256color tcolors"
abbr --add --global vim nvim
abbr --add --global tsh trash
abbr --add --global clear "clear && ls"
#abbr --add --global clear "clear && ls"
abbr --add --global cxmonad "nvim /home/leon/.xmonad/lib/Config.hs"
#if status is-interactive
#and not set -q TMUX
#exec tmux
#end
abbr --add --global gaa "git add --all"
abbr --add --global gc "git commit -m "
@ -25,6 +42,36 @@ function run_stuff
commandline -f repaint
end
function c
set -l result (/home/leon/scripts/conf)
commandline -r "$result"
commandline -f execute
end
bind \ca run_stuff
function replace_with_yay
set -l cmd (commandline -b)
switch $cmd
case "*pacman*"
set edited (echo $cmd | sed 's/sudo //g' | sed 's/pacman/yay/g')
case "yay*"
set edited (echo $cmd | sed 's/yay/sudo pacman/g')
end
commandline -r "$edited"
commandline -f repaint
end
bind \cy replace_with_yay
# fff file manager cd on exit
function f
fff $argv
set -q XDG_CACHE_HOME; or set XDG_CACHE_HOME $HOME/.cache
cd (cat $XDG_CACHE_HOME/fff/.fff_d)
end
set -x EDITOR "nvim"
set -x FFF_TRASH_CMD "trash" # make fff's trash function use trash-cli

View file

@ -1,32 +1,49 @@
# This file contains fish universal variable definitions.
# VERSION: 3.0
SETUVAR FZF_DEFAULT_COMMANDS:\x2d\x2dfilepath\x2dword\x20\x2d\x2dcycle
SETUVAR FZF_DEFAULT_OPTS:\x2d\x2dheight\x2040\x25
SETUVAR FZF_ENABLE_OPEN_PREVIEW:1
SETUVAR FZF_LEGACY_KEYBINDINGS:0
SETUVAR FZF_PREVIEW_DIR_CMD:ls
SETUVAR FZF_PREVIEW_FILE_CMD:head\x20\x2dn\x2010\x20\x7c\x20bat\x20\x2d\x2dcolor\x3dalways\x20\x2d\x2ddecorations\x3dnever
SETUVAR FZF_TMUX:1
SETUVAR FZF_TMUX_HEIGHT:40\x25
SETUVAR SXHKD_SHELL:sh
SETUVAR __fish_initialized:3100
SETUVAR fish_color_autosuggestion:555\x1ebrblack
SETUVAR fish_color_cancel:\x2dr
SETUVAR fish_color_command:00cff7
SETUVAR dangerous_colors:000000\x1e083743\x1e445659\x1efdf6e3\x1eb58900\x1ecb4b16\x1edc121f\x1eaf005f\x1e6c71c4\x1e268bd2\x1e2aa198\x1e859900
SETUVAR dangerous_cursors:\x5c033\x5d12\x3b\x23268bd2\x5c007\x1e\x5c033\x5d12\x3b\x23b58900\x5c007\x1e\x5c033\x5d12\x3b\x23af005f\x5c007\x1e\x5c033\x5d12\x3b\x236c71c4\x5c007
SETUVAR dangerous_day:000000\x1e333333\x1e666666\x1effffff\x1effff00\x1eff6600\x1eff0000\x1eff0033\x1e3300ff\x1e00aaff\x1e00ffff\x1e00ff00
SETUVAR dangerous_night:000000\x1e083743\x1e445659\x1efdf6e3\x1eb58900\x1ecb4b16\x1edc121f\x1eaf005f\x1e6c71c4\x1e268bd2\x1e2aa198\x1e859900
SETUVAR dangerous_nocmdhist:c\x1ed\x1ell\x1els\x1em\x1es
SETUVAR dangerous_pwdstyle:short\x1elong\x1enone
SETUVAR dangerous_sessions_active:\x1d
SETUVAR dangerous_sessions_active_pid:\x1d
SETUVAR fish_color_autosuggestion:555
SETUVAR fish_color_cancel:normal
SETUVAR fish_color_command:0087d7
SETUVAR fish_color_comment:990000
SETUVAR fish_color_cwd:green
SETUVAR fish_color_cwd_root:red
SETUVAR fish_color_cwd:008000
SETUVAR fish_color_cwd_root:800000
SETUVAR fish_color_end:009900
SETUVAR fish_color_error:ff0000
SETUVAR fish_color_escape:00a6b2
SETUVAR fish_color_history_current:\x2d\x2dbold
SETUVAR fish_color_history_current:normal
SETUVAR fish_color_host:normal
SETUVAR fish_color_host_remote:yellow
SETUVAR fish_color_match:\x2d\x2dbackground\x3dbrblue
SETUVAR fish_color_match:normal
SETUVAR fish_color_normal:normal
SETUVAR fish_color_operator:00a6b2
SETUVAR fish_color_param:00afff
SETUVAR fish_color_param:0087af
SETUVAR fish_color_quote:999900
SETUVAR fish_color_redirection:00afff
SETUVAR fish_color_search_match:bryellow\x1e\x2d\x2dbackground\x3dbrblack
SETUVAR fish_color_selection:white\x1e\x2d\x2dbold\x1e\x2d\x2dbackground\x3dbrblack
SETUVAR fish_color_search_match:ffff00
SETUVAR fish_color_selection:c0c0c0
SETUVAR fish_color_status:red
SETUVAR fish_color_user:brgreen
SETUVAR fish_color_valid_path:\x2d\x2dunderline
SETUVAR fish_greeting:Willkommen\x20zu\x20fish\x2c\x20der\x20freundlichen\x20interaktiven\x20Shell\x0aType\x20\x60help\x60\x20for\x20instructions\x20on\x20how\x20to\x20use\x20fish
SETUVAR fish_color_user:00ff00
SETUVAR fish_color_valid_path:normal
SETUVAR fish_greeting:\x1d
SETUVAR fish_key_bindings:fish_vi_key_bindings
SETUVAR fish_pager_color_completion:\x1d
SETUVAR fish_pager_color_completion:normal
SETUVAR fish_pager_color_description:B3A06D\x1eyellow
SETUVAR fish_pager_color_prefix:white\x1e\x2d\x2dbold\x1e\x2d\x2dunderline
SETUVAR fish_pager_color_progress:brwhite\x1e\x2d\x2dbackground\x3dcyan

View file

@ -1 +1 @@
/home/leon/.local/share/omf/themes/agnoster/fish_prompt.fish
/home/leon/.local/share/omf/themes/lambda_better/fish_prompt.fish

View file

@ -1,3 +1,2 @@
function fish_user_key_bindings
fzf_key_bindings
end

View file

@ -1 +0,0 @@
/home/leon/.fzf/shell/key-bindings.fish

View file

@ -0,0 +1 @@
/home/leon/.local/share/omf/themes/lambda/fish_prompt.fish

View file

@ -0,0 +1,67 @@
function fish_prompt
# Cache exit status
set -l last_status $status
set -l normal (set_color normal)
set -l white (set_color FFFFFF)
set -l turquoise (set_color 5fdfff)
set -l orange (set_color df5f00)
set -l hotpink (set_color df005f)
set -l blue (set_color blue)
set -l limegreen (set_color 87ff00)
set -l purple (set_color af5fff)
# Configure __fish_git_prompt
set -g __fish_git_prompt_char_stateseparator ' '
set -g __fish_git_prompt_color 5fdfff
set -g __fish_git_prompt_color_flags df5f00
set -g __fish_git_prompt_color_prefix white
set -g __fish_git_prompt_color_suffix white
set -g __fish_git_prompt_showdirtystate true
set -g __fish_git_prompt_showuntrackedfiles true
set -g __fish_git_prompt_showstashstate true
set -g __fish_git_prompt_show_informative_status true
set -l current_user (whoami)
set -l vi_mode (__fish_vi_mode_prompt_real)
set -l git_prompt (__fish_git_prompt " (%s)")
#(pwd|sed "s=$HOME=~=")
set -g fish_prompt_pwd_dir_length 1
echo -n $white'╭─'$vi_mode
echo -n $white'─'$hotpink$current_user$white' in '$limegreen(prompt_pwd)
echo -n $turquoise$git_prompt
if test $last_status -gt 0
echo -n ' '$hotpink$last_status
end
echo
echo -n $white'╰─λ '
echo -n $normal
end
function __fish_vi_mode_prompt_real
set -l turquoise (set_color 5fdfff)
set -l orange (set_color df5f00)
switch $fish_bind_mode
case insert
echo -n "─"
case default
echo -n $turquoise'N'
case visual
echo -n $orange'V'
case replace_one
echo -n $turquoise'R'
end
end
# needed so fish doesn't draw it by itself
function fish_mode_prompt
end
# ⌁

View file

@ -0,0 +1,27 @@
set -l orange '#fe8019'
set -l aqua '#8ec07c'
set -l blue '#83a598'
set -l limegreen '#b8bb26'
set -l purple '#d3869b'
set -l aqua '#8ec07c'
set -l gwhite '#ebdbb2'
set -l gray2 '#665c54'
set -l purple '#d3869b'
set -l gray '#a89984'
set -l yellow '#fabd2f'
#set -U fish_color_command $blue
#set -U fish_color_normal $gwhite
#set -U fish_color_quote $aqua
#set -U fish_color_redirection $orange
#set -U fish_color_param $aqua
#set -U fish_color_comment $gray
#set -U fish_color_match $yellow
#set -U fish_color_search_match $aqua
#set -U fish_color_autosuggestion $gray2
#set -U fish_color_cancel $aqua
#set fish_color_selection
#set fish_color_end
#set fish_color_error
#set fish_color_operator

View file

@ -1 +1,2 @@
file:///home/leon/coding/projects
file:///home/leon/studium/Studium

View file

@ -0,0 +1,77 @@
@define-color theme_fg_color #eff0f1;
@define-color theme_bg_color #31363b;
@define-color theme_text_color #eff0f1;
@define-color theme_base_color #232629;
@define-color theme_view_hover_decoration_color #3daee9;
@define-color theme_hovering_selected_bg_color #3daee9;
@define-color theme_selected_bg_color #3daee9;
@define-color theme_selected_fg_color #eff0f1;
@define-color theme_view_active_decoration_color #3daee9;
@define-color theme_button_background_normal #31363b;
@define-color theme_button_decoration_hover #3daee9;
@define-color theme_button_decoration_focus #3daee9;
@define-color theme_button_foreground_normal #eff0f1;
@define-color theme_button_foreground_active #eff0f1;
@define-color borders #606468;
@define-color warning_color #f67400;
@define-color success_color #27ae60;
@define-color error_color #da4453;
@define-color theme_unfocused_fg_color #eff0f1;
@define-color theme_unfocused_text_color #eff0f1;
@define-color theme_unfocused_bg_color #31363b;
@define-color theme_unfocused_base_color #232629;
@define-color theme_unfocused_selected_bg_color_alt #224e65;
@define-color theme_unfocused_selected_bg_color #224e65;
@define-color theme_unfocused_selected_fg_color #eff0f1;
@define-color theme_button_background_backdrop #31363b;
@define-color theme_button_decoration_hover_backdrop #3daee9;
@define-color theme_button_decoration_focus_backdrop #3daee9;
@define-color theme_button_foreground_backdrop #eff0f1;
@define-color theme_button_foreground_active_backdrop #eff0f1;
@define-color unfocused_borders #606468;
@define-color warning_color_backdrop #f67400;
@define-color success_color_backdrop #27ae60;
@define-color error_color_backdrop #da4453;
@define-color insensitive_fg_color #6e7175;
@define-color insensitive_base_fg_color #65686a;
@define-color insensitive_bg_color #2e3338;
@define-color insensitive_base_color #212427;
@define-color insensitive_selected_bg_color #2e3338;
@define-color insensitive_selected_fg_color #6e7175;
@define-color theme_button_background_insensitive #2e3338;
@define-color theme_button_decoration_hover_insensitive #325b72;
@define-color theme_button_decoration_focus_insensitive #325b72;
@define-color theme_button_foreground_insensitive #6e7175;
@define-color theme_button_foreground_active_insensitive #6e7175;
@define-color insensitive_borders #3e4347;
@define-color warning_color_insensitive #683e19;
@define-color success_color_insensitive #225139;
@define-color error_color_insensitive #5e2e35;
@define-color insensitive_unfocused_fg_color #6e7175;
@define-color theme_unfocused_view_text_color #65686a;
@define-color insensitive_unfocused_bg_color #2e3338;
@define-color theme_unfocused_view_bg_color #212427;
@define-color insensitive_unfocused_selected_bg_color #2e3338;
@define-color insensitive_unfocused_selected_fg_color #6e7175;
@define-color theme_button_background_backdrop_insensitive #2e3338;
@define-color theme_button_decoration_hover_backdrop_insensitive #325b72;
@define-color theme_button_decoration_focus_backdrop_insensitive #325b72;
@define-color theme_button_foreground_backdrop_insensitive #6e7175;
@define-color theme_button_foreground_active_backdrop_insensitive #6e7175;
@define-color unfocused_insensitive_borders #3e4347;
@define-color warning_color_insensitive_backdrop #683e19;
@define-color success_color_insensitive_backdrop #225139;
@define-color error_color_insensitive_backdrop #5e2e35;
@define-color link_color #2980b9;
@define-color link_visited_color #7f8c8d;
@define-color tooltip_text #eff0f1;
@define-color tooltip_background #31363b;
@define-color tooltip_border #606468;
@define-color content_view_bg #232629;
@define-color theme_titlebar_background rgb(49,54,59);
@define-color theme_titlebar_foreground rgb(239,240,241);
@define-color theme_titlebar_background_light #31363b;
@define-color theme_titlebar_foreground_backdrop rgb(127,140,141);
@define-color theme_titlebar_background_backdrop rgb(49,54,59);
@define-color theme_titlebar_foreground_insensitive rgb(127,140,141);
@define-color theme_titlebar_foreground_insensitive_backdrop rgb(127,140,141);

View file

@ -0,0 +1,8 @@
.termite {
padding: 15px;
}
vte-terminal {
padding: 10px;
}
@import 'colors.css';

View file

@ -1,18 +1,25 @@
[settings]
gtk-theme-name="Arc-Darker"
[Settings]
gtk-theme-name=Adwaita-dark
gtk-icon-theme-name=Arc-X-P
gtk-font-name=Cantarell 11
gtk-button-images=1
gtk-cursor-theme-name=capitaine-cursors-light
gtk-cursor-theme-size=0
gtk-toolbar-style=GTK_TOOLBAR_BOTH
gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
gtk-button-images=1
gtk-enable-event-sounds=0
gtk-enable-input-feedback-sounds=0
gtk-font-name=Sans 9
gtk-icon-theme-name=Arc-X-D
gtk-menu-images=1
gtk-enable-event-sounds=1
gtk-enable-input-feedback-sounds=1
;gtk-theme-name=Adwaita-dark
gtk-theme-name=phocus
gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
gtk-toolbar-style=GTK_TOOLBAR_ICONS
gtk-xft-antialias=1
gtk-xft-hinting=1
gtk-xft-hintstyle=hintfull
gtk-xft-hintstyle=hintslight
gtk-xft-rgba=rgb
gtk-application-prefer-dark-theme=true
gtk-decoration-layout=:
;gtk-font-name = DejaVu Sans 1 121
;gtk-font-name = cozette 10
gtk-font-name = xos4 Terminus Regular 12
;gtk-font-name = Terminus 12
;gtk-font-name = cozette 10

View file

@ -1,18 +1,18 @@
# Beware! This file is rewritten by htop when settings are changed in the interface.
# The parser is also very primitive, and not human-friendly.
fields=0 48 17 18 38 39 40 2 46 47 49 1
sort_key=46
sort_key=47
sort_direction=1
hide_threads=0
hide_threads=1
hide_kernel_threads=1
hide_userland_threads=0
hide_userland_threads=1
shadow_other_users=0
show_thread_names=0
show_program_path=1
highlight_base_name=0
highlight_megabytes=1
highlight_threads=1
tree_view=1
tree_view=0
header_margin=1
detailed_cpu_time=0
cpu_count_from_zero=0

View file

@ -1,9 +1,9 @@
include ./theme.conf
include ./gruvbox.conf
#include ./onedark.conf
#shell tmux
#background_opacity 0.95
background_opacity 0.7
background_opacity 1
#font_family VictorMono Nerd Font Semibold
#font_family DejaVuSansMono Nerd
@ -20,7 +20,7 @@ enable_audio_bell no
draw_minimal_borders yes
window_padding_width 0
window_margin_width 0
window_margin_width 10
tab_bar_style powerline
hide_window_decorations yes
placement_strategy top-left

View file

@ -0,0 +1,14 @@
[:0.0]
file=/home/leon/Bilder/wallpapers/wallhaven-ox2gr9.jpg
mode=5
bgcolor=#000000
[xin_0]
file=/home/leon/Bilder/wallpapers/green_leaves.jpg
mode=5
bgcolor=#000000
[xin_1]
file=/home/leon/Bilder/wallpapers/green_leaves.jpg
mode=5
bgcolor=#000000

View file

@ -0,0 +1,12 @@
[geometry]
posx=20
posy=50
sizex=1297
sizey=696
[nitrogen]
view=icon
recurse=true
sort=alpha
icon_caps=false
dirs=/home/leon/Bilder/wallpapers;

View file

@ -14,17 +14,26 @@ glx-copy-from-front = false;
# Shadows -------------------------------- {{{
shadow = true;
shadow-radius = 20;
shadow-offset-x = -20;
shadow-offset-y = -20;
shadow-opacity = 0.6;
#shadow-radius = 20;
#shadow-offset-x = -20;
#shadow-offset-y = -20;
#hadow-radius = 3;
#shadow-offset-x = 3;
#shadow-offset-y = 3;
#shadow-opacity = 0.6;
shadow-radius = 18;
shadow-offset-x = -14;
shadow-offset-y = -10;
shadow-opacity = 1.0;
# shadow-red = 0.0;
# shadow-green = 0.0;
# shadow-blue = 0.0;
shadow-exclude = [
"! name~=''",
"!focused && ! class_g ?='xfce4-notifyd'",
#"!focused && ! class_g ?='xfce4-notifyd'",
#"name *= 'polybar'",
"name = 'Notification'",
"name = 'Plank'",
"name = 'Docky'",
@ -52,21 +61,21 @@ shadow-ignore-shaped = false;
inactive-opacity = 1;
active-opacity = 1;
frame-opacity = 1;
inactive-opacity-override = false;
#inactive-opacity-override = true;
# Dim inactive windows. (0.0 - 1.0)
# inactive-dim = 0.2;
inactive-dim = 1;
# Do not let dimness adjust based on window opacity.
# inactive-dim-fixed = true;
#inactive-dim-fixed = true;
# Blur background of transparent windows. Bad performance with X Render backend. GLX backend is preferred.
blur-background = true;
blur-method = "dual_kawase";
blur-background = false;
#blur-method = "dual_kawase";
#blur-method = "kernel";
blur-strength = 10; # max 20
blur-strength = 20; # max 20
blur-size = 20;
# Blur background of opaque windows with transparent frames as well.
#blur-background-frame = true;
blur-background-frame = false;
# Do not let blur radius adjust based on window opacity.
blur-background-fixed = false;
blur-background-exclude = [
@ -90,7 +99,7 @@ blur-background-exclude = [
# Fading ---------------------------------- {{{
# Fade windows during opacity changes.
fading = true;
fading = false;
# The time between steps in a fade in milliseconds. (default 10).
fade-delta = 4;
# Opacity change between steps while fading in. (default 0.028).
@ -159,7 +168,7 @@ wintypes:
tooltip = {
fade = true;
shadow = true;
opacity = 0.85;
opacity = 1.00;
focus = true;
};
};

View file

@ -0,0 +1,252 @@
;==========================================================
;
;
; ██████╗ ██████╗ ██╗ ██╗ ██╗██████╗ █████╗ ██████╗
; ██╔══██╗██╔═══██╗██║ ╚██╗ ██╔╝██╔══██╗██╔══██╗██╔══██╗
; ██████╔╝██║ ██║██║ ╚████╔╝ ██████╔╝███████║██████╔╝
; ██╔═══╝ ██║ ██║██║ ╚██╔╝ ██╔══██╗██╔══██║██╔══██╗
; ██║ ╚██████╔╝███████╗██║ ██████╔╝██║ ██║██║ ██║
; ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝
;
; ; To learn more about how to configure Polybar
; go to https://github.com/polybar/polybar
;
; The README contains a lot of information
;
;==========================================================
;; Colors ------------------------------------------- {{{
[colors]
;background = ${xrdb:color0:#222}
;background = #bb282828
;background = #88282828
;background = #88282828
background = #aa282c34
;background = #ff282c34
;background = #222
background-alt = #444
;foreground = ${xrdb:color7:#222}
foreground = #dfdfdf
foreground-alt = #888
primary = #ffb52a
secondary = #e60053
alert = #bd2c40
;; }}}
;; Bar config ----------------------------------------- {{{
[bar/main]
width = 100%:-28
height = 30
offset-x = 14
offset-y = 7
radius = 0
locale = de_DE.UTF-8
enable-ipc = true
padding = 0
;; center centered modules on screen, not between other modules
fixed-center = true
separator = "%{F#aaa}|%{F-}"
separator-padding = 1
background = ${colors.background}
foreground = ${colors.foreground}
line-size = 3
line-color = #f00
border-size = 0
border-color = #00000000
padding-left = 0
padding-right = 2
module-margin-left = 1
module-margin-right = 2
font-0 = fixed:pixelsize=10;1
;font-1 = unifont:fontformat=truetype:size=8:antialias=false;0
;font-2 = siji:pixelsize=10;1
;font-7 = NotoEmoji:size=7;
;font-7 = "JetBrainsMono Nerd Font:size=7"
;font-0 = "JetBrainsMono Nerd Font:fontformat=truetype:size=10;2"
;font-0 = "Iosevka Nerd Font:size=10;1"
;font-1 = "NotoEmoji:scale=10;1"
font-1 = "Symbola:size=10;1"
font-2 = FontAwesome5Free:style=Solid:size=8;0
;font-1 = "FontAwesome:fontformat=truetype:size=12;1"
modules-left = xmonad
modules-center = timerDisplay spotify mpd gitlab-pipeline player-mpv-tail date
modules-right = pulseaudio-control updates-arch pulseaudio filesystem memory cpu
; network-traffic
tray-position = right
tray-padding = 2
tray-maxsize = 16
tray-background = ${colors.background}
;tray-background = #0063ff
cursor-click = pointer
cursor-scroll = ns-resize
;; }}}
;; MODULES ----------------------------------------------- {{{
; show's currently focussed window, already contained in xmonad module
[module/xwindow]
type = internal/xwindow
label = %title:0:30:...%
[module/filesystem]
type = internal/fs
interval = 25
mount-0 = /
format-mounted = <label-mounted>
;format-mounted-prefix = "disk: "
;format-mounted-prefix-foreground = ${colors.foreground-alt}
format-mounted-prefix = "%{F#0fca42}  %{F-} "
;format-mounted-prefix = "  "
;format-mounted-underline = #0fca42
;label-mounted = %{F#0a81f5}%mountpoint%%{F-}: %percentage_used%%
label-mounted = %percentage_used%%
label-unmounted = %mountpoint% not mounted
label-unmounted-foreground = ${colors.foreground-alt}
[module/mpd]
type = internal/mpd
format-online = <label-song> <icon-prev> <icon-stop> <toggle> <icon-next>
icon-prev = 
icon-stop = 
icon-play = 
icon-pause = 
icon-next = 
label-song-maxlen = 25
label-song-ellipsis = true
[module/cpu]
type = internal/cpu
interval = 2
;format-prefix = "cpu: "
;format-prefix-foreground = ${colors.foreground-alt}
format-prefix = "%{F#f9a000}  %{F-} "
;format-prefix = "  "
#format-underline = #f9a000
label = %percentage:2%%
[module/memory]
type = internal/memory
interval = 2
;format-prefix = "mem: "
;format-prefix-foreground = ${colors.foreground-alt}
format-prefix = "%{F#0a6cf5}  %{F-} "
;format-prefix = " "
#format-underline = #0a6cf5
label = %percentage_used%%
[module/date]
type = internal/date
interval = 5
date = %a %d-%m-%y
date-alt = %d-%m-%Y
time = %H:%M
time-alt = %H:%M:%S
;format-prefix = "%{F#fbff8c}  %{F-}"
;format-prefix = "  "
;format-prefix-foreground = ${colors.foreground-alt}
;#format-underline = #4bffdc
#format-underline = #fbff8c
label = %time% | %date%
[module/xmonad]
type = custom/script
exec = xmonad-log
tail = true
[module/timerDisplay]
type = custom/script
exec = "[ -f ~/scripts/remainingTime.txt ] && head -n 1 scripts/remainingTime.txt"
interval = 1
;[module/gitlab-pipeline]
;type = custom/script
;exec = ~/scripts/fetch-running-pipelines.sh
;interval = 10
[module/info-pingrtt]
type = custom/script
exec = ~/.config/polybar/polybar-scripts/info-pingrtt.sh
interval = 10
[module/player-mpv-tail]
type = custom/script
exec = ~/.config/polybar/polybar-scripts/player-mpv-tail.py -t 42 -c '#abb2bf'
tail = true
click-left = ~/.config/polybar/polybar-scripts/player-mpv-tail.py -p pause
click-middle = ~/.config/polybar/polybar-scripts/player-mpv-tail.py -p playlist-pos -1
click-right = ~/.config/polybar/polybar-scripts/player-mpv-tail.py -p playlist-pos +1
scroll-up = ~/.config/polybar/polybar-scripts/player-mpv-tail.py -p time-pos -10
scroll-down = ~/.config/polybar/polybar-scripts/player-mpv-tail.py -p time-pos +10
[module/network-traffic]
; configure interval, etc in script
type = custom/script
exec = ~/.config/polybar/polybar-scripts/network-traffic.sh
tail = true
[module/spotify]
type = custom/script
interval = 1
format = "<label> %{A1:dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Previous:}%{A-} %{A1:dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Next:}%{A-}"
exec = python ~/.config/polybar/polybar-scripts/spotify_status.py -f '{artist} - {song} {play_pause}'
click-left = "dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause"
exec-if = "pgrep spotify"
#format-underline = #1db954
[module/updates-arch]
type = custom/script
exec = ~/.config/polybar/polybar-scripts/updates-arch-combined.sh
interval = 600
[module/pulseaudio-control]
type = custom/script
tail = true
label = %output%
click-right = exec pavucontrol &
exec = bash ~/.config/polybar/polybar-scripts/pulseaudio-control.bash listen
click-left = bash ~/.config/polybar/polybar-scripts/pulseaudio-control.bash togmute
click-middle = bash ~/.config/polybar/polybar-scripts/pulseaudio-control.bash next-sink
scroll-up = bash ~/.config/polybar/polybar-scripts/pulseaudio-control.bash up
scroll-down = bash ~/.config/polybar/polybar-scripts/pulseaudio-control.bash down
label-padding = 2
label-foreground = ${colors.foreground}
[global/wm]
margin-bottom = -7

View file

@ -16,18 +16,21 @@
;
;==========================================================
;; Colors ------------------------------------------- {{{
[colors]
;background = ${xrdb:color0:#222}
;background = #bb282828
;background = #88282828
background = #55282828
;background = #88282828
;background = #aa282c34
background = #ff282828
;background = #222
background-alt = #444
;foreground = ${xrdb:color7:#222}
foreground = #dfdfdf
foreground-alt = #888
foreground = #fbf1c7
foreground-alt = #ebdbb2
primary = #ffb52a
secondary = #e60053
alert = #bd2c40
@ -36,12 +39,24 @@ alert = #bd2c40
;; Bar config ----------------------------------------- {{{
[bar/main]
width = 100%:-28
height = 30
[global/wm]
margin-bottom = 0
offset-x = 14
offset-y = 7
[bar/main]
monitor = ${env:MONITOR:}
override-redirect = true
;wm-restack = xmonad
;width = 100%:-28
;height = 30
;offset-x = 14
;offset-y = 7
width = 100%
height = 30
offset-x = 0
offset-y = 0
radius = 0
@ -68,32 +83,37 @@ border-color = #00000000
padding-left = 0
padding-right = 2
module-margin-left = 1
module-margin-right = 2
module-margin-left = 0
module-margin-right = 0
font-0 = fixed:pixelsize=10;1
;font-0 = fixed:pixelsize=10;2
;font-1 = unifont:fontformat=truetype:size=8:antialias=false;0
;font-2 = siji:pixelsize=10;1
;font-7 = NotoEmoji:size=7;
;font-7 = "JetBrainsMono Nerd Font:size=7"
;font-0 = "JetBrainsMono Nerd Font:fontformat=truetype:size=10;2"
;font-0 = "Iosevka Nerd Font:size=10;1"
;font-1 = "NotoEmoji:scale=10;1"
font-1 = "Symbola:size=10;1"
font-2 = FontAwesome5Free:style=Solid:size=8;0
;font-0 = "JetbrainsMono Bold:size=10;2"
;font-0 = "JetbrainsMono:weight=medium:size=10;2"
;font-0 = "scientifica:size=10;2"
;font-0 = "Terminus (TTF):size=12;2"
font-0 = "cherry:size=12;2"
;font-0 = "cozette:size=10;2"
font-1 = "Symbola:size=8;1"
font-2 = "FontAwesome5Free:style=Solid:size=8;2"
font-3 = "Iosevka Nerd Font:size=10;2"
font-4 = "Symbola:size=9;2"
;font-1 = "FontAwesome:fontformat=truetype:size=12;1"
modules-left = xmonad
modules-center = timerDisplay spotify mpd gitlab-pipeline player-mpv-tail date
modules-right = pulseaudio-control updates-arch pulseaudio filesystem memory cpu
; network-traffic
modules-center = timerDisplay spotify gitlab-pipeline player-mpv-tail time
modules-right = pulseaudio-control updates-arch gpuinfo filesystem memory cpu date
tray-position = right
tray-position = ${env:TRAY_POSITION:right}
tray-padding = 2
tray-maxsize = 16
tray-background = ${colors.background}
;tray-background = #0063ff
cursor-click = pointer
cursor-scroll = ns-resize
@ -102,10 +122,6 @@ cursor-scroll = ns-resize
;; MODULES ----------------------------------------------- {{{
; show's currently focussed window, already contained in xmonad module
[module/xwindow]
type = internal/xwindow
label = %title:0:30:...%
[module/filesystem]
type = internal/fs
@ -113,92 +129,48 @@ interval = 25
mount-0 = /
format-mounted = <label-mounted>
;format-mounted-prefix = "disk: "
;format-mounted-prefix-foreground = ${colors.foreground-alt}
format-mounted-prefix = "%{F#0fca42}  %{F-} "
;format-mounted-prefix = "  "
;format-mounted-underline = #0fca42
;label-mounted = %{F#0a81f5}%mountpoint%%{F-}: %percentage_used%%
format-mounted-prefix = "%{F#8ec07c}%{F-} "
label-mounted = %percentage_used%%
label-unmounted = %mountpoint% not mounted
label-unmounted-foreground = ${colors.foreground-alt}
[module/mpd]
type = internal/mpd
format-online = <label-song> <icon-prev> <icon-stop> <toggle> <icon-next>
icon-prev =
icon-stop =
icon-play =
icon-pause =
icon-next =
label-song-maxlen = 25
label-song-ellipsis = true
[module/cpu]
type = internal/cpu
interval = 2
;format-prefix = "cpu: "
;format-prefix-foreground = ${colors.foreground-alt}
format-prefix = "%{F#f9a000}  %{F-} "
;format-prefix = "  "
#format-underline = #f9a000
format-prefix = "%{A1:~/.config/polybar/polybar-scripts/toggle_gpuinfo_window.sh 'top':}%{F#fe8019}%{F-} %{A}"
label = %percentage:2%%
click-left = ""
[module/memory]
type = internal/memory
interval = 2
;format-prefix = "mem: "
;format-prefix-foreground = ${colors.foreground-alt}
format-prefix = "%{F#0a6cf5}  %{F-} "
;format-prefix = " "
#format-underline = #0a6cf5
format-prefix = "%{F#83a598}%{F-} "
label = %percentage_used%%
[module/date]
type = internal/date
interval = 5
date = %a %d-%m-%y
date-alt = %d-%m-%Y
time = %H:%M
time-alt = %H:%M:%S
interval = 500
date = %a, %d.%m.%Y
label = "%date%"
;format-prefix = "%{F#fbff8c}  %{F-}"
;format-prefix = "  "
;format-prefix-foreground = ${colors.foreground-alt}
;#format-underline = #4bffdc
#format-underline = #fbff8c
label = %time% | %date%
[module/time]
type = internal/date
interval = 1
time = %H:%M:%S
label = "%time%"
[module/xmonad]
type = custom/script
exec = xmonad-log
exec = "~/.config/polybar/polybar-scripts/xmonad-status.sh"
label = " %output%"
tail = true
[module/timerDisplay]
type = custom/script
exec = "[ -f ~/scripts/remainingTime.txt ] && head -n 1 scripts/remainingTime.txt"
interval = 1
;[module/gitlab-pipeline]
;type = custom/script
;exec = ~/scripts/fetch-running-pipelines.sh
;interval = 10
[module/info-pingrtt]
type = custom/script
exec = ~/.config/polybar/polybar-scripts/info-pingrtt.sh
interval = 10
[module/player-mpv-tail]
type = custom/script
exec = ~/.config/polybar/polybar-scripts/player-mpv-tail.py -t 42 -c '#abb2bf'
exec = ~/.config/polybar/polybar-scripts/player-mpv-tail.py -t 42 -c '#8ec07c'
tail = true
click-left = ~/.config/polybar/polybar-scripts/player-mpv-tail.py -p pause
click-middle = ~/.config/polybar/polybar-scripts/player-mpv-tail.py -p playlist-pos -1
@ -213,7 +185,6 @@ type = custom/script
exec = ~/.config/polybar/polybar-scripts/network-traffic.sh
tail = true
[module/spotify]
type = custom/script
interval = 1
@ -221,8 +192,6 @@ format = "<label> %{A1:dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spo
exec = python ~/.config/polybar/polybar-scripts/spotify_status.py -f '{artist} - {song} {play_pause}'
click-left = "dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause"
exec-if = "pgrep spotify"
#format-underline = #1db954
[module/updates-arch]
type = custom/script
@ -230,21 +199,21 @@ exec = ~/.config/polybar/polybar-scripts/updates-arch-combined.sh
interval = 600
[module/gpuinfo]
type = custom/script
exec = "sudo ~/scripts/gpuinfo.sh"
format = "%{F#d3869b}%{T3}%{T-}%{F-} <label>"
click-left = "~/.config/polybar/polybar-scripts/toggle_gpuinfo_window.sh 'sudo /home/leon/scripts/gpuinfo.sh --watch'"
interval = 2
[module/pulseaudio-control]
type = custom/script
tail = true
label = %output%
label-foreground = ${colors.foreground}
click-right = exec pavucontrol &
exec = bash ~/.config/polybar/polybar-scripts/pulseaudio-control.bash listen
click-left = bash ~/.config/polybar/polybar-scripts/pulseaudio-control.bash togmute
click-middle = bash ~/.config/polybar/polybar-scripts/pulseaudio-control.bash next-sink
click-middle = bash ~/.config/polybar/polybar-scripts/pulseaudio-control.bash togmute
click-left = bash ~/.config/polybar/polybar-scripts/pulseaudio-control.bash next-sink
scroll-up = bash ~/.config/polybar/polybar-scripts/pulseaudio-control.bash up
scroll-down = bash ~/.config/polybar/polybar-scripts/pulseaudio-control.bash down
label-padding = 2
label-foreground = ${colors.foreground}
[global/wm]
margin-bottom = -7

View file

@ -2,4 +2,23 @@
killall -q polybar
echo "---" | tee -a /tmp/polybar1.log /tmp/polybar2.log
polybar --config=/home/leon/.config/polybar/config.ini main >>/tmp/polybar1.log 2>&1 &
outputs=$(xrandr --query | grep " connected" | cut -d" " -f1)
tray_output=HDMI-A-0
for m in $outputs; do
if [[ $m != "DisplayPort-1" ]]; then
tray_output=$m
fi
done
for m in $outputs; do
export MONITOR=$m
export TRAY_POSITION=none
if [[ $m == "$tray_output" ]]; then
TRAY_POSITION=right
fi
MONITOR=$m polybar -r --config=/home/leon/.config/polybar/config.ini main & # >>/tmp/polybar1.log 2>&1 &
done
#polybar --config=/home/leon/.config/polybar/config.ini main >>/tmp/polybar1.log 2>&1 &

View file

@ -21,6 +21,8 @@ SINK_ICON=""
# the names of your active sinks, use `pactl list sinks short`.
SINK_BLACKLIST=(
"alsa_output.pci-0000_00_1f.3.iec958-stereo"
"alsa_output.pci-0000_28_00.4.iec958-stereo"
"alsa_output.pci-0000_26_00.1.hdmi-stereo-extra2"
)
# Maps PulseAudio sink names to human-readable names
@ -44,7 +46,7 @@ function getCurSink() {
# Saves the sink passed by parameter's volume into a variable named `curVol`.
function getCurVol() {
curVol=$(pacmd list-sinks | grep -A 15 'index: '"$1"'' | grep 'volume:' | grep -E -v 'base volume:' | awk -F : '{print $3}' | grep -o -P '.{0,3}%' | sed s/.$// | tr -d ' ')
curVol=$(pacmd list-sinks | grep -A 15 'index: '"$1"'' | grep 'volume:' | grep -E -v 'base volume:' | awk -F : '{print $3}' | grep -o -P '.{0,3}%' | sed 's/.$//' | tr -d ' ')
}
@ -288,9 +290,9 @@ function output() {
# Showing the formatted message
if [ "$isMuted" = "yes" ]; then
echo "${MUTED_COLOR}${MUTED_ICON}${curVol}% ${SINK_ICON}${nickname}${END_COLOR}"
echo "${MUTED_COLOR}${nickname} ${curVol}%${END_COLOR}"
else
echo "${volIcon}${curVol}% ${SINK_ICON}${nickname}"
echo "${nickname} ${curVol}%"
fi
}

View file

@ -0,0 +1,7 @@
#!/bin/bash
if [[ -n $(xdotool search --class bar_system_status_indicator) ]]; then
xdotool search --class bar_system_status_indicator windowkill &
else
termite --class bar_system_status_indicator -e "$1" &
fi

View file

@ -0,0 +1,33 @@
#!/bin/bash
format_workspaces() {
while read -r line; do
echo "$line" \
| sed 's/__active__/◆/g' \
| sed 's/__urgent__/◆/g' \
| sed 's/__hidden__/◆/g' \
| sed 's/__empty__/◇/g' \
#| sed 's/__active__/⬤/g' \
#| sed 's/__urgent__/⬤/g' \
#| sed 's/__hidden__/⬤/g' \
#| sed 's/__empty__/⭕/g' \
#| perl -pe 's/((?:%{F#888974*?}%{A1:.*} __empty__ %{A}%{F-} ?)*)(?!.*\1)//g'
done
}
if [ "$MONITOR" = "HDMI-A-0" ]; then
tail -F /tmp/xmonad-state-bar1 | stdbuf -o0 cat | format_workspaces
else
tail -F /tmp/xmonad-state-bar0 | stdbuf -o0 cat | format_workspaces
fi
#while true; do
#if read -r line </tmp/.xmonad-state-bar0; then
#echo "$line"
#fi
#done

View file

@ -6,5 +6,5 @@
config_version: 2
settings:
content.register_protocol_handler:
https://mail.google.com?extsrc=mailto&url=%25s: false
content.notifications:
https://www.reddit.com: false

View file

@ -8,3 +8,12 @@ https://github.com/raine/ramda-cli raine/ramda-cli: A CLI tool for processing da
http://dbad-license.org/ DBAD by philsturgeon
https://github.com/rhysd/kiro-editor rhysd/kiro-editor: A terminal UTF-8 text editor written in Rust 📝🦀
http://brson.github.io/2016/11/30/starting-with-error-chain Starting a new Rust project right, with error-chain
https://docs.google.com/document/d/1SH-B4BkypsOB69B9e5HbTmhrlEHNq5M6-nuqIDzzOW4/edit#heading=h.r7oinwx5vtl9 Lebenslauf 2020 - Google Docs
https://github.com/elenapan/dotfiles elenapan/dotfiles: There is no place like ~/
https://lebenslauf.com/?theme=Belleza&utm_source=tabellarischer-lebenslauf.net&utm_medium=button&utm_campaign=tabellarischer-lebenslauf.net&utm_content=template-page Lebenslauf für Bewerbung online schreiben + PDF
https://rust-unofficial.github.io/too-many-lists/index.html Introduction - Learning Rust With Entirely Too Many Linked Lists
https://wiki.haskell.org/GHC_optimisations#Fusion GHC optimisations - HaskellWiki
https://github.com/ViktorNova/architect ViktorNova/architect: Automatically builds native packages for any Linux distribution using the source code repositories from Arch Linux and the Arch User Repository (AUR)
https://stackoverflow.com/questions/38252123/piping-tail-f-to-cut-to-sed-produces-no-output linux - Piping tail -f to cut to sed produces no output - Stack Overflow
https://start.duckduckgo.com/ DuckDuckGo — Privacy, simplified.
http://hackage.haskell.org/package/xmonad-eval xmonad-eval: Module for evaluation Haskell expressions in the running xmonad instance

View file

@ -1,6 +1,6 @@
import dracula.draw
import gruvboxy.draw
dracula.draw.blood(c, {
gruvboxy.draw.blood(c, {
'spacing': {
'vertical': 4,
'horizontal': 8
@ -10,6 +10,9 @@ dracula.draw.blood(c, {
# config.load_autoconfig()
c.backend = 'webengine'
c.scrolling.bar = "always" # "when-searching"
c.content.user_stylesheets = "user.css"
config.unbind("<Ctrl-tab>")
config.unbind("d")
config.bind("Q", "tab-close")

View file

@ -0,0 +1,2 @@
/bookmarks/
quickmarks

View file

@ -0,0 +1,31 @@
### [qutebrowser](https://www.qutebrowser.org/)
#### Install using Git
If you are a git user, you can install the theme and keep up to date by cloning the repo:
$ git clone https://github.com/dracula/qutebrowser-dracula-theme.git dracula
#### Install manually
Download using the [GitHub .zip download](https://github.com/dracula/qutebrowser.git) option and unzip.
#### Activating theme
- Find your *[qutebrowser configuration directory](https://www.qutebrowser.org/doc/help/configuring.html#configpy)* (see e.g. `:version` in qutebrowser). This folder should be located at the "config" location listed on qute://version, which is typically ~/.config/qutebrowser/ on Linux, ~/.qutebrowser/ on macOS, and %APPDATA%/qutebrowser/config/ on Windows.
- Move the repository folder to `dracula` inside the configuration directory.
- In your [qutebrowser config.py file](https://www.qutebrowser.org/doc/help/configuring.html#configpy), include the following:
```python
import dracula.draw
# Load existing settings made via :set
config.load_autoconfig()
dracula.draw.blood(c, {
'spacing': {
'vertical': 6,
'horizontal': 8
}
})
```

View file

@ -0,0 +1,294 @@
# check c.colors.statusbar.insert.bg = palette['background-alt']
# was: background-attention
def blood(c, options = {}):
palette = {
'background': '#282828',
'background-alt': '#282828',
'background-attention': '#504945',
'border': '#282a36',
'current-line': '#44475a',
'selection': '#444',
'foreground': '#fbf1c7',
'foreground-alt': '#ebdbb2',
'foreground-attention': '#fe8019',
'comment': '#6272a4',
'cyan': '#8be9fd',
'green': '#8ec07c',
'orange': '#fe8019',
'pink': '#d3869b',
'purple': '#bd93f9',
'red': '#fb4934',
'yellow': '#fabd2f'
}
spacing = options.get('spacing', {
'vertical': 5,
'horizontal': 5
})
padding = options.get('padding', {
'top': spacing['vertical'],
'right': spacing['horizontal'],
'bottom': spacing['vertical'],
'left': spacing['horizontal']
})
## Background color of the completion widget category headers.
c.colors.completion.category.bg = palette['background']
## Bottom border color of the completion widget category headers.
c.colors.completion.category.border.bottom = palette['border']
## Top border color of the completion widget category headers.
c.colors.completion.category.border.top = palette['border']
## Foreground color of completion widget category headers.
c.colors.completion.category.fg = palette['foreground']
## Background color of the completion widget for even rows.
c.colors.completion.even.bg = palette['background']
## Background color of the completion widget for odd rows.
c.colors.completion.odd.bg = palette['background-alt']
## Text color of the completion widget.
c.colors.completion.fg = palette['foreground']
## Background color of the selected completion item.
c.colors.completion.item.selected.bg = palette['selection']
## Bottom border color of the selected completion item.
c.colors.completion.item.selected.border.bottom = palette['selection']
## Top border color of the completion widget category headers.
c.colors.completion.item.selected.border.top = palette['selection']
## Foreground color of the selected completion item.
c.colors.completion.item.selected.fg = palette['foreground']
## Foreground color of the matched text in the completion.
c.colors.completion.match.fg = palette['orange']
## Color of the scrollbar in completion view
c.colors.completion.scrollbar.bg = palette['background']
## Color of the scrollbar handle in completion view.
c.colors.completion.scrollbar.fg = palette['foreground']
## Background color for the download bar.
c.colors.downloads.bar.bg = palette['background']
## Background color for downloads with errors.
c.colors.downloads.error.bg = palette['background']
## Foreground color for downloads with errors.
c.colors.downloads.error.fg = palette['red']
## Color gradient stop for download backgrounds.
c.colors.downloads.stop.bg = palette['background']
## Color gradient interpolation system for download backgrounds.
## Type: ColorSystem
## Valid values:
## - rgb: Interpolate in the RGB color system.
## - hsv: Interpolate in the HSV color system.
## - hsl: Interpolate in the HSL color system.
## - none: Don't show a gradient.
c.colors.downloads.system.bg = 'none'
## Background color for hints. Note that you can use a `rgba(...)` value
## for transparency.
c.colors.hints.bg = palette['background']
## Font color for hints.
c.colors.hints.fg = palette['purple']
## Hints
c.hints.border = '1px solid ' + palette['background-alt']
## Font color for the matched part of hints.
c.colors.hints.match.fg = palette['foreground-alt']
## Background color of the keyhint widget.
c.colors.keyhint.bg = palette['background']
## Text color for the keyhint widget.
c.colors.keyhint.fg = palette['purple']
## Highlight color for keys to complete the current keychain.
c.colors.keyhint.suffix.fg = palette['selection']
## Background color of an error message.
c.colors.messages.error.bg = palette['background']
## Border color of an error message.
c.colors.messages.error.border = palette['background-alt']
## Foreground color of an error message.
c.colors.messages.error.fg = palette['red']
## Background color of an info message.
c.colors.messages.info.bg = palette['background']
## Border color of an info message.
c.colors.messages.info.border = palette['background-alt']
## Foreground color an info message.
c.colors.messages.info.fg = palette['comment']
## Background color of a warning message.
c.colors.messages.warning.bg = palette['background']
## Border color of a warning message.
c.colors.messages.warning.border = palette['background-alt']
## Foreground color a warning message.
c.colors.messages.warning.fg = palette['red']
## Background color for prompts.
c.colors.prompts.bg = palette['background']
# ## Border used around UI elements in prompts.
c.colors.prompts.border = '1px solid ' + palette['background-alt']
## Foreground color for prompts.
c.colors.prompts.fg = palette['cyan']
## Background color for the selected item in filename prompts.
c.colors.prompts.selected.bg = palette['selection']
## Background color of the statusbar in caret mode.
c.colors.statusbar.caret.bg = palette['background']
## Foreground color of the statusbar in caret mode.
c.colors.statusbar.caret.fg = palette['orange']
## Background color of the statusbar in caret mode with a selection.
c.colors.statusbar.caret.selection.bg = palette['background']
## Foreground color of the statusbar in caret mode with a selection.
c.colors.statusbar.caret.selection.fg = palette['orange']
## Background color of the statusbar in command mode.
c.colors.statusbar.command.bg = palette['background']
## Foreground color of the statusbar in command mode.
c.colors.statusbar.command.fg = palette['pink']
## Background color of the statusbar in private browsing + command mode.
c.colors.statusbar.command.private.bg = palette['background']
## Foreground color of the statusbar in private browsing + command mode.
c.colors.statusbar.command.private.fg = palette['foreground-alt']
## Background color of the statusbar in insert mode.
c.colors.statusbar.insert.bg = palette['background-alt']
## Foreground color of the statusbar in insert mode.
c.colors.statusbar.insert.fg = palette['foreground-attention']
## Background color of the statusbar.
c.colors.statusbar.normal.bg = palette['background']
## Foreground color of the statusbar.
c.colors.statusbar.normal.fg = palette['foreground']
## Background color of the statusbar in passthrough mode.
c.colors.statusbar.passthrough.bg = palette['background']
## Foreground color of the statusbar in passthrough mode.
c.colors.statusbar.passthrough.fg = palette['orange']
## Background color of the statusbar in private browsing mode.
c.colors.statusbar.private.bg = palette['background-alt']
## Foreground color of the statusbar in private browsing mode.
c.colors.statusbar.private.fg = palette['foreground-alt']
## Background color of the progress bar.
c.colors.statusbar.progress.bg = palette['background']
## Foreground color of the URL in the statusbar on error.
c.colors.statusbar.url.error.fg = palette['red']
## Default foreground color of the URL in the statusbar.
c.colors.statusbar.url.fg = palette['foreground']
## Foreground color of the URL in the statusbar for hovered links.
c.colors.statusbar.url.hover.fg = palette['cyan']
## Foreground color of the URL in the statusbar on successful load
c.colors.statusbar.url.success.http.fg = palette['green']
## Foreground color of the URL in the statusbar on successful load
c.colors.statusbar.url.success.https.fg = palette['green']
## Foreground color of the URL in the statusbar when there's a warning.
c.colors.statusbar.url.warn.fg = palette['yellow']
## Status bar padding
c.statusbar.padding = padding
## Background color of the tab bar.
## Type: QtColor
c.colors.tabs.bar.bg = palette['background']
## Background color of unselected even tabs.
## Type: QtColor
c.colors.tabs.even.bg = palette['background']
## Foreground color of unselected even tabs.
## Type: QtColor
c.colors.tabs.even.fg = palette['foreground']
## Color for the tab indicator on errors.
## Type: QtColor
c.colors.tabs.indicator.error = palette['red']
## Color gradient start for the tab indicator.
## Type: QtColor
c.colors.tabs.indicator.start = palette['orange']
## Color gradient end for the tab indicator.
## Type: QtColor
c.colors.tabs.indicator.stop = palette['green']
## Color gradient interpolation system for the tab indicator.
## Type: ColorSystem
## Valid values:
## - rgb: Interpolate in the RGB color system.
## - hsv: Interpolate in the HSV color system.
## - hsl: Interpolate in the HSL color system.
## - none: Don't show a gradient.
c.colors.tabs.indicator.system = 'none'
## Background color of unselected odd tabs.
## Type: QtColor
c.colors.tabs.odd.bg = palette['background']
## Foreground color of unselected odd tabs.
## Type: QtColor
c.colors.tabs.odd.fg = palette['foreground']
# ## Background color of selected even tabs.
# ## Type: QtColor
c.colors.tabs.selected.even.bg = palette['selection']
# ## Foreground color of selected even tabs.
# ## Type: QtColor
c.colors.tabs.selected.even.fg = palette['foreground']
# ## Background color of selected odd tabs.
# ## Type: QtColor
c.colors.tabs.selected.odd.bg = palette['selection']
# ## Foreground color of selected odd tabs.
# ## Type: QtColor
c.colors.tabs.selected.odd.fg = palette['foreground']
## Tab padding
c.tabs.padding = padding
c.tabs.indicator.width = 1
c.tabs.favicons.scale = 1

View file

@ -0,0 +1,21 @@
# Dracula for [qutebrowser](https://www.qutebrowser.org/)
> A dark theme for [qutebrowser](https://www.qutebrowser.org/).
![Screenshot](./screenshot.png)
## Install
All instructions can be found at [draculatheme.com/qutebrowser](https://draculatheme.com/qutebrowser).
## Team
This theme is maintained by the following person(s) and a bunch of [awesome contributors](https://github.com/dracula/qutebrowser/graphs/contributors).
[![Evan Nagle](https://avatars2.githubusercontent.com/u/556537?s=88&v=4&s=70)](https://github.com/evannagle) |
--- |
[Evan Nagle](https://github.com/evannagle) |
## License
[MIT License](./LICENSE)

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 KiB

View file

@ -1,8 +1,8 @@
[FileDialog]
history=file:///home/leon/Downloads, file:///home/leon/coding/projects/pipr/target/release, file:///home/leon/Bilder/screenshots, file:///home/leon/coding/projects/pipr/target/x86_64-unknown-linux-musl/release, file:///home/leon/studium/Studium/Sem4/verteilteSysteme/Klausur2003
lastVisited=file:///home/leon/coding/projects/pipr/target/release
history=file:///home/leon/coding/projects/pipr/target/x86_64-unknown-linux-musl/release, file:///home/leon/studium/Studium/Sem4/verteilteSysteme/Klausur2003, file:///home/leon, file:///home/leon/Downloads, file:///home/leon/Dokumente
lastVisited=file:///home/leon
qtVersion=5.14.2
shortcuts=file:, file:///home/leon
sidebarWidth=98
treeViewHeader=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x3\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2\x94\0\0\0\x4\x1\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x4\0\0\0\xe6\0\0\0\x1\0\0\0\0\0\0\0?\0\0\0\x1\0\0\0\0\0\0\0@\0\0\0\x1\0\0\0\0\0\0\x1/\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\xff\xff\xff\xff)
viewMode=Detail
viewMode=List

View file

@ -4,3 +4,4 @@ confluence https://confluence-student.it.hs-heilbronn.de/display/AIB/AIB_LabSWP_
bitbucket https://bitbucket-student.it.hs-heilbronn.de/projects/LABAIB
ilias https://ilias.hs-heilbronn.de/ilias.php?baseClass=ilPersonalDesktopGUI&cmd=jumpToSelectedItems
git-xware https://git.xware-gmbh.de/xware
THE solution https://stackoverflow.com/questions/38252123/piping-tail-f-to-cut-to-sed-produces-no-output

View file

@ -1,27 +1,16 @@
::-webkit-scrollbar {
width: 8px;
height: 8px;
width: 8px !important;
height: 8px !important;
}
::-webkit-scrollbar-track:vertical {
background: black;
border-left: 1px solid black;
::-webkit-scrollbar-track {
background-color: #282828;
}
::-webkit-scrollbar-thumb:vertical {
background: white;
border-left: 1px solid black;
}
::-webkit-scrollbar-track:horizontal {
background: white;
border-radius: 4px;
}
::-webkit-scrollbar-thumb:horizontal {
background: white;
border-radius: 4px;
box-shadow: inset 0 0 8px black;
::-webkit-scrollbar-thumb {
background-color: silver;
border: 2px solid #282828;
border-radius: 3px;
}
::-webkit-scrollbar-corner {

146
files/.config/sxhkd/sxhkdrc Normal file
View file

@ -0,0 +1,146 @@
super + Escape
pkill -USR1 -x sxhkd
super + shift + Return
alacritty
super + p
rofi -show run -theme ~/scripts/rofi-scripts/default_theme.rasi
super + shift + p
rofi -modi drun -show drun -theme ~/scripts/rofi-scripts/default_theme.rasi
#
# bspwm hotkeys
#
super + ctrl + shift + q
bspc quit
# restart bspwm
super + q
bspc wm -r
# close a window
super + ctrl + shift + c
bspc node -c
# alternate between the tiled and monocle layout
super + m
bspc desktop -l next
# send the newest marked node to the newest preselected node
super + alt + comma
bspc node newest.marked.local -n newest.!automatic.local
super + Return
bspc node -s biggest.local
#
# state/flags
#
# set the window state
super + {t,shift + t,s,f}
bspc node -t {tiled,pseudo_tiled,floating,fullscreen}
# set the node flags
super + alt + m
bspc node -g marked
#
# focus/swap
#
# focus the node in the given direction
super + {_,shift + }{h,j,k,l}
bspc node -{f,s} {west,south,north,east}
# focus the node for the given path jump
#super + {shift+b,b,comma,period}
# bspc node -f @{parent,brother,first,second}
# focus the next/previous node in the current desktop
super + {_,shift + }c
bspc node -f {next,prev}.local
# focus the last node/desktop
super + {grave,Tab}
bspc {node,desktop} -f last
# focus the older or newer node in the focus history
super + {o,i}
bspc wm -h off; \
bspc node {older,newer} -f; \
bspc wm -h on
# focus or send to the given desktop
super + {_,shift + }{1-9,0}
bspc {desktop -f,node -d} '^{1-9,10}'
#
# preselect
#
# preselect the direction
super + alt + {h,j,k,l}
bspc node -p {west,south,north,east}
# preselect the ratio
super + alt + {1-9}
bspc node -o 0.{1-9}
# cancel the preselection for the focused node
super + alt + shift + space
bspc node -p cancel
# cancel the preselection for the focused desktop
super + alt + space
bspc query -N -d | xargs -I id -n 1 bspc node id -p cancel
#
# move/resize
#
super + ctrl + {h,j,k,l}
bspc node -z {left -40 0,bottom 0 40,top 0 -40,right 40 0}
super + ctrl + shift + {h,j,k,l}
bspc node -z {right -40 0,top 0 40,bottom 0 -40,left 40 0}
# move a floating window
super + {Left,Down,Up,Right}
bspc node -v {-20 0,0 20,0 -20,20 0}
#
# start stuff
#
super + b
qutebrowser --target window
super + e
sh ~/.config/bspwm/bspwm_scripts/execute_menu.sh
super + shift + ctrl + g
killall -INT -g giph;\
notify-send gif "saved gif to ~/Bilder/gifs"
#
# scratchpads
#
# super + n; super + d
# pids=$(xdotool search --class "discord"); \
# for pid in $pids; do bspc node $pid --flag hidden -f; done
#super + n; super + d
# tdrop -ma -w -4 --class discord -y "$PANEL_HEIGHT" discord
#
#super + n; super + n
# ~/.config/bspwm/bspwm_scripts/bsp_scratchpad.sh kitty_scratchpad
#super + n; super + n
#id=$(cat /tmp/scratchid); bspc node $id --flag hidden; bspc node -f $id

View file

@ -1,13 +1,16 @@
[options]
font = Iosevka Nerd Font Medium 12
;font = Iosevka Nerd Font Medium 12
;font = Cozette 10
font = Terminus (TTF) 12
;font = scientifica Regular 12
;font = Victor mono 13
;font = jetbrains mono Nerd Font 12
;font = monospace 13
[colors]
# hard contrast: background = #1d2021
background = rgba(40, 40, 40, 0.5)
;background = rgba(40, 40, 40, 0.95)
background = rgba(40, 40, 40, 1)
;background = rgba(40, 40, 40, 0.90)
# soft contrast: background = #32302f
foreground = #ebdbb2
foreground_bold = #ebdbb2

View file

@ -1,8 +0,0 @@
.google.de TRUE / FALSE 2145916800 CONSENT WP.284bff.284ebc.28523f None
#HttpOnly_.google.de TRUE / FALSE 1601308700 NID 201=2f4m3yF905yxXJMWdugEIcX-6Xz5lfBM9inDXDUn9x-pRGmC8Wj_LH2-aJ2z-MC5iqSIygHso2ro_MXuRw4If4hfe0XJtITPp2oXXYEP8kd5_oXKoCVharylNWN-9VDW4NIVOhTiaBLJJkHYigbuvgmxUFaDWyoqJ_EYut711fE None
#HttpOnly_.google.de TRUE /verify TRUE 1601308700 SNID AI94zCAK1A3JzGA0bmpDwBJjpW02d6NyKM7uPz5BX1zV8zldCUJ9nZsltUXn9Qfh3X3RKTiq1qWUwe3C-H5IhQ Lax
#HttpOnly_.google.de TRUE / TRUE 1618233527 ANID AHWqTUkyeLYe1zHGOTFnTI8bLsAhCDbNKjZjNS7xmbSUo1S8xfEHWo04CbiulJlu None
#HttpOnly_.google.de TRUE /complete/search FALSE 1601049580 CGIC Ij90ZXh0L2h0bWwsYXBwbGljYXRpb24veGh0bWwreG1sLGFwcGxpY2F0aW9uL3htbDtxPTAuOSwqLyo7cT0wLjg None
#HttpOnly_.google.de TRUE /search FALSE 1601049580 CGIC Ij90ZXh0L2h0bWwsYXBwbGljYXRpb24veGh0bWwreG1sLGFwcGxpY2F0aW9uL3htbDtxPTAuOSwqLyo7cT0wLjg None
.google.de TRUE / FALSE 1588089581 OGPC 19016257-1: None
.google.de TRUE / TRUE 1588089672 1P_JAR 2020-03-29-16 None

View file

@ -1,120 +0,0 @@
// ==UserScript==
// @name vimkeybindings
// @namespace renevier.fdn.fr
// @author arno <arenevier@fdn.fr>
// @licence GPL/LGPL/MPL
// @description use vim keybingings (i, j, k, l, …) to navigate a web page.
// ==/UserScript==
/*
* If you're a vim addict, and you always find yourself typing j or k in a web
* page, then wondering why it just does not go up and down like any good
* software, that user script is what you have been looking for.
*/
function up() {
if (window.scrollByLines)
window.scrollByLines(-1); // gecko
else
window.scrollBy(0, -12); // webkit
}
function down() {
if (window.scrollByLines)
window.scrollByLines(1); // gecko
else
window.scrollBy(0, 12); // webkit
}
function pageup() {
if (window.scrollByPages)
window.scrollByPages(-1); // gecko
else
window.scrollBy(0, 0 - _pageScroll()); // webkit
}
function pagedown() {
if (window.scrollByPages)
window.scrollByPages(1); // gecko
else
window.scrollBy(0, _pageScroll()); // webkit
}
function right() {
window.scrollBy(15, 0);
}
function left() {
window.scrollBy(-15, 0);
}
function home() {
window.scroll(0, 0);
}
function bottom() {
window.scroll(document.width, document.height);
}
// If you don't like default key bindings, customize here.
// if you want to use the combination 'Ctrl + b' (for example), use '^b'
var bindings = {
'h' : left,
'l' : right,
'k' : up,
'j' : down,
'g' : home,
'G' : bottom,
//'^b': pageup,
//'^f': pagedown,
}
function isEditable(element) {
if (element.nodeName.toLowerCase() == "textarea")
return true;
// we don't get keypress events for text input, but I don't known
// if it's a bug, so let's test that
if (element.nodeName.toLowerCase() == "input" && element.type == "text")
return true;
// element is editable
if (document.designMode == "on" || element.contentEditable == "true") {
return true;
}
return false;
}
function keypress(evt) {
var target = evt.target;
// if we're on a editable element, we probably don't want to catch
// keypress, we just want to write the typed character.
if (isEditable(target))
return;
var key = String.fromCharCode(evt.charCode);
if (evt.ctrlKey) {
key = '^' + key;
}
var fun = bindings[key];
if (fun)
fun();
}
function _pageScroll() {
// Gecko algorithm
// ----------------
// The page increment is the size of the page, minus the smaller of
// 10% of the size or 2 lines.
return window.innerHeight - Math.min(window.innerHeight / 10, 24);
}
window.addEventListener("keypress", keypress, false);

View file

@ -1,58 +1,102 @@
{-# Language ScopedTypeVariables, LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE MultiParamTypeClasses, DeriveDataTypeable, TypeSynonymInstances, FlexibleInstances, FlexibleContexts, ScopedTypeVariables, LambdaCase #-}
{-# OPTIONS_GHC -fno-warn-missing-signatures -fno-warn-unused-binds #-}
-- Imports -------------------------------------------------------- {{{
module Config (main) where
import Data.Char (isDigit)
import Data.List (isSuffixOf, isPrefixOf)
import qualified Data.Map.Strict as M
import Control.Concurrent
import Control.Exception ( catch , SomeException)
import Control.Monad ( filterM
, when
, guard
)
import Control.Arrow ( (>>>) )
import Data.List ( isPrefixOf
, isSuffixOf
, isInfixOf
, intercalate
)
import qualified Foreign.C.Types
import System.Exit (exitSuccess)
import qualified XMonad.Util.ExtensibleState as XS
import qualified Rofi
import qualified DescribedSubmap
import qualified TiledDragging
--import qualified WindowSwallowing
import qualified Codec.Binary.UTF8.String as UTF8
import qualified DBus as D
import qualified DBus.Client as D
import qualified Data.Map as M
import qualified Data.Monoid
import qualified System.IO as SysIO
import XMonad.Hooks.WindowSwallowing as WindowSwallowing
import XMonad.Layout.HintedGrid
import XMonad.Layout.TwoPanePersistent
import Data.Foldable ( for_ )
import Data.Function ((&))
import XMonad hiding ((|||))
import XMonad.Actions.Commands
import XMonad.Actions.CopyWindow
import XMonad.Actions.Submap
import XMonad.Config.Desktop
import XMonad.Actions.PhysicalScreens ( horizontalScreenOrderer )
import XMonad.Actions.SpawnOn
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.FadeInactive
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.SetWMName (setWMName)
import XMonad.Layout.BinarySpacePartition
import XMonad.Layout.BorderResize
import XMonad.Layout.Gaps
import XMonad.Layout.IndependentScreens
import XMonad.Layout.LayoutCombinators ((|||))
import XMonad.Layout.LayoutHints
import XMonad.Layout.MouseResizableTile
import XMonad.Layout.NoBorders
import XMonad.Layout.Renamed (renamed, Rename(Replace))
--import qualified XMonad.Layout.MultiColumns as MultiCol
import XMonad.Layout.ResizableTile
import XMonad.Layout.Spacing (spacingRaw, Border(..), toggleWindowSpacingEnabled)
import XMonad.Layout.Spiral (spiral)
import XMonad.Layout.ToggleLayouts
import XMonad.Layout.Simplest
import XMonad.Layout.Reflect
import XMonad.Layout.Spacing (spacingRaw, Border(..), toggleWindowSpacingEnabled, incScreenWindowSpacing, decScreenWindowSpacing)
import XMonad.Layout.SubLayouts
import XMonad.Layout.Tabbed
import XMonad.Layout.WindowNavigation ( windowNavigation )
import XMonad.Layout.ZoomRow
import XMonad.Util.EZConfig (additionalKeysP, removeKeysP, checkKeymap)
import XMonad.Layout.ThreeColumns
import XMonad.Layout.ResizableThreeColumns
import XMonad.Layout.WindowSwitcherDecoration
import XMonad.Layout.DraggingVisualizer
--import XMonad.Layout.Hidden as Hidden
import XMonad.Util.EZConfig ( additionalKeysP
, removeKeysP
, checkKeymap
)
import XMonad.Layout.LayoutModifier
import XMonad.Util.NamedScratchpad
import XMonad.Util.Run
import XMonad.Util.SpawnOnce (spawnOnce)
import qualified XMonad.Hooks.UrgencyHook as Urgency
import XMonad.Util.WorkspaceCompare ( getSortByXineramaPhysicalRule , getSortByIndex)
import qualified Data.Monoid
import Data.Monoid ( Endo )
import Data.Traversable ( for )
import Data.Semigroup ( All(..) )
import qualified System.IO as SysIO
import qualified XMonad.Actions.Navigation2D as Nav2d
import qualified XMonad.Config.Desktop as Desktop
import qualified XMonad.Hooks.EwmhDesktops as Ewmh
import XMonad.Hooks.FadeInactive
import qualified XMonad.Hooks.ManageHelpers as ManageHelpers
import XMonad.Hooks.DebugStack ( debugStackString
, debugStackFullString
)
import qualified XMonad.Layout.BoringWindows as BoringWindows
import qualified XMonad.Layout.MultiToggle as MTog
import qualified XMonad.Layout.MultiToggle.Instances as MTog
import qualified XMonad.Layout.ToggleLayouts as ToggleLayouts
import qualified XMonad.StackSet as W
import qualified XMonad.Util.XSelection as XSel
import XMonad.Util.WindowProperties
import qualified XMonad.Layout.PerScreen as PerScreen
{-# ANN module "HLint: ignore Redundant $" #-}
{-# ANN module "HLint: ignore Redundant bracket" #-}
{-# ANN module "HLint: ignore Move brackets to avoid $" #-}
@ -64,33 +108,37 @@ import qualified XMonad.Util.XSelection as XSel
myModMask = mod4Mask
myLauncher = Rofi.asCommand (def { Rofi.theme = Rofi.bigTheme }) ["-show run"]
myTerminal = "kitty --single-instance"
--myTerminal = "termite --name törminell"
myTerminal = "alacritty"
myBrowser = "qutebrowser"
useSharedWorkspaces = False
--myBrowser = "google-chrome-stable"
{-| adds the scripts-directory path to the filename of a script |-}
scriptFile :: String -> String
scriptFile script = "/home/leon/scripts/" ++ script
scratchpads :: [NamedScratchpad]
scratchpads =
[ NS "terminal" launchTerminal (className =? "scratchpad_term") (customFloating $ W.RationalRect 0.66 0.7 0.34 0.3)
, NS "ghci" launchGHCI (className =? "scratchpad_ghci") (customFloating $ W.RationalRect 0.66 0.7 0.34 0.3)
[ NS "terminal" "termite --class sp_term" (className =? "sp_term") (customFloating $ W.RationalRect 0.66 0.7 0.34 0.3)
, NS "spotify" "spotify" (appName =? "spotify") defaultFloating
, NS "discord" "discord" (appName =? "discord") defaultFloating
, NS "whatsapp" launchWhatsapp (("WhatsApp" `isSuffixOf`) <$> title) defaultFloating
, NS "slack" "slack" (("Slack | " `isPrefixOf`) <$> title) defaultFloating
, NS "discord" launchDiscord (appName =? "discord") defaultFloating
]
where
launchTerminal = myTerminal ++ " --class scratchpad_term"
launchGHCI = myTerminal ++ " --class scratchpad_ghci stack exec -- ghci"
launchWhatsapp = "gtk-launch chrome-hnpfjngllnobngcgfapefoaidbinmjnm-Default.desktop"
--launchWhatsapp = "gtk-launch chrome-hnpfjngllnobngcgfapefoaidbinmjnm-Default.desktop"
launchWhatsapp = "google-chrome-stable --start-fullscreen -kiosk --app='https://web.whatsapp.com'"
launchDiscord = "discord"
--launchDiscord = "beautifuldiscord --css /home/leon/.config/beautifuldiscord/custom_discord.css"
-- Colors ------ {{{
fg = "#ebdbb2"
bg = "#282828"
gray = "#a89984"
gray = "#888974"
bg1 = "#3c3836"
bg2 = "#504945"
bg3 = "#665c54"
@ -109,35 +157,66 @@ aqua = "#8ec07c"
-- }}}
-- Layout ---------------------------------------- {{{
--layoutHints .
myLayout = avoidStruts . BoringWindows.boringWindows . smartBorders . toggleLayouts Full . layoutHintsToCenter $ layouts
myTabTheme = def -- defaultThemeWithButtons
{ -- activeColor = "#8ec07c"
activeColor = "#1d2021"
--activeColor = "#1d2021"
--activeColor = "#504945"
--, inactiveColor = "#282828"
, inactiveColor = "#282828"
, activeBorderColor = "#1d2021"
, inactiveBorderColor = "#282828"
, activeTextColor = "#fbf1c7"
, inactiveTextColor = "#fbf1c7"
, decoHeight = 15
, fontName = "-misc-cozettevector-*-*-*-*-10-*-*-*-*-*-*-*"
--, fontName = "-misc-scientifica-*-*-*-*-10-*-*-*-*-*-*-*"
}
data EmptyShrinker = EmptyShrinker deriving (Show, Read)
instance Shrinker EmptyShrinker where
shrinkIt _ _ = [] :: [String]
myLayout = avoidStruts
$ smartBorders
$ MTog.mkToggle1 MTog.FULL
$ ToggleLayouts.toggleLayouts (rename "Tabbed" . makeTabbed . spacingAndGaps $ ResizableTall 1 (3/100) (1/2) [])
$ MTog.mkToggle1 WINDOWDECORATION
$ draggingVisualizer
-- $ Hidden.hiddenWindows
$ layoutHintsToCenter
$ layouts
where
layouts =((rename "Tall" $ onlySpacing $ mouseResizableTile {draggerType = dragger}) -- ResizableTall 1 (3/100) (1/2) []
||| (rename "Horizon" $ onlySpacing $ mouseResizableTileMirrored {draggerType = dragger}) -- Mirror $ ResizableTall 1 (3/100) (3/4) []
-- | if the screen is wider than 1900px it's horizontal, so use horizontal layouts.
-- if it's not, it's vertical, so use layouts for vertical screens.
layouts = PerScreen.ifWider 1900 horizScreenLayouts vertScreenLayouts
horizScreenLayouts =
((rename "Tall" $ spacingAndGaps $ mouseResizableTile {draggerType = BordersDragger})
||| (rename "Horizon" $ spacingAndGaps $ mouseResizableTileMirrored {draggerType = BordersDragger})
||| (rename "BSP" $ spacingAndGaps $ borderResize $ emptyBSP)
||| (rename "Row" $ spacingAndGaps $ zoomRow)
||| (rename "grid" $ spacingAndGaps $ Grid False))
-- ||| (rename "threeCol" $ spacingAndGaps $ ThreeColMid 1 (3/100) (1/2))
-- ||| (rename "spiral" $ spacingAndGaps $ spiral (9/21))
-- Grid
||| (rename "ThreeCol" $ makeTabbed $ spacingAndGaps $ ResizableThreeColMid 1 (3/100) (1/2) [])
||| (rename "TabbedRow" $ makeTabbed $ spacingAndGaps $ zoomRow))
vertScreenLayouts =
((rename "ThreeCol" $ makeTabbed $ spacingAndGaps $ Mirror $ reflectHoriz $ ThreeColMid 1 (3/100) (1/2))
||| (rename "Horizon" $ spacingAndGaps $ mouseResizableTileMirrored {draggerType = BordersDragger}))
rename n = renamed [Replace n]
spacingAndGaps = let intGap = 10 :: Integer
border = Border intGap intGap intGap intGap
in spacingRaw False border True border True
gap = 7
onlySpacing = gaps [ (dir, (gap*2)) | dir <- [L, R, D, U] ] -- gaps are included in mouseResizableTile
dragger = let x = fromIntegral gap * 2
in FixedDragger x x
spacingAndGaps = let intGap = fromIntegral gap
spacingBorder = Border intGap intGap intGap intGap
in spacingRaw True spacingBorder False spacingBorder True
-- | transform a layout into supporting tabs
makeTabbed layout = BoringWindows.boringWindows . windowNavigation . addTabs shrinkText myTabTheme $ subLayout [] Simplest $ layout
-- }}}
-- Loghook -------------------------------------- {{{
myLogHook :: X ()
myLogHook = return () -- fadeInactiveLogHook 0.95 -- opacity of unfocused windows
-- | window decoration layout modifier. this needs you to add `dragginVisualizer` yourself
data WINDOWDECORATION = WINDOWDECORATION deriving (Read, Show, Eq, Typeable)
instance MTog.Transformer WINDOWDECORATION Window where
transform WINDOWDECORATION x k = k
(windowSwitcherDecoration shrinkText (myTabTheme { activeBorderColor = "#1d2021" }) $ x)
(const x)
-- }}}
@ -145,127 +224,242 @@ myLogHook = return () -- fadeInactiveLogHook 0.95 -- opacity of unfocused window
myStartupHook :: X ()
myStartupHook = do
spawnOnce "picom --config ~/.config/picom.conf --experimental-backends" --no-fading-openclose"
spawnOnce "pasystray"
spawnOnce "nm-applet"
spawnOnce "clipmenud"
spawn "xset r rate 300 50" -- make key repeat quicker
spawn "/home/leon/.config/polybar/launch.sh"
spawn "feh --bg-fill /home/leon/Bilder/wallpapers/abstract_mountain.png"
setWMName "LG3D" -- Java stuff hack
--spawnOnce "nm-applet &"
--spawnOnce "udiskie -s &" -- Mount USB sticks automatically. -s is smart systray mode: systray icon if something is mounted
spawnOnce "xfce4-clipman &"
spawnOnce "redshift -P -O 5000 &"
spawn "xset r rate 300 50 &" -- make key repeat quicker
spawn "/home/leon/.screenlayout/dualscreen-stacked.sh"
io $ threadDelay $ 1000 * 100
spawnOnce "/home/leon/Downloads/picom --config /home/leon/.config/picom.conf --experimental-backends --backend xrender" --no-fading-openclose"
spawn "/home/leon/.config/polybar/launch.sh"
spawnOnce "nitrogen --restore"
spawnOnce "mailnag"
--spawnOnce "flashfocus"
for_ ["led1", "led2"] $ \led -> safeSpawn "sudo" ["liquidctl", "set", led, "color", "fixed", "00ffff"]
-- }}}
-- Keymap --------------------------------------- {{{
myMouseBindings :: XConfig Layout -> M.Map (KeyMask, Button) (Window -> X ())
myMouseBindings (XConfig {XMonad.modMask = modMask'}) = M.fromList
[((modMask' .|. shiftMask, button1), TiledDragging.tiledDrag)]
multiMonitorOperation :: (WorkspaceId -> WindowSet -> WindowSet) -> ScreenId -> X ()
multiMonitorOperation operation n = do
monitor <- screenWorkspace n
case monitor of
Just mon -> windows $ operation mon
Nothing -> return ()
-- Default mappings that need to be removed
removedKeys :: [String]
removedKeys = ["M-S-c", "M-S-q", "M-h", "M-l"]
removedKeys = ["M-<Tab>", "M-S-c", "M-S-q", "M-h", "M-l", "M-j", "M-k", "M-S-<Return>"]
++ if useSharedWorkspaces then [] else [key ++ show n | key <- ["M-", "M-S-", "M-C-"], n <- [1..9 :: Int]]
myKeys :: [(String, X ())]
myKeys = [ ("M-+", sendMessage zoomIn)
myKeys = concat [ zoomRowBindings, tabbedBindings, multiMonitorBindings, programLaunchBindings, miscBindings, windowControlBindings, workspaceBindings ]
where
keyDirPairs = [("h", L), ("j", D), ("k", U), ("l", R)]
zoomRowBindings :: [(String, X ())]
zoomRowBindings =
[ ("M-+", sendMessage zoomIn)
, ("M--", sendMessage zoomOut)
, ("M-#", sendMessage zoomReset)
]
, ("M-f", toggleFullscreen)
tabbedBindings :: [(String, X ())]
tabbedBindings =
[ ("M-j", ifLayoutName ("Tabbed" `isPrefixOf`) (BoringWindows.focusDown) (windows W.focusDown))
, ("M-k", ifLayoutName ("Tabbed" `isPrefixOf`) (BoringWindows.focusUp) (windows W.focusUp))
, ("M-C-S-h", sendMessage $ pullGroup L)
, ("M-C-S-j", sendMessage $ pullGroup D)
, ("M-C-S-k", sendMessage $ pullGroup U)
, ("M-C-S-l", sendMessage $ pullGroup R)
, ("M-S-C-m", withFocused (sendMessage . MergeAll))
, ("M-S-C-<Backspace>", withFocused (sendMessage . UnMerge))
, ("M-<Tab>", onGroup W.focusDown')
, ("M-C-<Tab>", onGroup W.focusUp')
, ("M-S-t", toggleTabbedLayout)
-- In tabbed mode, while focussing master pane, cycle tabs on the first slave
, ("M-S-<Tab>", do windows W.focusMaster
BoringWindows.focusDown
onGroup W.focusDown'
windows W.focusMaster)
]
multiMonitorBindings :: [(String, X ())]
multiMonitorBindings =
[ ("M-s", multiMonitorOperation W.view 1)
, ("M-d", multiMonitorOperation W.view 0)
, ("M-S-s", (multiMonitorOperation W.shift 1) >> multiMonitorOperation W.view 1)
, ("M-S-d", (multiMonitorOperation W.shift 0) >> multiMonitorOperation W.view 0)
, ("M-C-s", windows swapScreenContents)
]
programLaunchBindings :: [(String, X ())]
programLaunchBindings =
[ ("M-p", spawn myLauncher)
, ("M-S-p", Rofi.showCombi (def { Rofi.theme = Rofi.bigTheme }) [ "drun", "window", "ssh" ])
, ("M-S-e", Rofi.showNormal (def { Rofi.theme = Rofi.bigTheme, Rofi.fuzzy = False }) "emoji")
--, ("M-s", spawn $ scriptFile "rofi-search.sh")
, ("M-S-o", spawn $ scriptFile "rofi-open.sh")
, ("M-n", scratchpadSubmap)
, ("M-e", Rofi.promptRunCommand def specialCommands)
, ("M-o", Rofi.promptRunCommand def withSelectionCommands)
, ("M-S-C-g", spawn "killall -INT -g giph") -- stop gif recording
--, ("M-b", launchWithBackgroundInstance (className =? "qutebrowser") "bwrap --bind / / --dev-bind /dev /dev --tmpfs /tmp --tmpfs /run qutebrowser")
--, ("M-b", safeSpawnProg "qutebrowser")
, ("M-b", safeSpawnProg "firefox")
, ("M-S-<Return>", spawn "alacritty")
--, ("M-S-<Return>", launchWithBackgroundInstance (className =? "Alacritty") "alacritty")
]
miscBindings :: [(String, X ())]
miscBindings =
[ ("M-f", do withFocused (windows . W.sink)
sendMessage (MTog.Toggle MTog.FULL)
sendMessage ToggleStruts)
, ("M-C-S-w", sendMessage $ MTog.Toggle WINDOWDECORATION)
, ("M-S-C-c", kill1)
, ("M-S-C-q", io exitSuccess)
-- Binary space partitioning
, ("M-<Backspace>", sendMessage Swap)
, ("M-M1-<Backspace>", sendMessage Rotate)
, ("M-<Delete>", sendMessage Swap)
, ("M-M1-<Delete>", sendMessage Rotate)
-- Media
, ("<XF86AudioRaiseVolume>", spawn "amixer sset Master 5%+")
, ("<XF86AudioLowerVolume>", spawn "amixer sset Master 5%-")
, ("M-S-C-,", (notify "hi" (show $ map (\(a, _) -> show a) workspaceBindings)) >> (notify "ho" (show removedKeys)))
, ("M-<Backspace>", spawn "flash_window")
, ("M-g", incScreenWindowSpacing 5)
, ("M-S-g", decScreenWindowSpacing 5)
]
-- programs
, ("M-p", spawn myLauncher)
, ("M-b", spawn myBrowser)
, ("M-S-p", Rofi.showCombi (def { Rofi.theme = Rofi.bigTheme }) [ "drun", "window", "ssh" ])
, ("M-S-e", Rofi.showNormal (def { Rofi.theme = Rofi.bigTheme }) "emoji" )
, ("M-s", spawn $ scriptFile "rofi-search.sh")
, ("M-S-s", spawn $ scriptFile "rofi-open.sh")
, ("M-n", scratchpadSubmap )
, ("M-m", mediaSubmap )
, ("M-e", Rofi.promptRunCommand def specialCommands)
, ("M-C-e", Rofi.promptRunCommand def =<< defaultCommands )
, ("M-o", Rofi.promptRunCommand def withSelectionCommands)
, ("M-S-C-g", spawn "killall -INT -g giph" >> spawn "notify-send gif 'saved gif in ~/Bilder/gifs'") -- stop gif recording
] ++ generatedMappings
workspaceBindings :: [(String, X ())]
workspaceBindings =
if useSharedWorkspaces
then []
else concat $
[ [ ("M-" ++ show wspNum, runActionOnWorkspace W.view wspNum)
, ("M-S-" ++ show wspNum, runActionOnWorkspace W.shift wspNum)
, ("M-C-" ++ show wspNum, runActionOnWorkspace copy wspNum)
]
| wspNum <- [1..9 :: Int]
]
where
generatedMappings :: [(String, X ())]
generatedMappings = copyToWorkspaceMappings ++ windowGoMappings ++ windowSwapMappings ++ resizeMappings
runActionOnWorkspace action wspNum = do
wsps <- workspaces' <$> asks config
windows $ onCurrentScreen action (wsps !! (wspNum - 1))
windowControlBindings :: [(String, X ())]
windowControlBindings = windowGoMappings ++ windowSwapMappings ++ resizeMappings
where
copyToWorkspaceMappings = [ ("M-C-" ++ wsp, windows $ copy wsp) | wsp <- map show [1..9 :: Int] ]
keyDirPairs = [("h", L), ("j", D), ("k", U), ("l", R)]
windowGoMappings = [ ("M-M1-" ++ key, Nav2d.windowGo dir False) | (key, dir) <- keyDirPairs ]
windowSwapMappings = [ ("M-S-M1-" ++ key, Nav2d.windowSwap dir False) | (key, dir) <- keyDirPairs ]
resizeMappings =
[ ("M-C-h", ifLayoutIs "BSP" (sendMessage $ ExpandTowards L) (sendMessage Shrink))
, ("M-C-j", ifLayoutIs "BSP" (sendMessage $ ExpandTowards D) (sendMessage MirrorShrink >> sendMessage ExpandSlave))
, ("M-C-k", ifLayoutIs "BSP" (sendMessage $ ExpandTowards U) (sendMessage MirrorExpand >> sendMessage ShrinkSlave))
, ("M-C-l", ifLayoutIs "BSP" (sendMessage $ ExpandTowards R) (sendMessage Expand))
[ ("M-C-h", ifLayoutIs "BSP" (sendMessage $ ExpandTowards L) (ifLayoutIs "Horizon" (sendMessage ShrinkSlave) (sendMessage Shrink)))
, ("M-C-j", ifLayoutIs "BSP" (sendMessage $ ExpandTowards D) (ifLayoutIs "Horizon" (sendMessage Expand) (sendMessage MirrorShrink >> sendMessage ExpandSlave)))
, ("M-C-k", ifLayoutIs "BSP" (sendMessage $ ExpandTowards U) (ifLayoutIs "Horizon" (sendMessage Shrink) (sendMessage MirrorExpand >> sendMessage ShrinkSlave)))
, ("M-C-l", ifLayoutIs "BSP" (sendMessage $ ExpandTowards R) (ifLayoutIs "Horizon" (sendMessage ExpandSlave) (sendMessage Expand)))
]
toggleFullscreen :: X ()
toggleFullscreen = do
sendMessage ToggleLayout -- toggle fullscreen layout
sendMessage ToggleStruts -- bar is hidden -> no need to make place for it
safeSpawn "polybar-msg" ["cmd", "toggle"] -- toggle polybar visibility
-- | toggle tabbed Tall layout, merging all non-master windows
-- into a single tab group when initializing the tabbed layout.
toggleTabbedLayout :: X ()
toggleTabbedLayout = do
sendMessage $ ToggleLayouts.Toggle "Tabbed"
ifLayoutIs "Tabbed" (do BoringWindows.focusMaster
withFocused (sendMessage . MergeAll)
withFocused (sendMessage . UnMerge)
-- refresh the tabs, so they draw correctly
windows W.focusUp
windows W.focusDown)
(return ())
-- | launch a program by starting an instance in a hidden workspace,
-- and just raising an already running instance. This allows for super quick "startup" time.
-- For this to work, the window needs to have the `_NET_WM_PID` set and unique!
launchWithBackgroundInstance :: (Query Bool) -> String -> X ()
launchWithBackgroundInstance windowQuery commandToRun = withWindowSet $ \winSet -> do
fittingHiddenWindows <- (W.allWindows winSet) |> filter (\win -> Just "NSP" == W.findTag win winSet)
|> filterM (runQuery windowQuery)
case fittingHiddenWindows of
[] -> do spawnHere commandToRun
spawnOn "NSP" commandToRun
[winId] -> do windows $ W.shiftWin (W.currentTag winSet) winId
spawnOn "NSP" commandToRun
(winId:_) -> windows $ W.shiftWin (W.currentTag winSet) winId
scratchpadSubmap :: X ()
scratchpadSubmap = describedSubmap "Scratchpads"
[ ((myModMask, xK_n), "<M-n> terminal", namedScratchpadAction scratchpads "terminal")
, ((myModMask, xK_h), "<M-h> ghci", namedScratchpadAction scratchpads "ghci")
, ((myModMask, xK_w), "<M-w> whatsapp", namedScratchpadAction scratchpads "whatsapp")
, ((myModMask, xK_s), "<M-s> slack", namedScratchpadAction scratchpads "slack")
, ((myModMask, xK_m), "<M-m> spotify", namedScratchpadAction scratchpads "spotify")
, ((myModMask, xK_d), "<M-m> discord", namedScratchpadAction scratchpads "discord")
]
swapScreenContents :: W.StackSet i l a sid sd -> W.StackSet i l a sid sd
swapScreenContents ws = if null (W.visible ws) then ws else
let
otherScreen = head $ W.visible ws
otherWsp = W.workspace otherScreen
currentScreen = W.current ws
currentWsp = W.workspace currentScreen
in
ws
{ W.current = currentScreen { W.workspace = otherWsp { W.tag = W.tag currentWsp } }
, W.visible = (otherScreen { W.workspace = currentWsp { W.tag = W.tag otherWsp } } : (tail $ W.visible ws))
}
mediaSubmap :: X ()
mediaSubmap = describedSubmap "Media"
[ ((myModMask, xK_m), "<M-m> play/pause", spawn "playerctl play-pause")
, ((myModMask, xK_l), "<M-l> next", spawn "playerctl next")
, ((myModMask, xK_l), "<M-h> previous", spawn "playerctl previous")
, ((myModMask, xK_k), "<M-k> increase volume", spawn "amixer sset Master 5%+")
, ((myModMask, xK_j), "<M-j> decrease volume", spawn "amixer sset Master 5%-")
]
withSelectionCommands :: [(String, X ())]
withSelectionCommands =
[ ("Google", XSel.transformPromptSelection ("https://google.com/search?q=" ++) "qutebrowser")
, ("Hoogle", XSel.transformPromptSelection ("https://hoogle.haskell.org/?hoogle=" ++) "qutebrowser")
, ("Translate", XSel.transformPromptSelection ("https://translate.google.com/#view=home&op=translate&sl=auto&tl=en&text=" ++) "qutebrowser")
, ("Translate", XSel.getSelection >>= translateMenu)
]
translateMenu :: String -> X ()
translateMenu input = do
selectedLanguage <- Rofi.promptSimple def ["de", "en", "fr"]
translated <- runProcessWithInput "trans" [":" ++ selectedLanguage, input, "--no-ansi"] ""
notify "Translation" translated
specialCommands :: [(String, X ())]
specialCommands =
[ ("screenshot", spawn $ scriptFile "screenshot.sh")
, ("screenshot to file", spawn $ scriptFile "screenshot.sh --tofile")
, ("screenshot full to file", spawn $ scriptFile "screenshot.sh --tofile --fullscreen")
, ("screengif to file", spawn (scriptFile "screengif.sh") >> spawn "notify-send gif 'stop gif-recording with M-S-C-g'")
, ("clipboard history", spawn $ "clipmenu")
, ("screengif to file", spawn (scriptFile "screengif.sh") >> notify "gif" "stop gif-recording with M-S-C-g")
, ("toggleOptimal", sendMessage ToggleGaps >> toggleWindowSpacingEnabled)
, ("toggleSpacing", toggleWindowSpacingEnabled)
, ("toggleGaps", sendMessage ToggleGaps)
, ("Copy to all workspaces", windows copyToAll) -- windows: Modify the current window list with a pure function, and refresh
, ("Copy to all workspaces", windows copyToAll)
, ("Kill all other copies", killAllOtherCopies)
, ("toggle polybar", safeSpawn "polybar-msg" ["cmd", "toggle"])
, ("toggle polybar", sendMessage ToggleStruts >> safeSpawn "polybar-msg" ["cmd", "toggle"])
, ("get debug data", debugStackFullString >>= (\str -> safeSpawn "xmessage" [str]))
, ("get full stackset", withWindowSet (\ws -> spawn $ "echo '" ++ show (W.floating ws) ++ "\n" ++ show (W.current ws) ++ "' | xclip -in -selection clipboard"))
, ("asdf", windows (\ws -> ws {W.floating = M.empty }))
]
describedSubmap :: String -> [((KeyMask, KeySym), String, X ())] -> X ()
describedSubmap submapTitle mappings = promptDzenWhileRunning submapTitle descriptions mySubmap
where
mySubmap = submap $ M.fromList $ map (\(k, _, f) -> (k, f)) mappings
descriptions = map (\(_,x,_) -> x) mappings
scratchpadSubmap :: X ()
scratchpadSubmap = DescribedSubmap.describedSubmap "Scratchpads"
[ ("M-n", "terminal", namedScratchpadAction scratchpads "terminal")
, ("M-w", "whatsapp", namedScratchpadAction scratchpads "whatsapp")
, ("M-s", "slack", namedScratchpadAction scratchpads "slack")
, ("M-m", "spotify", namedScratchpadAction scratchpads "spotify")
, ("M-d", "discord", namedScratchpadAction scratchpads "discord")
]
-- }}}
@ -277,7 +471,8 @@ myManageHook = composeAll
, appName =? "pavucontrol" --> ManageHelpers.doCenterFloat
, className =? "mpv" --> ManageHelpers.doRectFloat (W.RationalRect 0.9 0.9 0.1 0.1)
, title =? "Something" --> doFloat
-- , isFullscreen --> doF W.focusDown <+> doFullFloat
, className =? "termite_floating" --> ManageHelpers.doRectFloat(W.RationalRect 0.2 0.2 0.6 0.6)
, className =? "bar_system_status_indicator" --> ManageHelpers.doRectFloat (W.RationalRect 0.7 0.05 0.29 0.26)
, manageDocks
, namedScratchpadManageHook scratchpads
]
@ -287,91 +482,150 @@ myManageHook = composeAll
-- Main ------------------------------------ {{{
main :: IO ()
main = do
dbus <- D.connectSession
-- Request access to the DBus name
_ <- D.requestName dbus (D.busName_ "org.xmonad.Log")
[D.nameAllowReplacement, D.nameReplaceExisting, D.nameDoNotQueue]
currentScreenCount :: Int <- countScreens
let monitorIndices = [0..currentScreenCount - 1]
-- $ ewmh (kills IntelliJ)
xmonad
$ Ewmh.ewmh
$ Nav2d.withNavigation2DConfig def { Nav2d.defaultTiledNavigation = Nav2d.sideNavigation }
$ myConfig dbus
-- create a fifo named pipe for every monitor (called /tmp/xmonad-state-bar0, etc)
for_ monitorIndices (\idx -> safeSpawn "mkfifo" ["/tmp/xmonad-state-bar" ++ show idx])
myConfig dbus = desktopConfig
-- create polybarLogHooks for every monitor and combine them using the <+> monoid instance
let polybarLogHooks = composeAll $ map polybarLogHook monitorIndices
let myConfig = flip additionalKeysP myKeys
$ flip removeKeysP removedKeys
$ Desktop.desktopConfig
{ terminal = myTerminal
, workspaces = if useSharedWorkspaces
then (map show [1..9 :: Int]) ++ ["NSP"]
else (withScreens (fromIntegral currentScreenCount) (map show [1..6 :: Int])) ++ ["NSP"]
, modMask = myModMask
, borderWidth = 2
, borderWidth = 1
, layoutHook = myLayout
, logHook = myLogHook <+> dynamicLogWithPP (polybarPP dbus) <+> logHook def
, startupHook = myStartupHook <+> startupHook def <+> return () >> checkKeymap (myConfig dbus ) myKeys
, manageHook = myManageHook <+> manageHook def
, focusedBorderColor = aqua
, logHook = mconcat [ polybarLogHooks, Ewmh.ewmhDesktopsLogHook, logHook Desktop.desktopConfig, logHook def]
, startupHook = mconcat [ myStartupHook, Ewmh.ewmhDesktopsStartup, return () >> checkKeymap myConfig myKeys]
, manageHook = mconcat [ manageSpawn, myManageHook, manageHook def]
--, focusedBorderColor = aqua
, focusedBorderColor = "#427b58"
, normalBorderColor = "#282828"
, handleEventHook = mconcat [ mySwallowEventHook
, activateWindowEventHook
, handleEventHook Desktop.desktopConfig
, Ewmh.ewmhDesktopsEventHook
]
--, handleEventHook = minimizeEventHook <+> handleEventHook def <+> hintsEventHook -- <+> Ewmh.fullscreenEventHook
} `removeKeysP` removedKeys `additionalKeysP` myKeys
, mouseBindings = myMouseBindings <+> mouseBindings def
}
xmonad
$ Nav2d.withNavigation2DConfig def { Nav2d.defaultTiledNavigation = Nav2d.sideNavigation }
$ docks
$ myConfig
-- }}}
mySwallowEventHook = WindowSwallowing.swallowEventHook (className =? "Alacritty" <||> className =? "Termite" <||> className =? "Thunar") (return True)
activateWindowEventHook :: Event -> X All
activateWindowEventHook (ClientMessageEvent { ev_message_type = messageType, ev_window = window }) = withWindowSet $ \ws -> do
activateWindowAtom <- getAtom "_NET_ACTIVE_WINDOW"
when (messageType == activateWindowAtom) $
if window `elem` (concatMap (W.integrate' . W.stack . W.workspace) (W.current ws : W.visible ws))
then windows (W.focusWindow window)
else do
shouldRaise <- runQuery (className =? "discord" <||> className =? "web.whatsapp.com") window
if shouldRaise
then windows (W.shiftWin (W.tag $ W.workspace $ W.current ws) window)
else windows (W.focusWindow window)
return $ All True
activateWindowEventHook _ = return $ All True
-- POLYBAR Kram -------------------------------------- {{{
-- | Loghook for polybar on a given monitor.
-- Will write the polybar formatted string to /tmp/xmonad-state-bar${monitor}
polybarLogHook :: Int -> X ()
polybarLogHook monitor = do
barOut <- dynamicLogString $ polybarPP $ fromIntegral monitor
io $ SysIO.appendFile ("/tmp/xmonad-state-bar" ++ show monitor) (barOut ++ "\n")
polybarPP :: D.Client -> PP
polybarPP dbus = namedScratchpadFilterOutWorkspacePP $ def
{ ppOutput = dbusOutput dbus
, ppCurrent = withBG bg2
, ppVisible = withBG bg2
, ppUrgent = withFG red
, ppLayout = removeWord "Minimize" . removeWord "Hinted" . removeWord "Spacing" . withFG purple
, ppHidden = wrap " " " " . unwords . map wrapOpenWorkspaceCmd . words
-- swapping namedScratchpadFilterOutWorkspacePP and marshallPP will throw "Prelude.read no Parse" errors..... wtf
-- | create a polybar Pretty printer, marshalled for given monitor.
polybarPP :: ScreenId -> PP
polybarPP monitor = namedScratchpadFilterOutWorkspacePP . (if useSharedWorkspaces then id else marshallPP $ fromIntegral monitor) $ def
{ ppCurrent = withFG aqua . withMargin . withFont 5 . const "__active__"
, ppVisible = withFG aqua . withMargin . withFont 5 . const "__active__"
, ppUrgent = withFG red . withMargin . withFont 5 . const "__urgent__"
, ppHidden = withFG gray . withMargin . withFont 5 . (`wrapClickableWorkspace` "__hidden__")
, ppHiddenNoWindows = withFG gray . withMargin . withFont 5 . (`wrapClickableWorkspace` "__empty__")
, ppWsSep = ""
, ppSep = " | "
, ppSep = ""
, ppLayout = removeWords ["DraggingVisualizer", "WindowSwitcherDeco", "Minimize", "Hinted", "Spacing", "Tall"]
>>> \l -> if l == "Tall" || l == "Horizon" || l == "" then ""
else (withFG gray " | ") ++ (withFG purple $ withMargin l)
, ppExtras = []
, ppTitle = const "" -- withFG aqua . (shorten 40)
, ppSort = if useSharedWorkspaces then getSortByXineramaPhysicalRule horizontalScreenOrderer
else onlyRelevantWspsSorter
}
where
withMargin = wrap " " " "
removeWord substr = unwords . filter (/= substr) . words
withBG col = wrap ("%{B" ++ col ++ "} ") " %{B-}"
withFG col = wrap ("%{F" ++ col ++ "} ") " %{F-}"
wrapOpenWorkspaceCmd wsp
| all isDigit wsp = wrapOnClickCmd ("xdotool key super+" ++ wsp) wsp
| otherwise = wsp
removeWords wrds = unwords . filter (`notElem` wrds). words
withFont fNum = wrap ("%{T" ++ show (fNum :: Int) ++ "}") "%{T}"
withBG col = wrap ("%{B" ++ col ++ "}") "%{B-}"
withFG col = wrap ("%{F" ++ col ++ "}") "%{F-}"
wrapOnClickCmd command = wrap ("%{A1:" ++ command ++ ":}") "%{A}"
wrapClickableWorkspace wsp = wrapOnClickCmd ("xdotool key super+" ++ wsp)
-- Emit a DBus signal on log updates
dbusOutput :: D.Client -> String -> IO ()
dbusOutput dbus str = do
let signal = (D.signal objectPath interfaceName memberName) {
D.signalBody = [D.toVariant $ UTF8.decodeString str]
}
D.emit dbus signal
where
objectPath = D.objectPath_ "/org/xmonad/Log"
interfaceName = D.interfaceName_ "org.xmonad.Log"
memberName = D.memberName_ "Update"
onlyRelevantWspsSorter = do
sortByIndex <- getSortByIndex
visibleWorkspaceTags <- getVisibleWorkspacesTagsOnMonitor monitor
let isEmptyAndNotOpened wsp = (null $ W.stack wsp) && (W.tag wsp) `notElem` visibleWorkspaceTags
return $ dropEndWhile isEmptyAndNotOpened . sortByIndex
-- }}}
-- Utilities --------------------------------------------------- {{{
promptDzenWhileRunning :: String -> [String] -> X () -> X ()
promptDzenWhileRunning promptTitle options action = do
handle <- spawnPipe $ "sleep 1 && dzen2 -e onstart=uncollapse -l " ++ lineCount ++ " -fn '" ++ font ++ "'"
io $ SysIO.hPutStrLn handle (promptTitle ++ unlines options)
_ <- action
io $ SysIO.hClose handle
where
lineCount = show $ length options
font = "-*-iosevka-medium-r-s*--16-87-*-*-*-*-iso10???-1"
(|>) :: a -> (a -> b) -> b
(|>) = (&)
infixl 1 |>
dropEndWhile :: (a -> Bool) -> [a] -> [a]
dropEndWhile _ [] = []
dropEndWhile test xs = if test $ last xs then dropEndWhile test (init xs) else xs
catchAndNotifyAny :: IO () -> IO ()
catchAndNotifyAny ioAction = catch ioAction (\(e :: SomeException) -> notify "Xmonad exception" (show e))
getVisibleWorkspacesTagsOnMonitor :: ScreenId -> X [VirtualWorkspace]
getVisibleWorkspacesTagsOnMonitor monitor = do
ws <- gets windowset
return $ W.current ws : W.visible ws
|> map (W.tag . W.workspace)
|> filter (\tag -> monitor == fromIntegral (unmarshallS tag))
|> map unmarshallW
notify :: MonadIO m => String -> String -> m ()
notify notificationTitle notificationMsg = safeSpawn "notify-send" [notificationTitle, notificationMsg]
ifLayoutIs :: String -> X a -> X a -> X a
ifLayoutIs layoutAName onLayoutA onLayoutB = do
ifLayoutIs layoutAName = ifLayoutName (== layoutAName)
ifLayoutName :: (String -> Bool) -> X a -> X a -> X a
ifLayoutName check onLayoutA onLayoutB = do
layout <- getActiveLayoutDescription
if (layout == layoutAName) then onLayoutA else onLayoutB
if (check layout) then onLayoutA else onLayoutB
-- Get the name of the active layout.
getActiveLayoutDescription :: X String
getActiveLayoutDescription = (description . W.layout . W.workspace . W.current) <$> gets windowset
-- }}}

View file

@ -0,0 +1,45 @@
{-# LANGUAGE FlexibleContexts #-}
{-# OPTIONS_GHC -fno-warn-missing-signatures -fno-warn-unused-binds #-}
module DescribedSubmap
( describedSubmap
)
where
import XMonad.Util.Run ( spawnPipe )
import XMonad.Util.EZConfig ( mkKeymap )
import XMonad
import XMonad.Actions.Submap ( submap )
import qualified System.IO as SysIO
describedSubmap :: String -> [(String, String, X ())] -> X ()
describedSubmap submapTitle mappings = do
conf <- asks config
let generatedSubmap =
submap $ mkKeymap conf $ map (\(k, _, a) -> (k, a)) mappings
promptDzenWhileRunning submapTitle descriptions generatedSubmap
where descriptions = map (\(k, desc, _) -> "<" ++ k ++ "> " ++ desc) mappings
-- | run a dzen prompt with the given title and lines for as long as the given `X` action is running
promptDzenWhileRunning :: String -> [String] -> X a -> X a
promptDzenWhileRunning promptTitle options action = do
handle <-
spawnPipe
$ "sleep 1 && dzen2 -e onstart=uncollapse -l "
++ lineCount
++ " -fn '"
++ font
++ "'"
io $ SysIO.hPutStrLn handle (unlines $ promptTitle : options)
result <- action
io $ SysIO.hClose handle
return result
where
lineCount = show $ length options
font = "-*-iosevka-medium-r-s*--16-87-*-*-*-*-iso10???-1"

View file

@ -0,0 +1,67 @@
module TiledDragging
( tiledDrag
)
where
import XMonad
import qualified XMonad.StackSet as W
import XMonad.Layout.DraggingVisualizer
import Control.Monad
-- | put this as a mouse mapping to be able to drag windows in tiled mode.
-- you need DraggingVisualizer for this to look good.
tiledDrag :: Window -> X ()
tiledDrag window = whenX (isClient window) $ do
focus window
(offsetX, offsetY) <- getPointerOffset window
(winX, winY, winWidth, winHeight) <- getWindowPlacement window
mouseDrag
(\posX posY ->
let rect = Rectangle (fInt (fInt winX + (posX - fInt offsetX)))
(fInt (fInt winY + (posY - fInt offsetY)))
(fInt winWidth)
(fInt winHeight)
in sendMessage $ DraggingWindow window rect
)
(sendMessage DraggingStopped >> performWindowSwitching window)
-- | get the pointer offset relative to the given windows root coordinates
getPointerOffset :: Window -> X (Int, Int)
getPointerOffset win = do
(_, _, _, oX, oY, _, _, _) <- withDisplay (\d -> io $ queryPointer d win)
return (fInt oX, fInt oY)
-- | return a tuple of windowX, windowY, windowWidth, windowHeight
getWindowPlacement :: Window -> X (Int, Int, Int, Int)
getWindowPlacement window = do
wa <- withDisplay (\d -> io $ getWindowAttributes d window)
return
(fInt $ wa_x wa, fInt $ wa_y wa, fInt $ wa_width wa, fInt $ wa_height wa)
performWindowSwitching :: Window -> X ()
performWindowSwitching win = do
root <- asks theRoot
(_, _, selWin, _, _, _, _, _) <- withDisplay (\d -> io $ queryPointer d root)
ws <- gets windowset
let allWindows = W.index ws
when ((win `elem` allWindows) && (selWin `elem` allWindows)) $ do
let allWindowsSwitched = map (switchEntries win selWin) allWindows
let (ls, t : rs) = break (== win) allWindowsSwitched
let newStack = W.Stack t (reverse ls) rs
windows $ W.modify' $ const newStack
where
switchEntries a b x | x == a = b
| x == b = a
| otherwise = x
-- | shorthand for fromIntegral
fInt :: Integral a => Integral b => a -> b
fInt = fromIntegral

View file

@ -0,0 +1,225 @@
{-# LANGUAGE NamedFieldPuns #-}
-----------------------------------------------------------------------------
-- |
-- Module : XMonad.Hooks.WindowSwallowing
-- Copyright : (c) 2020 Leon Kowarschick
-- License : BSD3-style (see LICENSE)
--
-- Maintainer : Leon Kowarschick. <thereal.elkowar@gmail.com>
-- Stability : unstable
-- Portability : unportable
--
-- Provides a handleEventHook that implements window swallowing.
--
-- If you open a GUI-window (i.e. feh) from the terminal,
-- the terminal will normally still be shown on screen, unnecessarily
-- taking up space on the screen.
-- With window swallowing, can detect that you opened a window from within another
-- window, and allows you "swallow" that parent window for the time the new
-- window is running.
--
-- __NOTE__: This module depends on @pstree@ to analyze the process hierarchy, so make
-- sure that is on your @$PATH@.
--
-- __NOTE__ that this does not always work perfectly:
--
-- - Because window swallowing needs to check the process hierarchy, it requires
-- both the child and the parent to be distinct processes. This means that
-- applications which implement instance sharing cannot be supported by window swallowing.
-- Most notably, this excludes some terminal emulators as well as tmux
-- from functioning as the parent process. It also excludes a good amount of
-- child programs, because many graphical applications do implement instance sharing.
-- For example, window swallowing will probably not work with your browser.
--
-- - To check the process hierarchy, we need to be able to get the process ID
-- by looking at the window. This requires the @_NET_WM_PID@ X-property to be set.
-- If any application you want to use this with does not provide the @_NET_WM_PID@,
-- there is not much you can do except for reaching out to the author of that
-- application and asking them to set that property.
-----------------------------------------------------------------------------
module WindowSwallowing
( swallowEventHook
)
where
import XMonad
import qualified XMonad.StackSet as W
import qualified XMonad.Util.ExtensibleState as XS
import XMonad.Util.Run ( runProcessWithInput )
import XMonad.Util.WindowProperties
import Data.Semigroup ( All(..) )
import qualified Data.Map.Strict as M
import Data.List ( isInfixOf )
import Control.Monad ( when )
-- $usage
-- You can use this module by including the following in your @~\/.xmonad/xmonad.hs@:
--
-- > import XMonad.Hooks.WindowSwallowing
--
-- and using 'swallowEventHook' somewhere in your 'handleEventHook', for example:
--
-- > myHandleEventHook = swallowEventHook [className =? "Alacritty", className =? "Termite"] [return True]
--
-- For more information on editing your handleEventHook and key bindings,
-- see "XMonad.Doc.Extending".
-- | handleEventHook that will swallow child windows when they are
-- opened from another window.
swallowEventHook
:: Query Bool -- ^ query the parent window has to match for window swallowing to occur.
-- Set this to @return True@ to run swallowing for every parent.
-> Query Bool -- ^ query the child window has to match for window swallowing to occur.
-- Set this to @return True@ to run swallowing for every child
-> Event -- ^ The event to handle.
-> X All
swallowEventHook parentQueries childQueries event = do
case event of
-- This is called right before a window gets opened. We intercept that
-- call to possibly open the window ourselves, swapping out
-- it's parent processes window for the new window in the stack.
MapRequestEvent { ev_window = childWindow } ->
-- For a window to be opened from within another window, that other window
-- must be focused. Thus the parent window that would be swallowed has to be
-- the currently focused window.
withFocused $ \parentWindow -> do
-- First verify that both windows match the given queries
parentMatches <- runQuery parentQueries parentWindow
childMatches <- runQuery childQueries childWindow
when (parentMatches && childMatches) $ do
-- read the windows _NET_WM_PID properties
childWindowPid <- getProp32s "_NET_WM_PID" childWindow
parentWindowPid <- getProp32s "_NET_WM_PID" parentWindow
case (parentWindowPid, childWindowPid) of
(Just (parentPid : _), Just (childPid : _)) -> do
-- check if the new window is a child process of the last focused window
-- using the process ids.
isChild <- liftIO $ fi childPid `isChildOf` fi parentPid
when isChild $ do
-- We set the newly opened window as the focused window, replacing the parent window.
-- If the parent window was floating, we transfer that data to the child,
-- such that it shows up at the same position, with the same dimensions.
windows
( W.modify' (\x -> x { W.focus = childWindow })
. moveFloatingState parentWindow childWindow
)
XS.modify (addSwallowedParent parentWindow childWindow)
_ -> return ()
return ()
-- This is called in many circumstances, most notably for us:
-- right before a window gets closed. We store the current
-- state of the window stack here, such that we know where the
-- child window was on the screen when restoring the swallowed parent process.
ConfigureEvent{} -> withWindowSet $ \ws -> do
XS.modify . setStackBeforeWindowClosing . currentStack $ ws
XS.modify . setFloatingBeforeWindowClosing . W.floating $ ws
-- This is called right after any window closes.
DestroyWindowEvent { ev_event = eventId, ev_window = childWindow } ->
-- Because DestroyWindowEvent is emitted a lot more often then you think,
-- this check verifies that the event is /actually/ about closing a window.
when (eventId == childWindow) $ do
-- we get some data from the extensible state, most notably we ask for
-- the \"parent\" window of the now closed window.
maybeSwallowedParent <- XS.gets (getSwallowedParent childWindow)
maybeOldStack <- XS.gets stackBeforeWindowClosing
oldFloating <- XS.gets floatingBeforeClosing
case (maybeSwallowedParent, maybeOldStack) of
(Just parent, Just oldStack) -> do
-- If there actually is a corresponding swallowed parent window for this window,
-- we will restore and place it where the closed window was.
-- For this, we look at the stack-state that was stored /before/ the window was closed,
-- and replace the focused window with the now restored parent.
-- we do this to make sure the parent is restored in the exact position the child was at.
windows
(\ws ->
updateCurrentStack
(const $ Just $ oldStack { W.focus = parent })
$ moveFloatingState childWindow parent
$ ws { W.floating = oldFloating }
)
-- after restoring, we remove the information about the swallowing from the state.
XS.modify $ removeSwallowed childWindow
XS.modify $ setStackBeforeWindowClosing Nothing
_ -> return ()
return ()
_ -> return ()
return $ All True
-- | run a pure transformation on the Stack of the currently focused workspace.
updateCurrentStack
:: (Maybe (W.Stack a) -> Maybe (W.Stack a))
-> W.StackSet i l a sid sd
-> W.StackSet i l a sid sd
updateCurrentStack f = W.modify (f Nothing) (f . Just)
currentStack :: W.StackSet i l a sid sd -> Maybe (W.Stack a)
currentStack = W.stack . W.workspace . W.current
-- | move the floating state from one window to another, sinking the original window
moveFloatingState
:: Ord a
=> a -- ^ window to move from
-> a -- ^ window to move to
-> W.StackSet i l a s sd
-> W.StackSet i l a s sd
moveFloatingState from to ws = ws
{ W.floating = M.delete from $ maybe (M.delete to (W.floating ws))
(\r -> M.insert to r (W.floating ws))
(M.lookup from (W.floating ws))
}
-- | check if a given process is a child of another process. This depends on "pstree" being in the PATH
-- NOTE: this does not work if the child process does any kind of process-sharing.
isChildOf
:: Int -- ^ child PID
-> Int -- ^ parent PID
-> IO Bool
isChildOf child parent = do
output <- runProcessWithInput "pstree" ["-T", "-p", show parent] ""
return $ any (show child `isInfixOf`) $ lines output
data SwallowingState =
SwallowingState
{ currentlySwallowed :: M.Map Window Window -- ^ mapping from child window window to the currently swallowed parent window
, stackBeforeWindowClosing :: Maybe (W.Stack Window) -- ^ current stack state right before DestroyWindowEvent is sent
, floatingBeforeClosing :: M.Map Window W.RationalRect -- ^ floating map of the stackset right before DestroyWindowEvent is sent
} deriving (Typeable, Show)
getSwallowedParent :: Window -> SwallowingState -> Maybe Window
getSwallowedParent win SwallowingState { currentlySwallowed } =
M.lookup win currentlySwallowed
addSwallowedParent :: Window -> Window -> SwallowingState -> SwallowingState
addSwallowedParent parent child s@SwallowingState { currentlySwallowed } =
s { currentlySwallowed = M.insert child parent currentlySwallowed }
removeSwallowed :: Window -> SwallowingState -> SwallowingState
removeSwallowed child s@SwallowingState { currentlySwallowed } =
s { currentlySwallowed = M.delete child currentlySwallowed }
setStackBeforeWindowClosing
:: Maybe (W.Stack Window) -> SwallowingState -> SwallowingState
setStackBeforeWindowClosing stack s = s { stackBeforeWindowClosing = stack }
setFloatingBeforeWindowClosing
:: M.Map Window W.RationalRect -> SwallowingState -> SwallowingState
setFloatingBeforeWindowClosing x s = s { floatingBeforeClosing = x }
instance ExtensionClass SwallowingState where
initialValue = SwallowingState { currentlySwallowed = mempty
, stackBeforeWindowClosing = Nothing
, floatingBeforeClosing = mempty
}
fi :: (Integral a, Num b) => a -> b
fi = fromIntegral

View file

@ -1,23 +1,28 @@
cabal-version: >=1.10
name: my-xmonad
version: 0.1.0.0
build-type: Simple
cabal-version: >=1.10
executable my-xmonad
main-is: ../xmonad.hs
-- other-modules lists custom modules in my ~/.xmonad/lib/ directory
other-modules: Config
, Rofi
build-depends: base
, xmonad >= 0.13
, xmonad-contrib >= 0.13
, dbus >= 1.2.12
, iwlib >= 0.1.0
, netlink >= 1.1.1.0
, containers >= 0.6.2.1
, utf8-string >= 1.0.1.1
, text >= 1.2.4.0
hs-source-dirs: lib
other-modules:
Config
Rofi
DescribedSubmap
TiledDragging
WindowSwallowing
default-language: Haskell2010
ghc-options: -Wall -threaded -fno-warn-missing-signatures
-- -Werror -fno-warn-missing-signatures -threaded
build-depends:
base -any,
xmonad >=0.13,
xmonad-contrib >=0.13,
dbus >=1.2.12,
iwlib >=0.1.0,
netlink >=1.1.1.0,
containers >=0.6.2.1,
utf8-string >=1.0.1.1,
text >=1.2.4.0,
process >= 0.0.10

View file

@ -0,0 +1,26 @@
cabal-version: >=1.10
name: my-xmonad
version: 0.1.0.0
build-type: Simple
executable my-xmonad
main-is: ../xmonad.hs
hs-source-dirs: lib
other-modules:
Config
Rofi
DescribedSubmap
TiledDragging
default-language: Haskell2010
ghc-options: -Wall -threaded -fno-warn-missing-signatures
build-depends:
base -any,
xmonad >=0.13,
xmonad-contrib >=0.13,
dbus >=1.2.12,
iwlib >=0.1.0,
netlink >=1.1.1.0,
containers >=0.6.2.1,
utf8-string >=1.0.1.1,
text >=1.2.4.0

View file

@ -1,70 +1,13 @@
# This file was automatically generated by 'stack init'
#
# Some commonly used options have been documented as comments in this file.
# For advanced use and comprehensive documentation of the format, please see:
# https://docs.haskellstack.org/en/stable/yaml_configuration/
# Resolver to choose a 'specific' stackage snapshot or a compiler version.
# A snapshot resolver dictates the compiler version and the set of packages
# to be used for project dependencies. For example:
#
# resolver: lts-3.5
# resolver: nightly-2015-09-21
# resolver: ghc-7.10.2
#
# The location of a snapshot can be provided as a file or url. Stack assumes
# a snapshot provided as a file might change, whereas a url resource does not.
#
# resolver: ./custom-snapshot.yaml
# resolver: https://example.com/snapshots/2018-01-01.yaml
resolver: lts-15.3
# User packages to be built.
# Various formats can be used as shown in the example below.
#
# packages:
# - some-directory
# - https://example.com/foo/bar/baz-0.0.2.tar.gz
# subdirs:
# - auto-update
# - wai
packages:
- .
# Dependency packages to be pulled from upstream that are not in the resolver.
# These entries can reference officially published versions as well as
# forks / in-progress versions pinned to a git hash. For example:
#
# extra-deps:
# - acme-missiles-0.3
# - git: https://github.com/commercialhaskell/stack.git
# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
#
- xmonad-contrib
extra-deps:
- iwlib-0.1.0
- netlink-1.1.1.0
- dbus-1.2.12
- text-1.2.4.0
# Override default flag values for local packages and extra-deps
# flags: {}
# Extra package databases containing global packages
# extra-package-dbs: []
# Control whether we use the GHC we find on the path
# system-ghc: true
#
# Require a specific version of stack, using version ranges
# require-stack-version: -any # Default
# require-stack-version: ">=2.1"
#
# Override the architecture used by stack, especially useful on Windows
# arch: i386
# arch: x86_64
#
# Extra directories used by stack for building
# extra-include-dirs: [/path/to/dir]
# extra-lib-dirs: [/path/to/dir]
#
# Allow a newer minor version of GHC than the snapshot specifies
# compiler-check: newer-minor

View file

@ -0,0 +1,73 @@
# This file was automatically generated by 'stack init'
#
# Some commonly used options have been documented as comments in this file.
# For advanced use and comprehensive documentation of the format, please see:
# https://docs.haskellstack.org/en/stable/yaml_configuration/
# Resolver to choose a 'specific' stackage snapshot or a compiler version.
# A snapshot resolver dictates the compiler version and the set of packages
# to be used for project dependencies. For example:
#
# resolver: lts-3.5
# resolver: nightly-2015-09-21
# resolver: ghc-7.10.2
#
# The location of a snapshot can be provided as a file or url. Stack assumes
# a snapshot provided as a file might change, whereas a url resource does not.
#
# resolver: ./custom-snapshot.yaml
# resolver: https://example.com/snapshots/2018-01-01.yaml
#ghc-build: nopie
resolver: lts-15.3
# User packages to be built.
# Various formats can be used as shown in the example below.
#
# packages:
# - some-directory
# - https://example.com/foo/bar/baz-0.0.2.tar.gz
# subdirs:
# - auto-update
# - wai
packages:
- .
# Dependency packages to be pulled from upstream that are not in the resolver.
# These entries can reference officially published versions as well as
# forks / in-progress versions pinned to a git hash. For example:
#
# extra-deps:
# - acme-missiles-0.3
# - git: https://github.com/commercialhaskell/stack.git
# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
#
extra-deps:
- iwlib-0.1.0
- netlink-1.1.1.0
- dbus-1.2.12
- text-1.2.4.0
# Override default flag values for local packages and extra-deps
# flags: {}
# Extra package databases containing global packages
# extra-package-dbs: []
# Control whether we use the GHC we find on the path
# system-ghc: true
#
# Require a specific version of stack, using version ranges
# require-stack-version: -any # Default
# require-stack-version: ">=2.1"
#
# Override the architecture used by stack, especially useful on Windows
# arch: i386
# arch: x86_64
#
# Extra directories used by stack for building
# extra-include-dirs: [/path/to/dir]
# extra-lib-dirs: [/path/to/dir]
#
# Allow a newer minor version of GHC than the snapshot specifies
# compiler-check: newer-minor

1
files/.xmonad/xmonad Submodule

@ -0,0 +1 @@
Subproject commit 40466b2be266e50e941f2fcc53b7526f1cfc71be

Binary file not shown.

View file

@ -0,0 +1 @@
Progress 0/2 Progress 1/2: my-xmonad 

15
files/auswahl/auswahlrc Normal file
View file

@ -0,0 +1,15 @@
use: rofi -dmenu -i -theme /home/leon/scripts/rofi-scripts/default_theme.rasi
menu: set-redshift :: -no-custom
off => redshift -x
medium => redshift -P -O 5000
high => redshift -P -O 4500
extreme => redshift -P -O 4000
menu: translate
de => notify-send "Translation" "$(trans :de "{{}}" --no-ansi)"
en => notify-send "Translation" "$(trans :en "{{}}" --no-ansi)"
menu: search
g => firefox https://google.com?q={{}}
yt => firefox https://youtube.com/results?search_query={{}}

226
files/custom_discord.css Normal file
View file

@ -0,0 +1,226 @@
:root {
/* ---- */
--bg1: #282828;
--bg2: #222222;
--bg3: #1d2021;
--button: #daddee1a;
/* ---- */
--fg2: #a89984;
--fg1: #fbf1c7;
--disabled: #696969;
/* ---- */
--accent: #83c07c;
--accent2: #83a598;
--contrast: #ffffff;
/* ---- */
--red: #fb4934;
--purple: #b16286;
--blue: #458588;
--cyan: #7acfe4;
--green: #83c07c;
--yellow: #fabd2f;
--border1: #223344;
--border2: #334455;
-moz-tab-size: 2;
}
.theme-dark {
--header-primary: var(--fg1);
--header-secondary: var(--fg2);
--text-normal: var(--fg1);
--text-muted: var(--fg2);
--text-link: var(--accent);
--channels-default: var(--fg2);
--interactive-normal: var(--fg2);
--interactive-hover: var(--fg1);
--interactive-active: var(--fg1);
--interactive-muted: var(--fg2);
--background-primary: var(--bg1);
--background-secondary: var(--bg2);
--background-secondary-alt: var(--bg1);
--background-tertiary: var(--bg1);
--background-accent: var(--accent);
--background-floating: var(--bg1);
--background-modifier-hover: rgba(79, 84, 92, 0.16);
--background-modifier-active: rgba(79, 84, 92, 0.24);
/*--background-modifier-accent: hsla(0, 0%, 100%, 0.06);*/
--background-modifier-accent: rgba(0, 0, 0, 0);
--elevation-high: 0 8px 16px rgba(0, 0, 0, 0.24);
--guild-header-text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);
--channeltextarea-background: var(--bg1);
--activity-card-background: var(--bg2);
--deprecated-panel-background: var(--bg3);
--background-modifier-selected: var(--bg1);
--elevation-low: none !important;
--background-message-hover: var(--bg2) !important;
}
* {
font-family: "Terminus (TTF)" !important;
font-weight: normal !important;
font-size: 1rem !important;
}
::-webkit-scrollbar,
::-webkit-scrollbar-track,
::-webkit-scrollbar-track-handle,
::-webkit-scrollbar-track-piece {
border-color: rgba(0, 0, 0, 0) !important;
background-color: rgba(0, 0, 0, 0) !important;
}
/* sections */
[class*="peopleColumn"] {
background-color: var(--bg2);
}
[class*="section"] {
background-color: var(--bg3);
}
[class*="sidebar"] [class*="container"] [class*="header"] {
background-color: var(--bg1) !important;
box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.2);
}
[class*="sidebar"] > [class*="container"],
[class*="members"][class*="scroller"] {
box-shadow: inset 0 0 15px 0 rgba(0, 0, 0, 0.2);
}
[class*="scrollerWrap"] {
border-radius: 10px !important;
}
[class*="membersWrap"] {
/*border-top-left-radius: 15px;*/
overflow: hidden;
}
/* message input area */
[class*="chatContent"] [class*="form"] {
padding-top: 0.5rem;
background-color: var(--bg1);
box-shadow: 0 -30px 20px -30px rgba(0, 0, 0, 0.3);
}
[class*="textAreaSlate"] {
background-color: var(--bg3);
border-radius: 13px;
color: var(--fg-2);
box-shadow: inset 0 0 10px 0 rgba(0, 0, 0, 0.1);
}
[class*="textAreaSlate"] > * {
padding-left: 1rem;
padding-right: 1rem;
}
/* components */
button[class*="lookFilled"] {
background-color: var(--button) !important;
}
button[class*="buttonActive"][class*="lookFilled"] {
background-color: var(--accent) !important;
color: var(--bg1) !important;
}
button[class*="lookLink"] {
color: var(--fg1) !important;
}
[class*="sprite"] {
filter: brightness(80%) sepia(80%) saturate(60%) !important;
}
[class*="username"] {
filter: sepia(30%) !important;
transition: filter 0.2s;
}
[class*="username"]:hover {
filter: sepia(20%) !important;
}
[class*="newMessagesBar-"] {
background-color: var(--accent);
opacity: 1;
}
[class*="newMessagesBar-"] button {
color: var(--bg1) !important;
}
img[class*="avatar"] {
filter: sepia(30%) !important;
transition: filter 0.1s, transform 0.1s ease-in-out;
}
img[class*="avatar"]:hover {
filter: sepia(0%) !important;
transform: scale(1.05);
}
[class*="pictureInPictureWindow"] {
box-shadow: 0 8px 15px 0px rgba(0, 0, 0, 0.5) !important;
}
[class*="divider"] {
border-color: var(--bg3);
}
[class*="divider"][class*="isUnread"]{
border-color: var(--red) !important;
}
[class*="unreadPill-"] {
background-color: var(--red);
}
[class*="unreadPillCap"] {
fill: var(--red);
}
button[class*="lookFilled"] {
color: var(--fg1) !important;
}
[class*="live"][class*="textBadge"] {
background-color: var(--red) !important;
color: var(--fg1);
}
[class*="modal"] [class*="queryContainer-"],
[class*="modal"] [class*="resultsGroup-"],
[class*="modal"] [class*="bodyInner-"],
[class*="modal"] [class*="quickMessage-"],
[class*="modal"] [class*="inner-"],
[class*="modal"] [class*="header-"]:not(header):not(h2),
[class*="modal"] [class*="uploadModal-"] {
background-color: var(--bg1) !important;
}
[class*="modal"] [class*="sourceScroller"],
[class*="modal"] [class*="segmentContainer-"] [class*="segmentControl"] /*go live source selector header bar*/{
background-color: var(--bg3) !important;
}
[class*="modal"] [class*="header"] {
padding-top: unset;
padding: 0.4rem;
}
[class*="modal"] [class*="footer-"] {
background-color: var(--bg3) !important;
filter: brightness(110%);
}
[class*="panels"] > *:nth-child(2) {
height: 4.6rem;
padding-bottom: 0.5rem;
}
div[class*="chat"] div[class*="root"] {
background-color: #282828;
}
div[class*="chat"] div[class*="root"] canvas {
/*border-radius: 20px;*/
}

231
files/ddg_darktheme.css Normal file
View file

@ -0,0 +1,231 @@
/* ==UserStyle==
@name duckduckgo-gruvbox-elkowar
@namespace github.com/openstyles/stylus
@version 1.0.0
@description gruvboxed duckduckgo
@author ElKowar
@preprocessor stylus
==/UserStyle== */
@-moz-document domain("duckduckgo.com") {
:root {
--bg1: #1d2021;
--bg2: #282828;
--bg3: #504945;
--bg4: #202020;
--fg1: #ebdbb2;
--fg1: #d5c4a1;
--fg3: #a89984;
--col_blue: #83a598;
}
body {
background-color: var(--bg2);
}
*,
div[class*="result"],
.result__snippet b,
.result__date {
color: var(--fg1) !important;
font-family: "xos4 terminus" !important;
font-size: 1rem;
}
#duckbar a.zcm__link {
border-bottom-color: var(--fg1) !important;
padding: 0 10px;
margin: 0 0;
transition: background-color 0.1s ease-in-out;
&:hover {
background-color: var(--bg1);
}
}
.switch {
background-color: var(--bg3);
}
.zci,
.tile-wrap,
.metabar,
.zci-wrap {
background-color: var(--bg2) !important;
border: none !important;
}
.tile {
background-color: var(--bg2);
box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.5);
border: none !important;
transition: box-shadow 0.1s ease-in-out;
&.highlight {
box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.8) !important;
}
}
.footer {
background-color: var(--bg2);
display: none !important;
.footer__card {
background-color: var(--bg1) !important;
border: none;
}
}
.btn.feedback-btn,
.feedback-prompt,
.header__clickable[data-type="showcase"],
.header__label.social {
display: none;
}
.modal__box,
.modal__header {
background: var(--bg2) !important;
& > * {
background: var(--bg2) !important;
}
}
pre.prettyprint,
code {
background-color: var(--bg1);
}
.module__toggle--more::after {
background: linear-gradient(var(--bg2), var(--bg1)) !important;
}
.modal__list__link.is-highlighted {
background-color: var(--bg3) !important;
}
.module__clickable-header > * {
color: var(--fg1) !important;
}
.btn.btn--full {
background-color: var(--bg1);
border: none;
}
.switch__knob {
background-color: var(--fg1) !important;
}
.site-wrapper {
box-shadow: none;
background-color: var(--bg2) !important;
.header-wrap {
background-color: var(--bg2);
}
}
.header__logo {
filter: sepia(80%);
}
form#search_form {
background-color: var(--bg4) !important;
box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3);
border: none;
transition: box-shadow 0.1s ease-in-out;
}
div.result {
transition: box-shadow 0.1s ease-in-out;
border: none;
&.highlight {
box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.3) !important;
border-radius: 5px;
border: none !important;
}
a.result__url > * {
color: var(--col_blue) !important;
font-family: "cozette" !important;
}
a.result__a {
font-size: 1.2rem !important;
font-family: "xos4 terminus" !important;
}
.result__snippet {
font-size: 1rem;
color: var(--fg2) !important;
}
img.result__icon__img {
filter: sepia(60%) contrast(130%);
}
}
.msg--spelling :link,
.msg--spelling :visited,
.msg--spelling a:hover,
.msg__clear,
.msg__clear:hover,
.msg__all,
.msg__all:visited {
color: var(--fg1) !important;
}
.dropdown.dropdown--region {
display: none !important;
}
#search_form {
input {
z-index: 10 !important;
background-color: var(--bg4) !important;
&[type="submit"],
&[type="button"] {
background-color: rgba(0, 0, 0, 0) !important;
}
}
&.search--focus,
&.search--hover {
box-shadow: 4px 4px 8px 0px rgba(0, 0, 0, 0.3);
}
&.search--focus,
&.search--hover #search_button {
background-color: var(--bg4);
}
}
.search__autocomplete {
transform: translateY(15px);
z-index: 5 !important;
border: none;
padding-right: 2px;
background-color: var(--bg4);
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.5);
& > * {
background-color: var(--bg4);
&.t-normal {
color: var(--fg3) !important;
}
&:not(.t-normal) {
font-weight: normal !important;
color: var(--fg1) !important;
}
}
}
.search-filters-wrap::after,
.search-filters-wrap::before,
.metabar__dropdowns-wrap::before,
.metabar__dropdowns-wrap::after {
display: none;
}
}

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019-2020 mut-ex
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -0,0 +1,102 @@
# minimal-functional-fox
> ###### *A minimal, yet functional configuration for Firefox!*
![Demo](https://raw.githubusercontent.com/mut-ex/minimal-functional-fox/master/demo.gif)
[![License](http://img.shields.io/:license-mit-blue.svg)](http://doge.mit-license.org)
------
## Features
- Minimal bloat (non-crucial icons and decorations hidden)
- Easy way to tweak fonts, colors, and spacings to your liking through CSS variables
- Tab list below toolbar
- Tab(s) with sound playing highlighted with a different color
- Centered URL bar with narrow-er results list
- And more!
------
## Prerequisites
* Verify that the user **stylesheets (userChrome)** option is enabled:
1. Go to the address `about:config` in Firefox
2. Search for `toolkit.legacyUserProfileCustomizations.stylesheets`
3. Confirm the option is set to **true**
* Make sure that you have the **Default** theme enabled
1. Go to the address `about:addons`
2. **Enable** the **Default** theme if not already enabled
------
## Installation
### Quick Install
You can quickly install minimal functional fox via the command-line by using `curl`:
```bash
sh -c "$(curl -fsSL https://raw.githubusercontent.com/mut-ex/minimal-functional-fox/master/install.sh)"
```
It is a good idea to inspect the install script for projects you aren't familiar with. To do that, you can download the install script separately, go through it to make sure everything looks OK, then go ahead and run it once you are satisfied:
```bash
curl -Lo install.sh https://raw.githubusercontent.com/mut-ex/minimal-functional-fox/master/install.sh
sh install.sh
```
**Note:** The install script will create a backup of your existing `userChrome.css`, and `userContent.css` files by renaming them to `userChrome.css~`, and `userContent.css~` respectively in the chrome directory.
### Manual Install
If quick install does not work, or if you simply prefer to; you can manually install minimal functional fox through the following steps:
1. Locate your Firefox user directory. You should be able to find it by navigating to `/home/.mozilla/firefox/` and looking for a directory ending with the world `.default-release`.
2. Within your Firefox user directory, locate the `chrome` directory, if one does not already exist you can simply go ahead and create it yourself.
3. Download the contents of this repository, and copy *all* the files to the chrome directory within your Firefox user directory.
After installation, restart Firefox to see the effects.
------
## Recommended Tweaks
* Select the **Customize** option from the **hamburger menu** **(≡)**, and remove all items except for:
* Forward button
* Back button
* Downloads button
* The new tab page extension is called **nightTab**. [You can can find it here](https://addons.mozilla.org/en-US/firefox/addon/nighttab/)
------
## Customizing
You can easily tweak the theme by changing the relevant CSS variables, starting with `--mff-` located within the :root section at the top of the `userChrome.css` file.
```css
:root {
/* Minimal Functional Fox variables*/
--mff-bg: #293241;
--mff-icon-color: #e0fbfc;
--mff-nav-toolbar-padding: 8px;
/*
...
...
...
*/
}
```

View file

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!-- Generator: Gravit.io --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 16 16" width="16pt" height="16pt"><defs><clipPath id="_clipPath_99lNy5iVNzBT4GJ61eRvLV4FbIJfEq2X"><rect width="16" height="16"/></clipPath></defs><g clip-path="url(#_clipPath_99lNy5iVNzBT4GJ61eRvLV4FbIJfEq2X)"><clipPath id="_clipPath_PSmJUw238rlrF3iVjoZbuIy7ApS18eFZ"><rect x="0" y="0" width="16" height="16" transform="matrix(1,0,0,1,0,0)" fill="rgb(255,255,255)"/></clipPath><g clip-path="url(#_clipPath_PSmJUw238rlrF3iVjoZbuIy7ApS18eFZ)"><g><defs><filter id="hr6gh2N39iEKGHUEUXPQ1VpI5CnFB6KP" x="-200%" y="-200%" width="400%" height="400%" filterUnits="objectBoundingBox" color-interpolation-filters="sRGB"><feGaussianBlur xmlns="http://www.w3.org/2000/svg" in="SourceGraphic" stdDeviation="1.42936090628390283"/><feOffset xmlns="http://www.w3.org/2000/svg" dx="0" dy="0" result="pf_100_offsetBlur"/><feFlood xmlns="http://www.w3.org/2000/svg" flood-color="#000000" flood-opacity="0.65"/><feComposite xmlns="http://www.w3.org/2000/svg" in2="pf_100_offsetBlur" operator="in" result="pf_100_dropShadow"/><feBlend xmlns="http://www.w3.org/2000/svg" in="SourceGraphic" in2="pf_100_dropShadow" mode="normal"/></filter></defs><g filter="url(#hr6gh2N39iEKGHUEUXPQ1VpI5CnFB6KP)"><mask id="_mask_kcpkNUVqAh3jvumwkzpWdE5WZ1TZaYfV" x="-200%" y="-200%" width="400%" height="400%"><rect x="-200%" y="-200%" width="400%" height="400%" style="fill:white;"/><path d=" M 12.487 8 L 3.513 8 M 8 3.513 L 8 12.487" fill-rule="evenodd" fill="black" stroke="none"/></mask><path d=" M 12.487 8 L 3.513 8 M 8 3.513 L 8 12.487" fill-rule="evenodd" fill="rgb(0,0,0)" mask="url(#_mask_kcpkNUVqAh3jvumwkzpWdE5WZ1TZaYfV)" vector-effect="non-scaling-stroke" stroke-width="3" stroke="rgb(255,255,255)" stroke-opacity="100" stroke-linejoin="miter" stroke-linecap="round" stroke-miterlimit="3"/><path d=" M 12.487 8 L 3.513 8 M 8 3.513 L 8 12.487" fill-rule="evenodd" fill="rgb(0,0,0)"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 KiB

View file

@ -0,0 +1,34 @@
## A basic term-like startpage with tree structure
![preview-StartupPage](../Screenshots/StartupPage.png)
### For using it in Firfox follow the following steps -:
* Make a file called `enable-autoconfig.js` in `/usr/lib/firefox/browser/defaults/preferences`
add this to that file:-
```
// enable autoconfig
pref("general.config.sandbox_enabled", false);
pref("general.config.filename", "autoconfig.cfg");
pref("general.config.obscure_value", 0);
```
* Make `autoconfig.cfg` in `/usr/lib/firefox`
and add this to it:-
```
var {classes:Cc,interfaces:Ci,utils:Cu} = Components;
/* set new tab page */
try {
Cu.import("resource:///modules/AboutNewTab.jsm");
var newTabURL = "file://<path to html file>";
AboutNewTab.newTabURL = newTabURL;
} catch(e){Cu.reportError(e);} // report errors in the Browser Console
```
Remember to change the path to where you store the HTML files
Use Discord.css with stylus(extension) to enable css in discord

View file

@ -0,0 +1,74 @@
#!/bin/bash
echoerr() { printf "%s\n" "$*" >&2; }
download_mff() {
echoerr " [>>] Downloading..."
curl -LJ0 https://github.com/mut-ex/minimal-functional-fox/archive/master.tar.gz | tar -xz -C /tmp/
if [[ $? -eq 0 ]]; then
echoerr " [>>] Copying..."
USERCHROME="/tmp/minimal-functional-fox-master/userChrome.css"
USERCONTENT="/tmp/minimal-functional-fox-master/userContent.css"
cp -r --backup=simple -t $CHROME_DIRECTORY $USERCHROME $USERCONTENT
rm -f USERCHROME USERCONTENT
cp -r /tmp/minimal-functional-fox-master/* $CHROME_DIRECTORY
if [[ $? -eq 0 ]]; then
rm -rf /tmp/minimal-functional-fox-master
else
echoerr " [!!] There was a problem copying the files. Terminating..."
return 1
fi
else
echoerr " [!!] There was a problem downloading the files. Terminating..."
return 1
fi
cat <<-'EOF'
_ _ _
_ __ ___ (_)_ __ (_)_ __ ___ __ _| |
| '_ ` _ \| | '_ \| | '_ ` _ \ / _` | |
| | | | | | | | | | | | | | | | (_| | |
|_|_|_| |_|_|_| |_|_|_| |_| |_|\__,_|_| _
/ _|_ _ _ __ ___| |_(_) ___ _ __ __ _| |
| |_| | | | '_ \ / __| __| |/ _ \| '_ \ / _` | |
| _| |_| | | | | (__| |_| | (_) | | | | (_| | |
|_|_ \__,_|_| |_|\___|\__|_|\___/|_| |_|\__,_|_|
/ _| _____ __
| |_ / _ \ \/ /
| _| (_) > <
|_| \___/_/\_\
EOF
echoerr " Installation successful! Enjoy :)"
}
MOZILLA_USER_DIRECTORY="$(find ~/.mozilla/firefox -maxdepth 1 -type d -regextype egrep -regex '.*[a-zA-Z0-9]+.default-release')"
if [[ -n $MOZILLA_USER_DIRECTORY ]]; then
# echoerr "mozilla user directory found: $MOZILLA_USER_DIRECTORY"
CHROME_DIRECTORY="$(find $MOZILLA_USER_DIRECTORY -maxdepth 1 -type d -name 'chrome')"
if [[ -n $CHROME_DIRECTORY ]]; then
# echoerr "chrome directory found: ""$CHROME_DIRECTORY"
download_mff
else
echoerr " [>>] No chrome directory found! Creating one..."
mkdir $MOZILLA_USER_DIRECTORY"/chrome"
if [[ $? -eq 0 ]]; then
CHROME_DIRECTORY="$MOZILLA_USER_DIRECTORY/chrome"
# echoerr "Directory succesfully created"
download_mff
else
echoerr " [!!] There was a problem creating the directory. Terminating..."
exit 1
fi
fi
else
echoerr " [!!] No mozilla user directory found. Terminating..."
exit 1
fi

View file

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!-- Generator: Gravit.io --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 16 16" width="16pt" height="16pt"><defs><clipPath id="_clipPath_z1ZWMbJsyhiOU2QHbFJoUMhQtGZ43GMW"><rect width="16" height="16"/></clipPath></defs><g clip-path="url(#_clipPath_z1ZWMbJsyhiOU2QHbFJoUMhQtGZ43GMW)"><defs><filter id="VFDVuOTf5K98KT4GTZIfo6t2oUeOZ3OQ" x="-200%" y="-200%" width="400%" height="400%" filterUnits="objectBoundingBox" color-interpolation-filters="sRGB"><feGaussianBlur xmlns="http://www.w3.org/2000/svg" in="SourceGraphic" stdDeviation="1.42936090628390283"/><feOffset xmlns="http://www.w3.org/2000/svg" dx="0" dy="0" result="pf_100_offsetBlur"/><feFlood xmlns="http://www.w3.org/2000/svg" flood-color="#000000" flood-opacity="1"/><feComposite xmlns="http://www.w3.org/2000/svg" in2="pf_100_offsetBlur" operator="in" result="pf_100_dropShadow"/><feBlend xmlns="http://www.w3.org/2000/svg" in="SourceGraphic" in2="pf_100_dropShadow" mode="normal"/></filter></defs><g filter="url(#VFDVuOTf5K98KT4GTZIfo6t2oUeOZ3OQ)"><path d=" M 6.459 8.003 L 12.444 2.018 C 12.609 1.853 12.7 1.633 12.7 1.399 C 12.7 1.164 12.609 0.945 12.444 0.78 L 11.92 0.256 C 11.755 0.091 11.535 0 11.301 0 C 11.067 0 10.847 0.091 10.682 0.256 L 3.555 7.382 C 3.39 7.548 3.3 7.768 3.3 8.003 C 3.3 8.239 3.39 8.459 3.555 8.625 L 10.676 15.744 C 10.84 15.909 11.06 16 11.294 16 C 11.529 16 11.749 15.909 11.913 15.744 L 12.438 15.22 C 12.779 14.879 12.779 14.323 12.438 13.982 L 6.459 8.003 L 6.459 8.003 Z " fill="rgb(255,255,255)"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,10 @@
var { classes: Cc, interfaces: Ci, utils: Cu } = Components
/* set new tab page */
try {
Cu.import("resource:///modules/AboutNewTab.jsm")
const newTabURL = "/home/leon/.config/my_startpage/index.html"
AboutNewTab.newTabURL = newTabURL
} catch (e) {
Cu.reportError(e)
} // report errors in the Browser Console

View file

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!-- Generator: Gravit.io --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 16 16" width="16pt" height="16pt"><defs><clipPath id="_clipPath_eVFSl4zvN5oTHPzyWFXDKL3KvwnaLKzR"><rect width="16" height="16"/></clipPath></defs><g clip-path="url(#_clipPath_eVFSl4zvN5oTHPzyWFXDKL3KvwnaLKzR)"><clipPath id="_clipPath_whDLWxO2Es9F8hEuhZ0p3GS4myfSGk47"><rect x="0" y="0" width="16" height="16" transform="matrix(1,0,0,1,0,0)" fill="rgb(255,255,255)"/></clipPath><g clip-path="url(#_clipPath_whDLWxO2Es9F8hEuhZ0p3GS4myfSGk47)"><g><g filter="url(#ypa27OiaF8P4AvdUhn4W059B0fCNWPt7)"><path d=" M 9.541 8.003 L 3.556 2.018 C 3.391 1.853 3.3 1.633 3.3 1.399 C 3.3 1.164 3.391 0.945 3.556 0.78 L 4.08 0.256 C 4.245 0.091 4.465 0 4.699 0 C 4.933 0 5.153 0.091 5.318 0.256 L 12.445 7.382 C 12.61 7.548 12.7 7.768 12.7 8.003 C 12.7 8.239 12.61 8.459 12.445 8.625 L 5.324 15.744 C 5.16 15.909 4.94 16 4.706 16 C 4.471 16 4.251 15.909 4.087 15.744 L 3.562 15.22 C 3.221 14.879 3.221 14.323 3.562 13.982 L 9.541 8.003 L 9.541 8.003 Z " fill="rgb(255,255,255)"/></g><defs><filter id="ypa27OiaF8P4AvdUhn4W059B0fCNWPt7" x="-200%" y="-200%" width="400%" height="400%" filterUnits="objectBoundingBox" color-interpolation-filters="sRGB"><feGaussianBlur xmlns="http://www.w3.org/2000/svg" in="SourceGraphic" stdDeviation="1.42936090628390283"/><feOffset xmlns="http://www.w3.org/2000/svg" dx="0" dy="0" result="pf_100_offsetBlur"/><feFlood xmlns="http://www.w3.org/2000/svg" flood-color="#000000" flood-opacity="1"/><feComposite xmlns="http://www.w3.org/2000/svg" in2="pf_100_offsetBlur" operator="in" result="pf_100_dropShadow"/><feBlend xmlns="http://www.w3.org/2000/svg" in="SourceGraphic" in2="pf_100_dropShadow" mode="normal"/></filter></defs></g></g></g></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,456 @@
/* variables {{{ */
:root {
/* Minimal Functional Fox variables*/
--mff-bg: #282828;
--foreground: #ebdbb2;
--foreground-lighter: #d5c4a1;
--mff-icon-color: #ebdbb2;
--mff-nav-toolbar-padding: 0px;
--mff-sidebar-bg: var(--mff-bg);
--mff-sidebar-color: #ebdbb2;
--mff-tab-border-radius: 0px;
--mff-tab-color: #ebdbb2;
/*--mff-tab-font-family: "terminus (ttf)";*/
--mff-tab-font-family: "cozette";
--mff-tab-font-size: 10pt;
--mff-tab-font-weight: 400;
--mff-tab-height: 20px;
--mff-tab-pinned-bg: #70c1b3;
--mff-tab-selected-bg: #689d6a;
--mff-tab-soundplaying-bg: #9c89b8;
--mff-urlbar-color: #ebdbb2;
--mff-urlbar-focused-color: #ebdbb2;
--mff-urlbar-font-family: "terminus (ttf)";
--mff-urlbar-font-size: 12pt;
--mff-urlbar-font-weight: normal;
--mff-urlbar-results-color: #ebdbb2;
--mff-urlbar-results-font-family: "terminus (ttf)";
--mff-urlbar-results-font-size: 12pt;
--mff-urlbar-results-font-weight: normal; /*700;*/
--mff-urlbar-results-url-color: #83a598;
/* --mff-tab-selected-bg: linear-gradient(90deg, rgba(232,74,95,1) 0%, rgba(255,132,124,1) 50%, rgba(254,206,168,1) 100%); */
/* --mff-urlbar-font-weight: 600; */
/* Overriden Firefox variables*/
--autocomplete-popup-background: var(--mff-bg) !important;
--default-arrowpanel-background: var(--mff-bg) !important;
--default-arrowpanel-color: #ebdbb2 !important;
--lwt-toolbarbutton-icon-fill: var(--mff-icon-color) !important;
--panel-disabled-color: #ebdbb280;
--toolbar-bgcolor: var(--mff-bg) !important;
--urlbar-separator-color: transparent !important;
--autocomplete-popup-highlight-color: #fabd2f !important;
--autocomplete-popup-highlight-background: #665c54 !important;
--arrowpanel-background: var(--mff-bg) !important;
--arrowpanel-color: var(--foreground) !important;
--panel-disabled-color: rgba(var(--foreground-lighter), 0.4) !important;
}
/* }}} */
/* Tabs {{{ */
.tab-background[selected="true"] {
background: var(--mff-tab-selected-bg) !important;
}
.tabbrowser-tab[visuallyselected="true"] .tab-text {
color: var(--mff-bg) !important;
}
.tab-background:not[visuallyselected] {
background: var(--mff-tab-selected-bg) !important;
/*opacity: 0.5 !important;*/
opacity: 1 !important;
}
/* This positions the tabs under the navaigator container */
#titlebar {
-moz-box-ordinal-group: 3 !important;
}
.tabbrowser-tab::after,
.tabbrowser-tab::before {
border-left: none !important;
}
.tab-background {
border: none !important;
}
.tabbrowser-arrowscrollbox {
margin-inline-start: 4px !important;
margin-inline-end: 0px !important;
}
#tabbrowser-tabs,
#tabbrowser-arrowscrollbox {
min-height: 0 !important;
}
.tab-close-button {
display: none !important;
}
.tab-text {
font-family: var(--mff-tab-font-family);
font-weight: var(--mff-tab-font-weight);
font-size: var(--mff-tab-font-size) !important;
color: var(--mff-tab-color);
}
/* Hide the favicon for tabs */
hbox.tab-content .tab-icon-image {
display: none !important;
}
/* Show the favicon for tabs that are pinned */
hbox.tab-content[pinned="true"] .tab-icon-image {
display: initial !important;
}
hbox.tab-content[pinned="true"] .tab-text {
display: none !important;
}
#tabbrowser-tabs {
--tab-loading-fill: #033433 !important;
}
.tab-label-container:not([textoverflow]) {
display: flex;
overflow: hidden;
justify-content: center;
width: 50% !important;
max-width: 50% !important;
min-width: 50% !important;
}
/* .tab-label-container::after {
content: "?" !important;
} */
.tab-line {
display: none !important;
margin-bottom: 0 !important;
}
.tabbrowser-tab {
border-radius: var(--mff-tab-border-radius) !important;
border-width: 0;
height: var(--mff-tab-height) !important;
margin-bottom: 0px !important;
margin-inline-end: 4px !important;
margin-top: 0px !important;
max-height: var(--mff-tab-height) !important;
min-height: var(--mff-tab-height) !important;
}
.tabbrowser-tab[soundplaying="true"] {
background-color: var(--mff-tab-soundplaying-bg) !important;
}
#tabs-newtab-button {
list-style-image: url("add.svg") !important;
opacity: 0.7;
}
.tab-icon-sound {
display: none !important;
}
/* }}} */
/* Toolbar {{{ */
::selection {
background-color: #8ec07c !important;
color: #282828 !important;
}
.urlbar-icon > image {
fill: var(--mff-icon-color) !important;
color: var(--mff-icon-color) !important;
}
.toolbarbutton-text {
color: var(--mff-icon-color) !important;
}
.urlbar-icon {
color: var(--mff-icon-color) !important;
}
.toolbarbutton-1 {
filter: brightness(80%) sepia(50%);
}
#back-button,
#forward-button {
filter: brightness(80%) sepia(100%);
transform: scale(0.9);
}
#reload-button {
transform: scale(0.9);
}
#tabs-newtab-button image {
fill: var(--mff-tab-color);
color: var(--mff-tab-color);
}
#urlbar-results {
font-family: var(--mff-urlbar-results-font-family);
font-weight: var(--mff-urlbar-results-font-weight);
font-size: var(--mff-urlbar-results-font-size) !important;
color: var(--mff-urlbar-results-color) !important;
}
#urlbar-container {
min-height: 0px;
}
.urlbarView-row[type="bookmark"] > span {
color: #b8bb26 !important;
}
.urlbarView-row[type="switchtab"] > span {
color: #fe8019 !important;
}
.urlbarView-url,
.search-panel-one-offs-container {
color: var(--mff-urlbar-results-url-color) !important;
font-family: var(--mff-urlbar-font-family);
font-weight: var(--mff-urlbar-results-font-weight);
font-size: var(--mff-urlbar-font-size) !important;
}
.urlbarView-favicon,
.urlbarView-type-icon {
display: none !important;
}
#urlbar-input {
font-size: var(--mff-urlbar-font-size) !important;
color: var(--mff-urlbar-color) !important;
font-family: var(--mff-urlbar-font-family) !important;
font-weight: var(--mff-urlbar-font-weight) !important;
text-align: center !important;
}
#tracking-protection-icon-container,
#identity-box {
display: none;
}
#back-button > .toolbarbutton-icon {
--backbutton-background: transparent !important;
border: none !important;
}
#back-button {
list-style-image: url("left-arrow.svg") !important;
}
#forward-button {
list-style-image: url("right-arrow.svg") !important;
}
toolbar {
background-image: none !important;
}
#urlbar-background {
opacity: 0.98 !important;
}
#navigator-toolbox,
toolbaritem {
border: none !important;
}
#urlbar-background {
background-color: var(--mff-bg) !important;
border: none !important;
}
.toolbar-items {
background-color: var(--mff-bg) !important;
}
#sidebar-search-container {
background-color: var(--mff-sidebar-bg) !important;
}
box.panel-arrowbox {
display: none;
}
box.panel-arrowcontent {
border-radius: 0px !important;
border: none !important;
}
tab.tabbrowser-tab {
overflow: hidden;
}
tab.tabbrowser-tab:hover {
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.05);
}
image#star-button {
display: none;
}
toolbar#nav-bar {
padding: var(--mff-nav-toolbar-padding) !important;
}
toolbar#nav-bar {
padding: 4px !important;
}
#urlbar {
max-width: 90% !important;
margin: 0 5% !important;
margin-top: -5px !important;
/* position: unset!important; */
}
#urlbar-input:focus {
color: var(--mff-urlbar-focused-color) !important;
}
.megabar[breakout-extend="true"]:not([open="true"]) > #urlbar-background {
box-shadow: none !important;
background-color: transparent !important;
}
toolbarbutton {
box-shadow: none !important;
}
/* }}} */
/* Sidebar {{{ */
.close-icon,
.urlbar-icon {
fill: var(--mff-icon-color) !important;
}
.sidebar-placesTree {
color: var(--mff-sidebar-color) !important;
}
#sidebar-switcher-target {
/* color: white !important; */
}
#sidebar-box {
--sidebar-background-color: var(--mff-sidebar-bg) !important;
}
splitter#sidebar-splitter {
opacity: 0 !important;
}
splitter#sidebar-splitter {
border: none !important;
background-color: transparent !important;
}
image#sidebar-icon {
display: none;
}
/* }}} */
/* arrow panel {{{*/
.panel-arrowcontent {
padding: 0px !important;
margin: 0px !important;
}
toolbarseparator {
display: none;
}
/* something */
.toolbarbutton-icon,
.toolbarbutton-icon::after {
fill: #ebdbb2 !important;
}
.urlbarView-row[selected="true"] {
color: red;
}
/* }}} */
/* Source file https://github.com/MrOtherGuy/firefox-csshacks/tree/master/chrome/hide_tabs_with_one_tab.css made available under Mozilla Public License v. 2.0
See the above repository for updates as well as full license text. */
/* Makes tabs toolbar items zero-height initially and sets enlarge them to fill up space equal to tab-min-height set on tabs */
/* Firefox 65+ only */
:root[sizemode="normal"] #nav-bar {
--uc-window-drag-space-width: 20px;
}
#titlebar {
-moz-appearance: none !important;
}
#tabbrowser-tabs,
#tabbrowser-tabs > .tabbrowser-arrowscrollbox,
#tabbrowser-arrowscrollbox {
min-height: 0 !important;
}
:root:not([customizing]) #tabbrowser-tabs .tabs-newtab-button,
:root:not([customizing]) #tabs-newtab-button,
:root:not([customizing]) #TabsToolbar-customization-target > .toolbarbutton-1,
:root:not([customizing]) #TabsToolbar .titlebar-button {
-moz-appearance: none !important;
height: 0px;
padding-top: 0px !important;
padding-bottom: 0px !important;
-moz-box-align: stretch;
margin: 0 !important;
}
#tabbrowser-tabs .tabbrowser-tab {
height: var(--tab-min-height);
}
#tabbrowser-tabs .tabbrowser-tab[first-visible-tab="true"][last-visible-tab="true"] {
visibility: collapse !important;
}
/* Button re-styling */
#tabs-newtab-button:hover,
#tabbrowser-tabs .tabs-newtab-button:hover {
background-color: var(--toolbarbutton-hover-background);
}
#tabs-newtab-button > .toolbarbutton-icon,
#tabbrowser-tabs .tabs-newtab-button > .toolbarbutton-icon {
padding: 0 !important;
transform: scale(0.6);
background-color: transparent !important;
}
/* Extra top padding in maximized window */
@media (-moz-os-version: windows-win10) {
:root[sizemode="maximized"] #navigator-toolbox {
padding-top: 7px !important;
}
}
/* Fix window controls not being clickable */
:root[tabsintitlebar] #toolbar-menubar[autohide="true"][inactive] {
transition: height 0ms steps(1) 80ms;
}
#nav-bar {
border-inline: var(--uc-window-drag-space-width) solid var(--toolbar-bgcolor);
}

View file

@ -0,0 +1,93 @@
/* material firefox imports */
@import "global/variables.css";
@import "global/global.css";
@import "icons/icons.css";
@import "tabbar/tabbar.css";
@import "navbar/navbar.css";
@import "personalbar/personalbar.css";
@import "popup/popup.css";
@import "urlbar/urlbar.css";
@import "findbar/findbar.css";
:root {
--initial-width : 70px; /* initial width of the sidebar */
--sidebar-width : 250px; /* expanded width of the sidebar */
--toolbar-height : 0;
--menubar-height : 0;
--toolmenubar-height: -40px; /* sum of previous two */
--shadow-color : #28282F; /* shadow color. set to #00000000 for no shadow. same as folder color from hntp and tab-hover color from tst*/
}
/* show bookmarks toolbar on new tab only */
#main-window #PersonalToolbar {
visibility : collapse !important;
z-index : 1!important;
position : relative!important;
margin-left: var(--initial-width); /* shift toolbar to the right based on initial width */
margin-top : var(--toolbar-height) !important;
}
#main-window[title^="Firefox Developer Edition"] #PersonalToolbar {
visibility: visible !important;
margin-top: -1px !important;
}
/*
There's two main sidebar components.
1. #sidebar-box (outer)
2. #sidebar (inner)
*/
/* lock outer to height by doing the inverse margin of the toolbar element */
/* set outer width = initial width */
#sidebar-box {
z-index : 1000 !important;
position : relative!important;
margin-top : var(--menubar-height) !important;
padding-top : calc(-1*var(--menubar-height));
border-radius: 0 5px 0px 0;
min-width : var(--initial-width) !important;
max-width : var(--initial-width) !important;
}
/* inner width = expanded width & move inner to only show initial-width long section */
#sidebar-box #sidebar {
min-width : var(--sidebar-width) !important;
max-width : var(--sidebar-width) !important;
transform : translateX(calc(var(--initial-width) - var(--sidebar-width))) !important;
border-radius: 0 3px 0px 0;
transition : all 0.2s ease-in-out;
}
/* move inner to show entire sidebar */
#sidebar-box #sidebar:hover {
transform : translateX(0) !important;
box-shadow: 2px 0 33px var(--shadow-color);
}
#main-window[title^="Firefox Developer Edition"] #sidebar-box {
margin-top: var(--toolmenubar-height) !important;
}
/* hide sidebar header for tree style tabs sidebar */
#sidebar-box[sidebarcommand="treestyletab_piro_sakura_ne_jp-sidebar-action"] #sidebar-header {
display: none;
}
/* Hide the title bar */
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
/* to hide the native tabs */
#TabsToolbar {
visibility: collapse;
}
/* to hide the sidebar header */
#sidebar-header {
visibility: collapse;
}
/* Hide splitter, when using Tree Style Tab. */
#sidebar-box[sidebarcommand="treestyletab_piro_sakura_ne_jp-sidebar-action"] + #sidebar-splitter {
display: none !important;
}

View file

@ -0,0 +1,845 @@
/* :::::::: Sub-Script/Overlay Loader v3.0.60mod no bind version ::::::::::::::: */
// automatically includes all files ending in .uc.xul and .uc.js from the profile's chrome folder
// New Features:
// supports Greasemonkey-style metadata for userChrome scripts and overlays
// supports a "main" shortcut for the main browser window in include/exclude lines
// supports regexes in the include/exclude lines
// scripts without metadata will run only on the main browser window, for backwards compatibility
//
// 1.Including function of UCJS_loader.
// 2.Compatible with Fx2 and Fx3.0b5pre
// 3.Cached script data (path, leafname, regex)
// 4.Support window.userChrome_js.loadOverlay(overlay [,observer]) //
// Modified by Alice0775
//
// Date 2019/12/11 01:30 fix 72 revert the code for sidebar, use "load" in config.js(2019/12/11 01:30),
// Date 2019/08/11 21:30 fix 70.0a1 Bug 1551344 - Remove XULDocument code
// Date 2019/05/21 08:30 fix 69.0a1 Bug 1534407 - Enable browser.xhtml by default, Bug 1551320 - Replace all CreateElement calls in XUL documents with CreateXULElement
// Date 2018/08/10 01:30 fix 63.0a1
// Date 2018/08/02 19:30 for userChrome.xml
// Date 2018/05/30 18:00 ALWAYSEXECUTE .uc.js
// Date 2018/05/06 22:00 fix wrong commit
// Date 2018/05/06 22:00 remove workaround for editBookmarkPanel
// Date 2018/03/21 08:00 revert USE_0_63_FOLDER
// Date 2018/03/20 21:00 editBookmarkPanel etc Bug 1444228 - Remove editBookmarkOverlay.xul
// Date 2015/06/28 13:00 about:preferences#privacy etc
// Date 2014/12/28 19:00 workaround loading xul on second browser
// Date 2014/12/13 21:00 remove a debug log
// Date 2014/12/13 21:00 allow to load scripts into about: in dialog
// Date 2014/12/13 21:00 require userchrome.js-0.8.014121301-Fx31.xpi
// Date 2014/06/07 21:00 skip about:blank
// Date 2014/06/07 19:00 turn off experiment by default
// Date 2014/06/04 12:00 fixed possibility of shutdown crash Bug 1016875
// Date 2014/05/19 00:00 delay 0, experiment
// Date 2013/10/06 00:00 allow to load scripts into about:xxx
// Date 2013/09/13 00:00 Bug 856437 Remove Components.lookupMethod, remove REPLACEDOCUMENTOVERLAY
// Date 2012/04/19 23:00 starUIをbindを使うように
// Date 2012/04/19 21:00 starUI元に戻した
// Date 2012/02/04 00:00 due to bug 726444 Implement the Downloads Panel.
// Date 2012/02/04 00:00 due to bug 726440
// Date 2011/11/19 15:30 REPLACECACHE 追加 Bug 648125
// Date 2011/09/30 13:40 fix bug 640158
// Date 2011/09/30 13:00 fix bug 640158
// Date 2011/04/07 00:00 hackVersion
// Date 2010/10/10 00:00 Bug 377498 mozIJSSubscriptLoader::loadSubScript charset 入ったけどメタデータ // @charset UTF-8 としとけばUTF-8で読み込む
// Date 2010/03/31 00:00 XULDocumentのみに適用
// Date 2010/03/11 17:30 debugbuildで動かない場合がある件に対応。
// Date 2010/02/28 13:00 ↓が直っているので元に戻した。
// Date 2009/08/06 00:00 tree_style_tab-0.8.2009073102があるとxulのdocument.overlayが出来なくなる件に対応
// Date 2009/05/23 00:00 userChrome.js0.8.1実験中 v3.0.25mod
// Date 2009/04/13 00:00 overlayのobserveの処理変更 v3.0.24mod
// Date 2009/03/10 00:00 例外トラップ
// Date 2009/02/15 15:00 chromehiddenなwindow(popup等)の場合にロードするかどうかを指定できるようにした。
// Date 2008/12/29 06:00 面倒だからdocument.overlayを置き換えるようにした。
// Date 2008/12/27 18:00 Webpanelにchromeを読み込んだときのエラーが出るのを修正(thanks 音吉)
// Date 2008/09/16 00 00 面倒だからFirefox3 の場合はeditBookmarkOverlay.xulは先読みするように修正
// Date 2008/08/28 00 00 なぜか0.8.0+を使っている人がいたので, それに対応
// Date 2008/08/26 23:50 08/26 18:00 以降 Fx2で動かなくなったようなので, 直した
// Date 2008/08/26 22:00 v3.0.11modで動かないなら,これ以降のものも動かないよ。たぶん
// Date 2008/08/26 18:00 Fx3のStarUIをなんとかして欲しいな。
// Date 2008/08/18 04:00 AUTOREMOVEBOM = trueなら文字コード自動判定するようにした。
// Date 2008/08/16 15:00 BOMを自動的に取り除くかどうか指定できるようにした
// Date 2008/07/29 23:00 なんかバグあったかも
// Date 2008/07/25 00:00 USE_0_63_FOLDERおよびFORCESORTSCRIPTがtrueの場合は, フォルダも名順でソートするようにした
// Date 2008/07/14 01:00 typo, regression
// Date 2008/07/14 00:00 typo, regression
// Date 2008/07/13 22:00 サイドバーweb-panelsにchromeウインドウを読み込んだ場合に対応
// Date 2008/03/23 12:00 80氏のフォルダ規則に対応, 0.8modバージョンにも対応
//
;(function () {
"use strict"
// -- config --
const EXCLUDE_CHROMEHIDDEN = false //chromehiddenなwindow(popup等)ではロード: しないtrue, する[false]
const USE_0_63_FOLDER = true //0.63のフォルダ規則を使う[true], 使わないfalse
const FORCESORTSCRIPT = false //強制的にスクリプトをファイル名順でソートするtrue, しない[false]
const AUTOREMOVEBOM = false //BOMを自動的に, 取り除く:true, 取り除かない[false](元ファイルは.BOMとして残る)
const REPLACECACHE = true //スクリプトの更新日付によりキャッシュを更新する: true , しない:[false]
//=====================USE_0_63_FOLDER = falseの時===================
var UCJS = new Array("UCJSFiles", "userContent", "userMenu") //UCJS Loader 仕様を適用 (NoScriptでfile:///を許可しておく)
var arrSubdir = new Array(
"",
"xul",
"TabMixPlus",
"withTabMixPlus",
"SubScript",
"UCJSFiles",
"userCrome.js.0.8",
"userContent",
"userMenu"
) //スクリプトはこの順番で実行される
//===================================================================
const ALWAYSEXECUTE = ["rebuild_userChrome.uc.xul", "rebuild_userChrome.uc.js"] //常に実行するスクリプト
var INFO = true
var BROWSERCHROME = "chrome://browser/content/browser.xhtml" //Firfox
//"chrome://browser/content/browser.xul"; //Firfox
//var BROWSERCHROME = "chrome://navigator/content/navigator.xul"; //SeaMonkey:
// -- config --
/* USE_0_63_FOLDER true
* chrome直下およびchrome/xxx.uc 内の *.uc.js および *.uc.xul
* chrome/xxx.xul 内の *.uc.js , *.uc.xul および *.xul
* chrome/xxx.ucjs 内の *.uc.js 特別に UCJS Loader 仕様を適用(NoScriptでfile:///を許可しておく)
*/
/* USE_0.63_FOLDER false
*[ フォルダは便宜上複数のフォルダに分けているだけで任意 下のarrSubdirで指定する ]
*[ UCJS Loaderを適用するフォルダをUCJSで指定する ]
プロファイル-+-chrome-+-userChrome.js(このファイル)
+-*.uc.jsまたは*.uc.xul群
|
+-SubScript--------+-*.uc.jsまたは*.uc.xul群
|
+-UCJSFiles--------+-*.uc.jsまたは*.uc.xul群
| (UCJS_loaderでしか動かないもの JavaScript Version 1.7/日本語)
|
+-xul--------------+-*.xul, *.uc.xulおよび付随File
|
+-userCrome.js.0.8-+-*.uc.jsまたは*.uc.xul群 (綴りが変なのはなぜかって? )
*/
//chrome/aboutでないならスキップ
if (!/^(chrome:|about:)/i.test(location.href)) return
if (/^(about:(blank|newtab|home))/i.test(location.href)) return
//コモンダイアログに対するオーバーレイが今のところ無いので時間短縮のためスキップすることにした
if (location.href == "chrome://global/content/commonDialog.xul") return
if (location.href == "chrome://global/content/alerts/alert.xul") return
if (/\.html?$/i.test(location.href)) return
window.userChrome_js = {
USE_0_63_FOLDER: USE_0_63_FOLDER,
UCJS: UCJS,
arrSubdir: arrSubdir,
FORCESORTSCRIPT: FORCESORTSCRIPT,
ALWAYSEXECUTE: ALWAYSEXECUTE,
AUTOREMOVEBOM: AUTOREMOVEBOM,
INFO: INFO,
BROWSERCHROME: BROWSERCHROME,
EXCLUDE_CHROMEHIDDEN: EXCLUDE_CHROMEHIDDEN,
REPLACECACHE: REPLACECACHE,
get hackVersion() {
delete this.hackVersion
return (this.hackVersion = "0.8")
//拡張のバージョン違いを吸収
this.baseUrl = /^(chrome:\/\/\S+\/content\/)\S+/i.test(Error().fileName).$1
if (!/^(chrome:\/\/\S+\/content\/)\S+/i.test(Error().fileName)) {
} else if (
Error().fileName.indexOf("chrome://uc_js/content/uc_js.xul") > -1 ||
"chrome://userchrome_js_cache/content/userChrome.js" == Error().fileName
) {
//0.8.0+ or 0.7
return (this.hackVersion = "0.8+")
} else if (Error().fileName.indexOf("chrome://browser/content/browser.xul -> ") == 0) {
return (this.hackVersion = "0.8.1")
} else {
return (this.hackVersion = "0.8mod")
}
},
//スクリプトデータを作成
getScripts: function () {
const Cc = Components.classes
const Ci = Components.interfaces
const ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService)
const fph = ios.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler)
const ds = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties)
var Start = new Date().getTime()
//getdir
if (this.USE_0_63_FOLDER) {
var o = [""]
this.UCJS = []
this.arrSubdir = []
var workDir = ds.get("UChrm", Ci.nsIFile)
var dir = workDir.directoryEntries
while (dir.hasMoreElements()) {
var file = dir.getNext().QueryInterface(Ci.nsIFile)
if (!file.isDirectory()) continue
var dirName = file.leafName
if (/(uc|xul|ucjs)$/i.test(dirName)) {
o.push(dirName)
if (/ucjs$/i.test(dirName)) {
this.UCJS.push(dirName)
}
}
}
if (this.FORCESORTSCRIPT) {
o.sort(cmp_name)
}
;[].push.apply(this.arrSubdir, o)
}
var that = this
var mediator = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(
Components.interfaces.nsIWindowMediator
)
if (mediator.getMostRecentWindow("navigator:browser")) var mainWindowURL = that.BROWSERCHROME
else if (mediator.getMostRecentWindow("mail:3pane"))
var mainWindowURL = "chrome://messenger/content/messenger.xul"
this.dirDisable = restoreState(getPref("userChrome.disable.directory", "str", "").split(","))
this.scriptDisable = restoreState(getPref("userChrome.disable.script", "str", "").split(","))
this.scripts = []
this.overlays = []
var findNextRe = /^\/\/ @(include|exclude)[ \t]+(\S+)/gm
this.directory = { name: [], UCJS: [], enable: [] }
for (var i = 0, len = this.arrSubdir.length; i < len; i++) {
var s = [],
o = []
try {
var dir = this.arrSubdir[i] == "" ? "root" : this.arrSubdir[i]
this.directory.name.push(dir)
this.directory.UCJS.push(checkUCJS(dir))
var workDir = ds.get("UChrm", Ci.nsIFile)
workDir.append(this.arrSubdir[i])
var files = workDir.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator)
var istream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(
Ci.nsIFileInputStream
)
while (files.hasMoreElements()) {
var file = files.getNext().QueryInterface(Ci.nsIFile)
if (
/\.uc\.js$|\.uc\.xul$/i.test(file.leafName) ||
(/\.xul$/i.test(file.leafName) && /\xul$/i.test(this.arrSubdir[i]))
) {
var script = getScriptData(
this.AUTOREMOVEBOM ? deleteBOMreadFile(file) : readFile(file, true),
file
)
script.dir = dir
if (/\.uc\.js$/i.test(script.filename)) {
script.ucjs = checkUCJS(script.file.path)
s.push(script)
} else {
script.xul = '<?xul-overlay href="' + script.url + '"?>\n'
o.push(script)
}
}
}
} catch (e) {}
if (this.FORCESORTSCRIPT) {
s.sort(cmp_fname)
o.sort(cmp_fname)
}
;[].push.apply(this.scripts, s)
;[].push.apply(this.overlays, o)
}
this.debug("Parsing getScripts: " + (new Date().getTime() - Start) + "msec")
//nameを比較する関数
function cmp_name(a, b) {
if (a.toLowerCase() == b.toLowerCase()) return a < b ? -1 : 1
else return a.toLowerCase() < b.toLowerCase() ? -1 : 1
}
function cmp_fname(a, b) {
return cmp_name(a.filename, b.filename)
}
//UCJSローダ必要か
function checkUCJS(aPath) {
for (var i = 0, len = that.UCJS.length; i < len; i++) {
if (aPath.indexOf(that.UCJS[i], 0) > -1) return true
}
return false
}
//メタデータ収集
function getScriptData(aContent, aFile) {
var charset, description
var header = (aContent.match(
/^\/\/ ==UserScript==[ \t]*\n(?:.*\n)*?\/\/ ==\/UserScript==[ \t]*\n/m
) || [""])[0]
var match,
rex = { include: [], exclude: [] }
while ((match = findNextRe.exec(header))) {
rex[match[1]].push(
match[2]
.replace(/^main$/i, mainWindowURL)
.replace(/\W/g, "\\$&")
.replace(/\\\*/g, ".*?")
)
}
if (rex.include.length == 0) rex.include.push(mainWindowURL)
var exclude = rex.exclude.length > 0 ? "(?!" + rex.exclude.join("$|") + "$)" : ""
match = header.match(/\/\/ @charset\b(.+)\s*/i)
charset = ""
//try
if (match) charset = match.length > 0 ? match[1].replace(/^\s+/, "") : ""
match = header.match(/\/\/ @description\b(.+)\s*/i)
description = ""
//try
if (match) description = match.length > 0 ? match[1].replace(/^\s+/, "") : ""
//}catch(e){}
if (description == "" || !description) description = aFile.leafName
var url = fph.getURLSpecFromFile(aFile)
return {
filename: aFile.leafName,
file: aFile,
url: url,
//namespace: "",
charset: charset,
description: description,
//code: aContent.replace(header, ""),
regex: new RegExp("^" + exclude + "(" + (rex.include.join("|") || ".*") + ")$", "i"),
}
}
//スクリプトファイル読み込み
function readFile(aFile, metaOnly) {
if (typeof metaOnly == "undefined") metaOnly = false
var stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(
Ci.nsIFileInputStream
)
stream.init(aFile, 0x01, 0, 0)
var cvstream = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(
Ci.nsIConverterInputStream
)
cvstream.init(
stream,
"UTF-8",
1024,
Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER
)
var content = "",
data = {}
while (cvstream.readString(4096, data)) {
content += data.value
if (metaOnly && content.indexOf("// ==/UserScript==") > 0) break
}
cvstream.close()
return content.replace(/\r\n?/g, "\n")
}
//スクリプトファイル文字コード変換読み込み
function deleteBOMreadFile(aFile) {
var UI = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(
Components.interfaces.nsIScriptableUnicodeConverter
)
UI.charset = "UTF-8"
var bytes = readBinary(aFile)
try {
if (bytes.length > 3 && bytes.substring(0, 3) == String.fromCharCode(239, 187, 191)) {
aFile.copyTo(null, aFile.leafName + ".BOM")
bytes = bytes.substring(3, bytes.length)
writeFile(aFile, bytes)
return UI.ConvertToUnicode(bytes).replace(/\r\n?/g, "\n")
}
var charset = getCharset(bytes)
//window.userChrome_js.debug(aFile.leafName + " " +charset);
if (charset == "UTF-8" || charset == "us-ascii") {
return UI.ConvertToUnicode(bytes).replace(/\r\n?/g, "\n")
} else {
UI.charset = charset
aFile.copyTo(null, aFile.leafName + "." + UI.charset)
bytes = UI.ConvertToUnicode(bytes)
UI.charset = "UTF-8"
writeFile(aFile, UI.ConvertFromUnicode(bytes))
return bytes.replace(/\r\n?/g, "\n")
}
} catch (ex) {
return readFile(aFile)
}
}
//バイナリ読み込み
function readBinary(aFile) {
var istream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(
Components.interfaces.nsIFileInputStream
)
istream.init(aFile, -1, -1, false)
var bstream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(
Components.interfaces.nsIBinaryInputStream
)
bstream.setInputStream(istream)
return bstream.readBytes(bstream.available())
}
//バイナリ書き込み
function writeFile(aFile, aData) {
var foStream = Components.classes[
"@mozilla.org/network/file-output-stream;1"
].createInstance(Components.interfaces.nsIFileOutputStream)
// ファイル追記の際は、0x02 | 0x10 を使う
foStream.init(aFile, 0x02 | 0x08 | 0x20, parseInt(664, 8), 0) // write, create, truncate
foStream.write(aData, aData.length)
foStream.close()
return aData
}
//文字コードを得る
function getCharset(str) {
function charCode(str) {
if (/\x1B\x24(?:[\x40\x42]|\x28\x44)/.test(str)) return "ISO-2022-JP"
if (/[\x80-\xFE]/.test(str)) {
var buf = RegExp.lastMatch + RegExp.rightContext
if (
/[\xC2-\xFD][^\x80-\xBF]|[\xC2-\xDF][\x80-\xBF][^\x00-\x7F\xC2-\xFD]|[\xE0-\xEF][\x80-\xBF][\x80-\xBF][^\x00-\x7F\xC2-\xFD]/.test(
buf
)
)
return /[\x80-\xA0]/.test(buf) ? "Shift_JIS" : "EUC-JP"
if (/^(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])+$/.test(buf))
return "Shift_JIS"
if (/[\x80-\xA0]/.test(buf)) return "UTF-8"
return "EUC-JP"
} else return "us-ascii"
}
var charset = charCode(str)
if (charset == "UTF-8" || charset == "us-ascii") return charset
//判定に失敗している場合があるので, 再チェック (鈍くさ);
var UI = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(
Components.interfaces.nsIScriptableUnicodeConverter
)
try {
UI.charset = "UTF-8"
if (str === UI.ConvertFromUnicode(UI.ConvertToUnicode(str))) return "UTF-8"
} catch (ex) {}
try {
UI.charset = charset
if (str === UI.ConvertFromUnicode(UI.ConvertToUnicode(str))) return charset
} catch (ex) {}
return "UTF-8"
}
//prefを読み込み
function getPref(aPrefString, aPrefType, aDefault) {
var xpPref = Components.classes["@mozilla.org/preferences-service;1"].getService(
Components.interfaces.nsIPrefService
)
try {
switch (aPrefType) {
case "complex":
return xpPref.getComplexValue(aPrefString, Components.interfaces.nsILocalFile)
break
case "str":
return unescape(xpPref.getCharPref(aPrefString).toString())
break
case "int":
return xpPref.getIntPref(aPrefString)
break
case "bool":
default:
return xpPref.getBoolPref(aPrefString)
break
}
} catch (e) {}
return aDefault
}
//pref文字列変換
function restoreState(a) {
try {
var sd = []
for (var i = 0, max = a.length; i < max; ++i) sd[unescape(a[i])] = true
return sd
} catch (e) {
return []
}
}
},
getLastModifiedTime: function (aScriptFile) {
if (this.REPLACECACHE) {
return aScriptFile.lastModifiedTime
}
return ""
},
//window.userChrome_js.loadOverlay
shutdown: false,
overlayWait: 0,
overlayUrl: [],
loadOverlay: function (url, observer, doc) {
window.userChrome_js.overlayUrl.push([url, observer, doc])
if (!window.userChrome_js.overlayWait)
window.userChrome_js.load(++window.userChrome_js.overlayWait)
},
load: function () {
if (!window.userChrome_js.overlayUrl.length) return --window.userChrome_js.overlayWait
var [url, aObserver, doc] = this.overlayUrl.shift()
if (!!aObserver && typeof aObserver == "function") {
aObserver.observe = aObserver
}
if (!doc) doc = document
if (!(doc instanceof XULDocument)) return 0
var observer = {
observe: function (subject, topic, data) {
if (topic == "xul-overlay-merged") {
//XXX We just caused localstore.rdf to be re-applied (bug 640158)
if ("retrieveToolbarIconsizesFromTheme" in window) retrieveToolbarIconsizesFromTheme()
if (!!aObserver && typeof aObserver.observe == "function") {
try {
aObserver.observe(subject, topic, data)
} catch (ex) {
window.userChrome_js.error(url, ex)
}
}
if ("userChrome_js" in window) window.userChrome_js.load()
}
},
QueryInterface: function (aIID) {
if (
!aIID.equals(Components.interfaces.nsISupports) &&
!aIID.equals(Components.interfaces.nsIObserver)
)
throw Components.results.NS_ERROR_NO_INTERFACE
return this
},
}
//if (this.INFO) this.debug("document.loadOverlay: " + url);
try {
if (window.userChrome_js.shutdown) return
doc.loadOverlay(url, observer)
} catch (ex) {
window.userChrome_js.error(url, ex)
}
return 0
},
//xulを読み込む
runOverlays: function (doc) {
try {
var dochref = doc.location.href.replace(/#.*$/, "")
} catch (e) {
return
}
var overlay
for (var m = 0, len = this.overlays.length; m < len; m++) {
overlay = this.overlays[m]
if (
this.ALWAYSEXECUTE.indexOf(overlay.filename) < 0 &&
(!!this.dirDisable["*"] ||
!!this.dirDisable[overlay.dir] ||
!!this.scriptDisable[overlay.filename])
)
continue
// decide whether to run the script
if (overlay.regex.test(dochref)) {
if (this.INFO) this.debug("loadOverlay: " + overlay.filename)
this.loadOverlay(overlay.url + "?" + this.getLastModifiedTime(overlay.file), null, doc)
}
}
},
//uc.jsを読み込む
runScripts: function (doc) {
try {
var dochref = doc.location.href.replace(/#.*$/, "")
} catch (e) {
return
}
if (!(/*doc instanceof XULDocument ||*/ (doc instanceof HTMLDocument))) return
var script, aScript, url
const Cc = Components.classes
const Ci = Components.interfaces
const maxJSVersion = (function getMaxJSVersion() {
var appInfo = Components.classes["@mozilla.org/xre/app-info;1"].getService(
Components.interfaces.nsIXULAppInfo
)
var versionChecker = Components.classes[
"@mozilla.org/xpcom/version-comparator;1"
].getService(Components.interfaces.nsIVersionComparator)
// Firefox 3.5 and higher supports 1.8.
if (versionChecker.compare(appInfo.version, "3.5") >= 0) {
return "1.8"
}
// Firefox 2.0 and higher supports 1.7.
if (versionChecker.compare(appInfo.version, "2.0") >= 0) {
return "1.7"
}
// Everything else supports 1.6.
return "1.6"
})()
for (var m = 0, len = this.scripts.length; m < len; m++) {
script = this.scripts[m]
if (
this.ALWAYSEXECUTE.indexOf(script.filename) < 0 &&
(!!this.dirDisable["*"] ||
!!this.dirDisable[script.dir] ||
!!this.scriptDisable[script.filename])
)
continue
if (!script.regex.test(dochref)) continue
if (script.ucjs) {
//for UCJS_loader
if (this.INFO) this.debug("loadUCJSSubScript: " + script.filename)
aScript = doc.createElementNS("http://www.w3.org/1999/xhtml", "script")
aScript.type = "application/javascript; version=" + maxJSVersion.toString().substr(0, 3)
aScript.src = script.url + "?" + this.getLastModifiedTime(script.file)
try {
doc.documentElement.appendChild(aScript)
} catch (ex) {
this.error(script.filename, ex)
}
} else {
//Not for UCJS_loader
if (this.INFO) this.debug("loadSubScript: " + script.filename)
try {
if (script.charset)
Cc["@mozilla.org/moz/jssubscript-loader;1"]
.getService(Ci.mozIJSSubScriptLoader)
.loadSubScript(
script.url + "?" + this.getLastModifiedTime(script.file),
doc.defaultView,
script.charset
)
else
Cc["@mozilla.org/moz/jssubscript-loader;1"]
.getService(Ci.mozIJSSubScriptLoader)
.loadSubScript(
script.url + "?" + this.getLastModifiedTime(script.file),
doc.defaultView
)
} catch (ex) {
this.error(script.filename, ex)
}
}
}
},
debug: function (aMsg) {
Components.classes["@mozilla.org/consoleservice;1"]
.getService(Components.interfaces.nsIConsoleService)
.logStringMessage(aMsg)
},
error: function (aMsg, err) {
const CONSOLE_SERVICE = Components.classes["@mozilla.org/consoleservice;1"].getService(
Components.interfaces.nsIConsoleService
)
var error = Components.classes["@mozilla.org/scripterror;1"].createInstance(
Components.interfaces.nsIScriptError
)
if (typeof err == "object")
error.init(
aMsg + "\n" + err.name + " : " + err.message,
err.fileName || null,
null,
err.lineNumber,
null,
2,
err.name
)
else error.init(aMsg + "\n" + err + "\n", null, null, null, null, 2, null)
CONSOLE_SERVICE.logMessage(error)
},
}
//少しでも速くするためスクリプトデータの再利用
var prefObj = Components.classes["@mozilla.org/preferences-service;1"].getService(
Components.interfaces.nsIPrefService
)
try {
var pref = prefObj.getBoolPref("userChrome.enable.reuse")
} catch (e) {
var pref = true
}
var that = window.userChrome_js
window.addEventListener(
"unload",
function () {
that.shutdown = true
},
false
)
window.xxdebug = that.debug
//that.debug(typeof that.getScriptsDone);
if (pref) {
//現在のメインウィンドウは一度もuserChrome.jsのスクリプトで初期化されていない?
if (!that.getScriptsDone) {
//Firefox or Thunderbard?
var mediator = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(
Components.interfaces.nsIWindowMediator
)
if (mediator.getMostRecentWindow("navigator:browser")) var windowType = "navigator:browser"
else if (mediator.getMostRecentWindow("mail:3pane")) var windowType = "mail:3pane"
var enumerator = mediator.getEnumerator(windowType)
//他の身内のメインウィンドウではどうかな?
while (enumerator.hasMoreElements()) {
var win = enumerator.getNext()
//身内のメインウインドウは初期状態でない?
if (win.userChrome_js && win.userChrome_js.getScriptsDone) {
//オブジェクトはたぶんこのウインドウのを複製すりゃいいんじゃぁないかな
that.UCJS = win.userChrome_js.UCJS
that.arrSubdir = win.userChrome_js.arrSubdir
that.scripts = win.userChrome_js.scripts
that.overlays = win.userChrome_js.overlays
that.dirDisable = win.userChrome_js.dirDisable
that.scriptDisable = win.userChrome_js.scriptDisable
that.getScriptsDone = true
break
}
}
}
}
if (!that.getScriptsDone) {
if (that.INFO) that.debug("getScripts")
that.getScripts()
that.getScriptsDone = true
} else {
if (that.INFO) that.debug("skip getScripts")
}
var href = location.href
var doc = document
//Bug 330458 Cannot dynamically load an overlay using document.loadOverlay
//until a previous overlay is completely loaded
if (that.INFO) that.debug("load " + href)
//chromehiddenならロードしない
if (
location.href === that.BROWSERCHROME &&
that.EXCLUDE_CHROMEHIDDEN &&
document.documentElement.getAttribute("chromehidden") != ""
)
return
if (typeof gBrowser != undefined) {
that.runScripts(doc)
setTimeout(
function (doc) {
that.runOverlays(doc)
},
0,
doc
)
} else {
setTimeout(
function (doc) {
that.runScripts(doc)
setTimeout(
function (doc) {
that.runOverlays(doc)
},
0,
doc
)
},
0,
doc
)
}
//Sidebar for Trunc
if (location.href != that.BROWSERCHROME) return
window.document.addEventListener(
"load",
function (event) {
if (!event.originalTarget.location) return
if (/^(about:(blank|newtab|home))/i.test(event.originalTarget.location.href)) return
if (!/^(about:|chrome:)/.test(event.originalTarget.location.href)) return
var doc = event.originalTarget
var href = doc.location.href
if (that.INFO) that.debug("load Sidebar " + href)
setTimeout(
function (doc) {
that.runScripts(doc)
setTimeout(
function (doc) {
that.runOverlays(doc)
},
0,
doc
)
},
0,
doc
)
if (href != "chrome://browser/content/web-panels.xul") return
if (!window.document.getElementById("sidebar")) return
var sidebarWindow = window.document.getElementById("sidebar").contentWindow
if (sidebarWindow) {
loadInWebpanel.init(sidebarWindow)
}
},
true
)
var loadInWebpanel = {
sidebarWindow: null,
init: function (sidebarWindow) {
this.sidebarWindow = sidebarWindow
this.sidebarWindow.document
.getElementById("web-panels-browser")
.addEventListener("load", this, true)
this.sidebarWindow.addEventListener("unload", this, false)
},
handleEvent: function (event) {
switch (event.type) {
case "unload":
this.uninit(event)
break
case "load":
this.load(event)
break
}
},
uninit: function (event) {
this.sidebarWindow.document
.getElementById("web-panels-browser")
.removeEventListener("load", this, true)
this.sidebarWindow.removeEventListener("unload", this, false)
},
load: function (event) {
var doc = event.originalTarget
var href = doc.location.href
if (!/^chrome:/.test(href)) return
if (that.INFO) that.debug("load Webpanel " + href)
setTimeout(
function (doc) {
that.runScripts(doc)
setTimeout(
function (doc) {
that.runOverlays(doc)
},
0,
doc
)
},
0,
doc
)
},
}
})()

View file

@ -0,0 +1,23 @@
@import url("userChrome.css");
/* Removes white loading page */
@-moz-document url(about:blank), url(about:newtab), url(about:home) {
html:not(#ublock0-epicker), html:not(#ublock0-epicker) body, #newtab-customize-overlay {
background: var(--mff-bg) !important;
}
}
/* Hide scrollbar */
:root{
scrollbar-width: none !important;
}
@-moz-document url(about:privatebrowsing) {
:root{
scrollbar-width: none !important;
}
}

6347
files/github_gruvbox.css Normal file

File diff suppressed because it is too large Load diff

142
files/gruvbox_docs_rs.css Normal file
View file

@ -0,0 +1,142 @@
/* ==UserStyle==
@name gruvbox docs.rs
@namespace github.com/openstyles/stylus
@version 1.0.0
@description A new userstyle
@author Me
@preprocessor stylus
==/UserStyle== */
@-moz-document domain("docs.rs"),
domain("doc.rust-lang.org") {
:root {
--bg0: #1d2021;
--bg1: #222222;
--bg2: #282828;
--bg3: #504945;
--bg4: #202020;
--fg0: #ebdbb2;
--fg1: #fbf1c7;
--fg2: #d5c4a1;
--fg3: #a89984;
--col_blue: #83a598;
--col_accent: #8ec07c;
--col_accent_dark: #8ec07c;
--col_yellow: #fabd2f;
--col_red: #fb4934;
--border: rgb(53, 51, 49);
--monospaced: "Jetbrains Mono";
--monospaced-size: 14px;
--monospaced-small: cozette;
}
.nav-container {
background-color: var(--bg2) !important;
border: none !important;
box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.4);
& * {
color: var(--fg1) !important;
}
}
button#theme-picker {
display: none;
}
#settings-menu {
background-color: inherit;
border: none;
transform: translateY(4px);
}
input#nav-search {
padding-left: 1rem;
background-color: inherit !important;
}
nav {
.search-container {
input,
#crate-search,
input:focus,
crate-search:focus {
background-image: none;
outline: none;
color: var(--fg1) !important;
border: 1px solid var(--border) !important;
box-shadow: 2px 2px 5px 0px rgba(0, 0, 0, 0.5) !important;
background-color: var(--bg1) !important;
}
input,
input:focus {
border-left: none !important;
}
#crate-search,
#crate-search:focus {
padding-right: 1.4rem;
border-right: none !important;
}
}
}
.sidebar {
background-color: var(--bg1) !important;
box-shadow: inset -5px 0 10px 0 rgba(0, 0, 0, 0.4);
scrollbar-width: thin !important;
.logo-container {
display: none;
}
& * {
color: var(--fg1);
}
h1,
h2,
h3,
.sidebar-title {
color: var(--col_accent) !important;
}
.block {
a {
&.current {
background-color: var(--col_accent) !important;
color: var(--bg2);
}
}
}
}
.pure-menu-children {
background-color: var(--bg2);
box-shadow: 2px 2px 10px 0 rgba(0, 0, 0, 0.5);
}
#rustdoc_body_wrapper,
body {
background-color: var(--bg2) !important;
color: var(--fg1);
h1,
h2,
h3 {
color: var(--fg1);
}
code {
background-color: inherit;
font-family: var(--monospaced);
font-size: var(--monospaced-size);
}
a.srclink {
padding: 0rem 1rem;
color: var(--col_accent);
}
.collapse-toggle {
transform: translateY(-3px);
color: var(--fg3);
}
}
}

267
files/hackage_gruvbox.css Normal file
View file

@ -0,0 +1,267 @@
/* ==UserStyle==
@name Haskellstuff
@namespace github.com/openstyles/stylus
@version 1.0.0
@description A new userstyle
@author ElKowar
@preprocessor stylus
==/UserStyle== */
@-moz-document domain("hackage.haskell.org") {
:root {
--bg0: #1d2021;
--bg1: #222222;
--bg2: #282828;
--bg3: #504945;
--bg4: #202020;
--fg1: #ebdbb2;
--fg1: #d5c4a1;
--fg3: #a89984;
--col_blue: #83a598;
--col_aqua: #83c07c;
--col_yellow: #fabd2f;
--col_red: #fb4934;
--monospaced: "Jetbrains Mono";
--monospaced-size: 14px;
--monospaced-small: cozette;
}
* {
color: var(--fg1);
border-color: var(--fg1) !important;
}
#package-header {
border: none;
background-color: var(--bg1);
#page-menu li a {
color: var(--fg1);
}
}
body {
background-color: var(--bg2);
color: var(--fg1);
}
#package-header {
padding: 0.5rem;
}
a {
&[href]:link {
color: var(--col_blue);
}
&[href]:visited {
color: var(--col_aqua);
}
}
#footer {
display: none;
}
table.info,
#table-of-contents {
background-color: var(--bg1);
border: none;
box-shadow: 1px 1px 5px 0 rgba(0, 0, 0, 0.4);
padding: 1rem;
}
h1,
h2,
h3,
h4,
h5,
th,
.caption {
border: none !important;
color: var(--col_blue) !important;
a {
color: inherit !important;
}
}
#description,
#module-header,
#synopsis,
#interface {
/* surrounding element of a piece of documentation */
.top {
background-color: var(--bg2);
box-shadow: 0px 4px 5px -1px rgba(0, 0, 0, 0.3);
& > :last-child {
padding-bottom: 0.2rem;
}
}
.src,
pre,
code {
/*font-family: "Terminus (TTF)";*/
font-family: var(--monospaced);
font-size: var(--monospaced-size);
font-weight: normal !important;
.def {
font-weight: normal !important;
}
}
.src,
pre {
background-color: var(--bg1) !important;
padding: 0.5rem;
border: none !important;
.selflink {
display: none;
}
.link {
background: var(--col_aqua) !important;
color: var(--bg1) !important;
border: none;
margin: -0.4rem !important;
padding: 0.4rem !important;
margin-left: 1rem !important;
}
}
summary {
color: var(--col_aqua);
list-style-image: unset !important;
}
.key {
background: none;
border: none;
font-family: var(--monospaced-small);
}
#synopsis details .details-toggle {
background-color: var(--bg1);
box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.3);
.subs {
background: none;
}
}
.details-toggle-control {
background: none;
margin-left: -0.8rem !important;
&::after {
content: "+"
}
}
}
#search {
overflow: visible;
#search-form,
#search-results {
box-shadow: 3px 3px 10px -4px rgba(0, 0, 0, 0.3);
background-color: var(--bg2);
border: none;
overflow: hidden;
border-radius: 4px
}
#search-form input {
background-color: var(--bg1);
border: none;
padding: 1rem;
&::placeholder {
font-size: 1rem;
color: var(--fg3);
}
}
#search-results {
margin-top: 1rem;
background-color: var(--bg1);
padding: 1rem;
}
}
/* source view */
.hs-identifier {
color: var(--col_aqua);
&.hs-var {
color: var(--fg1);
}
&.hs-type {
color: var(--col_blue);
}
}
.hs-operator {
color: var(--col_blue);
}
.hs-keyword {
color: var(--col_red);
}
.hs-number,
.hs-glyph {
color: var(--col_blue);
}
.hs-string {
color: var(--fg1);
}
.hs-comment {}
/* module startpage */
#page-header {
border: none;
padding: 0.3rem 1rem
}
#properties {
background: var(--bg1) !important;
box-shadow: 3px 3px 10px -3px rgba(0, 0, 0, 0.4);
padding: 0.8rem;
a {
color: var(--col_aqua);
}
}
#readme-container {
pre {
background-color: var(--bg1);
}
.embedded-author-content {
border: none;
}
}
/* package search */
form input,
#table_wrapper.dataTables_wrapper #table_length select,
#table_wrapper.dataTables_wrapper #table_filter input {
background-color: var(--bg3);
border: none;
padding: 0.2rem 0.5rem;
}
#table_wrapper {
box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.2);
padding: 1rem;
table {
border: none;
& * {
background-color: var(--bg2) !important;
border: none;
}
}
}
#table_paginate {
a {
border: none;
background: var(--bg1) !important;
color: var(--fg1) !important;
}
}
}

183
files/hoogle_gruvbox.css Normal file
View file

@ -0,0 +1,183 @@
/* ==UserStyle==
@name hoogle-gruvbox
@namespace github.com/openstyles/stylus
@version 1.0.0
@description A new userstyle
@author ElKowar
@preprocessor stylus
==/UserStyle== */
@-moz-document domain("hoogle.haskell.org") {
:root {
--bg0: #1d2021;
--bg1: #222222;
--bg2: #282828;
--bg3: #504945;
--bg4: #202020;
--fg1: #ebdbb2;
--fg1: #d5c4a1;
--fg3: #a89984;
--col_blue: #83a598;
--col_aqua: #83c07c;
--col_yellow: #fabd2f;
--col_red: #fb4934;
--monospaced: "Jetbrains Mono";
--monospaced-size: 14px;
--monospaced-small: cozette;
}
* {
color: var(--fg1);
border-color: var(--fg1) !important;
}
body {
background-color: var(--bg2);
color: var(--fg1);
}
#links {
border: none;
background-color: var(--bg0);
padding: 0.3rem;
* {
color: var(--fg1) !important;
}
}
#logo img {
display: inline-block;
opacity: 0;
}
a {
&[href]:link {
color: var(--col_blue);
}
&[href]:visited {
color: var(--col_aqua);
}
}
#footer {
display: none;
}
#example {
background-color: var(--bg1);
border: none !important;
color: var(--fg1);
padding: 1rem;
}
input {
background-color: var(--bg0);
border: unset;
border-color: var(--bg3);
padding: 0.2rem 1rem;;
transition: box-shadow 0.2s ease-in-out;
&[type="submit"]:hover {
box-shadow: 2px 2px 5px 0 rgba(0,0,0, 0.2);
}
}
#scope_chosen {
background-color: var(--bg0);
padding: 0.2rem;
> * {
background: none;
border: none;
box-shadow: none;
}
.chosen-drop {
background-color: var(--bg0);
box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.4);
padding: 0.5rem;
input {
border: none;
}
.no-results {
background: none;
}
}
}
h1,
h2,
h3,
h4,
h5,
th,
.caption {
border: none !important;
color: var(--col_blue) !important;
a {
color: inherit !important;
}
}
a {
color: var(--col_blue) !important;
}
.result {
a:hover {
background-color: inherit;
}
box-shadow: 1px 1px 5px 0 rgba(0, 0, 0, 0.3);
.from {
padding: 0.5rem 0.9rem;
}
.ans {
background-color: var(--bg0);
border: none;
padding: 0.3rem 1rem;
.name {
color: var(--col_aqua);
b {
color: var(--col_aqua);
font-weight: normal;
}
}
}
}
.doc.newline:not(:empty) {
background: none;
&::before {
margin-left: -0.8rem;
width: 1rem;
display: inline-block;
color: var(--col_aqua);
cursor: pointer;
}
&.shut::before {
content: "+";
}
&.open::before {
content: "-";
}
}
.minus {
margin-left: -1rem;
}
.minus,
.plus {
background: none !important;
&::after {
text-align: center;
width: 0.6rem;
height: 1rem;
margin: 0 0.2rem;
display: inline-block;
color: var(--col_aqua);
cursor: pointer;
}
}
.minus::after {
content: "-"
}
.plus::after {
content: "+"
}
}

View file

@ -0,0 +1,88 @@
<!DOCTYPE html>
<html>
<head>
<title>Home</title>
<style>
* {
margin: 0;
font-family: "Terminus (TTF)";
}
h1 {
font-size: 2.5rem;
}
body {
background-color: #282828;
width: 100vw;
height: 100vh;
margin: 0;
padding: 0;
font-size: 1.5rem;
}
.content {
color: #ebdbb2;
display: flex;
justify-content: center;
place-items: center;
text-align: center;
height: 100vh;
}
#time {
color: #8ec07c;
}
input {
background-color: unset;
border: unset;
font-size: inherit;
font-family: inherit;
color: inherit;
}
.inputs {
text-align: left;
}
.prompt {
display: inline-block;
color: #8ec07c;
}
form {
display: flex;
justify-content: center;
}
input {
text-align: center;
caret-color: rgba(0,0,0,0);
width: 80vw;
}
::placeholder {
opacity: 1;
}
</style>
<script>
document.onreadystatechange = () => {
const date = new Date()
document.getElementById("time").innerText = `${date.toString().replace(/ GMT.*/, "")}`
document.querySelector("input").onkeydown = (e) => {
if (e.key === 'Enter') searchDDG(document.getElementById('ddginput').value)
}
}
setInterval(() => {
const date = new Date()
document.getElementById("time").innerText = `${date.toString().replace(/ GMT.*/, "")}`
}, 1000)
function searchDDG(query) {
location.replace(`https://duckduckgo.com/?q=${query}`)
}
</script>
</head>
<body>
<div class="content">
<div>
<h1>
<input autocomplete="off" autofocus id="ddginput" type="text" placeholder="Hello"> </input>
</h1>
<div>[<span id="time"></span>]</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,3 @@
#!/bin/dash
curl -s -L https://raw.githubusercontent.com/keroserene/rickrollrc/master/roll.sh | bash

View file

@ -0,0 +1,2 @@
85484
profaheil

View file

@ -0,0 +1 @@
136779932

23
files/scripts/Theatron/clipit Executable file
View file

@ -0,0 +1,23 @@
#!/bin/bash
#Creates a clip of the currently watched streamer, opens the editor with xdg-open
#In case we're calling the clipit function without watching a stream first
cd $(dirname "$0")
config=$(readlink -f config)
source $config
oauth="$(cat oauth|tr -d '\n')"
broadcast_id=$(cat bId.txt)
clip=$(curl -s \
-H "Client-ID: $client_id" \
-H "Authorization: Bearer $oauth" \
-X POST "https://api.twitch.tv/helix/clips?broadcaster_id=$broadcast_id" | jq -c '.data[] | {"":.edit_url}' | tr -d '\"\{\}')
if [[ -z $clip ]];then
notify-send "Theatron" "Either the streamer isn't online or you're not watching anyone"
fi
#Delete the first character(:)
clip="${clip:1}"
xdg-open $clip
# vim: ft=sh
#
#curl -H "Authorization: OAuth <access token>" https://id.twitch.tv/oauth2/validate

View file

@ -0,0 +1,42 @@
#!/bin/bash
#dont ask for quality, always just run the best one, always worst might be implemented if anyone asks
always_best=false
#The default player used by streamlink with the latest breakage of VLC we can't rely on it anymore :(
player="vlc"
#The default application launcher, currently tested on: rofi, dmenu, smenu. Only use 1 at a time
#Works fine with fzf too, but needs to be launched in terminal to work
#For the main 3:
#launcher="rofi -dmenu"
#launcher="dmenu"
#launcher="smenu -t"
launcher="rofi -dmenu"
#if this is on, every time you pick a streamer, you will get vod menu after you pick a streamer, the first entry should still be the live stream
vod_mode=true
# How many vods(filtered by recency) to show
vod_mode_limit="25"
# How many games you want to see in the list
game_limit="100"
# This will only be used for offline mode(flag -o)
following="imaqtpie\nsodapoppin\nforsen\nasmongold"
#if true, opens up a browser window with the chat popup mode of the picked streamer, does so not knowingly if the stream loaded or not
popup_chat=false
#set up custom streamlink flags
streamlink_flags="--player-continuous-http"
#If you want clip capatibilities, if you change this from false to true you will need a new token, easiest way to obtain it is to delete oauth file, because it requires elevated privileges
clip_capabilities=true
#browse_type_option_followed_channels="Channels you're following"
#browse_type_option_followed_games="Games you're following"
#browse_type_option_all_games="All games"
#Set the browse type to skip being asked for it every time. Set it to empty to be asked. The options are above.
default_browse_type=''
#default_browse_type=$browse_type_option_followed_channels
#default_browse_type=$browse_type_option_followed_games
#default_browse_type=$browse_type_option_all_games
#App settings, for global, don't change
client_id="fendbm5b5q1c2820m59sbdv9z95vs4"
redirect_uri="https://theatron.davidv7.xyz/"

View file

@ -0,0 +1 @@
zgwa0kdqqku8yowsgeneylvn9ia67z

View file

@ -0,0 +1,35 @@
#!/bin/bash
cd $(dirname "$0")
function poll(){
id=$(curl -H 'Accept: application/vnd.twitchtv.v5+json' \
-H 'Client-ID: fendbm5b5q1c2820m59sbdv9z95vs4' \
-X GET "https://api.twitch.tv/kraken/users?login=$notify_me" | jq -c '.users[] |._id'| tr -d '"' | tr '\n' ',')
live=$(curl -H 'Accept: application/vnd.twitchtv.v5+json' \
-H 'Client-ID: fendbm5b5q1c2820m59sbdv9z95vs4' \
-X GET "https://api.twitch.tv/kraken/streams/?channel=$id" | jq -c '.streams[] | .channel | {"": .name , " playing " : .game , " " : .status}' | tr -d '\{\}\,\"\:' | awk '{print $0"\n"}')
echo "$live"
if [ -z "$live" ]; then
echo "No one is on"
else
notify-send -u critical "Theatron" "$live"
name=$(echo $live | awk '{print $1}')
notify_me="${notify_me//$name}"
echo $notify_me
fi
sleep $1
}
# The first argument is the interval
# If the first argument is once the there is no sleep because it only gets run once
# Hopw many seconds between checks
# Add strings for people you want to be notified about, ex. notify_me="imaqtpie,reckful"
notify_me="reckful,imaqtpie,strawbunnyhunny,pokimane,sodapoppin,methodjosh,nerites,forsen,asmongold,disguisedtoast,avoidingthepuddle,cxlibri"
if [[ $1 == "once" ]];then
poll 0
elif [[ -n $1 ]];then
while true
do
poll "$1"
done
fi

View file

@ -0,0 +1,221 @@
#!/bin/bash
#Thank you curli
getFollowingChannels() {
curl -s -H 'Accept: application/vnd.twitchtv.v5+json' \
-H "Client-ID: $client_id" \
-H "Authorization: OAuth $oauth" \
-X GET "https://api.twitch.tv/kraken/streams/followed" |
jq -c '.streams[] | {"":.channel | {"Streamer ": .name , " playing ": .game}, " for ": .viewers, " viewers ": .video_height}' |
tr -d '\{\}\:\"\,' |
awk '{print $0"p"}'
}
getTwitchUserId() {
curl -H 'Accept: application/vnd.twitchtv.v5+json' \
-H "Client-ID: $client_id" \
-H "Authorization: OAuth $oauth" \
-X GET "https://api.twitch.tv/kraken/user" |
jq -c '. | ._id' |
tr -d '"'
}
# First argument must be the twitch user id
getFollowingGames() {
curl -H 'Accept: application/vnd.twitchtv.v5+json' \
-H "Client-ID: $client_id" \
-H "Authorization: OAuth $oauth" \
-X GET "https://api.twitch.tv/kraken/users/${1}/follows/games" |
jq -c '.follows[] | {"": .game.popularity, " viewers - ": .game.name}' |
tr -d '\{\}\:\"\,'
}
# First argument must be the game's name
getChannelsFromGame() {
curl -s -H 'Accept: application/vnd.twitchtv.v5+json' \
-H "Client-ID: $client_id" \
-X GET "https://api.twitch.tv/kraken/streams?game=${1}" |
jq -c '.streams[] | {"":.channel | {"Streamer ": .name , " playing ": .game}, " for ": .viewers, " viewers ": .video_height}' |
tr -d '\{\}\:\"\,' |
awk '{print $0"p"}'
}
getAllGames() {
curl -s -H 'Accept: application/vnd.twitchtv.v5+json' \
-H "Client-ID: $client_id" \
-H "Authorization: OAuth $oauth" \
-X GET "https://api.twitch.tv/kraken/games/top?limit=$game_limit" |
jq -c '.top[] | {"": .viewers, " viewers - ": .game.name}' |
tr -d '\{\}\:\"\,'
}
if [[ $1 == "-v" ]]; then
echo "0.9.0"
exit 0
fi
cd $(dirname "$0") || exit
source config
quality="best\n1080p60\n1080p\n720p60\n720p\n480p\n360p\naudio_only"
oauth="$(cat oauth | tr -d '\n')"
if [[ -z ${oauth} ]]; then
echo "ERROR: Missing oauth, use theatron -p if you want to enter private mode"
notify-send "Theatron" "Copy the token into a file called oauth"
if [[ ${clip_capabilities} == "true" ]]; then
scope="clips:edit+user_read"
auth_url="https://id.twitch.tv/oauth2/authorize?client_id=$client_id&redirect_uri=$redirect_uri&response_type=token&scope=$scope"
echo "Auth url"
echo ${auth_url}
xdg-open "$auth_url"
fi
exit 1
fi
#Private mode
if [[ $1 == "-p" || $1 == "--private" ]]; then
echo "Entering private mode, check config for list of channels"
#TODO: Make it possible to enter token into rofi
channel="$(echo -e ${following} | ${launcher})"
else
# Check if user wants to see content he's following or not
if [[ ${default_browse_type} == '' ]]; then
browse_type_options="Channels you're following\nGames you're following\nAll games\nAll streams\nChange current stream quality or restart previous stream: $(tail -1 .currently_playing)"
browse_type=$(echo -e "$browse_type_options" | ${launcher})
echo "Selected $browse_type"
else
browse_type=${default_browse_type}
fi
# If user wants to browse the channels they follow
if [[ ${browse_type} == "Games you're following" ]]; then
# Get the user id, which is needed to get the followed games
echo "Getting your user ID..."
user_id=$(getTwitchUserId)
if [[ -z ${user_id} ]]; then
notify-send "You need a new token, remove oauth file and restart the app"
exit 1
fi
# Get the games the user is following, note: the amount of viewers does not reflect the live amount (delayed)
echo "Getting the games you follow..."
empty_games="You're not following any games, choose me to browse top games instead\nBrowse followed channels"
games=$(getFollowingGames ${user_id})
if [[ -z ${games} ]]; then
games="$empty_games"
fi
game=$(echo -e "${games}" | ${launcher})
if [[ -z ${game} ]]; then
exit 1
fi
echo $game
if [[ ${game} == "You're not following any games, choose me to browse top channels instead" ]]; then
browse_type="All games"
if [[ ${game} == "Browse followed channels" ]]; then
browse_type="Channels you're following"
fi
else
game_name=$(echo ${game#*viewers - })
game_formatted=$(echo ${game_name} | jq -s -R -r @uri | rev | cut -c4- | rev)
# Get the channels from the selected game
echo "Getting the channels from ${game_name}..."
channel=$(getChannelsFromGame ${game_formatted} | ${launcher})
#Check for empty pick
if [[ -z ${channel} ]]; then
notify-send "You need to pick a channel..."
exit 1
fi
fi
fi
if [[ ${browse_type} == "Channels you're following" ]]; then
# Get all the channels the user follows
channel=$(getFollowingChannels | ${launcher})
if [[ -z $channel ]]; then
exit 1
fi
fi
# If user wants to browse the games they follow
# If the user wants to browse every game on Twitch
# Changed from elif to support going from one browse type to another
if [[ ${browse_type} == "All games" ]]; then
# Get all the games (top X by most viewers)
# TODO: make more requests after the first 100
echo 'Getting all games...'
game=$(getAllGames | ${launcher})
if [[ -z ${game} ]]; then
notify-send "Selection cancelled"
exit 1
fi
game_name=$(echo ${game#*viewers - })
game_formatted=$(echo ${game_name} | jq -s -R -r @uri | rev | cut -c4- | rev)
# Get the channels from the selected game
echo "Getting the channels from ${game_name}..."
channel=$(getChannelsFromGame ${game_formatted} | ${launcher})
fi
if [[ ${browse_type} == "All streams" ]]; then
channel=$(getChannelsFromGame | ${launcher})
fi
if [[ ${browse_type} == "Change current stream quality"* ]]; then
pid="$(head -n 1 .currently_playing)"
channel="$(tail -1 .currently_playing)"
echo "$channel with quality $picked_quality"
echo "Killing existing ... $pid"
kill $pid
rm .currently_playing
fi
not_following=$(echo ${channel} | awk '{print $2}')
if [[ -n ${not_following} ]]; then
channel=${not_following}
fi
if [[ -z ${channel} ]]; then
exit 1
fi
fi
if [[ -z ${channel} ]]; then
exit 1
notify-send "Theatron" "Didn't pick anything"
fi
if [[ ${vod_mode} == "true" ]]; then
#čšć is used to sanitize output easier, so we don't remove every : but only the json key:value colon
id=$(curl -H 'Accept: application/vnd.twitchtv.v5+json' \
-H "Client-ID: $client_id" \
-X GET "https://api.twitch.tv/kraken/users?login=$channel" |
jq -c '.users[] | ._id' | tr -d '"') \
live=$(curl -H 'Accept: application/vnd.twitchtv.v5+json' \
-H "Client-ID: $client_id" \
-X GET "https://api.twitch.tv/kraken/streams/$id" |
jq -r '.stream')
if [[ ${live} != "null"* ]]; then
live="Channel is live, click me to watch"
else
live="Channel is not yet live, use polling service and wait :( "
fi
echo "$id" >bId.txt
#Use ćšć as unique identifiers of what values are and what the keys are
video=$(curl -H 'Accept: application/vnd.twitchtv.v5+json' \
-H "Client-ID: $client_id" \
-X GET "https://api.twitch.tv/kraken/channels/$id/videos?limit=$vod_mode_limit" |
jq -c --unbuffered '.videos[] | {"čšć" : .title, " (čšć": .created_at, ") čšć": .url}' |
tr -d '\{\}\"\,' | sed 's/čšć://g' |
printf "%s\n%s" "$live" "$(cat -)" | ${launcher} | awk 'NF>0{print $NF}')
# Exit if no selection
if [[ -z ${video} ]]; then
exit 1
fi
fi
picked_quality="best"
if [[ ${always_best} == "false" ]]; then
picked_quality="$(echo -e ${quality} | ${launcher})"
fi
if [[ ${popup_chat} == "true" || $1 == "-p" ]]; then
xdg-open https://www.twitch.tv/popout/${channel}/chat?popout=
fi
if [[ -z ${channel} ]]; then
echo "No channel picked."
exit 1
else
streamlink https://www.twitch.tv/${channel} ${picked_quality} --player=mpv ${streamlink_flags} &
echo -e "$!\n${channel}" >.currently_playing
fi
# vim: ft=sh

View file

@ -0,0 +1,7 @@
xmonad /home/leon/.xmonad/lib/Config.hs
polybar /home/leon/.config/polybar/config.ini
picom /home/leon/.config/picom.conf
vimrc /home/leon/.vimrc
termite /home/leon/.config/termite/config
alacritty /home/leon/.config/alacritty/alacritty.yml
fish /home/leon/.config/fish/config.fish

View file

@ -0,0 +1,132 @@
#!/bin/sh
print_host()
{
[ -z "$HOST" ] && cat /etc/hostname || printf "$HOST\n"
}
print_kernel()
{
kernel=$(uname -r)
kernel="${kernel%%_*}"
kernel="${kernel%%-*}"
printf "$kernel\n"
}
print_pkgs()
{
C() { command -v "$@" >/dev/null 2>&1 ; }
if [ -d /bedrock ] ; then
pkgs="N/A"
elif C dpkg ; then
pkgs="$(printf $(dpkg-query -f '${binary:Package}\n' -W | wc -l))"
elif C rpm ; then
pkgs="$(rpm -qa | wc -l)"
elif C pacman ; then
pkgs="$(pacman -Qq | wc -l)"
elif C xbps-query ; then
pkgs="$(xbps-query -l | wc -l)"
elif C kiss l ; then
pkgs="$(kiss l | wc -l)"
elif C yum ; then
pkgs="$(yum list installed | wc -l)"
elif C bonsai ; then
pkgs="$(bonsai list | wc -l)"
elif C guix ; then
pkgs="$(guix package --list-installed | wc -l)"
elif C pkg ; then
pkgs="$(pkg info -a | wc -l | tr -d ' ')"
else
pkgs="N/A"
fi
printf "$pkgs\n"
}
print_shell()
{
shell="${SHELL##*/}"
printf "$shell\n"
}
print_os()
{
if [ -e /etc/os-release ] && . /etc/os-release ; then
printf "$PRETTY_NAME\n"
elif [ -d /bedrock ] ; then
cat /bedrock/etc/bedrock-release
else
uname -s || printf "N/A\n"
fi
}
print_wal()
{
wal=$(xrdb -q | grep wallpaper | awk 'NR == 2 {print $2}')
printf "$wal\n"
}
print_colors()
{
colors="$(xrdb -q | grep "#include" | awk '{print $2}')"
colors="${colors##*/}"
colors=${colors%\"}
printf "$colors\n"
}
print_user()
{
if [ -z "$LOGNAME" ]; then
printf "N/A\n"
else
printf "$LOGNAME\n"
fi
}
print_resolution()
{
printf "\n"
}
set_colors()
{
r="\033[32m"
re="\033[0m"
gb="\033[42m"
bl="\e[7m \e[0m"
gb="$g$bl"
gbs="$gb$gb$gb$gb$gb$gb"
}
print_colors()
{
printf "\n"
printf " \e[41m \e[42m \e[43m \e[44m \e[45m \e[46m \e[0m\n"
printf "\n"
}
print_wm()
{
if command -v xprop >/dev/null 2>&1 ; then
WM=$(xprop -id $(xprop -root -notype | awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}') -notype -f _NET_WM_NAME 8t | grep "WM_NAME" | cut -f2 -d \")
else
WM="TTY"
fi
printf "$WM\n"
}
set_colors
printf "\n"
printf " $r┌────────────────────────────────────┐$re\n"
printf " $r│ KER:$re %-30s$r$re\n" "$(print_kernel)"
printf " $r│ PKG:$re %-30s$r$re\n" "$(print_pkgs)"
printf " $r│ SHE:$re %-30s$r$re\n" "$(print_shell)"
printf " $r│ DIS:$re %-30s$r$re\n" "$(print_os)"
printf " $r│ SES:$re %-30s$r$re\n" "$(print_wm)"
printf " $r│ HOS:$re %-30s$r$re\n" "$(print_host)"
printf " $r│ USE:$re %-30s$r$re\n" "$(whoami)"
printf " $r└────────────────────────────────────┘$re\n"
printf "\n"

55
files/scripts/casefandeamon.py Executable file
View file

@ -0,0 +1,55 @@
#!/usr/bin/env python3
import re
import time
import subprocess
fans=["fan2", "fan3"]
default_fan_speed = 30
def run_fan_check():
fan_speed = default_fan_speed
sensors_out = subprocess.check_output(['sensors'])
sensors_out = sensors_out.decode('UTF-8').splitlines()
tdie_temp = [x for x in sensors_out if x.startswith("Tdie")]
if len(tdie_temp) > 0:
temp = tdie_temp[0]
temp = float(re.findall(r"^Tdie:\s*\+(.*?)°C.+", temp)[0])
# if temp < 50:
# fan_speed = 20
# if temp < 60:
# fan_speed = 30
# elif temp < 70:
# fan_speed = 40
# elif temp < 80:
# fan_speed = 60
# else:
# fan_speed = 100
if temp < 60:
fan_speed = 60
if temp < 60:
fan_speed = 60
elif temp < 70:
fan_speed = 60
elif temp < 80:
fan_speed = 70
else:
fan_speed = 100
print("setting fan speed to " + str(fan_speed) + "%, temp is " + str(temp))
for fan in fans:
subprocess.run(["liquidctl", "set", fan, "speed", str(fan_speed)])
while True:
try:
run_fan_check()
except:
print("There was a problem while running the fan curve")
time.sleep(5)
# cm-rgb-cli
# run as casefan.service (systemctl enable casefan)

2
files/scripts/cheat Executable file
View file

@ -0,0 +1,2 @@
#!/bin/bash
curl "cheat.sh/$*"

View file

@ -0,0 +1,283 @@
[{"name": "B+M GmbH ", "coordinates": [8.420524,49.009567]},
{"name": "ABAS Business Solutions ", "coordinates": [-87.25,-21.58333]},
{"name": "Accenon Software und Hardware GmbH ", "coordinates": [9.095530197,49.1376901525]},
{"name": "AIM Infrarot-Module GmbH ", "coordinates": [7.081559,47.871831]},
{"name": "Airbus Defence&Space ", "coordinates": [9.40132,47.6437973078]},
{"name": "Airbus DS GmbH ", "coordinates": [9.4007,49.26438]},
{"name": "AKDB ", "coordinates": [11.525949,48.134414]},
{"name": "Akoncepts GmbH ", "coordinates": [8.4874362,49.4792937]},
{"name": "Alfred Kärcher GmbH & Co. KG ", "coordinates": [9.394158,48.877437]},
{"name": "All for one Steeb AG ", "coordinates": [7.605732,48.676198]},
{"name": "Allyve GmbH ", "coordinates": [-91.06677,-33.2841]},
{"name": "Alpha & ooo Ltd ", "coordinates": [-6.281706,48.136119]},
{"name": "Ambiel IT-Systemhaus GmbH ", "coordinates": [9.207564,49.154649]},
{"name": "amotIQ automotive GmbH ", "coordinates": [9.220864,49.121308]},
{"name": "AOK ", "coordinates": [9.184971,48.80214]},
{"name": "ASAP Engineering GmbH ", "coordinates": [-82.15066,30.01913]},
{"name": "ASAP Engineering GmbH ", "coordinates": [11.3582225842,48.7783547165]},
{"name": "asknet AG ", "coordinates": [8.424129,49.013614]},
{"name": "ASZ GmbH & Co. KG ", "coordinates": [9.08155168318,49.233622595]},
{"name": "Atelier Suljic ", "coordinates": [9.131458,48.785528]},
{"name": "Audi AG ", "coordinates": [9.21373377122,49.1772095097]},
{"name": "Audi AG ", "coordinates": [9.92529,48.7019031408]},
{"name": "Audi quattro GmbH ", "coordinates": [9.225522,49.1982]},
{"name": "August Läpple South Africa (Pty) Ltd ", "coordinates": [6.325376,-29.883713]},
{"name": "AZO CONTROLS GmbH ", "coordinates": [9.21373377122,49.1772095097]},
{"name": "AZUR SPACE Solar Power GmbH ", "coordinates": [9.206259,49.134855]},
{"name": "B&R Industrie Elektronik GmbH ", "coordinates": [9.205205,49.128262]},
{"name": "B-Alive ", "coordinates": [9.82743,48.065483]},
{"name": "BBT Thermotechnik GmbH ", "coordinates": [9.415556,48.685913]},
{"name": "BBT Thermotechnik GmbH ", "coordinates": [9.39035232949,48.34361]},
{"name": "Bechtle AG ", "coordinates": [9.21373377122,49.1772095097]},
{"name": "Beyond Infinity Technologies ", "coordinates": [9.196977,49.119901]},
{"name": "birkle IT GmbH ", "coordinates": [11.254742,47.917049]},
{"name": "Blaze Web Services Pvt.Ltd. ", "coordinates": [12.15,8.21667]},
{"name": "Borm Informatik AG ", "coordinates": [8.620689,47.030372]},
{"name": "Bosch Corporation ", "coordinates": [139.279417452,35.5330801096]},
{"name": "Bosch Engineering GmbH ", "coordinates": [9.147516,48.923088]},
{"name": "Bosch Engineering GmbH ", "coordinates": [9.27235344845,49.0514975674]},
{"name": "Bosch Sicherheitssysteme ", "coordinates": [11.654644,48.051948]},
{"name": "Bosch Software Innovations GmbH ", "coordinates": [9.34535829075,47.6601052236]},
{"name": "Bright Future GmbH ", "coordinates": [6.923957,50.939804]},
{"name": "bruker axs ", "coordinates": [8.338856,49.033414]},
{"name": "Bürkert Werke GmbH ", "coordinates": [9.654149,49.297379]},
{"name": "Bütema AG ", "coordinates": [9.137538,48.960021]},
{"name": "camos Software und Beratung GmbH ", "coordinates": [9.160821,48.770403]},
{"name": "Campus Career Network ", "coordinates": [6.50455170129,47.28325]},
{"name": "CAS Software AG ", "coordinates": [8.438258,49.021629]},
{"name": "Cenit AG Systemhaus ", "coordinates": [9.122388,48.722229]},
{"name": "Cinepartners ", "coordinates": [-118.449421,33.976557]},
{"name": "Cinteo GmbH ", "coordinates": [9.167007,48.779357]},
{"name": "cirosec ", "coordinates": [9.210499,49.150046]},
{"name": "COM-Active ", "coordinates": [9.192747,48.89673]},
{"name": "CompuGroup Medical Software GmbH ", "coordinates": [7.57891,50.388615]},
{"name": "concept ", "coordinates": [9.221327,49.127059]},
{"name": "condero AG ", "coordinates": [-82.15066,30.01913]},
{"name": "Consipio Software Engineering GmbH ", "coordinates": [9.206114,49.122636]},
{"name": "Continental Automotive GmbH ", "coordinates": [8.93609,50.50447]},
{"name": "Continental Automotive GmbH ", "coordinates": [12.140937,49.006071]},
{"name": "Credit Suisse AG ", "coordinates": [8.53865,47.369936]},
{"name": "csi Verwaltungs GmbH ", "coordinates": [9.235142,49.181564]},
{"name": "Daimler AG ", "coordinates": [-99.45538,34.46466]},
{"name": "Daimler AG ", "coordinates": [9.264124,48.812696]},
{"name": "Daimler AG ", "coordinates": [8.976732,48.678832]},
{"name": "Daimler AG ", "coordinates": [8.957157,48.6897485]},
{"name": "Daimler FleetBoard GmbH ", "coordinates": [9.12223,48.723717]},
{"name": "Daimler Groups Services Berlin GmbH ", "coordinates": [9.262139,48.813402]},
{"name": "debitel AG ", "coordinates": [-99.45538,34.46466]},
{"name": "Deloitte & Touche GmbH Wirtschaftsprüfungsgesellschaft ", "coordinates": [5.9453075,51.015089]},
{"name": "Deutscher Sparkassenverlag GmbH ", "coordinates": [9.125774,48.732082]},
{"name": "Deutscher Sparkassenverlag ", "coordinates": [9.123557,48.725032]},
{"name": "Deutsches Zentrum für Luft- und Raumfahrt e.V. ", "coordinates": [11.2366962267,48.0661901483]},
{"name": "diva-e Digital Value Enterprise GmbH ", "coordinates": [8.420475,49.003768]},
{"name": "diva-e Netpioneer GmbH ", "coordinates": [8.420475,49.003768]},
{"name": "DO100 ", "coordinates": [9.175172,48.771859]},
{"name": "doubleSlash Net-Business GmbH ", "coordinates": [9.49848,47.66232]},
{"name": "Dr. Ing. h.c. F. Porsche AG ", "coordinates": [9.153236,48.836504]},
{"name": "Dr. Thomas und Partner GmbH & Co. KG ", "coordinates": [8.392095,49.044292]},
{"name": "dsb AG ", "coordinates": [9.232987,49.181932]},
{"name": "Dürr Systems GmbH ", "coordinates": [9.127318,48.939867]},
{"name": "e-Team Fahrer GmbH ", "coordinates": [9.225356,49.15789]},
{"name": "EADS Deutschland GmbH ", "coordinates": [11.562051,48.279273]},
{"name": "EADS Deutschland GmbH ", "coordinates": [9.40132,47.6437973078]},
{"name": "EASY Mobile Service GmbH ", "coordinates": [6.886897,51.430622]},
{"name": "Eberle GmbH ", "coordinates": [13.091182,48.803462]},
{"name": "eBIS ", "coordinates": [9.201249,49.175937]},
{"name": "ebm-papst Mulfingen Gmbh & Co KG ", "coordinates": [9.79638835284,48.84938]},
{"name": "ebsoft GmbH ", "coordinates": [-82.15066,30.01913]},
{"name": "econsor mobile GmbH ", "coordinates": [9.225622,49.13976]},
{"name": "EMEDIA OFFICE GmbH ", "coordinates": [9.215661,49.151965]},
{"name": "Emedia Office ", "coordinates": [-82.15066,30.01913]},
{"name": "EN Storage GmbH ", "coordinates": [5.71667,47.48333]},
{"name": "EnBW Kraftwerke AG ", "coordinates": [9.167494,48.711979]},
{"name": "Enterra Software GmbH ", "coordinates": [8.5823,49.38217]},
{"name": "Ericsson GmbH ", "coordinates": [9.426236,48.944738]},
{"name": "essendi it GmbH ", "coordinates": [6.626651,48.15208]},
{"name": "ETAS Gmbh ", "coordinates": [-99.45538,34.46466]},
{"name": "Euclideon Holographies ", "coordinates": [153.099007,-27.460686]},
{"name": "EUKLA Partnerprogramm Korea |", "coordinates": [4.495207,51.53173]},
{"name": "EXA Deutschland GmbH ", "coordinates": [8.56072975132,49.2769831202]},
{"name": "Exept Software AG ", "coordinates": [9.130011,48.960817]},
{"name": "eXept Software AG ", "coordinates": [9.130011,48.960817]},
{"name": "Exgen Networks ", "coordinates": [83.16319,-8.4]},
{"name": "eXXcellent solutions consulting & software gmbh ", "coordinates": [9.111822,48.724553]},
{"name": "eXXcellent solutions gmbh ", "coordinates": [9.980736,48.40604]},
{"name": "F.A.S.T GmbH ", "coordinates": [9.37131482529,49.2203370901]},
{"name": "Favotec ", "coordinates": [9.215661,49.151965]},
{"name": "Flexus AG ", "coordinates": [9.9966678,49.8021891]},
{"name": "Fraunhofer Gesellschaft ", "coordinates": [11.529622,48.131107]},
{"name": "Fraunhofer IIS ", "coordinates": [11.125364,49.486954]},
{"name": "Fraunhofer Institut (IPA) ", "coordinates": [9.096289,48.740145]},
{"name": "Fraunhofer-Institut für Solare Energiesysteme ISE ", "coordinates": [7.162118,46.805487]},
{"name": "Fujitsu Semiconductor Embedded Solutions Austria GmbH ", "coordinates": [14.310584,48.302288]},
{"name": "Fujitsu TDS GmbH ", "coordinates": [9.232987,49.181932]},
{"name": "Gebhardt Fördertechnik AG ", "coordinates": [-76.86609,39.80482]},
{"name": "Gerd Hirsch Wirtschaftsinformatiker ", "coordinates": [9.322871,49.040222]},
{"name": "Gigatronik ", "coordinates": [11.577501,48.189883]},
{"name": "grandcentrix GmbH ", "coordinates": [7.009899,50.966368]},
{"name": "Hahne Labortechnik GmbH ", "coordinates": [10.911849,50.431648]},
{"name": "Heidelberger Druck AG ", "coordinates": [8.672469,49.404605]},
{"name": "Heiler Software AG ", "coordinates": [9.097305,48.819867]},
{"name": "Hessische Landesbank ", "coordinates": [8.27502,49.966537]},
{"name": "Hewlett-Packard GmbH ", "coordinates": [8.980225,48.677696]},
{"name": "Hinze Consulting ", "coordinates": [-91.06677,-33.2841]},
{"name": "hiqs GmbH ", "coordinates": [9.218662,49.139615]},
{"name": "Hohenstein Laboratories GmbH&Co. KG ", "coordinates": [9.08246846914,49.0321938248]},
{"name": "hte Aktiengesellschaft ", "coordinates": [8.639657,49.407195]},
{"name": "Hüller Hille GmbH ", "coordinates": [null,null]},
{"name": "i/POL GmbH ", "coordinates": [-82.15066,30.01913]},
{"name": "i3G ", "coordinates": [-82.15066,30.01913]},
{"name": "IAV GmbH ", "coordinates": [13.320002,52.522814]},
{"name": "IBM Deutschland Entwicklung GmbH ", "coordinates": [8.96425144031,48.6643668784]},
{"name": "IBM Deutschland GmbH ", "coordinates": [9.074226,48.726287]},
{"name": "IBM Deutschland Info.-Systeme GmbH ", "coordinates": [8.628543,50.087863]},
{"name": "ibs Ingenieurbüro Schmidt ", "coordinates": [9.398883,49.400938]},
{"name": "IBSolution GmbH ", "coordinates": [9.208026,49.153981]},
{"name": "IDS Imaging Development Systems GmbH ", "coordinates": [9.357839,49.142448]},
{"name": "Indeca GmbH ", "coordinates": [9.213204,49.151271]},
{"name": "InnoSysTec GmbH ", "coordinates": [9.31211,47.76223]},
{"name": "Integralis AG ", "coordinates": [9.217067,49.118373]},
{"name": "Integralis Deutschland GmbH ", "coordinates": [11.685678,48.229372]},
{"name": "IT-Designers GmbH ", "coordinates": [6.52742,47.28325]},
{"name": "Jetter AG ", "coordinates": [9.229199,48.909351]},
{"name": "Jimbo GmbH ", "coordinates": [9.920262,53.564169]},
{"name": "Jung Electronic GmbH ", "coordinates": [7.75592,47.71392]},
{"name": "KACO new energy GmbH ", "coordinates": [9.21373377122,49.1772095097]},
{"name": "Karl Marbach GmbH ", "coordinates": [9.198545,49.147413]},
{"name": "Kaufland Informationssysteme GmbH & Co. KG ", "coordinates": [9.21373377122,49.1772095097]},
{"name": "Kaufland Informationssysteme GmbH&CoKG ", "coordinates": [9.298765,49.15003]},
{"name": "Kaufland Omnichannel International GmbH ", "coordinates": [9.21373377122,49.1772095097]},
{"name": "Keen Games GmbH & Co. KG ", "coordinates": [8.48084890966,49.9948387857]},
{"name": "Kenngott Treppen GmbH ", "coordinates": [9.206853,49.168525]},
{"name": "KLW GmbH ", "coordinates": [9.23264905943,49.0486644661]},
{"name": "Kreissparkasse Heilbronn ", "coordinates": [9.221644,49.13848]},
{"name": "Krug&Partner GmbH ", "coordinates": [-83.77881,-37.760345642]},
{"name": "KS Kolbenschmidt GmbH ", "coordinates": [9.220013,49.192066]},
{"name": "KSD Köhler System- und Datentechnik GmbH ", "coordinates": [9.47875238664,49.1876367587]},
{"name": "L-mobile solutions GmbH & Co. KG ", "coordinates": [9.491822,49.001911]},
{"name": "Leonhard Weiss GmbH ", "coordinates": [10.0712918301,49.1635499879]},
{"name": "Lidl Digital International GmbH & Co. KG ", "coordinates": [9.235281,49.182577]},
{"name": "Lidl E-Commerce International GmbH & Co KG ", "coordinates": [9.235281,49.182577]},
{"name": "Lidl Stiftung und Co KG ", "coordinates": [9.21373377122,49.1772095097]},
{"name": "Logica Deutschland GmbH&Co. KG ", "coordinates": [9.171176,48.709603]},
{"name": "M Plan GmbH ", "coordinates": [9.09465,48.822561]},
{"name": "M-Way Solutions ", "coordinates": [9.178694,48.808729]},
{"name": "Magna Car Top Systems GmbH ", "coordinates": [9.13173,48.961219]},
{"name": "Matodayu UG ", "coordinates": [10.993146,49.630325]},
{"name": "McKesson Europe AG ", "coordinates": [9.183806,48.789692]},
{"name": "MDR Metallbau Onlineshop GmbH ", "coordinates": [9.206114,49.122636]},
{"name": "Mercedes Benz Bank ", "coordinates": [9.18056,48.810022]},
{"name": "MHM-Systemhaus GmbH ", "coordinates": [9.160451,48.784909]},
{"name": "MHP Management- und IT-Beratung ", "coordinates": [9.197901,48.891911]},
{"name": "Mieschke Hofmann und Partner ", "coordinates": [7.29986,46.826904]},
{"name": "MobileOne Infocom Pvt. Ltd. ", "coordinates": [67.2693109272,17.2839238678]},
{"name": "Mondi GmbH ", "coordinates": [9.304137,48.740115]},
{"name": "MPDV Mikrolab GmbH ", "coordinates": [8.06637,48.59688]},
{"name": "MTU Amerika Inc. ", "coordinates": [-83.55521,42.435166]},
{"name": "N+M GmbH ", "coordinates": [7.79896,47.97633]},
{"name": "NavaTec GmbH ", "coordinates": [9.19903495631,48.67917]},
{"name": "navigon GmbH ", "coordinates": [9.94404,49.798936]},
{"name": "Neobotix GmbH ", "coordinates": [-82.15066,30.01913]},
{"name": "Netpioneer GmbH ", "coordinates": [8.396805,49.00092]},
{"name": "NHM-Systemhaus GmbH ", "coordinates": [-99.45538,34.46466]},
{"name": "Nintendo of Europe ", "coordinates": [9.01194962457,49.8868114712]},
{"name": "Nova Tec GmbH ", "coordinates": [9.16809,48.69406]},
{"name": "NTT Security (Germany) GmbH ", "coordinates": [11.685678,48.229372]},
{"name": "Nuveon GmbH ", "coordinates": [9.215661,49.151965]},
{"name": "ObjectFab GmbH ", "coordinates": },
{"name": "odelo GmbH ", "coordinates": [9.355486,48.868036]},
{"name": "Olive Media Products Inc. ", "coordinates": [-73.984563,40.742297]},
{"name": "Ondics GmbH ", "coordinates": [9.301671,48.735965]},
{"name": "Orgaplus Software GmbH ", "coordinates": [9.193297,49.13227]},
{"name": "Orientation in Objects GmbH ", "coordinates": [8.523524,49.508177]},
{"name": "Peter Kwasny GmbH ", "coordinates": [9.15954,49.276717]},
{"name": "Philips Medizin Systeme Böblingen GmbH ", "coordinates": [8.985586,48.678862]},
{"name": "pit-cup GmbH ", "coordinates": [8.635702,49.396537]},
{"name": "PlanB. GmbH ", "coordinates": [10.09414,48.88311]},
{"name": "Porsche AG ", "coordinates": [9.153236,48.836504]},
{"name": "Porsche AG ", "coordinates": [9.148448,48.922428]},
{"name": "Porsche Consulting GmbH ", "coordinates": [9.135714,48.939448]},
{"name": "Porsche Engineering Services GmbH ", "coordinates": [9.07468344312,48.9353839585]},
{"name": "Portolan Commerce Solutions GmbH ", "coordinates": [9.260439,49.065716]},
{"name": "Precitec ITM GmbH ", "coordinates": [11.254742,47.917049]},
{"name": "Prodware Deutschland AG ", "coordinates": [9.178482,48.813589]},
{"name": "Project Solution GmbH ", "coordinates": [8.399302,48.995627]},
{"name": "proveo AG ", "coordinates": [10.023126,49.127353]},
{"name": "R. Stahl Schaltgeräte GmbH ", "coordinates": [-90.939051,35.563188]},
{"name": "R/GA ", "coordinates": [-74.007193,40.653014]},
{"name": "redemann design ", "coordinates": [9.137298,49.193754]},
{"name": "redhotmagma GmbH ", "coordinates": [9.222839,48.804749]},
{"name": "Reisebüro Osman GmbH ", "coordinates": [9.204206,49.1417897]},
{"name": "response software engineering GmbH ", "coordinates": [11.098381,49.46781]},
{"name": "Robert Bosch GmbH Zentralbereich Einkauf ", "coordinates": [9.14807,48.832065]},
{"name": "Robert Bosch GmbH ", "coordinates": [-99.45538,34.46466]},
{"name": "Robert Bosch GmbH ", "coordinates": [9.063684,48.779796]},
{"name": "Robert Bosch GmbH ", "coordinates": [8.97963415731,48.7796436647]},
{"name": "Robert Bosch GmbH ", "coordinates": [9.29602,48.823026]},
{"name": "Robert Bosch GmbH ", "coordinates": [9.191014,48.498152]},
{"name": "Robert Bosch GmbH ", "coordinates": [9.27235344845,49.0514975674]},
{"name": "Robert Bosch GmbH ", "coordinates": [9.27235344845,49.0514975674]},
{"name": "Robert Bosch Packaging Technology GmbH ", "coordinates": [10.071945,49.13758]},
{"name": "Robert-Bosch GmbH ", "coordinates": [9.080511,48.881506]},
{"name": "Rotex Heating Systems GmbH ", "coordinates": [8.98892357006,49.0610196225]},
{"name": "RVS Software + Consulting KG ", "coordinates": [9.265267,47.393968]},
{"name": "SAP AG ", "coordinates": [-114.816591,-35.72259]},
{"name": "SAP SE ", "coordinates": [8.641804,49.293706]},
{"name": "SAS Automotive Systems ", "coordinates": [8.350979,49.027553]},
{"name": "Schwarz Dienstleistung KG ", "coordinates": [9.235281,49.182577]},
{"name": "Schwarz e-Commerce gmbH & Co KG ", "coordinates": [9.235281,49.182577]},
{"name": "Schwarz IT GmbH&Co KG ", "coordinates": [9.235281,49.182577]},
{"name": "Schwarz Zentrale Dienste KG ", "coordinates": [9.235281,49.182577]},
{"name": "Schwarzer GmbH ", "coordinates": [9.207449,49.154332]},
{"name": "Schweikert ", "coordinates": [9.31505782697,49.1228242479]},
{"name": "sd&m AG ", "coordinates": [11.644424,48.087173]},
{"name": "Seamiq Vietnam ", "coordinates": [106.354982704,10.36950016]},
{"name": "Seidenader Automation GmbH & Co KG ", "coordinates": [11.8419530191,48.1807407163]},
{"name": "seracom GmbH ", "coordinates": [-99.45538,34.46466]},
{"name": "SIC! Software GmbH ", "coordinates": [9.208436,49.154443]},
{"name": "Siemens AG Karlsruhe ", "coordinates": [-100.638049,48.022249]},
{"name": "Siemens AG ", "coordinates": [11.254742,47.917049]},
{"name": "Siemens Industry Inc. ", "coordinates": [-121.862622,-34.4751085718]},
{"name": "Siemens Medical Solutions USA ", "coordinates": [-75.530586,40.022695]},
{"name": "Signetix International Ltd. ", "coordinates": [146.396376,-41.288614]},
{"name": "Siller AG ", "coordinates": [-82.15066,30.01913]},
{"name": "SLK-Kliniken ", "coordinates": [9.189865,49.153864]},
{"name": "SMA Solar Technology AG ", "coordinates": [9.53260186921,51.2999105311]},
{"name": "SNIT GmbH & Co KG ", "coordinates": [9.12338,48.721063]},
{"name": "Softec GmbH ", "coordinates": [8.354688,49.002116]},
{"name": "SoftMate GmbH Intelligent Software Solutions ", "coordinates": [9.248739,48.766384]},
{"name": "Software-Schmiede Vogler und Hauke GmbH ", "coordinates": [9.232987,49.181932]},
{"name": "SolarArt GmbH & Co KG ", "coordinates": [9.67517994555,49.5535265343]},
{"name": "Solid-IT-GmbH ", "coordinates": [9.212798,49.14249]},
{"name": "Spirit / 21 AG ", "coordinates": [8.972983,48.680754]},
{"name": "Steeb Anwendungssysteme GmbH ", "coordinates": [9.293017,49.067012]},
{"name": "Steinbeis Transferzentrum ", "coordinates": [9.206114,49.122636]},
{"name": "Steinbeis Transferzentrum ", "coordinates": [8.543114,49.052459]},
{"name": "Steinbeis-Transferzentrum ", "coordinates": [8.908075,49.133279]},
{"name": "SYNCING.NET Technologies GmbH ", "coordinates": [-82.15066,30.01913]},
{"name": "Tekrob GmbH ", "coordinates": [9.218952,49.123304]},
{"name": "The Uganda Pentecostal University ", "coordinates": [27.74864,-14.41129]},
{"name": "ThePeople.de GmbH ", "coordinates": [9.211642,49.101908]},
{"name": "Thin Client Computing Products GmbH ", "coordinates": [9.142185,48.892864]},
{"name": "v-fab GmbH ", "coordinates": [-99.45538,34.46466]},
{"name": "Valeo Systems Thermiques SAS ", "coordinates": [1.93222124878,48.7209472377]},
{"name": "VDQ Business Solutions ", "coordinates": [7.826973,50.695293]},
{"name": "Vector Informatik GmbH ", "coordinates": [9.095182,48.824933]},
{"name": "Vietnamese-German University |", "coordinates": [13.2877849,-22.5666248]},
{"name": "VION Crailsheim GmbH ", "coordinates": [10.0150721473,49.117677953]},
{"name": "virtual7 GmbH ", "coordinates": [8.273825,48.875675]},
{"name": "Voigt Software und Beratung AG ", "coordinates": [9.23264905943,49.0486644661]},
{"name": "VR Kreditwerk AG ", "coordinates": [9.746662,49.112874]},
{"name": "VSA GmbH ", "coordinates": [9.131231,48.939796]},
{"name": "VSF Experts GmbH ", "coordinates": [8.464989,49.474196]},
{"name": "Weinsbergerkreuz - Schnittstelle für Gestaltung ", "coordinates": [9.289627,49.152908]},
{"name": "Wittenstein SE ", "coordinates": [9.79494727578,49.4845078612]},
{"name": "Wöhwa Waagenbau GmbH ", "coordinates": [9.507402,49.179842]},
{"name": "Würth Elektronik eiSos GmbH & Co. KG ", "coordinates": [-90.939051,35.563188]},
{"name": "Würth Elektronik ICS GmbH&Co. KG ", "coordinates": [9.60966130041,49.2825464866]},
{"name": "Würth IT International GmbH ", "coordinates": [4.963429,47.738368]},
{"name": "Yellow Computing ", "coordinates": [9.216589,49.23572]},
{"name": "ZF Getriebe GmbH ", "coordinates": [6.969626,49.218669]},
{"name": "ZF Investment Co. Ltd. ", "coordinates": [-87.08501,26.0577]},
{"name": "ZIEHL-ABEGG ", "coordinates": [9.681735,49.280273]},
{"name": "", "coordinates": [9.66747825292,49.2684003039]}]

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