ref: 89647c0ea4464f090cf054d9a52ceb5d413c93f8
parent: 092f29dc1f95cebedf11cd29aad4f07756b51e74
author: Sigrid Haflínudóttir <ftrvxmtrx@gmail.com>
date: Sun Mar 29 16:18:37 EDT 2020
desktop switching and moving windows
--- a/README.md
+++ b/README.md
@@ -22,6 +22,8 @@
## Keys
```
-G-f toggle fullscreen for the current window
-G-enter start a new window
+G-f toggle fullscreen for the current window
+G-enter start a new window
+G-[0..9] switch to a specific virtual desktop
+G-shift-[0..9] move the current window to a specific virtual desktop
```
--- a/riow
+++ b/riow
@@ -1,10 +1,13 @@
#!/bin/rc
rfork ne
+# these are shown on every desktop
+sticky=(kbmap stats winwatch)
+
alt=0
ctl=0
-glenda=0
shift=0
+curdesktop=1
fn scrsize {
s=`{syscall -o read 0 buf 60 </dev/screen >[2]/dev/null}
@@ -12,16 +15,26 @@
screenh=$s(5)
}
+fn winread {
+ syscall -o read 0 buf 120 <$1/wctl >[2]/dev/null
+}
+
+fn winlabel {
+ cat $1/label
+}
+
fn fullscreen {
scrsize
for(f in /dev/wsys/*){
- a=`{syscall -o read 0 buf 64 <$f/wctl >[2]/dev/null}
+ a=`{winread $f}
if(~ $a(5) current){
winid=`{basename $f}
- if(~ $a(1) 0 && ~ $a(2) 0 && ~ $a(3) $screenw && ~ $a(4) $screenh)
- echo resize -r `{eval echo '$winsize_'^$winid} >$f/wctl
+ if(~ $a(1) 0 && ~ $a(2) 0 && ~ $a(3) $screenw && ~ $a(4) $screenh){
+ if(test -f /env/winsize_^$winid)
+ echo resize -r `{cat /env/winsize_^$winid} >$f/wctl
+ }
if not {
- eval 'winsize_'^$winid'=$a(1 2 3 4)'
+ echo -n $a(1 2 3 4) >/env/winsize_^$winid
echo resize -r 0 0 9999 9999 >$f/wctl
}
}
@@ -28,11 +41,44 @@
}
}
+fn desktop {
+ for(f in /dev/wsys/*){
+ if(! ~ `{winlabel $f} $sticky){
+ a=`{winread $f}
+ winid=`{basename $f}
+ windesk=`{test -f /env/windesk_^$winid && cat /env/windesk_^$winid}
+
+ if(~ $shift 1){ # moving the current window elsewhere
+ if(~ $a(5) current){
+ echo -n $1 >/env/windesk_^$winid
+ echo hide >$f/wctl
+ }
+ }
+ if not {
+ # go through all visible windows
+ if(~ $a(6) visible){
+ if(~ $#windesk 0){ # no desktop and visible
+ # assign to the current one
+ echo -n $curdesktop >/env/windesk_^$winid
+ }
+ # and hide
+ echo hide >$f/wctl
+ }
+ if not { # hidden, unhide if should be shown now
+ if(~ $windesk $1)
+ echo unhide >$f/wctl
+ }
+ }
+ }
+ }
+ if(~ $shift 0)
+ curdesktop=$1
+}
+
fn handle {
# remember old states
oalt=$alt
octl=$ctl
- oglenda=$glenda
oshift=$shift
m=$1
@@ -42,31 +88,35 @@
shift
key=''
+ ukey=''
if(~ $state K && ~ $#* 0){
alt=0
ctl=0
- glenda=0
shift=0
}
if not {
while(! ~ $#* 0){
- if(~ $1 alt || ~ $1 ctl || ~ $1 glenda || ~ $1 shift){
+ if(~ $1 alt || ~ $1 ctl || ~ $1 shift)
eval '$1=$state'
- }
if not {
- # only react to 'c'
if(~ $m c)
key=$1
+ if(~ $m k)
+ ukey=$1
}
shift
}
}
- if(~ $key enter)
- window
- if(~ $key f)
- fullscreen
+ if(~ $alt 0 && ~ $ctl 0 && ~ $shift 0){
+ if(~ $key enter)
+ window
+ if(~ $key f)
+ fullscreen
+ }
+ if(~ $ukey [0-9] && ! ~ $ukey $curdesktop)
+ desktop $ukey
}
-gkbd | while(s=`{read }){
+gkbd | while(s=`{read}){
handle $s
}