※追記1(2016/07/09 21:00)※
一応、上部にパネルを表示している場合を想定。
top_panel_hで高さを指定する。
#!/bin/bash
PRE_IFS=$IFS
IFS=$'\n'
top_panel_h=0
bottom_panel_h=26
title_h=30
disp_width=$(xwininfo -root | grep 'Width' | cut -f2 -d ':')
disp_height=$(xwininfo -root | grep 'Height' | cut -f2 -d ':')
if [ ! $(wmctrl -l | grep "WmCtrlGtk") ]; then
export MAIN_DIALOG='
<window title="WmCtrlGtk">
<hbox>
<button>
<label>h</label>
<action>'$0' h</action>
</button>
<button>
<label>v</label>
<action>'$0' v</action>
</button>
<button>
<label>r</label>
<action>'$0' r</action>
</button>
<button>
<label>+100</label>
<action>'$0' 100</action>
</button>
<button>
<label>-100</label>
<action>'$0' -100</action>
</button>
</hbox>
</window>
'
gtkdialog -p MAIN_DIALOG -c
fi
rotate_flag=0
if [ $# -eq 1 ]; then
if [ $1 = 'h' -o $1 = 'v' ]; then
hv_flag=$1
main_add=0
elif [ $1 = 'r' ]; then
rotate_flag=1
elif [ $1 -gt 0 -o $1 -lt 0 ]; then
rotate_flag=2
else
hv_flag='h'
fi
elif [ $# -eq 2 ]; then
hv_flag=$1
main_add=$2
else
exit 0
fi
temp_file='./wm-ctrl.txt'
if [ $rotate_flag -gt 0 ]; then
hv_flag=$(sed -n 1p ./wm-ctrl.his | cut -f1 -d',')
main_add=$(sed -n 1p ./wm-ctrl.his | cut -f2 -d',')
if [ $rotate_flag -eq 1 ]; then
temp_1=$(sed -n 2p ./wm-ctrl.his)
sed -i '$a '$temp_1'' ./wm-ctrl.his
sed -i 1,2d ./wm-ctrl.his
else
sed -i 1d ./wm-ctrl.his
main_add=$((main_add + $1))
fi
sed -i 's/_/ /g' ./wm-ctrl.his
temp_file='./wm-ctrl.his'
fi
wmctrl -l > wm-ctrl.txt
sed -i '/WmCtrlGtk/d' ./wm-ctrl.txt
txt_lines=$(wc $temp_file | sed 's/^[ \t]*//' | cut -f1 -d " ")
if [ $txt_lines -gt 0 ]; then
current_ws=$(xprop -root -notype _NET_CURRENT_DESKTOP | cut -b 24)
#active_win=$(xprop -root -notype _NET_ACTIVE_WINDOW | cut -b 33-43)
ws_windows=0
for((i = 1; i <= $txt_lines; i++)); do
ws_flag=$(sed -n $i'p' $temp_file | cut -b 12-13)
if [ $ws_flag -eq $current_ws ]; then
let ws_windows++
fi
done
disp_width2=$((disp_width / 2))
disp_height2=$(($(((disp_height - top_panel_h - bottom_panel_h) / 2)) - title_h))
disp_width_main=$((disp_width2 + main_add))
disp_height_main=$((disp_height2 + main_add))
disp_width_sub=$((disp_width2 - main_add))
disp_height_sub=$((disp_height2 - main_add))
pos_width=$((disp_width / 2))
pos_height=$(((disp_height - top_panel_h - bottom_panel_h) / 2))
if [ $hv_flag = 'v' ]; then
x_pos=(0 0 $pos_width $pos_width)
y_pos=($((0 + top_panel_h)) $((pos_height + top_panel_h + main_add)) \
$((pos_height + top_panel_h+ main_add)) $((0 + top_panel_h)))
else
x_pos=(0 $((pos_width + main_add)) $((pos_width + main_add)) 0)
y_pos=($((0 + top_panel_h)) $((0 + top_panel_h)) $((pos_height + top_panel_h)) \
$((pos_height + top_panel_h)))
fi
case $ws_windows in
1)
temp_width=$disp_width
temp_height=$((disp_height - top_panel_h - bottom_panel_h - title_h));;
[2-3])
temp_width=$disp_width2
temp_height=$((disp_height - top_panel_h - bottom_panel_h - title_h));;
*)
temp_width=$disp_width2
temp_height=$disp_height2;;
esac
window_array=()
n=0
for((i = 1; i <= $txt_lines; i++)); do
if [ $n -gt 3 ]; then
n=0
fi
ws_flag=$(sed -n $i'p' $temp_file | cut -b 11-13)
if [ $ws_flag -eq $current_ws ]; then
win_id=$(sed -n $i'p' $temp_file | cut -b 1-10)
if [ $rotate_flag -eq 0 ]; then
if [ $n -eq 0 ]; then
echo $hv_flag','$main_add',' > wm-ctrl.his
echo $win_id'__'$current_ws'_' >> wm-ctrl.his
else
echo $win_id'__'$current_ws'_' >> wm-ctrl.his
fi
fi
if [ $ws_windows -eq 2 ]; then
if [ $n -eq 0 ]; then
if [ $hv_flag = 'v' ]; then
temp_width=$disp_width
temp_height=$disp_height_main
else
temp_width=$disp_width_main
fi
else
if [ $hv_flag = 'v' ]; then
temp_width=$disp_width
temp_height=$disp_height_sub
else
temp_width=$disp_width_sub
temp_height=$((disp_height - top_panel_h - bottom_panel_h - title_h))
fi
fi
fi
if [ $ws_windows -eq 3 ]; then
if [ $n -eq 0 ]; then
if [ $hv_flag = 'v' ]; then
temp_width=$disp_width
temp_height=$disp_height_main
else
temp_width=$disp_width_main
fi
fi
fi
if [ $ws_windows -gt 2 -a $n -gt 0 ]; then
if [ $hv_flag = 'v' ]; then
temp_width=$disp_width2
temp_height=$disp_height_sub
else
temp_width=$disp_width_sub
temp_height=$disp_height2
fi
fi
if [ $ws_windows -gt 3 -a $n -gt 0 ]; then
x_pos=(0 $pos_width $pos_width 0)
y_pos=($((0 + top_panel_h)) $((0 + top_panel_h)) $((pos_height + top_panel_h)) \
$((pos_height + top_panel_h)))
temp_width=$disp_width2
temp_height=$disp_height2
fi
window_array+=( $win_id','${x_pos[$n]}','${y_pos[$n]}','$temp_width','$temp_height )
let n++
fi
done
for par in ${window_array[@]}; do
for((i = 1; i <= 5; i++)); do
declare par$i=$(echo ${par} | cut -f$i -d ',')
done
wmctrl -i -r $par1 -e 0,$par2,$par3,$par4,$par5
done
fi
if [ $rotate_flag -gt 0 ]; then
sed -i 's/ /_/g' ./wm-ctrl.his
temp=$hv_flag','$main_add','
sed -i '1i '$temp'' ./wm-ctrl.his
fi
