mirror of
https://github.com/protesilaos/dotfiles.git
synced 2026-09-10 07:16:20 -04:00
bspwm: bring back old configs; add changes (WIP)
I plan to switch back to my bspwm setup. There probably is a lot of work to be done here, though my quick experiments today show that we are on the right path.
This commit is contained in:
parent
fc00a87c23
commit
2162cd594c
43
bin/bin/bspwm_conf_colors
Executable file
43
bin/bin/bspwm_conf_colors
Executable file
|
|
@ -0,0 +1,43 @@
|
|||
#!/bin/bash
|
||||
|
||||
# bspwm_conf_colors --- Configure color settings for BSPWM.
|
||||
#
|
||||
# Copyright (c) 2019-2021 Protesilaos Stavrou <info@protesilaos.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Values come from my Modus themes for GNU Emacs:
|
||||
# <https://protesilaos.com/modus-themes>.
|
||||
if [ -f "$HOME"/.config/bspwm/active-theme ]
|
||||
then
|
||||
case "$(cat "$HOME"/.config/bspwm/active-theme)" in
|
||||
dark*)
|
||||
border_active="#c0c530"
|
||||
border_focus="#44bc44"
|
||||
border_normal="#000000"
|
||||
bg_preselect="#041529"
|
||||
;;
|
||||
*)
|
||||
border_active="#5317ac"
|
||||
border_focus="#8f0075"
|
||||
border_normal="#ffffff"
|
||||
bg_preselect="#ebf6fa"
|
||||
;;
|
||||
esac
|
||||
|
||||
bspc config active_border_color "$border_active" # for multihead setups only
|
||||
bspc config focused_border_color "$border_focus"
|
||||
bspc config normal_border_color "$border_normal"
|
||||
bspc config presel_feedback_color "$bg_preselect"
|
||||
fi
|
||||
32
bin/bin/bspwm_conf_desktops
Executable file
32
bin/bin/bspwm_conf_desktops
Executable file
|
|
@ -0,0 +1,32 @@
|
|||
#!/bin/bash
|
||||
|
||||
# bspwm_conf_desktops --- Configure monitor settings for BSPWM.
|
||||
#
|
||||
# Copyright (c) 2019-2021 Protesilaos Stavrou <info@protesilaos.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
if [ "$(bspc query -M | wc -l)" -eq 2 ]; then
|
||||
# Set the workspaces per monitor. We only define one per monitor,
|
||||
# because of another script I have that implements dynamic desktops.
|
||||
# For the XrandR settings see my `bspwm_conf_xrandr'.
|
||||
bspc monitor LVDS-1 -d 1
|
||||
bspc monitor VGA-1 -d 8
|
||||
|
||||
# Make sure borders are always on, otherwise it is impossible to
|
||||
# find the focused window on two monitors with monocles…
|
||||
bspc config borderless_monocle false
|
||||
else
|
||||
bspc monitor -d 1
|
||||
fi
|
||||
57
bin/bin/bspwm_conf_reset_monitors
Executable file
57
bin/bin/bspwm_conf_reset_monitors
Executable file
|
|
@ -0,0 +1,57 @@
|
|||
#!/bin/bash
|
||||
|
||||
# EXPERIMENTAL 2019-11-30: It works after connecting a monitor to the
|
||||
# laptop, but not when disconnecting. The problem seems to be with
|
||||
# BSPWM, since `bspc query -M' continues to list the second monitor…
|
||||
# Will investigate further.
|
||||
#
|
||||
# Copyright (c) 2019-2021 Protesilaos Stavrou <info@protesilaos.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
## Commentary:
|
||||
#
|
||||
# Run this after {dis,}connecting an external monitor. It will
|
||||
# recognifure the layout, based on the functions provided in the scripts
|
||||
# it calls.
|
||||
|
||||
_check() {
|
||||
command -v "$1" > /dev/null
|
||||
}
|
||||
|
||||
# In case something stops working, we can call this script
|
||||
# (Ctrl+Alt+Delete on my sxhkdrc) and apply the modifications again.
|
||||
_kbd_reset_and_xmodmap() {
|
||||
xmod="$HOME"/.Xmodmap
|
||||
|
||||
setxkbmap -layout 'us,el' -option 'ctrl:nocaps,compose:menu'
|
||||
[ -f "$xmod" ] && xmodmap "$xmod"
|
||||
}
|
||||
|
||||
_check bspwm_conf_xrandr && bspwm_conf_xrandr
|
||||
_check bspwm_conf_desktops && bspwm_conf_desktops
|
||||
_kbd_reset_and_xmodmap
|
||||
|
||||
# Apply the last defined wallpaper
|
||||
fehbg="$HOME"/.fehbg
|
||||
|
||||
if [ -f "$fehbg" ] && _check feh; then
|
||||
sh -c "$fehbg"
|
||||
fi
|
||||
|
||||
# Reload the panel
|
||||
pkill -x melonpanel && melonpanel
|
||||
|
||||
# Switch my font sizes in Emacs
|
||||
pgrep -x emacs && emacsclient -e '(prot/fonts-per-monitor)'
|
||||
66
bin/bin/bspwm_conf_xrandr
Executable file
66
bin/bin/bspwm_conf_xrandr
Executable file
|
|
@ -0,0 +1,66 @@
|
|||
#!/bin/bash
|
||||
|
||||
# bspwm_conf_xrandr --- BSPWM Xrandr settings for my laptop.
|
||||
#
|
||||
# Copyright (c) 2019-2021 Protesilaos Stavrou <info@protesilaos.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
xrandr --output VGA-1 --brightness 0.935 --gamma 1:1:1
|
||||
|
||||
|
||||
|
||||
|
||||
## NOTE 2021-08-27: Below are old configurations. Keeping them here for
|
||||
## future reference.
|
||||
|
||||
# # XrandR functions
|
||||
# # ----------------
|
||||
#
|
||||
# # The brightness and gamma settings are specific to my Lenovo ThinkPad
|
||||
# # X220. It improves the reproduction of colours, especially when
|
||||
# # working with light themes. Adjustments to these values have no effect
|
||||
# # if a program such as `redshift' is running.
|
||||
# _laptop() {
|
||||
# xrandr --output LVDS-1 --mode 1366x768 --pos 0x0 \
|
||||
# --brightness 1.0 --gamma 0.76:0.75:0.68 \
|
||||
# "$@"
|
||||
# }
|
||||
#
|
||||
# _multihead() {
|
||||
# _laptop
|
||||
#
|
||||
# # Configure the external display on the VGA port. Making it the
|
||||
# # `primary' can cause problems in certain contexts that assume this
|
||||
# # to be the left- and top- most monitor.
|
||||
# xrandr --output VGA-1 --primary --mode 1920x1080 --pos 1366x0
|
||||
# }
|
||||
#
|
||||
# # Conditions for running this script
|
||||
# # ----------------------------------
|
||||
#
|
||||
# # If the VGA-1 port connects to a monitor, the output of the variable
|
||||
# # will not be empty. In which case it is assumed that I am using my
|
||||
# # external display, whose resolution I know in advance. If the variable
|
||||
# # is empty, then no external monitor is connected.
|
||||
# #
|
||||
# # This is a simplistic approach which will not work if the external
|
||||
# # monitor has another resolution. It will also fail if executed from
|
||||
# # another machine, say, another laptop that uses an HDMI connection
|
||||
# # instead.
|
||||
# if [ -n "$(xrandr --query | grep 'VGA-1 connected')" ]; then
|
||||
# _multihead
|
||||
# else
|
||||
# _laptop --primary
|
||||
# fi
|
||||
223
bin/bin/bspwm_dynamic_desktops
Executable file
223
bin/bin/bspwm_dynamic_desktops
Executable file
|
|
@ -0,0 +1,223 @@
|
|||
#!/bin/bash
|
||||
|
||||
# bspwm_dynamic_desktops --- Dynamic desktops (work spaces) for BSPWM.
|
||||
#
|
||||
# Copyright (c) 2019-2021 Protesilaos Stavrou <info@protesilaos.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
## Commentary:
|
||||
#
|
||||
# The idea with dynamic desktops is to maintain a list of varying
|
||||
# lengths with only the active items. Whereas the default is to keep a
|
||||
# fixed list of, say, ten desktops at all times.
|
||||
#
|
||||
# What this script does, in outline:
|
||||
#
|
||||
# - Switching to a non-existent desktop will create it dynamically.
|
||||
# - Sending a node to a given desktop will create that desktop as well.
|
||||
# - There also exists a variant that follows the node to that desktop.
|
||||
# - Empty desktops are removed.
|
||||
#
|
||||
# Furthermore, there exists a toggle for multi-head setups (typically
|
||||
# dual-monitor) which allows us to bind desktops to monitors, while
|
||||
# retaining the aforementioned patterns of behaviour. In practice this
|
||||
# means that the relevant commands become agnostic to the focused
|
||||
# monitor so that, e.g., switching to desktop 1 will always take you to
|
||||
# desktop 1 which belongs to monitor A.
|
||||
#
|
||||
# This script's commands are meant to be implemented in SXHKD (or
|
||||
# equivalent). Furthermore, the desktops need to be set to one per
|
||||
# monitor in bspwmrc (empty desktops are removed upon invoking one of
|
||||
# this script's commands).
|
||||
#
|
||||
# `bspwm_dynamic_desktops' is part of my dotfiles (which also offer a
|
||||
# complete implementation): https://gitlab.com/protesilaos/dotfiles
|
||||
|
||||
|
||||
|
||||
# See the --options below for the available arguments for $1. $2 must
|
||||
# be a number from 0 to 9.
|
||||
[ "$#" -eq 2 ] || { echo 'Must be run with two arguments.'; exit 1; }
|
||||
|
||||
# Capture the arguments. We need to run tests against them. Renaming
|
||||
# them makes things easier to read.
|
||||
option="${*:1:1}"
|
||||
target_desktop="${*:2:1}"
|
||||
|
||||
case "$target_desktop" in
|
||||
[!0-9])
|
||||
echo "The second argument must be a valid number"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# The `dynamic_but_dedicated' switch concerns multi-head setups
|
||||
# (typically dual-monitor). It allows us to specify a range of numbered
|
||||
# desktops that we would want to always place on dedicated monitors.
|
||||
# This means that while we retain the functionality of dynamically
|
||||
# creating/removing desktops, we also bind certain desktops to monitors.
|
||||
#
|
||||
# NOTE: it only applies to the `--ns*' options (see the last part of the
|
||||
# script). As such, you can still send a node to any
|
||||
# dynamically-created numbered desktop on the next monitor, by using the
|
||||
# `--nm*' options.
|
||||
if [ "$(bspc query -M | wc -l)" -gt 1 ]; then
|
||||
# Switch to `false' to restore the monitor-independent behaviour.
|
||||
dynamic_but_dedicated='true'
|
||||
fi
|
||||
|
||||
# Here we specify the range of desktops that should always appear on the
|
||||
# monitor named `LVDS-1'. Everything else appears on `VGA-1'. You can
|
||||
# find the names of your monitors with `bspc query -M --names`.
|
||||
#
|
||||
# NOTE: if you use more that two monitors, you need to create another
|
||||
# range similar to the one for LVDS-1 and adapt things accordingly.
|
||||
if [ "$dynamic_but_dedicated" = 'true' ]; then
|
||||
dedicated_desktops='false'
|
||||
case "$target_desktop" in
|
||||
[1-5]) dedicated_monitor="LVDS-1" ;;
|
||||
*) dedicated_monitor="VGA-1" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Command for querying BSPWM desktops. Used further below.
|
||||
_query_desktops() {
|
||||
bspc query -D -d "$@"
|
||||
}
|
||||
|
||||
# The core functionality of this script. Behaviour changes based on
|
||||
# whether this is a desktop or a node (each action is mapped to
|
||||
# different key chords in sxhkd).
|
||||
#
|
||||
# If the target desktop does not exist, it is created on the spot.
|
||||
_desk_or_node() {
|
||||
_dynamic_desktops() {
|
||||
# Here we make sure to clean up the arguments passed to this
|
||||
# function. We can operate on them with greater flexibility.
|
||||
local monitor action
|
||||
monitor="${*:1:1}"
|
||||
action="${*:2}"
|
||||
|
||||
# Leave the unquoted in tact! Else the commands will not run.
|
||||
if ! _query_desktops "$target_desktop" > /dev/null; then
|
||||
bspc monitor "$monitor" -a "$target_desktop" && $action
|
||||
else
|
||||
# BACK-AND-FORTH behaviour: inputting the number of the
|
||||
# focused desktop switches to the last one.
|
||||
#
|
||||
# If you do not like this, just replace the whole if/fi part
|
||||
# below with $action (and do not quote it).
|
||||
if [ "$(_query_desktops --names)" -eq "$target_desktop" ]; then
|
||||
bspc desktop -f last
|
||||
else
|
||||
$action
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Reorder desktops on the target monitor (the target is the first
|
||||
# argument passed to this function). The default is the focused
|
||||
# one.
|
||||
_desk_order() {
|
||||
while read -r line; do
|
||||
printf "%s\\n" "$line"
|
||||
done < <(bspc query -D -m "${1:-focused}" --names) | sort -g | paste -d ' ' -s
|
||||
}
|
||||
|
||||
# Determines whether the behaviour of this function concerns nodes
|
||||
# or desktops. The "monitor" is just a filter for nodes/desktops
|
||||
# (hence the `shift'). It concerns multihead setups.
|
||||
case "$1" in
|
||||
node|desktop)
|
||||
_dynamic_desktops 'focused.focused' bspc "$@"
|
||||
# Do not quote the following `$(…)` we want term splitting
|
||||
# here. The next comment silences the `shellcheck' utility.
|
||||
#
|
||||
# shellcheck disable=SC2046
|
||||
bspc monitor -o $(eval _desk_order)
|
||||
;;
|
||||
monitor)
|
||||
shift
|
||||
if [ -n "$dedicated_desktops" ]; then
|
||||
_dynamic_desktops "$dedicated_monitor" bspc "$@"
|
||||
# Do not quote the following `$(…)` we want term splitting
|
||||
# here. The next comment silences the `shellcheck' utility.
|
||||
#
|
||||
# shellcheck disable=SC2046
|
||||
bspc monitor "$dedicated_monitor" -o $(eval _desk_order "$dedicated_monitor")
|
||||
else
|
||||
_dynamic_desktops next bspc "$@"
|
||||
# Do not quote the following `$(…)` we want term splitting
|
||||
# here. The next comment silences the `shellcheck' utility.
|
||||
#
|
||||
# shellcheck disable=SC2046
|
||||
bspc monitor next -o $(eval _desk_order next)
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Invoke the above command, passing to it arguments that change its
|
||||
# behaviour (desktop or node).
|
||||
#
|
||||
# Mnemonics for shorter options:
|
||||
# n* == node
|
||||
# d* == desktop
|
||||
case "$option" in
|
||||
--na|--send-all-to-desktop)
|
||||
_desk_or_node node 'any.local' -d "${target_desktop}"
|
||||
;;
|
||||
--ns|--send-focused-to-desktop)
|
||||
if [ -n "$dedicated_desktops" ]; then
|
||||
_desk_or_node monitor node focused -d "${target_desktop}"
|
||||
else
|
||||
_desk_or_node node focused -d "${target_desktop}"
|
||||
fi
|
||||
;;
|
||||
--nsf|--send-focused-to-desktop-and-follow)
|
||||
if [ -n "$dedicated_desktops" ]; then
|
||||
_desk_or_node monitor node focused -d "${target_desktop}" --follow
|
||||
else
|
||||
_desk_or_node node focused -d "${target_desktop}" --follow
|
||||
fi
|
||||
;;
|
||||
--nm|--send-focused-to-next-monitor)
|
||||
_desk_or_node monitor node focused -d "${target_desktop}"
|
||||
;;
|
||||
--nmf|--send-focused-to-next-monitor-and-follow)
|
||||
_desk_or_node monitor node focused -d "${target_desktop}" --follow
|
||||
;;
|
||||
--da|--activate-desktop-and-place-receptacle)
|
||||
_desk_or_node monitor node @"$target_desktop":/ -i && bspc desktop -a "${target_desktop}"
|
||||
;;
|
||||
--df|--focus-desktop)
|
||||
if [ -n "$dedicated_desktops" ]; then
|
||||
_desk_or_node monitor desktop -f "${target_desktop}"
|
||||
else
|
||||
_desk_or_node desktop -f "${target_desktop}"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "< $option > is not a valid option."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# Remove empty desktops. This works for multiple monitors, as well.
|
||||
# This will NOT REMOVE empty desktops that contain only receptacles
|
||||
# (applies to the --activate-desktop option above).
|
||||
for i in $(_query_desktops '.!focused.!occupied' --names); do
|
||||
bspc desktop "$i" -r
|
||||
done
|
||||
98
bin/bin/bspwm_external_rules
Executable file
98
bin/bin/bspwm_external_rules
Executable file
|
|
@ -0,0 +1,98 @@
|
|||
#!/bin/bash
|
||||
|
||||
# External rules for BSPWM. This script is part of my dotfiles:
|
||||
# https://gitlab.com/protesilaos/dotfiles.
|
||||
#
|
||||
# Copyright (c) 2019-2021 Protesilaos Stavrou <info@protesilaos.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
# NOTE 2021-08-27: Needs review, but I am bringing it back anyway
|
||||
# because it should still work fine based on what I remember.
|
||||
|
||||
|
||||
# Manual tiling
|
||||
# =============
|
||||
|
||||
# Spawn window on the newest receptacle or preselection and switch focus
|
||||
# to it. For multiple presels, priority is given to the current
|
||||
# desktop.
|
||||
_bspc_query() {
|
||||
bspc query -N -n "$@"
|
||||
}
|
||||
|
||||
recept="$(_bspc_query 'any.leaf.!window')"
|
||||
presel="$(_bspc_query 'newest.!automatic')"
|
||||
|
||||
# Receptacles will not switch focus to the present desktop, whereas
|
||||
# preselection will. This way we can develop different workflows (e.g.
|
||||
# create 3 recept in one desktop, launch 3 GUIs that take time to load,
|
||||
# switch to another desktop and continue working, until you decide to go
|
||||
# back to the GUIs). This has no effect when all actions occur within
|
||||
# the focused desktop.
|
||||
#
|
||||
# Also see my SXHKD bindings for advanced manual tiling actions (refer
|
||||
# to my dotfiles).
|
||||
if [ -n "$recept" ]; then
|
||||
target="$recept"
|
||||
attention="off"
|
||||
elif [ -n "$presel" ]; then
|
||||
target="$presel"
|
||||
fi
|
||||
|
||||
echo "node=${target:-focused}"
|
||||
echo "follow=${attention:-on}"
|
||||
|
||||
# Window rules
|
||||
# ============
|
||||
|
||||
# Operate on windows based on their properties. The positional
|
||||
# arguments are defined in the `external_rules_command` of `man bspc`.
|
||||
window_id="$1"
|
||||
window_class="$2"
|
||||
window_instance="$3"
|
||||
window_title="$(xwininfo -id "$window_id" | sed ' /^xwininfo/!d ; s,.*"\(.*\)".*,\1,')"
|
||||
|
||||
case "$window_class" in
|
||||
[Mm]pv|[Vv]lc|[Pp]avucontrol|[Ee]o[mg]|[Ff]eh|[Rr]istretto|[Ss]xiv|my_float_window)
|
||||
echo "state=floating"
|
||||
echo "center=on"
|
||||
;;
|
||||
[Mm]ate-calc)
|
||||
echo "state=pseudo_tiled"
|
||||
;;
|
||||
* )
|
||||
case "$(xprop -id "$window_id" _NET_WM_WINDOW_TYPE)" in
|
||||
*_NET_WM_WINDOW_TYPE_DIALOG*)
|
||||
echo "state=floating"
|
||||
;;
|
||||
*)
|
||||
echo "state=tiled"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
# FIXME the "file operations" applies to the `caja` file manager.
|
||||
# TODO There should be a better way of handling this.
|
||||
case "$window_title" in
|
||||
'File Operations'*)
|
||||
echo "state=floating"
|
||||
echo "center=on"
|
||||
;;
|
||||
my_float_window)
|
||||
echo "state=floating"
|
||||
;;
|
||||
esac
|
||||
84
bin/bin/bspwm_focus_mode
Executable file
84
bin/bin/bspwm_focus_mode
Executable file
|
|
@ -0,0 +1,84 @@
|
|||
#!/bin/bash
|
||||
|
||||
# bspwm focus mode --- removes gaps, padding, panel from the viewport.
|
||||
#
|
||||
# This script is meant to be used in my custom desktop session:
|
||||
# https://gitlab.com/protesilaos/dotfiles.
|
||||
#
|
||||
# Copyright (c) 2019-2021 Protesilaos Stavrou <info@protesilaos.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or (at
|
||||
# your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# This assumes that we are already running the lemonbar script.
|
||||
[ -z "$(pgrep -x melonpanel > /dev/null)" ] || { echo "No running melonpanel"; exit 1; }
|
||||
|
||||
panel_height="$(awk -F '=' '/melonpanel_height/ { print $2; exit; }' "$(command -v melonpanel 2> /dev/null)")"
|
||||
|
||||
# The bottom padding is extracted from the running program.
|
||||
bottom_padding="$(bspc config bottom_padding)"
|
||||
|
||||
# Read the default setting from the bspwm config file.
|
||||
_get_value() {
|
||||
local bspwmrc
|
||||
bspwmrc="$HOME/.config/bspwm/bspwmrc"
|
||||
|
||||
sed "/$1/!d ; s,.* $1 \([a-z0-9]*\).*,\1," "$bspwmrc"
|
||||
}
|
||||
|
||||
## Use the function that gets the desired value from bspwmrc.
|
||||
window_gap="$(_get_value window_gap)"
|
||||
gapless_monocle="$(_get_value gapless_monocle)"
|
||||
border_width="$(_get_value border_width)"
|
||||
|
||||
# Calculate the actual gap from the bottom of the viewport to the lower
|
||||
# part of the nodes.
|
||||
effective_padding=$(("$bottom_padding" + "$window_gap"))
|
||||
|
||||
# If we are not in "focus mode"...
|
||||
if [ "$effective_padding" -ge "$panel_height" ] ; then
|
||||
bottom_padding=0
|
||||
window_gap=0
|
||||
gapless_monocle=true
|
||||
border_width=1
|
||||
|
||||
# No need to keep the panel
|
||||
pkill -xo melonpanel && pkill -x lemonbar
|
||||
else
|
||||
# Unset everything
|
||||
unset bottom_padding
|
||||
unset window_gap
|
||||
unset gapless_monocle
|
||||
unset border_width
|
||||
panel_status=on
|
||||
fi
|
||||
|
||||
# Create overlapping borders in focus mode.
|
||||
if [ -n "$border_width" ]; then
|
||||
bspc config window_gap -"$border_width"
|
||||
bspc config border_width "$border_width"
|
||||
for side in top right bottom left; do
|
||||
bspc config "${side}"_padding "$border_width"
|
||||
done
|
||||
else
|
||||
bspc config window_gap "${window_gap:=2}"
|
||||
bspc config border_width "${border_width:=2}"
|
||||
bspc config bottom_padding "${bottom_padding:=$panel_height}"
|
||||
for side in right left top; do
|
||||
bspc config "${side}"_padding "0"
|
||||
done
|
||||
fi
|
||||
|
||||
bspc config gapless_monocle "${gapless_monocle:=false}"
|
||||
|
||||
[ -n "$panel_status" ] && melonpanel
|
||||
60
bin/bin/bspwm_multifaceted_operation
Executable file
60
bin/bin/bspwm_multifaceted_operation
Executable file
|
|
@ -0,0 +1,60 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Facilitates BSPWM operations over multiple selection paths. The
|
||||
# actions defined herein are assigned to key chords (sxhkd). Everything
|
||||
# is part of my dotfiles: https://gitlab.com/protesilaos/dotfiles.
|
||||
#
|
||||
# Copyright (c) 2019-2021 Protesilaos Stavrou <info@protesilaos.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
_query_nodes() {
|
||||
for i in $(bspc query -N -n "$1"); do
|
||||
bspc node "$i" "${@:2}"
|
||||
done
|
||||
}
|
||||
|
||||
# Mnemonics for shorter options:
|
||||
# r* == receptacles
|
||||
# n* == nodes
|
||||
# d* == desktops
|
||||
case "$1" in
|
||||
--rk|--kill-all-receptacles)
|
||||
_query_nodes '.leaf.!window' -k
|
||||
;;
|
||||
--nca|--close-all-local-non-focused)
|
||||
_query_nodes '.!focused.!marked.local.window' -c
|
||||
;;
|
||||
--nka|--kill-all-local-non-focused)
|
||||
_query_nodes '.!focused.!marked.local.window' -k
|
||||
;;
|
||||
--nla|--lock-all-local)
|
||||
_query_nodes '.local.window' -g locked=on
|
||||
;;
|
||||
--nula|--unlock-all-local)
|
||||
_query_nodes '.local.window' -g locked=off
|
||||
;;
|
||||
--nms|--summon-all-marked)
|
||||
_query_nodes '.marked' -d focused --follow
|
||||
;;
|
||||
--db|--bring-desktop-here)
|
||||
for i in $(bspc query -N -d "$2" -n '.window'); do
|
||||
bspc node "$i" -d 'focused.focused'
|
||||
done
|
||||
;;
|
||||
--ds|--send-desktop-there)
|
||||
# NOTE another script of mine (see dotfiles).
|
||||
bspwm_dynamic_desktops --send-all-to-desktop "$2"
|
||||
;;
|
||||
esac
|
||||
33
bin/bin/bspwm_reorder_desktops
Executable file
33
bin/bin/bspwm_reorder_desktops
Executable file
|
|
@ -0,0 +1,33 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Reorder BSPWM desktops. This is an excerpt of another script I have
|
||||
# that implements dynamic desktop creation/deletion. It is kept here in
|
||||
# case the reordering functionality is needed on its own. Everything is
|
||||
# part of my dotfiles: https://gitlab.com/protesilaos/dotfiles.
|
||||
#
|
||||
# Copyright (c) 2019-2021 Protesilaos Stavrou <info@protesilaos.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
_desk_order() {
|
||||
while read -r line; do
|
||||
printf "%s\\n" "$line"
|
||||
done < <(bspc query -D -m "${1:-focused}" --names) | sort -g | paste -d ' ' -s
|
||||
}
|
||||
|
||||
# shellcheck disable=SC2046
|
||||
bspc monitor -o $(eval _desk_order) # do not quote! we want term splitting here
|
||||
|
||||
# Accepts an argument for targeting a monitor:
|
||||
#bspc monitor -o $(eval _desk_order next)
|
||||
26
bin/bin/bspwm_resize
Executable file
26
bin/bin/bspwm_resize
Executable file
|
|
@ -0,0 +1,26 @@
|
|||
#!/bin/bash
|
||||
# Extracted and adapted from source:
|
||||
# https://github.com/Chrysostomus/bspwm-scripts/blob/master/bin/bspwm_resize.sh
|
||||
|
||||
# Resizes (expands or contracts) the selected node in the given
|
||||
# direction. This is assigned to a key binding in $HOME/.config/sxhkd/sxhkdrc
|
||||
|
||||
# NOTE by Protesilaos 2020-05-01: The support for floating windows was
|
||||
# contributed by Pierre-François Bonnefoi who also recommends the
|
||||
# following sxhkdrc config:
|
||||
#
|
||||
# super + ctrl + {Left,Down,Up,Right}
|
||||
# bspwm_resize {west,south,north,east} 50
|
||||
|
||||
size=${2:-'10'}
|
||||
direction=$1
|
||||
|
||||
bspc query -N -n focused.floating
|
||||
floating=$?
|
||||
|
||||
case "$direction" in
|
||||
west) [ $floating = 0 ] && bspc node -z right -"$size" 0 || bspc node @west -r -"$size" || bspc node @east -r -"$size" ;;
|
||||
east) [ $floating = 0 ] && bspc node -z right +"$size" 0 || bspc node @west -r +"$size" || bspc node @east -r +"$size" ;;
|
||||
north) [ $floating = 0 ] && bspc node -z bottom 0 -"$size" || bspc node @south -r -"$size" || bspc node @north -r -"$size" ;;
|
||||
south) [ $floating = 0 ] && bspc node -z bottom 0 +"$size" || bspc node @south -r +"$size" || bspc node @north -r +"$size" ;;
|
||||
esac
|
||||
60
bin/bin/bspwm_smart_move
Executable file
60
bin/bin/bspwm_smart_move
Executable file
|
|
@ -0,0 +1,60 @@
|
|||
#!/bin/bash
|
||||
|
||||
# A more fluid way of moving windows with BSPWM, which is meant to be
|
||||
# implemented in SXHKD. If there is a window in the given direction,
|
||||
# swap places with it. Else if there is a receptacle move to it
|
||||
# ("consume" its place). Otherwise create a receptacle in the given
|
||||
# direction by splitting the entire viewport (circumvents the tiling
|
||||
# scheme while respecting the current split ratio configuration). In
|
||||
# the latter scenario, inputting the direction twice will thus move the
|
||||
# focused window out of its current layout and into the receptacle.
|
||||
#
|
||||
# Part of my dotfiles: https://gitlab.com/protesilaos/dotfiles
|
||||
#
|
||||
# Copyright (c) 2019-2021 Protesilaos Stavrou <info@protesilaos.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
[ "$#" -eq 1 ] || { echo "Pass only one argument: north,east,south,west"; exit 1; }
|
||||
|
||||
# Check if argument is a valid direction.
|
||||
case "$1" in
|
||||
north|east|south|west)
|
||||
dir="$1"
|
||||
;;
|
||||
*)
|
||||
echo "Not a valid argument."
|
||||
echo "Use one of: north,east,south,west"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
_query_nodes() {
|
||||
bspc query -N -n "$@"
|
||||
}
|
||||
|
||||
# Do not operate on floating windows!
|
||||
[ -z "$(_query_nodes focused.floating)" ] || { echo "Only move tiled windows."; exit 1; }
|
||||
|
||||
receptacle="$(_query_nodes 'any.leaf.!window')"
|
||||
|
||||
# This regulates the behaviour documented in the description.
|
||||
if [ -n "$(_query_nodes "${dir}.!floating")" ]; then
|
||||
bspc node -s "$dir"
|
||||
elif [ -n "$receptacle" ]; then
|
||||
bspc node focused -n "$receptacle" --follow
|
||||
else
|
||||
bspc node @/ -p "$dir" -i && bspc node -n "$receptacle" --follow
|
||||
fi
|
||||
42
bin/bin/bspwm_smart_presel
Executable file
42
bin/bin/bspwm_smart_presel
Executable file
|
|
@ -0,0 +1,42 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Lets BSPWM send the marked {or just the focused} node to a receptacle
|
||||
# {or a preselection}. This script is part of my dotfiles:
|
||||
# https://gitlab.com/protesilaos/dotfiles.
|
||||
#
|
||||
# Copyright (c) 2019-2021 Protesilaos Stavrou <info@protesilaos.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or (at
|
||||
# your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
_bspc_query() {
|
||||
bspc query -N -n "$@"
|
||||
}
|
||||
|
||||
_marked_else_focused() {
|
||||
if [ -n "$(_bspc_query 'any.marked')" ]; then
|
||||
echo 'any.marked'
|
||||
else
|
||||
echo 'focused'
|
||||
fi
|
||||
}
|
||||
|
||||
receptacle="$(_bspc_query 'any.leaf.!window')"
|
||||
|
||||
# Use a receptacle if available, else use a preselection. None is
|
||||
# limited to the focused desktop.
|
||||
if [ -n "$receptacle" ]; then
|
||||
bspc node "$(_marked_else_focused)" -n "$receptacle" --follow
|
||||
else
|
||||
bspc node "$(_marked_else_focused)" -n 'newest.!automatic' --follow
|
||||
fi
|
||||
415
bin/bin/melonpanel
Executable file
415
bin/bin/melonpanel
Executable file
|
|
@ -0,0 +1,415 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Melonpanel --- Script to draw a panel with `lemonbar'.
|
||||
#
|
||||
# Copyright (c) 2019-2021 Protesilaos Stavrou <info@protesilaos.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
## Commentary:
|
||||
#
|
||||
# This script, called "Melonpanel" is my `lemonbar' implementation, for
|
||||
# use in my custom BSPWM desktop session. I just selected the name
|
||||
# "melon" as an anagram for "lemon" and then switched "bar" with
|
||||
# "panel". This is to avoid naming conflicts where we could
|
||||
# accidentally kill the wrong process or whatnot.
|
||||
#
|
||||
# I am using `lemonbar' instead of more popular options, such as
|
||||
# `polybar' in part because I like experimenting with shell scripting.
|
||||
#
|
||||
# Dependencies for melonpanel:
|
||||
# bspwm lemonbar-xft xdo
|
||||
#
|
||||
# Dependencies for individual modules:
|
||||
# acpi alsa-utils
|
||||
|
||||
|
||||
|
||||
# FIXME 2021-08-27: I am bringing this back from git history with some
|
||||
# minor edits, but it needs a major redesign. We must pipe each module
|
||||
# to its own named pipe and then figure out how to read each of them
|
||||
# independent of the rest.
|
||||
|
||||
|
||||
#### General settings
|
||||
|
||||
# Check for dependencies. Fail if unmet.
|
||||
_checkdep() {
|
||||
command -v "$1" > /dev/null || { echo "Missing dependency: $1"; exit 1; }
|
||||
}
|
||||
|
||||
_checkdep bspwm
|
||||
_checkdep lemonbar
|
||||
_checkdep xdo
|
||||
|
||||
# Kill any running lemonbar
|
||||
pgrep -x lemonbar > /dev/null && pkill -x lemonbar
|
||||
|
||||
# DO NOT EDIT the name of this parameter (checked by other scripts).
|
||||
melonpanel_height=22
|
||||
|
||||
#### Colours
|
||||
|
||||
# Here we are re-using the bspwm active theme, because I only ever use
|
||||
# lemonbar with it. Otherwise there would have to be a
|
||||
# lemonbar-specific file. Refer to my `delight' script as well.
|
||||
#
|
||||
# Values are taken from my Modus themes for Emacs:
|
||||
# <https://protesilaos.com/modus-themes>.
|
||||
case "$(cat "$HOME"/.config/bspwm/active-theme)"
|
||||
in
|
||||
dark*)
|
||||
bg_main="#000000"
|
||||
bg_alt="#191a1b"
|
||||
fg_main="#ffffff"
|
||||
fg_alt="#a8a8a8"
|
||||
red="#ff8059"
|
||||
green="#44bc44"
|
||||
yellow="#d0bc00"
|
||||
;;
|
||||
*)
|
||||
bg_main="#ffffff"
|
||||
bg_alt="#f0f0f0"
|
||||
fg_main="#000000"
|
||||
fg_alt="#505050"
|
||||
red="#a60000"
|
||||
green="#005e00"
|
||||
yellow="#813e00"
|
||||
;;
|
||||
esac
|
||||
|
||||
#### Fonts (upstream lemonbar only supports bitmap fonts)
|
||||
|
||||
# My fork: <https://gitlab.com/protesilaos/lemonbar-xft>. Also on the
|
||||
# AUR.
|
||||
fontmain='Monospace:style=regular:size=9'
|
||||
fontbold='Monospace:style=bold:size=9'
|
||||
|
||||
# fontmain='-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso10646-1'
|
||||
# fontbold='-misc-fixed-bold-r-normal--13-120-75-75-c-80-iso10646-1'
|
||||
|
||||
|
||||
#### Panel modules
|
||||
|
||||
# NOTE all functions that are meant to pipe their output to the panel
|
||||
# will echo a majuscule (letter A-Z). This is done to easily retrieve
|
||||
# their output from the named pipe. The letter has to be unique and,
|
||||
# ideally, use common words that denote the function of the content of
|
||||
# the command such as e.g. D for Date, N for Network... Where this
|
||||
# would lead to conflicts, find a synonym or something close enough.
|
||||
#
|
||||
# The various sequences %{..} are part of lemonbar's syntax for styling
|
||||
# the output. See `man lemonbar`.
|
||||
|
||||
# Battery status.
|
||||
_battery() {
|
||||
command -v acpi > /dev/null || return 1
|
||||
|
||||
local label command status output
|
||||
|
||||
label='B:'
|
||||
# Using Bash parameter expansion here. Just experimenting...
|
||||
command="$(acpi -b)"
|
||||
status="${command#*: }" # Delete up to the colon and the following space
|
||||
status="${status:0:1}" # Use first character
|
||||
output="${command#*, }" # Delete up to first comma
|
||||
output="${output%,*}" # Same but read from the end
|
||||
|
||||
# The $battery_status will tell us if it is (C)harging or
|
||||
# (D)ischaging. If dischange level reaches 0-9, the whole indicator
|
||||
# will turn into to a bright colour. Otherwise, discharging will be
|
||||
# denoted by a coloured output of the current level followed by the
|
||||
# minus sign.
|
||||
case "$status" in
|
||||
'C')
|
||||
echo "%{F$fg_alt}${label}%{F-} %{F$green}${output}+%{F-}"
|
||||
;;
|
||||
'D')
|
||||
case "${output%?}" in
|
||||
[0-9])
|
||||
echo "%{B$yellow}%{F$bg_main} $label ${output}- %{F-}%{B-}"
|
||||
;;
|
||||
*)
|
||||
echo "%{F$fg_alt}${label}%{F-} %{F$yellow}${output}-%{F-}"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
echo "%{F$fg_alt}${label}%{F-} ${output}"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
_temperature() {
|
||||
command -v acpi > /dev/null || return 1
|
||||
|
||||
local label command output
|
||||
|
||||
label='T:'
|
||||
# Use Bash parameter expansion again...
|
||||
command="$(acpi -t)"
|
||||
output="${command#*: }"
|
||||
output="${output#*, }"
|
||||
output="${output:0:2}"
|
||||
|
||||
# Up to 59 degrees celsius keep text colour same as default. 60-79
|
||||
# turn the colour red on normal background. Else turn the whole
|
||||
# indicator red.
|
||||
case "$output" in
|
||||
[12345][0-9])
|
||||
echo "%{F$fg_alt}${label}%{F-} ${output}°C"
|
||||
;;
|
||||
[67][0-9])
|
||||
echo "%{F$fg_alt}${label}%{F-} %{F$red}${output}°C%{F-}"
|
||||
;;
|
||||
*)
|
||||
echo "%{F$bg_main}%{B$red} $label ${output}°C %{B-}%{F-}"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
_volume() {
|
||||
command -v amixer > /dev/null || return 1
|
||||
|
||||
local label status output
|
||||
|
||||
label='V:'
|
||||
# Could not do this with just parameter expansions...
|
||||
status="$(amixer get Master | awk -F'[][]' '/%/{print $2","$4;exit}')"
|
||||
output="${status%,*}"
|
||||
|
||||
case "${status#*%}" in
|
||||
'off') echo "%{F$fg_alt}${label}%{F-} $output (Muted)" ;;
|
||||
*) echo "%{F$fg_alt}${label}%{F-} $output" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
_notmuch() {
|
||||
command -v notmuch > /dev/null || return 1
|
||||
|
||||
local label count
|
||||
|
||||
label='E:'
|
||||
# Could not do this with just parameter expansions…
|
||||
count="$(notmuch count tag:unread and tag:inbox)"
|
||||
|
||||
echo "%{F$fg_alt}${label}%{F-} $count"
|
||||
}
|
||||
|
||||
# Keyboard indicators.
|
||||
_keyboard() {
|
||||
local kd_layout kb_caps
|
||||
|
||||
# Checks if the current layout is set to Greek (adjust accordingly).
|
||||
# If yes, the indicator will be displayed, else it is assumed that
|
||||
# English is being used.
|
||||
if [ "$(setxkbmap -query | sed '/^l/!d ; s,.*:[\ ]*,,g')" = 'gr' ]
|
||||
then
|
||||
kb_layout="%{B$bg_alt}%{U$fg_main}%{+u} EL %{-u}%{U-}%{B-}"
|
||||
fi
|
||||
|
||||
# Show an indicator if Caps Lock is on.
|
||||
if [ "$(xset -q | awk '/Caps/ { print $4 }')" = 'on' ]
|
||||
then
|
||||
kb_caps="%{B$bg_alt}%{U$fg_main}%{+u} CAPS %{-u}%{U-}%{B-}"
|
||||
fi
|
||||
|
||||
# Print the indicators next each other in the given order.
|
||||
printf "%s %s" "$kb_layout" "$kb_caps"
|
||||
}
|
||||
|
||||
_datetime() {
|
||||
local label output
|
||||
|
||||
label='D:'
|
||||
output="$(date +'%a %-d %b, %R')"
|
||||
|
||||
echo "%{F$fg_alt}${label}%{F-} $output"
|
||||
}
|
||||
|
||||
# Include all modules in a single infinite loop that iterates every
|
||||
# second (adjust interval accordingly, as it can be taxing on system
|
||||
# resources).
|
||||
_modules() {
|
||||
while true
|
||||
do
|
||||
# echo "B" "$(_battery)"
|
||||
# echo "T" "$(_temperature)"
|
||||
echo "D" "$(_datetime)"
|
||||
echo "E" "$(_notmuch)"
|
||||
echo "K" "$(_keyboard)"
|
||||
echo "V" "$(_volume)"
|
||||
sleep 1s
|
||||
done
|
||||
}
|
||||
|
||||
#### Piping and reading the output of the modules
|
||||
|
||||
# The design of this section has been heavily inspired/adapted from the
|
||||
# examples provided by upstream bspwm.
|
||||
|
||||
# set path to named pipe used to store process data for these operations
|
||||
melonpanel_fifo='/tmp/melonpanel.fifo'
|
||||
|
||||
# make sure you delete any existing named pipe
|
||||
[ -p "$melonpanel_fifo" ] && rm "$melonpanel_fifo"
|
||||
|
||||
# create a new named pipe
|
||||
mkfifo "$melonpanel_fifo"
|
||||
|
||||
# pipe the output of the modules to the fifo
|
||||
_modules > "$melonpanel_fifo" &
|
||||
bspc subscribe report > "$melonpanel_fifo" &
|
||||
|
||||
# Read the content of the fifo file. We differentiate between modules
|
||||
# based on the majuscule (letter A-Z) they piped into melonpanel_fifo
|
||||
# (see modules above). Here we just add a shorter variable to each
|
||||
# module, which helps position it on the panel (the last printf).
|
||||
_melonpanel() {
|
||||
while read -r line
|
||||
do
|
||||
case $line
|
||||
in
|
||||
# B*)
|
||||
# # battery status
|
||||
# bat="${line#?}"
|
||||
# ;;
|
||||
# T*)
|
||||
# # temperature
|
||||
# therm="${line#?}"
|
||||
# ;;
|
||||
D*)
|
||||
# current date and time
|
||||
date="${line#?}"
|
||||
;;
|
||||
E*)
|
||||
# notmuch unread count
|
||||
mail="${line#?}"
|
||||
;;
|
||||
K*)
|
||||
# keyboard layout (en or gr)
|
||||
key="${line#?}"
|
||||
;;
|
||||
V*)
|
||||
# volume level
|
||||
vol="${line#?}"
|
||||
;;
|
||||
W*)
|
||||
# bspwm's state
|
||||
wm=
|
||||
IFS=':'
|
||||
set -- ${line#?}
|
||||
while [ "$#" -gt 0 ]
|
||||
do
|
||||
item="$1"
|
||||
name="${item#?}"
|
||||
case "$item" in
|
||||
[mMfFoOuULG]*)
|
||||
case "$item" in
|
||||
m*)
|
||||
# monitor
|
||||
FG="$fg_alt" # needed to avoid invalid colour error
|
||||
on_focused_monitor=
|
||||
name=
|
||||
;;
|
||||
M*)
|
||||
# focused monitor
|
||||
FG="$fg_alt" # needed to avoid invalid colour error
|
||||
on_focused_monitor=1
|
||||
name=
|
||||
;;
|
||||
# {Free,Occupied,Urgent} focused
|
||||
[FOU]*)
|
||||
if [ -n "$on_focused_monitor" ]
|
||||
then
|
||||
name="%{T2}${name/*/[$name]}%{T-}"
|
||||
FG="$fg_main"
|
||||
else
|
||||
name="${name/*/ $name-}"
|
||||
FG="$fg_alt"
|
||||
fi
|
||||
;;
|
||||
# {free,occupied,urgent} unfocused
|
||||
f*)
|
||||
FG="$fg_alt"
|
||||
name="${name/*/ $name }"
|
||||
;;
|
||||
o*)
|
||||
FG="$fg_alt"
|
||||
name="${name/*/ $name^}"
|
||||
;;
|
||||
u*)
|
||||
FG="$red"
|
||||
name="${name/*/ $name\#}"
|
||||
;;
|
||||
# desktop layout for monocle and node flags
|
||||
LM|G*?)
|
||||
if [ "$(bspc query -N -d any.focused | wc -l)" -gt 1 ]
|
||||
then
|
||||
FG="$fg_main"
|
||||
name="${name/*/ $name }"
|
||||
else
|
||||
FG="$fg_alt"
|
||||
name="${name/*/ * }"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
FG="$fg_alt"
|
||||
name="${name/*/ * }"
|
||||
;;
|
||||
esac
|
||||
wm="${wm}%{F$FG}${name}%{F-}"
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
esac
|
||||
|
||||
_panel_layout() {
|
||||
# echo "%{l}$wm%{r}$key $bat $therm $vol $date "
|
||||
echo "%{l}$wm%{r}$key $mail $vol $date "
|
||||
}
|
||||
|
||||
if [ "$(bspc query -M | wc -l)" -gt 1 ]
|
||||
then
|
||||
printf "%s%s\n" "%{Sf}$(_panel_layout)" "%{Sl}$(_panel_layout)"
|
||||
else
|
||||
printf "%s\n" "%{Sf}$(_panel_layout)"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
#### Launch the panel with the given parameters
|
||||
|
||||
# NOTE the syntax for the background value. If you want transparency,
|
||||
# just replace "ff" with a lower value: "00" means no opacity. This is
|
||||
# hexadecimal notation: 0-9, a-f, A-F.
|
||||
_melonpanel < "$melonpanel_fifo" \
|
||||
| lemonbar -b -u 1 -p -g "x${melonpanel_height}" \
|
||||
-F "$fg_main" -B "#ff${bg_main:1}" \
|
||||
-f "$fontmain" -f "$fontbold" -n "Melonpanel" &
|
||||
|
||||
# Hide panel when windows are in full screen mode. This does not work
|
||||
# all the time, especially with lower `sleep` values, requiring a
|
||||
# re-launch of melonpanel (pkill -x melonpanel && melonpanel). I have
|
||||
# yet to find a robust solution.
|
||||
#
|
||||
# Source of this snippet (with minor adapatations by me):
|
||||
# https://github.com/baskerville/bspwm/issues/484
|
||||
until bar_id=$(xdo id -a 'Melonpanel')
|
||||
do
|
||||
sleep 0.1s
|
||||
done
|
||||
|
||||
xdo below -t $(xdo id -n root) $bar_id &
|
||||
99
bin/bin/panel_bspwm
Executable file
99
bin/bin/panel_bspwm
Executable file
|
|
@ -0,0 +1,99 @@
|
|||
#!/bin/bash
|
||||
|
||||
# XXX 2021-08-27: work-in-progress
|
||||
|
||||
command -v bspwm > /dev/null || { echo "Missing dependency: bspwm"; exit 1; }
|
||||
command -v panel_theme > /dev/null || { echo "Missing dependency: panel_theme"; exit 1; }
|
||||
|
||||
. panel_theme
|
||||
|
||||
fifo='/tmp/panel_bspwm.fifo'
|
||||
|
||||
_make_pipe()
|
||||
{
|
||||
if [ -p "$fifo" ]
|
||||
then
|
||||
return 0
|
||||
else
|
||||
mkfifo "$fifo" 2> /dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
_make_pipe
|
||||
|
||||
bspc subscribe report > "$fifo" &
|
||||
|
||||
while read -r line
|
||||
do
|
||||
# bspwm's state
|
||||
wm=
|
||||
IFS=':'
|
||||
set -- ${line#?}
|
||||
while [ "$#" -gt 0 ]
|
||||
do
|
||||
item="$1"
|
||||
name="${item#?}"
|
||||
case "$item" in
|
||||
[mMfFoOuULG]*)
|
||||
case "$item" in
|
||||
m*)
|
||||
# monitor
|
||||
FG="$fg_alt" # needed to avoid invalid colour error
|
||||
on_focused_monitor=
|
||||
name=
|
||||
;;
|
||||
M*)
|
||||
# focused monitor
|
||||
FG="$fg_alt" # needed to avoid invalid colour error
|
||||
on_focused_monitor=1
|
||||
name=
|
||||
;;
|
||||
# {Free,Occupied,Urgent} focused
|
||||
[FOU]*)
|
||||
if [ -n "$on_focused_monitor" ]
|
||||
then
|
||||
name="%{T2}${name/*/[$name]}%{T-}"
|
||||
FG="$fg_main"
|
||||
else
|
||||
name="${name/*/ $name-}"
|
||||
FG="$fg_alt"
|
||||
fi
|
||||
;;
|
||||
# {free,occupied,urgent} unfocused
|
||||
f*)
|
||||
FG="$fg_alt"
|
||||
name="${name/*/ $name }"
|
||||
;;
|
||||
o*)
|
||||
FG="$fg_alt"
|
||||
name="${name/*/ $name^}"
|
||||
;;
|
||||
u*)
|
||||
FG="$red"
|
||||
name="${name/*/ $name\#}"
|
||||
;;
|
||||
# desktop layout for monocle and node flags
|
||||
LM|G*?)
|
||||
if [ "$(bspc query -N -d any.focused | wc -l)" -gt 1 ]
|
||||
then
|
||||
FG="$fg_main"
|
||||
name="${name/*/ $name }"
|
||||
else
|
||||
FG="$fg_alt"
|
||||
name="${name/*/ * }"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
FG="$fg_alt"
|
||||
name="${name/*/ * }"
|
||||
;;
|
||||
esac
|
||||
wm="${wm}%{F$FG}${name}%{F-}"
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
echo "$wm"
|
||||
|
||||
done < "$fifo"
|
||||
52
bin/bin/panel_main
Executable file
52
bin/bin/panel_main
Executable file
|
|
@ -0,0 +1,52 @@
|
|||
#!/bin/bash
|
||||
|
||||
# XXX 2021-08-27: work-in-progress
|
||||
|
||||
command -v lemonbar > /dev/null || { echo "Missing dependency: lemonbar"; exit 1; }
|
||||
command -v panel_theme > /dev/null || { echo "Missing dependency: panel_theme"; exit 1; }
|
||||
|
||||
fifo='/tmp/panel_main.fifo'
|
||||
panel_height=22
|
||||
fontmain='Monospace:style=regular:size=9'
|
||||
fontbold='Monospace:style=bold:size=9'
|
||||
|
||||
. panel_theme
|
||||
|
||||
# TODO 2021-08-27: How to combine multiple modules, each of which prints
|
||||
# to its own named pipe? Wrapping `panel_bspwm' and `panel_volume -S'
|
||||
# into a single function and then feeding that to `lemonbar' only shows
|
||||
# one module at a time. So we need them to be on the same line somehow.
|
||||
|
||||
# TODO 2021-08-27: Check whether the above assumption is correct. Maybe
|
||||
# there is something we are missing in such a design.
|
||||
|
||||
|
||||
# _make_pipe()
|
||||
# {
|
||||
# if [ -p "$fifo" ]
|
||||
# then
|
||||
# return 0
|
||||
# else
|
||||
# mkfifo "$fifo" 2> /dev/null
|
||||
# fi
|
||||
# }
|
||||
|
||||
_bspwm()
|
||||
{
|
||||
panel_bspwm
|
||||
}
|
||||
|
||||
_volume()
|
||||
{
|
||||
panel_volume -S
|
||||
}
|
||||
|
||||
|
||||
# The bar style to-be-used:
|
||||
|
||||
# | lemonbar -b -u 1 -p -g "x${panel_height}" \
|
||||
# -F "$fg_main" -B "#ff${bg_main:1}" \
|
||||
# -f "$fontmain" -f "$fontbold" -n "Panel" &
|
||||
|
||||
|
||||
|
||||
25
bin/bin/panel_theme
Executable file
25
bin/bin/panel_theme
Executable file
|
|
@ -0,0 +1,25 @@
|
|||
#!/bin/bash
|
||||
|
||||
# XXX 2021-08-27: work-in-progress
|
||||
|
||||
case "$(cat "$HOME"/.config/bspwm/active-theme)"
|
||||
in
|
||||
dark*)
|
||||
bg_main="#000000"
|
||||
bg_alt="#191a1b"
|
||||
fg_main="#ffffff"
|
||||
fg_alt="#a8a8a8"
|
||||
red="#ff8059"
|
||||
green="#44bc44"
|
||||
yellow="#d0bc00"
|
||||
;;
|
||||
*)
|
||||
bg_main="#ffffff"
|
||||
bg_alt="#f0f0f0"
|
||||
fg_main="#000000"
|
||||
fg_alt="#505050"
|
||||
red="#a60000"
|
||||
green="#005e00"
|
||||
yellow="#813e00"
|
||||
;;
|
||||
esac
|
||||
58
bin/bin/panel_volume
Executable file
58
bin/bin/panel_volume
Executable file
|
|
@ -0,0 +1,58 @@
|
|||
#!/bin/bash
|
||||
|
||||
# XXX 2021-08-27: work-in-progress
|
||||
|
||||
command -v amixer > /dev/null || { echo "Missing dependency: amixer"; exit 1; }
|
||||
command -v panel_theme > /dev/null || { echo "Missing dependency: panel_theme"; exit 1; }
|
||||
|
||||
. panel_theme
|
||||
|
||||
fifo='/tmp/panel_vol.fifo'
|
||||
|
||||
_make_pipe()
|
||||
{
|
||||
if [ -p "$fifo" ]
|
||||
then
|
||||
return 0
|
||||
else
|
||||
mkfifo "$fifo" 2> /dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
_status()
|
||||
{
|
||||
label='V:'
|
||||
# Could not do this with just parameter expansions...
|
||||
status="$(amixer get Master | awk -F'[][]' '/%/{print $2","$4;exit}')"
|
||||
output="${status%,*}"
|
||||
|
||||
case "${status#*%}" in
|
||||
'off') echo "%{F$fg_alt}${label}%{F-} $output (Muted)" ;;
|
||||
*) echo "%{F$fg_alt}${label}%{F-} $output" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
_set()
|
||||
{
|
||||
amixer set Master "$1"
|
||||
}
|
||||
|
||||
_update()
|
||||
{
|
||||
_make_pipe
|
||||
_status > "$fifo"
|
||||
}
|
||||
|
||||
# Returns the state of volume.
|
||||
_subscribe()
|
||||
{
|
||||
_make_pipe
|
||||
tail -f "$fifo"
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
-s) _set "$2" ;;
|
||||
-S) _subscribe ;;
|
||||
-v) _status ;;
|
||||
*) _update ;;
|
||||
esac
|
||||
100
bin/bin/poweroptionsmenu
Executable file
100
bin/bin/poweroptionsmenu
Executable file
|
|
@ -0,0 +1,100 @@
|
|||
#!/bin/bash
|
||||
|
||||
# poweroptionsmenu --- rofi or dmenu interface for session actions.
|
||||
#
|
||||
# Copyright (c) 2019-2020 Protesilaos Stavrou <info@protesilaos.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# Dependency:
|
||||
# rofi OR dmenu
|
||||
|
||||
_pkill() {
|
||||
if pgrep -x "$1"; then
|
||||
pkill -x "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
_kill_processes() {
|
||||
_pkill bspwm_external_rules
|
||||
_pkill sxhkd
|
||||
_pkill melonpanel
|
||||
_pkill feh
|
||||
_pkill xcompmgr
|
||||
}
|
||||
|
||||
# In case something stops working, we can call this script
|
||||
# (Ctrl+Alt+Delete on my sxhkdrc) and apply the modifications again.
|
||||
_kbd_reset_and_xmodmap() {
|
||||
xmod="$HOME"/.Xmodmap
|
||||
|
||||
setxkbmap -layout 'us,el' -option 'ctrl:nocaps,compose:menu'
|
||||
[ -f "$xmod" ] && xmodmap "$xmod"
|
||||
}
|
||||
|
||||
# TODO is this the most robust way to check for systemd? Is it standard?
|
||||
_check_systemd() {
|
||||
if [ -n "/run/systemd/system" ]; then
|
||||
systemctl "$1"
|
||||
else
|
||||
sudo "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
# The idea with _reboot() and _poweroff() is to use the appropriate
|
||||
# command depending on whether the machine is running systemd or not.
|
||||
#
|
||||
# The `reboot' and `poweroff' require escalated privileges. Read:
|
||||
# https://wiki.voidlinux.org/Post_Installation#Allow_users_to_shutdown_without_a_password
|
||||
_reboot() {
|
||||
_check_systemd 'reboot'
|
||||
}
|
||||
|
||||
_poweroff() {
|
||||
_check_systemd 'poweroff'
|
||||
}
|
||||
|
||||
_checkdep() {
|
||||
command -v "$1" > /dev/null || return 1
|
||||
}
|
||||
|
||||
_dynamic_menu() {
|
||||
if _checkdep rofi; then
|
||||
# use printf to output array items on a new line
|
||||
rofi -dmenu -i -no-custom -p 'Power options'
|
||||
elif _checkdep dmenu; then
|
||||
dmenu -i -p 'Power options'
|
||||
else
|
||||
echo "Missing rofi or dmenu dependency." && exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Possible actions
|
||||
actions=('Log out' 'Reboot' 'Power off' 'Xmodmap and keyboard reload' 'Configure anew BSPWM monitors/desktops')
|
||||
|
||||
# List actions to choose from. Output array items on a new line.
|
||||
_list_actions() {
|
||||
printf '%s\n' "${actions[@]}" | _dynamic_menu
|
||||
}
|
||||
|
||||
choice="$(_list_actions)"
|
||||
|
||||
# Run the selected command.
|
||||
case "$choice" in
|
||||
L*) _kill_processes && bspc quit ;;
|
||||
R*) _kill_processes && _reboot ;;
|
||||
P*) _kill_processes && _poweroff ;;
|
||||
X*) _kbd_reset_and_xmodmap ;;
|
||||
C*) bspwm_conf_reset_monitors ;;
|
||||
esac
|
||||
35
bin/bin/toggle_kbd_layout
Executable file
35
bin/bin/toggle_kbd_layout
Executable file
|
|
@ -0,0 +1,35 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Very simple way to switch keyboard layouts between US QWERTY and
|
||||
# standard Greek. This script is assigned to a key chord in my
|
||||
# `sxkdrc`. A variant of this is also included in my system panel, the
|
||||
# `melonpanel` to get the current layout. Everything is part of my
|
||||
# dotfiles: https://gitlab.com/protesilaos/dotfiles.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
key_mods="$HOME"/.Xmodmap
|
||||
|
||||
[ "$(command -v setxkbmap 2> /dev/null)" ] && [ -f "$key_mods" ] || { echo "Missing dependency"; exit 1; }
|
||||
|
||||
_set_lang() {
|
||||
setxkbmap -layout "$1" -option 'ctrl:nocaps,compose:menu'
|
||||
xmodmap "$key_mods"
|
||||
}
|
||||
|
||||
if [ "$(setxkbmap -query | sed '/^l/!d ; s,.*:[\ ]*,,g')" == 'gr' ]; then
|
||||
_set_lang us
|
||||
else
|
||||
_set_lang gr
|
||||
fi
|
||||
|
|
@ -43,11 +43,11 @@ clear control
|
|||
add control = Caps_Lock Control_L Control_R
|
||||
keycode 66 = Control_L Caps_Lock NoSymbol NoSymbol
|
||||
|
||||
! Keep Super in left Win
|
||||
keycode 133 = Super_L
|
||||
|
||||
! Right Super as right Hyper
|
||||
keycode 134 = Super_R
|
||||
|
||||
! Set super
|
||||
add mod4 = Super_L Super_R
|
||||
! ! Keep Super in left Win
|
||||
! keycode 133 = Super_L
|
||||
!
|
||||
! ! Right Super as right Win
|
||||
! keycode 134 = Super_R
|
||||
!
|
||||
! ! Set super
|
||||
! add mod4 = Super_L Super_R
|
||||
1
bspwm/.config/bspwm/active-theme
Normal file
1
bspwm/.config/bspwm/active-theme
Normal file
|
|
@ -0,0 +1 @@
|
|||
light
|
||||
143
bspwm/.config/bspwm/bspwmrc
Normal file
143
bspwm/.config/bspwm/bspwmrc
Normal file
|
|
@ -0,0 +1,143 @@
|
|||
#!/bin/bash
|
||||
|
||||
# bspwmrc --- Initialisation script for BSPWM.
|
||||
#
|
||||
# Copyright (c) 2019 Protesilaos Stavrou <info@protesilaos.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
## Commentary:
|
||||
#
|
||||
# This file is part of my custom desktop session on Void Linux. Other
|
||||
# important settings are defined in `.xinitrc' and application-specific
|
||||
# initialisation files. See: https://gitlab.com/protesilaos/dotfiles
|
||||
|
||||
|
||||
##############
|
||||
# Essentials #
|
||||
##############
|
||||
|
||||
# Truncate a couple of common commands that are used herein.
|
||||
_bc() {
|
||||
bspc config "$@"
|
||||
}
|
||||
|
||||
_check() {
|
||||
command -v "$1" > /dev/null
|
||||
}
|
||||
|
||||
# Determine XrandR settings. Whether an external display is connected
|
||||
# to the laptop or not.
|
||||
_check bspwm_conf_xrandr && bspwm_conf_xrandr
|
||||
|
||||
# Define desktop[s] [per monitor]. Contingent on the above. Also note
|
||||
# that this leverages my `bspwm_dynamic_desktops'.
|
||||
_check bspwm_conf_desktops && bspwm_conf_desktops
|
||||
|
||||
##################
|
||||
# Visual options #
|
||||
##################
|
||||
|
||||
# window management
|
||||
# -----------------
|
||||
_bc initial_polarity second_child
|
||||
_bc border_width 2
|
||||
_bc window_gap 2
|
||||
_bc split_ratio 0.50
|
||||
_bc single_monocle true
|
||||
_bc borderless_monocle true
|
||||
_bc gapless_monocle false
|
||||
_bc focus_follows_pointer true
|
||||
_bc pointer_follows_monitor true
|
||||
_bc pointer_modifier mod1
|
||||
_bc pointer_action1 move
|
||||
_bc pointer_action2 resize_side
|
||||
_bc ignore_ewmh_focus false
|
||||
|
||||
# window rules
|
||||
_check bspwm_external_rules && \
|
||||
_bc external_rules_command \
|
||||
"$(command -v bspwm_external_rules)"
|
||||
|
||||
# colours
|
||||
# -------
|
||||
|
||||
_check bspwm_conf_colors && bspwm_conf_colors
|
||||
|
||||
#############
|
||||
# autostart #
|
||||
#############
|
||||
|
||||
# Specify keyboard layout. For the key chord that performs the layout
|
||||
# switching between US QWERTY and Greek refer to my `sxhkdrc`.
|
||||
#
|
||||
# Originally found the options in this location (Debian Buster):
|
||||
# /usr/share/X11/xkb/rules/base.lst
|
||||
#
|
||||
# caps:hyper Make Caps Lock an additional Hyper
|
||||
# compose:menu Menu key behaves as Compose
|
||||
#
|
||||
# The options are required in order for Xmodmap to work properly (see
|
||||
# below).
|
||||
if _check setxkbmap; then
|
||||
setxkbmap -layout 'us,el' -option 'ctrl:nocaps,compose:menu'
|
||||
fi
|
||||
|
||||
# Parse my custom key mappings. These make Caps behave as another Ctrl
|
||||
# key. We need to evaluate this first otherwise it might mess up with
|
||||
# SXHKD.
|
||||
[ -f "$HOME"/.Xmodmap ] && xmodmap "$HOME"/.Xmodmap
|
||||
|
||||
# The hotkey daemon that handles all custom key bindings. I split the
|
||||
# key chords into separate files, based on their scope. The ones that
|
||||
# pertain to the window manager are defined in sxhkdrc_bspc.
|
||||
_check sxhkd && sxhkd -c "$HOME"/.config/sxhkd/sxhkdrc{,_bspc} &
|
||||
|
||||
# Launch my custom Lemonbar implementation (the system panel).
|
||||
if _check melonpanel; then
|
||||
# Make sure we have no running instances
|
||||
pgrep -x melonpanel && pkill -x melonpanel
|
||||
melonpanel
|
||||
|
||||
# Add padding equal to the panel height to fix an issue where there
|
||||
# is an overlap between panel and windows in monitor LVDS1. The
|
||||
# panel gets covered by the windows. This only happens when an
|
||||
# external monitor is connected to my laptop, for reasons that I
|
||||
# cannot determine…
|
||||
if [ "$(bspc query -M | wc -l)" -gt 1 ]; then
|
||||
_panel_height() {
|
||||
awk -F '=' '/melonpanel_height/ { print $2; exit; }' \
|
||||
$(command -v melonpanel)
|
||||
}
|
||||
|
||||
bspc config bottom_padding "$(_panel_height)"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Run the tool that sets the wallpaper. A program could be used that
|
||||
# handles the desktop in general, including the option to set icons.
|
||||
# But this is enough for my case. Here is a command I tested and which
|
||||
# works (using the Xfce desktop manager):
|
||||
# xfdesktop --sm-client-disable --disable-wm-check &
|
||||
if _check feh; then
|
||||
if [ -n "$HOME"/.fehbg ]; then
|
||||
"$HOME"/.fehbg &
|
||||
fi
|
||||
fi
|
||||
|
||||
# Start the simple display compositor. See `xcompmgr --help'.
|
||||
_check xcompmgr && xcompmgr -cCfF -t -2 -l -2 -r 2.8 -o 0.55 -D 5 -I 0.075 -O 0.075 &
|
||||
|
||||
# Simple daemon for GTK settings
|
||||
xsettingsd -c "$HOME"/.config/xsettingsd/xsettingsd.conf &
|
||||
113
bspwm/.config/sxhkd/cheatsheet_sxhkdrc.txt
Normal file
113
bspwm/.config/sxhkd/cheatsheet_sxhkdrc.txt
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
List of common key bindings. All definitions are stored at:
|
||||
|
||||
~/.config/sxhkd/sxhkdrc
|
||||
~/.config/sxhkd/sxhkdrc_bspc
|
||||
|
||||
The latter is for definitions that control the window manager. While
|
||||
the former has WM-independent keys.
|
||||
|
||||
Last review 2019-07-01.
|
||||
|
||||
Explanation of the basics
|
||||
=========================
|
||||
|
||||
The Super key, aka "mod4", is the one that most keyboards mark with the
|
||||
Windows logo. While the key "Return" is also known as "Enter".
|
||||
|
||||
Motions are the same as Vim: h,j,k,l (left,down,up,right).
|
||||
|
||||
This is the general format of a key chord (aka key binding):
|
||||
|
||||
Super + <key>
|
||||
|
||||
And this is a key chord chain:
|
||||
|
||||
Super + <key> ; <key>
|
||||
|
||||
The keys "Super", "Alt", "Shift", "Ctrl" are known as "modifiers".
|
||||
|
||||
To run a key chord, hold down the modifier and press the key. Key chord
|
||||
chains build on that principle: you type the key binding to the left of
|
||||
the semicolon (;), release the modifier and then type the key (or key
|
||||
chord) to the right of the semicolon.
|
||||
|
||||
In this document, the notation {h,j,k,l} means "any one among" the
|
||||
comma-separated items. Whereas {1-4} denotes a range: 1,2,3,4.
|
||||
|
||||
Getting started
|
||||
===============
|
||||
|
||||
Super + Return |-Open a terminal running the "Default" tmux session
|
||||
Super + Shift + Return |-Open a generic, yet fully-capable terminal (xterm)
|
||||
Super + q |-Close focused window safely (apps might require confirmation)
|
||||
Super + Shift + q |-Kill focused window (no confirmation whatsoever)
|
||||
Ctrl + Alt + Delete |-Launch poweroptionsmenu, where you can choose to log out, reboot, etc.
|
||||
|
||||
Window motions
|
||||
==============
|
||||
|
||||
Super + {h,j,k,l} |-Move focus in the given direction == choose which window has attention
|
||||
Super + Shift + {h,j,k,l} |-Swap focused node with the one in the given direction
|
||||
Super + Ctrl + {h,j,k,l} |-Expand/contract tiled node in that direction, provided there is a split
|
||||
Super + Alt + {h,j,k,l} |-Set preselection (manual tiling) for next window
|
||||
|---Cancel presel by inputting same command again
|
||||
Super + Alt + {1-9} |-Set the presel ratio, relative to the focused node
|
||||
Super + Shift + <arrows> |-Move floating window
|
||||
Alt + right click |-Drag floating window
|
||||
Alt + left click |-Resize floating window from the nearest edge
|
||||
|
||||
Window and desktop actions
|
||||
==========================
|
||||
|
||||
Super + Space |-Toggle between tiled and floating states
|
||||
Super + m |-Toggle between tiled and monocle layout (monocle == maximised nodes)
|
||||
Super + f |-Toggle focused window's full screen view
|
||||
Alt + Tab |-Cycle through windows on the current desktop
|
||||
Alt + Shift + Tab |-Cycle backwardly through windows on the current desktop
|
||||
|
||||
Desktop operations
|
||||
==================
|
||||
|
||||
Super + {0-9} |-Switch to the designated desktop (workspace)
|
||||
Super + Shift + {0-9} |-Send focused node to the given desktop
|
||||
|---Desktops are created/removed dynamically (my custom setup)
|
||||
Super + Tab |-Cycle through desktops on the current monitor
|
||||
Super + Shift + Tab |-Cycle backwardly through desktops on the current monitor
|
||||
Super + r |-Rotate the node tree 90 degrees clockwise
|
||||
Super + Shift + r |-Rotate the node tree 90 degrees counter-clockwise
|
||||
Super + Alt + r |-Mirror/flip the node tree (top left becomes bottom right)
|
||||
Super + s ; {b,e} |-Balance or equalise node splits (better try it to get an idea)
|
||||
|---Balance works on the parent node. Equalise is for all nodes.
|
||||
Super + Shift + {[,]} |-Incrementally decrease or increase the gaps between the tiled nodes
|
||||
Super + Shift + {y,u,i,o} |-Change to gap presents {0,5,10,20}
|
||||
Super + comma |-Switch focus to the next monitor (cycles through monitors)
|
||||
Super + Shift + comma |-Switch focus to the previous monitor (cycles through monitors)
|
||||
|
||||
Launching programs
|
||||
==================
|
||||
|
||||
Super + d |-Run dmenu with access to all binaries in PATH
|
||||
Super + Shift + d |-Run flatpakmenu with access to all flatpak apps
|
||||
Super + g ; {1-3} |-Open graphical apps {firefox,caja,thunderbird}
|
||||
Super + x ; 0 |-Launch a floating terminal running calc
|
||||
|
||||
Useful extras
|
||||
=============
|
||||
|
||||
Super + {F1,Home} |-Launch a floating window with this cheat sheet
|
||||
Print |-Get a screenshot of the focused window saved to the ~/Desktop
|
||||
Super + Print |-Get a screenshot of the entire viewport saved to the ~/Desktop
|
||||
Super + p |-Run passmenu to copy a password stored with the UNIX tool "pass"
|
||||
Super + x ; w |-Run a floating image browser, from where you can also set the wallpaper
|
||||
Super + e ; c |-Toggle the display compotisor (do this if you have performance issues)
|
||||
Super + e ; f |-Toggle BSPWM "focus mode", to remove gaps, the padding, the panel
|
||||
Super + e ; t |-Run tempusmenu to select a Tempus theme for a live theme switch
|
||||
|---The Tempus themes: https://gitlab.com/protesilaos/tempus-themes
|
||||
|---Some ports of the Tempus themes are distributed with my dotfiles
|
||||
|
||||
Further reading
|
||||
===============
|
||||
|
||||
Study the ~/.config/sxhkd/sxhkdrc and ~/.config/sxhkd/sxhkdrc_bspc.
|
||||
They are extensively documented. You will find key chords for tasks not
|
||||
included herein, such as multimedia keys, setting node flags, and more.
|
||||
128
bspwm/.config/sxhkd/sxhkdrc
Normal file
128
bspwm/.config/sxhkd/sxhkdrc
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
#
|
||||
# SXHKD module with WM-agnostic keys
|
||||
#
|
||||
# Part of my dotfiles: <https://gitlab.com/protesilaos/dotfiles>.
|
||||
#
|
||||
|
||||
### Description
|
||||
#
|
||||
# Partial configuration file for the Simple X Hotkey Daemon. Meant to
|
||||
# work with `bspwm`. This is part of my dotfiles, which are managed
|
||||
# with GNU Stow. See https://gitlab.com/protesilaos/dotfiles
|
||||
|
||||
### Code:
|
||||
|
||||
#### Environment
|
||||
|
||||
|
||||
# I am using the prefix `mod4 + e' as a mnemonic for "environment".
|
||||
#
|
||||
# The following commands are:
|
||||
#
|
||||
# f == bspwm focus mode (my script)
|
||||
# s == reload sxhkd
|
||||
# p == reload melonpanel (my lemonbar script)
|
||||
# x == reload the Xresources file
|
||||
mod4 + x ; e ; {f,s,p,t,x}
|
||||
{ \
|
||||
bspwm_focus_mode, \
|
||||
pkill -USR1 -x sxhkd && notify-send -i key_bindings "Reloaded key bindings", \
|
||||
pkill -x melonpanel && melonpanel, \
|
||||
xrdb -I "$HOME" -merge "$HOME"/.Xresources \
|
||||
}
|
||||
|
||||
mod4 + F5
|
||||
delight
|
||||
|
||||
|
||||
# Invoke the session management menu (log out, lock, reboot, shutdown).
|
||||
ctrl + alt + Delete
|
||||
poweroptionsmenu
|
||||
|
||||
#### Keyboard layout
|
||||
|
||||
# NOTE 2021-08-27: review commentary about layout toggle.
|
||||
|
||||
# We can set the keyboard layouts, as well as the toggle directly via
|
||||
# `setxkbmap`. Example of what I used to run:
|
||||
#
|
||||
# setxkbmap -layout 'us,gr' -option 'ctrl:nocaps,compose:menu'
|
||||
#
|
||||
# However, doing so means losing out on the possibility to easily find
|
||||
# out the current/active layout from a script: X knows about "us,gr" in
|
||||
# that order, not which one is currently typing. As such, in `bspwmrc`
|
||||
# I simply autostart `setxkbmap -layout 'us'` without defining the
|
||||
# second layout and a toggle. The toggle is set below. With the
|
||||
# difference being that it invokes a custom script that switches between
|
||||
# the us,gr layout. All this is done to be able to get the active
|
||||
# keyboard layout and print its name to my system panel (custom lemonbar
|
||||
# called "melonpanel").
|
||||
#
|
||||
# The key chord is based on the Emacs function `toggle-input-method',
|
||||
# which is bound to C-\
|
||||
mod4 + backslash
|
||||
toggle_kbd_layout
|
||||
|
||||
#### Main programs
|
||||
|
||||
# # Use Xterm as a standalone tool or with Tmux (with Shift).
|
||||
# mod4 + {_, shift + } Return
|
||||
# {xterm,xterm -e tmux new-session -A -s 'Default'}
|
||||
|
||||
mod4 + Return
|
||||
alacritty
|
||||
|
||||
# Show the desired rofi views.
|
||||
mod4 + x ; {x,b}
|
||||
rofi -show {drun,window}
|
||||
|
||||
|
||||
#### Miscellaneous tools and media keys
|
||||
|
||||
|
||||
# Screenshots (requires `scrot`). First one is for the focused window.
|
||||
# The other is of the entire X session (including all active monitors).
|
||||
# Note that `scrot` also has an interactive mode that I do not use.
|
||||
Print
|
||||
scrot -u -z '%Y-%m-%d_%H:%M:%S_$wx$h$n.png' -e 'mv $f ~/Desktop' \
|
||||
&& notify-send -i gnome-screenshot "Window view screenshot" "Saved image to Desktop"
|
||||
mod4 + Print
|
||||
scrot -m -z '%Y-%m-%d_%H:%M:%S_$wx$h.png' -e 'mv $f ~/Desktop' \
|
||||
&& notify-send -i gnome-screenshot "Screen view screenshot" "Saved image to Desktop"
|
||||
|
||||
# Control the laptop's screen brightness (requires `xbacklight`).
|
||||
XF86MonBrightness{Down,Up}
|
||||
xbacklight {-dec 15,-inc 15}
|
||||
|
||||
|
||||
# Specifically for `bongo', my Emacs music manager.
|
||||
XF86Audio{Play,Prev,Next}
|
||||
emacsclient -e { \
|
||||
"(bongo-pause/resume)", \
|
||||
"(bongo-previous)", \
|
||||
"(bongo-next)" \
|
||||
}
|
||||
|
||||
# Control the [last] currently active player.
|
||||
mod4 + XF86Audio{Play,Prev,Next}
|
||||
playerctl {play-pause,previous,next}
|
||||
|
||||
# Speaker/output volume. Requires `amixer` and dedicated keys.
|
||||
XF86Audio{Mute,LowerVolume,RaiseVolume}
|
||||
amixer set Master {toggle,5%-,5%+}
|
||||
|
||||
# Microphone/input volume. Same requirements as previous definition.
|
||||
XF86AudioMicMute
|
||||
amixer set Capture toggle
|
||||
mod4 + XF86Audio{Mute,LowerVolume,RaiseVolume}
|
||||
amixer set Capture {toggle,5%-,5%+}
|
||||
|
||||
|
||||
|
||||
# TODO 2019-11-01: These will need to be reviewed once all key bindings
|
||||
# are rewritten. Perhaps it would be nice to produce something that is
|
||||
# interactive and searchable…
|
||||
# # Bring up the help text for common keybindings
|
||||
# mod4 + {F1,Home}
|
||||
# xterm -class "my_float_window" \
|
||||
# -geometry '100x30' -e less "$HOME/.config/sxhkd/cheatsheet_sxhkdrc.txt"
|
||||
232
bspwm/.config/sxhkd/sxhkdrc_bspc
Normal file
232
bspwm/.config/sxhkd/sxhkdrc_bspc
Normal file
|
|
@ -0,0 +1,232 @@
|
|||
#
|
||||
# SXHKD module with BPSWM-specific commands
|
||||
#
|
||||
# Part of my dotfiles: https://gitlab.com/protesilaos/dotfiles
|
||||
#
|
||||
### Description
|
||||
#
|
||||
# Partial configuration file for the Simple X Hotkey Daemon. Meant to
|
||||
# work with `bspwm`. This is part of my dotfiles, which are managed
|
||||
# with GNU Stow. See https://gitlab.com/protesilaos/dotfiles
|
||||
#
|
||||
# LARGE PORTIONS OF THIS FILE INVOKE MY SHELL SCRIPTS. Do not blindly
|
||||
# copy-paste from here!
|
||||
|
||||
### Code
|
||||
|
||||
# Close {or kill} currently focused node
|
||||
mod4 + {_,shift + }q
|
||||
bspc node -{c,k}
|
||||
|
||||
#### Focus/swap nodes/desktops
|
||||
|
||||
# Focus the node in the given direction.
|
||||
mod4 + {h,j,k,l}
|
||||
bspc node -f {west,south,north,east}
|
||||
|
||||
# Swap focused window with the one in the given direction. If there is
|
||||
# no window in that direction, a receptacle will be created. Inputting
|
||||
# any direction again will move the focused window to the position of
|
||||
# the receptacle. This will effectively remove it from the current
|
||||
# layout, creating a more fluid workflow that does not constrain you to
|
||||
# the tree of the tiling scheme.
|
||||
#
|
||||
# IF you only ever want to move a window into an existing one and avoid
|
||||
# the added features of the scripted behaviour, use the following
|
||||
# command instead:
|
||||
#
|
||||
# bspc node -s {west,south,north,east}
|
||||
#
|
||||
# TIP after breaking free from the layout, you can use --balance to
|
||||
# spread out the nodes (see the key chord further down). You may also
|
||||
# --rotate the tree.
|
||||
#
|
||||
# bspwm_smart_move is part of my dotfiles (link in the description).
|
||||
mod4 + shift + {h,j,k,l}
|
||||
bspwm_smart_move {west,south,north,east}
|
||||
|
||||
# Dynamic desktop behaviour: this invokes a script of mine that
|
||||
# implements dynamic desktops (see dotfiles). If the given desktop
|
||||
# number is missing, it is created on the spot. Empty desktops are then
|
||||
# removed automatically.
|
||||
#
|
||||
#
|
||||
# mod4 + <number> = focus the given desktop
|
||||
# mod4 + shift + <number> = send focused window to given desktop
|
||||
# mod4 + ctrl + shift + <number> = as above, but send to next monitor
|
||||
# mod4 + ctrl + <number> = switches the active (visible) desktop of the
|
||||
# unfocused monitor, without focusing it (focus stays on the current
|
||||
# desktop/monitor). It also inserts a receptacle, meaning that the next
|
||||
# created window will go there without calling focus to itself (see my
|
||||
# bspwm_external_rules).
|
||||
#
|
||||
#
|
||||
# Commands for receptacles are defined in the "advanced operations"
|
||||
# section.
|
||||
#
|
||||
# NOTE the leading `;` runs this command asynchronously.
|
||||
#
|
||||
# NOTE2 the script also offers commands for sending to a desktop on the
|
||||
# current or the next monitor and following it right away. The
|
||||
# shorthand for those is `--nsf' and `--nmf' respectively. A
|
||||
# commented-out version is provided below the enabled key bindings,
|
||||
# which replaces the "send" commands noted above with their
|
||||
# "send+follow" equivalents.
|
||||
mod4 + {_,shift + ,ctrl + shift +,ctrl +}{0-9}
|
||||
;bspwm_dynamic_desktops {--df,--ns,--nm,--da} {0-9}
|
||||
|
||||
## Use this for "send+follow" instead of just "send"
|
||||
# mod4 + {_,shift + ,ctrl + shift +,ctrl +}{0-9}
|
||||
# ;bspwm_dynamic_desktops {--df,--nsf,--nmf,--da} {0-9}
|
||||
|
||||
# With `alt` focus {next,previous} window in the current desktop. With
|
||||
# `mod4` focus {next,previous} desktop in the current monitor.
|
||||
# Cyclical behaviour. Move in the opposite direction while also holding
|
||||
# down `shift`.
|
||||
{mod4,alt} + {_,shift +} Tab
|
||||
bspc {desktop,node} -f {next,prev}.local
|
||||
|
||||
# Switch to the other monitor.
|
||||
mod4 + o
|
||||
bspc monitor -f next
|
||||
|
||||
# Switch to last active {desktop,node}. With mod4 move to the last
|
||||
# active desktop. With alt move to the last active node. "grave" is
|
||||
# positioned above Tab in QWERTY layouts.
|
||||
{mod4,alt} + grave
|
||||
bspc {desktop,node} -f last
|
||||
|
||||
# Expand or contract node in the given direction.
|
||||
#
|
||||
# For floating windows one can use Alt + Right Mouse click to
|
||||
# drag/resize in the given direction (this works in other DEs as well,
|
||||
# such as MATE and Xfce). I have not set the script to resize floating
|
||||
# windows because: (i) I do not use them and if I do I do not want to
|
||||
# change their dimensions, and (ii) to keep the script concise.
|
||||
mod4 + ctrl + {h,j,k,l}
|
||||
bspwm_resize {west,south,north,east} 50
|
||||
|
||||
# Move a floating window with the arrow keys (else use Alt + Left Mouse
|
||||
# Click to drag). I seldom use floating windows.
|
||||
mod4 + shift + {Left,Down,Up,Right}
|
||||
bspc node -v {-20 0,0 20,0 -20,20 0}
|
||||
|
||||
# Preselect the direction or insert again to cancel the preselection.
|
||||
# This enters the manual tiling mode that splits the currently focused
|
||||
# window.
|
||||
mod4 + alt + {h,j,k,l}
|
||||
bspc node --presel-dir '~{west,south,north,east}'
|
||||
|
||||
# Preselect the ratio. The default value is 0.5, defined in `bspwmrc`.
|
||||
mod4 + alt + {1-9}
|
||||
bspc node -o 0.{1-9}
|
||||
|
||||
# Transpose desktops, while keeping focus on the present monitor. With
|
||||
# shift the focus stays on the present window/desktop, thus moving to
|
||||
# the other monitor.
|
||||
mod4 + {_, shift + }t
|
||||
bspc desktop --swap next.active {_,--follow}
|
||||
|
||||
#### Node layout state and flags
|
||||
|
||||
# Toggle monocle layout (maximise focused node). If you use `-l
|
||||
# monocle` you lose the toggle functionality.
|
||||
mod4 + m
|
||||
bspc desktop -l next
|
||||
|
||||
# Toggle floating, tiled, fullscreen view. Tiled is what is used by
|
||||
# default. Floating windows have their own dimensions and can be stacked
|
||||
# on top of each other.
|
||||
#
|
||||
# NOTE the presence of the tilde ~. If current state matches the given
|
||||
# state, then the argument is interpreted as the last state.
|
||||
mod4 + {shift + space,space,f}
|
||||
bspc node -t ~{tiled,floating,fullscreen}
|
||||
|
||||
# Set the node flags. Locked is a node that cannot be closed with `bspc
|
||||
# node --close`. Marked is a specific selector that allows operating on
|
||||
# the given item (such as sending the marked item to the newest
|
||||
# preselection). Sticky stays in the focused desktop. Private tries to
|
||||
# keep its dimensions and tiling position.
|
||||
mod4 + x ; f ; {l,m,s,p}
|
||||
bspc node -g {locked,marked,sticky,private}
|
||||
|
||||
#### Manipulate the workspace
|
||||
|
||||
# Rotate all windows {counter-}clockwise by 90 degrees.
|
||||
mod4 + {_,shift + }r
|
||||
bspc node @/ --rotate {90,-90}
|
||||
|
||||
# Dynamic gaps.
|
||||
mod4 + shift + bracket{left,right}
|
||||
bspc config -d focused window_gap "$(($(bspc config -d focused window_gap) {-,+} 5 ))"
|
||||
|
||||
#### Advanced operations (receptacles and scripted actions)
|
||||
|
||||
# NOTE The behaviour of preselections and receptacles is regulated by my
|
||||
# bspwm_external_rules command (which is called from within bspwmrc).
|
||||
|
||||
# Insert receptacle following the tiling scheme or preselection.
|
||||
# Receptacles are empty frames that function as placeholders for
|
||||
# windows.
|
||||
#
|
||||
# Whereas bspwm_smart_move (defined above) will automatically insert
|
||||
# a receptacle in the given direction by splitting the entire viewport.
|
||||
mod4 + x ; n ; r
|
||||
bspc node -i
|
||||
|
||||
# Insert the marked window (or focused if no marks) in the first
|
||||
# matching receptacle (or preselection if no receptacles).
|
||||
mod4 + x ; n ; i
|
||||
bspwm_smart_presel
|
||||
|
||||
# Kill/remove the first matching receptacle from the current desktop.
|
||||
# With shift, kill them all at once.
|
||||
mod4 + n ; mod4 + {_, shift + }r
|
||||
{ \
|
||||
bspc node 'any.leaf.!window.local' -k, \
|
||||
bspwm_multifaceted_operation --kill-all-receptacles \
|
||||
}
|
||||
|
||||
# Summon all marked windows across all desktops to the current desktop.
|
||||
mod4 + x ; n ; m
|
||||
bspwm_multifaceted_operation --summon-all-marked
|
||||
|
||||
# Bring the windows of the given desktop to the current one. With
|
||||
# shift, send the current window to the given one.
|
||||
mod4 + x ; n ; mod4 + {_, shift + }{0-9}
|
||||
bspwm_multifaceted_operation {--bring-desktop-here,--send-desktop-there} {0-9}
|
||||
|
||||
# Close {or kill} all windows in the present desktop except the focused
|
||||
# or any marked ones.
|
||||
mod4 + x ; n ; mod4 + {_,shift + }q
|
||||
bspwm_multifaceted_operation --{close,kill}-all-local-non-focused
|
||||
|
||||
# Assign the locked flag to all windows in the current desktop. With
|
||||
# shift, remove the locked flag from all.
|
||||
mod4 + x ; n ; {_, shift + }l
|
||||
bspwm_multifaceted_operation {--lock-all-local,--unlock-all-local}
|
||||
|
||||
|
||||
#### Continuous input mode
|
||||
|
||||
# EXPLAIN: The following key chords have a colon sign `:' before their
|
||||
# last part. By pressing the keys to the left of the colon, you can
|
||||
# then pass the commands by only using the keys to the right of the
|
||||
# colon. This eliminates the need for repeated chord presses that
|
||||
# involve the modifier keys. Exit the mode with "Escape".
|
||||
#
|
||||
# NOTE: All of the following are mirrors of their afore-mentioned
|
||||
# couterparts.
|
||||
|
||||
# Resize node in the given direction.
|
||||
mod4 + c : {h,j,k,l}
|
||||
bspwm_resize {west,south,north,east} 50
|
||||
|
||||
# Mode for dynamic gaps.
|
||||
mod4 + c : bracket{left,right}
|
||||
bspc config -d focused window_gap "$(($(bspc config -d focused window_gap) {-,+} 5 ))"
|
||||
|
||||
# Move floating windows with the arrow keys
|
||||
mod4 + c : {Left,Down,Up,Right}
|
||||
bspc node -v {-20 0,0 20,0 -20,20 0}
|
||||
466
dunst/.config/dunst/dunstrc
Normal file
466
dunst/.config/dunst/dunstrc
Normal file
|
|
@ -0,0 +1,466 @@
|
|||
[global]
|
||||
### Display ###
|
||||
|
||||
# Which monitor should the notifications be displayed on.
|
||||
monitor = 0
|
||||
|
||||
# Display notification on focused monitor. Possible modes are:
|
||||
# mouse: follow mouse pointer
|
||||
# keyboard: follow window with keyboard focus
|
||||
# none: don't follow anything
|
||||
#
|
||||
# "keyboard" needs a window manager that exports the
|
||||
# _NET_ACTIVE_WINDOW property.
|
||||
# This should be the case for almost all modern window managers.
|
||||
#
|
||||
# If this option is set to mouse or keyboard, the monitor option
|
||||
# will be ignored.
|
||||
follow = keyboard
|
||||
|
||||
# The geometry of the window:
|
||||
# [{width}]x{height}[+/-{x}+/-{y}]
|
||||
# The geometry of the message window.
|
||||
# The height is measured in number of notifications everything else
|
||||
# in pixels. If the width is omitted but the height is given
|
||||
# ("-geometry x2"), the message window expands over the whole screen
|
||||
# (dmenu-like). If width is 0, the window expands to the longest
|
||||
# message displayed. A positive x is measured from the left, a
|
||||
# negative from the right side of the screen. Y is measured from
|
||||
# the top and down respectively.
|
||||
# The width can be negative. In this case the actual width is the
|
||||
# screen width minus the width defined in within the geometry option.
|
||||
geometry = "300x5-5-30"
|
||||
|
||||
# Turn on the progess bar
|
||||
progress_bar = true
|
||||
|
||||
# Set the progress bar height. This includes the frame, so make sure
|
||||
# it's at least twice as big as the frame width.
|
||||
progress_bar_height = 10
|
||||
|
||||
# Set the frame width of the progress bar
|
||||
progress_bar_frame_width = 1
|
||||
|
||||
# Set the minimum width for the progress bar
|
||||
progress_bar_min_width = 150
|
||||
|
||||
# Set the maximum width for the progress bar
|
||||
progress_bar_max_width = 300
|
||||
|
||||
|
||||
# Show how many messages are currently hidden (because of geometry).
|
||||
indicate_hidden = yes
|
||||
|
||||
# Shrink window if it's smaller than the width. Will be ignored if
|
||||
# width is 0.
|
||||
shrink = no
|
||||
|
||||
# The transparency of the window. Range: [0; 100].
|
||||
# This option will only work if a compositing window manager is
|
||||
# present (e.g. xcompmgr, compiz, etc.).
|
||||
transparency = 0
|
||||
|
||||
# The height of the entire notification. If the height is smaller
|
||||
# than the font height and padding combined, it will be raised
|
||||
# to the font height and padding.
|
||||
notification_height = 0
|
||||
|
||||
# Draw a line of "separator_height" pixel height between two
|
||||
# notifications.
|
||||
# Set to 0 to disable.
|
||||
separator_height = 1
|
||||
|
||||
# Padding between text and separator.
|
||||
padding = 8
|
||||
|
||||
# Horizontal padding.
|
||||
horizontal_padding = 8
|
||||
|
||||
# Padding between text and icon.
|
||||
text_icon_padding = 0
|
||||
|
||||
# Defines width in pixels of frame around the notification window.
|
||||
# Set to 0 to disable.
|
||||
frame_width = 3
|
||||
|
||||
# Defines color of the frame around the notification window.
|
||||
frame_color = "#aaaaaa"
|
||||
|
||||
# Define a color for the separator.
|
||||
# possible values are:
|
||||
# * auto: dunst tries to find a color fitting to the background;
|
||||
# * foreground: use the same color as the foreground;
|
||||
# * frame: use the same color as the frame;
|
||||
# * anything else will be interpreted as a X color.
|
||||
separator_color = frame
|
||||
|
||||
# Sort messages by urgency.
|
||||
sort = yes
|
||||
|
||||
# Don't remove messages, if the user is idle (no mouse or keyboard input)
|
||||
# for longer than idle_threshold seconds.
|
||||
# Set to 0 to disable.
|
||||
# A client can set the 'transient' hint to bypass this. See the rules
|
||||
# section for how to disable this if necessary
|
||||
idle_threshold = 120
|
||||
|
||||
### Text ###
|
||||
|
||||
font = Monospace 10
|
||||
|
||||
# The spacing between lines. If the height is smaller than the
|
||||
# font height, it will get raised to the font height.
|
||||
line_height = 0
|
||||
|
||||
# Possible values are:
|
||||
# full: Allow a small subset of html markup in notifications:
|
||||
# <b>bold</b>
|
||||
# <i>italic</i>
|
||||
# <s>strikethrough</s>
|
||||
# <u>underline</u>
|
||||
#
|
||||
# For a complete reference see
|
||||
# <https://developer.gnome.org/pango/stable/pango-Markup.html>.
|
||||
#
|
||||
# strip: This setting is provided for compatibility with some broken
|
||||
# clients that send markup even though it's not enabled on the
|
||||
# server. Dunst will try to strip the markup but the parsing is
|
||||
# simplistic so using this option outside of matching rules for
|
||||
# specific applications *IS GREATLY DISCOURAGED*.
|
||||
#
|
||||
# no: Disable markup parsing, incoming notifications will be treated as
|
||||
# plain text. Dunst will not advertise that it has the body-markup
|
||||
# capability if this is set as a global setting.
|
||||
#
|
||||
# It's important to note that markup inside the format option will be parsed
|
||||
# regardless of what this is set to.
|
||||
markup = full
|
||||
|
||||
# The format of the message. Possible variables are:
|
||||
# %a appname
|
||||
# %s summary
|
||||
# %b body
|
||||
# %i iconname (including its path)
|
||||
# %I iconname (without its path)
|
||||
# %p progress value if set ([ 0%] to [100%]) or nothing
|
||||
# %n progress value if set without any extra characters
|
||||
# %% Literal %
|
||||
# Markup is allowed
|
||||
format = "<b>%s</b>\n%b"
|
||||
|
||||
# Alignment of message text.
|
||||
# Possible values are "left", "center" and "right".
|
||||
alignment = left
|
||||
|
||||
# Vertical alignment of message text and icon.
|
||||
# Possible values are "top", "center" and "bottom".
|
||||
vertical_alignment = center
|
||||
|
||||
# Show age of message if message is older than show_age_threshold
|
||||
# seconds.
|
||||
# Set to -1 to disable.
|
||||
show_age_threshold = 60
|
||||
|
||||
# Split notifications into multiple lines if they don't fit into
|
||||
# geometry.
|
||||
word_wrap = yes
|
||||
|
||||
# When word_wrap is set to no, specify where to make an ellipsis in long lines.
|
||||
# Possible values are "start", "middle" and "end".
|
||||
ellipsize = middle
|
||||
|
||||
# Ignore newlines '\n' in notifications.
|
||||
ignore_newline = no
|
||||
|
||||
# Stack together notifications with the same content
|
||||
stack_duplicates = true
|
||||
|
||||
# Hide the count of stacked notifications with the same content
|
||||
hide_duplicate_count = false
|
||||
|
||||
# Display indicators for URLs (U) and actions (A).
|
||||
show_indicators = yes
|
||||
|
||||
### Icons ###
|
||||
|
||||
# Align icons left/right/off
|
||||
icon_position = left
|
||||
|
||||
# Scale small icons up to this size, set to 0 to disable. Helpful
|
||||
# for e.g. small files or high-dpi screens. In case of conflict,
|
||||
# max_icon_size takes precedence over this.
|
||||
min_icon_size = 0
|
||||
|
||||
# Scale larger icons down to this size, set to 0 to disable
|
||||
max_icon_size = 32
|
||||
|
||||
# Paths to default icons.
|
||||
icon_path = /usr/share/icons/Adwaita/16x16/status/:/usr/share/icons/Adwaita/16x16/devices/
|
||||
|
||||
### History ###
|
||||
|
||||
# Should a notification popped up from history be sticky or timeout
|
||||
# as if it would normally do.
|
||||
sticky_history = yes
|
||||
|
||||
# Maximum amount of notifications kept in history
|
||||
history_length = 20
|
||||
|
||||
### Misc/Advanced ###
|
||||
|
||||
# dmenu path.
|
||||
dmenu = /usr/bin/dmenu -p dunst:
|
||||
|
||||
# Browser for opening urls in context menu.
|
||||
browser = /usr/bin/firefox -new-tab
|
||||
|
||||
# Always run rule-defined scripts, even if the notification is suppressed
|
||||
always_run_script = true
|
||||
|
||||
# Define the title of the windows spawned by dunst
|
||||
title = Dunst
|
||||
|
||||
# Define the class of the windows spawned by dunst
|
||||
class = Dunst
|
||||
|
||||
# Print a notification on startup.
|
||||
# This is mainly for error detection, since dbus (re-)starts dunst
|
||||
# automatically after a crash.
|
||||
startup_notification = false
|
||||
|
||||
# Manage dunst's desire for talking
|
||||
# Can be one of the following values:
|
||||
# crit: Critical features. Dunst aborts
|
||||
# warn: Only non-fatal warnings
|
||||
# mesg: Important Messages
|
||||
# info: all unimportant stuff
|
||||
# debug: all less than unimportant stuff
|
||||
verbosity = mesg
|
||||
|
||||
# Define the corner radius of the notification window
|
||||
# in pixel size. If the radius is 0, you have no rounded
|
||||
# corners.
|
||||
# The radius will be automatically lowered if it exceeds half of the
|
||||
# notification height to avoid clipping text and/or icons.
|
||||
corner_radius = 0
|
||||
|
||||
# Ignore the dbus closeNotification message.
|
||||
# Useful to enforce the timeout set by dunst configuration. Without this
|
||||
# parameter, an application may close the notification sent before the
|
||||
# user defined timeout.
|
||||
ignore_dbusclose = false
|
||||
|
||||
### Wayland ###
|
||||
# These settings are Wayland-specific. They have no effect when using X11
|
||||
|
||||
# Uncomment this if you want to let notications appear under fullscreen
|
||||
# applications (default: overlay)
|
||||
# layer = top
|
||||
|
||||
# Set this to true to use X11 output on Wayland.
|
||||
force_xwayland = false
|
||||
|
||||
### Legacy
|
||||
|
||||
# Use the Xinerama extension instead of RandR for multi-monitor support.
|
||||
# This setting is provided for compatibility with older nVidia drivers that
|
||||
# do not support RandR and using it on systems that support RandR is highly
|
||||
# discouraged.
|
||||
#
|
||||
# By enabling this setting dunst will not be able to detect when a monitor
|
||||
# is connected or disconnected which might break follow mode if the screen
|
||||
# layout changes.
|
||||
force_xinerama = false
|
||||
|
||||
### mouse
|
||||
|
||||
# Defines list of actions for each mouse event
|
||||
# Possible values are:
|
||||
# * none: Don't do anything.
|
||||
# * do_action: If the notification has exactly one action, or one is marked as default,
|
||||
# invoke it. If there are multiple and no default, open the context menu.
|
||||
# * close_current: Close current notification.
|
||||
# * close_all: Close all notifications.
|
||||
# These values can be strung together for each mouse event, and
|
||||
# will be executed in sequence.
|
||||
mouse_left_click = close_current
|
||||
mouse_middle_click = do_action, close_current
|
||||
mouse_right_click = close_all
|
||||
|
||||
# Experimental features that may or may not work correctly. Do not expect them
|
||||
# to have a consistent behaviour across releases.
|
||||
[experimental]
|
||||
# Calculate the dpi to use on a per-monitor basis.
|
||||
# If this setting is enabled the Xft.dpi value will be ignored and instead
|
||||
# dunst will attempt to calculate an appropriate dpi value for each monitor
|
||||
# using the resolution and physical size. This might be useful in setups
|
||||
# where there are multiple screens with very different dpi values.
|
||||
per_monitor_dpi = false
|
||||
|
||||
# The internal keyboard shortcut support in dunst is now considered deprecated
|
||||
# and should be replaced by dunstctl calls. You can use the configuration of your
|
||||
# WM or DE to bind these to shortcuts of your choice.
|
||||
# Check the dunstctl manual page for more info.
|
||||
[shortcuts]
|
||||
|
||||
# Shortcuts are specified as [modifier+][modifier+]...key
|
||||
# Available modifiers are "ctrl", "mod1" (the alt-key), "mod2",
|
||||
# "mod3" and "mod4" (windows-key).
|
||||
# Xev might be helpful to find names for keys.
|
||||
|
||||
# Close notification. Equivalent dunstctl command:
|
||||
# dunstctl close
|
||||
# close = ctrl+space
|
||||
|
||||
# Close all notifications. Equivalent dunstctl command:
|
||||
# dunstctl close-all
|
||||
# close_all = ctrl+shift+space
|
||||
|
||||
# Redisplay last message(s). Equivalent dunstctl command:
|
||||
# dunstctl history-pop
|
||||
# history = ctrl+grave
|
||||
|
||||
# Context menu. Equivalent dunstctl command:
|
||||
# dunstctl context
|
||||
# context = ctrl+shift+period
|
||||
|
||||
[urgency_low]
|
||||
# IMPORTANT: colors have to be defined in quotation marks.
|
||||
# Otherwise the "#" and following would be interpreted as a comment.
|
||||
background = "#222222"
|
||||
foreground = "#888888"
|
||||
timeout = 4
|
||||
# Icon for notifications with low urgency, uncomment to enable
|
||||
#icon = /path/to/icon
|
||||
|
||||
[urgency_normal]
|
||||
background = "#333333"
|
||||
foreground = "#ffffff"
|
||||
timeout = 6
|
||||
# Icon for notifications with normal urgency, uncomment to enable
|
||||
#icon = /path/to/icon
|
||||
|
||||
[urgency_critical]
|
||||
background = "#900000"
|
||||
foreground = "#ffffff"
|
||||
frame_color = "#ff0000"
|
||||
timeout = 0
|
||||
# Icon for notifications with critical urgency, uncomment to enable
|
||||
#icon = /path/to/icon
|
||||
|
||||
# Every section that isn't one of the above is interpreted as a rules to
|
||||
# override settings for certain messages.
|
||||
#
|
||||
# Messages can be matched by
|
||||
# appname (discouraged, see desktop_entry)
|
||||
# body
|
||||
# category
|
||||
# desktop_entry
|
||||
# icon
|
||||
# match_transient
|
||||
# msg_urgency
|
||||
# stack_tag
|
||||
# summary
|
||||
#
|
||||
# and you can override the
|
||||
# background
|
||||
# foreground
|
||||
# format
|
||||
# frame_color
|
||||
# fullscreen
|
||||
# new_icon
|
||||
# set_stack_tag
|
||||
# set_transient
|
||||
# timeout
|
||||
# urgency
|
||||
#
|
||||
# Shell-like globbing will get expanded.
|
||||
#
|
||||
# Instead of the appname filter, it's recommended to use the desktop_entry filter.
|
||||
# GLib based applications export their desktop-entry name. In comparison to the appname,
|
||||
# the desktop-entry won't get localized.
|
||||
#
|
||||
# SCRIPTING
|
||||
# You can specify a script that gets run when the rule matches by
|
||||
# setting the "script" option.
|
||||
# The script will be called as follows:
|
||||
# script appname summary body icon urgency
|
||||
# where urgency can be "LOW", "NORMAL" or "CRITICAL".
|
||||
#
|
||||
# NOTE: if you don't want a notification to be displayed, set the format
|
||||
# to "".
|
||||
# NOTE: It might be helpful to run dunst -print in a terminal in order
|
||||
# to find fitting options for rules.
|
||||
|
||||
# Disable the transient hint so that idle_threshold cannot be bypassed from the
|
||||
# client
|
||||
#[transient_disable]
|
||||
# match_transient = yes
|
||||
# set_transient = no
|
||||
#
|
||||
# Make the handling of transient notifications more strict by making them not
|
||||
# be placed in history.
|
||||
#[transient_history_ignore]
|
||||
# match_transient = yes
|
||||
# history_ignore = yes
|
||||
|
||||
# fullscreen values
|
||||
# show: show the notifications, regardless if there is a fullscreen window opened
|
||||
# delay: displays the new notification, if there is no fullscreen window active
|
||||
# If the notification is already drawn, it won't get undrawn.
|
||||
# pushback: same as delay, but when switching into fullscreen, the notification will get
|
||||
# withdrawn from screen again and will get delayed like a new notification
|
||||
#[fullscreen_delay_everything]
|
||||
# fullscreen = delay
|
||||
#[fullscreen_show_critical]
|
||||
# msg_urgency = critical
|
||||
# fullscreen = show
|
||||
|
||||
#[espeak]
|
||||
# summary = "*"
|
||||
# script = dunst_espeak.sh
|
||||
|
||||
#[script-test]
|
||||
# summary = "*script*"
|
||||
# script = dunst_test.sh
|
||||
|
||||
#[ignore]
|
||||
# # This notification will not be displayed
|
||||
# summary = "foobar"
|
||||
# format = ""
|
||||
|
||||
#[history-ignore]
|
||||
# # This notification will not be saved in history
|
||||
# summary = "foobar"
|
||||
# history_ignore = yes
|
||||
|
||||
#[skip-display]
|
||||
# # This notification will not be displayed, but will be included in the history
|
||||
# summary = "foobar"
|
||||
# skip_display = yes
|
||||
|
||||
#[signed_on]
|
||||
# appname = Pidgin
|
||||
# summary = "*signed on*"
|
||||
# urgency = low
|
||||
#
|
||||
#[signed_off]
|
||||
# appname = Pidgin
|
||||
# summary = *signed off*
|
||||
# urgency = low
|
||||
#
|
||||
#[says]
|
||||
# appname = Pidgin
|
||||
# summary = *says*
|
||||
# urgency = critical
|
||||
#
|
||||
#[twitter]
|
||||
# appname = Pidgin
|
||||
# summary = *twitter.com*
|
||||
# urgency = normal
|
||||
#
|
||||
#[stack-volumes]
|
||||
# appname = "some_volume_notifiers"
|
||||
# set_stack_tag = "volume"
|
||||
#
|
||||
# vim: ft=cfg
|
||||
17
gtk/.config/gtk-3.0/settings.ini
Normal file
17
gtk/.config/gtk-3.0/settings.ini
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
[Settings]
|
||||
gtk-application-prefer-dark-theme=0
|
||||
gtk-theme-name=Adwaita
|
||||
gtk-icon-theme-name=Adwaita
|
||||
gtk-font-name=Sans 10
|
||||
gtk-cursor-theme-name=Adwaita
|
||||
gtk-cursor-theme-size=0
|
||||
gtk-toolbar-style=GTK_TOOLBAR_BOTH_HORIZ
|
||||
gtk-toolbar-icon-size=GTK_ICON_SIZE_SMALL_TOOLBAR
|
||||
gtk-button-images=1
|
||||
gtk-menu-images=1
|
||||
gtk-enable-event-sounds=1
|
||||
gtk-enable-input-feedback-sounds=1
|
||||
gtk-xft-antialias=1
|
||||
gtk-xft-hinting=1
|
||||
gtk-xft-hintstyle=hintslight
|
||||
gtk-xft-rgba=rgb
|
||||
2
gtk/.config/gtk-4.0/settings.ini
Normal file
2
gtk/.config/gtk-4.0/settings.ini
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
[Settings]
|
||||
gtk-application-prefer-dark-theme=0
|
||||
29
gtk/.config/xsettingsd/xsettingsd.conf
Normal file
29
gtk/.config/xsettingsd/xsettingsd.conf
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
Gdk/WindowScalingFactor 1
|
||||
Gtk/ButtonImages 0
|
||||
Gtk/CanChangeAccels 0
|
||||
Gtk/ColorPalette "black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90"
|
||||
Gtk/CursorThemeName "Adwaita"
|
||||
Gtk/CursorThemeSize 0
|
||||
Gtk/DecorationLayout ":minimize,maximize,close"
|
||||
Gtk/FontName "Sans 10.5"
|
||||
Gtk/IconSizes ""
|
||||
Gtk/KeyThemeName ""
|
||||
Gtk/MenuBarAccel ""
|
||||
Gtk/MenuImages 1
|
||||
Gtk/MonospaceFontName "Monospace 10"
|
||||
Gtk/ToolbarIconSize 3
|
||||
Gtk/ToolbarStyle "icons"
|
||||
Net/CursorBlink 1
|
||||
Net/CursorBlinkTime 1200
|
||||
Net/DndDragThreshold 8
|
||||
Net/DoubleClickDistance 5
|
||||
Net/DoubleClickTime 400
|
||||
Net/EnableEventSounds 1
|
||||
Net/EnableInputFeedbackSounds 1
|
||||
Net/IconThemeName "Adwaita"
|
||||
Net/SoundThemeName "default"
|
||||
Net/ThemeName "Adwaita"
|
||||
Xft/Antialias 1
|
||||
Xft/HintStyle "hintslight"
|
||||
Xft/Hinting 1
|
||||
Xft/RGBA "rgb"
|
||||
15
gtk/.gtkrc-2.0
Normal file
15
gtk/.gtkrc-2.0
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
gtk-theme-name='Arc-Dark'
|
||||
gtk-icon-theme-name='Papirus-Dark'
|
||||
gtk-font-name='Sans 10'
|
||||
gtk-cursor-theme-name='Adwaita'
|
||||
gtk-cursor-theme-size=0
|
||||
gtk-toolbar-style=GTK_TOOLBAR_BOTH_HORIZ
|
||||
gtk-toolbar-icon-size=GTK_ICON_SIZE_SMALL_TOOLBAR
|
||||
gtk-button-images=1
|
||||
gtk-menu-images=1
|
||||
gtk-enable-event-sounds=1
|
||||
gtk-enable-input-feedback-sounds=1
|
||||
gtk-xft-antialias=1
|
||||
gtk-xft-hinting=1
|
||||
gtk-xft-hintstyle='hintslight'
|
||||
gtk-xft-rgba='rgb'
|
||||
9
keyring/.config/autostart/gnome-keyring-pkcs11.desktop
Normal file
9
keyring/.config/autostart/gnome-keyring-pkcs11.desktop
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=Certificate and Key Storage
|
||||
Comment=GNOME Keyring: PKCS#11 Component
|
||||
Exec=/usr/bin/gnome-keyring-daemon --start --components=pkcs11
|
||||
X-GNOME-Autostart-Phase=PreDisplayServer
|
||||
X-GNOME-AutoRestart=true
|
||||
X-GNOME-Autostart-enabled=true
|
||||
X-GNOME-Autostart-Notify=true
|
||||
13
keyring/.config/autostart/gnome-keyring-secrets.desktop
Normal file
13
keyring/.config/autostart/gnome-keyring-secrets.desktop
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=Secret Storage Service
|
||||
Comment=GNOME Keyring: Secret Service
|
||||
Exec=/usr/bin/gnome-keyring-daemon --start --components=secrets
|
||||
NoDisplay=true
|
||||
X-GNOME-Autostart-Phase=PreDisplayServer
|
||||
X-GNOME-AutoRestart=false
|
||||
X-GNOME-Autostart-Notify=true
|
||||
X-GNOME-Bugzilla-Bugzilla=GNOME
|
||||
X-GNOME-Bugzilla-Product=gnome-keyring
|
||||
X-GNOME-Bugzilla-Component=general
|
||||
X-GNOME-Bugzilla-Version=3.28.2
|
||||
12
keyring/.config/autostart/gnome-keyring-ssh.desktop
Normal file
12
keyring/.config/autostart/gnome-keyring-ssh.desktop
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=SSH Key Agent
|
||||
Comment=GNOME Keyring: SSH Agent
|
||||
Exec=/usr/bin/gnome-keyring-daemon --start --components=ssh
|
||||
X-GNOME-Autostart-Phase=PreDisplayServer
|
||||
X-GNOME-AutoRestart=false
|
||||
X-GNOME-Autostart-Notify=true
|
||||
X-GNOME-Bugzilla-Bugzilla=GNOME
|
||||
X-GNOME-Bugzilla-Product=gnome-keyring
|
||||
X-GNOME-Bugzilla-Component=general
|
||||
X-GNOME-Bugzilla-Version=3.28.2
|
||||
119
rofi/.config/rofi/config.rasi
Normal file
119
rofi/.config/rofi/config.rasi
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
configuration {
|
||||
modi: "run,drun,window";
|
||||
width: 100;
|
||||
lines: 8;
|
||||
columns: 1;
|
||||
font: "Monospace 11";
|
||||
location: 6;
|
||||
yoffset: 0;
|
||||
xoffset: 0;
|
||||
fixed-num-lines: false;
|
||||
show-icons: true;
|
||||
terminal: "xterm";
|
||||
/* run-command: "{cmd}";*/
|
||||
/* run-list-command: "";*/
|
||||
/* run-shell-command: "{terminal} -e {cmd}";*/
|
||||
/* window-command: "xkill -id {window}";*/
|
||||
window-match-fields: "all";
|
||||
drun-match-fields: "name,exec";
|
||||
case-sensitive: true;
|
||||
cycle: true;
|
||||
sidebar-mode: true;
|
||||
/* eh: 1;*/
|
||||
auto-select: false;
|
||||
combi-modi: "window,drun";
|
||||
matching: "regex";
|
||||
/* tokenize: true;*/
|
||||
/* m: "-5";*/
|
||||
/* filter: ;*/
|
||||
hide-scrollbar: true;
|
||||
fullscreen: false;
|
||||
/* dpi: -1;*/
|
||||
threads: 0;
|
||||
/* scroll-method: 0;*/
|
||||
window-format: "{w:0} {n:0} {t:0}";
|
||||
click-to-exit: true;
|
||||
show-match: true;
|
||||
theme: "~/.config/rofi/themes/modus-themes-active.rasi";
|
||||
max-history-size: 25;
|
||||
combi-hide-mode-prefix: true;
|
||||
/* pid: "/run/user/1000/rofi.pid";*/
|
||||
display-window: "Windows";
|
||||
/* display-windowcd: ;*/
|
||||
display-run: "Executables";
|
||||
/* display-ssh: ;*/
|
||||
display-drun: "Applications";
|
||||
display-combi: "Combined";
|
||||
/* display-keys: ;*/
|
||||
kb-primary-paste: "Control+Y";
|
||||
kb-secondary-paste: "Control+y";
|
||||
kb-clear-line: "Control+Shift+BackSpace";
|
||||
kb-move-front: "Control+a";
|
||||
kb-move-end: "Control+e";
|
||||
kb-move-word-back: "Alt+b";
|
||||
kb-move-word-forward: "Alt+f";
|
||||
kb-move-char-back: "Left,Control+b";
|
||||
kb-move-char-forward: "Right,Control+f";
|
||||
kb-remove-word-back: "Control+BackSpace";
|
||||
kb-remove-word-forward: "Alt+d";
|
||||
kb-remove-char-forward: "Delete,Control+d";
|
||||
kb-remove-char-back: "BackSpace";
|
||||
kb-remove-to-eol: "Control+k";
|
||||
kb-remove-to-sol: "Control+K";
|
||||
kb-accept-entry: "Control+j,Control+m,Return,KP_Enter";
|
||||
/* kb-accept-custom: "Control+Return";*/
|
||||
/* kb-accept-alt: "Shift+Return";*/
|
||||
/* kb-delete-entry: "Shift+Delete";*/
|
||||
/* kb-mode-next: "Shift+Right,Control+Tab";*/
|
||||
/* kb-mode-previous: "Shift+Left,Control+ISO_Left_Tab";*/
|
||||
/* kb-row-left: "Control+Page_Up";*/
|
||||
/* kb-row-right: "Control+Page_Down";*/
|
||||
/* kb-row-up: "Up,Control+p,ISO_Left_Tab";*/
|
||||
/* kb-row-down: "Down,Control+n";*/
|
||||
/* kb-row-tab: "Tab";*/
|
||||
kb-page-prev: "Alt+v,Page_Up";
|
||||
kb-page-next: "Control+v,Page_Down";
|
||||
kb-row-first: "Alt+less,Home,KP_Home";
|
||||
kb-row-last: "Alt+greater,End,KP_End";
|
||||
/* kb-row-select: "Control+space";*/
|
||||
/* kb-screenshot: "Alt+S";*/
|
||||
/* kb-toggle-case-sensitivity: "grave,dead_grave";*/
|
||||
/* kb-toggle-sort: "Alt+grave";*/
|
||||
/* kb-cancel: "Escape,Control+g,Control+bracketleft";*/
|
||||
/* kb-custom-1: "Alt+1";*/
|
||||
/* kb-custom-2: "Alt+2";*/
|
||||
/* kb-custom-3: "Alt+3";*/
|
||||
/* kb-custom-4: "Alt+4";*/
|
||||
/* kb-custom-5: "Alt+5";*/
|
||||
/* kb-custom-6: "Alt+6";*/
|
||||
/* kb-custom-7: "Alt+7";*/
|
||||
/* kb-custom-8: "Alt+8";*/
|
||||
/* kb-custom-9: "Alt+9";*/
|
||||
/* kb-custom-10: "Alt+0";*/
|
||||
/* kb-custom-11: "Alt+exclam";*/
|
||||
/* kb-custom-12: "Alt+at";*/
|
||||
/* kb-custom-13: "Alt+numbersign";*/
|
||||
/* kb-custom-14: "Alt+dollar";*/
|
||||
/* kb-custom-15: "Alt+percent";*/
|
||||
/* kb-custom-16: "Alt+dead_circumflex";*/
|
||||
/* kb-custom-17: "Alt+ampersand";*/
|
||||
/* kb-custom-18: "Alt+asterisk";*/
|
||||
/* kb-custom-19: "Alt+parenleft";*/
|
||||
/* kb-select-1: "Super+1";*/
|
||||
/* kb-select-2: "Super+2";*/
|
||||
/* kb-select-3: "Super+3";*/
|
||||
/* kb-select-4: "Super+4";*/
|
||||
/* kb-select-5: "Super+5";*/
|
||||
/* kb-select-6: "Super+6";*/
|
||||
/* kb-select-7: "Super+7";*/
|
||||
/* kb-select-8: "Super+8";*/
|
||||
/* kb-select-9: "Super+9";*/
|
||||
/* kb-select-10: "Super+0";*/
|
||||
/* ml-row-left: "ScrollLeft";*/
|
||||
/* ml-row-right: "ScrollRight";*/
|
||||
/* ml-row-up: "ScrollUp";*/
|
||||
/* ml-row-down: "ScrollDown";*/
|
||||
/* me-select-entry: "MousePrimary";*/
|
||||
/* me-accept-entry: "MouseDPrimary";*/
|
||||
/* me-accept-custom: "Control+MouseDPrimary";*/
|
||||
}
|
||||
34
rofi/.config/rofi/themes/modus-operandi.rasi
Normal file
34
rofi/.config/rofi/themes/modus-operandi.rasi
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
/**
|
||||
* rofi -dump-theme output.
|
||||
* Rofi version: 1.6.1
|
||||
* User: Protesilaos Stavrou
|
||||
* Copyright: Protesilaos Stavrou --- Released under the GNU GPLv3
|
||||
* Comment: Simple port of the Modus Operandi theme for Emacs (https://protesilaos.com/modus-themes)
|
||||
**/
|
||||
|
||||
* {
|
||||
/* Custom colours */
|
||||
bg-alt: #f0f0f0ff;
|
||||
bg-main: #ffffffff;
|
||||
fg-alt: #505050ff;
|
||||
fg-main: #000000ff;
|
||||
red: #a60000ff;
|
||||
green: #005e00ff;
|
||||
yellow: #813e00ff;
|
||||
blue: #0031a9ff;
|
||||
magenta: #721045ff;
|
||||
cyan: #00538bff;
|
||||
red-bright: #b60000ff;
|
||||
green-bright: #006800ff;
|
||||
yellow-bright: #605b00ff;
|
||||
blue-bright: #1f1fceff;
|
||||
magenta-bright: #a8007fff;
|
||||
cyan-bright: #005f88ff;
|
||||
selection-bg: #b0d8ffff;
|
||||
|
||||
/* Global properties */
|
||||
background-color: rgba (0,0,0, 0%);
|
||||
highlight: bold underline #1f1fce;
|
||||
}
|
||||
|
||||
@import "modus-themes-common.rasi"
|
||||
1
rofi/.config/rofi/themes/modus-themes-active.rasi
Normal file
1
rofi/.config/rofi/themes/modus-themes-active.rasi
Normal file
|
|
@ -0,0 +1 @@
|
|||
@import "modus-operandi.rasi"
|
||||
136
rofi/.config/rofi/themes/modus-themes-common.rasi
Normal file
136
rofi/.config/rofi/themes/modus-themes-common.rasi
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
/**
|
||||
* rofi -dump-theme output.
|
||||
* Rofi version: 1.6.1
|
||||
* User: Protesilaos Stavrou
|
||||
* Copyright: Protesilaos Stavrou --- Released under the GNU GPLv3
|
||||
* Comment: Simple port of the Modus themes for Emacs (https://protesilaos.com/modus-themes)
|
||||
**/
|
||||
|
||||
window {
|
||||
background-color: @bg-main;
|
||||
border: 2px 0 0;
|
||||
border-color: @fg-alt;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
mainbox {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
message {
|
||||
border: 2px solid 0px 0px;
|
||||
border-color: @fg-alt;
|
||||
padding: 1px ;
|
||||
}
|
||||
|
||||
textbox {
|
||||
text-color: @fg-main;
|
||||
}
|
||||
|
||||
listview {
|
||||
fixed-height: 0;
|
||||
border: 2px solid 0px 0px;
|
||||
border-color: @bg-alt;
|
||||
spacing: 4px;
|
||||
scrollbar: true;
|
||||
padding: 2px 0px 0px;
|
||||
}
|
||||
|
||||
element {
|
||||
border: 0;
|
||||
padding: 1px;
|
||||
}
|
||||
|
||||
element.normal.normal {
|
||||
background-color: @bg-main;
|
||||
text-color: @fg-main;
|
||||
}
|
||||
|
||||
element.normal.urgent {
|
||||
background-color: @red;
|
||||
text-color: @bg-alt;
|
||||
}
|
||||
|
||||
element.normal.active {
|
||||
background-color: @bg-alt;
|
||||
text-color: @fg-alt;
|
||||
}
|
||||
|
||||
element.selected.normal {
|
||||
background-color: @selection-bg;
|
||||
text-color: @fg-main;
|
||||
}
|
||||
|
||||
element.selected.urgent {
|
||||
background-color: @red-bright;
|
||||
text-color: @bg-main;
|
||||
}
|
||||
|
||||
element.selected.active {
|
||||
background-color: @blue;
|
||||
text-color: @bg-main;
|
||||
}
|
||||
|
||||
element.alternate.normal {
|
||||
background-color: @bg-main;
|
||||
text-color: @fg-main;
|
||||
}
|
||||
|
||||
element.alternate.urgent {
|
||||
background-color: @red-bright;
|
||||
text-color: @bg-alt;
|
||||
}
|
||||
|
||||
element alternate.active {
|
||||
background-color: @cyan-bright;
|
||||
text-color: @bg-alt;
|
||||
}
|
||||
|
||||
mode-switcher {
|
||||
border: 2px dash 0px 0px ;
|
||||
border-color: @bg-alt;
|
||||
}
|
||||
|
||||
scrollbar {
|
||||
/* width: 4px; */
|
||||
width: 0;
|
||||
border: 0;
|
||||
handle-color: @fg-alt;
|
||||
/* handle-width: 8px; */
|
||||
handle-width: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
sidebar {
|
||||
border: 2px solid 0px 0px;
|
||||
border-color: @fg-alt;
|
||||
}
|
||||
|
||||
button {
|
||||
spacing: 0;
|
||||
background-color: @bg-main;
|
||||
text-color: @fg-alt;
|
||||
}
|
||||
|
||||
button.selected {
|
||||
background-color: @bg-alt;
|
||||
text-color: @fg-main;
|
||||
}
|
||||
|
||||
inputbar {
|
||||
spacing: 10;
|
||||
padding: 1px;
|
||||
text-color: @fg-main;
|
||||
children: [ prompt,entry ];
|
||||
}
|
||||
|
||||
prompt {
|
||||
spacing: 0;
|
||||
text-color: @cyan;
|
||||
}
|
||||
|
||||
entry {
|
||||
spacing: 0;
|
||||
text-color: @fg-main;
|
||||
}
|
||||
34
rofi/.config/rofi/themes/modus-vivendi.rasi
Normal file
34
rofi/.config/rofi/themes/modus-vivendi.rasi
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
/**
|
||||
* rofi -dump-theme output.
|
||||
* Rofi version: 1.6.1
|
||||
* User: Protesilaos Stavrou
|
||||
* Copyright: Protesilaos Stavrou --- Released under the GNU GPLv3
|
||||
* Comment: Simple port of the Modus Operandi theme for Emacs (https://protesilaos.com/modus-themes)
|
||||
**/
|
||||
|
||||
* {
|
||||
/* Custom colours */
|
||||
bg-alt: #191a1bff;
|
||||
bg-main: #000000ff;
|
||||
fg-alt: #a8a8a8ff;
|
||||
fg-main: #ffffffff;
|
||||
red: #ff8059ff;
|
||||
green: #44bc44ff;
|
||||
yellow: #d0bc00ff;
|
||||
blue: #2fafffff;
|
||||
magenta: #feacd0ff;
|
||||
cyan: #00d3d0ff;
|
||||
red-bright: #fe6060ff;
|
||||
green-bright: #4fe42fff;
|
||||
yellow-bright: #f0dd60ff;
|
||||
blue-bright: #4fafffff;
|
||||
magenta-bright: #ff62d4ff;
|
||||
cyan-bright: #3fdfd0ff;
|
||||
selection-bg: #103265ff;
|
||||
|
||||
/* Global properties */
|
||||
background-color: rgba (0,0,0, 0%);
|
||||
highlight: bold underline #4fafff;
|
||||
}
|
||||
|
||||
@import "modus-themes-common.rasi"
|
||||
57
xorg/.profile
Normal file
57
xorg/.profile
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
# .profile --- Initialisation script for display managers.
|
||||
#
|
||||
# Copyright (c) 2020 Protesilaos Stavrou <info@protesilaos.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
## Commentary:
|
||||
#
|
||||
# This script is read by a graphical display manager when logging into
|
||||
# the session. It is conceptually similar to `.xinitrc' and I am
|
||||
# considering it as practically equivalent to it for the ordinary
|
||||
# functioning of my custom desktop session. Refer to my dotfiles for
|
||||
# the specifics: https://gitlab.com/protesilaos/dotfiles
|
||||
|
||||
|
||||
###############
|
||||
# Shell setup #
|
||||
###############
|
||||
|
||||
# Source my bashrc.
|
||||
if [ -n "$BASH_VERSION" ]; then
|
||||
if [ -f "$HOME"/.bashrc ]; then
|
||||
source "$HOME"/.bashrc
|
||||
fi
|
||||
fi
|
||||
|
||||
# Set PATH so it includes user's private executables.
|
||||
if [ -d "$HOME"/bin ]; then
|
||||
PATH=$PATH:"$HOME"/bin
|
||||
fi
|
||||
|
||||
# This is another possible location for user-specific binaries.
|
||||
if [ -d "$HOME"/.local/bin ]; then
|
||||
PATH=$PATH:"$HOME"/.local/bin
|
||||
fi
|
||||
|
||||
##########################
|
||||
# Environment essentials #
|
||||
##########################
|
||||
|
||||
# Auto unlocks the GPG and SSH agents.
|
||||
eval $(/usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh)
|
||||
export SSH_AUTH_SOCK
|
||||
|
||||
# Load my XTerm and relevant configurations.
|
||||
[ -f "$HOME"/.Xresources ] && xrdb -I "$HOME" -merge "$HOME"/.Xresources
|
||||
74
xorg/.xinitrc
Normal file
74
xorg/.xinitrc
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
# xinitrc --- Initialisation script for the X server session.
|
||||
#
|
||||
# Copyright (c) 2019-2020 Protesilaos Stavrou <info@protesilaos.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
### Commentary:
|
||||
#
|
||||
# This script is a core part of my custom desktop session, centred
|
||||
# around GNU Emacs: <https://gitlab.com/protesilaos/dotfiles>.
|
||||
#
|
||||
### Code:
|
||||
|
||||
|
||||
#### Shell setup
|
||||
|
||||
# Source my bashrc.
|
||||
if [ -n "$BASH_VERSION" ]; then
|
||||
if [ -f "$HOME"/.bashrc ]; then
|
||||
source "$HOME"/.bashrc
|
||||
fi
|
||||
fi
|
||||
|
||||
# Set PATH so it includes user's private executables.
|
||||
if [ -d "$HOME"/bin ]; then
|
||||
PATH=$PATH:"$HOME"/bin
|
||||
fi
|
||||
|
||||
# This is another possible location for user-specific binaries.
|
||||
if [ -d "$HOME"/.local/bin ]; then
|
||||
PATH=$PATH:"$HOME"/.local/bin
|
||||
fi
|
||||
|
||||
#### Environment essentials
|
||||
|
||||
# Auto unlocks the GPG and SSH agents.
|
||||
eval $(/usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh)
|
||||
export SSH_AUTH_SOCK
|
||||
|
||||
#### Session selection
|
||||
|
||||
# Launch X by running:
|
||||
#
|
||||
# xinit
|
||||
# xinit xfce
|
||||
#
|
||||
# Or pass this file and the DE/WM arg to startx:
|
||||
# startx ~/.xinitrc emacs
|
||||
#
|
||||
# Also check my `.bash_profile' for the automatic login setup.
|
||||
|
||||
# Emacs is the default.
|
||||
session=${1:-bspwm}
|
||||
|
||||
#### Sessions
|
||||
|
||||
# Map arguments to commands.
|
||||
case $session in
|
||||
bspwm ) exec bspwm ;;
|
||||
mate ) exec mate-session ;;
|
||||
xfce ) exec startxfce4 ;;
|
||||
*) echo "Unknown session" ;;
|
||||
esac
|
||||
Loading…
Reference in a new issue