diff options
author | Vidhu Kant Sharma <vidhukant@vidhukant.xyz> | 2022-09-09 21:11:43 +0530 |
---|---|---|
committer | Vidhu Kant Sharma <vidhukant@vidhukant.xyz> | 2022-09-09 21:11:43 +0530 |
commit | de58295210063ed7088b411d0da8ef37b33cb863 (patch) | |
tree | 089e946d9b302db19f9f3bb9ea32554761525365 | |
parent | 3d99cb44596006f8b6cfbf0f1f0daad5e54bd164 (diff) |
switched to lemonbar
-rw-r--r-- | .config/XMonad/lib/Defaults.hs | 22 | ||||
l--------- | .config/glava/bars | 1 | ||||
-rwxr-xr-x | .config/glava/bars.glsl | 33 | ||||
l--------- | .config/glava/circle | 1 | ||||
-rwxr-xr-x | .config/glava/circle.glsl | 24 | ||||
-rwxr-xr-x | .config/glava/env_KWin.glsl | 8 | ||||
-rwxr-xr-x | .config/glava/env_Openbox.glsl | 2 | ||||
-rwxr-xr-x | .config/glava/env_Xfwm4.glsl | 3 | ||||
-rwxr-xr-x | .config/glava/env_awesome.glsl | 1 | ||||
-rwxr-xr-x | .config/glava/env_default.glsl | 1 | ||||
-rwxr-xr-x | .config/glava/env_i3.glsl | 1 | ||||
l--------- | .config/glava/graph | 1 | ||||
-rwxr-xr-x | .config/glava/graph.glsl | 31 | ||||
-rwxr-xr-x | .config/glava/radial.glsl | 10 | ||||
-rwxr-xr-x | .config/glava/smooth_parameters.glsl | 78 | ||||
l--------- | .config/glava/util | 1 | ||||
l--------- | .config/glava/wave | 1 | ||||
-rwxr-xr-x | .config/glava/wave.glsl | 14 | ||||
-rw-r--r-- | .config/lemon.go | 173 | ||||
-rw-r--r-- | .config/zsh/.zshenv | 1 | ||||
-rwxr-xr-x | .scripts/cpu_temp.sh | 3 | ||||
-rwxr-xr-x | .scripts/get_wifi_name.sh | 3 | ||||
-rwxr-xr-x | .scripts/ram_usage.sh | 3 | ||||
-rwxr-xr-x | .scripts/secondmonitor.sh | 2 | ||||
-rwxr-xr-x | .xprofile | 5 |
25 files changed, 402 insertions, 21 deletions
diff --git a/.config/XMonad/lib/Defaults.hs b/.config/XMonad/lib/Defaults.hs index 9e9d318..7e0b0a1 100644 --- a/.config/XMonad/lib/Defaults.hs +++ b/.config/XMonad/lib/Defaults.hs @@ -98,7 +98,7 @@ myGSConfig colorizer = (buildDefaultGSConfig myGSColorizer) myGridSelect = myGSConfig myGSColorizer -myLemonbarCmd = "lemonbar -g 445x28+3395+0 -f 'SauceCodePro:style=Regular:size=11' -f 'Source Han Sans JP Normal:size=11' -B '#e6100b13' -F '#9d00ff'" +myLemonbarCmd = "lemon | lemonbar -g 1920x28+1920+0 -o -2 -f 'Source Han Sans JP Normal:size=12' -B '#e6100b13' -F '#9d00ff'" myLemonbarPP = def { ppCurrent = wrap "%{B#ff0aa3} %{F#FFFFFF}" " %{F-}%{B-}" , ppVisible = wrap "%{B#28c78f} %{F#FFFFFF}" " %{F-}%{B-}" @@ -111,13 +111,13 @@ myLemonbarPP = def { } myLemonbarCmd' = "lemonbar -g 343x20+1577+0 -f 'SauceCodePro:style=Regular:size=9' -f 'Source Han Sans JP Normal:size=9' -B '#e6100b13' -F '#9d00ff'" -myLemonbarPP' = def { - ppCurrent = wrap "%{B#28c78f} %{F#FFFFFF}" " %{F-}%{B-}" - , ppVisible = wrap "%{B#ff0aa3} %{F#FFFFFF}" " %{F-}%{B-}" - , ppHidden = wrap "%{B#9b1bed} %{F#FFFFFF}" " %{F-}%{B-}" - , ppHiddenNoWindows = wrap " " " " - --, ppVisibleNoWindows = wrap "%{B#ffffff} %{F#9b1bed}" " %{F-}%{B-}" - , ppWsSep = "" - , ppSep = "" - , ppOrder = \(ws:l:t:ex) -> ["%{r}",ws]++[]++[]++ex - } +myLemonbarPP' = myLemonbarPP -- def { +-- ppCurrent = wrap "%{B#28c78f} %{F#FFFFFF}" " %{F-}%{B-}" +-- , ppVisible = wrap "%{B#ff0aa3} %{F#FFFFFF}" " %{F-}%{B-}" +-- , ppHidden = wrap "%{B#9b1bed} %{F#FFFFFF}" " %{F-}%{B-}" +-- , ppHiddenNoWindows = wrap " " " " +-- --, ppVisibleNoWindows = wrap "%{B#ffffff} %{F#9b1bed}" " %{F-}%{B-}" +-- , ppWsSep = "" +-- , ppSep = "" +-- , ppOrder = \(ws:l:t:ex) -> ["%{r}",ws]++[]++[]++ex +-- } diff --git a/.config/glava/bars b/.config/glava/bars new file mode 120000 index 0000000..09377e3 --- /dev/null +++ b/.config/glava/bars @@ -0,0 +1 @@ +/etc/xdg/glava//bars
\ No newline at end of file diff --git a/.config/glava/bars.glsl b/.config/glava/bars.glsl new file mode 100755 index 0000000..6e6a7b0 --- /dev/null +++ b/.config/glava/bars.glsl @@ -0,0 +1,33 @@ + +/* Center line thickness (pixels) */ +#define C_LINE 1 +/* Width (in pixels) of each bar */ +#define BAR_WIDTH 4 +/* Width (in pixels) of each bar gap */ +#define BAR_GAP 2 +/* Outline color */ +#define BAR_OUTLINE #262626 +/* Outline width (in pixels, set to 0 to disable outline drawing) */ +#define BAR_OUTLINE_WIDTH 0 +/* Amplify magnitude of the results each bar displays */ +#define AMPLIFY 300 +/* Whether the current settings use the alpha channel; + enabling this is required for alpha to function + correctly on X11 with `"native"` transparency. */ +#define USE_ALPHA 0 +/* How strong the gradient changes */ +#define GRADIENT_POWER 60 +/* Bar color changes with height */ +#define GRADIENT (d / GRADIENT_POWER + 1) +/* Bar color */ +#define COLOR (#3366b2 * GRADIENT) +/* Direction that the bars are facing, 0 for inward, 1 for outward */ +#define DIRECTION 0 +/* Whether to switch left/right audio buffers */ +#define INVERT 0 +/* Whether to flip the output vertically */ +#define FLIP 0 +/* Whether to mirror output along `Y = X`, causing output to render on the left side of the window */ +/* Use with `FLIP 1` to render on the right side */ +#define MIRROR_YX 0 + diff --git a/.config/glava/circle b/.config/glava/circle new file mode 120000 index 0000000..f53c651 --- /dev/null +++ b/.config/glava/circle @@ -0,0 +1 @@ +/etc/xdg/glava//circle
\ No newline at end of file diff --git a/.config/glava/circle.glsl b/.config/glava/circle.glsl new file mode 100755 index 0000000..83b8ad3 --- /dev/null +++ b/.config/glava/circle.glsl @@ -0,0 +1,24 @@ +/* center radius (pixels) */ +#define C_RADIUS 128 +/* center line thickness (pixels) */ +#define C_LINE 1.5 +/* outline color */ +#define OUTLINE #333333 +/* Amplify magnitude of the results each bar displays */ +#define AMPLIFY 150 +/* Angle (in radians) for how much to rotate the visualizer */ +#define ROTATE (PI / 2) +/* Whether to switch left/right audio buffers */ +#define INVERT 0 +/* Whether to fill in the space between the line and inner circle */ +#define C_FILL 0 +/* Whether to apply a post-processing image smoothing effect + 1 to enable, 0 to disable. Only works with `xroot` transparency, + and improves performance if disabled. */ +#define C_SMOOTH 1 + +/* Gravity step, overrude frin `smooth_parameters.glsl` */ +#request setgravitystep 6.0 + +/* Smoothing factor, override from `smooth_parameters.glsl` */ +#request setsmoothfactor 0.01 diff --git a/.config/glava/env_KWin.glsl b/.config/glava/env_KWin.glsl new file mode 100755 index 0000000..aa168ba --- /dev/null +++ b/.config/glava/env_KWin.glsl @@ -0,0 +1,8 @@ +#request setdecorated false +#request setxwintype "normal" +#request addxwinstate "below" +#request addxwinstate "skip_taskbar" +#request addxwinstate "skip_pager" +#request addxwinstate "pinned" +#request setclickthrough true + diff --git a/.config/glava/env_Openbox.glsl b/.config/glava/env_Openbox.glsl new file mode 100755 index 0000000..c95c616 --- /dev/null +++ b/.config/glava/env_Openbox.glsl @@ -0,0 +1,2 @@ +#request setxwintype "desktop" +#request addxwinstate "pinned" diff --git a/.config/glava/env_Xfwm4.glsl b/.config/glava/env_Xfwm4.glsl new file mode 100755 index 0000000..1c20359 --- /dev/null +++ b/.config/glava/env_Xfwm4.glsl @@ -0,0 +1,3 @@ +#request setxwintype "desktop" +#request addxwinstate "pinned" +#request addxwinstate "below" diff --git a/.config/glava/env_awesome.glsl b/.config/glava/env_awesome.glsl new file mode 100755 index 0000000..7f2bba3 --- /dev/null +++ b/.config/glava/env_awesome.glsl @@ -0,0 +1 @@ +#request setxwintype "!-" diff --git a/.config/glava/env_default.glsl b/.config/glava/env_default.glsl new file mode 100755 index 0000000..90336cc --- /dev/null +++ b/.config/glava/env_default.glsl @@ -0,0 +1 @@ +#request setxwintype "desktop" diff --git a/.config/glava/env_i3.glsl b/.config/glava/env_i3.glsl new file mode 100755 index 0000000..7f2bba3 --- /dev/null +++ b/.config/glava/env_i3.glsl @@ -0,0 +1 @@ +#request setxwintype "!-" diff --git a/.config/glava/graph b/.config/glava/graph new file mode 120000 index 0000000..2ad2983 --- /dev/null +++ b/.config/glava/graph @@ -0,0 +1 @@ +/etc/xdg/glava//graph
\ No newline at end of file diff --git a/.config/glava/graph.glsl b/.config/glava/graph.glsl new file mode 100755 index 0000000..546d8d4 --- /dev/null +++ b/.config/glava/graph.glsl @@ -0,0 +1,31 @@ + +/* Vertical scale, larger values will amplify output */ +#define VSCALE 300 +/* Rendering direction, either -1 (outwards) or 1 (inwards). */ +#define DIRECTION 1 + +/* Color gradient scale, (optionally) used in `COLOR` macro */ +#define GRADIENT_SCALE 75 +/* Color definition. By default this is a gradient formed by mixing two colors. + `pos` represents the pixel position relative to the visualizer baseline. */ +#define COLOR mix(#802A2A, #4F4F92, clamp(pos / GRADIENT_SCALE, 0, 1)) +/* 1 to draw outline, 0 to disable */ +#define DRAW_OUTLINE 0 +/* 1 to draw edge highlight, 0 to disable */ +#define DRAW_HIGHLIGHT 1 +/* Whether to anti-alias the border of the graph, creating a smoother curve. + This may have a small impact on performance. + Note: requires `xroot` or `none` opacity to be set */ +#define ANTI_ALIAS 0 +/* outline color */ +#define OUTLINE #262626 +/* 1 to join the two channels together in the middle, 0 to clamp both down to zero */ +#define JOIN_CHANNELS 0 +/* 1 to invert (vertically), 0 otherwise */ +#define INVERT 0 + +/* Gravity step, overrude from `smooth_parameters.glsl` */ +#request setgravitystep 2.4 + +/* Smoothing factor, override from `smooth_parameters.glsl` */ +#request setsmoothfactor 0.015 diff --git a/.config/glava/radial.glsl b/.config/glava/radial.glsl index 06431f2..1209c7d 100755 --- a/.config/glava/radial.glsl +++ b/.config/glava/radial.glsl @@ -1,6 +1,6 @@ /* center radius (pixels) */ -#define C_RADIUS 128 +#define C_RADIUS 70 /* center line thickness (pixels) */ #define C_LINE 1 /* outline color */ @@ -28,12 +28,12 @@ #define BAR_ALIAS_FACTOR 100 #define C_ALIAS_FACTOR 1 /* Offset (Y) of the visualization */ -#define CENTER_OFFSET_Y 290 +#define CENTER_OFFSET_Y 190 /* Offset (X) of the visualization */ -#define CENTER_OFFSET_X 690 +#define CENTER_OFFSET_X 590 /* Gravity step, override from `smooth_parameters.glsl` */ -#request setgravitystep 8 +#request setgravitystep 12 /* Smoothing factor, override from `smooth_parameters.glsl` */ -#request setsmoothfactor 0.03 +#request setsmoothfactor 0.02 diff --git a/.config/glava/smooth_parameters.glsl b/.config/glava/smooth_parameters.glsl new file mode 100755 index 0000000..bfea307 --- /dev/null +++ b/.config/glava/smooth_parameters.glsl @@ -0,0 +1,78 @@ + +/* Settings for smoothing functions and transformations commonly + used to display FFT output. + + IMPORTANT: THESE VALUES CAN BE OVERRIDDEN IN MODULE CONFIG + FILES, IF CHANGING VALUES HERE DOES NOT WORK, CHECK + TO MAKE SURE THEY ARE NOT BEING SET ELSEWHERE. +*/ + +/* The type of formula to use for weighting values when smoothing. + Possible values: + + - circular heavily rounded points + - sinusoidal rounded at both low and high weighted values + like a sine wave + - linear not rounded at all; linear distance + */ +#define ROUND_FORMULA sinusoidal + +/* The sampling mode for processing raw FFT input: + + - average averages all the inputs in the sample range for + a given point. Produces smooth output, but peaks + are not well represented + - maximum obtains the best value from the closest peak in + the sample range. Very accurate peaks, but + output is jagged and sporadic. + - hybrid uses the results from both `average` and `maximum` + with the weight provided in `SAMPLE_HYBRID_WEIGHT` */ +#define SAMPLE_MODE average +/* Weight should be provided in the range (0, 1). Higher values favour + averaged results. `hybrid` mode only. */ +#define SAMPLE_HYBRID_WEIGHT 0.65 + +/* Factor used to scale frequencies. Lower values allows lower + frequencies to occupy more space. */ +#define SAMPLE_SCALE 8 + +/* The frequency range to sample. 1.0 would be the entire FFT output, + and lower values reduce the displayed frequencies in a log-like + scale. */ +#define SAMPLE_RANGE 0.9 + +/* Factor for how to scale higher frequencies. Used in a linear equation + which is multiplied by the result of the fft transformation. */ +#request setfftscale 10.2 + +/* Cutoff for the bass end of the audio data when scaling frequencies. + Higher values cause more of the bass frequencies to be skipped when + scaling. */ +#request setfftcutoff 0.3 + +/* How many frames to queue and run through the average function. + Increasing this value will create latency between the audio and the + animation, but will make for much smoother results. */ +#request setavgframes 6 + +/* Whether to window frames ran through the average function (new & old + frames are weighted less). This massively helps smoothing out + spontaneous values in the animation. */ +#request setavgwindow true + +/* Gravity step, higher values means faster drops. The step is applied + in a rate independant method like so: + + val -= (gravitystep) * (seconds per update) */ +#request setgravitystep 4.2 + +/* Smoothing factor. Larger values mean more smoothing in the output, + however high values can be expensive to compute. Values are in + normalized width: [0.0, 1.0) */ +#request setsmoothfactor 0.025 + +/* Whether to use a separate pass for audio data while smoothing. On + most hardware, this will improve performance, but involves doing a + separate render step for each audio texture and will add some driver + (CPU) overhead. */ +#request setsmoothpass true diff --git a/.config/glava/util b/.config/glava/util new file mode 120000 index 0000000..3cbab73 --- /dev/null +++ b/.config/glava/util @@ -0,0 +1 @@ +/etc/xdg/glava//util
\ No newline at end of file diff --git a/.config/glava/wave b/.config/glava/wave new file mode 120000 index 0000000..3cba0de --- /dev/null +++ b/.config/glava/wave @@ -0,0 +1 @@ +/etc/xdg/glava//wave
\ No newline at end of file diff --git a/.config/glava/wave.glsl b/.config/glava/wave.glsl new file mode 100755 index 0000000..6a59fbe --- /dev/null +++ b/.config/glava/wave.glsl @@ -0,0 +1,14 @@ +/* min (vertical) line thickness */ +#define MIN_THICKNESS 1 + +/* max (vertical) line thickness */ +#define MAX_THICKNESS 6 + +/* base color to use, distance from center will multiply the RGB components */ +#define BASE_COLOR vec4(0.7, 0.2, 0.45, 1) + +/* amplitude */ +#define AMPLIFY 500 + +/* outline color */ +#define OUTLINE vec4(0.15, 0.15, 0.15, 1) diff --git a/.config/lemon.go b/.config/lemon.go new file mode 100644 index 0000000..d242ccb --- /dev/null +++ b/.config/lemon.go @@ -0,0 +1,173 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "time" + "golang.org/x/sys/unix" + "os/exec" + "strconv" + "strings" + "io/ioutil" +) + +var ( + data, connectedWiFi, memPercentage, cpuTemp, cpuPercentage string + text string = "\n" + moduleColor0, moduleColor1 string = "#9b1bed", "#ff0aa3" +) + +func dataLoop() { + for { + data = getData() + time.Sleep(time.Second / 10) + } +} + +func stdinLoop() { + reader := bufio.NewReader(os.Stdin) + for { + text, _ = reader.ReadString('\n') + } +} + +func main() { + go dataLoop() + go stdinLoop() + go cpuUsageLoop() + go connectedWiFiLoop() + go memUsageLoop() + go cpuTempLoop() + + for { + fmt.Print(data + text) + time.Sleep(time.Second / 10) + } +} + +// TODO +// volume +// brightness (new) +// battery + +func getData() string { + time := "%{F" + moduleColor0 + "} " + getTime() + "%{F-} " + wifiName := "%{F" + moduleColor1 + "} WiFI: " + connectedWiFi + "%{F-} " + rootFree := "%{F" + moduleColor0 + "} / " + getDisk("/") + "%%%{F-} " + homeFree := "%{F" + moduleColor1 + "} /home " + getDisk("/home") + "%%%{F-} " + hddFree := "%{F" + moduleColor0 + "} /hdd " + getDisk("/hdd") + "%%%{F-} " + cpuUsage := "%{F" + moduleColor1 + "} CPU: " + cpuPercentage + "%%%{F-} " + cpuTemp := "%{F" + moduleColor0 + "} TEMP: " + cpuTemp + "%%{F-} " + memUsage := "%{F" + moduleColor1 + "} MEM: " + memPercentage + "%%{F-} " + + return time + wifiName + rootFree + homeFree + hddFree + cpuUsage + cpuTemp + memUsage +} + +func getWiFiName() string { + // script located in ~/.scripts/ + // look at github.com/MikunoNaka/dots + cmd := exec.Command("get_wifi_name.sh") + name, _ := cmd.Output() + return string(name) +} + +func connectedWiFiLoop() { + for { + connectedWiFi = getWiFiName() + time.Sleep(time.Second * 15) + } +} + +func getMemUsage() string { + // script located in ~/.scripts/ + // look at github.com/MikunoNaka/dots + cmd := exec.Command("ram_usage.sh") + usage, _ := cmd.Output() + return string(usage) +} + +func memUsageLoop() { + for { + memPercentage = getMemUsage() + time.Sleep(time.Second * 5) + } +} + +func getCPUTemp() string { + // script located in ~/.scripts/ + // look at github.com/MikunoNaka/dots + cmd := exec.Command("cpu_temp.sh") + temp, _ := cmd.Output() + return string(temp) +} + +func cpuTempLoop() { + for { + cpuTemp = getCPUTemp() + time.Sleep(time.Second * 5) + } +} + +// TODO: maybe add dates on click +func getTime() string { + now := time.Now() + return now.Format("3:04 PM") +} + +// TODO: maybe show percentages instead of free space +func getDisk(mountPoint string) string { + var stat unix.Statfs_t + unix.Statfs(mountPoint, &stat) + + // this is witchcraft. I wrote this but I have -10000 idea how AND IF it works + totalSize := float64(stat.Blocks) * float64(stat.Bsize) / 1073741824 + usedSpace := float64(stat.Bfree) * float64(stat.Bsize) / 1073741824 + + return strconv.FormatFloat((100 - (usedSpace / totalSize) * 100), 'f', 0, 64) +} + +func getCPUSample() (idle, total uint64) { + contents, err := ioutil.ReadFile("/proc/stat") + if err != nil { + return + } + lines := strings.Split(string(contents), "\n") + for _, line := range(lines) { + fields := strings.Fields(line) + if fields[0] == "cpu" { + numFields := len(fields) + for i := 1; i < numFields; i++ { + val, err := strconv.ParseUint(fields[i], 10, 64) + if err != nil { + fmt.Println("Error: ", i, fields[i], err) + } + total += val // tally up all the numbers to get total ticks + if i == 4 { // idle is the 5th field in the cpu line + idle = val + } + } + return + } + } + return +} + +func getCPUUsage() { + idle0, total0 := getCPUSample() + time.Sleep(3 * time.Second) + idle1, total1 := getCPUSample() + + idleTicks := float64(idle1 - idle0) + totalTicks := float64(total1 - total0) + cpuUsage := 100 * (totalTicks - idleTicks) / totalTicks + + cpuPercentage = strconv.Itoa(int(cpuUsage)) +} + +func cpuUsageLoop() { + for { + getCPUUsage() + time.Sleep(5 * time.Second) + } +} diff --git a/.config/zsh/.zshenv b/.config/zsh/.zshenv index 77f8e54..28b7330 100644 --- a/.config/zsh/.zshenv +++ b/.config/zsh/.zshenv @@ -1,7 +1,6 @@ export EDITOR="nvim" export VISUAL="emacs" export TERMINAL="st" -# export BROWSER="librewolf" export BROWSER="librewolf --private-window" export READER="zathura" export COLORTERM="truecolor" diff --git a/.scripts/cpu_temp.sh b/.scripts/cpu_temp.sh new file mode 100755 index 0000000..f2dd2b6 --- /dev/null +++ b/.scripts/cpu_temp.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +acpi -t | awk '{ print $4 }' | sed 's/\../%/' | tr -d '\n' diff --git a/.scripts/get_wifi_name.sh b/.scripts/get_wifi_name.sh new file mode 100755 index 0000000..57d44a3 --- /dev/null +++ b/.scripts/get_wifi_name.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +nmcli -t -f active,ssid dev wifi | grep -e '^yes' | cut -d\' -f2 | sed 's/^yes://' | tr -d '\n' diff --git a/.scripts/ram_usage.sh b/.scripts/ram_usage.sh new file mode 100755 index 0000000..b611831 --- /dev/null +++ b/.scripts/ram_usage.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +free | awk '/^Mem/ { printf("%.0f%\n", $3/$2 * 100.0) }' | tr -d '\n' diff --git a/.scripts/secondmonitor.sh b/.scripts/secondmonitor.sh index ca7fac6..84a5960 100755 --- a/.scripts/secondmonitor.sh +++ b/.scripts/secondmonitor.sh @@ -1,2 +1,2 @@ #!/bin/sh -xrandr --output HDMI-0 --dpi 120 --mode 1920x1080 --pos 0x0 --rotate normal --output eDP-1-1 --dpi 120 --primary --mode 1920x1080 --pos 1920x679 --rotate normal +xrandr --output HDMI-0 --mode 1920x1080 --pos 0x0 --rotate normal --output eDP-1-1 --primary --mode 1920x1080 --pos 1920x673 --rotate normal @@ -18,12 +18,11 @@ dbus-update-activation-environment --all xmodmap /home/zt/.Xmodmap & # autostart apps +secondmonitor.sh & blueman-applet & picom & dunst & -nitrogen --restore & emacs --daemon & udiskie & polystart & -# xrandr | grep "HDMI-0 connected" && secondmonitor.sh -# secondmonitor.sh +nitrogen --restore & |