Docker build. Very basic zoom scrolling
This commit is contained in:
parent
c27e72bcfa
commit
fb6db109f8
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,2 +1,3 @@
|
|||
build/
|
||||
*.log
|
||||
*.out
|
||||
|
|
34
Dockerfile
34
Dockerfile
|
@ -1,3 +1,33 @@
|
|||
FROM alpine
|
||||
RUN apk add xvfb xdotool xfce4 ffmpeg chromium
|
||||
RUN rm -rf /var/cache/apk/*
|
||||
|
||||
RUN echo "@testing http://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
|
||||
|
||||
# Main dependencies
|
||||
RUN apk add --no-cache xvfb xdotool@testing xfce4 ffmpeg openssh mosh chromium
|
||||
|
||||
# Installing Hiptext, video to text renderer
|
||||
RUN apk --no-cache add --virtual build-dependencies \
|
||||
build-base git freetype-dev jpeg-dev ffmpeg-dev ragel
|
||||
RUN apk --no-cache add libgflags-dev@testing glog-dev@testing
|
||||
RUN mkdir -p build \
|
||||
&& cd build \
|
||||
&& wget -q -O /etc/apk/keys/andyshinn.rsa.pub https://raw.githubusercontent.com/andyshinn/alpine-pkg-glibc/master/andyshinn.rsa.pub \
|
||||
&& wget https://github.com/andyshinn/alpine-pkg-glibc/releases/download/2.23-r1/glibc-2.23-r1.apk \
|
||||
# && wget https://github.com/andyshinn/alpine-pkg-glibc/releases/download/2.23-r1/glibc-bin-2.23-r1.apk \
|
||||
# && wget https://github.com/andyshinn/alpine-pkg-glibc/releases/download/2.23-r1/glibc-i18n-2.23-r1.apk \
|
||||
&& apk --no-cache add glibc-2.23-r1.apk \
|
||||
# && apk add glibc-2.23-r1.apk glibc-bin-2.23-r1.apk glibc-i18n-2.23-r1.apk \
|
||||
# && /usr/glibc-compat/bin/localedef -i en_US -f UTF-8 en_US.UTF-8 \
|
||||
&& git clone https://github.com/tombh/hiptext \
|
||||
&& cd hiptext \
|
||||
&& git checkout ffmpeg-updates \
|
||||
&& make \
|
||||
# Alpine's version of `install` doesn't support the `--mode=` format
|
||||
&& install -m 0755 hiptext /usr/local/bin \
|
||||
&& cd ../.. && rm -rf build \
|
||||
|
||||
&& apk --no-cache del build-dependencies
|
||||
|
||||
COPY . /app
|
||||
|
||||
# CMD ["run.bash"]
|
||||
|
|
41
do.bash
41
do.bash
|
@ -1,41 +0,0 @@
|
|||
#
|
||||
# This is AWESOME.
|
||||
#
|
||||
# Original code by: Chris F.A. Johnson
|
||||
#
|
||||
ESC="" ## A literal escape character
|
||||
but_row=1
|
||||
|
||||
clear
|
||||
mv=1000 ## mv=1000 for press and release reporting; mv=9 for press only
|
||||
|
||||
_STTY=$(stty -g) ## Save current terminal setup
|
||||
stty -echo -icanon ## Turn off line buffering
|
||||
printf "${ESC}[?${mv}h " ## Turn on mouse reporting
|
||||
printf "${ESC}[?25l" ## Turn off cursor
|
||||
|
||||
while :
|
||||
do
|
||||
x=$(dd bs=1 count=6 2>/dev/null) ## Read six characters
|
||||
|
||||
m1=${x#???} ## Remove the first 3 characters
|
||||
m2=${x#????} ## Remove the first 4 characters
|
||||
m3=${x#?????} ## Remove the first 5 characters
|
||||
|
||||
## Convert to characters to decimal values
|
||||
eval "$(printf "mb=%d mx=%d my=%d" "'$m1" "'$m2" "'$m3")"
|
||||
|
||||
## Values > 127 are signed
|
||||
[ $mx -lt 0 ] && MOUSEX=$(( 223 + $mx )) || MOUSEX=$(( $mx - 32 ))
|
||||
[ $my -lt 0 ] && MOUSEY=$(( 223 + $my )) || MOUSEY=$(( $my - 32 ))
|
||||
|
||||
## Button pressed is in first 2 bits; use bitwise AND
|
||||
BUTTON=$(( ($mb & 3) + 1 ))
|
||||
echo $MOUSEX $MOUSEY $BUTTON > mouse.out
|
||||
|
||||
done
|
||||
|
||||
printf "${ESC}[?${mv}l" ## Turn off mouse reporting
|
||||
stty "$_STTY" ## Restore terminal settings
|
||||
printf "${ESC}[?12l${ESC}[?25h" ## Turn cursor back on
|
||||
printf "\n${ESC}[0J\n" ## Clear from cursor to bottom of screen
|
|
@ -1,21 +0,0 @@
|
|||
require 'curses'
|
||||
include Curses
|
||||
|
||||
# These 2 allow mouse input
|
||||
noecho # Prevent input being echoed to the screen
|
||||
stdscr.keypad(true) # Not sure what this does exactly, but mouse input doesn't work without it
|
||||
|
||||
# Block whilst waiting for input
|
||||
stdscr.timeout = -1
|
||||
|
||||
mousemask(ALL_MOUSE_EVENTS)
|
||||
|
||||
loop do
|
||||
case getch
|
||||
when KEY_MOUSE
|
||||
m = getmouse
|
||||
File.open('/home/tombh/Workspace/lowbandwidth/mouse.out', 'w') do |file|
|
||||
file.write("#{m.x}, #{m.y}, #{m.z}, #{m.bstate}")
|
||||
end
|
||||
end
|
||||
end
|
7
run.bash
7
run.bash
|
@ -1,7 +0,0 @@
|
|||
#!/bin/bash
|
||||
ffmpeg -f x11grab -s 3200x1600 -r 12 -i :0.0 -vcodec mpeg2video -f mpegts udp://127.0.0.1:1234 >> ffmpeg.log 2>&1 &
|
||||
sleep 1
|
||||
# (/home/tombh/.rbenv/versions/2.3.0/bin/ruby ./forward_mouse.rb <&3 &) 3<&0
|
||||
(./do.bash <&3 &) 3<&0
|
||||
hiptext -width 95 -font /usr/share/fonts/TTF/DejaVuSansMono.ttf 'udp://127.0.0.1:1234' 2> hiptext.log
|
||||
trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
|
47
run.sh
Executable file
47
run.sh
Executable file
|
@ -0,0 +1,47 @@
|
|||
#!/bin/sh
|
||||
|
||||
export LC_ALL=C
|
||||
export LANG=C
|
||||
|
||||
export DESKTOP_WIDTH='1600'
|
||||
export DESKTOP_HEIGHT='1200'
|
||||
export TERMINAL_WIDTH='95'
|
||||
export TERMINAL_HEIGHT='40'
|
||||
export DISPLAY=:0
|
||||
DESKTOP_RES="$DESKTOP_WIDTH"x"$DESKTOP_HEIGHT"
|
||||
UDP_URI='udp://127.0.0.1:1234'
|
||||
|
||||
# Create an X desktop in memory without actually displaying it on a real screen
|
||||
Xvfb :0 -screen 0 "$DESKTOP_RES"x16 &
|
||||
|
||||
/usr/bin/xfwm4 &
|
||||
/usr/bin/thunar &
|
||||
|
||||
sleep 5
|
||||
|
||||
# Convert the X framebuffer desktop into a video stream
|
||||
ffmpeg \
|
||||
-f x11grab \
|
||||
-s $DESKTOP_RES \
|
||||
-r 12 \
|
||||
-i :0.0 \
|
||||
-vcodec mpeg2video \
|
||||
-f mpegts \
|
||||
$UDP_URI \
|
||||
>> ffmpeg.log 2>&1 &
|
||||
|
||||
# The above ffmpeg can take a while to open the UDP stream, so wait a little
|
||||
sleep 1
|
||||
|
||||
# Intercept STDIN and forward to the X framebuffer via xdotool
|
||||
(./stdin_intercept.sh <&3 &) 3<&0
|
||||
|
||||
# Hiptext renders images and videos into text characters displayable in a terminal
|
||||
hiptext \
|
||||
-width 95 \
|
||||
-font /usr/share/fonts/ttf-dejavu/DejaVuSansMono.ttf \
|
||||
$UDP_URI \
|
||||
2> hiptext.log
|
||||
|
||||
# Kill all the subprocesses created in this script if the script itself exits
|
||||
trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
|
80
stdin_intercept.sh
Executable file
80
stdin_intercept.sh
Executable file
|
@ -0,0 +1,80 @@
|
|||
# Intercept all STDIN from the user's local machine and forward to the
|
||||
# remote X framebuffer via xdotool. This is exposed via an SSH/MoSH session.
|
||||
#
|
||||
# Hat tip to Chris F.A. Johnson whereever you are.
|
||||
|
||||
ESC="" # A literal escape character (it's not blank!)
|
||||
clear
|
||||
mv=1000 # mv=1000 for press and release reporting; mv=9 for press only
|
||||
_STTY=$(stty -g) # Save current terminal setup
|
||||
stty -echo -icanon # Turn off line buffering
|
||||
printf "${ESC}[?${mv}h " # Turn on mouse reporting
|
||||
printf "${ESC}[?25l" # Turn off cursor
|
||||
|
||||
# Ratios to convert mouse clicks in the terminal to mouse clicks on the virtual desktop
|
||||
XFACTOR=$(($DESKTOP_WIDTH / $TERMINAL_WIDTH))
|
||||
YFACTOR=$(($DESKTOP_HEIGHT / $TERMINAL_HEIGHT))
|
||||
|
||||
while :
|
||||
do
|
||||
# TODO: parse actual keyboard presses
|
||||
# TODO: use the more modern mouse modes, eg; 1015
|
||||
|
||||
x=$(dd bs=1 count=6 2>/dev/null) # Read six characters
|
||||
|
||||
m1=${x#???} # Remove the first 3 characters
|
||||
m2=${x#????} # Remove the first 4 characters
|
||||
m3=${x#?????} # Remove the first 5 characters
|
||||
|
||||
# Convert from characters to decimal values
|
||||
eval "$(printf "mb=%d mx=%d my=%d" "'$m1" "'$m2" "'$m3")"
|
||||
|
||||
# Values > 127 are signed
|
||||
[ $mx -lt 0 ] && MOUSEX=$(( 223 + $mx )) || MOUSEX=$(( $mx - 32 ))
|
||||
[ $my -lt 0 ] && MOUSEY=$(( 223 + $my )) || MOUSEY=$(( $my - 32 ))
|
||||
|
||||
case $mb in
|
||||
32) # Left down
|
||||
BUTTON=1
|
||||
BPRESS='mousedown'
|
||||
;;
|
||||
33) # Middle down
|
||||
BUTTON=2
|
||||
BPRESS='mousedown'
|
||||
;;
|
||||
34) # Right down
|
||||
BUTTON=3
|
||||
BPRESS='mousedown'
|
||||
;;
|
||||
35) # Last button up
|
||||
BUTTON=$BUTTON
|
||||
BPRESS='mouseup'
|
||||
;;
|
||||
97)
|
||||
BUTTON=4
|
||||
BPRESS='click'
|
||||
;;
|
||||
96)
|
||||
BUTTON=5
|
||||
BPRESS='click'
|
||||
;;
|
||||
esac
|
||||
|
||||
WINX=$(($MOUSEX * $XFACTOR))
|
||||
WINY=$(($MOUSEY * $YFACTOR))
|
||||
|
||||
if [ "$DEBUG" = "true" ]; then
|
||||
echo "$MOUSEX"x"$MOUSEY" "$WINX"x"$WINY" "$BUTTON":"$BPRESS"
|
||||
fi
|
||||
|
||||
xdotool mousemove $WINX $WINY
|
||||
xdotool keydown alt $BPRESS $BUTTON keyup alt
|
||||
|
||||
echo "xdotool mousemove $WINX $WINY" >> mouse.out
|
||||
echo "xdotool keydown alt $BPRESS $BUTTON keyup alt" >> mouse.out
|
||||
done
|
||||
|
||||
printf "${ESC}[?${mv}l" # Turn off mouse reporting
|
||||
stty "$_STTY" # Restore terminal settings
|
||||
printf "${ESC}[?12l${ESC}[?25h" # Turn cursor back on
|
||||
printf "\n${ESC}[0J\n" # Clear from cursor to bottom of screen
|
Loading…
Reference in a new issue