Page 1 of 1
Stickyjwm and Stickyxfce-- Control Windows
Posted: Tue Jan 12, 2021 10:20 pm
by mikeslr
Discussion of Stickyxfce begins here, viewtopic.php?p=56582#p56582
recobayu developed stickyjwm for Puppies, http://murga-linux.com/puppy/viewtopic. ... 498#825498. That two page thread will provide links to pets for Tahrpup and Xenialpup, perhaps earlier (Ubuntu based?) puppies. A pet for bionicpup and fossapup64 can be found here: viewtopic.php?p=6342#p6342. From recobayu's posts I think it is based on MochiMoppel's work. It uses "Ctrl + Alt + Arrow to move window to up, left, down, and right side of screen".
wmctrl is a dependency which is likely already on your system. As I understand it, stickyjwm can be used to "to make windows full-screen, always-above or sticky, and to activate, close, move, resize, maximize and minimize them."
Screenshots:viewtopic.php?p=6342#p6342, http://murga-linux.com/puppy/viewtopic. ... 72#1017372.
Current usage commands from the above link:
"win + arrow = stickyjwm
win + shift + arrow = maxleft, maxright, etc (default sticky by jwm)
win + alt + arrow = resize window per 100px"
Puppus Dogfellow published another tool named windowplacementpack. See, http://murga-linux.com/puppy/viewtopic. ... 860#796860 and the post following it. But also read, http://murga-linux.com/puppy/viewtopic. ... 655#797655. Screenshot of implementation:
- windowplacementpack.png (254.44 KiB) Viewed 4303 times
Sorry. I haven't used either of these. Just recording their existence for those who might be interested.
Re: Stickyjwm -- Control aspects of application windows
Posted: Tue Feb 23, 2021 6:52 am
by gychang
can stickyjwm move an active window to 4 corners of the display using keyboard command?.
On my Bionicpup64, I can move to R/L half of screen with by adding below to jwmrc-personal with
"<Key mask="4" key="Left">maxleft</Key>
<Key mask="4" key="Right">maxright</Key>"
Can stickyjwm allow keyboard control to move e.g xterm to right-upper 1/4 of the screen display?
I was able to figure out by downloading stickyjwm-4.1.pet file and combining with my .jwmrc-personal file...
Re: Stickyjwm -- Control aspects of application windows
Posted: Sat Jul 10, 2021 3:14 am
by recobayu
gychang wrote: ↑Tue Feb 23, 2021 6:52 am
can stickyjwm move an active window to 4 corners of the display using keyboard command?.
On my Bionicpup64, I can move to R/L half of screen with by adding below to jwmrc-personal with
"<Key mask="4" key="Left">maxleft</Key>
<Key mask="4" key="Right">maxright</Key>"
Can stickyjwm allow keyboard control to move e.g xterm to right-upper 1/4 of the screen display?
I was able to figure out by downloading stickyjwm-4.1.pet file and combining with my .jwmrc-personal file...
Yes of course. With stickyjwm, we can play like in linux mint cinnamon. please go here (the last post: stickyjwm-19.1) if you use bionicpup32:
https://oldforum.puppylinux.com/viewtop ... 2#p1017372
or you can here if you use bionicpup64 of fossapup64:
viewtopic.php?p=6342#p6342
Re: Stickyjwm -- Control aspects of application windows
Posted: Sat Jul 10, 2021 4:32 am
by MochiMoppel
@recobayu I don't know if Stickyjwm can shift a window, maintaining its current dimension, to the 4 corners - I assume it can. If so does it work in the 64bit flavors for undecorated windows, e.g. for windows without a title bar and without borders?
I'm asking because I noticed a bug in xwininfo, which you probably use for calculating the window location.
In Slacko8 and AFAIR also in Fossapup64 xwininfo doesn't get the relative positions of undecorated windows right, so that windows might always end up in position 0,0 (upper left corner)
Re: Stickyjwm -- Control aspects of application windows
Posted: Sat Jul 10, 2021 5:58 am
by recobayu
MochiMoppel wrote: ↑Sat Jul 10, 2021 4:32 am
@recobayu I don't know if Stickyjwm can shift a window, maintaining its current dimension, to the 4 corners - I assume it can. If so does it work in the 64bit flavors for undecorated windows, e.g. for windows without a title bar and without borders?
I'm asking because I noticed a bug in xwininfo, which you probably use for calculating the window location.
In Slacko8 and AFAIR also in Fossapup64 xwininfo doesn't get the relative positions of undecorated windows right, so that windows might always end up in position 0,0 (upper left corner)
Hi @MochiMoppel. In my script, I don't maintaining the current dimension when it window unsticky. It always do a half / quarter of screen. But for undecorated windows, stickyjwm also can handle it. In this example, I set titlebar=5 and border=5.
Re: Stickyjwm -- Control aspects of application windows
Posted: Tue Jul 13, 2021 2:03 pm
by recobayu
Hi Mochimoppel,
I just try slacko8.2.1.
The problem is in this puppy, there is no wmctrl. So I download wmctrl from here:
https://packages.slackonly.com/pub/pack ... slonly.txz
because there is no wmctrl in ppm
and after that, I success do stickyjwm. Also using win+alt+right is okay.
here is the screenshot:
edit:
it's weird with screenshots on slacko. when i upload using attachment, the image is not correct. just vertical lines. So I put the image on ibb.co
Re: Stickyjwm -- Control aspects of application windows
Posted: Tue Mar 01, 2022 5:44 pm
by recobayu
Hi All.
I make this update of stickyjwm.
Now, it can surf our entire monitor.
I try using 3 monitors, and it runs well.
It can detect our connected monitor and our active monitor
In the linux mint, using winkey + arrow, the window only snap on the current monitor, if we want to teleport into another monitor, we use another shortcut.
In the windows 10, we do not get the 2 or 8 position (2 means tophalf, and 8 means bottomhalf, look at the code for the ilustration of the position window)
But using this code, we can feel the advantage of both (linux mint cinnamon and windows 10) snap window on our puppy linux or debiandog.
And also, I simplify the code into one file.
Here is the code:
Code: Select all
#!/bin/bash
# 220321 partition screen into three height (h1 and h2 line as border)
# and three width (w1 and w2 line as border)
# 220503 add margins
wd=`echo /tmp$HOME/.stickyjwm`
#echo "$wd"
#rm -r "$wd"
mkdir -p "$wd"
case "$1" in
-h|--help) echo ' usage:
-up : snap to top monitor
-left : snap to left monitor
-down : snap to bottom monitor
-right : snap to right monitor'
esac
margin_top=0
margin_left=0
margin_bottom=30
margin_right=0
# list all active monitors and sort it by x coordinate
xrandr --listactivemonitors|grep x|awk -F '[ +x/]' '{print $4,$5-'$margin_left'-'$margin_right',$7-'$margin_top'-'$margin_bottom',$9+'$margin_left',$10+'$margin_top'}'|sed 's/*//g'|sort -k4,4n > "$wd"/monitors-active
# debug
# name w h x y of monitor
# 0 1 2 3 4
## Get window position information
if [ ! -d "$wd"/info ];then mkdir -p "$wd"/info; fi
id_window=$(xprop -root|awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}')
xwininfo -id $id_window>"$wd"/info/$id_window
w_window=`awk '/Width/{print $2}' "$wd"/info/$id_window`
h_window=`awk '/Height/{print $2}' "$wd"/info/$id_window`
x_window=`awk '/Absolute upper-left X/{print $4}' "$wd"/info/$id_window`
y_window=`awk '/Absolute upper-left Y/{print $4}' "$wd"/info/$id_window`
border=`awk '/Relative upper-left X/{print $4}' "$wd"/info/$id_window`
title=`awk '/Relative upper-left Y/{print $4}' "$wd"/info/$id_window`
# got the center coordinate of window
cx_window=$(( $x_window + $w_window / 2 ))
cy_window=$(( $y_window + $h_window / 2 ))
# check if there is a config file for this window.
if [ ! -f "$wd/$id_window" ];then #if not found, then make it!
while read line;do
mntr=($line)
#echo "${mntr[@]}"
w_plus_x=$(( ${mntr[1]} + ${mntr[3]} ))
#echo w_plus_x = "$w_plus_x"
#echo "$x_window" "$w_plus_x"
if [ "$x_window" -lt "$w_plus_x" ];then
#echo "the window is on ${mntr[0]}"
current=(${mntr[@]})
echo "${current[@]}" > "$wd/$id_window"
break
#else
#echo "the window is on the right of $mntr"
fi
done < "$wd"/monitors-active
else
#echo "take from config file in $wd/$id_window"
current=(`cat $wd/$id_window`)
fi
#echo "Selesai"
#echo current monitor: "${current[@]}"
echo
# set the margin into current monitor config
#current[1]=$(( ${current[1]} - $margin_left - $margin_right ))
#current[2]=$(( ${current[2]} - $margin_top - $margin_bottom ))
#current[3]=$(( ${current[3]} + $margin_left ))
#current[4]=$(( ${current[4]} + $margin_top ))
goto_left_monitor(){
left=(`grep -B 1 "${current[0]}" "$wd"/monitors-active|grep -v "${current[0]}"`)
if [ ${#left[@]} -eq 0 ];then left=(`tail -1 "$wd"/monitors-active`); fi
echo ${left[@]} > "$wd/$id_window"
current=(${left[@]})
}
goto_right_monitor(){
right=(`grep -A 1 "${current[0]}" "$wd"/monitors-active|grep -v "${current[0]}"`)
if [ ${#right[@]} -eq 0 ];then right=(`head -1 "$wd"/monitors-active`); fi
echo ${right[@]} > "$wd/$id_window"
current=(${right[@]})
}
# position window on monitor
# 1 | 2 | 3
#----------- h1
# 4 | 5 | 6
#----------- h2
# 7 | 8 | 9
# w1 w2
w1=$(( ${current[3]} + ${current[1]} / 3 ))
w2=$(( ${current[3]} + ${current[1]} / 3 * 2))
h1=$(( ${current[4]} + ${current[2]} / 3 ))
h2=$(( ${current[4]} + ${current[2]} / 3 * 2))
echo cx:$cx_window, w: $w1, $w2, $(( ${current[1]} + ${current[3]} ))
echo cy:$cy_window, h: $h1, $h2, $(( ${current[2]} + ${current[4]} ))
# result
pos1(){
x=${current[3]}
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos1 on ${current[0]}
}
pos2(){
x=${current[3]}
y=${current[4]}
w=${current[1]}
h=$(( ${current[2]} / 2 ))
echo pos2 on ${current[0]}
}
pos3(){
x=$(( ${current[3]} + ${current[1]} / 2 ))
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos3 on ${current[0]}
}
pos4(){
x=${current[3]}
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=${current[2]}
echo pos4 on ${current[0]}
}
pos5(){
x=${current[3]}
y=${current[4]}
w=${current[1]}
h=${current[2]}
echo pos5 on ${current[0]}
}
pos6(){
x=$(( ${current[3]} + ${current[1]} / 2 ))
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=${current[2]}
echo pos6 on ${current[0]}
}
pos7(){
x=${current[3]}
y=$(( ${current[4]} + ${current[2]} / 2 ))
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos7 on ${current[0]}
}
pos8(){
x=${current[3]}
y=$(( ${current[4]} + ${current[2]} / 2 ))
w=${current[1]}
h=$(( ${current[2]} / 2 ))
echo pos8 on ${current[0]}
}
pos9(){
x=$(( ${current[3]} + ${current[1]} / 2 ))
y=$(( ${current[4]} + ${current[2]} / 2 ))
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos9 on ${current[0]}
}
center(){
margin=150
x=$(( ${current[3]} + $margin ))
y=$(( ${current[4]} + $margin / 2 ))
w=$(( ${current[1]} - 2 * $margin ))
h=$(( ${current[2]} - $margin ))
echo center on ${current[0]}
}
# check, where is this window position (1 - 9)
if [ $cy_window -lt $h1 ];then
echo top of h1: 1, 2, 3
if [ $cx_window -lt $w1 ];then
echo 1
case $1 in
-up) goto_left_monitor; pos7;;
-right) pos2;;
-down) pos4;;
-left) goto_left_monitor; pos3;;
*) pos2;;
esac
elif [ $cx_window -lt $w2 ];then
echo 2
case $1 in
-up) pos5;;
-right) pos3;;
-down) center;;
-left) pos1;;
*) pos3;;
esac
else
echo 3
case $1 in
-up) goto_left_monitor; pos9;;
-right) goto_right_monitor; pos1;;
-down) pos6;;
-left) pos2;;
*) goto_right_monitor; pos1;;
esac
fi
elif [ $cy_window -lt $h2 ];then
echo between h1 and h2: 4, 5, 6
if [ $cx_window -lt $w1 ];then
echo 4
case $1 in
-up) pos1;;
-right) center;;
-down) pos7;;
-left) goto_left_monitor; pos6;;
*) center;;
esac
elif [ $cx_window -lt $w2 ];then
echo 5
case $1 in
-up) pos2;;
-right) pos6;;
-down) pos8;;
-left) pos4;;
*) pos6;;
esac
else
echo 6
case $1 in
-up) pos3;;
-right) goto_right_monitor; pos4;;
-down) pos9;;
-left) center;;
*) goto_right_monitor; pos4;;
esac
fi
else
echo bottom of h2: 7, 8, 9
if [ $cx_window -lt $w1 ];then
echo 7
case $1 in
-up) pos4;;
-right) pos8;;
-down) goto_right_monitor; pos1;;
-left) goto_left_monitor; pos9;;
*) pos8;;
esac
elif [ $cx_window -lt $w2 ];then
echo 8
case $1 in
-up) center;;
-right) pos9;;
-down) goto_right_monitor; pos2;;
-left) pos7;;
*) pos9;;
esac
else
echo 9
case $1 in
-up) pos6;;
-right) goto_right_monitor; pos7;;
-down) goto_right_monitor; pos3;;
-left) pos8;;
*) goto_right_monitor; pos7;;
esac
fi
fi
# set up for border and decoration
w=$(( $w - 2*$border ))
h=$(( $h - $title - $border ))
echo x,y,w,h now
echo $x,$y,$w,$h
# run twice to make terminal better place
wmctrl -r :ACTIVE: -e 0,$x,$y,$w,$h
wmctrl -r :ACTIVE: -e 1,$x,$y,$w,$h
But in this code,
I still do not include the calculation of the tray yet.
Don't forget to add this shortcut on our /root/.jwmrc (or we can "Include" it from another <JWM> xml code.
Code: Select all
<Key mask="4" key="Up">exec:stickyjwm -up</Key>
<Key mask="4" key="Left">exec:stickyjwm -left</Key>
<Key mask="4" key="Down">exec:stickyjwm -down</Key>
<Key mask="4" key="Right">exec:stickyjwm -right</Key>
Feel free to use and improve this code on woof-ce.
Thank you.
Re: Stickyjwm -- Control aspects of application windows
Posted: Tue May 03, 2022 2:30 am
by recobayu
this script work on xfce
I change on line 36:
Code: Select all
id_window=$(xprop -root|awk -F'[ ,]' '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $5}')
stickyjwm-xfce or stickyxfce
Code: Select all
#!/bin/bash
# 220321 partition screen into three height (h1 and h2 line as border)
# and three width (w1 and w2 line as border)
# 220503 add margins
wd=`echo /tmp$HOME/.stickyjwm`
#echo "$wd"
#rm -r "$wd"
mkdir -p "$wd"
case "$1" in
-h|--help) echo ' usage:
-up : snap to top monitor
-left : snap to left monitor
-down : snap to bottom monitor
-right : snap to right monitor'
esac
margin_top=0
margin_left=0
margin_bottom=0
margin_right=0
# list all active monitors and sort it by x coordinate
xrandr --listactivemonitors|grep x|awk -F '[ +x/]' '{print $4,$5-'$margin_left'-'$margin_right',$7-'$margin_top'-'$margin_bottom',$9+'$margin_left',$10+'$margin_top'}'|sed 's/*//g'|sort -k4,4n > "$wd"/monitors-active
# debug
# name w h x y of monitor
# 0 1 2 3 4
## Get window position information
if [ ! -d "$wd"/info ];then mkdir -p "$wd"/info; fi
id_window=$(xprop -root|awk -F'[ ,]' '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $5}')
xwininfo -id $id_window>"$wd"/info/$id_window
w_window=`awk '/Width/{print $2}' "$wd"/info/$id_window`
h_window=`awk '/Height/{print $2}' "$wd"/info/$id_window`
x_window=`awk '/Absolute upper-left X/{print $4}' "$wd"/info/$id_window`
y_window=`awk '/Absolute upper-left Y/{print $4}' "$wd"/info/$id_window`
border=`awk '/Relative upper-left X/{print $4}' "$wd"/info/$id_window`
title=`awk '/Relative upper-left Y/{print $4}' "$wd"/info/$id_window`
# got the center coordinate of window
cx_window=$(( $x_window + $w_window / 2 ))
cy_window=$(( $y_window + $h_window / 2 ))
# check if there is a config file for this window.
if [ ! -f "$wd/$id_window" ];then #if not found, then make it!
while read line;do
mntr=($line)
#echo "${mntr[@]}"
w_plus_x=$(( ${mntr[1]} + ${mntr[3]} ))
#echo w_plus_x = "$w_plus_x"
#echo "$x_window" "$w_plus_x"
if [ "$x_window" -lt "$w_plus_x" ];then
#echo "the window is on ${mntr[0]}"
current=(${mntr[@]})
echo "${current[@]}" > "$wd/$id_window"
break
#else
#echo "the window is on the right of $mntr"
fi
done < "$wd"/monitors-active
else
#echo "take from config file in $wd/$id_window"
current=(`cat $wd/$id_window`)
fi
#echo "Selesai"
#echo current monitor: "${current[@]}"
echo
# set the margin into current monitor config
#current[1]=$(( ${current[1]} - $margin_left - $margin_right ))
#current[2]=$(( ${current[2]} - $margin_top - $margin_bottom ))
#current[3]=$(( ${current[3]} + $margin_left ))
#current[4]=$(( ${current[4]} + $margin_top ))
goto_left_monitor(){
left=(`grep -B 1 "${current[0]}" "$wd"/monitors-active|grep -v "${current[0]}"`)
if [ ${#left[@]} -eq 0 ];then left=(`tail -1 "$wd"/monitors-active`); fi
echo ${left[@]} > "$wd/$id_window"
current=(${left[@]})
}
goto_right_monitor(){
right=(`grep -A 1 "${current[0]}" "$wd"/monitors-active|grep -v "${current[0]}"`)
if [ ${#right[@]} -eq 0 ];then right=(`head -1 "$wd"/monitors-active`); fi
echo ${right[@]} > "$wd/$id_window"
current=(${right[@]})
}
# position window on monitor
# 1 | 2 | 3
#----------- h1
# 4 | 5 | 6
#----------- h2
# 7 | 8 | 9
# w1 w2
w1=$(( ${current[3]} + ${current[1]} / 3 ))
w2=$(( ${current[3]} + ${current[1]} / 3 * 2))
h1=$(( ${current[4]} + ${current[2]} / 3 ))
h2=$(( ${current[4]} + ${current[2]} / 3 * 2))
echo cx:$cx_window, w: $w1, $w2, $(( ${current[1]} + ${current[3]} ))
echo cy:$cy_window, h: $h1, $h2, $(( ${current[2]} + ${current[4]} ))
# result
pos1(){
x=${current[3]}
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos1 on ${current[0]}
}
pos2(){
x=${current[3]}
y=${current[4]}
w=${current[1]}
h=$(( ${current[2]} / 2 ))
echo pos2 on ${current[0]}
}
pos3(){
x=$(( ${current[3]} + ${current[1]} / 2 ))
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos3 on ${current[0]}
}
pos4(){
x=${current[3]}
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=${current[2]}
echo pos4 on ${current[0]}
}
pos5(){
x=${current[3]}
y=${current[4]}
w=${current[1]}
h=${current[2]}
echo pos5 on ${current[0]}
}
pos6(){
x=$(( ${current[3]} + ${current[1]} / 2 ))
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=${current[2]}
echo pos6 on ${current[0]}
}
pos7(){
x=${current[3]}
y=$(( ${current[4]} + ${current[2]} / 2 ))
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos7 on ${current[0]}
}
pos8(){
x=${current[3]}
y=$(( ${current[4]} + ${current[2]} / 2 ))
w=${current[1]}
h=$(( ${current[2]} / 2 ))
echo pos8 on ${current[0]}
}
pos9(){
x=$(( ${current[3]} + ${current[1]} / 2 ))
y=$(( ${current[4]} + ${current[2]} / 2 ))
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos9 on ${current[0]}
}
center(){
margin=150
x=$(( ${current[3]} + $margin ))
y=$(( ${current[4]} + $margin / 2 ))
w=$(( ${current[1]} - 2 * $margin ))
h=$(( ${current[2]} - $margin ))
echo center on ${current[0]}
}
# check, where is this window position (1 - 9)
if [ $cy_window -lt $h1 ];then
echo top of h1: 1, 2, 3
if [ $cx_window -lt $w1 ];then
echo 1
case $1 in
-up) goto_left_monitor; pos7;;
-right) pos2;;
-down) pos4;;
-left) goto_left_monitor; pos3;;
*) pos2;;
esac
elif [ $cx_window -lt $w2 ];then
echo 2
case $1 in
-up) pos5;;
-right) pos3;;
-down) center;;
-left) pos1;;
*) pos3;;
esac
else
echo 3
case $1 in
-up) goto_left_monitor; pos9;;
-right) goto_right_monitor; pos1;;
-down) pos6;;
-left) pos2;;
*) goto_right_monitor; pos1;;
esac
fi
elif [ $cy_window -lt $h2 ];then
echo between h1 and h2: 4, 5, 6
if [ $cx_window -lt $w1 ];then
echo 4
case $1 in
-up) pos1;;
-right) center;;
-down) pos7;;
-left) goto_left_monitor; pos6;;
*) center;;
esac
elif [ $cx_window -lt $w2 ];then
echo 5
case $1 in
-up) pos2;;
-right) pos6;;
-down) pos8;;
-left) pos4;;
*) pos6;;
esac
else
echo 6
case $1 in
-up) pos3;;
-right) goto_right_monitor; pos4;;
-down) pos9;;
-left) center;;
*) goto_right_monitor; pos4;;
esac
fi
else
echo bottom of h2: 7, 8, 9
if [ $cx_window -lt $w1 ];then
echo 7
case $1 in
-up) pos4;;
-right) pos8;;
-down) goto_right_monitor; pos1;;
-left) goto_left_monitor; pos9;;
*) pos8;;
esac
elif [ $cx_window -lt $w2 ];then
echo 8
case $1 in
-up) center;;
-right) pos9;;
-down) goto_right_monitor; pos2;;
-left) pos7;;
*) pos9;;
esac
else
echo 9
case $1 in
-up) pos6;;
-right) goto_right_monitor; pos7;;
-down) goto_right_monitor; pos3;;
-left) pos8;;
*) goto_right_monitor; pos7;;
esac
fi
fi
# set up for border and decoration
w=$(( $w - 2*$border ))
h=$(( $h - $title - $border ))
echo x,y,w,h now
echo $x,$y,$w,$h
# run twice to make terminal better place
wmctrl -r :ACTIVE: -e 0,$x,$y,$w,$h
wmctrl -r :ACTIVE: -e 1,$x,$y,$w,$h
put it on /usr/bin
then add shortcut to it.
stickyxfce -right
stickyxfce -up
stickyxfce -left
stickyxfce -down
assign to win+right, win+up, win+left, and win+down arrow.
Re: Stickyjwm -- Control aspects of application windows
Posted: Tue May 03, 2022 1:15 pm
by rockedge
I am adding it in to KLV-Airedale for testing. Once I started using it, it became indispensable.
Re: Stickyjwm -- Control aspects of application windows
Posted: Tue May 03, 2022 2:30 pm
by recobayu
@rockedge, the variables:
margin_top=0
margin_left=0
margin_bottom=0
margin_right=0
Can be change manually. It is very good if you can make the gui configuration using gtkdialog to change that.
Thank you very much
Re: Stickyjwm -- Control aspects of application windows
Posted: Fri May 06, 2022 7:40 pm
by rockedge
@recobayu Here is stickyxfce working on KLV-Airedale-beta14. I will install it to the KLV_rootfs for beta15.
Set the keyboard bindings to <Super>+Up, <Super>+Down, <Super>+Left, <Super>+Right using the GUI editor to add the bindings to /usr/local/bin/stickyxfce by using the menu: Applications->Settings->Keyboard->Application Shortcuts
Re: Stickyjwm -- Control aspects of application windows
Posted: Fri May 06, 2022 8:18 pm
by recobayu
Thank you, @rockedge..
It seems that the bottom tray covers the window. You can set the margin_bottom variable in the stickyxfce script manually to make it better.
If you have three or more monitors, try stickyxfce to make the window play around the monitors.
Question:
How did you make the gif animation like that?
I like it. It is more easy to understand than just a picture.
Re: Stickyjwm -- Control aspects of application windows
Posted: Fri May 06, 2022 8:21 pm
by Grey
recobayu wrote: ↑Tue Mar 01, 2022 5:44 pm
I make this update of stickyjwm.
In the linux mint,
Yes, it is really convenient. And there is even a window centering. Mint stands aside and nervously smokes looking at Fossapup
Thanks, great job
Re: Stickyjwm -- Control aspects of application windows
Posted: Sat May 07, 2022 12:10 pm
by wiak
Posted XFCE "Window Manager" related comment to following thread, since an alternative for KLV and don't want to imply can replace stickyxfce - as I say, both could be useful in KLV-Airedale probably:
viewtopic.php?p=56935#p56935
Re: Stickyjwm -- Control aspects of application windows
Posted: Sat May 07, 2022 3:56 pm
by recobayu
Thank you, @wiak..
Using stickyxfce, we can make different position using the same shortcut/keybinding. Eventough multi monitor.
Yes, i also sometimes use default keybinds of xfce to snap window to 9 positions using this keybinds:
Win+u : top left
Win+i : top half
Win+o : top right
Win+j : left half
Win+k : maximize
Win+l : right half
Win+m : bottom left
Win+, : bottom half
Win+. : bottom right
Because the position of
u , i , o
j , k , l
m , , , .
are easy to click using right hand
And to teleport to next/previous monitor, using shift+win+right/left arrow.
But once again, using stickyxfce, we can use the same keybind, example: stickyxfce -right to snap window to position 1, 2, 3, eventough teleport to next monitors.
Re: Stickyjwm -- Control aspects of application windows
Posted: Mon May 09, 2022 1:59 am
by wiak
Yes, I can understand how powerful stickyxfce can be. Standard xfce window manager keyboarding is simple but limited, and no use for multi-monitor functionality as far as I know. I'm planning to adopt stickyxfce overall too. Thanks for the work.
Re: Stickyjwm and Stickyxfce-- Control Windows
Posted: Sat May 14, 2022 9:06 am
by MochiMoppel
@recobayu Works in EasyOS ... sort of.
The old problem remains: Windows slide under trays. Particularly annoying in case of top trays because this can hide the title bars.
I checked my old scripts I once did for Puppus to see how I solved the problem. Well, I cheated and added tray margins manually into the script. As you may already know, programmatically retrieving the values from .jwmrc is VERY tricky and almost impossible. Even manually looking the values up can be hard. And there can be multiple trays, stacked or side by side... unlimited ways to make calculation a nightmare.
I've now come up with what may be a simple solution. It uses the fact that windows, maximized by the WM (or by wmctrl !), do not cover trays or slide under them . This means that we can measure the dimensions of a maximized window and the dimensions of the screen. Any difference is caused by trays,which gives us the tray margins.
This little script creates a tiny (1x1px) test window (to keep the flicker low), waits 0.3sec. to finish the creation, then maximizes it, measures geometry, then closes the window. May be enough to run it once a session and write values to config file. No idea how this works out with multiple monitors.
Code: Select all
#!/bin/bash
## Read current screen dimension
ARRAY=($(xwininfo -root))
SCREEN_W=${ARRAY[27]}
SCREEN_H=${ARRAY[29]}
## Create 1px test window (no focus, no decoration, layer below, skip taskbar)
echo '<window title="@@" type-hint="7"><hseparator></hseparator></window>'|gtkdialog -s -G +1+1 &
sleep .3
## Maximize test window
wmctrl -r @@ -b add,maximized_vert,maximized_horz
## Retrieve geometry
XWININFO=$(xwininfo -name @@)
set -- ${XWININFO#* X: }
WINMAX_X=$1
WINMAX_Y=$5
WINMAX_W=${15}
WINMAX_H=${17}
## Close test window
wmctrl -c @@
## Calculate widths/heigths occupied on each side by WM trays
TRAY_T=$WINMAX_Y
TRAY_R=$((SCREEN_W - WINMAX_W - WINMAX_X))
TRAY_B=$((SCREEN_H - WINMAX_H - WINMAX_Y))
TRAY_L=$WINMAX_X
gxmessage -c "Screen dimension (WxH):${SCREEN_W}x${SCREEN_H}
Space (in px, calculated from screen edges) reserved for trays
Top: $TRAY_T
Right: $TRAY_R
Bottom: $TRAY_B
Left: $TRAY_L"
Re: Stickyjwm and Stickyxfce-- Control Windows
Posted: Sat May 14, 2022 10:45 pm
by geo_c
All I can say is StickyJWM has greatly improved the quality of my life. It completely eliminates the need for the collection of wmctrl scripts I wrote to place applications on the desktop. By providing the ability to place two or four windows tiled on the monitor, and grow or shrink them with a quick keystroke, the desktop becomes quickly productive without having to worry about the specific xy coordinates of individual monitors, it makes life a lot easier.
Re: Stickyjwm and Stickyxfce-- Control Windows
Posted: Wed May 18, 2022 8:55 am
by recobayu
Thank you, @MochiMoppel.
I try to make gui for configuration like this.
- stickyjwm-config.png (53.28 KiB) Viewed 3263 times
and use your code:
Code: Select all
#!/bin/bash
## Read current screen dimension
ARRAY=($(xwininfo -root))
SCREEN_W=${ARRAY[27]}
SCREEN_H=${ARRAY[29]}
## Create 1px test window (no focus, no decoration, layer below, skip taskbar)
echo '<window title="@@" decorated="false"><hseparator></hseparator></window>'|gtkdialog -s -G +1+1 &
sleep .3
## Maximize test window
wmctrl -r @@ -b add,maximized_vert,maximized_horz
## Retrieve geometry
XWININFO=$(xwininfo -name @@)
set -- ${XWININFO#* X: }
WINMAX_X=$1
WINMAX_Y=$5
WINMAX_W=${15}
WINMAX_H=${17}
## Close test window
wmctrl -c @@
## Calculate widths/heigths occupied on each side by WM trays
margin_top=$WINMAX_Y
margin_left=$WINMAX_X
margin_bottom=$((SCREEN_H - WINMAX_H - WINMAX_Y))
margin_right=$((SCREEN_W - WINMAX_W - WINMAX_X))
#Xdialog --msgbox "Screen dimension (WxH):${SCREEN_W}x${SCREEN_H}
#Space (in px, calculated from screen edges) reserved for trays
#Top: $margin_top
#Left: $margin_left
#Bottom: $margin_bottom
#Right: $margin_right" 0 0
export wd="$HOME/.stickyjwm"
if [ ! -d "$wd" ];then mkdir -p "$wd";fi
echo "margin_top: $margin_top
margin_left: $margin_left
margin_bottom: $margin_bottom
margin_right: $margin_right" > "$wd"/stickyjwm-conf
try_it(){
echo '<button>
<label>'$1'</label>
<action>stickyjwm -'$1'</action>
</button>'
}
export -f try_it
echo '
<window title="@@@">
<hbox>
<vbox>
<hbox>
<text><label>margin top:</label></text>
<spinbutton>
<default>'$margin_top'</default>
<action>sed -i "s/margin_top:.*/margin_top: $spintop1/" "$wd"/stickyjwm-conf</action>
<variable>spintop1</variable>
</spinbutton>
</hbox>
<hbox>
<text><label>margin left:</label></text>
<spinbutton>
<default>'$margin_left'</default>
<action>sed -i "s/margin_left:.*/margin_left: $spinleft/" "$wd"/stickyjwm-conf</action>
<variable>spinleft</variable>
</spinbutton>
</hbox>
<hbox>
<text><label>margin bottom:</label></text>
<spinbutton>
<default>'$margin_bottom'</default>
<action>sed -i "s/margin_bottom:.*/margin_bottom: $spinbottom/" "$wd"/stickyjwm-conf</action>
<variable>spinbottom</variable>
</spinbutton>
</hbox>
<hbox>
<text><label>margin right:</label></text>
<spinbutton>
<default>'$margin_right'</default>
<action>sed -i "s/margin_right:.*/margin_right: $spinright/" "$wd"/stickyjwm-conf</action>
<variable>spinright</variable>
</spinbutton>
</hbox>
</vbox>
<frame try it>
<hbox space-fill="true" space-expand="true">
'"`try_it left`"'
<vbox space-fill="true" space-expand="true">
'"`try_it up`"'
'"`try_it down`"'
</vbox>
'"`try_it right`"'
</hbox>
</frame>
</hbox>
</window>"'|gtkdialog -s
I change a little to make it works from your code, that is replace the type-hint="7" with decorated="false"
then, also change the stickyjwm script like this:
Code: Select all
#!/bin/bash
# 220321 partition screen into three height (h1 and h2 line as border)
# and three width (w1 and w2 line as border)
# 220503 add margins
wd=`echo /tmp$HOME/.stickyjwm`
#echo "$wd"
#rm -r "$wd"
mkdir -p "$wd"
case "$1" in
-h|--help) echo ' usage:
-up : snap to top monitor
-left : snap to left monitor
-down : snap to bottom monitor
-right : snap to right monitor'
esac
if [ -f $HOME/.stickyjwm/stickyjwm-conf ];then
conf="$HOME/.stickyjwm/stickyjwm-conf"
margin_top=`grep "margin_top:.*" "$conf"|cut -d\: -f2`
margin_left=`grep "margin_left:.*" "$conf"|cut -d\: -f2`
margin_bottom=`grep "margin_bottom:.*" "$conf"|cut -d\: -f2`
margin_right=`grep "margin_right:.*" "$conf"|cut -d\: -f2`
echo "$margin_top, $margin_left, $margin_bottom, $margin_right"
else
mkdir $HOME/.stickyjwm/
margin_top=0
margin_left=0
margin_bottom=0
margin_right=0
echo 'margin_top:0
margin_left:0
margin_bottom:0
margin_right:0' > "$HOME/.stickyjwm/stickyjwm-conf"
fi
# list all active monitors and sort it by x coordinate
xrandr --listactivemonitors|grep x|awk -F '[ +x/]' '{print $4,$5-'$margin_left'-'$margin_right',$7-'$margin_top'-'$margin_bottom',$9+'$margin_left',$10+'$margin_top'}'|sed 's/*//g'|sort -k4,4n > "$wd"/monitors-active
# debug
# name w h x y of monitor
# 0 1 2 3 4
## Get window position information
if [ ! -d "$wd"/info ];then mkdir -p "$wd"/info; fi
id_window=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW|cut -f2)
xwininfo -id $id_window>"$wd"/info/$id_window
w_window=`awk '/Width/{print $2}' "$wd"/info/$id_window`
h_window=`awk '/Height/{print $2}' "$wd"/info/$id_window`
x_window=`awk '/Absolute upper-left X/{print $4}' "$wd"/info/$id_window`
y_window=`awk '/Absolute upper-left Y/{print $4}' "$wd"/info/$id_window`
border=`awk '/Relative upper-left X/{print $4}' "$wd"/info/$id_window`
title=`awk '/Relative upper-left Y/{print $4}' "$wd"/info/$id_window`
# got the center coordinate of window
cx_window=$(( $x_window + $w_window / 2 ))
cy_window=$(( $y_window + $h_window / 2 ))
# check if there is a config file for this window.
if [ ! -f "$wd/$id_window" ];then #if not found, then make it!
while read line;do
mntr=($line)
#echo "${mntr[@]}"
w_plus_x=$(( ${mntr[1]} + ${mntr[3]} ))
#echo w_plus_x = "$w_plus_x"
#echo "$x_window" "$w_plus_x"
if [ "$x_window" -lt "$w_plus_x" ];then
#echo "the window is on ${mntr[0]}"
current=(${mntr[@]})
echo "${current[@]}" > "$wd/$id_window"
break
#else
#echo "the window is on the right of $mntr"
fi
done < "$wd"/monitors-active
else
#echo "take from config file in $wd/$id_window"
current=(`cat $wd/$id_window`)
fi
#echo "Selesai"
#echo current monitor: "${current[@]}"
echo
# set the margin into current monitor config
#current[1]=$(( ${current[1]} - $margin_left - $margin_right ))
#current[2]=$(( ${current[2]} - $margin_top - $margin_bottom ))
#current[3]=$(( ${current[3]} + $margin_left ))
#current[4]=$(( ${current[4]} + $margin_top ))
goto_left_monitor(){
left=(`grep -B 1 "${current[0]}" "$wd"/monitors-active|grep -v "${current[0]}"`)
if [ ${#left[@]} -eq 0 ];then left=(`tail -1 "$wd"/monitors-active`); fi
echo ${left[@]} > "$wd/$id_window"
current=(${left[@]})
}
goto_right_monitor(){
right=(`grep -A 1 "${current[0]}" "$wd"/monitors-active|grep -v "${current[0]}"`)
if [ ${#right[@]} -eq 0 ];then right=(`head -1 "$wd"/monitors-active`); fi
echo ${right[@]} > "$wd/$id_window"
current=(${right[@]})
}
# position window on monitor
# 1 | 2 | 3
#----------- h1
# 4 | 5 | 6
#----------- h2
# 7 | 8 | 9
# w1 w2
w1=$(( ${current[3]} + ${current[1]} / 3 ))
w2=$(( ${current[3]} + ${current[1]} / 3 * 2))
h1=$(( ${current[4]} + ${current[2]} / 3 ))
h2=$(( ${current[4]} + ${current[2]} / 3 * 2))
echo cx:$cx_window, w: $w1, $w2, $(( ${current[1]} + ${current[3]} ))
echo cy:$cy_window, h: $h1, $h2, $(( ${current[2]} + ${current[4]} ))
# result
pos1(){
x=${current[3]}
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos1 on ${current[0]}
}
pos2(){
x=${current[3]}
y=${current[4]}
w=${current[1]}
h=$(( ${current[2]} / 2 ))
echo pos2 on ${current[0]}
}
pos3(){
x=$(( ${current[3]} + ${current[1]} / 2 ))
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos3 on ${current[0]}
}
pos4(){
x=${current[3]}
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=${current[2]}
echo pos4 on ${current[0]}
}
pos5(){
x=${current[3]}
y=${current[4]}
w=${current[1]}
h=${current[2]}
echo pos5 on ${current[0]}
}
pos6(){
x=$(( ${current[3]} + ${current[1]} / 2 ))
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=${current[2]}
echo pos6 on ${current[0]}
}
pos7(){
x=${current[3]}
y=$(( ${current[4]} + ${current[2]} / 2 ))
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos7 on ${current[0]}
}
pos8(){
x=${current[3]}
y=$(( ${current[4]} + ${current[2]} / 2 ))
w=${current[1]}
h=$(( ${current[2]} / 2 ))
echo pos8 on ${current[0]}
}
pos9(){
x=$(( ${current[3]} + ${current[1]} / 2 ))
y=$(( ${current[4]} + ${current[2]} / 2 ))
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos9 on ${current[0]}
}
center(){
margin=150
x=$(( ${current[3]} + $margin ))
y=$(( ${current[4]} + $margin / 2 ))
w=$(( ${current[1]} - 2 * $margin ))
h=$(( ${current[2]} - $margin ))
echo center on ${current[0]}
}
# check, where is this window position (1 - 9)
if [ $cy_window -lt $h1 ];then
echo top of h1: 1, 2, 3
if [ $cx_window -lt $w1 ];then
echo 1
case $1 in
-up) goto_left_monitor; pos7;;
-right) pos2;;
-down) pos4;;
-left) goto_left_monitor; pos3;;
*) pos2;;
esac
elif [ $cx_window -lt $w2 ];then
echo 2
case $1 in
-up) pos5;;
-right) pos3;;
-down) center;;
-left) pos1;;
*) pos3;;
esac
else
echo 3
case $1 in
-up) goto_left_monitor; pos9;;
-right) goto_right_monitor; pos1;;
-down) pos6;;
-left) pos2;;
*) goto_right_monitor; pos1;;
esac
fi
elif [ $cy_window -lt $h2 ];then
echo between h1 and h2: 4, 5, 6
if [ $cx_window -lt $w1 ];then
echo 4
case $1 in
-up) pos1;;
-right) center;;
-down) pos7;;
-left) goto_left_monitor; pos6;;
*) center;;
esac
elif [ $cx_window -lt $w2 ];then
echo 5
case $1 in
-up) pos2;;
-right) pos6;;
-down) pos8;;
-left) pos4;;
*) pos6;;
esac
else
echo 6
case $1 in
-up) pos3;;
-right) goto_right_monitor; pos4;;
-down) pos9;;
-left) center;;
*) goto_right_monitor; pos4;;
esac
fi
else
echo bottom of h2: 7, 8, 9
if [ $cx_window -lt $w1 ];then
echo 7
case $1 in
-up) pos4;;
-right) pos8;;
-down) goto_right_monitor; pos1;;
-left) goto_left_monitor; pos9;;
*) pos8;;
esac
elif [ $cx_window -lt $w2 ];then
echo 8
case $1 in
-up) center;;
-right) pos9;;
-down) goto_right_monitor; pos2;;
-left) pos7;;
*) pos9;;
esac
else
echo 9
case $1 in
-up) pos6;;
-right) goto_right_monitor; pos7;;
-down) goto_right_monitor; pos3;;
-left) pos8;;
*) goto_right_monitor; pos7;;
esac
fi
fi
# set up for border and decoration
w=$(( $w - 2*$border ))
h=$(( $h - $title - $border ))
echo x,y,w,h now
echo $x,$y,$w,$h
# run twice to make terminal better place
wmctrl -r :ACTIVE: -b remove,maximized_vert,maximized_horz
wmctrl -r :ACTIVE: -e 0,$x,$y,$w,$h
wmctrl -r :ACTIVE: -e 1,$x,$y,$w,$h
And this script for stickyxfce:
Code: Select all
#!/bin/bash
# 220321 partition screen into three height (h1 and h2 line as border)
# and three width (w1 and w2 line as border)
# 220503 add margins
wd=`echo /tmp$HOME/.stickyjwm`
#echo "$wd"
#rm -r "$wd"
mkdir -p "$wd"
case "$1" in
-h|--help) echo ' usage:
-up : snap to top monitor
-left : snap to left monitor
-down : snap to bottom monitor
-right : snap to right monitor'
esac
if [ -f $HOME/.stickyjwm/stickyjwm-conf ];then
conf="$HOME/.stickyjwm/stickyjwm-conf"
margin_top=`grep "margin_top:.*" "$conf"|cut -d\: -f2`
margin_left=`grep "margin_left:.*" "$conf"|cut -d\: -f2`
margin_bottom=`grep "margin_bottom:.*" "$conf"|cut -d\: -f2`
margin_right=`grep "margin_right:.*" "$conf"|cut -d\: -f2`
echo "$margin_top, $margin_left, $margin_bottom, $margin_right"
else
mkdir $HOME/.stickyjwm/
margin_top=0
margin_left=0
margin_bottom=0
margin_right=0
echo 'margin_top:0
margin_left:0
margin_bottom:0
margin_right:0' > "$HOME/.stickyjwm/stickyjwm-conf"
fi
# list all active monitors and sort it by x coordinate
xrandr --listactivemonitors|grep x|awk -F '[ +x/]' '{print $4,$5-'$margin_left'-'$margin_right',$7-'$margin_top'-'$margin_bottom',$9+'$margin_left',$10+'$margin_top'}'|sed 's/*//g'|sort -k4,4n > "$wd"/monitors-active
# debug
# name w h x y of monitor
# 0 1 2 3 4
## Get window position information
if [ ! -d "$wd"/info ];then mkdir -p "$wd"/info; fi
id_window=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW|cut -f2)
xwininfo -id $id_window>"$wd"/info/$id_window
w_window=`awk '/Width/{print $2}' "$wd"/info/$id_window`
h_window=`awk '/Height/{print $2}' "$wd"/info/$id_window`
x_window=`awk '/Absolute upper-left X/{print $4}' "$wd"/info/$id_window`
y_window=`awk '/Absolute upper-left Y/{print $4}' "$wd"/info/$id_window`
border=`awk '/Relative upper-left X/{print $4}' "$wd"/info/$id_window`
title=`awk '/Relative upper-left Y/{print $4}' "$wd"/info/$id_window`
# got the center coordinate of window
cx_window=$(( $x_window + $w_window / 2 ))
cy_window=$(( $y_window + $h_window / 2 ))
# check if there is a config file for this window.
if [ ! -f "$wd/$id_window" ];then #if not found, then make it!
while read line;do
mntr=($line)
#echo "${mntr[@]}"
w_plus_x=$(( ${mntr[1]} + ${mntr[3]} ))
#echo w_plus_x = "$w_plus_x"
#echo "$x_window" "$w_plus_x"
if [ "$x_window" -lt "$w_plus_x" ];then
#echo "the window is on ${mntr[0]}"
current=(${mntr[@]})
echo "${current[@]}" > "$wd/$id_window"
break
#else
#echo "the window is on the right of $mntr"
fi
done < "$wd"/monitors-active
else
#echo "take from config file in $wd/$id_window"
current=(`cat $wd/$id_window`)
fi
#echo "Selesai"
#echo current monitor: "${current[@]}"
echo
# set the margin into current monitor config
#current[1]=$(( ${current[1]} - $margin_left - $margin_right ))
#current[2]=$(( ${current[2]} - $margin_top - $margin_bottom ))
#current[3]=$(( ${current[3]} + $margin_left ))
#current[4]=$(( ${current[4]} + $margin_top ))
goto_left_monitor(){
left=(`grep -B 1 "${current[0]}" "$wd"/monitors-active|grep -v "${current[0]}"`)
if [ ${#left[@]} -eq 0 ];then left=(`tail -1 "$wd"/monitors-active`); fi
echo ${left[@]} > "$wd/$id_window"
current=(${left[@]})
}
goto_right_monitor(){
right=(`grep -A 1 "${current[0]}" "$wd"/monitors-active|grep -v "${current[0]}"`)
if [ ${#right[@]} -eq 0 ];then right=(`head -1 "$wd"/monitors-active`); fi
echo ${right[@]} > "$wd/$id_window"
current=(${right[@]})
}
# position window on monitor
# 1 | 2 | 3
#----------- h1
# 4 | 5 | 6
#----------- h2
# 7 | 8 | 9
# w1 w2
w1=$(( ${current[3]} + ${current[1]} / 3 ))
w2=$(( ${current[3]} + ${current[1]} / 3 * 2))
h1=$(( ${current[4]} + ${current[2]} / 3 ))
h2=$(( ${current[4]} + ${current[2]} / 3 * 2))
echo cx:$cx_window, w: $w1, $w2, $(( ${current[1]} + ${current[3]} ))
echo cy:$cy_window, h: $h1, $h2, $(( ${current[2]} + ${current[4]} ))
# result
pos1(){
x=${current[3]}
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos1 on ${current[0]}
}
pos2(){
x=${current[3]}
y=${current[4]}
w=${current[1]}
h=$(( ${current[2]} / 2 ))
echo pos2 on ${current[0]}
}
pos3(){
x=$(( ${current[3]} + ${current[1]} / 2 ))
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos3 on ${current[0]}
}
pos4(){
x=${current[3]}
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=${current[2]}
echo pos4 on ${current[0]}
}
pos5(){
x=${current[3]}
y=${current[4]}
w=${current[1]}
h=${current[2]}
echo pos5 on ${current[0]}
}
pos6(){
x=$(( ${current[3]} + ${current[1]} / 2 ))
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=${current[2]}
echo pos6 on ${current[0]}
}
pos7(){
x=${current[3]}
y=$(( ${current[4]} + ${current[2]} / 2 ))
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos7 on ${current[0]}
}
pos8(){
x=${current[3]}
y=$(( ${current[4]} + ${current[2]} / 2 ))
w=${current[1]}
h=$(( ${current[2]} / 2 ))
echo pos8 on ${current[0]}
}
pos9(){
x=$(( ${current[3]} + ${current[1]} / 2 ))
y=$(( ${current[4]} + ${current[2]} / 2 ))
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos9 on ${current[0]}
}
center(){
margin=150
x=$(( ${current[3]} + $margin ))
y=$(( ${current[4]} + $margin / 2 ))
w=$(( ${current[1]} - 2 * $margin ))
h=$(( ${current[2]} - $margin ))
echo center on ${current[0]}
}
# check, where is this window position (1 - 9)
if [ $cy_window -lt $h1 ];then
echo top of h1: 1, 2, 3
if [ $cx_window -lt $w1 ];then
echo 1
case $1 in
-up) pos5;;
-right) pos2;;
-down) pos4;;
-left) goto_left_monitor; pos3;;
*) pos2;;
esac
elif [ $cx_window -lt $w2 ];then
echo 2
case $1 in
-up) pos5;;
-right) pos3;;
-down) center;;
-left) pos1;;
*) pos3;;
esac
else
echo 3
case $1 in
-up) pos5;;
-right) goto_right_monitor; pos1;;
-down) pos6;;
-left) pos2;;
*) goto_right_monitor; pos1;;
esac
fi
elif [ $cy_window -lt $h2 ];then
echo between h1 and h2: 4, 5, 6
if [ $cx_window -lt $w1 ];then
echo 4
case $1 in
-up) pos1;;
-right) center;;
-down) pos7;;
-left) goto_left_monitor; pos6;;
*) center;;
esac
elif [ $cx_window -lt $w2 ];then
echo 5
case $1 in
-up) pos2;;
-right) pos6;;
-down) pos8;;
-left) pos4;;
*) pos6;;
esac
else
echo 6
case $1 in
-up) pos3;;
-right) goto_right_monitor; pos4;;
-down) pos9;;
-left) center;;
*) goto_right_monitor; pos4;;
esac
fi
else
echo bottom of h2: 7, 8, 9
if [ $cx_window -lt $w1 ];then
echo 7
case $1 in
-up) pos4;;
-right) pos8;;
-down) goto_right_monitor; pos1;;
-left) goto_left_monitor; pos9;;
*) pos8;;
esac
elif [ $cx_window -lt $w2 ];then
echo 8
case $1 in
-up) center;;
-right) pos9;;
-down) goto_right_monitor; pos2;;
-left) pos7;;
*) pos9;;
esac
else
echo 9
case $1 in
-up) pos6;;
-right) goto_right_monitor; pos7;;
-down) goto_right_monitor; pos3;;
-left) pos8;;
*) goto_right_monitor; pos7;;
esac
fi
fi
# set up for border and decoration
w=$(( $w - 2*$border ))
h=$(( $h - $title - $border ))
echo x,y,w,h now
echo $x,$y,$w,$h
# run twice to make terminal better place
wmctrl -r :ACTIVE: -b remove,maximized_vert,maximized_horz
wmctrl -r :ACTIVE: -e 0,$x,$y,$w,$h
wmctrl -r :ACTIVE: -e 1,$x,$y,$w,$h
Re: Stickyjwm and Stickyxfce-- Control Windows
Posted: Thu May 19, 2022 1:01 am
by MochiMoppel
recobayu wrote: ↑Wed May 18, 2022 8:55 am
I change a little to make it works from your code, that is replace the type-hint="7" with decorated="false"
Why? Xfwm doesn't support it? My main reason to use type-hint="7" is its ability to open the test window under any other window, thus making it as invisible as possible and further reduce the flicker.
Re: Stickyjwm and Stickyxfce-- Control Windows
Posted: Fri May 20, 2022 7:23 am
by recobayu
Hi @MochiMoppel, when I use type-hint="7", it give me wrong margin like this:
margin top: 60
margin left: 1
margin bottom: 100
margin right: 100
and I think the window doesn't maximize.
I try it on voidpup64.
Update: This code is implement mochi's idea on multiple monitors to calculate the margins.
Code: Select all
#!/bin/bash
#dapatkan idwindownya
id=`xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW|cut -f2`
#echo $id
info=`xwininfo -id $id`
#echo "$info"
#dapatkan whxy window sebelum difullscreen
w_window=`echo "$info"|awk '/Width/{print $2}'`
h_window=`echo "$info"|awk '/Height/{print $2}'`
x_window=`echo "$info"|awk '/Absolute upper-left X/{print $4}'`
y_window=`echo "$info"|awk '/Absolute upper-left Y/{print $4}'`
#hilangkan dekorasi windownya
xprop -id "$id" -format _MOTIF_WM_HINTS 32i -set _MOTIF_WM_HINTS 2
#buat window menjadi maximized
wmctrl -ir "$id" -b add,maximized_vert,maximized_horz
sleep .1
info=`xwininfo -id $id`
#dapatkan whxy window setelah difullscreen
w_full=`echo "$info"|awk '/Width/{print $2}'`
h_full=`echo "$info"|awk '/Height/{print $2}'`
x_full=`echo "$info"|awk '/Absolute upper-left X/{print $4}'`
y_full=`echo "$info"|awk '/Absolute upper-left Y/{print $4}'`
monitors=`xrandr --listactivemonitors|grep x|awk -F '[ +x/]' '{print $12, $5, $7, $9, $10}'|sort -k4,4n`
echo "$monitors"
echo '---------------'
while read line;do
monitor=($line)
w_monitor=${monitor[1]}
h_monitor=${monitor[2]}
x_monitor=${monitor[3]}
y_monitor=${monitor[4]}
x_diff=$[x_full - w_monitor - x_monitor ]
y_diff=$[y_full - h_monitor - y_monitor ]
if [ "$x_diff" -le 0 -a "$y_diff" -le 0 ];then
top_margin=$[y_full - y_monitor]
left_margin=$[x_full - x_monitor]
bottom_margin=$[h_monitor - h_full - top_margin]
right_margin=$[w_monitor - w_full - left_margin]
if [ $top_margin -lt 0 -o $left_margin -lt 0 -o $bottom_margin -lt 0 -o $right_margin -lt 0 ];then
continue
else
break
fi
fi
done <<< "$monitors"
echo top:$top_margin
echo left:$left_margin
echo bottom:$bottom_margin
echo right:$right_margin
#munculkan lagi dekorasi windownya
xprop -id "$id" -format _MOTIF_WM_HINTS 32i -set _MOTIF_WM_HINTS 0
wmctrl -ir "$id" -b remove,maximized_vert,maximized_horz
Re: Stickyjwm and Stickyxfce-- Control Windows
Posted: Tue Aug 16, 2022 3:49 pm
by recobayu
I make this implementation of @MochiMoppel's idea. It flicker when change monitor to detect automatically whxy of fullscreen window.
stickyxfce
Code: Select all
#!/bin/bash
# 220321 partition screen into three height (h1 and h2 line as border)
# and three width (w1 and w2 line as border)
# 220503 add margins
# 220816 set margins automatically when go to another monitor
wd=`echo /tmp$HOME/.stickyjwm`
#echo "$wd"
#rm -r "$wd"
mkdir -p "$wd"
case "$1" in
-h|--help) echo ' usage:
-up : snap to top monitor
-left : snap to left monitor
-down : snap to bottom monitor
-right : snap to right monitor'
esac
#get the idwindow and information about it
id=`xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW|cut -f2`
info=`xwininfo -id $id`
#get the whxy window before fullscreen-ed
w_window=`echo "$info"|awk '/Width/{print $2}'`
h_window=`echo "$info"|awk '/Height/{print $2}'`
x_window=`echo "$info"|awk '/Absolute upper-left X/{print $4}'`
y_window=`echo "$info"|awk '/Absolute upper-left Y/{print $4}'`
border=`echo "$info"|awk '/Relative upper-left X/{print $4}'`
title=`echo "$info"|awk '/Relative upper-left Y/{print $4}'`
#find the maximized window properties of current monitor
maximized(){
#set the window decoration gone (it doesn't effect anything in xfce, so I comment it)
#xprop -id "$id" -format _MOTIF_WM_HINTS 32i -set _MOTIF_WM_HINTS 2
#maximized the window (thank you, Mochimoppel)
wmctrl -ir "$id" -b add,maximized_vert,maximized_horz
sleep .1
info=`xwininfo -id $id`
#get the whxy window after fullscreen-ed
w_full=`echo "$info"|awk '/Width/{print $2}'`
h_full=`echo "$info"|awk '/Height/{print $2}'`
x_full=`echo "$info"|awk '/Absolute upper-left X/{print $4}'`
y_full=`echo "$info"|awk '/Absolute upper-left Y/{print $4}'`
#set the window decoration appear (it doesn't effect anything in xfce, so I comment it)
#xprop -id "$id" -format _MOTIF_WM_HINTS 32i -set _MOTIF_WM_HINTS 0
wmctrl -ir "$id" -b remove,maximized_vert,maximized_horz
current[1]=$w_full
current[2]=$[h_full + title]
current[3]=$x_full
current[4]=$[y_full - title]
echo ${current[@]} > "$wd/$id"
}
monitors=`xrandr --listactivemonitors|grep x|awk -F '[ +x/]' '{print $12, $5, $7, $9, $10}'|sort -k4,4n`
echo "$monitors"
# debug
# name w h x y of monitor
# 0 1 2 3 4
## Get window position information
# got the center coordinate of window
cx_window=$(( $x_window + $w_window / 2 ))
cy_window=$(( $y_window + $h_window / 2 ))
# check if there is a config file for this window.
if [ ! -f "$wd/$id" ];then #if not found, then make it!
while read line;do
mntr=($line)
#echo "${mntr[@]}"
w_plus_x=$(( ${mntr[1]} + ${mntr[3]} ))
#echo w_plus_x = "$w_plus_x"
#echo "$x_window" "$w_plus_x"
if [ "$x_window" -lt "$w_plus_x" ];then
#echo "the window is on ${mntr[0]}"
current=(${mntr[@]})
echo "${current[@]}" > "$wd/$id"
break
#else
#echo "the window is on the right of $mntr"
fi
done <<< "$monitors"
else
#echo "take from config file in $wd/$id_window"
current=(`cat $wd/$id`)
fi
#echo "Finished"
#echo current monitor: "${current[@]}"
echo
goto_left_monitor(){
left=(`echo "$monitors"|grep -B 1 "${current[0]}"|grep -v "${current[0]}"`)
if [ ${#left[@]} -eq 0 ];then left=(`echo "$monitors"|tail -1`); fi
current=(${left[@]})
wmctrl -r :ACTIVE: -e 1,${current[3]},-1,-1,-1
maximized
}
goto_right_monitor(){
right=(`echo "$monitors"|grep -A 1 "${current[0]}"|grep -v "${current[0]}"`)
if [ ${#right[@]} -eq 0 ];then right=(`echo "$monitors"|head -1`); fi
current=(${right[@]})
wmctrl -r :ACTIVE: -e 1,${current[3]},-1,-1,-1
maximized
}
# position window on monitor
# 1 | 2 | 3
#----------- h1
# 4 | 5 | 6
#----------- h2
# 7 | 8 | 9
# w1 w2
w1=$(( ${current[3]} + ${current[1]} / 3 ))
w2=$(( ${current[3]} + ${current[1]} / 3 * 2))
h1=$(( ${current[4]} + ${current[2]} / 3 ))
h2=$(( ${current[4]} + ${current[2]} / 3 * 2))
echo cx:$cx_window, w: $w1, $w2, $(( ${current[1]} + ${current[3]} ))
echo cy:$cy_window, h: $h1, $h2, $(( ${current[2]} + ${current[4]} ))
# result
pos1(){
x=${current[3]}
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos1 on ${current[0]}
}
pos2(){
x=${current[3]}
y=${current[4]}
w=${current[1]}
h=$(( ${current[2]} / 2 ))
echo pos2 on ${current[0]}
}
pos3(){
x=$(( ${current[3]} + ${current[1]} / 2 ))
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos3 on ${current[0]}
}
pos4(){
x=${current[3]}
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=${current[2]}
echo pos4 on ${current[0]}
}
pos5(){
x=${current[3]}
y=${current[4]}
w=${current[1]}
h=${current[2]}
echo pos5 on ${current[0]}
}
pos6(){
x=$(( ${current[3]} + ${current[1]} / 2 ))
y=${current[4]}
w=$(( ${current[1]} / 2 ))
h=${current[2]}
echo pos6 on ${current[0]}
}
pos7(){
x=${current[3]}
y=$(( ${current[4]} + ${current[2]} / 2 ))
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos7 on ${current[0]}
}
pos8(){
x=${current[3]}
y=$(( ${current[4]} + ${current[2]} / 2 ))
w=${current[1]}
h=$(( ${current[2]} / 2 ))
echo pos8 on ${current[0]}
}
pos9(){
x=$(( ${current[3]} + ${current[1]} / 2 ))
y=$(( ${current[4]} + ${current[2]} / 2 ))
w=$(( ${current[1]} / 2 ))
h=$(( ${current[2]} / 2 ))
echo pos9 on ${current[0]}
}
center(){
margin=150
x=$(( ${current[3]} + $margin ))
y=$(( ${current[4]} + $margin / 2 ))
w=$(( ${current[1]} - 2 * $margin ))
h=$(( ${current[2]} - $margin ))
echo center on ${current[0]}
}
# check, where is this window position (1 - 9)
if [ $cy_window -lt $h1 ];then
echo top of h1: 1, 2, 3
if [ $cx_window -lt $w1 ];then
echo 1
case $1 in
-up) pos5;;
-right) pos2;;
-down) pos4;;
-left) goto_left_monitor; pos3;;
*) pos2;;
esac
elif [ $cx_window -lt $w2 ];then
echo 2
case $1 in
-up) pos5;;
-right) pos3;;
-down) center;;
-left) pos1;;
*) pos3;;
esac
else
echo 3
case $1 in
-up) pos5;;
-right) goto_right_monitor; pos1;;
-down) pos6;;
-left) pos2;;
*) goto_right_monitor; pos1;;
esac
fi
elif [ $cy_window -lt $h2 ];then
echo between h1 and h2: 4, 5, 6
if [ $cx_window -lt $w1 ];then
echo 4
case $1 in
-up) pos1;;
-right) center;;
-down) pos7;;
-left) goto_left_monitor; pos6;;
*) center;;
esac
elif [ $cx_window -lt $w2 ];then
echo 5
case $1 in
-up) pos2;;
-right) pos6;;
-down) pos8;;
-left) pos4;;
*) pos6;;
esac
else
echo 6
case $1 in
-up) pos3;;
-right) goto_right_monitor; pos4;;
-down) pos9;;
-left) center;;
*) goto_right_monitor; pos4;;
esac
fi
else
echo bottom of h2: 7, 8, 9
if [ $cx_window -lt $w1 ];then
echo 7
case $1 in
-up) pos4;;
-right) pos8;;
-down) goto_right_monitor; pos1;;
-left) goto_left_monitor; pos9;;
*) pos8;;
esac
elif [ $cx_window -lt $w2 ];then
echo 8
case $1 in
-up) center;;
-right) pos9;;
-down) goto_right_monitor; pos2;;
-left) pos7;;
*) pos9;;
esac
else
echo 9
case $1 in
-up) pos6;;
-right) goto_right_monitor; pos7;;
-down) goto_right_monitor; pos3;;
-left) pos8;;
*) goto_right_monitor; pos7;;
esac
fi
fi
# set up for border and decoration
w=$(( $w - 2*$border ))
h=$(( $h - $title - $border ))
echo x,y,w,h now
echo $x,$y,$w,$h
# run twice to make terminal better place
wmctrl -r :ACTIVE: -b remove,maximized_vert,maximized_horz
#wmctrl -r :ACTIVE: -e 0,$x,$y,$w,$h
wmctrl -r :ACTIVE: -e 1,$x,$y,$w,$h
Edit: It still failed on some monitor placement
Re: Stickyjwm and Stickyxfce-- Control Windows
Posted: Wed Aug 17, 2022 3:52 am
by MochiMoppel
recobayu wrote: ↑Tue Aug 16, 2022 3:49 pm
I make this implementation of @MochiMoppel's idea. It flicker when change monitor to detect automatically whxy of fullscreen window.
Looks like a bad idea .
I tested MochiMoppel's idea without type-hint but with a decorated test window (forgot to set it to undecorated) ... and it failed . I think it should better calculate with relative, not absolute dimensions. The flicker is truly annoying.
I have a better idea - again
This works for me with JWM. Apart from a single call to xprop it uses only bash and bash built-ins. No wmctrl, no awk, no cut, no maximizing, no flicker. May also work in XFCE, but not guaranteed as the calculation of the _NET_WORKAREA property is at the discretion of the window manager.
Code: Select all
#!/bin/sh
read DUMMY SCREEN_W SCREEN_H DUMMY MARGIN_L MARGIN_T MAXWIN_W MAXWIN_H <<< $(xprop -root 32c ' $0 $1 ' _NET_DESKTOP_GEOMETRY 32c ' $0 $1 $2 $3 ' _NET_WORKAREA)
MARGIN_R=$((SCREEN_W-MARGIN_L-MAXWIN_W))
MARGIN_B=$((SCREEN_H-MARGIN_T-MAXWIN_H))
gxmessage -c "Screen dimension (WxH):${SCREEN_W}x${SCREEN_H}
Space (in px, calculated from screen edges) reserved for trays
Top: $MARGIN_T
Right: $MARGIN_R
Bottom: $MARGIN_B
Left: $MARGIN_L
Maximum possible size (WxH) of a window not allowed to cover trays:
${MAXWIN_W}x${MAXWIN_H}"
- calculating_usable_area.png (15.45 KiB) Viewed 2986 times
Above test was made with 3 trays (top,left,bottom), all set to autohide="false"
. Setting autohide to true would correctly remove the margin.
Personally I prefer the set command (also a bash built-in) for its readability and speed:
Code: Select all
set -- $(xprop -root 32c ' $0 $1 ' _NET_DESKTOP_GEOMETRY 32c ' $0 $1 $2 $3 ' _NET_WORKAREA)
SCREEN_W=$2
SCREEN_H=$3
MARGIN_L=$5
MARGIN_T=$6
MARGIN_R=$(($2-$5-$7))
MARGIN_B=$(($3-$6-$8))
set --
echo "Screen width,height: $SCREEN_W $SCREEN_H"
echo "Margins (t,r,b,l): $MARGIN_T $MARGIN_R $MARGIN_B $MARGIN_L"
Re: Stickyjwm and Stickyxfce-- Control Windows
Posted: Thu Oct 06, 2022 11:09 pm
by geo_c
Which one of these scripts is the official "working" version for XFCE?
I want to add it to KLV because I'm completely dependent on the JWM version in Fossapup. It's indespensable at this point.
Re: Stickyjwm and Stickyxfce-- Control Windows
Posted: Fri Oct 07, 2022 3:29 am
by MochiMoppel
geo_c wrote: ↑Thu Oct 06, 2022 11:09 pm
Which one of these scripts is the official "working" version for XFCE?
Do my scripts work with XFCE?
Re: Stickyjwm and Stickyxfce-- Control Windows
Posted: Fri Oct 07, 2022 3:33 am
by geo_c
MochiMoppel wrote: ↑Fri Oct 07, 2022 3:29 am
geo_c wrote: ↑Thu Oct 06, 2022 11:09 pm
Which one of these scripts is the official "working" version for XFCE?
Do my scripts work with XFCE?
I haven't tried it, because I downloaded a pet and I'm not quite sure where it even copied itself, but I could copy the code and try and give it a whirl.
I linked to this post: viewtopic.php?p=56582#p56582 from some other post on the forum and it looked like there might be a separate script for XCFE.
Re: Stickyjwm and Stickyxfce-- Control Windows
Posted: Sat Oct 08, 2022 2:26 pm
by geo_c
MochiMoppel wrote: ↑Fri Oct 07, 2022 3:29 am
geo_c wrote: ↑Thu Oct 06, 2022 11:09 pm
Which one of these scripts is the official "working" version for XFCE?
Do my scripts work with XFCE?
@rockedge added it to the latest KLV, so I don't need it at this point, since KLV is the only XFCE desktop I currently run. Maybe those two scripts should be made into packages for future pups, dogs, and weedogs. I can't comfortably navigate my computer without it anymore.