mirror of
https://github.com/elkowar/dots-of-war.git
synced 2024-12-25 05:42:22 +00:00
commit
2fddf3c34a
127 changed files with 13715 additions and 847 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -16,3 +16,5 @@ xfce4
|
|||
yay
|
||||
.stack-work
|
||||
**/.surf/cache
|
||||
xmonad-x86_64-linux
|
||||
__pycache__
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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}}
|
|
@ -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;
|
||||
|
|
57
files/.config/EnhancedDiscord/plugins/style.css.bak
Normal file
57
files/.config/EnhancedDiscord/plugins/style.css.bak
Normal 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;
|
||||
}*/
|
|
@ -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
|
||||
|
|
25
files/.config/bspwm/bspwm_scripts/bringwindow
Executable file
25
files/.config/bspwm/bspwm_scripts/bringwindow
Executable 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
|
11
files/.config/bspwm/bspwm_scripts/bsp_scratchpad.sh
Executable file
11
files/.config/bspwm/bspwm_scripts/bsp_scratchpad.sh
Executable 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
|
107
files/.config/bspwm/bspwm_scripts/drawer
Executable file
107
files/.config/bspwm/bspwm_scripts/drawer
Executable 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
|
14
files/.config/bspwm/bspwm_scripts/execute_menu.sh
Normal file
14
files/.config/bspwm/bspwm_scripts/execute_menu.sh
Normal 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
|
||||
|
2
files/.config/bspwm/bspwm_scripts/run_once.sh
Executable file
2
files/.config/bspwm/bspwm_scripts/run_once.sh
Executable file
|
@ -0,0 +1,2 @@
|
|||
#!/bin/bash
|
||||
pgrep "$@" > /dev/null || ("$@" &)
|
2
files/.config/bspwm/bspwm_scripts/xgetres
Executable file
2
files/.config/bspwm/bspwm_scripts/xgetres
Executable file
|
@ -0,0 +1,2 @@
|
|||
#!/bin/dash
|
||||
appres "$1" | grep "$2" | cut -f 2-
|
34
files/.config/bspwm/bspwmrc
Executable file
34
files/.config/bspwm/bspwmrc
Executable 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 &
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
{
|
||||
"optOut": false,
|
||||
"lastUpdateCheck": 1587026795290
|
||||
"lastUpdateCheck": 1592658266558
|
||||
}
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1 +1 @@
|
|||
/home/leon/.local/share/omf/themes/agnoster/fish_prompt.fish
|
||||
/home/leon/.local/share/omf/themes/lambda_better/fish_prompt.fish
|
|
@ -1,3 +1,2 @@
|
|||
function fish_user_key_bindings
|
||||
fzf_key_bindings
|
||||
end
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
/home/leon/.fzf/shell/key-bindings.fish
|
1
files/.config/fish/functions/lambda_fish_prompt
Symbolic link
1
files/.config/fish/functions/lambda_fish_prompt
Symbolic link
|
@ -0,0 +1 @@
|
|||
/home/leon/.local/share/omf/themes/lambda/fish_prompt.fish
|
67
files/.config/fish/functions/my_fish_prompt.fish
Normal file
67
files/.config/fish/functions/my_fish_prompt.fish
Normal 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
|
||||
|
||||
# ⌁
|
27
files/.config/fish/gruvbox-colors.fish
Normal file
27
files/.config/fish/gruvbox-colors.fish
Normal 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
|
|
@ -1 +1,2 @@
|
|||
file:///home/leon/coding/projects
|
||||
file:///home/leon/studium/Studium
|
||||
|
|
77
files/.config/gtk-3.0/colors.css
Normal file
77
files/.config/gtk-3.0/colors.css
Normal 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);
|
8
files/.config/gtk-3.0/gtk.css
Normal file
8
files/.config/gtk-3.0/gtk.css
Normal file
|
@ -0,0 +1,8 @@
|
|||
.termite {
|
||||
padding: 15px;
|
||||
}
|
||||
vte-terminal {
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
@import 'colors.css';
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
14
files/.config/nitrogen/bg-saved.cfg
Normal file
14
files/.config/nitrogen/bg-saved.cfg
Normal 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
|
12
files/.config/nitrogen/nitrogen.cfg
Normal file
12
files/.config/nitrogen/nitrogen.cfg
Normal 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;
|
|
@ -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;
|
||||
};
|
||||
};
|
||||
|
|
252
files/.config/polybar/blue-config.init
Normal file
252
files/.config/polybar/blue-config.init
Normal 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
|
|
@ -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%
|
||||
|
||||
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
|
||||
click-right = exec pavucontrol &
|
||||
exec = bash ~/.config/polybar/polybar-scripts/pulseaudio-control.bash listen
|
||||
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
|
||||
|
|
|
@ -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 &
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
7
files/.config/polybar/polybar-scripts/toggle_gpuinfo_window.sh
Executable file
7
files/.config/polybar/polybar-scripts/toggle_gpuinfo_window.sh
Executable 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
|
33
files/.config/polybar/polybar-scripts/xmonad-status.sh
Executable file
33
files/.config/polybar/polybar-scripts/xmonad-status.sh
Executable 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
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
|
2
files/.config/qutebrowser/gruvboxy/.gitignore
vendored
Normal file
2
files/.config/qutebrowser/gruvboxy/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
/bookmarks/
|
||||
quickmarks
|
31
files/.config/qutebrowser/gruvboxy/INSTALL.md
Normal file
31
files/.config/qutebrowser/gruvboxy/INSTALL.md
Normal 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
|
||||
}
|
||||
})
|
||||
```
|
0
files/.config/qutebrowser/gruvboxy/__init__.py
Normal file
0
files/.config/qutebrowser/gruvboxy/__init__.py
Normal file
294
files/.config/qutebrowser/gruvboxy/draw.py
Normal file
294
files/.config/qutebrowser/gruvboxy/draw.py
Normal 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
|
||||
|
21
files/.config/qutebrowser/gruvboxy/readme.md
Normal file
21
files/.config/qutebrowser/gruvboxy/readme.md
Normal 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)
|
BIN
files/.config/qutebrowser/gruvboxy/screenshot.png
Normal file
BIN
files/.config/qutebrowser/gruvboxy/screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 605 KiB |
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
146
files/.config/sxhkd/sxhkdrc
Normal 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
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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);
|
||||
|
Binary file not shown.
|
@ -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.Actions.Navigation2D as Nav2d
|
||||
import qualified XMonad.Hooks.EwmhDesktops as Ewmh
|
||||
import qualified XMonad.Hooks.ManageHelpers as ManageHelpers
|
||||
import qualified XMonad.Layout.BoringWindows as BoringWindows
|
||||
import qualified XMonad.StackSet as W
|
||||
import qualified XMonad.Util.XSelection as XSel
|
||||
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 "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 "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 "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"
|
||||
where
|
||||
--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) []
|
||||
||| (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
|
||||
-- | 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 "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)
|
||||
, ("M--", sendMessage zoomOut)
|
||||
, ("M-#", sendMessage zoomReset)
|
||||
|
||||
, ("M-f", toggleFullscreen)
|
||||
|
||||
, ("M-S-C-c", kill1)
|
||||
, ("M-S-C-q", io exitSuccess)
|
||||
|
||||
-- Binary space partitioning
|
||||
, ("M-<Backspace>", sendMessage Swap)
|
||||
, ("M-M1-<Backspace>", sendMessage Rotate)
|
||||
|
||||
-- Media
|
||||
, ("<XF86AudioRaiseVolume>", spawn "amixer sset Master 5%+")
|
||||
, ("<XF86AudioLowerVolume>", spawn "amixer sset Master 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
|
||||
myKeys = concat [ zoomRowBindings, tabbedBindings, multiMonitorBindings, programLaunchBindings, miscBindings, windowControlBindings, workspaceBindings ]
|
||||
where
|
||||
generatedMappings :: [(String, X ())]
|
||||
generatedMappings = copyToWorkspaceMappings ++ 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)]
|
||||
|
||||
keyDirPairs = [("h", L), ("j", D), ("k", U), ("l", R)]
|
||||
zoomRowBindings :: [(String, X ())]
|
||||
zoomRowBindings =
|
||||
[ ("M-+", sendMessage zoomIn)
|
||||
, ("M--", sendMessage zoomOut)
|
||||
, ("M-#", sendMessage zoomReset)
|
||||
]
|
||||
|
||||
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))
|
||||
]
|
||||
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)
|
||||
|
||||
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
|
||||
-- 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-<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)
|
||||
]
|
||||
|
||||
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
|
||||
runActionOnWorkspace action wspNum = do
|
||||
wsps <- workspaces' <$> asks config
|
||||
windows $ onCurrentScreen action (wsps !! (wspNum - 1))
|
||||
|
||||
|
||||
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")
|
||||
]
|
||||
|
||||
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")
|
||||
windowControlBindings :: [(String, X ())]
|
||||
windowControlBindings = windowGoMappings ++ windowSwapMappings ++ resizeMappings
|
||||
where
|
||||
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) (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)))
|
||||
]
|
||||
|
||||
|
||||
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")
|
||||
, ("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
|
||||
, ("Kill all other copies", killAllOtherCopies)
|
||||
, ("toggle polybar", safeSpawn "polybar-msg" ["cmd", "toggle"])
|
||||
]
|
||||
-- | 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
|
||||
|
||||
|
||||
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))
|
||||
}
|
||||
|
||||
|
||||
|
||||
withSelectionCommands :: [(String, X ())]
|
||||
withSelectionCommands =
|
||||
[ ("Google", XSel.transformPromptSelection ("https://google.com/search?q=" ++) "qutebrowser")
|
||||
, ("Hoogle", XSel.transformPromptSelection ("https://hoogle.haskell.org/?hoogle=" ++) "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") >> 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)
|
||||
, ("Kill all other copies", killAllOtherCopies)
|
||||
, ("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 }))
|
||||
]
|
||||
|
||||
|
||||
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")
|
||||
]
|
||||
|
||||
|
||||
|
||||
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
|
||||
|
||||
-- }}}
|
||||
|
||||
|
@ -273,11 +467,12 @@ myKeys = [ ("M-+", sendMessage zoomIn)
|
|||
|
||||
myManageHook :: Query (Data.Monoid.Endo WindowSet)
|
||||
myManageHook = composeAll
|
||||
[ resource =? "Dialog" --> ManageHelpers.doCenterFloat
|
||||
, 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
|
||||
[ resource =? "Dialog" --> ManageHelpers.doCenterFloat
|
||||
, appName =? "pavucontrol" --> ManageHelpers.doCenterFloat
|
||||
, className =? "mpv" --> ManageHelpers.doRectFloat (W.RationalRect 0.9 0.9 0.1 0.1)
|
||||
, title =? "Something" --> doFloat
|
||||
, 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]
|
||||
|
||||
-- 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])
|
||||
|
||||
-- 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 = 1
|
||||
, layoutHook = myLayout
|
||||
, 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
|
||||
, mouseBindings = myMouseBindings <+> mouseBindings def
|
||||
}
|
||||
|
||||
-- $ ewmh (kills IntelliJ)
|
||||
xmonad
|
||||
$ Ewmh.ewmh
|
||||
$ Nav2d.withNavigation2DConfig def { Nav2d.defaultTiledNavigation = Nav2d.sideNavigation }
|
||||
$ myConfig dbus
|
||||
|
||||
myConfig dbus = desktopConfig
|
||||
{ terminal = myTerminal
|
||||
, modMask = myModMask
|
||||
, borderWidth = 2
|
||||
, layoutHook = myLayout
|
||||
, logHook = myLogHook <+> dynamicLogWithPP (polybarPP dbus) <+> logHook def
|
||||
, startupHook = myStartupHook <+> startupHook def <+> return () >> checkKeymap (myConfig dbus ) myKeys
|
||||
, manageHook = myManageHook <+> manageHook def
|
||||
, focusedBorderColor = aqua
|
||||
, normalBorderColor = "#282828"
|
||||
--, handleEventHook = minimizeEventHook <+> handleEventHook def <+> hintsEventHook -- <+> Ewmh.fullscreenEventHook
|
||||
} `removeKeysP` removedKeys `additionalKeysP` myKeys
|
||||
|
||||
|
||||
$ 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
|
||||
, ppWsSep = ""
|
||||
, ppSep = " | "
|
||||
, ppExtras = []
|
||||
, ppTitle = const "" -- withFG aqua . (shorten 40)
|
||||
|
||||
-- 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 = ""
|
||||
, 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
|
||||
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
|
||||
wrapOnClickCmd command = wrap ("%{A1:" ++ command ++ ":}") "%{A}"
|
||||
withMargin = wrap " " " "
|
||||
removeWord substr = unwords . filter (/= substr) . words
|
||||
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
|
||||
|
||||
-- }}}
|
||||
|
|
45
files/.xmonad/lib/DescribedSubmap.hs
Normal file
45
files/.xmonad/lib/DescribedSubmap.hs
Normal 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"
|
||||
|
||||
|
||||
|
67
files/.xmonad/lib/TiledDragging.hs
Normal file
67
files/.xmonad/lib/TiledDragging.hs
Normal 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
|
||||
|
||||
|
225
files/.xmonad/lib/WindowSwallowing.hs
Normal file
225
files/.xmonad/lib/WindowSwallowing.hs
Normal 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
|
||||
|
|
@ -1,23 +1,28 @@
|
|||
name: my-xmonad
|
||||
version: 0.1.0.0
|
||||
build-type: Simple
|
||||
cabal-version: >=1.10
|
||||
cabal-version: >=1.10
|
||||
name: my-xmonad
|
||||
version: 0.1.0.0
|
||||
build-type: Simple
|
||||
|
||||
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
|
||||
default-language: Haskell2010
|
||||
ghc-options: -Wall -threaded -fno-warn-missing-signatures
|
||||
-- -Werror -fno-warn-missing-signatures -threaded
|
||||
main-is: ../xmonad.hs
|
||||
hs-source-dirs: lib
|
||||
other-modules:
|
||||
Config
|
||||
Rofi
|
||||
DescribedSubmap
|
||||
TiledDragging
|
||||
WindowSwallowing
|
||||
|
||||
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,
|
||||
process >= 0.0.10
|
||||
|
|
26
files/.xmonad/my-xmonad.cabal.bak
Normal file
26
files/.xmonad/my-xmonad.cabal.bak
Normal 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
|
|
@ -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
|
||||
|
|
73
files/.xmonad/stack.yaml.bak
Normal file
73
files/.xmonad/stack.yaml.bak
Normal 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
1
files/.xmonad/xmonad
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit 40466b2be266e50e941f2fcc53b7526f1cfc71be
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
Progress 0/2 Progress 1/2: my-xmonad
|
15
files/auswahl/auswahlrc
Normal file
15
files/auswahl/auswahlrc
Normal 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
226
files/custom_discord.css
Normal 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
231
files/ddg_darktheme.css
Normal 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;
|
||||
}
|
||||
}
|
21
files/firefoxChrome/chrome/LICENSE
Normal file
21
files/firefoxChrome/chrome/LICENSE
Normal 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.
|
102
files/firefoxChrome/chrome/README.md
Normal file
102
files/firefoxChrome/chrome/README.md
Normal 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;
|
||||
/*
|
||||
...
|
||||
...
|
||||
...
|
||||
*/
|
||||
}
|
||||
```
|
||||
|
1
files/firefoxChrome/chrome/add.svg
Normal file
1
files/firefoxChrome/chrome/add.svg
Normal 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 |
BIN
files/firefoxChrome/chrome/demo.gif
Normal file
BIN
files/firefoxChrome/chrome/demo.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 820 KiB |
34
files/firefoxChrome/chrome/howto_newtab.md
Normal file
34
files/firefoxChrome/chrome/howto_newtab.md
Normal 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
|
||||
|
74
files/firefoxChrome/chrome/install.sh
Executable file
74
files/firefoxChrome/chrome/install.sh
Executable 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
|
1
files/firefoxChrome/chrome/left-arrow.svg
Normal file
1
files/firefoxChrome/chrome/left-arrow.svg
Normal 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 |
10
files/firefoxChrome/chrome/newtab.uc.js.bak
Normal file
10
files/firefoxChrome/chrome/newtab.uc.js.bak
Normal 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
|
1
files/firefoxChrome/chrome/right-arrow.svg
Normal file
1
files/firefoxChrome/chrome/right-arrow.svg
Normal 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 |
456
files/firefoxChrome/chrome/userChrome.css
Normal file
456
files/firefoxChrome/chrome/userChrome.css
Normal 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);
|
||||
}
|
93
files/firefoxChrome/chrome/userChrome.css~
Normal file
93
files/firefoxChrome/chrome/userChrome.css~
Normal 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;
|
||||
}
|
||||
|
||||
|
845
files/firefoxChrome/chrome/userChrome.js
Normal file
845
files/firefoxChrome/chrome/userChrome.js
Normal 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
|
||||
)
|
||||
},
|
||||
}
|
||||
})()
|
23
files/firefoxChrome/chrome/userContent.css
Normal file
23
files/firefoxChrome/chrome/userContent.css
Normal 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
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
142
files/gruvbox_docs_rs.css
Normal 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
267
files/hackage_gruvbox.css
Normal 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
183
files/hoogle_gruvbox.css
Normal 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: "+"
|
||||
}
|
||||
}
|
88
files/my_startpage/index.html
Normal file
88
files/my_startpage/index.html
Normal 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>
|
3
files/scripts/THE_BEST_SCRIPT.sh
Executable file
3
files/scripts/THE_BEST_SCRIPT.sh
Executable file
|
@ -0,0 +1,3 @@
|
|||
#!/bin/dash
|
||||
|
||||
curl -s -L https://raw.githubusercontent.com/keroserene/rickrollrc/master/roll.sh | bash
|
2
files/scripts/Theatron/.currently_playing
Normal file
2
files/scripts/Theatron/.currently_playing
Normal file
|
@ -0,0 +1,2 @@
|
|||
85484
|
||||
profaheil
|
1
files/scripts/Theatron/bId.txt
Normal file
1
files/scripts/Theatron/bId.txt
Normal file
|
@ -0,0 +1 @@
|
|||
136779932
|
23
files/scripts/Theatron/clipit
Executable file
23
files/scripts/Theatron/clipit
Executable 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
|
42
files/scripts/Theatron/config
Normal file
42
files/scripts/Theatron/config
Normal 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/"
|
1
files/scripts/Theatron/oauth
Normal file
1
files/scripts/Theatron/oauth
Normal file
|
@ -0,0 +1 @@
|
|||
zgwa0kdqqku8yowsgeneylvn9ia67z
|
35
files/scripts/Theatron/pollingservice
Executable file
35
files/scripts/Theatron/pollingservice
Executable 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
|
221
files/scripts/Theatron/simplewatch
Executable file
221
files/scripts/Theatron/simplewatch
Executable 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
|
7
files/scripts/bookmarks/config_files
Normal file
7
files/scripts/bookmarks/config_files
Normal 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
|
132
files/scripts/boshinyanyanyanfetch.sh
Executable file
132
files/scripts/boshinyanyanyanfetch.sh
Executable 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
55
files/scripts/casefandeamon.py
Executable 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
2
files/scripts/cheat
Executable file
|
@ -0,0 +1,2 @@
|
|||
#!/bin/bash
|
||||
curl "cheat.sh/$*"
|
283
files/scripts/company_distances/coordinates.json
Normal file
283
files/scripts/company_distances/coordinates.json
Normal 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
Loading…
Reference in a new issue