commit
8c6254bb7e
@ -0,0 +1,17 @@ |
|||||||
|
Config { font = "-*-Fixed-Bold-R-Normal-*-13-*-*-*-*-*-*-*" |
||||||
|
, bgColor = "black" |
||||||
|
, fgColor = "grey" |
||||||
|
, position = BottomW L 90 |
||||||
|
, commands = [Run Cpu ["-L","3","-H","50","--normal","green","--high","red", "-p", "3"] 10 |
||||||
|
, Run Memory ["-t","Mem: <usedratio>%"] 10 |
||||||
|
, Run Swap [] 10 |
||||||
|
, Run Date "%a %b %_d %H:%M" "date" 10 |
||||||
|
, Run Battery ["-t", "<acstatus>", "-L", "10", "-H", "80", "-l", "red", "-h", "green", "--", "-O", "<fc=blue><left>%</fc>", "-i", "<fc=blue><left>%</fc>", "-o", "Bat: <left>% / <timeleft>"] 10 |
||||||
|
, Run Locks |
||||||
|
, Run Com "python" ["/home/lars/.xmonad/xmonad-pulsevolume/show-volume.py"] "vol" 1 |
||||||
|
, Run StdinReader |
||||||
|
] |
||||||
|
, sepChar = "%" |
||||||
|
, alignSep = "}{" |
||||||
|
, template = "%StdinReader% }{ <action=`pavucontrol`>%vol%</action> | %locks% | <action=`gnome-power-statistics`>%battery%</action> | <action=`gnome-system-monitor`>%cpu% | %memory% * %swap%</action> | <fc=#ee9a00>%date%</fc>" |
||||||
|
} |
@ -0,0 +1,24 @@ |
|||||||
|
#!/bin/bash |
||||||
|
set -e |
||||||
|
trap 'xmessage -nearmouse "WARNING: battery monitor died!"' EXIT |
||||||
|
was_notified=0 |
||||||
|
while true; do |
||||||
|
acpi_data=$(acpi -b) |
||||||
|
status=$(echo -n "$acpi_data" | awk -F'[,:%]' '{print $2}') |
||||||
|
capacity=$(echo -n "$acpi_data" | awk -F'[,:%]' '{print $3}') |
||||||
|
echo "Status: $status; Capacity: $capacity; was_notified: $was_notified" |
||||||
|
if [[ "$status" =~ "Charging" ]]; then |
||||||
|
was_notified=0 |
||||||
|
fi |
||||||
|
if [[ "$status" =~ "Discharging" && "$capacity" -lt 25 && "$was_notified" = 0 ]]; then |
||||||
|
xmessage -nearmouse "$acpi_data"& |
||||||
|
was_notified=1 |
||||||
|
fi |
||||||
|
if [[ "$status" =~ "Discharging" && "$capacity" -lt 15 ]]; then |
||||||
|
bash -c 'echo "Battery critical, suspending"; acpi -b' | xmessage -nearmouse -file -& |
||||||
|
sleep 5 |
||||||
|
systemctl hibernate |
||||||
|
fi |
||||||
|
sleep 10 |
||||||
|
done |
||||||
|
|
@ -0,0 +1,202 @@ |
|||||||
|
Apache License |
||||||
|
Version 2.0, January 2004 |
||||||
|
http://www.apache.org/licenses/ |
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION |
||||||
|
|
||||||
|
1. Definitions. |
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction, |
||||||
|
and distribution as defined by Sections 1 through 9 of this document. |
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by |
||||||
|
the copyright owner that is granting the License. |
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all |
||||||
|
other entities that control, are controlled by, or are under common |
||||||
|
control with that entity. For the purposes of this definition, |
||||||
|
"control" means (i) the power, direct or indirect, to cause the |
||||||
|
direction or management of such entity, whether by contract or |
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the |
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity. |
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity |
||||||
|
exercising permissions granted by this License. |
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications, |
||||||
|
including but not limited to software source code, documentation |
||||||
|
source, and configuration files. |
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical |
||||||
|
transformation or translation of a Source form, including but |
||||||
|
not limited to compiled object code, generated documentation, |
||||||
|
and conversions to other media types. |
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or |
||||||
|
Object form, made available under the License, as indicated by a |
||||||
|
copyright notice that is included in or attached to the work |
||||||
|
(an example is provided in the Appendix below). |
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object |
||||||
|
form, that is based on (or derived from) the Work and for which the |
||||||
|
editorial revisions, annotations, elaborations, or other modifications |
||||||
|
represent, as a whole, an original work of authorship. For the purposes |
||||||
|
of this License, Derivative Works shall not include works that remain |
||||||
|
separable from, or merely link (or bind by name) to the interfaces of, |
||||||
|
the Work and Derivative Works thereof. |
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including |
||||||
|
the original version of the Work and any modifications or additions |
||||||
|
to that Work or Derivative Works thereof, that is intentionally |
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner |
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of |
||||||
|
the copyright owner. For the purposes of this definition, "submitted" |
||||||
|
means any form of electronic, verbal, or written communication sent |
||||||
|
to the Licensor or its representatives, including but not limited to |
||||||
|
communication on electronic mailing lists, source code control systems, |
||||||
|
and issue tracking systems that are managed by, or on behalf of, the |
||||||
|
Licensor for the purpose of discussing and improving the Work, but |
||||||
|
excluding communication that is conspicuously marked or otherwise |
||||||
|
designated in writing by the copyright owner as "Not a Contribution." |
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity |
||||||
|
on behalf of whom a Contribution has been received by Licensor and |
||||||
|
subsequently incorporated within the Work. |
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of |
||||||
|
this License, each Contributor hereby grants to You a perpetual, |
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
||||||
|
copyright license to reproduce, prepare Derivative Works of, |
||||||
|
publicly display, publicly perform, sublicense, and distribute the |
||||||
|
Work and such Derivative Works in Source or Object form. |
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of |
||||||
|
this License, each Contributor hereby grants to You a perpetual, |
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
||||||
|
(except as stated in this section) patent license to make, have made, |
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work, |
||||||
|
where such license applies only to those patent claims licensable |
||||||
|
by such Contributor that are necessarily infringed by their |
||||||
|
Contribution(s) alone or by combination of their Contribution(s) |
||||||
|
with the Work to which such Contribution(s) was submitted. If You |
||||||
|
institute patent litigation against any entity (including a |
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work |
||||||
|
or a Contribution incorporated within the Work constitutes direct |
||||||
|
or contributory patent infringement, then any patent licenses |
||||||
|
granted to You under this License for that Work shall terminate |
||||||
|
as of the date such litigation is filed. |
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the |
||||||
|
Work or Derivative Works thereof in any medium, with or without |
||||||
|
modifications, and in Source or Object form, provided that You |
||||||
|
meet the following conditions: |
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or |
||||||
|
Derivative Works a copy of this License; and |
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices |
||||||
|
stating that You changed the files; and |
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works |
||||||
|
that You distribute, all copyright, patent, trademark, and |
||||||
|
attribution notices from the Source form of the Work, |
||||||
|
excluding those notices that do not pertain to any part of |
||||||
|
the Derivative Works; and |
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its |
||||||
|
distribution, then any Derivative Works that You distribute must |
||||||
|
include a readable copy of the attribution notices contained |
||||||
|
within such NOTICE file, excluding those notices that do not |
||||||
|
pertain to any part of the Derivative Works, in at least one |
||||||
|
of the following places: within a NOTICE text file distributed |
||||||
|
as part of the Derivative Works; within the Source form or |
||||||
|
documentation, if provided along with the Derivative Works; or, |
||||||
|
within a display generated by the Derivative Works, if and |
||||||
|
wherever such third-party notices normally appear. The contents |
||||||
|
of the NOTICE file are for informational purposes only and |
||||||
|
do not modify the License. You may add Your own attribution |
||||||
|
notices within Derivative Works that You distribute, alongside |
||||||
|
or as an addendum to the NOTICE text from the Work, provided |
||||||
|
that such additional attribution notices cannot be construed |
||||||
|
as modifying the License. |
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and |
||||||
|
may provide additional or different license terms and conditions |
||||||
|
for use, reproduction, or distribution of Your modifications, or |
||||||
|
for any such Derivative Works as a whole, provided Your use, |
||||||
|
reproduction, and distribution of the Work otherwise complies with |
||||||
|
the conditions stated in this License. |
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise, |
||||||
|
any Contribution intentionally submitted for inclusion in the Work |
||||||
|
by You to the Licensor shall be under the terms and conditions of |
||||||
|
this License, without any additional terms or conditions. |
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify |
||||||
|
the terms of any separate license agreement you may have executed |
||||||
|
with Licensor regarding such Contributions. |
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade |
||||||
|
names, trademarks, service marks, or product names of the Licensor, |
||||||
|
except as required for reasonable and customary use in describing the |
||||||
|
origin of the Work and reproducing the content of the NOTICE file. |
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or |
||||||
|
agreed to in writing, Licensor provides the Work (and each |
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS, |
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
||||||
|
implied, including, without limitation, any warranties or conditions |
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A |
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the |
||||||
|
appropriateness of using or redistributing the Work and assume any |
||||||
|
risks associated with Your exercise of permissions under this License. |
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory, |
||||||
|
whether in tort (including negligence), contract, or otherwise, |
||||||
|
unless required by applicable law (such as deliberate and grossly |
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be |
||||||
|
liable to You for damages, including any direct, indirect, special, |
||||||
|
incidental, or consequential damages of any character arising as a |
||||||
|
result of this License or out of the use or inability to use the |
||||||
|
Work (including but not limited to damages for loss of goodwill, |
||||||
|
work stoppage, computer failure or malfunction, or any and all |
||||||
|
other commercial damages or losses), even if such Contributor |
||||||
|
has been advised of the possibility of such damages. |
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing |
||||||
|
the Work or Derivative Works thereof, You may choose to offer, |
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity, |
||||||
|
or other liability obligations and/or rights consistent with this |
||||||
|
License. However, in accepting such obligations, You may act only |
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf |
||||||
|
of any other Contributor, and only if You agree to indemnify, |
||||||
|
defend, and hold each Contributor harmless for any liability |
||||||
|
incurred by, or claims asserted against, such Contributor by reason |
||||||
|
of your accepting any such warranty or additional liability. |
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS |
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work. |
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following |
||||||
|
boilerplate notice, with the fields enclosed by brackets "{}" |
||||||
|
replaced with your own identifying information. (Don't include |
||||||
|
the brackets!) The text should be enclosed in the appropriate |
||||||
|
comment syntax for the file format. We also recommend that a |
||||||
|
file or class name and description of purpose be included on the |
||||||
|
same "printed page" as the copyright notice for easier |
||||||
|
identification within third-party archives. |
||||||
|
|
||||||
|
Copyright {yyyy} {name of copyright owner} |
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
you may not use this file except in compliance with the License. |
||||||
|
You may obtain a copy of the License at |
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software |
||||||
|
distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
See the License for the specific language governing permissions and |
||||||
|
limitations under the License. |
||||||
|
|
@ -0,0 +1,72 @@ |
|||||||
|
# xmonad-pulsevolume |
||||||
|
Scripts for setting and visualizing pulseaudio volume with XMonad+xmobar (and maybe others). |
||||||
|
|
||||||
|
## Purpose |
||||||
|
|
||||||
|
* Easily change pulseaudio volume from xmonad |
||||||
|
* Visualize volume in xmobar. Here are some snapshots of the representation in increasing volume: |
||||||
|
|
||||||
|
``` |
||||||
|
[ (mute) ] |
||||||
|
[ ] |
||||||
|
[. ] |
||||||
|
[- ] |
||||||
|
[/ ] |
||||||
|
[/. ] |
||||||
|
[/- ] |
||||||
|
[// ] |
||||||
|
[//. ] |
||||||
|
[///- ] |
||||||
|
[////. ] |
||||||
|
[//////////] |
||||||
|
``` |
||||||
|
|
||||||
|
## Install & Use |
||||||
|
|
||||||
|
0. Dependencies: working xmonad, pulseaudio. For visualization: python, xmobar. |
||||||
|
1. Add pulse-volume.sh and show-volume.py somewhere on your $PATH. |
||||||
|
2. Update xmonad.hs for media buttons. I add the following keybindings: |
||||||
|
``` |
||||||
|
-- mute button |
||||||
|
, ((0 , 0x1008FF12), spawn "pulse-volume.sh toggle") |
||||||
|
|
||||||
|
-- volumeup button |
||||||
|
, ((0 , 0x1008FF13), spawn "pulse-volume.sh increase") |
||||||
|
|
||||||
|
-- volumedown button |
||||||
|
, ((0 , 0x1008FF11), spawn "pulse-volume.sh decrease") |
||||||
|
``` |
||||||
|
3. Update xmobar configuation to run python script. The important thing is to add to the 'commands' array, and to the template. Here's a full example: |
||||||
|
``` |
||||||
|
Config { font = "xft:Droid Sans Mono:size=9:antialias=true" |
||||||
|
, bgColor = "#181818" |
||||||
|
, fgColor = "green" |
||||||
|
, position = TopW L 95 |
||||||
|
, commands = [ Run Cpu ["-L","3","-H","50","--normal","green","--high","red"] 5 |
||||||
|
, Run Memory ["-t","Mem: <usedratio>%"] 5 |
||||||
|
, Run Date "%a %b %d %Y %H:%M:%S " "date" 1 |
||||||
|
, Run Com "python" ["/path/to/show-volume.py"] "vol" 1 |
||||||
|
, Run StdinReader |
||||||
|
] |
||||||
|
, sepChar = "%" |
||||||
|
, alignSep = "}{" |
||||||
|
, template = "%StdinReader% }{ %cpu% | %memory% %vol% <fc=#e0e0e0>%date%</fc>" |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
4. (Optional) Upon boot, I like to reset the volume to what I consider a reasonable volume and unmute. In my .xsession file I run `pulse-volume.sh reset`. This also ensures that ~/.mute and ~/.volume are correct (see below). |
||||||
|
5. Restart xmonad. |
||||||
|
|
||||||
|
## Under the hood and future work |
||||||
|
|
||||||
|
The pulse-volume.sh script maintains two files in your home directory: ~/.volume and ~/.mute. Whenever you run this script it reads the current volume from the file and updates it appropriately (it takes a parameter "increase", "decrease", "mute", "unmute", "toggle"). It also updates pulse-volume. If this file is changed between uses of the script, the volume can jump dramatically; hence the "reset" feature to go back to a fixed volume. Obviously, it would be better to get the current volume from pulse audio itself instead of replicating state... contributions welcome! |
||||||
|
|
||||||
|
./show-volume.py generates the graphical representation from these files. It takes no parameters -- run it from the command line to see what it does. It's very easy to hack on this to make a new visualization... let me know if you do something cool! |
||||||
|
|
||||||
|
I expect you can use these scripts with other window managers or status bars, like dzen2. I somehow doubt there's much need -- but if you find it useful, feel free to contribute additions. |
||||||
|
|
||||||
|
## Bugs |
||||||
|
|
||||||
|
I wrote this years ago and never really intended to release it. Yet, it's stood the test of time for me, and I automatically deploy it on several linux systems without issues. However, given that nobody **else** has ever tested it, I imagine it has a lingering issue or two -- even if only in the setup instructions that I wrote. |
||||||
|
|
||||||
|
Use the issue tracker. For security bugs, email berkeley@berkeleychurchill.com. You can get a gpg key off my webpage at https://www.berkeleychurchill.com if you like. |
@ -0,0 +1,59 @@ |
|||||||
|
#!/bin/bash |
||||||
|
ACTION=$1 |
||||||
|
declare -i CURVOL=`cat ~/.volume` #Reads in the current volume |
||||||
|
|
||||||
|
function mute() { |
||||||
|
for i in 0 1 2 3 4 5 6; do |
||||||
|
pactl set-sink-mute $i $1 |
||||||
|
done |
||||||
|
echo $1 > ~/.mute |
||||||
|
} |
||||||
|
|
||||||
|
function setvolume() { |
||||||
|
for i in 0 1 2 3 4 5 6; do |
||||||
|
pactl set-sink-volume $i $1 |
||||||
|
done |
||||||
|
echo $1 > ~/.volume # Write the new volume to disk to be read the next time the script is run. |
||||||
|
} |
||||||
|
|
||||||
|
if [[ $ACTION == "reset" ]]; then |
||||||
|
CURVOL=30000 |
||||||
|
echo $CURVOL > ~/.volume |
||||||
|
echo 0 > ~/.mute |
||||||
|
for i in 0 1 2 3 4 5 6; do |
||||||
|
pactl set-sink-mute $i 0 |
||||||
|
pactl set-sink-volume $i $CURVOL |
||||||
|
done |
||||||
|
fi |
||||||
|
|
||||||
|
if [[ $ACTION == "increase" ]]; then |
||||||
|
mute 0 |
||||||
|
CURVOL=$(($CURVOL + 3000)) |
||||||
|
fi |
||||||
|
if [[ $ACTION == "decrease" ]]; then |
||||||
|
mute 0 |
||||||
|
CURVOL=$(($CURVOL - 3000)) |
||||||
|
fi |
||||||
|
|
||||||
|
if [[ $CURVOL -le 90000 && $CURVOL -ge 0 ]]; then |
||||||
|
for i in 0 1 2 3 4 5 6; do |
||||||
|
pactl set-sink-volume $i $CURVOL |
||||||
|
done |
||||||
|
echo $CURVOL > ~/.volume # Write the new volume to disk to be read the next time the script is run. |
||||||
|
fi |
||||||
|
|
||||||
|
if [[ $ACTION == "toggle" ]]; then |
||||||
|
if [[ `cat ~/.mute` -eq 1 ]]; then |
||||||
|
ACTION=unmute |
||||||
|
else |
||||||
|
ACTION=mute |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
if [[ $ACTION == "mute" ]]; then |
||||||
|
mute 1 |
||||||
|
fi |
||||||
|
|
||||||
|
if [[ $ACTION == "unmute" ]]; then |
||||||
|
mute 0 |
||||||
|
fi |
@ -0,0 +1,36 @@ |
|||||||
|
#!/usr/bin/python |
||||||
|
# -*- coding: utf8 -*- |
||||||
|
|
||||||
|
import sys |
||||||
|
import time |
||||||
|
import os |
||||||
|
|
||||||
|
allbars = "[//////////]" |
||||||
|
emptybars = "[ ]" |
||||||
|
|
||||||
|
home = os.getenv("HOME") |
||||||
|
|
||||||
|
with open(home + "/.volume") as f: |
||||||
|
content = f.readlines() |
||||||
|
|
||||||
|
with open(home + "/.mute") as f: |
||||||
|
isunmuted = (int(f.readlines()[0]) == 0) |
||||||
|
|
||||||
|
if isunmuted: |
||||||
|
volume = int(content[0]) |
||||||
|
bars = int(volume / 9000) |
||||||
|
|
||||||
|
if (volume % 9000 == 0): |
||||||
|
output = allbars[0:bars+1] + emptybars[bars+1:] |
||||||
|
if (volume % 9000 == 3000): |
||||||
|
output = allbars[0:bars+1] + "." + emptybars[bars+2:] |
||||||
|
if (volume % 9000 == 6000): |
||||||
|
output = allbars[0:bars+1] + "-" + emptybars[bars+2:] |
||||||
|
else: |
||||||
|
output = "[ (mute) ]" |
||||||
|
|
||||||
|
|
||||||
|
print(output) |
||||||
|
sys.stdout.flush |
||||||
|
|
||||||
|
|
@ -0,0 +1,24 @@ |
|||||||
|
#!/bin/bash |
||||||
|
xrdb -merge .Xresources |
||||||
|
|
||||||
|
# Touchpad |
||||||
|
$(syndaemon -d -K -i 0.5s && synclient HorizTwoFingerScroll=1 && synclient TapButton1=1 && synclient TapButton2=3)& |
||||||
|
|
||||||
|
# Tray applets |
||||||
|
trayer --edge bottom --align right --SetDockType true --SetPartialStrut true --expand true --width 10 --transparent true --tint 0x000000 --alpha 0 --height 17 & |
||||||
|
xscreensaver -no-splash& |
||||||
|
nm-applet --sm-disable& |
||||||
|
gnome-power-manager& |
||||||
|
|
||||||
|
# Fix for java applications |
||||||
|
export _JAVA_AWT_WM_NONREPARENTING=1 |
||||||
|
|
||||||
|
# Auto-start applications |
||||||
|
eval $(ssh-agent) |
||||||
|
gajim& |
||||||
|
dropbox start& |
||||||
|
keepass2 ~/Documents/passwords.kdbx& |
||||||
|
redshift -l 51:5 -t 6500:3000 & |
||||||
|
icedove& |
||||||
|
mate-terminal -e ssh-add ~/.ssh/id_rsa& |
||||||
|
bash ~/.xmonad/battery-monitor.sh& |
@ -0,0 +1,114 @@ |
|||||||
|
import XMonad |
||||||
|
import XMonad.Actions.CycleWS |
||||||
|
import XMonad.Hooks.DynamicLog |
||||||
|
import XMonad.Hooks.ManageDocks |
||||||
|
import XMonad.Hooks.ManageHelpers |
||||||
|
import XMonad.Util.Run(spawnPipe) |
||||||
|
import XMonad.Util.EZConfig |
||||||
|
import XMonad.Util.Scratchpad |
||||||
|
import XMonad.Config.Desktop |
||||||
|
import XMonad.Config.Azerty |
||||||
|
import XMonad.Layout.Fullscreen |
||||||
|
import XMonad.Layout.NoBorders |
||||||
|
import XMonad.Layout.Maximize |
||||||
|
import XMonad.Layout.Tabbed |
||||||
|
import XMonad.Layout.Minimize |
||||||
|
import XMonad.Layout.BoringWindows |
||||||
|
import XMonad.Layout.PerWorkspace |
||||||
|
import XMonad.Prompt |
||||||
|
import XMonad.Prompt.Ssh |
||||||
|
import System.IO |
||||||
|
import qualified Data.Map as M |
||||||
|
import qualified XMonad.StackSet as W |
||||||
|
import qualified Data.List as L |
||||||
|
|
||||||
|
baseConfig = desktopConfig |
||||||
|
{ modMask = mod5Mask -- AltGr |
||||||
|
, terminal = "mate-terminal.wrapper" |
||||||
|
, workspaces = ["1:web", "2:com", "3:dev"] ++ map show [4..8] ++ ["9:div"] |
||||||
|
, layoutHook = smartBorders $ fullscreenFull $ avoidStruts $ boringWindows $ minimize $ maximize $ onWorkspaces ["2:com", "9:div"] simpleTabbed $ (layoutHook desktopConfig ||| simpleTabbed ) |
||||||
|
, handleEventHook = handleEventHook desktopConfig <+> fullscreenEventHook |
||||||
|
} |
||||||
|
`removeKeys` |
||||||
|
[(m .|. modMask baseConfig , k) |
||||||
|
| (k) <- [xK_1 .. xK_9] |
||||||
|
, (m) <- [(0), (shiftMask)]] |
||||||
|
-- `removeKeys` |
||||||
|
-- [(modMask baseConfig .|. shiftMask, xK_q)] |
||||||
|
|
||||||
|
|
||||||
|
baseXPConfig = defaultXPConfig { |
||||||
|
position = Top |
||||||
|
} |
||||||
|
|
||||||
|
workspaceManageHook :: ManageHook |
||||||
|
workspaceManageHook = composeAll [ |
||||||
|
className =? "Firefox" --> doShift "1:web" |
||||||
|
,className =? "Icedove" --> doShift "2:com" |
||||||
|
,className =? "Gajim" --> doShift "2:com" |
||||||
|
,className =? "jetbrains-phpstorm" --> doShift "3:dev" |
||||||
|
,className =? "jetbrains-pycharm" --> doShift "3:dev" |
||||||
|
,className =? "KeePass2" --> doShift "9:div" |
||||||
|
,className =? "Xmessage" --> doFloat |
||||||
|
] |
||||||
|
|
||||||
|
|
||||||
|
main = do |
||||||
|
xmobar_proc <- spawnPipe "xmobar" |
||||||
|
xmonad $ baseConfig |
||||||
|
{ manageHook = (scratchpadManageHook $ W.RationalRect 0.0 0.0 1.0 0.5) <+> workspaceManageHook <+> fullscreenManageHook <+> manageDocks <+> manageHook baseConfig |
||||||
|
, logHook = dynamicLogWithPP xmobarPP |
||||||
|
{ ppOutput = hPutStrLn xmobar_proc |
||||||
|
, ppTitle = xmobarColor "green" "" . shorten 50 |
||||||
|
, ppSort = fmap(.scratchpadFilterOutWorkspace) (ppSort xmobarPP) |
||||||
|
, ppOrder = \(ws:_:t:_) -> [ws, t] |
||||||
|
} |
||||||
|
} |
||||||
|
`additionalKeys` |
||||||
|
[ ((modMask baseConfig .|. controlMask, xK_l), spawn "xscreensaver-command -lock") |
||||||
|
, ((modMask baseConfig .|. controlMask, xK_s), spawn "systemctl hibernate") |
||||||
|
, ((modMask baseConfig, xK_e), spawn "caja") |
||||||
|
, ((0, xK_Print), spawn "scrot") |
||||||
|
-- Normal Alt-Tab behavior |
||||||
|
, ((mod1Mask, xK_Tab ), windows W.focusDown) -- %! Move focus to the next window |
||||||
|
, ((mod1Mask .|. shiftMask, xK_Tab ), windows W.focusUp ) -- %! Move focus to the previous window |
||||||
|
-- XMonad.Actions.CycleWS |
||||||
|
, ((modMask baseConfig, xK_Right), nextWS) |
||||||
|
, ((modMask baseConfig, xK_Left), prevWS) |
||||||
|
, ((modMask baseConfig .|. shiftMask, xK_Right), shiftToNext >> nextWS) |
||||||
|
, ((modMask baseConfig .|. shiftMask, xK_Left), shiftToPrev >> prevWS) |
||||||
|
-- XMonad.Layout.Maximize |
||||||
|
, ((modMask baseConfig, xK_F11), withFocused (sendMessage . maximizeRestore)) |
||||||
|
-- XMonad.Prompt.Ssh |
||||||
|
, ((modMask baseConfig, xK_s), sshPrompt baseXPConfig) |
||||||
|
-- XMonad.Layout.Minimize |
||||||
|
, ((modMask baseConfig, xK_c), withFocused minimizeWindow) |
||||||
|
, ((modMask baseConfig, xK_g), sendMessage RestoreNextMinimizedWin) |
||||||
|
-- XMonad.Layout.BoringWindows |
||||||
|
, ((modMask baseConfig, xK_j), focusUp) |
||||||
|
, ((modMask baseConfig, xK_k), focusDown) |
||||||
|
, ((modMask baseConfig, xK_m), focusMaster) |
||||||
|
-- XMonad.Util.Scratchpad |
||||||
|
, ((modMask baseConfig, xK_F12), scratchpadSpawnActionCustom "mate-terminal --disable-factory --name scratchpad") |
||||||
|
-- Azerty support |
||||||
|
, ((modMask baseConfig, xK_semicolon), sendMessage (IncMasterN (-1))) |
||||||
|
-- mute button |
||||||
|
, ((0, 0x1008FF12), spawn "~/.xmonad/xmonad-pulsevolume/pulse-volume.sh toggle") |
||||||
|
-- volumeup button |
||||||
|
, ((0, 0x1008FF13), spawn "~/.xmonad/xmonad-pulsevolume/pulse-volume.sh increase") |
||||||
|
-- volumedown button |
||||||
|
, ((0, 0x1008FF11), spawn "~/.xmonad/xmonad-pulsevolume/pulse-volume.sh decrease") |
||||||
|
] |
||||||
|
`additionalKeys` |
||||||
|
-- |
||||||
|
-- mod-ctrl-[1..9], Switch to workspace N |
||||||
|
-- |
||||||
|
-- mod-ctrl-[1..9], Switch to workspace N |
||||||
|
-- mod-ctrl-shift-[1..9], Move client to workspace N |
||||||
|
-- |
||||||
|
[((m .|. modMask baseConfig , k), windows $ f i) |
||||||
|
| (i, k) <- zip (workspaces baseConfig) [xK_F1 .. xK_F9] |
||||||
|
, (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]] |
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in new issue