Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.os.linux.advocacy > #402765

Re: window grouping updates

From owl <owl@rooftop.invalid>
Newsgroups comp.os.linux.advocacy
Subject Re: window grouping updates
Date 2017-03-23 07:21 +0000
Organization O.W.L.
Message-ID <ac93.g9pl2@rooftop.invalid> (permalink)
References <hjxib03.abue@rooftop.invalid> <D4F8A61D.96E06%usenet@gallopinginsanity.com>

Show all headers | View raw


Snit <usenet@gallopinginsanity.com> wrote:
> On 3/22/17, 9:54 PM, in article hjxib03.abue@rooftop.invalid, "owl"
> <owl@rooftop.invalid> wrote:
> 
>> Made some improvements to the window grouping utility:
>> 
>> - add/remove windows
>> - reposition windows
>> - gui control 
>> 
>> https://vid.me/4sEt
>> 
> 
> That is freaking cool... and the buttons do exactly what I would expect (I
> was wondering if you were going to demo the "pause" -- did just what one
> would expect it to do).
> 
> I see you can minimize them all... can you bring them all to the front, too?
> I assume even if not you could add a button or whatever to address them all
> and have then do so.
> 
> Overall just awesome... and far more "complete" than I expected to see.
> Thanks! 
> 
> Do you mind sharing the code behind it?
> 

I added a button to raise the windows.

The code is below.
There are two scripts, leader and linkem.  leader calls linkem.
In leader, set the LINKEM variable to whatever.

Need the following dependencies:
X11, bash, tcl/tk, wish, xdotool, xwininfo.  (I think that's about it).

It uses a tempfile in /tmp and cleans up after itself.  Hitting the "Stop"
button exits cleanly, but if you just close the window instead, there will
probably be a "linkem" process hanging around that you'll need to kill,
as well as a /tmp/windowlist0xNNNNNNN text file.  This linkem process
will also keep the windows stuck together as a group until it is killed.

++++++++++++++++ begin leader ++++++++++++++++
#!/usr/bin/wish

set LINKEM /home/anon/code/groups/linkem

proc addwindow {} {
 set wid [winfo id .]
 global LINKEM
 exec $LINKEM -a $wid &
}

proc removewindow {} {
 set wid [winfo id .]
 global LINKEM
 exec $LINKEM -r $wid &
}

proc run {} {
 set wid [winfo id .]
 global LINKEM
 set channel [ open "|$LINKEM -l $wid" ]
 global PID
 set PID [pid $channel]
}

proc pause {} {
 global PID
 exec kill -9 $PID
}

proc stop {} {
 set wid [winfo id .]
  global PID
  exec rm /tmp/windowlist$wid
  exec kill -9 $PID
  exit
}

proc raisewindows {} {
 set wid [winfo id .]
 global LINKEM
 exec $LINKEM -u $wid &
}

proc screen {} {
 frame .top -borderwidth 10
 pack .top -fill x
 button .top.addwindow -text "Add Window" -command {
  addwindow
  .top.run config -state normal 
  .top.removewindow config -state normal 
 }
 pack .top.addwindow -side left 
 button .top.run -text "Run" -state disabled -command {
   run 
   .top.run config -state disabled
   .top.addwindow config -state disabled
   .top.removewindow config -state disabled
   .top.stop config -state normal 
   .top.pause config -state normal 
   .top.raisewindows config -state normal 
   }
 pack .top.run -side left 
 button .top.pause -text "Pause" -state disabled -command {
  pause
  .top.run config -state normal
  .top.addwindow config -state normal
  .top.removewindow config -state normal
  .top.stop config -state normal
  .top.raisewindows config -state normal
  }
 pack .top.pause -side left 
 button .top.stop -text "Stop" -state disabled -command stop
 pack .top.stop -side left 
 button .top.removewindow -text "Remove Window" -state disabled -command {
 removewindow 
 .top.run config -state normal
 }
 pack .top.removewindow -side left 
 button .top.raisewindows -text "raisewindows" -state disabled -command {
 raisewindows
 }
 pack .top.raisewindows -side left 
 
}

screen 

++++++++++++++++ end leader ++++++++++++++++

++++++++++++++++ begin linkem ++++++++++++++++
#!/bin/bash
declare -a followerids
declare -a followersx
declare -a followersy
declare -a followersxsoffset
declare -a followersysoffset
# states: IsViewable, IsUnMapped

addwindow () {
touch /tmp/windowlist${1}
windowid=$(xwininfo |grep 'Window id:' |cut -f3 -d: |awk '{print $1}')
echo ${windowid} >> /tmp/windowlist${1}
}

removewindow () {
echo "in removewindow"
touch /tmp/windowlist${1}
windowid=$(xwininfo |grep 'Window id:' |cut -f3 -d: |awk '{print $1}')
sed -i "s/${windowid}//g" /tmp/windowlist${1}
}

linkem () {
leaderid=${1}

laulx=$(xwininfo -id "${leaderid}" |grep "Absolute upper-left X" \
|awk '{print $4}')
lauly=$(xwininfo -id "${leaderid}" |grep "Absolute upper-left Y" \
|awk '{print $4}')

followerids+=($(cat /tmp/windowlist${1} |sort |uniq))

xdotool windowraise ${leaderid}

for (( i=0;i<${#followerids[@]};i++ ));do
  followersx[${i}]=$(xwininfo -id "${followerids[${i}]}" \
|grep "Absolute upper-left X" |awk '{print $4}')
  followersy[${i}]=$(xwininfo -id "${followerids[${i}]}" \
|grep "Absolute upper-left Y" |awk '{print $4}')
done

for (( i=0;i<${#followerids[@]};i++ ));do
  followersxoffset[${i}]=$(( ${laulx}-${followersx[${i}]} ))
  followersyoffset[${i}]=$(( ${lauly}-${followersy[${i}]} ))
done

while [ 1 ]; do

laulx=$(xwininfo -id "${leaderid}" |grep "Absolute upper-left X" \
|awk '{print $4}')

lauly=$(xwininfo -id "${leaderid}" |grep "Absolute upper-left Y" \
|awk '{print $4}')

xdotool windowraise ${leaderid}

for (( i=0;i<${#followerids[@]};i++ ));do
xdotool windowmove ${followerids[${i}]} \
$((${laulx}-${followersxoffset[${i}]})) \
$((${lauly}-${followersyoffset[${i}]}))
done

   leaderstate=$(xwininfo -id ${leaderid} |grep "Map State:" \
|awk '{print $3}')
   
   if [ "${leaderstate}" = "IsViewable" ];then
      for (( i=0;i<${#followerids[@]};i++ ));do
         xdotool windowmap ${followerids[${i}]}
      done
   elif [ "${leaderstate}" = "IsUnMapped" ];then
      for (( i=0;i<${#followerids[@]};i++ ));do
         xdotool windowminimize ${followerids[${i}]}
      done
   fi

done
}

raisem () {
leaderid=${1}

laulx=$(xwininfo -id "${leaderid}" |grep "Absolute upper-left X" \
|awk '{print $4}')
lauly=$(xwininfo -id "${leaderid}" |grep "Absolute upper-left Y" \
|awk '{print $4}')

followerids+=($(cat /tmp/windowlist${1} |sort |uniq))

xdotool windowraise ${leaderid}
for (( i=0;i<${#followerids[@]};i++ ));do
  xdotool click --window ${followerids[${i}]} 1
done

}

touch /tmp/windowlist${2}
case ${1} in 
   -a)
      addwindow ${2}
      exit
    ;;
   -r)
      removewindow ${2}
      exit
    ;;
   -l)
      linkem ${2}
      exit
    ;;
   -u)
      raisem ${2}
      exit
    ;;
    *)
      exit
    ;; 
esac

++++++++++++++++ end linkem ++++++++++++++++

Back to comp.os.linux.advocacy | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

window grouping updates owl <owl@rooftop.invalid> - 2017-03-23 04:54 +0000
  Re: window grouping updates Snit <usenet@gallopinginsanity.com> - 2017-03-22 22:07 -0700
    Re: window grouping updates owl <owl@rooftop.invalid> - 2017-03-23 07:21 +0000
      Re: window grouping updates Snit <usenet@gallopinginsanity.com> - 2017-03-23 00:32 -0700
        Re: window grouping updates owl <owl@rooftop.invalid> - 2017-03-23 07:41 +0000
        Re: window grouping updates owl <owl@rooftop.invalid> - 2017-03-24 14:58 +0000
          Re: window grouping updates Marek Novotny <marek.novotny@marspolar.com> - 2017-03-24 10:48 -0500
  Re: window grouping updates Marek Novotny <marek.novotny@marspolar.com> - 2017-03-23 02:11 -0500
    Re: window grouping updates owl <owl@rooftop.invalid> - 2017-03-23 07:26 +0000
  Re: window grouping updates DFS <nospam@dfs.com> - 2017-03-23 09:04 -0400
    Re: window grouping updates Steve Carroll <fretwizzer@gmail.com> - 2017-03-23 08:50 -0700
      Re: window grouping updates Marek Novotny <marek.novotny@marspolar.com> - 2017-03-23 11:05 -0500
        Re: window grouping updates Steve Carroll <fretwizzer@gmail.com> - 2017-03-23 09:22 -0700
    Re: window grouping updates owl <owl@rooftop.invalid> - 2017-03-23 16:06 +0000

csiph-web