From a88bea6ba2d2e1a492b518a69e137ecbb68f79f4 Mon Sep 17 00:00:00 2001 From: ItsDrike Date: Thu, 15 Jul 2021 02:58:43 +0200 Subject: [PATCH] Dynamically resize xmobar for trayer --- home/.config/xmobar/multi_mon.sh | 20 ++++++-- home/.config/xmobar/trayer-padding-icon.sh | 49 ++++++++++++++++++++ home/.config/xmobar/xmobarrc.hs | 11 ++++- home/.config/xmobar/xmobarrc0 | 13 ++++-- home/.config/xmobar/xmobarrc1 | 11 +++-- home/.config/xmobar/{ => xpm}/haskell_20.xpm | 0 6 files changed, 91 insertions(+), 13 deletions(-) create mode 100755 home/.config/xmobar/trayer-padding-icon.sh rename home/.config/xmobar/{ => xpm}/haskell_20.xpm (100%) diff --git a/home/.config/xmobar/multi_mon.sh b/home/.config/xmobar/multi_mon.sh index 4b86a53..0555f23 100755 --- a/home/.config/xmobar/multi_mon.sh +++ b/home/.config/xmobar/multi_mon.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh if [ $# -lt 1 ]; then echo "Invalid amount of arguments passed!" @@ -10,7 +10,7 @@ MONITOR_AMOUT="$1" WIDTH=1920 WORK_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/xmobar" -make_line(){ +make_position_line(){ xpos=$(($1 * $WIDTH)) line=", position = Static { xpos = $xpos, ypos = 0, width = $WIDTH, height = 24 }" echo "$line" @@ -20,8 +20,22 @@ make_line(){ # Remove all already existing specific xmobar configurations find $WORK_DIR -regex '\./xmobarrc[0-9]+' -exec rm {} + +xmobarhs_content="$(cat $WORK_DIR/xmobarrc.hs)" +position_line_0="$(make_position_line 0)" + for ((n=0;n "$cur_file" + + # Replace position line to accomodate for multiple monitors + position_line="$(make_position_line $n)" + contents="${xmobarhs_content/$position_line_0/$position_line}" + + # Only keep trayer spacer in 1st xmobar + if [ $n -ne 0 ]; then + #contents="${contents/'%trayerpad%'/''}" + contents="$(grep -v trayerpad <<< $contents)" + fi + + echo "$contents" > "$cur_file" echo "$cur_file created." done diff --git a/home/.config/xmobar/trayer-padding-icon.sh b/home/.config/xmobar/trayer-padding-icon.sh new file mode 100755 index 0000000..81133c0 --- /dev/null +++ b/home/.config/xmobar/trayer-padding-icon.sh @@ -0,0 +1,49 @@ +#!/bin/sh +# Copied from https://github.com/jaor/xmobar/issues/239#issuecomment-233206552 +# Detects the width of running trayer-srg window (xprop name 'panel') +# and creates an XPM icon of that width, 1px height, and transparent. +# Outputs an -tag for use in xmobar to display the generated +# XPM icon. +# +# Run script from xmobar: +# `Run Com "/where/ever/trayer-padding-icon.sh" [] "trayerpad" 10` +# and use `%trayerpad%` in your template. + + +# Function to create a transparent Wx1 px XPM icon +create_xpm_icon () { + timestamp=$(date) + pixels=$(for i in `seq $1`; do echo -n "."; done) + + cat << EOF > "$2" +/* XPM * +static char * trayer_pad_xpm[] = { +/* This XPM icon is used for padding in xmobar to */ +/* leave room for trayer-srg. It is dynamically */ +/* updated by by trayer-padding-icon.sh which is run */ +/* by xmobar. */ +/* Created: ${timestamp} */ +/* */ +"$1 1 1 1", +/* Colors (none: transparent) */ +". c none", +/* Pixels */ +"$pixels" +}; +EOF +} + +# Width of the trayer window +width=$(xprop -name panel | grep 'program specified minimum size' | cut -d ' ' -f 5) + +# Icon file name +iconfile="/tmp/trayer-padding-${width}px.xpm" + +# If the desired icon does not exist create it +if [ ! -f $iconfile ]; then + create_xpm_icon $width $iconfile +fi + +# Output the icon tag for xmobar +echo "" + diff --git a/home/.config/xmobar/xmobarrc.hs b/home/.config/xmobar/xmobarrc.hs index 71c9763..0ac3fab 100644 --- a/home/.config/xmobar/xmobarrc.hs +++ b/home/.config/xmobar/xmobarrc.hs @@ -12,7 +12,8 @@ Config { font = "xft:Ubuntu:weight=bold:pixelsize=11:antialias=true:hinting=t , hideOnStart = False , allDesktops = True , persistent = True - --, iconRoot = "." -- default: "." + -- apparently there's no way to use env var or relpaths here + , iconRoot = "/home/itsdrike/.config/xmobar/xpm" , commands = [ -- Time and date Run Date "\xf017 %b %d %Y - (%H:%M) " "date" 50 @@ -26,6 +27,10 @@ Config { font = "xft:Ubuntu:weight=bold:pixelsize=11:antialias=true:hinting=t , Run DiskU [("/", "\xf0c7 hdd: free")] [] 60 -- Runs a standard shell command 'uname -r' to get kernel version , Run Com "uname" ["-r"] "" 3600 + -- Add dynamic invisible XPM icon that resizes to accomodate trayer + -- this needs to be an absolute string path, env vars or relpaths aren't accepted + -- this should only be on 1 monitor (single file), so ignore this comment on others + , Run Com "/home/itsdrike/.config/xmobar/trayer-padding-icon.sh" [] "trayerpad" 10 -- Allow mouse clicking by using unsafe stdin reader , Run UnsafeStdinReader ] @@ -37,7 +42,9 @@ Config { font = "xft:Ubuntu:weight=bold:pixelsize=11:antialias=true:hinting=t \| %memory% \ \| %disku% \ \| %wlp2s0% \ - \| %date% " + \| %date% \ + \%trayerpad%\ + \ " } diff --git a/home/.config/xmobar/xmobarrc0 b/home/.config/xmobar/xmobarrc0 index 71c9763..de17cfe 100644 --- a/home/.config/xmobar/xmobarrc0 +++ b/home/.config/xmobar/xmobarrc0 @@ -12,7 +12,8 @@ Config { font = "xft:Ubuntu:weight=bold:pixelsize=11:antialias=true:hinting=t , hideOnStart = False , allDesktops = True , persistent = True - --, iconRoot = "." -- default: "." + -- apparently there's no way to use env var or relpaths here + , iconRoot = "/home/itsdrike/.config/xmobar/xpm" , commands = [ -- Time and date Run Date "\xf017 %b %d %Y - (%H:%M) " "date" 50 @@ -26,6 +27,10 @@ Config { font = "xft:Ubuntu:weight=bold:pixelsize=11:antialias=true:hinting=t , Run DiskU [("/", "\xf0c7 hdd: free")] [] 60 -- Runs a standard shell command 'uname -r' to get kernel version , Run Com "uname" ["-r"] "" 3600 + -- Add dynamic invisible XPM icon that resizes to accomodate trayer + -- this needs to be an absolute string path, env vars or relpaths aren't accepted + -- this should only be on 1 monitor (single file), so ignore this comment on others + , Run Com "/home/itsdrike/.config/xmobar/trayer-padding-icon.sh" [] "trayerpad" 10 -- Allow mouse clicking by using unsafe stdin reader , Run UnsafeStdinReader ] @@ -37,7 +42,7 @@ Config { font = "xft:Ubuntu:weight=bold:pixelsize=11:antialias=true:hinting=t \| %memory% \ \| %disku% \ \| %wlp2s0% \ - \| %date% " + \| %date% \ + \%trayerpad%\ + \ " } - - diff --git a/home/.config/xmobar/xmobarrc1 b/home/.config/xmobar/xmobarrc1 index 3d62b43..66cd15e 100644 --- a/home/.config/xmobar/xmobarrc1 +++ b/home/.config/xmobar/xmobarrc1 @@ -12,7 +12,8 @@ Config { font = "xft:Ubuntu:weight=bold:pixelsize=11:antialias=true:hinting=t , hideOnStart = False , allDesktops = True , persistent = True - --, iconRoot = "." -- default: "." + -- apparently there's no way to use env var or relpaths here + , iconRoot = "/home/itsdrike/.config/xmobar/xpm" , commands = [ -- Time and date Run Date "\xf017 %b %d %Y - (%H:%M) " "date" 50 @@ -26,6 +27,9 @@ Config { font = "xft:Ubuntu:weight=bold:pixelsize=11:antialias=true:hinting=t , Run DiskU [("/", "\xf0c7 hdd: free")] [] 60 -- Runs a standard shell command 'uname -r' to get kernel version , Run Com "uname" ["-r"] "" 3600 + -- Add dynamic invisible XPM icon that resizes to accomodate trayer + -- this needs to be an absolute string path, env vars or relpaths aren't accepted + -- this should only be on 1 monitor (single file), so ignore this comment on others -- Allow mouse clicking by using unsafe stdin reader , Run UnsafeStdinReader ] @@ -37,7 +41,6 @@ Config { font = "xft:Ubuntu:weight=bold:pixelsize=11:antialias=true:hinting=t \| %memory% \ \| %disku% \ \| %wlp2s0% \ - \| %date% " + \| %date% \ + \ " } - - diff --git a/home/.config/xmobar/haskell_20.xpm b/home/.config/xmobar/xpm/haskell_20.xpm similarity index 100% rename from home/.config/xmobar/haskell_20.xpm rename to home/.config/xmobar/xpm/haskell_20.xpm