restructured tree, as we wont need to get AOSP to compile the project
This commit is contained in:
parent
e8392afe6b
commit
41952ef821
@ -1,3 +1,8 @@
|
|||||||
|
|
||||||
|
- Changed to official libvncserver 0.9- Changed to official libvncserver 0.99
|
||||||
|
- Decoupled native screen grabber from jni sources, you wont need to have AOSP anymore
|
||||||
|
|
||||||
|
|
||||||
v1.0a
|
v1.0a
|
||||||
|
|
||||||
- Rotation now fully working (on demand with F4 key)
|
- Rotation now fully working (on demand with F4 key)
|
||||||
|
@ -1,94 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
LOCAL_PATH:= $(call my-dir)
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_ARM_MODE := arm
|
|
||||||
|
|
||||||
local_c_flags += -Wall -O3 -DLIBVNCSERVER_WITH_WEBSOCKETS -DLIBVNCSERVER_HAVE_LIBPNG
|
|
||||||
|
|
||||||
local_src_files:= \
|
|
||||||
input.c \
|
|
||||||
gui.c \
|
|
||||||
adb_method.c \
|
|
||||||
framebuffer_method.c \
|
|
||||||
suinput.c \
|
|
||||||
droidvncserver.c \
|
|
||||||
gralloc_method.c \
|
|
||||||
libvncserver-kanaka/libvncserver/scale.c \
|
|
||||||
libvncserver-kanaka/libvncserver/main.c \
|
|
||||||
libvncserver-kanaka/libvncserver/rfbserver.c \
|
|
||||||
libvncserver-kanaka/libvncserver/rfbregion.c \
|
|
||||||
libvncserver-kanaka/libvncserver/auth.c \
|
|
||||||
libvncserver-kanaka/libvncserver/sockets.c \
|
|
||||||
libvncserver-kanaka/libvncserver/stats.c \
|
|
||||||
libvncserver-kanaka/libvncserver/corre.c \
|
|
||||||
libvncserver-kanaka/libvncserver/hextile.c \
|
|
||||||
libvncserver-kanaka/libvncserver/rre.c \
|
|
||||||
libvncserver-kanaka/libvncserver/translate.c \
|
|
||||||
libvncserver-kanaka/libvncserver/cutpaste.c \
|
|
||||||
libvncserver-kanaka/libvncserver/httpd.c \
|
|
||||||
libvncserver-kanaka/libvncserver/cursor.c \
|
|
||||||
libvncserver-kanaka/libvncserver/font.c \
|
|
||||||
libvncserver-kanaka/libvncserver/draw.c \
|
|
||||||
libvncserver-kanaka/libvncserver/selbox.c \
|
|
||||||
libvncserver-kanaka/libvncserver/minilzo.c \
|
|
||||||
libvncserver-kanaka/libvncserver/vncauth.c \
|
|
||||||
libvncserver-kanaka/libvncserver/d3des.c \
|
|
||||||
libvncserver-kanaka/libvncserver/md5.c \
|
|
||||||
libvncserver-kanaka/libvncserver/cargs.c \
|
|
||||||
libvncserver-kanaka/libvncserver/ultra.c \
|
|
||||||
libvncserver-kanaka/libvncserver/zlib.c \
|
|
||||||
libvncserver-kanaka/libvncserver/zrle.c \
|
|
||||||
libvncserver-kanaka/libvncserver/zrleoutstream.c \
|
|
||||||
libvncserver-kanaka/libvncserver/zrlepalettehelper.c \
|
|
||||||
libvncserver-kanaka/libvncserver/tight.c \
|
|
||||||
libvncserver-kanaka/libvncserver/zywrletemplate.c \
|
|
||||||
libvncserver-kanaka/libvncserver/websockets.c
|
|
||||||
|
|
||||||
ginger_up := displaybinder.cpp
|
|
||||||
|
|
||||||
|
|
||||||
local_c_includes := \
|
|
||||||
$(LOCAL_PATH) \
|
|
||||||
$(LOCAL_PATH)/libvncserver-kanaka/libvncserver \
|
|
||||||
$(LOCAL_PATH)/libvncserver-kanaka \
|
|
||||||
$(LOCAL_PATH)/libvncserver-kanaka/common \
|
|
||||||
$(LOCAL_PATH)/../../zlib \
|
|
||||||
$(LOCAL_PATH)/../../jpeg \
|
|
||||||
$(LOCAL_PATH)/../../openssl/include \
|
|
||||||
$(LOCAL_PATH)/../../libpng \
|
|
||||||
|
|
||||||
#######################################
|
|
||||||
|
|
||||||
# target
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_SRC_FILES += $(local_src_files)
|
|
||||||
LOCAL_CFLAGS += $(local_c_flags) -DANDROID_FROYO
|
|
||||||
LOCAL_C_INCLUDES += $(local_c_includes)
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL_MODULE:= androidvncserver_froyo
|
|
||||||
LOCAL_MODULE_TAGS:= optional
|
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES := libcutils libz libpng jpeg
|
|
||||||
LOCAL_SHARED_LIBRARIES := libcrypto libssl libhardware
|
|
||||||
|
|
||||||
include $(BUILD_EXECUTABLE)
|
|
||||||
|
|
||||||
#######################################
|
|
||||||
|
|
||||||
# target
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_SRC_FILES += $(local_src_files) $(ginger_up)
|
|
||||||
LOCAL_CFLAGS += $(local_c_flags)
|
|
||||||
LOCAL_C_INCLUDES += $(local_c_includes)
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL_MODULE:= androidvncserver_gingerup
|
|
||||||
LOCAL_MODULE_TAGS:= optional
|
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES := libcutils libz libpng jpeg
|
|
||||||
LOCAL_SHARED_LIBRARIES := libcrypto libssl libhardware libsurfaceflinger_client libui
|
|
||||||
|
|
||||||
include $(BUILD_EXECUTABLE)
|
|
@ -1,75 +0,0 @@
|
|||||||
/*
|
|
||||||
droid vnc server - Android VNC server
|
|
||||||
Copyright (C) 2009 Jose Pereira <onaips@gmail.com>
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 3 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "displaybinder.h"
|
|
||||||
#include "common.h"
|
|
||||||
|
|
||||||
#include <binder/IPCThreadState.h>
|
|
||||||
#include <binder/ProcessState.h>
|
|
||||||
#include <binder/IServiceManager.h>
|
|
||||||
|
|
||||||
#include <binder/IMemory.h>
|
|
||||||
#include <surfaceflinger/ISurfaceComposer.h>
|
|
||||||
#include <surfaceflinger/SurfaceComposerClient.h>
|
|
||||||
|
|
||||||
using namespace android;
|
|
||||||
|
|
||||||
ScreenshotClient *screenshotclient;
|
|
||||||
|
|
||||||
extern "C" int initGingerbreadMethod()
|
|
||||||
{
|
|
||||||
|
|
||||||
L("--Initializing gingerbread access method--\n");
|
|
||||||
|
|
||||||
screenshotclient=new ScreenshotClient();
|
|
||||||
int err=screenshotclient->update();
|
|
||||||
if (err != NO_ERROR) {
|
|
||||||
L("screen capture failed: %s\n", strerror(-err));
|
|
||||||
//mandar msg incompatible
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
PixelFormat f=screenshotclient->getFormat();
|
|
||||||
|
|
||||||
PixelFormatInfo pf;
|
|
||||||
getPixelFormatInfo(f,&pf);
|
|
||||||
|
|
||||||
|
|
||||||
displayInfo.bpp = pf.bitsPerPixel;
|
|
||||||
displayInfo.width = screenshotclient->getWidth();
|
|
||||||
displayInfo.height = screenshotclient->getHeight();;
|
|
||||||
displayInfo.size = pf.bitsPerPixel*displayInfo.width*displayInfo.height/CHAR_BIT;
|
|
||||||
displayInfo.red_offset = pf.l_red;
|
|
||||||
displayInfo.red_length = pf.h_red;
|
|
||||||
displayInfo.green_offset = pf.l_green;
|
|
||||||
displayInfo.green_length = pf.h_green-pf.h_red;
|
|
||||||
displayInfo.blue_offset = pf.l_blue;
|
|
||||||
displayInfo.blue_length = pf.h_blue-pf.h_green;
|
|
||||||
displayInfo.alpha_offset = pf.l_alpha;
|
|
||||||
displayInfo.alpha_length = pf.h_alpha-pf.h_blue;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" void updateScreen()
|
|
||||||
{
|
|
||||||
screenshotclient->update();
|
|
||||||
gingerbuf=(unsigned int*)screenshotclient->getPixels();
|
|
||||||
}
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
|||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
compile
|
|
||||||
configure
|
|
||||||
configure.lineno
|
|
||||||
config.status
|
|
||||||
config.log
|
|
||||||
LibVNCServer.spec.in
|
|
||||||
LibVNCServer.spec
|
|
||||||
x11vnc.spec.in
|
|
||||||
.deps
|
|
||||||
aclocal.m4
|
|
||||||
autom4te.cache
|
|
||||||
libvncserver-config
|
|
||||||
_configs.sed
|
|
||||||
config.h
|
|
||||||
LibVNCServer*.tar.gz
|
|
||||||
upload_beta.sh
|
|
||||||
stamp-*
|
|
||||||
x11vnc*.tar.gz
|
|
||||||
config.h.in
|
|
||||||
rfbconfig.h
|
|
||||||
rfbconfig.h.in
|
|
||||||
install-sh
|
|
||||||
missing
|
|
||||||
mkinstalldirs
|
|
||||||
depcomp
|
|
||||||
description-pak
|
|
||||||
libvncserver*.deb
|
|
||||||
|
|
@ -1,73 +0,0 @@
|
|||||||
*.swp
|
|
||||||
*~
|
|
||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
compile
|
|
||||||
configure
|
|
||||||
configure.lineno
|
|
||||||
config.status
|
|
||||||
config.log
|
|
||||||
LibVNCServer.spec.in
|
|
||||||
LibVNCServer.spec
|
|
||||||
x11vnc.spec.in
|
|
||||||
.deps
|
|
||||||
.libs
|
|
||||||
aclocal.m4
|
|
||||||
autom4te.cache
|
|
||||||
libvncserver-config
|
|
||||||
_configs.sed
|
|
||||||
config.h
|
|
||||||
LibVNCServer*.tar.gz
|
|
||||||
upload_beta.sh
|
|
||||||
stamp-*
|
|
||||||
x11vnc*.tar.gz
|
|
||||||
config.h.in
|
|
||||||
rfbconfig.h
|
|
||||||
rfbconfig.h.in
|
|
||||||
install-sh
|
|
||||||
missing
|
|
||||||
mkinstalldirs
|
|
||||||
depcomp
|
|
||||||
description-pak
|
|
||||||
libvncserver*.deb
|
|
||||||
*.o
|
|
||||||
*.lo
|
|
||||||
CVS
|
|
||||||
client_examples/SDLvncviewer
|
|
||||||
client_examples/backchannel
|
|
||||||
client_examples/ppmtest
|
|
||||||
config.guess
|
|
||||||
config.sub
|
|
||||||
contrib/zippy
|
|
||||||
examples/backchannel
|
|
||||||
examples/blooptest
|
|
||||||
examples/camera
|
|
||||||
examples/colourmaptest
|
|
||||||
examples/example
|
|
||||||
examples/filetransfer
|
|
||||||
examples/fontsel
|
|
||||||
examples/pnmshow
|
|
||||||
examples/pnmshow24
|
|
||||||
examples/regiontest
|
|
||||||
examples/rotate
|
|
||||||
examples/simple
|
|
||||||
examples/simple15
|
|
||||||
examples/storepasswd
|
|
||||||
examples/vncev
|
|
||||||
libtool
|
|
||||||
libvncclient/libvncclient.la
|
|
||||||
libvncserver/libvncserver.la
|
|
||||||
rfb/rfbint.h
|
|
||||||
test/blooptest
|
|
||||||
test/cargstest
|
|
||||||
test/copyrecttest
|
|
||||||
test/cursortest
|
|
||||||
test/encodingstest
|
|
||||||
vncterm/LinuxVNC
|
|
||||||
vncterm/VNCommand
|
|
||||||
vncterm/example
|
|
||||||
x11vnc.spec
|
|
||||||
x11vnc/x11vnc
|
|
||||||
CMakeCache.txt
|
|
||||||
cmake_install.cmake
|
|
||||||
/CMakeFiles
|
|
@ -1,50 +0,0 @@
|
|||||||
* LibVNCServer (C) 2001 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
is based on
|
|
||||||
* Original OSXvnc (C) 2001 Dan McGuirk <mcguirk@incompleteness.net>,
|
|
||||||
which in turn is based on
|
|
||||||
* Original Xvnc (C) 1999 AT&T Laboratories Cambridge.
|
|
||||||
|
|
||||||
Lots of improvements of this library are thanks to
|
|
||||||
* TightVNC (C) 2000-2003 Const Kaplinsky
|
|
||||||
|
|
||||||
The ZRLE compression scheme is from
|
|
||||||
* RealVNC (James "Wez" Weatherall, who helped also with regions)
|
|
||||||
|
|
||||||
The good folks from
|
|
||||||
* KRFB (I think it was Tim Jansen)
|
|
||||||
helped also a lot (some *big* bugs!).
|
|
||||||
|
|
||||||
Karl Runge provides an x11vnc, which is a much, much improved version of my
|
|
||||||
original proof-of-concept. It really deserves to replace the old version,
|
|
||||||
as it is a state-of-the-art, fast and usable program by now! However, he
|
|
||||||
maintains it and improves it still in amazing ways!
|
|
||||||
|
|
||||||
The file transfer protocol from TightVNC was implemented by Rohit Kumar.
|
|
||||||
This includes an implementation of RFB protocol version 3.7t.
|
|
||||||
|
|
||||||
Occasional important patches were sent by (in order I found the names in my
|
|
||||||
archives and please don't beat me, if I forgot you, but just send me an
|
|
||||||
email!): Akira Hatakeyama, Karl J. Runge, Justin "Zippy" Dearing,
|
|
||||||
Oliver Mihatsch, Greg Sternberg, Werner Hofer, Giampiero Giancipoli,
|
|
||||||
Glenn Mabutt, Paul Kreiner, Erik Kunze, Mike Frysinger, Martin Waitz,
|
|
||||||
Mark McLoughlin, Paul Fox, Juan Jose Costello, Andre Leiadella,
|
|
||||||
Alberto Lusiani, Malvina Mazin, Dave Stuart, Rohit Kumar, Donald Dugger,
|
|
||||||
Steven Carr, Uwe Völker, Charles Coffing, Guillaume Rousse,
|
|
||||||
Alessandro Praduroux, Brad Hards, Timo Ketola, Christian Ehrlicher,
|
|
||||||
Noriaki Yamazaki, Ben Klopfenstein, Vic Lee, Christian Beier,
|
|
||||||
Alexander Dorokhine, Corentin Chary and Wouter Van Meir.
|
|
||||||
|
|
||||||
Probably I forgot quite a few people sending a patch here and there, which
|
|
||||||
really made a difference. Without those, some obscure bugs still would
|
|
||||||
be unfound.
|
|
||||||
|
|
||||||
A hearty unthanks goes to Michael and Erick, who provided me with nothing
|
|
||||||
but hollow words. Finally I got that configure and install working, but
|
|
||||||
it would have been so much better for them not just to complain, but also
|
|
||||||
help. As you showed me real egoism, you are the main reasons I am not
|
|
||||||
working one dot to make this library less than GPL, so that nobody ever
|
|
||||||
can make profit of my and others work without giving something back to me
|
|
||||||
and others.
|
|
||||||
|
|
||||||
Speaking of hollow words, another hearty unthanks goes to Sam, who thought
|
|
||||||
he could let me work for him, not paying me in any way.
|
|
@ -1,253 +0,0 @@
|
|||||||
cmake_minimum_required(VERSION 2.6)
|
|
||||||
|
|
||||||
project(LibVNCServer)
|
|
||||||
include(CheckFunctionExists)
|
|
||||||
include(CheckIncludeFile)
|
|
||||||
include(CheckTypeSize)
|
|
||||||
include(TestBigEndian)
|
|
||||||
|
|
||||||
set(PACKAGE_NAME "LibVNCServer")
|
|
||||||
set(FULL_PACKAGE_NAME "LibVNCServer")
|
|
||||||
set(PACKAGE_VERSION "0.9.7")
|
|
||||||
set(PROJECT_BUGREPORT_PATH "http://sourceforge.net/projects/libvncserver")
|
|
||||||
|
|
||||||
include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/libvncserver)
|
|
||||||
|
|
||||||
find_package(ZLIB)
|
|
||||||
find_package(JPEG)
|
|
||||||
find_package(SDL)
|
|
||||||
find_package(GnuTLS)
|
|
||||||
find_package(Threads)
|
|
||||||
|
|
||||||
if(SDL_FOUND) # == pthread.h available
|
|
||||||
option(TIGHTVNC_FILETRANSFER "Enable filetransfer" ON)
|
|
||||||
endif(SDL_FOUND)
|
|
||||||
if(ZLIB_FOUND)
|
|
||||||
set(LIBVNCSERVER_HAVE_LIBZ 1)
|
|
||||||
endif(ZLIB_FOUND)
|
|
||||||
if(JPEG_FOUND)
|
|
||||||
set(LIBVNCSERVER_HAVE_LIBJPEG 1)
|
|
||||||
endif(JPEG_FOUND)
|
|
||||||
option(LIBVNCSERVER_ALLOW24BPP "Allow 24 bpp" ON)
|
|
||||||
if(GNUTLS_FOUND)
|
|
||||||
set(LIBVNCSERVER_WITH_CLIENT_TLS 1)
|
|
||||||
endif(GNUTLS_FOUND)
|
|
||||||
|
|
||||||
check_include_file("fcntl.h" LIBVNCSERVER_HAVE_FCNTL_H)
|
|
||||||
check_include_file("netinet/in.h" LIBVNCSERVER_HAVE_NETINET_IN_H)
|
|
||||||
check_include_file("sys/socket.h" LIBVNCSERVER_HAVE_SYS_SOCKET_H)
|
|
||||||
check_include_file("sys/stat.h" LIBVNCSERVER_HAVE_SYS_STAT_H)
|
|
||||||
check_include_file("sys/time.h" LIBVNCSERVER_HAVE_SYS_TIME_H)
|
|
||||||
check_include_file("sys/types.h" LIBVNCSERVER_HAVE_SYS_TYPES_H)
|
|
||||||
check_include_file("sys/wait.h" LIBVNCSERVER_HAVE_SYS_WAIT_H)
|
|
||||||
check_include_file("unistd.h" LIBVNCSERVER_HAVE_UNISTD_H)
|
|
||||||
|
|
||||||
# headers needed for check_type_size()
|
|
||||||
check_include_file("arpa/inet.h" HAVE_ARPA_INET_H)
|
|
||||||
check_include_file("stdint.h" HAVE_STDINT_H)
|
|
||||||
check_include_file("stddef.h" HAVE_STDDEF_H)
|
|
||||||
check_include_file("sys/types.h" HAVE_SYS_TYPES_H)
|
|
||||||
|
|
||||||
check_function_exists(gettimeofday LIBVNCSERVER_HAVE_GETTIMEOFDAY)
|
|
||||||
|
|
||||||
if(CMAKE_USE_PTHREADS_INIT)
|
|
||||||
set(LIBVNCSERVER_HAVE_LIBPTHREAD 1)
|
|
||||||
endif(CMAKE_USE_PTHREADS_INIT)
|
|
||||||
if(LIBVNCSERVER_HAVE_SYS_SOCKET_H)
|
|
||||||
# socklen_t
|
|
||||||
list(APPEND CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h")
|
|
||||||
endif(LIBVNCSERVER_HAVE_SYS_SOCKET_H)
|
|
||||||
if(HAVE_ARPA_INET_H)
|
|
||||||
# in_addr_t
|
|
||||||
list(APPEND CMAKE_EXTRA_INCLUDE_FILES "arpa/inet.h")
|
|
||||||
endif(HAVE_ARPA_INET_H)
|
|
||||||
|
|
||||||
check_type_size(pid_t LIBVNCSERVER_PID_T)
|
|
||||||
check_type_size(size_t LIBVNCSERVER_SIZE_T)
|
|
||||||
check_type_size(socklen_t LIBVNCSERVER_SOCKLEN_T)
|
|
||||||
check_type_size(in_addr_t LIBVNCSERVER_IN_ADDR_T)
|
|
||||||
if(NOT HAVE_LIBVNCSERVER_IN_ADDR_T)
|
|
||||||
set(LIBVNCSERVER_NEED_INADDR_T 1)
|
|
||||||
endif(NOT HAVE_LIBVNCSERVER_IN_ADDR_T)
|
|
||||||
|
|
||||||
TEST_BIG_ENDIAN(LIBVNCSERVER_WORDS_BIGENDIAN)
|
|
||||||
|
|
||||||
# TODO:
|
|
||||||
# LIBVNCSERVER_ENOENT_WORKAROUND
|
|
||||||
# inline
|
|
||||||
|
|
||||||
configure_file(${CMAKE_SOURCE_DIR}/rfb/rfbconfig.h.cmake ${CMAKE_BINARY_DIR}/rfb/rfbconfig.h)
|
|
||||||
configure_file(${CMAKE_SOURCE_DIR}/rfb/rfbint.h.cmake ${CMAKE_BINARY_DIR}/rfb/rfbint.h)
|
|
||||||
|
|
||||||
set(LIBVNCSERVER_DIR ${CMAKE_SOURCE_DIR}/libvncserver)
|
|
||||||
set(LIBVNCCLIENT_DIR ${CMAKE_SOURCE_DIR}/libvncclient)
|
|
||||||
set(LIBVNCSRVTEST_DIR ${CMAKE_SOURCE_DIR}/examples)
|
|
||||||
set(LIBVNCCLITEST_DIR ${CMAKE_SOURCE_DIR}/client_examples)
|
|
||||||
|
|
||||||
set(LIBVNCSERVER_SOURCES
|
|
||||||
${LIBVNCSERVER_DIR}/main.c
|
|
||||||
${LIBVNCSERVER_DIR}/rfbserver.c
|
|
||||||
${LIBVNCSERVER_DIR}/rfbregion.c
|
|
||||||
${LIBVNCSERVER_DIR}/auth.c
|
|
||||||
${LIBVNCSERVER_DIR}/sockets.c
|
|
||||||
${LIBVNCSERVER_DIR}/stats.c
|
|
||||||
${LIBVNCSERVER_DIR}/corre.c
|
|
||||||
${LIBVNCSERVER_DIR}/hextile.c
|
|
||||||
${LIBVNCSERVER_DIR}/rre.c
|
|
||||||
${LIBVNCSERVER_DIR}/translate.c
|
|
||||||
${LIBVNCSERVER_DIR}/cutpaste.c
|
|
||||||
${LIBVNCSERVER_DIR}/httpd.c
|
|
||||||
${LIBVNCSERVER_DIR}/cursor.c
|
|
||||||
${LIBVNCSERVER_DIR}/font.c
|
|
||||||
${LIBVNCSERVER_DIR}/draw.c
|
|
||||||
${LIBVNCSERVER_DIR}/selbox.c
|
|
||||||
${LIBVNCSERVER_DIR}/d3des.c
|
|
||||||
${LIBVNCSERVER_DIR}/vncauth.c
|
|
||||||
${LIBVNCSERVER_DIR}/cargs.c
|
|
||||||
${LIBVNCSERVER_DIR}/minilzo.c
|
|
||||||
${LIBVNCSERVER_DIR}/ultra.c
|
|
||||||
${LIBVNCSERVER_DIR}/scale.c
|
|
||||||
)
|
|
||||||
|
|
||||||
set(LIBVNCCLIENT_SOURCES
|
|
||||||
${LIBVNCCLIENT_DIR}/cursor.c
|
|
||||||
${LIBVNCCLIENT_DIR}/listen.c
|
|
||||||
${LIBVNCCLIENT_DIR}/rfbproto.c
|
|
||||||
${LIBVNCCLIENT_DIR}/sockets.c
|
|
||||||
${LIBVNCCLIENT_DIR}/vncviewer.c
|
|
||||||
${LIBVNCCLIENT_DIR}/minilzo.c
|
|
||||||
${LIBVNCCLIENT_DIR}/tls.c
|
|
||||||
)
|
|
||||||
|
|
||||||
if(ZLIB_FOUND)
|
|
||||||
add_definitions(-DLIBVNCSERVER_HAVE_LIBZ)
|
|
||||||
include_directories(${ZLIB_INCLUDE_DIR})
|
|
||||||
set(LIBVNCSERVER_SOURCES
|
|
||||||
${LIBVNCSERVER_SOURCES}
|
|
||||||
${LIBVNCSERVER_DIR}/zlib.c
|
|
||||||
${LIBVNCSERVER_DIR}/zrle.c
|
|
||||||
${LIBVNCSERVER_DIR}/zrleoutstream.c
|
|
||||||
${LIBVNCSERVER_DIR}/zrlepalettehelper.c
|
|
||||||
)
|
|
||||||
endif(ZLIB_FOUND)
|
|
||||||
|
|
||||||
if(JPEG_FOUND)
|
|
||||||
add_definitions(-DLIBVNCSERVER_HAVE_LIBJPEG)
|
|
||||||
include_directories(${JPEG_INCLUDE_DIR})
|
|
||||||
set(LIBVNCSERVER_SOURCES
|
|
||||||
${LIBVNCSERVER_SOURCES}
|
|
||||||
${LIBVNCSERVER_DIR}/tight.c
|
|
||||||
)
|
|
||||||
endif(JPEG_FOUND)
|
|
||||||
|
|
||||||
if(TIGHTVNC_FILETRANSFER)
|
|
||||||
set(LIBVNCSERVER_SOURCES
|
|
||||||
${LIBVNCSERVER_SOURCES}
|
|
||||||
${LIBVNCSERVER_DIR}/tightvnc-filetransfer/rfbtightserver.c
|
|
||||||
${LIBVNCSERVER_DIR}/tightvnc-filetransfer/handlefiletransferrequest.c
|
|
||||||
${LIBVNCSERVER_DIR}/tightvnc-filetransfer/filetransfermsg.c
|
|
||||||
${LIBVNCSERVER_DIR}/tightvnc-filetransfer/filelistinfo.c
|
|
||||||
)
|
|
||||||
endif(TIGHTVNC_FILETRANSFER)
|
|
||||||
|
|
||||||
add_library(vncclient SHARED ${LIBVNCCLIENT_SOURCES})
|
|
||||||
add_library(vncserver SHARED ${LIBVNCSERVER_SOURCES})
|
|
||||||
if(WIN32)
|
|
||||||
set(ADDITIONAL_LIBS ws2_32)
|
|
||||||
endif(WIN32)
|
|
||||||
|
|
||||||
target_link_libraries(vncclient
|
|
||||||
${ADDITIONAL_LIBS}
|
|
||||||
${ZLIB_LIBRARIES}
|
|
||||||
${JPEG_LIBRARIES}
|
|
||||||
${SDL_LIBRARY}
|
|
||||||
)
|
|
||||||
target_link_libraries(vncserver
|
|
||||||
${ADDITIONAL_LIBS}
|
|
||||||
${ZLIB_LIBRARIES}
|
|
||||||
${JPEG_LIBRARIES}
|
|
||||||
${SDL_LIBRARY}
|
|
||||||
)
|
|
||||||
|
|
||||||
# tests
|
|
||||||
set(LIBVNCSERVER_TESTS
|
|
||||||
backchannel
|
|
||||||
camera
|
|
||||||
colourmaptest
|
|
||||||
example
|
|
||||||
fontsel
|
|
||||||
pnmshow
|
|
||||||
pnmshow24
|
|
||||||
regiontest
|
|
||||||
rotate
|
|
||||||
simple
|
|
||||||
simple15
|
|
||||||
storepasswd
|
|
||||||
vncev
|
|
||||||
)
|
|
||||||
|
|
||||||
if(SDL_FOUND)
|
|
||||||
set(LIBVNCSERVER_TESTS
|
|
||||||
${LIBVNCSERVER_TESTS}
|
|
||||||
blooptest
|
|
||||||
)
|
|
||||||
endif(SDL_FOUND)
|
|
||||||
|
|
||||||
if(TIGHTVNC_FILETRANSFER)
|
|
||||||
set(LIBVNCSERVER_TESTS
|
|
||||||
${LIBVNCSERVER_TESTS}
|
|
||||||
filetransfer
|
|
||||||
)
|
|
||||||
endif(TIGHTVNC_FILETRANSFER)
|
|
||||||
|
|
||||||
if(MACOS)
|
|
||||||
set(LIBVNCSERVER_TESTS
|
|
||||||
${LIBVNCSERVER_TESTS}
|
|
||||||
mac
|
|
||||||
)
|
|
||||||
endif(MACOS)
|
|
||||||
|
|
||||||
set(LIBVNCCLIENT_TESTS
|
|
||||||
backchannel
|
|
||||||
ppmtest
|
|
||||||
)
|
|
||||||
|
|
||||||
if(SDL_FOUND)
|
|
||||||
include_directories(${SDL_INCLUDE_DIR})
|
|
||||||
set(LIBVNCCLIENT_TESTS
|
|
||||||
${LIBVNCCLIENT_TESTS}
|
|
||||||
SDLvncviewer
|
|
||||||
)
|
|
||||||
endif(SDL_FOUND)
|
|
||||||
|
|
||||||
if(HAVE_FFMPEG)
|
|
||||||
set(LIBVNCCLIENT_TESTS
|
|
||||||
${LIBVNCCLIENT_TESTS}
|
|
||||||
vnc2mpg
|
|
||||||
)
|
|
||||||
endif(HAVE_FFMPEG)
|
|
||||||
|
|
||||||
|
|
||||||
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/examples)
|
|
||||||
foreach(test ${LIBVNCSERVER_TESTS})
|
|
||||||
add_executable(examples/${test} ${LIBVNCSRVTEST_DIR}/${test}.c)
|
|
||||||
target_link_libraries(examples/${test} vncserver ${CMAKE_THREAD_LIBS_INIT})
|
|
||||||
endforeach(test ${LIBVNCSERVER_TESTS})
|
|
||||||
|
|
||||||
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/client_examples)
|
|
||||||
foreach(test ${LIBVNCCLIENT_TESTS})
|
|
||||||
add_executable(client_examples/${test} ${LIBVNCCLITEST_DIR}/${test}.c)
|
|
||||||
target_link_libraries(client_examples/${test} vncclient ${CMAKE_THREAD_LIBS_INIT} ${GNUTLS_LIBRARIES} ${SDL_LIBRARY} ${FFMPEG_LIBRARIES})
|
|
||||||
endforeach(test ${LIBVNCCLIENT_TESTS})
|
|
||||||
|
|
||||||
install_targets(/lib vncserver)
|
|
||||||
install_targets(/lib vncclient)
|
|
||||||
install_files(/include/rfb FILES
|
|
||||||
rfb/keysym.h
|
|
||||||
rfb/rfb.h
|
|
||||||
rfb/rfbclient.h
|
|
||||||
rfb/rfbconfig.h
|
|
||||||
rfb/rfbint.h
|
|
||||||
rfb/rfbproto.h
|
|
||||||
rfb/rfbregion.h
|
|
||||||
)
|
|
@ -1,340 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
||||||
59 Temple Place - Suite 330, Boston, MA
|
|
||||||
02111-1307, USA.
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Library General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
Appendix: How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) 19yy <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Library General
|
|
||||||
Public License instead of this License.
|
|
@ -1,767 +0,0 @@
|
|||||||
2010-05-08 Karl Runge <runge@karlrunge.com>
|
|
||||||
* libvncclient/rfbproto.c: rfbResizeFrameBuffer should also set
|
|
||||||
updateRect.
|
|
||||||
|
|
||||||
2010-01-02 Karl Runge <runge@karlrunge.com>
|
|
||||||
* tightvnc-filetransfer/rfbtightserver.c: enabled fix
|
|
||||||
for tight security type for RFB 3.8 (debian bug 517422.)
|
|
||||||
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=517422
|
|
||||||
http://sourceforge.net/tracker/?func=detail&aid=2647349&group_id=32584&atid=405858
|
|
||||||
|
|
||||||
2009-05-21 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: check for __thread.
|
|
||||||
* libvncserver/main.c, libvncserver/rfbserver.c: various
|
|
||||||
thread safe corrections including sendMutex guard.
|
|
||||||
* libvncserver/zrle.c, libvncserver/zrleencodetemplate.c:
|
|
||||||
thread safety via per-client buffers.
|
|
||||||
* libvncserver/tight.c, libvncserver/zlib.c: thread safety
|
|
||||||
corrections via thread local storage using __thread.
|
|
||||||
* rfb/rfb.h: new members for threaded usage.
|
|
||||||
* tightvnc-filetransfer/rfbtightserver.c: fix (currently disabled)
|
|
||||||
for tight security type for RFB 3.8 (debian bug 517422.)
|
|
||||||
NEEDS AUDIT.
|
|
||||||
|
|
||||||
2009-03-12 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* client_examples/SDLvncviewer.c: support mouse wheel operations
|
|
||||||
|
|
||||||
2009-03-08 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* client_examples/SDLvncviewer.c: support clipboard operations
|
|
||||||
|
|
||||||
2009-03-07 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* client_examples/SDLvncviewer.c: force releasing Alt keys whenr
|
|
||||||
losing focus. This helps when you switch windows by pressing
|
|
||||||
Alt+Tab (SDLvncviewer would get the "Alt down" event, but not
|
|
||||||
the "Alt up" one).
|
|
||||||
|
|
||||||
2009-03-07 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* client_examples/SDLvncviewer.c: make the viewer resizable
|
|
||||||
|
|
||||||
2009-03-06 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* client_examples/SDLvncviewer.c: enable key repeat
|
|
||||||
|
|
||||||
2009-02-03 Mike Frysinger <vapier@gentoo.org>
|
|
||||||
* autogen.sh, configure.ac, **/Makefile.am: major automake cleanups
|
|
||||||
|
|
||||||
2009-01-04 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac, CMakeLists.txt: set LibVNCServer version to 0.9.7
|
|
||||||
|
|
||||||
2009-01-04 Karl Runge <runge@karlrunge.com>
|
|
||||||
* prepare_x11vnc_dist.sh: fix SUBDIRS and DIST_SUBDIRS when using
|
|
||||||
--with-system-libvncserver
|
|
||||||
|
|
||||||
2008-06-03 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* client_examples/SDLvncviewer.c: fix update after resize
|
|
||||||
|
|
||||||
2008-02-18 Christian Ehrlicher <Ch.Ehrlicher@gmx.de>
|
|
||||||
* libvncserver/rfbregion.c: please MS Visual C++
|
|
||||||
|
|
||||||
2008-02-04 Noriaki Yamazaki <micro-vnc@ias.hitachi-system.co.jp>
|
|
||||||
* libvncclient/rfbproto.c, libvncclient/zrle.c: Add ZYWRLE
|
|
||||||
support to LibVNCClient
|
|
||||||
|
|
||||||
2008-02-04 Noriaki Yamazaki <micro-vnc@ias.hitachi-system.co.jp>
|
|
||||||
* libvncserver/zywrletemplate.c: Fix mis encode/decode when
|
|
||||||
width != scanline
|
|
||||||
|
|
||||||
2008-02-02 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* client_examples/SDLvncviewer.c: fix buttons (2 & 3 were switched),
|
|
||||||
fix Tab key, and fix Ctrl+<letter>
|
|
||||||
|
|
||||||
2008-01-29 Christian Ehrlicher <Ch.Ehrlicher@gmx.de>
|
|
||||||
* libvncserver/rfbserver.c: add missing #include <time.h>
|
|
||||||
|
|
||||||
2008-01-28 Noriaki Yamazaki <micro-vnc@ias.hitachi-system.co.jp>
|
|
||||||
* rfb/rfbproto.h, libvncserver/rfbserver.c, libvncserver/scale.c,
|
|
||||||
libvncserver/zrle.c, libvncserver/zrleencodetemplate.c,
|
|
||||||
libvncserver/zywrletemplate.c: add (server-side) ZYWRLE support,
|
|
||||||
and fix a few endian/scale errors
|
|
||||||
|
|
||||||
2008-01-27 Christian Ehrlicher <Ch.Ehrlicher@gmx.de>
|
|
||||||
* CMakeLists, rfb/rfbconfig.h.cmake, rfb/rfbint.h.cmake:
|
|
||||||
support CMake
|
|
||||||
|
|
||||||
2007-09-04 Karl Runge <runge@karlrunge.com>
|
|
||||||
* classes/ssl: improve timeouts, port fallback, and connection
|
|
||||||
time of the SSL Java viewers.
|
|
||||||
|
|
||||||
2007-08-10 Timo Ketola <timo@riihineva.no-ip.org>
|
|
||||||
* libvncclient/rfbproto.c: add missing else (so that GotRect
|
|
||||||
handling overrides the default operation).
|
|
||||||
|
|
||||||
2007-06-14 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: add a note on what you must do if you want to
|
|
||||||
re-run autoconf from the LibVNCServer-X.Y.Z.tar.gz tarball.
|
|
||||||
|
|
||||||
2007-05-26 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac, Makefile.am, x11vnc/Makefile.am: change
|
|
||||||
configure to make more of a split between libvncserver and
|
|
||||||
x11vnc packages. LibVNCServer pkg does not include x11vnc.
|
|
||||||
|
|
||||||
2007-04-06 Brad Hards <bradh@users.sourceforge.net>
|
|
||||||
* rfb/rfbclient.h: use 'extern "C"' to make it convenient to
|
|
||||||
include from C++.
|
|
||||||
|
|
||||||
2007-04-05 Alessandro Praduroux <pradu@pradu.it>
|
|
||||||
* rfb/rfb.h: do not misplace guards, which makes it possible to
|
|
||||||
double include rfb.h from C++.
|
|
||||||
|
|
||||||
2007-03-31 Guillaume Rousse <Guillaume.Rousse@inria.fr>
|
|
||||||
* configure.ac, **/Makefile.am: build shared libraries
|
|
||||||
|
|
||||||
2007-03-20 Karl Runge <runge@karlrunge.com>
|
|
||||||
* libvncserver/httpd.c: Add "Connection: close" to HTTP replies.
|
|
||||||
|
|
||||||
2007-03-17 Charles Coffing <cconffing@novell.com>
|
|
||||||
* libvncserver: fix a locking issue
|
|
||||||
|
|
||||||
2007-02-01 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* libvncclient: add updateRect member to rfbClient, to allow
|
|
||||||
requesting smaller updates than whole-screen.
|
|
||||||
|
|
||||||
2007-01-31 Karl Runge <runge@karlrunge.com>
|
|
||||||
* libvncclient: add GotCursorShape() and GotCopyRect() hooks.
|
|
||||||
fix copyrect code in rfbproto.c, add copyrect to default list.
|
|
||||||
* Makefile.am and prepare_x11vnc_dist.sh: add x11vnc dependence
|
|
||||||
on libvncclient.
|
|
||||||
|
|
||||||
2006-12-13 Karl Runge <runge@karlrunge.com>
|
|
||||||
* remove stray "-permitfiletransfer permit file transfer support"
|
|
||||||
print out.
|
|
||||||
|
|
||||||
2006-11-21 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: add DPMS detection.
|
|
||||||
|
|
||||||
2006-11-13 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: x11vnc warnings for no XTEST or SSL.
|
|
||||||
* prepare_x11vnc_dist.sh: to 0.8.4
|
|
||||||
|
|
||||||
2006-11-07 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: clean up -R linker case, add --without-macosx-native
|
|
||||||
* prepare_x11vnc_dist.sh: have "make rpm" work properly for
|
|
||||||
x11vnc package.
|
|
||||||
|
|
||||||
2006-07-17 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: move non-X11 tests out of HAVE_X: set
|
|
||||||
SSL_LIBS and CRYPT_LIBS and some header checks.
|
|
||||||
|
|
||||||
2006-07-12 Karl Runge <runge@karlrunge.com>
|
|
||||||
* libvncserver: release for CVE-2006-2450 fix.
|
|
||||||
|
|
||||||
2006-07-08 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: add <linux/uinput.h> for linux console.
|
|
||||||
|
|
||||||
2006-07-04 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: add getspnam.
|
|
||||||
|
|
||||||
2006-06-08 Karl Runge <runge@karlrunge.com>
|
|
||||||
* prepare_x11vnc_dist.sh: to 0.8.2
|
|
||||||
|
|
||||||
2006-05-29 Steven Carr <scarr@jsa-usa.com>
|
|
||||||
* Identified and removed some memory leaks associated
|
|
||||||
with the Encodings RRE, CoRRE, ZLIB, and Ultra.
|
|
||||||
* KeyboardLedState now has portable masks defined.
|
|
||||||
* rfb >= 3.7 Security Type Handler list would grow 1
|
|
||||||
entry for each new client connection.
|
|
||||||
|
|
||||||
2006-05-16 Steven Carr <scarr@jsa-usa.com>
|
|
||||||
* Statistics output now fits in 80-column output
|
|
||||||
* Corrected Cursor Statistics reporting as messages
|
|
||||||
|
|
||||||
2006-05-15 Steven Carr <scarr@jsa-usa.com>
|
|
||||||
* Default to RFB 3.8
|
|
||||||
* Add command line options:
|
|
||||||
-rfbversion X.Y Sets the version thatthe server reports
|
|
||||||
-permitfiletransfer Permits File Transfer (Default is Deny)
|
|
||||||
|
|
||||||
2006-05-15 Steven Carr <scarr@jsa-usa.com>
|
|
||||||
* The great UltraVNC Compatibility Commit!
|
|
||||||
libvncserver now supports the following messages:
|
|
||||||
SetSingleWindow - Select a single window to be the source of the
|
|
||||||
framebuffer.
|
|
||||||
ServerInput - Disable and blank the servers display
|
|
||||||
TextChat - TextChat between the remote/local user
|
|
||||||
(Bandwidth friendly VS the Notepad approach)
|
|
||||||
FileTransfer - Emulates a Windows Filesystem to the viewer
|
|
||||||
(Currently does not support Delta Transfers)
|
|
||||||
(Currently does not support Sending Directories)
|
|
||||||
UltraZip - Improved UltraZip support
|
|
||||||
* Improved Statistics SubSystem, now supports all encodings
|
|
||||||
* RFB 3.8 support! Error Messages are a 'Good Thing' (tm)
|
|
||||||
* Default to identify as RFB 3.6 to emulate UltraVNC server
|
|
||||||
(Server now has the ability to set the RFB version reported)
|
|
||||||
(permits the viewer to identify the server has FileTransfer ability)
|
|
||||||
* Client Encoding AutoSelection Supported (UltraViewer is speed aware)
|
|
||||||
* libvncclient has improved server detection/capabilities logic!
|
|
||||||
|
|
||||||
2006-05-13 Karl Runge <runge@karlrunge.com>
|
|
||||||
* minilzo.c,minilzo.h,lzoconf.h: switch to non-CRLF versions.
|
|
||||||
* libvncclient/Makefile.am: add minilzo.c, minilzo.h, lzoconf.h
|
|
||||||
and ultra.c to materials lists.
|
|
||||||
* libvncserver/scale.c: remove libm dependency with CEIL and
|
|
||||||
FLOOR macros.
|
|
||||||
* libvncserver/rfbserver.c: remove C99 declarations.
|
|
||||||
* vncterm/Makefile.am: fix VPATH build.
|
|
||||||
|
|
||||||
2006-05-06 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: add linux/videodev.h and linux/fb.h detection.
|
|
||||||
|
|
||||||
2006-05-04 Steven Carr <scarr@jsa-usa.com>
|
|
||||||
* rfbEncodingSupportedEncodings - What encodings are supported?
|
|
||||||
* rfbEncodingSupportedMessages - What message types are supported?
|
|
||||||
This way a client can identify if a particular server supports a
|
|
||||||
specific message types.
|
|
||||||
* rfbEncodingServerIdentity - What is the servers version string?
|
|
||||||
ie: "x11vnc: 0.8.1 lastmod: 2006-04-25 (LibVNCServer 0.9pre)"
|
|
||||||
|
|
||||||
2006-05-03 Steven Carr <scarr@jsa-usa.com>
|
|
||||||
* Server Side Scaling is now supported in libvncserver
|
|
||||||
Both PalmVNC and UltraVNC SetScale messages are supported
|
|
||||||
|
|
||||||
2006-05-02 Steven Carr <scarr@jsa-usa.com>
|
|
||||||
* Ultra Encoding added. Tested against UltraVNC V1.01
|
|
||||||
* libvncclient/rfbproto.c CopyRectangle() BPP!=8 bug fixed.
|
|
||||||
* Incompatible pointer usage warnings eliminated (gcc 4.0.1)
|
|
||||||
|
|
||||||
2006-04-27 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* examples/{rotate.c, rotatetemplate.c}: add modified pnmshow
|
|
||||||
which demonstrates fast rotating and flipping.
|
|
||||||
|
|
||||||
2006-04-26 Karl Runge <runge@karlrunge.com>
|
|
||||||
* all Makefile.am: use -I $(top_srcdir) instead of -I .. so VPATH
|
|
||||||
builds will work.
|
|
||||||
* configure.ac: create rfb subdir for rfbint.h under VPATH.
|
|
||||||
|
|
||||||
2006-04-17 Steven Carr <scarr@jsa-usa.com>
|
|
||||||
* Added an example camera application to demonstrate another
|
|
||||||
way to write a server application.
|
|
||||||
|
|
||||||
2006-04-05 Karl Runge <runge@karlrunge.com>
|
|
||||||
* classes/ssl: SSL Java viewer workarounds for firewall
|
|
||||||
proxies (signed applet as last resort, proxy.vnc).
|
|
||||||
include ssl_vncviewer stunnel wrapper script.
|
|
||||||
|
|
||||||
2006-03-28 Steven Carr <scarr@jsa-usa.com>
|
|
||||||
* SDLvncviewer.c, rfbproto.c, vncviewer.c, main.c, rfbserver.c,
|
|
||||||
rfb.h, rfbclient.h, rfbproto.h: add new encoding: KeyboardLedState
|
|
||||||
|
|
||||||
2006-03-28 Karl Runge <runge@karlrunge.com>
|
|
||||||
* classes/ssl: patch to tightvnc Java viewer for SSL support
|
|
||||||
plus other fixes (richcursor colors, Tab keysym, etc).
|
|
||||||
* libvncserver/httpd.c: add missing \r in 200 OK.
|
|
||||||
|
|
||||||
2006-03-27 Steven Carr <scarr@jsa-usa.com>
|
|
||||||
* rfbserver.c: Zlib encoding cannot have a limit via
|
|
||||||
maxRectsPerUpdate
|
|
||||||
|
|
||||||
2006-02-28 Donald Dugger <donald.d.dugger@intel.com>
|
|
||||||
* rfb.h, sockets.c, main.c: add a flag to handle all pending
|
|
||||||
input events instead of one at a time.
|
|
||||||
|
|
||||||
2006-02-24 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -unixpw and -stunnel options. Add clipboard input
|
|
||||||
to per-client input controls.
|
|
||||||
|
|
||||||
2006-02-24 Rohit Kumar <rokumar@novell.com>
|
|
||||||
* main.c, rfbtightserver.c, rfb.h: added method to get
|
|
||||||
extension specific client data.
|
|
||||||
|
|
||||||
2006-02-22 Rohit Kumar <rokumar@novell.com>
|
|
||||||
* auth.c, main.c, rfbtightserver.c, rfb.h: add methods to
|
|
||||||
unregister extensions and security types.
|
|
||||||
|
|
||||||
2006-02-20 Karl Runge <runge@karlrunge.com>
|
|
||||||
* main.c, cursor.c, tightvnc-filetransfer: fix some non-gcc
|
|
||||||
compiler warnings.
|
|
||||||
|
|
||||||
2006-01-14 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: add -8to24 option for some multi-depth displays.
|
|
||||||
|
|
||||||
2006-01-12 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: add switches for most X extensions.
|
|
||||||
|
|
||||||
2006-01-10 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* libvncserver/{main.c,rfbserver.c}: fix timely closing of clients;
|
|
||||||
the client iterator in rfbProcessEvents() has to iterate also
|
|
||||||
over clients whose sock < 0. Noticed by Karl.
|
|
||||||
|
|
||||||
2006-01-08 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: the big split. (and -afteraccept and -passwdfile read:..)
|
|
||||||
* examples/pnmshow24.c: fix typo.
|
|
||||||
|
|
||||||
2006-01-08 Karl Runge <runge@karlrunge.com>
|
|
||||||
* libvncclient/vncviewer.c: fix non-jpeg/libz builds.
|
|
||||||
* examples/pnmshow24.c: fix non-ALLOW24BPP builds.
|
|
||||||
* libvncserver/main.c: fix 'static int' defn.
|
|
||||||
|
|
||||||
2006-01-05 Karl Runge <runge@karlrunge.com>
|
|
||||||
* libvncserver/main.c: rfbRegisterProtocolExtension extMutex was
|
|
||||||
never initialized.
|
|
||||||
|
|
||||||
2005-12-24 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: enhance -passwdfile features, filetransfer on by default.
|
|
||||||
|
|
||||||
2005-12-19 Dave Stuart <dave@justdave.us>
|
|
||||||
* libvncserver/{main.c,rfbserver.c,cargs.c}, rfb/rfb.h: introduce
|
|
||||||
deferPtrUpdateTime, which defers the handling of pointer events
|
|
||||||
for a couple of milliseconds.
|
|
||||||
|
|
||||||
2005-12-19 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* client_examples/SDLvncviewer.c, libvncclient/{sockets.c,vncviewer.c},
|
|
||||||
libvncserver/{main.c,rfbserver.c,sockets.c}: fix MinGW32 compilation
|
|
||||||
|
|
||||||
2005-12-08 "Mazin, Malvina" <Malvina.Mazin@kla-tencor.com>
|
|
||||||
* configure.ac, libvncserver/sockets.c: on Solaris 2.7, write may
|
|
||||||
return ENOENT when it really means EAGAIN.
|
|
||||||
|
|
||||||
2005-12-07 Giampiero Giancipoli <giampiero.giancipoli@fredreggiane.com>
|
|
||||||
* libvncclient/vncviewer.c: plug memory leaks
|
|
||||||
|
|
||||||
2005-12-07 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* client_examples/SDLvncviewer.c: use unicode to determine the keysym
|
|
||||||
(much more reliable than the old method)
|
|
||||||
|
|
||||||
2005-11-25 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: disable tightvnc-filetransfer if no libpthread.
|
|
||||||
add --without-pthread option.
|
|
||||||
* libvncserver/Makefile.am: enable WITH_TIGHTVNC_FILETRANSFER
|
|
||||||
conditional.
|
|
||||||
* libvncserver/rfbserver.c: fix deadlock from
|
|
||||||
rfbReleaseExtensionIterator(), fix no libz/libjpeg builds.
|
|
||||||
* libvncserver/{main.c,private.h}, rfb/rfbclient.h, libvncclient/{rfbproto.c,
|
|
||||||
tight.c,vncviewer.c}: fix no libz/libjpeg builds.
|
|
||||||
* libvncserver/tightvnc-filetransfer/rfbtightserver.c: fix no
|
|
||||||
libz/libjpeg builds. rm // comments.
|
|
||||||
* libvncserver/tightvnc-filetransfer/filetransfermsg{.c,.h},
|
|
||||||
libvncserver/auth.c: rm // comments.
|
|
||||||
* libvncserver/tightvnc-filetransfer/filelistinfo.h: set NAME_MAX if not
|
|
||||||
defined.
|
|
||||||
* x11vnc: throttle load if fb update requests not taking place.
|
|
||||||
|
|
||||||
2005-10-22 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -filexfer file transfer, -slow_fb, -blackout noptr...
|
|
||||||
|
|
||||||
2005-10-06 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* many a files: kill BackChannel and CustomClientMessage
|
|
||||||
support. The new extension mechanism is much more versatile.
|
|
||||||
To prove this, a new example shows how to implement the back
|
|
||||||
channel as an extension. Of course, this had to be tested, so
|
|
||||||
LibVNCClient now has beginnings of an extension mechanism, too.
|
|
||||||
And an example implementing the client side of the back channel.
|
|
||||||
|
|
||||||
2005-10-03 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* libvncserver/rfbserver.c, rfb/rfb.h: add a method to the
|
|
||||||
extension struct which is called to enable pseudo encodings.
|
|
||||||
This is a versatile mechanism to enable/disable custom
|
|
||||||
extensions with custom clients and servers.
|
|
||||||
|
|
||||||
2005-09-28 Rohit Kumar <rokumar@novell.com>
|
|
||||||
* examples/filetransfer.c, rfb/rfb.h, configure.ac,
|
|
||||||
libvncserver/{auth,cargs,main,rfbserver,sockets}.c,
|
|
||||||
libvncserver/tightvnc-extension/*:
|
|
||||||
Implement TightVNC's file transfer protocol.
|
|
||||||
|
|
||||||
2005-09-27 Rohit Kumar <rokumar@novell.com>
|
|
||||||
* libvncserver/{cargs,sockets,main,rfbserver}.c,
|
|
||||||
rfb/rfb.h: Provide a generic means to extend the RFB
|
|
||||||
protocol: rfbRegisterProtocolExtension(extension). This
|
|
||||||
deprecates the current (very limited) option to override
|
|
||||||
rfbScreenInfoPtr->processCustomClientMessage(client).
|
|
||||||
|
|
||||||
2005-09-26 Rohit Kumar <rokumar@novell.com>
|
|
||||||
* libvncserver/{auth,main,rfbserver}.c, rfb/{rfb,rfbproto}.h:
|
|
||||||
support VNC protocol version 3.7. This allows to add security
|
|
||||||
types.
|
|
||||||
|
|
||||||
2005-08-21 Alberto Lusiani <alusiani@gmail.com>
|
|
||||||
* libvncserver.spec.in: split rpm into libvncserver, -devel and x11vnc
|
|
||||||
|
|
||||||
2005-07-12 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: tweaks for release, fix queue buildup under -viewonly
|
|
||||||
|
|
||||||
2005-07-10 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -grab_buster for breaking XGrabServer deadlock, fix
|
|
||||||
scrolls and copyrect for -clip and -id cases.
|
|
||||||
|
|
||||||
2005-07-06 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -gui tray now embeds in systray; more improvements to gui.
|
|
||||||
|
|
||||||
2005-07-01 Karl Runge <runge@karlrunge.com>
|
|
||||||
* libvncserver/httpd.c: make sure httpListenSock >=0 in rfbHttpCheckFds
|
|
||||||
* x11vnc: add simple "-gui tray" mode for small icon like x0rfbserver
|
|
||||||
had (someday/somehow to auto embed in a tray/dock)
|
|
||||||
|
|
||||||
2005-06-28 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* libvncclient/zrle.c: fix handling of raw and fill subtypes
|
|
||||||
(off-by-one and off-by-many bug)
|
|
||||||
|
|
||||||
2005-06-27 Karl Runge <runge@karlrunge.com>
|
|
||||||
* libvncserver/main.c: move deferUpdateTime and maxRectsPerUpdate
|
|
||||||
defaults to before rfbProcessArguments().
|
|
||||||
|
|
||||||
2005-06-18 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: don't use -R on HP-UX and OSF1.
|
|
||||||
* x11vnc: don't free the current cursor, close stderr
|
|
||||||
for -inetd -q and no -o logfile, set DISPLAY for -solid
|
|
||||||
external calls.
|
|
||||||
|
|
||||||
2005-06-14 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: XReadScreen and XReadDisplay checks.
|
|
||||||
* libvncserver/cursor.c: fix unsigned long crash for 64bits.
|
|
||||||
* x11vnc: first round of beta-testing fixes, RFE's.
|
|
||||||
|
|
||||||
2005-06-10 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* configure.ac: fix that annoying SUN /usr/ccs location of "ar"
|
|
||||||
|
|
||||||
2005-06-03 Karl Runge <runge@karlrunge.com>
|
|
||||||
* libvncserver/main.c: remove sraRgnSubtract from copyRegion
|
|
||||||
* x11vnc: scrollcopyrect under -scale, add -fixscreen.
|
|
||||||
|
|
||||||
2005-05-30 Karl Runge <runge@karlrunge.com>
|
|
||||||
* libvncserver/main.c: fix copyRect for non-cursor-shape-aware clients.
|
|
||||||
|
|
||||||
2005-05-24 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: scrollcopyrect: GrabServer detection, autorepeat throttling..
|
|
||||||
* prepare_x11vnc_dist.sh: grep out new libvncserver-config line.
|
|
||||||
|
|
||||||
2005-05-23 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: malloc(0) is never used, so we don't need the check
|
|
||||||
|
|
||||||
2005-05-15 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* acinclude.m4: fix compilation for systems without socklen_t
|
|
||||||
|
|
||||||
2005-05-17 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: more scrolling, -scr_term, -wait_ui, -nowait_bog
|
|
||||||
|
|
||||||
2005-05-15 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* almost every file: ANSIfy, fix warnings from Linus' sparse
|
|
||||||
|
|
||||||
2005-05-14 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: more work on -scrollcopyrect and -xkb modes.
|
|
||||||
|
|
||||||
2005-05-13 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* libvncserver/{main,rfbserver,sockets}.c: fix memory leaks (valgrind)
|
|
||||||
|
|
||||||
2005-05-07 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* libvncserver/rfbserver.c: fix memory leak pointed out by Tim Jansen
|
|
||||||
* libvncserver/{httpd,main,rfbserver,sockets}.c, rfb/rfb.h:
|
|
||||||
replace "rfbBool socketInitDone" by "enum rfbSocketState
|
|
||||||
socketState"
|
|
||||||
|
|
||||||
2005-05-03 Karl Runge <runge@karlrunge.com>
|
|
||||||
* libvncserver/main.c: fix leak in rfbDoCopyRect/rfbScheduleCopyRect
|
|
||||||
* configure.ac: guard against empty HAVE_X
|
|
||||||
|
|
||||||
2005-05-02 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: fatal error for x11vnc package if no X present
|
|
||||||
* configure.ac: give warnings and info about missing libjpeg/libz
|
|
||||||
* x11vnc: X RECORD heuristics to detect scrolls: -scrollcopyrect,
|
|
||||||
build customizations, bandwidth/latency estimates.
|
|
||||||
|
|
||||||
2005-04-27 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* clear requested region (long standing TODO, pointed out by Karl)
|
|
||||||
|
|
||||||
2005-04-19 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -wireframe, -wirecopyrect. Back to the 90's with
|
|
||||||
wireframes to avoid window move/resize lurching.
|
|
||||||
* safer remote control defaults. -privremote, -safer, -nocmds.
|
|
||||||
* debug_xevents, debug_xdamage. -noviewonly for rawfb mode.
|
|
||||||
|
|
||||||
2005-04-10 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: add mmap
|
|
||||||
* x11vnc: -rawfb, -pipeinput, -xtrap, -flag, ...
|
|
||||||
|
|
||||||
2005-04-03 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: add conditional libXTrap checking
|
|
||||||
* x11vnc: use DEC-XTRAP on old X11R5 for grab control.
|
|
||||||
-shiftcmap n, -http, fix DAMAGE event leak.
|
|
||||||
|
|
||||||
2005-03-29 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: fix event leaks, build-time customizations, -nolookup
|
|
||||||
|
|
||||||
2005-03-19 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: scale cursors by default, -scale_cursor to tune,
|
|
||||||
-arrow n, -norepeat n, speed up integer magnification.
|
|
||||||
|
|
||||||
2005-03-12 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: X DAMAGE support, -clip WxH+X+Y, identd.
|
|
||||||
|
|
||||||
2005-03-05 Karl Runge <runge@karlrunge.com>
|
|
||||||
* autoconf: rpm -> rpmbuild and echo -n -> printf
|
|
||||||
|
|
||||||
2005-03-04 Karl Runge <runge@karlrunge.com>
|
|
||||||
* libvncserver/{cargs.c,sockets.c}: add -listen option and
|
|
||||||
rfbScreen member listenInterface.
|
|
||||||
* rfb/rfb.h: rfbListenOnTCPPort() and rfbListenOnUDPPort()
|
|
||||||
function prototypes changed to include network interface.
|
|
||||||
|
|
||||||
2005-02-14 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -users lurk=, -solid for cde, -gui ez,.. beginner mode.
|
|
||||||
|
|
||||||
2005-02-10 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -input option to fine tune allowed client input,
|
|
||||||
additions to remote control and gui for this.
|
|
||||||
|
|
||||||
2005-02-09 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -users, fix -solid on gnome and kde.
|
|
||||||
* configure.ac: add pwd.h, wait.h, and utmpx.h checks.
|
|
||||||
|
|
||||||
2005-02-06 Karl Runge <runge@karlrunge.com>
|
|
||||||
* configure.ac: add /usr/sfw on Solaris when XFIXES, add
|
|
||||||
--with-jpeg=DIR --with-zlib=DIR, workaround bug when
|
|
||||||
--without-jpeg was supplied.
|
|
||||||
* prepare_x11vnc_dist.sh: few tweaks for next release
|
|
||||||
|
|
||||||
2005-02-05 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -solid color, -opts/-?
|
|
||||||
* tightvnc-1.3dev5-vncviewer-alpha-cursor.patch: create, name
|
|
||||||
says it all.
|
|
||||||
|
|
||||||
2005-01-23 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -timeout, -noalphablend. make -R norepeat work.
|
|
||||||
* sync with new draw cursor mechanism.
|
|
||||||
|
|
||||||
2005-01-20 Karl Runge <runge@karlrunge.com>
|
|
||||||
* libvncserver/{cursor.c,rfbserver.c}: fixed the "disappearing cursor"
|
|
||||||
problem
|
|
||||||
|
|
||||||
2005-01-18 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* rfb/rfb.h libvncserver/rfbserver.c: pointerClient was still static
|
|
||||||
* libvncserver/rfbserver.c: do not make requestedRegion empty without
|
|
||||||
reason.
|
|
||||||
* almost everything: the cursor handling for clients which don't handle
|
|
||||||
CursorShape updates was completely broken. It originally was very
|
|
||||||
complicated for performance reasons, however, in most cases it made
|
|
||||||
performance even worse, because at idle times there was way too much
|
|
||||||
checking going on, and furthermore, sometimes unnecessary updates
|
|
||||||
were inevitable.
|
|
||||||
The code now is much more elegant: the ClientRec structure knows
|
|
||||||
exactly where it last painted the cursor, and the ScreenInfo
|
|
||||||
structure knows where the cursor shall be.
|
|
||||||
As a consequence there is no more rfbDrawCursor()/rfbUndrawCursor(),
|
|
||||||
no more dontSendFramebufferUpdate, and no more isCursorDrawn.
|
|
||||||
It is now possible to have clients which understand CursorShape
|
|
||||||
updates and clients which don't at the same time.
|
|
||||||
* libvncserver/cursor.c: rfbSetCursor no longer has the option
|
|
||||||
freeOld; this is obsolete, as the cursor structure knows what
|
|
||||||
to free and what not.
|
|
||||||
|
|
||||||
2005-01-15 Karl Runge <runge@karlrunge.com>
|
|
||||||
* rfb/rfb.h: add alphaSource and alphaPreMultiplied to rfbCursor.
|
|
||||||
* libvncserver/cursor.c: do cursor alpha blending in rfbDrawCursor()
|
|
||||||
for non-cursorshapeupdates clients.
|
|
||||||
* x11vnc: -alphablend, cursors fixes, -snapfb, more tweaks and bug
|
|
||||||
fixes.
|
|
||||||
|
|
||||||
2004-12-27 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: improve alpha channel handling for XFIXES cursors.
|
|
||||||
* add more parameters to remote control.
|
|
||||||
|
|
||||||
2004-12-20 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* released version 0.7
|
|
||||||
|
|
||||||
2004-12-19 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: string cleanup, synchronous remote-control option -sync
|
|
||||||
* libvncserver/cursor.c: zero underCursorBufferLen when cursor freed.
|
|
||||||
|
|
||||||
2004-12-16 Karl Runge <runge@karlrunge.com>
|
|
||||||
* test/encodingstest.c: fix decl bug in main()
|
|
||||||
* x11vnc: use XFIXES extension to show the exact cursor shape.
|
|
||||||
* remote control nearly everything on the fly, -remote/-query
|
|
||||||
* tcl/tk gui based on the remote control, -gui
|
|
||||||
* support screen size changes with XRANDR ext., -xrandr, -padgeom
|
|
||||||
* Misc: -overlay visual support on IRIX, -id pick, -pointer_mode n,
|
|
||||||
-sb n, RFB_MODE set in env. under -accept/-gone.
|
|
||||||
|
|
||||||
2004-12-02 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* make LibVNCServer compile & work on MinGW32
|
|
||||||
|
|
||||||
2004-11-30 "Leiradella, Andre V Matos Da Cunha" <ANDRE.LEIRADELLA@bra.xerox.com>
|
|
||||||
* libvncclient/sockets.c: return TRUE in every case of success
|
|
||||||
|
|
||||||
2004-08-29 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: yet another pointer input handling algorithm in
|
|
||||||
check_user_input(), revert to previous with -old_pointer2.
|
|
||||||
* modifiy prepare_x11vnc_dist.sh to install tightvnc Java viewer
|
|
||||||
in $prefix/share/x11vnc/classes
|
|
||||||
|
|
||||||
2004-08-29 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* */*.[ch]: API changes: global functions/structures should have
|
|
||||||
* either "rfb", "sra" or "zrle" as prefix, while structure members
|
|
||||||
* should not...
|
|
||||||
|
|
||||||
2004-08-29 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: changes in cursor shape handling: use rfbSetCursor()
|
|
||||||
* cursor shape options: -cursor, -cursor (X|some|most)
|
|
||||||
* -vncconnect the default.
|
|
||||||
* configure.ac: add more macros for X extensions.
|
|
||||||
|
|
||||||
2004-08-15 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -overlay to fix colors with Sun 8+24 overlay visuals.
|
|
||||||
* -sid option.
|
|
||||||
|
|
||||||
2004-08-03 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: manpage and README
|
|
||||||
* fix XKBlib.h detection on *BSD
|
|
||||||
|
|
||||||
2004-07-31 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -cursorpos now the default
|
|
||||||
|
|
||||||
2004-07-28 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -add_keysyms dynamically add missing keysyms to X server
|
|
||||||
|
|
||||||
2004-07-26 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: first pass at doing modtweak via XKEYBOARD extension (-xkb)
|
|
||||||
* -skip_keycodes; reset modtweaks on event MappingNotify.
|
|
||||||
* fix bugs wrt PRIMARY handling.
|
|
||||||
* continuation lines "\" in x11vncrc.
|
|
||||||
|
|
||||||
2004-07-15 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: modtweak is now the default
|
|
||||||
* check X11/XKBlib.h in configure.ac to work around Solaris 7 bug.
|
|
||||||
|
|
||||||
2004-07-10 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: norepeat to turn off X server autorepeat when clients exist,
|
|
||||||
let the client side do the autorepeating.
|
|
||||||
|
|
||||||
2004-06-26 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: add "-scale fraction" for global server-side scaling.
|
|
||||||
|
|
||||||
2004-06-17 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: simple ~/.x11vncrc config file support, -rc, -norc
|
|
||||||
|
|
||||||
2004-06-12 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -clear_mods, -clear_keys, and -storepasswd,
|
|
||||||
* add RFB_SERVER_IP RFB_SERVER_PORT to -accept env.
|
|
||||||
|
|
||||||
2004-06-07 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* libvncserver/cursor.c, rfb/rfb.h: fix cursor trails
|
|
||||||
* */Makefile.am: stop automake nagging
|
|
||||||
* libvncclient/*, client_examples/*: streamline API, SDLvncviewer added
|
|
||||||
* examples/, libvncclient/, test/: moved tests to test/
|
|
||||||
|
|
||||||
2004-06-05 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: rearrange file for easier maintenance
|
|
||||||
* add RFB_CLIENT_COUNT to -accept and -gone commands
|
|
||||||
|
|
||||||
2004-05-27 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -viewpasswd, viewonly passwds.
|
|
||||||
* some typos in prepare_x11vnc_dist.sh
|
|
||||||
* libvncserver: fix view-only plain passwd and view-only CutText
|
|
||||||
|
|
||||||
2004-05-25 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* moved the library into libvncserver/
|
|
||||||
* moved x11vnc into x11vnc/
|
|
||||||
|
|
||||||
2004-05-21 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -gone, -passwdfile, -o logfile; add view-only to -accept
|
|
||||||
|
|
||||||
2004-05-08 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: add -accept some-command/xmessage/popup
|
|
||||||
|
|
||||||
2004-05-05 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: mouse button -> keystrokes and keystroke -> mouse button
|
|
||||||
mappings in -buttonmap and -remap
|
|
||||||
* shm OS blacklist revert to -onetile
|
|
||||||
|
|
||||||
2004-04-28 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -auth, more -cursorpos and -nofb work
|
|
||||||
|
|
||||||
2004-04-19 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: -cursorpos, -sigpipe
|
|
||||||
|
|
||||||
2004-04-13 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc: do not send selection unless all clients
|
|
||||||
are in RFB_NORMAL state.
|
|
||||||
* increase rfbMaxClientWait when threaded to avoid
|
|
||||||
ReadExact() timeouts for some viewers.
|
|
||||||
|
|
||||||
2004-04-08 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc options -blackout, -xinerama, -xwarppointer
|
|
||||||
* modify configure.ac to pick up -lXinerama
|
|
||||||
* extend -remap to take mapping list.
|
|
||||||
* check cargs result for unused args.
|
|
||||||
|
|
||||||
2004-03-22 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* fix cargs.c (hopefully for the last time):
|
|
||||||
arguments were not correctly purged
|
|
||||||
|
|
||||||
2004-03-15 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* fix libvncserver-config to again return a linker when
|
|
||||||
called with --link
|
|
||||||
|
|
||||||
2004-03-10 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc options -vncconnect, -connect, -remap,
|
|
||||||
-debug_pointer, and -debug_keyboard
|
|
||||||
* support reverse connections, vncconnect(1), etc.
|
|
||||||
* expt. with user supplied keysym remapping.
|
|
||||||
* debug output option for pointer and keyboard.
|
|
||||||
|
|
||||||
2004-02-29 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* fixed warning of valgrind for regiontest
|
|
||||||
|
|
||||||
2004-02-19 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc options -nosel -noprimary -visual.
|
|
||||||
* add clipboard/selection handling.
|
|
||||||
* add visual option (mostly for testing and workarounds).
|
|
||||||
* improve shm cleanup on failures.
|
|
||||||
|
|
||||||
2004-02-04 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* Make examples (at least a few) compileable with g++,
|
|
||||||
as pointed out by Juan Jose Costello
|
|
||||||
|
|
||||||
2004-01-30 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* Thanks to Paul Fox from Bright Star Engineering,
|
|
||||||
a few more memory leaks were fixed.
|
|
||||||
|
|
||||||
2004-01-29 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* Honour the check for libz and libjpeg again.
|
|
||||||
|
|
||||||
2004-01-21 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* do not send unneccessary updates when drawing a cursor
|
|
||||||
* ignore SIGPIPE; it is handled by EPIPE
|
|
||||||
* add an example how to use rfbDoCopyRect
|
|
||||||
* add experimental progressive updating (off by default)
|
|
||||||
|
|
||||||
2004-01-19 Karl Runge <runge@karlrunge.com>
|
|
||||||
* handle mouse button number mismatch
|
|
||||||
* improved pointer input handling during drags, etc.
|
|
||||||
* somewhat faster copy_tiles() -> copy_tiles()
|
|
||||||
* x11vnc options -buttonmap -old_pointer -old_copytile
|
|
||||||
|
|
||||||
2004-01-16 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* compile fix for cygwin
|
|
||||||
|
|
||||||
2004-01-09 Karl Runge <runge@karlrunge.com>
|
|
||||||
* x11vnc options -allow, -localhost, -nodragging, -input_skip
|
|
||||||
* minimize memory usage under -nofb
|
|
||||||
|
|
||||||
2003-12-08 Karl Runge <runge@karlrunge.com>
|
|
||||||
* add check for XKEYBOARD extension in configure.ac
|
|
||||||
* support XBell events (disable: "-nobell"), "-nofb" in x11vnc
|
|
||||||
|
|
||||||
2003-11-07 Karl Runge <runge@karlrunge.com>
|
|
||||||
* support "-inetd", "-noshm", "-flipbyteorder" in x11vnc
|
|
||||||
|
|
||||||
2003-10-26 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* released Version 0.6
|
|
||||||
|
|
||||||
2003-09-11 Mark McLoughlin <mark@skynet.ie>
|
|
||||||
|
|
||||||
* Makefile.in, */Makefile.in, aclocal.m4,
|
|
||||||
bootstrap.sh, config.h.in, configure,
|
|
||||||
depcomp, install-sh, missing, mkinstalldirs,
|
|
||||||
Removed auto-generated files from CVS.
|
|
||||||
|
|
||||||
2003-09-11 Mark McLoughlin <mark@skynet.ie>
|
|
||||||
|
|
||||||
* rdr/Exception.h, rdr/FdInStream.cxx, rdr/FdInStream.h,
|
|
||||||
rdr/FdOutStream.cxx, rdr/FdOutStream.h, rdr/FixedMemOutStream.h,
|
|
||||||
rdr/InStream.cxx, rdr/InStream.h, rdr/MemInStream.h,
|
|
||||||
rdr/MemOutStream.h, rdr/NullOutStream.cxx, rdr/NullOutStream.h,
|
|
||||||
rdr/OutStream.h, rdr/ZlibInStream.cxx, rdr/ZlibInStream.h,
|
|
||||||
rdr/ZlibOutStream.cxx, rdr/ZlibOutStream.h, rdr/types.h,
|
|
||||||
zrle.cxx, zrleDecode.h, zrleEncode.h: remove original
|
|
||||||
C++ ZRLE implementation. Its been ported to C.
|
|
||||||
|
|
||||||
* NEWS: copy the existing ChangeLog to here and make
|
|
||||||
this a more detailed ChangeLog.
|
|
@ -1,182 +0,0 @@
|
|||||||
Basic Installation
|
|
||||||
==================
|
|
||||||
|
|
||||||
These are generic installation instructions.
|
|
||||||
|
|
||||||
The `configure' shell script attempts to guess correct values for
|
|
||||||
various system-dependent variables used during compilation. It uses
|
|
||||||
those values to create a `Makefile' in each directory of the package.
|
|
||||||
It may also create one or more `.h' files containing system-dependent
|
|
||||||
definitions. Finally, it creates a shell script `config.status' that
|
|
||||||
you can run in the future to recreate the current configuration, a file
|
|
||||||
`config.cache' that saves the results of its tests to speed up
|
|
||||||
reconfiguring, and a file `config.log' containing compiler output
|
|
||||||
(useful mainly for debugging `configure').
|
|
||||||
|
|
||||||
If you need to do unusual things to compile the package, please try
|
|
||||||
to figure out how `configure' could check whether to do them, and mail
|
|
||||||
diffs or instructions to the address given in the `README' so they can
|
|
||||||
be considered for the next release. If at some point `config.cache'
|
|
||||||
contains results you don't want to keep, you may remove or edit it.
|
|
||||||
|
|
||||||
The file `configure.in' is used to create `configure' by a program
|
|
||||||
called `autoconf'. You only need `configure.in' if you want to change
|
|
||||||
it or regenerate `configure' using a newer version of `autoconf'.
|
|
||||||
|
|
||||||
The simplest way to compile this package is:
|
|
||||||
|
|
||||||
1. `cd' to the directory containing the package's source code and type
|
|
||||||
`./configure' to configure the package for your system. If you're
|
|
||||||
using `csh' on an old version of System V, you might need to type
|
|
||||||
`sh ./configure' instead to prevent `csh' from trying to execute
|
|
||||||
`configure' itself.
|
|
||||||
|
|
||||||
Running `configure' takes awhile. While running, it prints some
|
|
||||||
messages telling which features it is checking for.
|
|
||||||
|
|
||||||
2. Type `make' to compile the package.
|
|
||||||
|
|
||||||
3. Optionally, type `make check' to run any self-tests that come with
|
|
||||||
the package.
|
|
||||||
|
|
||||||
4. Type `make install' to install the programs and any data files and
|
|
||||||
documentation.
|
|
||||||
|
|
||||||
5. You can remove the program binaries and object files from the
|
|
||||||
source code directory by typing `make clean'. To also remove the
|
|
||||||
files that `configure' created (so you can compile the package for
|
|
||||||
a different kind of computer), type `make distclean'. There is
|
|
||||||
also a `make maintainer-clean' target, but that is intended mainly
|
|
||||||
for the package's developers. If you use it, you may have to get
|
|
||||||
all sorts of other programs in order to regenerate files that came
|
|
||||||
with the distribution.
|
|
||||||
|
|
||||||
Compilers and Options
|
|
||||||
=====================
|
|
||||||
|
|
||||||
Some systems require unusual options for compilation or linking that
|
|
||||||
the `configure' script does not know about. You can give `configure'
|
|
||||||
initial values for variables by setting them in the environment. Using
|
|
||||||
a Bourne-compatible shell, you can do that on the command line like
|
|
||||||
this:
|
|
||||||
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
|
|
||||||
|
|
||||||
Or on systems that have the `env' program, you can do it like this:
|
|
||||||
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
|
|
||||||
|
|
||||||
Compiling For Multiple Architectures
|
|
||||||
====================================
|
|
||||||
|
|
||||||
You can compile the package for more than one kind of computer at the
|
|
||||||
same time, by placing the object files for each architecture in their
|
|
||||||
own directory. To do this, you must use a version of `make' that
|
|
||||||
supports the `VPATH' variable, such as GNU `make'. `cd' to the
|
|
||||||
directory where you want the object files and executables to go and run
|
|
||||||
the `configure' script. `configure' automatically checks for the
|
|
||||||
source code in the directory that `configure' is in and in `..'.
|
|
||||||
|
|
||||||
If you have to use a `make' that does not supports the `VPATH'
|
|
||||||
variable, you have to compile the package for one architecture at a time
|
|
||||||
in the source code directory. After you have installed the package for
|
|
||||||
one architecture, use `make distclean' before reconfiguring for another
|
|
||||||
architecture.
|
|
||||||
|
|
||||||
Installation Names
|
|
||||||
==================
|
|
||||||
|
|
||||||
By default, `make install' will install the package's files in
|
|
||||||
`/usr/local/bin', `/usr/local/man', etc. You can specify an
|
|
||||||
installation prefix other than `/usr/local' by giving `configure' the
|
|
||||||
option `--prefix=PATH'.
|
|
||||||
|
|
||||||
You can specify separate installation prefixes for
|
|
||||||
architecture-specific files and architecture-independent files. If you
|
|
||||||
give `configure' the option `--exec-prefix=PATH', the package will use
|
|
||||||
PATH as the prefix for installing programs and libraries.
|
|
||||||
Documentation and other data files will still use the regular prefix.
|
|
||||||
|
|
||||||
In addition, if you use an unusual directory layout you can give
|
|
||||||
options like `--bindir=PATH' to specify different values for particular
|
|
||||||
kinds of files. Run `configure --help' for a list of the directories
|
|
||||||
you can set and what kinds of files go in them.
|
|
||||||
|
|
||||||
If the package supports it, you can cause programs to be installed
|
|
||||||
with an extra prefix or suffix on their names by giving `configure' the
|
|
||||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
|
||||||
|
|
||||||
Optional Features
|
|
||||||
=================
|
|
||||||
|
|
||||||
Some packages pay attention to `--enable-FEATURE' options to
|
|
||||||
`configure', where FEATURE indicates an optional part of the package.
|
|
||||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
|
||||||
is something like `gnu-as' or `x' (for the X Window System). The
|
|
||||||
`README' should mention any `--enable-' and `--with-' options that the
|
|
||||||
package recognizes.
|
|
||||||
|
|
||||||
For packages that use the X Window System, `configure' can usually
|
|
||||||
find the X include and library files automatically, but if it doesn't,
|
|
||||||
you can use the `configure' options `--x-includes=DIR' and
|
|
||||||
`--x-libraries=DIR' to specify their locations.
|
|
||||||
|
|
||||||
Specifying the System Type
|
|
||||||
==========================
|
|
||||||
|
|
||||||
There may be some features `configure' can not figure out
|
|
||||||
automatically, but needs to determine by the type of host the package
|
|
||||||
will run on. Usually `configure' can figure that out, but if it prints
|
|
||||||
a message saying it can not guess the host type, give it the
|
|
||||||
`--host=TYPE' option. TYPE can either be a short name for the system
|
|
||||||
type, such as `sun4', or a canonical name with three fields:
|
|
||||||
CPU-COMPANY-SYSTEM
|
|
||||||
|
|
||||||
See the file `config.sub' for the possible values of each field. If
|
|
||||||
`config.sub' isn't included in this package, then this package doesn't
|
|
||||||
need to know the host type.
|
|
||||||
|
|
||||||
If you are building compiler tools for cross-compiling, you can also
|
|
||||||
use the `--target=TYPE' option to select the type of system they will
|
|
||||||
produce code for and the `--build=TYPE' option to select the type of
|
|
||||||
system on which you are compiling the package.
|
|
||||||
|
|
||||||
Sharing Defaults
|
|
||||||
================
|
|
||||||
|
|
||||||
If you want to set default values for `configure' scripts to share,
|
|
||||||
you can create a site shell script called `config.site' that gives
|
|
||||||
default values for variables like `CC', `cache_file', and `prefix'.
|
|
||||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
|
||||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
|
||||||
`CONFIG_SITE' environment variable to the location of the site script.
|
|
||||||
A warning: not all `configure' scripts look for a site script.
|
|
||||||
|
|
||||||
Operation Controls
|
|
||||||
==================
|
|
||||||
|
|
||||||
`configure' recognizes the following options to control how it
|
|
||||||
operates.
|
|
||||||
|
|
||||||
`--cache-file=FILE'
|
|
||||||
Use and save the results of the tests in FILE instead of
|
|
||||||
`./config.cache'. Set FILE to `/dev/null' to disable caching, for
|
|
||||||
debugging `configure'.
|
|
||||||
|
|
||||||
`--help'
|
|
||||||
Print a summary of the options to `configure', and exit.
|
|
||||||
|
|
||||||
`--quiet'
|
|
||||||
`--silent'
|
|
||||||
`-q'
|
|
||||||
Do not print messages saying which checks are being made. To
|
|
||||||
suppress all normal output, redirect it to `/dev/null' (any error
|
|
||||||
messages will still be shown).
|
|
||||||
|
|
||||||
`--srcdir=DIR'
|
|
||||||
Look for the package's source code in directory DIR. Usually
|
|
||||||
`configure' can determine that directory automatically.
|
|
||||||
|
|
||||||
`--version'
|
|
||||||
Print the version of Autoconf used to generate the `configure'
|
|
||||||
script, and exit.
|
|
||||||
|
|
||||||
`configure' also accepts some other, not widely useful, options.
|
|
@ -1,27 +0,0 @@
|
|||||||
if WITH_X11VNC
|
|
||||||
X11VNC=x11vnc
|
|
||||||
endif
|
|
||||||
|
|
||||||
SUBDIRS=libvncserver examples contrib libvncclient vncterm classes client_examples test $(X11VNC)
|
|
||||||
DIST_SUBDIRS=libvncserver examples contrib libvncclient vncterm classes client_examples test
|
|
||||||
|
|
||||||
bin_SCRIPTS = libvncserver-config
|
|
||||||
|
|
||||||
includedir=$(prefix)/include/rfb
|
|
||||||
#include_HEADERS=rfb.h rfbconfig.h rfbint.h rfbproto.h keysym.h rfbregion.h
|
|
||||||
|
|
||||||
include_HEADERS=rfb/rfb.h rfb/rfbconfig.h rfb/rfbint.h rfb/rfbproto.h \
|
|
||||||
rfb/keysym.h rfb/rfbregion.h rfb/rfbclient.h
|
|
||||||
|
|
||||||
$(PACKAGE)-$(VERSION).tar.gz: dist
|
|
||||||
|
|
||||||
if HAVE_RPM
|
|
||||||
# Rule to build RPM distribution package
|
|
||||||
rpm: $(PACKAGE)-$(VERSION).tar.gz $(PACKAGE).spec
|
|
||||||
cp $(PACKAGE)-$(VERSION).tar.gz @RPMSOURCEDIR@
|
|
||||||
rpmbuild -ba $(PACKAGE).spec
|
|
||||||
endif
|
|
||||||
|
|
||||||
t:
|
|
||||||
$(MAKE) -C test test
|
|
||||||
|
|
@ -1,147 +0,0 @@
|
|||||||
Mark sent me patches to no longer need C++ for ZRLE encoding!
|
|
||||||
added --disable-cxx Option for configure
|
|
||||||
x11vnc changes from Karl Runge:
|
|
||||||
- Changed all those whimpy printf(...)'s into manly fprintf(stdxxx,...)'s.
|
|
||||||
|
|
||||||
- Added -q switch (quiet) to suppress printing all the debug-looking output.
|
|
||||||
|
|
||||||
- Added -bg switch to fork into background after everything is set up.
|
|
||||||
(checks for LIBVNCSERVER_HAVE_FORK and LIBVNCSERVER_HAVE_SETSID)
|
|
||||||
|
|
||||||
- Print this string out to stdout: 'PORT=XXXX' (usually XXXX = 5900).
|
|
||||||
Combining with -bg, easy to write a ssh/rsh wrapper with something like:
|
|
||||||
port=`ssh $host "x11vnc -bg .."` then run vncviewer based on $port output.
|
|
||||||
(tunneling the vnc traffic thru ssh a bit more messy, but doable)
|
|
||||||
|
|
||||||
- Quite a bit of code to be more careful when doing 8bpp indexed color, e.g.
|
|
||||||
not assuming NCOLORS is 256, handling 8bit TrueColor and Direct Color, etc
|
|
||||||
(I did all this probably in April, not quite clear in my mind now, but
|
|
||||||
I did test it out a fair amount on my old Sparcstation 20 wrt a user's
|
|
||||||
questions).
|
|
||||||
introduce rfbErr for Errors (Erik)
|
|
||||||
make rfbLog overridable (suggested by Erik)
|
|
||||||
don't reutrn on EINTR in WriteExact()/ReadExact() (suggested by Erik)
|
|
||||||
use AX_PREFIX_CONFIG_H to prefix constants in config.h to avoid
|
|
||||||
name clashes (also suggested by Erik)
|
|
||||||
transformed Bool, KeySym, Pixel to rfbBool, rfbKeySym, rfbPixel
|
|
||||||
(as suggested by Erik)
|
|
||||||
purged exit() calls (suggested by Erik)
|
|
||||||
fixed bug with maxRectsPerUpdate and Tight Encoding (these are incompatible)
|
|
||||||
checked sync with TightVNC 1.2.8:
|
|
||||||
viewonly/full passwords; if given a list, only the first is a full one
|
|
||||||
vncRandomBytes is a little more secure now
|
|
||||||
new weights for tight encoding
|
|
||||||
checked sync with RealVNC 3.3.7
|
|
||||||
introduced maxRectsPerUpdate
|
|
||||||
added first alpha version of LibVNCClient
|
|
||||||
added simple and simple15 example (really simple examples)
|
|
||||||
finally got around to fix configure in CVS
|
|
||||||
long standing http bug (.jar was sent twice) fixed by a friend of Karl named Mike
|
|
||||||
http options in cargs
|
|
||||||
when closing a client and no longer listening for new ones, don't crash
|
|
||||||
fixed a bug with ClientConnectionGone
|
|
||||||
endianness is checked at configure time
|
|
||||||
fixed a bug that prevented the first client from being closed
|
|
||||||
fixed that annoying "libvncserver-config --link" bug
|
|
||||||
make rfbReverseByte public (for rdp2vnc)
|
|
||||||
fixed compilation on OS X, IRIX, Solaris
|
|
||||||
install target for headers is now ${prefix}/include/rfb ("#include <rfb/rfb.h>")
|
|
||||||
renamed "sraRegion.h" to "rfbregion.h"
|
|
||||||
CARD{8,16,32} are more standard uint{8,16,32}_t now
|
|
||||||
fixed LinuxVNC colour handling
|
|
||||||
fixed a bug with pthreads where the connection was not closed
|
|
||||||
moved vncterm to main package (LinuxVNC included)
|
|
||||||
portability fixes (IRIX, OSX, Solaris)
|
|
||||||
more portable way to determine endianness and types of a given size
|
|
||||||
through autoconf based methods
|
|
||||||
0.5
|
|
||||||
rpm packaging through autoconf
|
|
||||||
autoconf'ed the whole package (including optional support for zlib,
|
|
||||||
pthreads and libjpeg as well as zrle/c++)
|
|
||||||
moved appropriate files to contrib/ and examples/ respectively
|
|
||||||
fixed long standing cargs bug (Justin "Zippy" Dearing)
|
|
||||||
Even better x11vnc from Karl J. Runge! (supports different kbd layouts of
|
|
||||||
client/server)
|
|
||||||
Better x11vnc from Karl J. Runge!
|
|
||||||
fixed severe bug (Const Kaplinsky)
|
|
||||||
got patch from Const Kaplisnky with CursorPosUpdate encoding and some Docs
|
|
||||||
sync'ed with newest RealVNC (ZRLE encoding)
|
|
||||||
a HTTP request for tunnelling was added (to fool strict web proxies)
|
|
||||||
sync'ed with TightVNC 1.2.5
|
|
||||||
0.4
|
|
||||||
support for NewFB from Const Kaplinsky
|
|
||||||
memory leaks squashed (localtime pseudo leak is still there :-)
|
|
||||||
small improvements for OSXvnc (still not working correctly)
|
|
||||||
synced with TightVNC 1.2.3
|
|
||||||
solaris compile cleanups
|
|
||||||
many x11vnc improvements
|
|
||||||
added backchannel, an encoding which needs special clients to pass
|
|
||||||
arbitrary data to the client
|
|
||||||
changes from Tim Jansen regarding multi threading and client blocking
|
|
||||||
as well as C++ compliancy
|
|
||||||
x11vnc can be controlled by starting again with special options if compiling
|
|
||||||
with LOCAL_CONTROL defined
|
|
||||||
0.3
|
|
||||||
added x11vnc, a x0rfbserver clone
|
|
||||||
regard deferUpdateTime in processEvents, if usec<0
|
|
||||||
initialize deferUpdateTime (memory "leak"!)
|
|
||||||
changed command line handling (arguments are parsed and then removed)
|
|
||||||
added very simple example: zippy
|
|
||||||
added rfbDrawLine, rfbDrawPixel
|
|
||||||
0.2
|
|
||||||
inserted a deferUpdate mechanism (X11 independent).
|
|
||||||
removed deletion of requestedRegion
|
|
||||||
added rfbLoadConsoleFont
|
|
||||||
fixed font colour handling.
|
|
||||||
added rfbSelectBox
|
|
||||||
added rfbDrawCharWithClip to allow for clipping and a background colour.
|
|
||||||
fixed font colours
|
|
||||||
added rfbFillRect
|
|
||||||
added IO function to check password.
|
|
||||||
rfbNewClient now sets the socket in the fd_set (for the select() call)
|
|
||||||
when compiling the library with HAVE_PTHREADS and an application
|
|
||||||
which includes "rfb.h" without, the structures got mixed up.
|
|
||||||
So, the pthreads section is now always at the end, and also
|
|
||||||
you get a linker error for rfbInitServer when using two different
|
|
||||||
pthread setups.
|
|
||||||
fixed two deadlocks: when setting a cursor and when using CopyRect
|
|
||||||
fixed CopyRect when copying modified regions (they lost the modified
|
|
||||||
property)
|
|
||||||
WIN32 target compiles and works for example :-)
|
|
||||||
fixed CopyRect (was using the wrong order of rectangles...)
|
|
||||||
should also work with pthreads, because copyrects are
|
|
||||||
always sent immediately (so that two consecutive copy rects
|
|
||||||
cannot conflict).
|
|
||||||
changed rfbUndrawCursor(rfbClientPtr) to (rfbScreenInfoPtr), because
|
|
||||||
this makes more sense!
|
|
||||||
flag backgroundLoop in rfbScreenInfo (if having pthreads)
|
|
||||||
CopyRect & CopyRegion were implemented.
|
|
||||||
if you use a rfbDoCopyR* function, it copies the data in the
|
|
||||||
framebuffer. If you prefer to do that yourself, use rfbScheduleCopyR*
|
|
||||||
instead; this doesn't modify the frameBuffer.
|
|
||||||
added flag to optionally not send XCursor updates, but only RichCursor,
|
|
||||||
or if that is not possible, fall back to server side cursor.
|
|
||||||
This is useful if your cursor has many nice colours.
|
|
||||||
fixed java viewer on server side:
|
|
||||||
SendCursorUpdate would send data even before the client pixel format
|
|
||||||
was set, but the java applet doesn't like the server's format.
|
|
||||||
fixed two pthread issues:
|
|
||||||
rfbSendFramebuffer was sent by a ProcessClientMessage function
|
|
||||||
(unprotected by updateMutex).
|
|
||||||
cursor coordinates were set without protection by cursorMutex
|
|
||||||
source is now equivalent to TridiaVNC 1.2.1
|
|
||||||
pthreads now work (use iterators!)
|
|
||||||
cursors are supported (rfbSetCursor automatically undraws cursor)
|
|
||||||
support for 3 bytes/pixel (slow!)
|
|
||||||
server side colourmap support
|
|
||||||
fixed rfbCloseClient not to close the connection (pthreads!)
|
|
||||||
this is done lazily (and with proper signalling).
|
|
||||||
cleaned up mac.c (from original OSXvnc); now compiles (untested!)
|
|
||||||
compiles cleanly on Linux, IRIX, BSD, Apple (Darwin)
|
|
||||||
fixed prototypes
|
|
||||||
0.1
|
|
||||||
rewrote API to use pseudo-methods instead of required functions.
|
|
||||||
lots of clean up.
|
|
||||||
Example can show symbols now.
|
|
||||||
All encodings
|
|
||||||
HTTP
|
|
@ -1,439 +0,0 @@
|
|||||||
LibVNCServer: a library for easy implementation of a RDP/VNC server.
|
|
||||||
Copyright (C) 2001-2003 Johannes E. Schindelin
|
|
||||||
|
|
||||||
If you already used LibVNCServer, you probably want to read NEWS.
|
|
||||||
|
|
||||||
What is it?
|
|
||||||
-----------
|
|
||||||
|
|
||||||
VNC is a set of programs using the RFB (Remote Frame Buffer) protocol. They
|
|
||||||
are designed to "export" a frame buffer via net (if you don't know VNC, I
|
|
||||||
suggest you read "Basics" below). It is already in wide use for
|
|
||||||
administration, but it is not that easy to program a server yourself.
|
|
||||||
|
|
||||||
This has been changed by LibVNCServer.
|
|
||||||
|
|
||||||
There are two examples included:
|
|
||||||
- example, a shared scribble sheet
|
|
||||||
- pnmshow, a program to show PNMs (pictures) over the net.
|
|
||||||
|
|
||||||
The examples are not too well documented, but easy straight forward and a
|
|
||||||
good starting point.
|
|
||||||
|
|
||||||
Try example: it outputs on which port it listens (default: 5900), so it is
|
|
||||||
display 0. To view, call
|
|
||||||
vncviewer :0
|
|
||||||
You should see a sheet with a gradient and "Hello World!" written on it. Try
|
|
||||||
to paint something. Note that everytime you click, there is some bigger blot,
|
|
||||||
whereas when you drag the mouse while clicked you draw a line. The size of the
|
|
||||||
blot depends on the mouse button you click. Open a second vncviewer with
|
|
||||||
the same parameters and watch it as you paint in the other window. This also
|
|
||||||
works over internet. You just have to know either the name or the IP of your
|
|
||||||
machine. Then it is
|
|
||||||
vncviewer machine.where.example.runs.com:0
|
|
||||||
or similar for the remote client. Now you are ready to type something. Be sure
|
|
||||||
that your mouse sits still, because everytime the mouse moves, the cursor is
|
|
||||||
reset to the position of the pointer! If you are done with that demo, press
|
|
||||||
the down or up arrows. If your viewer supports it, then the dimensions of the
|
|
||||||
sheet change. Just press Escape in the viewer. Note that the server still
|
|
||||||
runs, even if you closed both windows. When you reconnect now, everything you
|
|
||||||
painted and wrote is still there. You can press "Page Up" for a blank page.
|
|
||||||
|
|
||||||
The demo pnmshow is much simpler: you either provide a filename as argument
|
|
||||||
or pipe a file through stdin. Note that the file has to be a raw pnm/ppm file,
|
|
||||||
i.e. a truecolour graphics. Only the Escape key is implemented. This may be
|
|
||||||
the best starting point if you want to learn how to use LibVNCServer. You
|
|
||||||
are confronted with the fact that the bytes per pixel can only be 8, 16 or 32.
|
|
||||||
|
|
||||||
Projects using it
|
|
||||||
----------------------------------------
|
|
||||||
|
|
||||||
VNC for KDE
|
|
||||||
http://www.tjansen.de/krfb
|
|
||||||
|
|
||||||
GemsVNC
|
|
||||||
http://www.elilabs.com/~rj/gemsvnc/
|
|
||||||
|
|
||||||
VNC for Netware
|
|
||||||
http://forge.novell.com/modules/xfmod/project/?vncnw
|
|
||||||
|
|
||||||
RDesktop
|
|
||||||
http://rdesktop.sourceforge.net
|
|
||||||
|
|
||||||
Mail me, if your application is missing!
|
|
||||||
|
|
||||||
How to use
|
|
||||||
----------
|
|
||||||
|
|
||||||
To make a server, you just have to initialise a server structure using the
|
|
||||||
function rfbDefaultScreenInit, like
|
|
||||||
rfbScreenInfoPtr rfbScreen =
|
|
||||||
rfbGetScreen(argc,argv,width,height,8,3,bpp);
|
|
||||||
where byte per pixel should be 1, 2 or 4. If performance doesn't matter,
|
|
||||||
you may try bpp=3 (internally one cannot use native data types in this
|
|
||||||
case; if you want to use this, look at pnmshow24).
|
|
||||||
|
|
||||||
|
|
||||||
You then can set hooks and io functions (see below) or other
|
|
||||||
options (see below).
|
|
||||||
|
|
||||||
And you allocate the frame buffer like this:
|
|
||||||
rfbScreen->frameBuffer = (char*)malloc(width*height*bpp);
|
|
||||||
|
|
||||||
After that, you initialize the server, like
|
|
||||||
rfbInitServer(rfbScreen);
|
|
||||||
|
|
||||||
You can use a blocking event loop, a background (pthread based) event loop,
|
|
||||||
or implement your own using the rfbProcessEvents function.
|
|
||||||
|
|
||||||
Making it interactive
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
Input is handled by IO functions (see below).
|
|
||||||
|
|
||||||
Whenever you change something in the frame buffer, call rfbMarkRectAsModified.
|
|
||||||
You should make sure that the cursor is not drawn before drawing yourself
|
|
||||||
by calling rfbUndrawCursor. You can also draw the cursor using rfbDrawCursor,
|
|
||||||
but it hardly seems necessary. For cursor details, see below.
|
|
||||||
|
|
||||||
Utility functions
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
Whenever you draw something, you have to call
|
|
||||||
rfbMarkRectAsModified(screen,x1,y1,x2,y2).
|
|
||||||
This tells LibVNCServer to send updates to all connected clients.
|
|
||||||
|
|
||||||
Before you draw something, be sure to call
|
|
||||||
rfbUndrawCursor(screen).
|
|
||||||
This tells LibVNCServer to hide the cursor.
|
|
||||||
Remark: There are vncviewers out there, which know a cursor encoding, so
|
|
||||||
that network traffic is low, and also the cursor doesn't need to be
|
|
||||||
drawn the cursor everytime an update is sent. LibVNCServer handles
|
|
||||||
all the details. Just set the cursor and don't bother any more.
|
|
||||||
|
|
||||||
To set the mouse coordinates (or emulate mouse clicks), call
|
|
||||||
defaultPtrAddEvent(buttonMask,x,y,cl);
|
|
||||||
IMPORTANT: do this at the end of your function, because this actually draws
|
|
||||||
the cursor if no cursor encoding is active.
|
|
||||||
|
|
||||||
What is the difference between rfbScreenInfoPtr and rfbClientPtr?
|
|
||||||
-----------------------------------------------------------------
|
|
||||||
|
|
||||||
The rfbScreenInfoPtr is a pointer to a rfbScreenInfo structure, which
|
|
||||||
holds information about the server, like pixel format, io functions,
|
|
||||||
frame buffer etc.
|
|
||||||
|
|
||||||
The rfbClientPtr is a pointer to an rfbClientRec structure, which holds
|
|
||||||
information about a client, like pixel format, socket of the
|
|
||||||
connection, etc.
|
|
||||||
|
|
||||||
A server can have several clients, but needn't have any. So, if you
|
|
||||||
have a server and three clients are connected, you have one instance
|
|
||||||
of a rfbScreenInfo and three instances of rfbClientRec's.
|
|
||||||
|
|
||||||
The rfbClientRec structure holds a member
|
|
||||||
rfbScreenInfoPtr screen
|
|
||||||
which points to the server and a member
|
|
||||||
rfbClientPtr next
|
|
||||||
to the next client.
|
|
||||||
|
|
||||||
The rfbScreenInfo structure holds a member
|
|
||||||
rfbClientPtr rfbClientHead
|
|
||||||
which points to the first client.
|
|
||||||
|
|
||||||
So, to access the server from the client structure, you use client->screen.
|
|
||||||
To access all clients from a server, get screen->rfbClientHead and
|
|
||||||
iterate using client->next.
|
|
||||||
|
|
||||||
If you change client settings, be sure to use the provided iterator
|
|
||||||
rfbGetClientIterator(rfbScreen)
|
|
||||||
with
|
|
||||||
rfbClientIteratorNext(iterator)
|
|
||||||
and
|
|
||||||
rfbReleaseClientIterator
|
|
||||||
to prevent thread clashes.
|
|
||||||
|
|
||||||
Other options
|
|
||||||
-------------
|
|
||||||
|
|
||||||
These options have to be set between rfbGetScreen and rfbInitServer.
|
|
||||||
|
|
||||||
If you already have a socket to talk to, just set rfbScreen->inetdSock
|
|
||||||
(originally this is for inetd handling, but why not use it for your purpose?).
|
|
||||||
|
|
||||||
To also start an HTTP server (running on port 5800+display_number), you have
|
|
||||||
to set rfbScreen->httpdDir to a directory containing vncviewer.jar and
|
|
||||||
index.vnc (like the included "classes" directory).
|
|
||||||
|
|
||||||
Hooks and IO functions
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
There exist the following IO functions as members of rfbScreen:
|
|
||||||
kbdAddEvent, kbdReleaseAllKeys, ptrAddEvent and setXCutText
|
|
||||||
|
|
||||||
kbdAddEvent(rfbBool down,rfbKeySym key,rfbClientPtr cl)
|
|
||||||
is called when a key is pressed.
|
|
||||||
kbdReleaseAllKeys(rfbClientPtr cl)
|
|
||||||
is not called at all (maybe in the future).
|
|
||||||
ptrAddEvent(int buttonMask,int x,int y,rfbClientPtr cl)
|
|
||||||
is called when the mouse moves or a button is pressed.
|
|
||||||
WARNING: if you want to have proper cursor handling, call
|
|
||||||
defaultPtrAddEvent(buttonMask,x,y,cl)
|
|
||||||
in your own function. This sets the coordinates of the cursor.
|
|
||||||
setXCutText(char* str,int len,rfbClientPtr cl)
|
|
||||||
is called when the selection changes.
|
|
||||||
|
|
||||||
There are only two hooks:
|
|
||||||
newClientHook(rfbClientPtr cl)
|
|
||||||
is called when a new client has connected.
|
|
||||||
displayHook
|
|
||||||
is called just before a frame buffer update is sent.
|
|
||||||
|
|
||||||
You can also override the following methods:
|
|
||||||
getCursorPtr(rfbClientPtr cl)
|
|
||||||
This could be used to make an animated cursor (if you really want ...)
|
|
||||||
setTranslateFunction(rfbClientPtr cl)
|
|
||||||
If you insist on colour maps or something more obscure, you have to
|
|
||||||
implement this. Default is a trueColour mapping.
|
|
||||||
|
|
||||||
Cursor handling
|
|
||||||
---------------
|
|
||||||
|
|
||||||
The screen holds a pointer
|
|
||||||
rfbCursorPtr cursor
|
|
||||||
to the current cursor. Whenever you set it, remember that any dynamically
|
|
||||||
created cursor (like return value from rfbMakeXCursor) is not free'd!
|
|
||||||
|
|
||||||
The rfbCursor structure consists mainly of a mask and a source. The mask
|
|
||||||
describes, which pixels are drawn for the cursor (a cursor needn't be
|
|
||||||
rectangular). The source describes, which colour those pixels should have.
|
|
||||||
|
|
||||||
The standard is an XCursor: a cursor with a foreground and a background
|
|
||||||
colour (stored in backRed,backGreen,backBlue and the same for foreground
|
|
||||||
in a range from 0-0xffff). Therefore, the arrays "mask" and "source"
|
|
||||||
contain pixels as single bits stored in bytes in MSB order. The rows are
|
|
||||||
padded, such that each row begins with a new byte (i.e. a 10x4
|
|
||||||
cursor's mask has 2x4 bytes, because 2 bytes are needed to hold 10 bits).
|
|
||||||
|
|
||||||
It is however very easy to make a cursor like this:
|
|
||||||
|
|
||||||
char* cur=" "
|
|
||||||
" xx "
|
|
||||||
" x "
|
|
||||||
" ";
|
|
||||||
char* mask="xxxx"
|
|
||||||
"xxxx"
|
|
||||||
"xxxx"
|
|
||||||
"xxx ";
|
|
||||||
rfbCursorPtr c=rfbMakeXCursor(4,4,cur,mask);
|
|
||||||
|
|
||||||
You can even set "mask" to NULL in this call and LibVNCServer will calculate
|
|
||||||
a mask for you (dynamically, so you have to free it yourself).
|
|
||||||
|
|
||||||
There is also an array named "richSource" for colourful cursors. They have
|
|
||||||
the same format as the frameBuffer (i.e. if the server is 32 bit,
|
|
||||||
a 10x4 cursor has 4x10x4 bytes).
|
|
||||||
|
|
||||||
History
|
|
||||||
-------
|
|
||||||
|
|
||||||
LibVNCServer is based on Tridia VNC and OSXvnc, which in turn are based on
|
|
||||||
the original code from ORL/AT&T.
|
|
||||||
|
|
||||||
When I began hacking with computers, my first interest was speed. So, when I
|
|
||||||
got around assembler, I programmed the floppy to do much of the work, because
|
|
||||||
it's clock rate was higher than that of my C64. This was my first experience
|
|
||||||
with client/server techniques.
|
|
||||||
|
|
||||||
When I came around Xwindows (much later), I was at once intrigued by the
|
|
||||||
elegance of such connectedness between the different computers. I used it
|
|
||||||
a lot - not the least priority lay on games. However, when I tried it over
|
|
||||||
modem from home, it was no longer that much fun.
|
|
||||||
|
|
||||||
When I started working with ASP (Application Service Provider) programs, I
|
|
||||||
tumbled across Tarantella and Citrix. Being a security fanatic, the idea of
|
|
||||||
running a server on windows didn't appeal to me, so Citrix went down the
|
|
||||||
basket. However, Tarantella has it's own problems (security as well as the
|
|
||||||
high price). But at the same time somebody told me about this "great little
|
|
||||||
administrator's tool" named VNC. Being used to windows programs' sizes, the
|
|
||||||
surprise was reciprocal inverse to the size of VNC!
|
|
||||||
|
|
||||||
At the same time, the program "rdesktop" (a native Linux client for the
|
|
||||||
Terminal Services of Windows servers) came to my attention. There where even
|
|
||||||
works under way to make a protocol converter "rdp2vnc" out of this. However,
|
|
||||||
my primary goal was a slow connection and rdp2vnc could only speak RRE
|
|
||||||
encoding, which is not that funny with just 5kB/s. Tim Edmonds, the original
|
|
||||||
author of rdp2vnc, suggested that I adapt it to Hextile Encoding, which is
|
|
||||||
better. I first tried that, but had no success at all (crunchy pictures).
|
|
||||||
|
|
||||||
Also, I liked the idea of an HTTP server included and possibly other
|
|
||||||
encodings like the Tight Encodings from Const Kaplinsky. So I started looking
|
|
||||||
for libraries implementing a VNC server where I could steal what I can't make.
|
|
||||||
I found some programs based on the demo server from AT&T, which was also the
|
|
||||||
basis for rdp2vnc (can only speak Raw and RRE encoding). There were some
|
|
||||||
rumors that GGI has a VNC backend, but I didn't find any code, so probably
|
|
||||||
there wasn't a working version anyway.
|
|
||||||
|
|
||||||
All of a sudden, everything changed: I read on freshmeat that "OSXvnc" was
|
|
||||||
released. I looked at the code and it was not much of a problem to work out
|
|
||||||
a simple server - using every functionality there is in Xvnc. It became clear
|
|
||||||
to me that I *had* to build a library out of it, so everybody can use it.
|
|
||||||
Every change, every new feature can propagate to every user of it.
|
|
||||||
|
|
||||||
It also makes everything easier:
|
|
||||||
You don't care about the cursor, once set (or use the standard cursor).
|
|
||||||
You don't care about those sockets. You don't care about encodings.
|
|
||||||
You just change your frame buffer and inform the library about it. Every once
|
|
||||||
in a while you call rfbProcessEvents and that's it.
|
|
||||||
|
|
||||||
Basics
|
|
||||||
------
|
|
||||||
|
|
||||||
VNC (Virtual network computing) works like this: You set up a server and can
|
|
||||||
connect to it via vncviewers. The communication uses a protocol named RFB
|
|
||||||
(Remote Frame Buffer). If the server supports HTTP, you can also connect
|
|
||||||
using a java enabled browser. In this case, the server sends back a
|
|
||||||
vncviewer applet with the correct settings.
|
|
||||||
|
|
||||||
There exist several encodings for VNC, which are used to compress the regions
|
|
||||||
which have changed before they are sent to the client. A client need not be
|
|
||||||
able to understand every encoding, but at least Raw encoding. Which encoding
|
|
||||||
it understands is negotiated by the RFB protocol.
|
|
||||||
|
|
||||||
The following encodings are known to me:
|
|
||||||
Raw, RRE, CoRRE, Hextile, CopyRect from the original AT&T code and
|
|
||||||
Tight, ZLib, LastRect, XCursor, RichCursor from Const Kaplinsky et al.
|
|
||||||
|
|
||||||
If you are using a modem, you want to try the "new" encodings. Especially
|
|
||||||
with my 56k modem I like ZLib or Tight with Quality 0. In my tests, it even
|
|
||||||
beats Tarantella.
|
|
||||||
|
|
||||||
There is the possibility to set a password, which is also negotiated by the
|
|
||||||
RFB protocol, but IT IS NOT SECURE. Anybody sniffing your net can get the
|
|
||||||
password. You really should tunnel through SSH.
|
|
||||||
|
|
||||||
Windows or: why do you do that to me?
|
|
||||||
--------------------------------------------
|
|
||||||
|
|
||||||
If you love products from Redmod, you better skip this paragraph.
|
|
||||||
I am always amazed how people react whenever Microsoft(tm) puts in some
|
|
||||||
features into their products which were around for a long time. Especially
|
|
||||||
reporters seem to not know dick about what they are reporting about! But
|
|
||||||
what is everytime annoying again, is that they don't do it right. Every
|
|
||||||
concept has it's new name (remember what enumerators used to be until
|
|
||||||
Mickeysoft(tm) claimed that enumerators are what we thought were iterators.
|
|
||||||
Yeah right, enumerators are also containers. They are not separated. Muddy.)
|
|
||||||
|
|
||||||
There are three packages you want to get hold of: zlib, jpeg and pthreads.
|
|
||||||
The latter is not strictly necessary, but when you put something like this
|
|
||||||
into your source:
|
|
||||||
|
|
||||||
#define MUTEX(s)
|
|
||||||
struct {
|
|
||||||
int something;
|
|
||||||
MUTEX(latex);
|
|
||||||
}
|
|
||||||
|
|
||||||
Microsoft's C++ compiler doesn't do it. It complains that this is an error.
|
|
||||||
This, however, is how I implemented mutexes in case you don't need pthreads,
|
|
||||||
and so don't need the mutex.
|
|
||||||
|
|
||||||
You can find the packages at
|
|
||||||
http://www.gimp.org/win32/extralibs-dev-20001007.zip
|
|
||||||
|
|
||||||
Thanks go to all the GIMP team!
|
|
||||||
|
|
||||||
What are those other targets in the Makefile?
|
|
||||||
---------------------------------------------
|
|
||||||
|
|
||||||
OSXvnc-server is the original OSXvnc adapted to use the library, which was in
|
|
||||||
turn adapted from OSXvnc. As you easily can see, the OSX dependend part is
|
|
||||||
minimal.
|
|
||||||
|
|
||||||
storepasswd is the original program to save a vnc style password in a file.
|
|
||||||
Unfortunately, authentication as every vncviewer speaks it means the server
|
|
||||||
has to know the plain password. You really should tunnel via ssh or use
|
|
||||||
your own PasswordCheck to build a PIN/TAN system.
|
|
||||||
|
|
||||||
sratest is a test unit. Run it to assert correct behaviour of sraRegion. I
|
|
||||||
wrote this to test my iterator implementation.
|
|
||||||
|
|
||||||
blooptest is a test of pthreads. It is just the example, but with a background
|
|
||||||
loop to hunt down thread lockups.
|
|
||||||
|
|
||||||
pnmshow24 is like pnmshow, but it uses 3 bytes/pixel internally, which is not
|
|
||||||
as efficient as 4 bytes/pixel for translation, because there is no native data
|
|
||||||
type of that size, so you have to memcpy pixels and be real cautious with
|
|
||||||
endianness. Anyway, it works.
|
|
||||||
|
|
||||||
fontsel is a test for rfbSelectBox and rfbLoadConsoleFont. If you have Linux
|
|
||||||
console fonts, you can browse them via VNC. Directory browsing not implemented
|
|
||||||
yet :-(
|
|
||||||
|
|
||||||
Why I don't feel bad about GPL
|
|
||||||
------------------------------
|
|
||||||
|
|
||||||
At the beginning of this projects I would have liked to make it a BSD
|
|
||||||
license. However, it is based on plenty of GPL'ed code, so it has to be
|
|
||||||
a GPL. I hear BeeGee complaining: "but that's invasive, every derivative
|
|
||||||
work, even just linking, makes my software GPL!"
|
|
||||||
|
|
||||||
Yeah. That's right. It is because there are nasty jarheads out there who
|
|
||||||
would take anybody's work and claim it their own, selling it for much too
|
|
||||||
much money, stealing freedom and innovation from others, saying they were
|
|
||||||
the maintainers of innovation, lying, making money with that.
|
|
||||||
|
|
||||||
The people at AT&T worked really well to produce something as clean and lean
|
|
||||||
as VNC. The managers decided that for their fame, they would release the
|
|
||||||
program for free. But not only that! They realized that by releasing also
|
|
||||||
the code for free, VNC would become an evolving little child, conquering
|
|
||||||
new worlds, making it's parents very proud. As well they can be! To protect
|
|
||||||
this innovation, they decided to make it GPL, not BSD. The principal
|
|
||||||
difference is: You can make closed source programs deriving from BSD, not
|
|
||||||
from GPL. You have to give proper credit with both.
|
|
||||||
|
|
||||||
Now, why not BSD? Well, imagine your child being some famous actor. Along
|
|
||||||
comes a manager who exploits your child exclusively, that is: nobody else
|
|
||||||
can profit from the child, it itself included. Got it?
|
|
||||||
|
|
||||||
What reason do you have now to use this library commercially?
|
|
||||||
|
|
||||||
Several: You don't have to give away your product. Then you have effectively
|
|
||||||
circumvented the GPL, because you have the benefits of other's work and you
|
|
||||||
don't give back anything and you will be in hell for that. In fact, this
|
|
||||||
library, as my other projects, is a payback for all the free software I can
|
|
||||||
use (and sometimes, make better). For example, just now, I am using XEmacs
|
|
||||||
on top of XFree86, all running under Linux.
|
|
||||||
|
|
||||||
Better: Use a concept like MySQL. This is free software, however, they make
|
|
||||||
money with it. If you want something implemented, you have the choice:
|
|
||||||
Ask them to do it (and pay a fair price), or do it yourself, normally giving
|
|
||||||
back your enhancements to the free world of computing.
|
|
||||||
|
|
||||||
Learn from it: If you like the style this is written, learn how to imitate
|
|
||||||
it. If you don't like the style, learn how to avoid those things you don't
|
|
||||||
like. I learnt so much, just from looking at code like Linux, XEmacs,
|
|
||||||
LilyPond, STL, etc.
|
|
||||||
|
|
||||||
License
|
|
||||||
-------
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU General Public License
|
|
||||||
as published by the Free Software Foundation; either version 2
|
|
||||||
of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.dfdf
|
|
||||||
|
|
||||||
Contact
|
|
||||||
-------
|
|
||||||
|
|
||||||
To contact me, mail me: Johannes dot Schindelin at gmx dot de
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
|||||||
If you check out CVS of LibVNCServer, everything should build as usual:
|
|
||||||
|
|
||||||
./configure && make
|
|
||||||
|
|
||||||
If your machine complains not having the right version of automake (which should
|
|
||||||
not be necessary, because every needed file is checked in), try
|
|
||||||
|
|
||||||
find -name Makefile.in -exec touch {} \;
|
|
||||||
|
|
||||||
and rerun ./configure && make
|
|
||||||
|
|
||||||
If you want to make changes which require automake or autoconf (i.e. you
|
|
||||||
check for other headers or add files), you have to have a current
|
|
||||||
(>2.50) version of autoconf. Also, you need automake.
|
|
||||||
|
|
||||||
Then, just do
|
|
||||||
sh autogen.sh && make
|
|
||||||
in LibVNCServer's directory, and you should see plenty of output and
|
|
||||||
finally have a complete build of LibVNCServer.
|
|
||||||
|
|
||||||
Happy VNC'ing!
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
|||||||
## LibVNCServer with the Tight PNG encoding
|
|
||||||
|
|
||||||
### LibVNCServer
|
|
||||||
|
|
||||||
Copyright (C) 2001-2003 Johannes E. Schindelin
|
|
||||||
|
|
||||||
[LibVNCServer](http://sourceforge.net/projects/libvncserver/) is
|
|
||||||
a library for easy implementation of a RDP/VNC server.
|
|
||||||
|
|
||||||
|
|
||||||
### Tight PNG
|
|
||||||
|
|
||||||
Copyright (C) 2010 Joel Martin
|
|
||||||
|
|
||||||
The [Tight PNG encoding](http://wiki.qemu.org/VNC_Tight_PNG) is
|
|
||||||
similar to the Tight encoding, but the basic compression (zlib) is
|
|
||||||
replaced with PNG data.
|
|
||||||
|
|
||||||
This encoding allows for simple, fast clients and bandwidth efficient
|
|
||||||
clients:
|
|
||||||
|
|
||||||
* The PNG data can be rendered directly by the client so there is
|
|
||||||
negligible decode work needed in the VNC client itself.
|
|
||||||
* PNG images are zlib compressed internally (along with other
|
|
||||||
optimizations) so tightPng is comparable in bandwith to tight.
|
|
||||||
* PNG images are natively supported in the browsers. This is optimal
|
|
||||||
for web based VNC clients such as
|
|
||||||
[noVNC](http://github.com/kanaka/noVNC)
|
|
||||||
|
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
See INSTALL for build instructions. To build with the tightPng
|
|
||||||
encoding, you must also have libpng development libraries install. For
|
|
||||||
example:
|
|
||||||
|
|
||||||
sudo apt-get install libpng-dev
|
|
||||||
|
|
||||||
|
|
||||||
### TODO
|
|
||||||
|
|
||||||
- Handle palette mode (non-truecolor).
|
|
@ -1,26 +0,0 @@
|
|||||||
immediate:
|
|
||||||
----------
|
|
||||||
|
|
||||||
make SDLvncviewer more versatile
|
|
||||||
- test for missing keys (especially "[]{}" with ./examples/mac),
|
|
||||||
- map Apple/Linux/Windows keys onto each other,
|
|
||||||
- handle selection
|
|
||||||
- handle scroll wheel
|
|
||||||
style fixes: use Linux' coding guidelines & ANSIfy tightvnc-filetransfer:
|
|
||||||
discuss on list
|
|
||||||
LibVNCClient cleanup: prefix with "rfbClient", and make sure it does
|
|
||||||
not deliberately die() or exit() anywhere!
|
|
||||||
java vncviewer doesn't do colour cursors?
|
|
||||||
MinGW32 doesn't do fcntl on sockets; use setsockopt instead...
|
|
||||||
make corre work again (libvncclient or libvncserver?)
|
|
||||||
teach SDLvncviewer about CopyRect...
|
|
||||||
implement "-record" in libvncclient
|
|
||||||
|
|
||||||
later:
|
|
||||||
------
|
|
||||||
|
|
||||||
selectbox: scroll bars
|
|
||||||
authentification schemes (secure vnc)
|
|
||||||
IO function ptr exists; now explain how to tunnel and implement a
|
|
||||||
client address restriction scheme.
|
|
||||||
VisualNaCro testing
|
|
@ -1,22 +0,0 @@
|
|||||||
aclocal.m4
|
|
||||||
autom4te.cache
|
|
||||||
config.guess
|
|
||||||
config.log
|
|
||||||
config.status
|
|
||||||
config.sub
|
|
||||||
configure
|
|
||||||
COPYING
|
|
||||||
.cvsignore
|
|
||||||
INSTALL
|
|
||||||
install-sh
|
|
||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
missing
|
|
||||||
mkinstalldirs
|
|
||||||
nacro.pm
|
|
||||||
nacro.so
|
|
||||||
nacro_wrap.c
|
|
||||||
visualnacro-*
|
|
||||||
.deps
|
|
||||||
.in
|
|
||||||
depcomp
|
|
@ -1,5 +0,0 @@
|
|||||||
/COPYING
|
|
||||||
/INSTALL
|
|
||||||
/nacro.pm
|
|
||||||
/nacro.so
|
|
||||||
/nacro_wrap.c
|
|
@ -1,2 +0,0 @@
|
|||||||
Johannes Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
|||||||
2006-10-10: Johannes Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* implement --compact and --compact-dragging to shut up the
|
|
||||||
script about mouse movements or drags.
|
|
||||||
* add 'i', 'c' and 'r' menu keys.
|
|
||||||
|
|
||||||
2006-09-12: Johannes Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* the reference rectangle is selected with a rubber band,
|
|
||||||
and can be shown with 'd'.
|
|
||||||
|
|
||||||
2006-06-15: Johannes Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* added timing: you can record the events with their timestamps now
|
|
||||||
|
|
||||||
2005-01-13: Johannes Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
* started the project
|
|
||||||
|
|
@ -1,51 +0,0 @@
|
|||||||
INTERFACE=nacro.h
|
|
||||||
SRCS=nacro.c
|
|
||||||
OBJS=nacro.o
|
|
||||||
ISRCS=nacro_wrap.c
|
|
||||||
IOBJS=nacro_wrap.o
|
|
||||||
TARGET=nacro
|
|
||||||
LIBS= @LIBVNCSERVERLIBS@
|
|
||||||
|
|
||||||
nacro_CFLAGS= @LIBVNCSERVERCFLAGS@
|
|
||||||
|
|
||||||
SWIGOPT=
|
|
||||||
|
|
||||||
EXTRA_DIST=autogen.sh $(INTERFACE) $(SRCS) $(ISRCS) nacro.pm recorder.pl
|
|
||||||
|
|
||||||
all: $(LIBPREFIX)$(TARGET)$(SO)
|
|
||||||
|
|
||||||
# the following is borrowed from SWIG
|
|
||||||
|
|
||||||
SWIG= @SWIG@
|
|
||||||
|
|
||||||
##################################################################
|
|
||||||
##### PERL 5 ######
|
|
||||||
##################################################################
|
|
||||||
|
|
||||||
# You need to set this variable to the Perl5 directory containing the
|
|
||||||
# files "perl.h", "EXTERN.h" and "XSUB.h". With Perl5.003, it's
|
|
||||||
# usually something like /usr/local/lib/perl5/arch-osname/5.003/CORE.
|
|
||||||
|
|
||||||
PERL5_INCLUDE= @PERL5EXT@
|
|
||||||
|
|
||||||
# Extra Perl specific dynamic linking options
|
|
||||||
PERL5_DLNK = @PERL5DYNAMICLINKING@
|
|
||||||
PERL5_CCFLAGS = @PERL5CCFLAGS@
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------
|
|
||||||
# Build a Perl5 dynamically loadable module (C)
|
|
||||||
# ----------------------------------------------------------------
|
|
||||||
|
|
||||||
$(ISRCS): $(INTERFACE)
|
|
||||||
@test -n "$(SWIG)" || (echo "Need SWIG" && exit 1)
|
|
||||||
$(SWIG) -perl5 $(SWIGOPT) $(INTERFACE)
|
|
||||||
|
|
||||||
$(OBJS): $(SRCS) $(INTERFACE)
|
|
||||||
$(CC) -c -Dbool=char $(CCSHARED) $(CFLAGS) -o $@ $< $(LIBVNCSERVERCFLAGS) $(INCLUDES) -I$(PERL5_INCLUDE)
|
|
||||||
|
|
||||||
$(IOBJS): $(ISRCS) $(INTERFACE)
|
|
||||||
$(CC) -c -Dbool=char $(CCSHARED) $(CFLAGS) -o $@ $< $(INCLUDES) $(PERL5_CCFLAGS) -I$(PERL5_INCLUDE)
|
|
||||||
|
|
||||||
$(LIBPREFIX)$(TARGET)$(SO): $(OBJS) $(IOBJS)
|
|
||||||
$(LDSHARED) $(OBJS) $(IOBJS) $(PERL5_DLNK) $(LIBS) -o $(LIBPREFIX)$(TARGET)$(SO)
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
|||||||
With --timing, you can actually record action scripts which are meaningful...
|
|
||||||
Earlier, the events just got garbled, because the GUI could not react as
|
|
||||||
fast as the events were churned out.
|
|
||||||
|
|
||||||
Clipboard is supported (thanks to Uwe).
|
|
||||||
|
|
||||||
Keys are recorded by their symbols with the --symbolic switch, provided you
|
|
||||||
have the X11::Keysyms module.
|
|
||||||
|
|
||||||
After pressing Control twice, you can show the last reference image with 'd'.
|
|
@ -1,88 +0,0 @@
|
|||||||
This is VisualNaCro.
|
|
||||||
|
|
||||||
DISCLAIMER: recorder.pl is not yet functional.
|
|
||||||
|
|
||||||
What does it?
|
|
||||||
|
|
||||||
It is a Perl module meant to remote control a VNC server.
|
|
||||||
|
|
||||||
It includes a recorder (written in Perl) to make it easy to
|
|
||||||
record a macro, which is just a Perl script, and which you can
|
|
||||||
modify to your heart's content.
|
|
||||||
|
|
||||||
The most important feature, however, is that you can mark a
|
|
||||||
rectangle which the Perl script will try to find again when you
|
|
||||||
run it. Thus when you play a game and want to hit a certain button,
|
|
||||||
you just hit the Ctrl key twice, mark the button, and from then on,
|
|
||||||
all mouse movements will be repeated relative to that button, even
|
|
||||||
if the button is somewhere else when you run the script the next
|
|
||||||
time.
|
|
||||||
|
|
||||||
If you know Tcl Expect, you will recognize this approach. Only this
|
|
||||||
time, it is not text, but an image which is expected.
|
|
||||||
|
|
||||||
How does it work?
|
|
||||||
|
|
||||||
It acts as a VNC proxy: your Perl script starts its own VNC server.
|
|
||||||
The script now can intercept inputs and outputs, and act upon them.
|
|
||||||
In order to write a macro, start
|
|
||||||
|
|
||||||
recorder.pl --script my-macro.pl --timing host:port
|
|
||||||
|
|
||||||
connect with a vncviewer of your choice to <host2>:23, where <host2>
|
|
||||||
is the computer on which recorder.pl was started (not necessarily the
|
|
||||||
same as the VNC server!). Now your actions are recorded into
|
|
||||||
my_macro.pl, and the images you want to grep for will be saved as
|
|
||||||
my_macro-1.pnm, my_macro-2.pnm, ...
|
|
||||||
|
|
||||||
In order to finish the script, hit Ctrl twice and say "q".
|
|
||||||
|
|
||||||
Why did I do it?
|
|
||||||
|
|
||||||
Because I could ;-)
|
|
||||||
|
|
||||||
No really, I needed a way to write automated tests. While there
|
|
||||||
exist a lot of OpenSource programs for web testing, I found none
|
|
||||||
of them easy to use, and for GUI testing I found xautomation.
|
|
||||||
|
|
||||||
Xautomation has this "visual grep" (or "graphical expect") feature:
|
|
||||||
given an image it tries to find it on the desktop and returns the
|
|
||||||
coordinates. Unfortunately, there is no easy way to record macros
|
|
||||||
with it, and it only works on X11.
|
|
||||||
|
|
||||||
As I know VNC pretty well, and there are VNC servers for every OS
|
|
||||||
and gadget, I thought it might be cool to have this feature to
|
|
||||||
control a VNC server.
|
|
||||||
|
|
||||||
Actually, it makes it even easier: with plain X11, for example, you
|
|
||||||
can not know where on the screen the action is if you don't check
|
|
||||||
the whole screen. This complex problem is beautifully addressed
|
|
||||||
in Karl Runge's x11vnc.
|
|
||||||
|
|
||||||
My main purpose is to run regression tests on different browsers,
|
|
||||||
which I can easily do by starting Xvnc and using VisualNaCro.
|
|
||||||
|
|
||||||
How did I do it?
|
|
||||||
|
|
||||||
I wondered long about how to do it. I couldn't take the same approach
|
|
||||||
as xautomation: I cannot connect to the VNC server thousand times
|
|
||||||
per second. So I decided to create an interface of LibVNCServer/
|
|
||||||
LibVNCClient for use in a script language.
|
|
||||||
|
|
||||||
Fortunately, this task is made very, very easy by SWIG. As Perl
|
|
||||||
is one of my favorite script languages, I decided to use this.
|
|
||||||
But SWIG makes it easy to use the very same interface for other
|
|
||||||
popular languages, so you are welcome to port VisualNaCro to
|
|
||||||
the language of your choice!
|
|
||||||
|
|
||||||
Isn't it pronounced "Visual Macro"?
|
|
||||||
|
|
||||||
Yes. But I liked the Visual Na Cro play of acronyms. I'm sorry if
|
|
||||||
you don't find it funny.
|
|
||||||
|
|
||||||
What's the license?
|
|
||||||
|
|
||||||
GPL. It is based on LibVNCServer/LibVNCClient, so it has to be.
|
|
||||||
If you want to port this package to use vncreflector, which has a
|
|
||||||
BSD license, go ahead.
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# Run this to generate all the initial makefiles, etc.
|
|
||||||
|
|
||||||
srcdir=`dirname $0`
|
|
||||||
test -z "$srcdir" && srcdir=.
|
|
||||||
|
|
||||||
DIE=0
|
|
||||||
|
|
||||||
AUTOMAKE=automake-1.4
|
|
||||||
ACLOCAL=aclocal-1.4
|
|
||||||
|
|
||||||
($AUTOMAKE --version) < /dev/null > /dev/null 2>&1 || {
|
|
||||||
AUTOMAKE=automake
|
|
||||||
ACLOCAL=aclocal
|
|
||||||
}
|
|
||||||
|
|
||||||
(autoconf --version) < /dev/null > /dev/null 2>&1 || {
|
|
||||||
echo
|
|
||||||
echo "You must have autoconf installed to compile VisualNaCro."
|
|
||||||
echo "Download the appropriate package for your distribution,"
|
|
||||||
echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
|
|
||||||
DIE=1
|
|
||||||
}
|
|
||||||
|
|
||||||
($AUTOMAKE --version) < /dev/null > /dev/null 2>&1 || {
|
|
||||||
echo
|
|
||||||
echo "You must have automake installed to compile VisualNaCro."
|
|
||||||
echo "Get ftp://sourceware.cygnus.com/pub/automake/automake-1.4.tar.gz"
|
|
||||||
echo "(or a newer version if it is available)"
|
|
||||||
DIE=1
|
|
||||||
}
|
|
||||||
|
|
||||||
if test "$DIE" -eq 1; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
(test -f $srcdir/nacro.h) || {
|
|
||||||
echo "You must run this script in the top-level VisualNaCro directory"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if test -z "$*"; then
|
|
||||||
echo "I am going to run ./configure with no arguments - if you wish "
|
|
||||||
echo "to pass any to it, please specify them on the $0 command line."
|
|
||||||
fi
|
|
||||||
|
|
||||||
$ACLOCAL $ACLOCAL_FLAGS
|
|
||||||
#autoheader
|
|
||||||
$AUTOMAKE --add-missing --copy
|
|
||||||
autoconf
|
|
||||||
|
|
||||||
echo "Running ./configure --enable-maintainer-mode" "$@"
|
|
||||||
$srcdir/configure --enable-maintainer-mode "$@"
|
|
||||||
|
|
||||||
echo "Now type 'make' to compile VisualNaCro."
|
|
@ -1,252 +0,0 @@
|
|||||||
dnl Process this file with autoconf to produce a configure script.
|
|
||||||
dnl The macros which aren't shipped with the autotools are stored in the
|
|
||||||
dnl Tools/config directory in .m4 files.
|
|
||||||
|
|
||||||
AC_INIT([VisualNaCro],[0.1],[http://libvncserver.sourceforge.net])
|
|
||||||
AC_PREREQ(2.54)
|
|
||||||
AC_CANONICAL_HOST
|
|
||||||
AM_INIT_AUTOMAKE
|
|
||||||
|
|
||||||
dnl Checks for programs.
|
|
||||||
AC_CHECK_PROG(SWIG,swig,swig)
|
|
||||||
AC_CHECK_PROG(LIBVNCSERVERCONFIG,libvncserver-config,yes,no)
|
|
||||||
if test "$LIBVNCSERVERCONFIG" != "yes"; then
|
|
||||||
AC_MSG_ERROR([Need to have libvncserver-config in PATH])
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
AC_PROG_CC
|
|
||||||
AC_PROG_RANLIB
|
|
||||||
AC_EXEEXT
|
|
||||||
AC_OBJEXT
|
|
||||||
|
|
||||||
LIBVNCSERVERCFLAGS=`libvncserver-config --cflags`
|
|
||||||
LIBVNCSERVERLIBS=`libvncserver-config --libs`
|
|
||||||
AC_SUBST(LIBVNCSERVERCFLAGS)
|
|
||||||
AC_SUBST(LIBVNCSERVERLIBS)
|
|
||||||
|
|
||||||
dnl Checks for header files.
|
|
||||||
AC_HEADER_STDC
|
|
||||||
|
|
||||||
dnl How to specify include directories that may be system directories.
|
|
||||||
# -I should not be used on system directories (GCC)
|
|
||||||
if test "$GCC" = yes; then
|
|
||||||
ISYSTEM="-isystem "
|
|
||||||
else
|
|
||||||
ISYSTEM="-I"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Set info about shared libraries.
|
|
||||||
AC_SUBST(SO)
|
|
||||||
AC_SUBST(LDSHARED)
|
|
||||||
AC_SUBST(CCSHARED)
|
|
||||||
AC_SUBST(LINKFORSHARED)
|
|
||||||
|
|
||||||
# SO is the extension of shared libraries `(including the dot!)
|
|
||||||
AC_MSG_CHECKING(SO)
|
|
||||||
if test -z "$SO"
|
|
||||||
then
|
|
||||||
case $host in
|
|
||||||
*-*-hp*) SO=.sl;;
|
|
||||||
*-*-darwin*) SO=.bundle;;
|
|
||||||
*-*-cygwin* | *-*-mingw*) SO=.dll;;
|
|
||||||
*) SO=.so;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT($SO)
|
|
||||||
|
|
||||||
# LDSHARED is the ld *command* used to create shared library
|
|
||||||
# -- "ld" on SunOS 4.x.x, "ld -G" on SunOS 5.x, "ld -shared" on IRIX 5
|
|
||||||
# (Shared libraries in this instance are shared modules to be loaded into
|
|
||||||
# Python, as opposed to building Python itself as a shared library.)
|
|
||||||
AC_MSG_CHECKING(LDSHARED)
|
|
||||||
if test -z "$LDSHARED"
|
|
||||||
then
|
|
||||||
case $host in
|
|
||||||
*-*-aix*) LDSHARED="\$(srcdir)/ld_so_aix \$(CC)";;
|
|
||||||
*-*-cygwin* | *-*-mingw*)
|
|
||||||
if test "$GCC" = yes; then
|
|
||||||
LDSHARED="dllwrap --driver-name gcc --dlltool dlltool --export-all-symbols --as as --dllname \$(LIBPREFIX)\$(TARGET)\$(SO)"
|
|
||||||
else
|
|
||||||
if test "cl" = $CC ; then
|
|
||||||
# Microsoft Visual C++ (MSVC)
|
|
||||||
LDSHARED="$CC -nologo -LD"
|
|
||||||
else
|
|
||||||
# Unknown compiler try gcc approach
|
|
||||||
LDSHARED="$CC -shared"
|
|
||||||
fi
|
|
||||||
fi ;;
|
|
||||||
*-*-irix5*) LDSHARED="ld -shared";;
|
|
||||||
*-*-irix6*) LDSHARED="ld ${SGI_ABI} -shared -all";;
|
|
||||||
*-*-sunos4*) LDSHARED="ld";;
|
|
||||||
*-*-solaris*) LDSHARED="ld -G";;
|
|
||||||
*-*-hp*) LDSHARED="ld -b";;
|
|
||||||
*-*-osf*) LDSHARED="ld -shared -expect_unresolved \"*\"";;
|
|
||||||
*-sequent-sysv4) LDSHARED="ld -G";;
|
|
||||||
*-*-next*)
|
|
||||||
if test "$ns_dyld"
|
|
||||||
then LDSHARED='$(CC) $(LDFLAGS) -bundle -prebind'
|
|
||||||
else LDSHARED='$(CC) $(CFLAGS) -nostdlib -r';
|
|
||||||
fi
|
|
||||||
if test "$with_next_framework" ; then
|
|
||||||
LDSHARED="$LDSHARED \$(LDLIBRARY)"
|
|
||||||
fi ;;
|
|
||||||
*-*-linux*) LDSHARED="gcc -shared";;
|
|
||||||
*-*-dgux*) LDSHARED="ld -G";;
|
|
||||||
*-*-freebsd3*) LDSHARED="gcc -shared";;
|
|
||||||
*-*-freebsd* | *-*-openbsd*) LDSHARED="ld -Bshareable";;
|
|
||||||
*-*-netbsd*)
|
|
||||||
if [[ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]]
|
|
||||||
then
|
|
||||||
LDSHARED="cc -shared"
|
|
||||||
else
|
|
||||||
LDSHARED="ld -Bshareable"
|
|
||||||
fi;;
|
|
||||||
*-sco-sysv*) LDSHARED="cc -G -KPIC -Ki486 -belf -Wl,-Bexport";;
|
|
||||||
*-*-darwin*) LDSHARED="cc -bundle -undefined suppress -flat_namespace";;
|
|
||||||
*) LDSHARED="ld";;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT($LDSHARED)
|
|
||||||
# CCSHARED are the C *flags* used to create objects to go into a shared
|
|
||||||
# library (module) -- this is only needed for a few systems
|
|
||||||
AC_MSG_CHECKING(CCSHARED)
|
|
||||||
if test -z "$CCSHARED"
|
|
||||||
then
|
|
||||||
case $host in
|
|
||||||
*-*-hp*) if test "$GCC" = yes;
|
|
||||||
then CCSHARED="-fpic";
|
|
||||||
else CCSHARED="+z";
|
|
||||||
fi;;
|
|
||||||
*-*-linux*) CCSHARED="-fpic";;
|
|
||||||
*-*-freebsd* | *-*-openbsd*) CCSHARED="-fpic";;
|
|
||||||
*-*-netbsd*) CCSHARED="-fPIC";;
|
|
||||||
*-sco-sysv*) CCSHARED="-KPIC -dy -Bdynamic";;
|
|
||||||
*-*-irix6*) case $CC in
|
|
||||||
*gcc*) CCSHARED="-shared";;
|
|
||||||
*) CCSHARED="";;
|
|
||||||
esac;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT($CCSHARED)
|
|
||||||
|
|
||||||
# RPATH is the path used to look for shared library files.
|
|
||||||
AC_MSG_CHECKING(RPATH)
|
|
||||||
if test -z "$RPATH"
|
|
||||||
then
|
|
||||||
case $host in
|
|
||||||
*-*-solaris*) RPATH='-R. -R$(exec_prefix)/lib';;
|
|
||||||
*-*-irix*) RPATH='-rpath .:$(exec_prefix)/lib';;
|
|
||||||
*-*-linux*) RPATH='-Xlinker -rpath $(exec_prefix)/lib -Xlinker -rpath .';;
|
|
||||||
*) RPATH='';;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT($RPATH)
|
|
||||||
AC_SUBST(RPATH)
|
|
||||||
|
|
||||||
# LINKFORSHARED are the flags passed to the $(CC) command that links
|
|
||||||
# the a few executables -- this is only needed for a few systems
|
|
||||||
|
|
||||||
AC_MSG_CHECKING(LINKFORSHARED)
|
|
||||||
if test -z "$LINKFORSHARED"
|
|
||||||
then
|
|
||||||
case $host in
|
|
||||||
*-*-aix*) LINKFORSHARED='-Wl,-bE:$(srcdir)/python.exp -lld';;
|
|
||||||
*-*-hp*)
|
|
||||||
LINKFORSHARED="-Wl,-E -Wl,+s -Wl,+b\$(BINLIBDEST)/lib-dynload";;
|
|
||||||
*-*-linux*) LINKFORSHARED="-Xlinker -export-dynamic";;
|
|
||||||
*-*-next*) LINKFORSHARED="-u libsys_s";;
|
|
||||||
*-sco-sysv*) LINKFORSHARED="-Bdynamic -dy -Wl,-Bexport";;
|
|
||||||
*-*-irix6*) LINKFORSHARED="-all";;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT($LINKFORSHARED)
|
|
||||||
|
|
||||||
# This variation is needed on OS-X because there is no (apparent) consistency in shared libary naming.
|
|
||||||
# Sometimes .bundle works, but sometimes .so is needed. It depends on the target language
|
|
||||||
|
|
||||||
# Optional CFLAGS used to silence compiler warnings on some platforms.
|
|
||||||
|
|
||||||
AC_SUBST(PLATFLAGS)
|
|
||||||
case $host in
|
|
||||||
*-*-darwin*) PLATFLAGS="-Wno-long-double";;
|
|
||||||
*) PLATFLAGS="";;
|
|
||||||
esac
|
|
||||||
|
|
||||||
#----------------------------------------------------------------
|
|
||||||
# Look for Perl5
|
|
||||||
#----------------------------------------------------------------
|
|
||||||
|
|
||||||
PERLBIN=
|
|
||||||
|
|
||||||
AC_ARG_WITH(perl5,[ --with-perl5=path Set location of Perl5 executable],[ PERLBIN="$withval"], [PERLBIN=])
|
|
||||||
|
|
||||||
# First figure out what the name of Perl5 is
|
|
||||||
|
|
||||||
if test -z "$PERLBIN"; then
|
|
||||||
AC_CHECK_PROGS(PERL, perl perl5.8.1 perl5.6.1 perl5.6.0 perl5.004 perl5.003 perl5.002 perl5.001 perl5 perl)
|
|
||||||
else
|
|
||||||
PERL="$PERLBIN"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
AC_MSG_CHECKING(for Perl5 header files)
|
|
||||||
if test -n "$PERL"; then
|
|
||||||
PERL5DIR=`($PERL -e 'use Config; print $Config{archlib}, "\n";') 2>/dev/null`
|
|
||||||
if test "$PERL5DIR" != ""; then
|
|
||||||
dirs="$PERL5DIR $PERL5DIR/CORE"
|
|
||||||
PERL5EXT=none
|
|
||||||
for i in $dirs; do
|
|
||||||
if test -r $i/perl.h; then
|
|
||||||
AC_MSG_RESULT($i)
|
|
||||||
PERL5EXT="$i"
|
|
||||||
break;
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if test "$PERL5EXT" = none; then
|
|
||||||
PERL5EXT="$PERL5DIR/CORE"
|
|
||||||
AC_MSG_RESULT(could not locate perl.h...using $PERL5EXT)
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_MSG_CHECKING(for Perl5 library)
|
|
||||||
PERL5LIB=`($PERL -e 'use Config; $_=$Config{libperl}; s/^lib//; s/$Config{_a}$//; print $_, "\n"') 2>/dev/null`
|
|
||||||
if test "$PERL5LIB" = "" ; then
|
|
||||||
AC_MSG_RESULT(not found)
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT($PERL5LIB)
|
|
||||||
fi
|
|
||||||
AC_MSG_CHECKING(for Perl5 compiler options)
|
|
||||||
PERL5CCFLAGS=`($PERL -e 'use Config; print $Config{ccflags}, "\n"' | sed "s/-I/$ISYSTEM/") 2>/dev/null`
|
|
||||||
if test "$PERL5CCFLAGS" = "" ; then
|
|
||||||
AC_MSG_RESULT(not found)
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT($PERL5CCFLAGS)
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT(unable to determine perl5 configuration)
|
|
||||||
PERL5EXT=$PERL5DIR
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT(could not figure out how to run perl5)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Cygwin (Windows) needs the library for dynamic linking
|
|
||||||
case $host in
|
|
||||||
*-*-cygwin* | *-*-mingw*) PERL5DYNAMICLINKING="-L$PERL5EXT -l$PERL5LIB";;
|
|
||||||
*)PERL5DYNAMICLINKING="";;
|
|
||||||
esac
|
|
||||||
|
|
||||||
AC_SUBST(PERL)
|
|
||||||
AC_SUBST(PERL5EXT)
|
|
||||||
AC_SUBST(PERL5DYNAMICLINKING)
|
|
||||||
AC_SUBST(PERL5LIB)
|
|
||||||
AC_SUBST(PERL5CCFLAGS)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------
|
|
||||||
# Miscellaneous
|
|
||||||
#----------------------------------------------------------------
|
|
||||||
|
|
||||||
AC_CONFIG_FILES([Makefile])
|
|
||||||
AC_OUTPUT
|
|
||||||
|
|
||||||
dnl configure.in ends here
|
|
@ -1,261 +0,0 @@
|
|||||||
static unsigned char default8x16FontData[4096+1]={
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x7e,0x81,0xa5,0x81,0x81,0xbd,0x99,0x81,0x81,0x7e,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x7e,0xff,0xdb,0xff,0xff,0xc3,0xe7,0xff,0xff,0x7e,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x6c,0xfe,0xfe,0xfe,0xfe,0x7c,0x38,0x10,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x10,0x38,0x7c,0xfe,0x7c,0x38,0x10,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x18,0x3c,0x3c,0xe7,0xe7,0xe7,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x18,0x3c,0x7e,0xff,0xff,0x7e,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3c,0x3c,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xc3,0xc3,0xe7,0xff,0xff,0xff,0xff,0xff,0xff,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x3c,0x66,0x42,0x42,0x66,0x3c,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0xff,0xff,0xff,0xff,0xff,0xc3,0x99,0xbd,0xbd,0x99,0xc3,0xff,0xff,0xff,0xff,0xff,
|
|
||||||
0x00,0x00,0x1e,0x0e,0x1a,0x32,0x78,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x3c,0x66,0x66,0x66,0x66,0x3c,0x18,0x7e,0x18,0x18,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x3f,0x33,0x3f,0x30,0x30,0x30,0x30,0x70,0xf0,0xe0,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x7f,0x63,0x7f,0x63,0x63,0x63,0x63,0x67,0xe7,0xe6,0xc0,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x18,0x18,0xdb,0x3c,0xe7,0x3c,0xdb,0x18,0x18,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfe,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x02,0x06,0x0e,0x1e,0x3e,0xfe,0x3e,0x1e,0x0e,0x06,0x02,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x7e,0x3c,0x18,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x66,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x7f,0xdb,0xdb,0xdb,0x7b,0x1b,0x1b,0x1b,0x1b,0x1b,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x7c,0xc6,0x60,0x38,0x6c,0xc6,0xc6,0x6c,0x38,0x0c,0xc6,0x7c,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe,0xfe,0xfe,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x7e,0x3c,0x18,0x7e,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7e,0x3c,0x18,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x18,0x0c,0xfe,0x0c,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x30,0x60,0xfe,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0xc0,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x24,0x66,0xff,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x10,0x38,0x38,0x7c,0x7c,0xfe,0xfe,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0xfe,0xfe,0x7c,0x7c,0x38,0x38,0x10,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x18,0x3c,0x3c,0x3c,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x6c,0x6c,0xfe,0x6c,0x6c,0x6c,0xfe,0x6c,0x6c,0x00,0x00,0x00,0x00,
|
|
||||||
0x18,0x18,0x7c,0xc6,0xc2,0xc0,0x7c,0x06,0x06,0x86,0xc6,0x7c,0x18,0x18,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0xc2,0xc6,0x0c,0x18,0x30,0x60,0xc6,0x86,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x38,0x6c,0x6c,0x38,0x76,0xdc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x0c,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x0c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x30,0x18,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x18,0x30,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x66,0x3c,0xff,0x3c,0x66,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x02,0x06,0x0c,0x18,0x30,0x60,0xc0,0x80,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x7c,0xc6,0xc6,0xce,0xde,0xf6,0xe6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7e,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x7c,0xc6,0x06,0x0c,0x18,0x30,0x60,0xc0,0xc6,0xfe,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x7c,0xc6,0x06,0x06,0x3c,0x06,0x06,0x06,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x0c,0x1c,0x3c,0x6c,0xcc,0xfe,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xfe,0xc0,0xc0,0xc0,0xfc,0x06,0x06,0x06,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x38,0x60,0xc0,0xc0,0xfc,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xfe,0xc6,0x06,0x06,0x0c,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x7c,0xc6,0xc6,0xc6,0x7c,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x7c,0xc6,0xc6,0xc6,0x7e,0x06,0x06,0x06,0x0c,0x78,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x06,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x06,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x60,0x30,0x18,0x0c,0x06,0x0c,0x18,0x30,0x60,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x7c,0xc6,0xc6,0x0c,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xde,0xde,0xde,0xdc,0xc0,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x66,0x66,0x66,0x66,0xfc,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xc0,0xc0,0xc2,0x66,0x3c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xf8,0x6c,0x66,0x66,0x66,0x66,0x66,0x66,0x6c,0xf8,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xfe,0x66,0x62,0x68,0x78,0x68,0x60,0x62,0x66,0xfe,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xfe,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xde,0xc6,0xc6,0x66,0x3a,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x3c,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x1e,0x0c,0x0c,0x0c,0x0c,0x0c,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xe6,0x66,0x66,0x6c,0x78,0x78,0x6c,0x66,0x66,0xe6,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xf0,0x60,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xfe,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xc3,0xe7,0xff,0xff,0xdb,0xc3,0xc3,0xc3,0xc3,0xc3,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xc6,0xe6,0xf6,0xfe,0xde,0xce,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xd6,0xde,0x7c,0x0c,0x0e,0x00,0x00,
|
|
||||||
0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x6c,0x66,0x66,0x66,0xe6,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x7c,0xc6,0xc6,0x60,0x38,0x0c,0x06,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xff,0xdb,0x99,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x66,0x3c,0x18,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xc3,0xc3,0xc3,0xc3,0xc3,0xdb,0xdb,0xff,0x66,0x66,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xc3,0xc3,0x66,0x3c,0x18,0x18,0x3c,0x66,0xc3,0xc3,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xc3,0xc3,0xc3,0x66,0x3c,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xff,0xc3,0x86,0x0c,0x18,0x30,0x60,0xc1,0xc3,0xff,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x3c,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x80,0xc0,0xe0,0x70,0x38,0x1c,0x0e,0x06,0x02,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x3c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x3c,0x00,0x00,0x00,0x00,
|
|
||||||
0x10,0x38,0x6c,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
|
|
||||||
0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xe0,0x60,0x60,0x78,0x6c,0x66,0x66,0x66,0x66,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xc0,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x1c,0x0c,0x0c,0x3c,0x6c,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x38,0x6c,0x64,0x60,0xf0,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x76,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0xcc,0x78,0x00,
|
|
||||||
0x00,0x00,0xe0,0x60,0x60,0x6c,0x76,0x66,0x66,0x66,0x66,0xe6,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x06,0x06,0x00,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3c,0x00,
|
|
||||||
0x00,0x00,0xe0,0x60,0x60,0x66,0x6c,0x78,0x78,0x6c,0x66,0xe6,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xe6,0xff,0xdb,0xdb,0xdb,0xdb,0xdb,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x7c,0x60,0x60,0xf0,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x76,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x1e,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xdc,0x76,0x66,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0x60,0x38,0x0c,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x10,0x30,0x30,0xfc,0x30,0x30,0x30,0x30,0x36,0x1c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0xc3,0xc3,0x66,0x3c,0x18,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0xc3,0xdb,0xdb,0xff,0x66,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xc3,0x66,0x3c,0x18,0x3c,0x66,0xc3,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7e,0x06,0x0c,0xf8,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xfe,0xcc,0x18,0x30,0x60,0xc6,0xfe,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x0e,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0e,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x70,0x18,0x18,0x18,0x0e,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x76,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xc6,0xfe,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xc0,0xc2,0x66,0x3c,0x0c,0x06,0x7c,0x00,0x00,
|
|
||||||
0x00,0x00,0xcc,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x0c,0x18,0x30,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x10,0x38,0x6c,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xcc,0x00,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x60,0x30,0x18,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x38,0x6c,0x38,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x3c,0x66,0x60,0x60,0x66,0x3c,0x0c,0x06,0x3c,0x00,0x00,0x00,
|
|
||||||
0x00,0x10,0x38,0x6c,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xc6,0x00,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x60,0x30,0x18,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x66,0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x18,0x3c,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x60,0x30,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0xc6,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
|
|
||||||
0x38,0x6c,0x38,0x00,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
|
|
||||||
0x18,0x30,0x60,0x00,0xfe,0x66,0x60,0x7c,0x60,0x60,0x66,0xfe,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x6e,0x3b,0x1b,0x7e,0xd8,0xdc,0x77,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x3e,0x6c,0xcc,0xcc,0xfe,0xcc,0xcc,0xcc,0xcc,0xce,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x10,0x38,0x6c,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xc6,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x60,0x30,0x18,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x30,0x78,0xcc,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x60,0x30,0x18,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xc6,0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7e,0x06,0x0c,0x78,0x00,
|
|
||||||
0x00,0xc6,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0xc6,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x18,0x18,0x7e,0xc3,0xc0,0xc0,0xc0,0xc3,0x7e,0x18,0x18,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x38,0x6c,0x64,0x60,0xf0,0x60,0x60,0x60,0x60,0xe6,0xfc,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xc3,0x66,0x3c,0x18,0xff,0x18,0xff,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0xfc,0x66,0x66,0x7c,0x62,0x66,0x6f,0x66,0x66,0x66,0xf3,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x0e,0x1b,0x18,0x18,0x18,0x7e,0x18,0x18,0x18,0x18,0x18,0xd8,0x70,0x00,0x00,
|
|
||||||
0x00,0x18,0x30,0x60,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x0c,0x18,0x30,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x18,0x30,0x60,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x18,0x30,0x60,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x76,0xdc,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,
|
|
||||||
0x76,0xdc,0x00,0xc6,0xe6,0xf6,0xfe,0xde,0xce,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x3c,0x6c,0x6c,0x3e,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x38,0x6c,0x6c,0x38,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x30,0x30,0x00,0x30,0x30,0x60,0xc0,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0xc0,0xc0,0xc2,0xc6,0xcc,0x18,0x30,0x60,0xce,0x9b,0x06,0x0c,0x1f,0x00,0x00,
|
|
||||||
0x00,0xc0,0xc0,0xc2,0xc6,0xcc,0x18,0x30,0x66,0xce,0x96,0x3e,0x06,0x06,0x00,0x00,
|
|
||||||
0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x18,0x3c,0x3c,0x3c,0x18,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x36,0x6c,0xd8,0x6c,0x36,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xd8,0x6c,0x36,0x6c,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,
|
|
||||||
0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,
|
|
||||||
0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,
|
|
||||||
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
|
|
||||||
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
|
|
||||||
0x18,0x18,0x18,0x18,0x18,0xf8,0x18,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
|
|
||||||
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xf6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xf8,0x18,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
|
|
||||||
0x36,0x36,0x36,0x36,0x36,0xf6,0x06,0xf6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
|
|
||||||
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xfe,0x06,0xf6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
|
|
||||||
0x36,0x36,0x36,0x36,0x36,0xf6,0x06,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x18,0x18,0x18,0x18,0x18,0xf8,0x18,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
|
|
||||||
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
|
|
||||||
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
|
|
||||||
0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
|
|
||||||
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
|
|
||||||
0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x3f,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
|
|
||||||
0x36,0x36,0x36,0x36,0x36,0xf7,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xf7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
|
|
||||||
0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x36,0x36,0x36,0x36,0x36,0xf7,0x00,0xf7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
|
|
||||||
0x18,0x18,0x18,0x18,0x18,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
|
|
||||||
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x1f,0x18,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
|
|
||||||
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xff,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
|
|
||||||
0x18,0x18,0x18,0x18,0x18,0xff,0x18,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
|
|
||||||
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
|
|
||||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
|
||||||
0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,
|
|
||||||
0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,
|
|
||||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x76,0xdc,0xd8,0xd8,0xd8,0xdc,0x76,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x78,0xcc,0xcc,0xcc,0xd8,0xcc,0xc6,0xc6,0xc6,0xcc,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xfe,0xc6,0xc6,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0xfe,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0xfe,0xc6,0x60,0x30,0x18,0x30,0x60,0xc6,0xfe,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x7e,0xd8,0xd8,0xd8,0xd8,0xd8,0x70,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x7c,0x60,0x60,0xc0,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x76,0xdc,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x7e,0x18,0x3c,0x66,0x66,0x66,0x3c,0x18,0x7e,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0x6c,0x38,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x38,0x6c,0xc6,0xc6,0xc6,0x6c,0x6c,0x6c,0x6c,0xee,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x1e,0x30,0x18,0x0c,0x3e,0x66,0x66,0x66,0x66,0x3c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x7e,0xdb,0xdb,0xdb,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x03,0x06,0x7e,0xdb,0xdb,0xf3,0x7e,0x60,0xc0,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x1c,0x30,0x60,0x60,0x7c,0x60,0x60,0x60,0x30,0x1c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0xfe,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00,0xff,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x30,0x18,0x0c,0x06,0x0c,0x18,0x30,0x00,0x7e,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x00,0x7e,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x0e,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
|
|
||||||
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xd8,0xd8,0xd8,0x70,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x7e,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x76,0xdc,0x00,0x76,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x38,0x6c,0x6c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0xec,0x6c,0x6c,0x3c,0x1c,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0xd8,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x70,0xd8,0x30,0x60,0xc8,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
};
|
|
||||||
static int default8x16FontMetaData[256*5+1]={
|
|
||||||
0,8,16,0,0,16,8,16,0,0,32,8,16,0,0,48,8,16,0,0,64,8,16,0,0,80,8,16,0,0,96,8,16,0,0,112,8,16,0,0,128,8,16,0,0,144,8,16,0,0,160,8,16,0,0,176,8,16,0,0,192,8,16,0,0,208,8,16,0,0,224,8,16,0,0,240,8,16,0,0,256,8,16,0,0,272,8,16,0,0,288,8,16,0,0,304,8,16,0,0,320,8,16,0,0,336,8,16,0,0,352,8,16,0,0,368,8,16,0,0,384,8,16,0,0,400,8,16,0,0,416,8,16,0,0,432,8,16,0,0,448,8,16,0,0,464,8,16,0,0,480,8,16,0,0,496,8,16,0,0,512,8,16,0,0,528,8,16,0,0,544,8,16,0,0,560,8,16,0,0,576,8,16,0,0,592,8,16,0,0,608,8,16,0,0,624,8,16,0,0,640,8,16,0,0,656,8,16,0,0,672,8,16,0,0,688,8,16,0,0,704,8,16,0,0,720,8,16,0,0,736,8,16,0,0,752,8,16,0,0,768,8,16,0,0,784,8,16,0,0,800,8,16,0,0,816,8,16,0,0,832,8,16,0,0,848,8,16,0,0,864,8,16,0,0,880,8,16,0,0,896,8,16,0,0,912,8,16,0,0,928,8,16,0,0,944,8,16,0,0,960,8,16,0,0,976,8,16,0,0,992,8,16,0,0,1008,8,16,0,0,1024,8,16,0,0,1040,8,16,0,0,1056,8,16,0,0,1072,8,16,0,0,1088,8,16,0,0,1104,8,16,0,0,1120,8,16,0,0,1136,8,16,0,0,1152,8,16,0,0,1168,8,16,0,0,1184,8,16,0,0,1200,8,16,0,0,1216,8,16,0,0,1232,8,16,0,0,1248,8,16,0,0,1264,8,16,0,0,1280,8,16,0,0,1296,8,16,0,0,1312,8,16,0,0,1328,8,16,0,0,1344,8,16,0,0,1360,8,16,0,0,1376,8,16,0,0,1392,8,16,0,0,1408,8,16,0,0,1424,8,16,0,0,1440,8,16,0,0,1456,8,16,0,0,1472,8,16,0,0,1488,8,16,0,0,1504,8,16,0,0,1520,8,16,0,0,1536,8,16,0,0,1552,8,16,0,0,1568,8,16,0,0,1584,8,16,0,0,1600,8,16,0,0,1616,8,16,0,0,1632,8,16,0,0,1648,8,16,0,0,1664,8,16,0,0,1680,8,16,0,0,1696,8,16,0,0,1712,8,16,0,0,1728,8,16,0,0,1744,8,16,0,0,1760,8,16,0,0,1776,8,16,0,0,1792,8,16,0,0,1808,8,16,0,0,1824,8,16,0,0,1840,8,16,0,0,1856,8,16,0,0,1872,8,16,0,0,1888,8,16,0,0,1904,8,16,0,0,1920,8,16,0,0,1936,8,16,0,0,1952,8,16,0,0,1968,8,16,0,0,1984,8,16,0,0,2000,8,16,0,0,2016,8,16,0,0,2032,8,16,0,0,2048,8,16,0,0,2064,8,16,0,0,2080,8,16,0,0,2096,8,16,0,0,2112,8,16,0,0,2128,8,16,0,0,2144,8,16,0,0,2160,8,16,0,0,2176,8,16,0,0,2192,8,16,0,0,2208,8,16,0,0,2224,8,16,0,0,2240,8,16,0,0,2256,8,16,0,0,2272,8,16,0,0,2288,8,16,0,0,2304,8,16,0,0,2320,8,16,0,0,2336,8,16,0,0,2352,8,16,0,0,2368,8,16,0,0,2384,8,16,0,0,2400,8,16,0,0,2416,8,16,0,0,2432,8,16,0,0,2448,8,16,0,0,2464,8,16,0,0,2480,8,16,0,0,2496,8,16,0,0,2512,8,16,0,0,2528,8,16,0,0,2544,8,16,0,0,2560,8,16,0,0,2576,8,16,0,0,2592,8,16,0,0,2608,8,16,0,0,2624,8,16,0,0,2640,8,16,0,0,2656,8,16,0,0,2672,8,16,0,0,2688,8,16,0,0,2704,8,16,0,0,2720,8,16,0,0,2736,8,16,0,0,2752,8,16,0,0,2768,8,16,0,0,2784,8,16,0,0,2800,8,16,0,0,2816,8,16,0,0,2832,8,16,0,0,2848,8,16,0,0,2864,8,16,0,0,2880,8,16,0,0,2896,8,16,0,0,2912,8,16,0,0,2928,8,16,0,0,2944,8,16,0,0,2960,8,16,0,0,2976,8,16,0,0,2992,8,16,0,0,3008,8,16,0,0,3024,8,16,0,0,3040,8,16,0,0,3056,8,16,0,0,3072,8,16,0,0,3088,8,16,0,0,3104,8,16,0,0,3120,8,16,0,0,3136,8,16,0,0,3152,8,16,0,0,3168,8,16,0,0,3184,8,16,0,0,3200,8,16,0,0,3216,8,16,0,0,3232,8,16,0,0,3248,8,16,0,0,3264,8,16,0,0,3280,8,16,0,0,3296,8,16,0,0,3312,8,16,0,0,3328,8,16,0,0,3344,8,16,0,0,3360,8,16,0,0,3376,8,16,0,0,3392,8,16,0,0,3408,8,16,0,0,3424,8,16,0,0,3440,8,16,0,0,3456,8,16,0,0,3472,8,16,0,0,3488,8,16,0,0,3504,8,16,0,0,3520,8,16,0,0,3536,8,16,0,0,3552,8,16,0,0,3568,8,16,0,0,3584,8,16,0,0,3600,8,16,0,0,3616,8,16,0,0,3632,8,16,0,0,3648,8,16,0,0,3664,8,16,0,0,3680,8,16,0,0,3696,8,16,0,0,3712,8,16,0,0,3728,8,16,0,0,3744,8,16,0,0,3760,8,16,0,0,3776,8,16,0,0,3792,8,16,0,0,3808,8,16,0,0,3824,8,16,0,0,3840,8,16,0,0,3856,8,16,0,0,3872,8,16,0,0,3888,8,16,0,0,3904,8,16,0,0,3920,8,16,0,0,3936,8,16,0,0,3952,8,16,0,0,3968,8,16,0,0,3984,8,16,0,0,4000,8,16,0,0,4016,8,16,0,0,4032,8,16,0,0,4048,8,16,0,0,4064,8,16,0,0,4080,8,16,0,0,};
|
|
||||||
static rfbFontData default8x16Font = { default8x16FontData, default8x16FontMetaData };
|
|
@ -1,799 +0,0 @@
|
|||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <rfb/rfb.h>
|
|
||||||
#include <rfb/rfbclient.h>
|
|
||||||
|
|
||||||
#include "nacro.h"
|
|
||||||
|
|
||||||
/* for visual grepping */
|
|
||||||
typedef struct image_t {
|
|
||||||
int width,height;
|
|
||||||
char* buffer;
|
|
||||||
} image_t;
|
|
||||||
|
|
||||||
/* this is a VNC connection */
|
|
||||||
typedef struct private_resource_t {
|
|
||||||
int listen_port;
|
|
||||||
rfbScreenInfo* server;
|
|
||||||
rfbClient* client;
|
|
||||||
|
|
||||||
uint32_t keysym;
|
|
||||||
rfbBool keydown;
|
|
||||||
|
|
||||||
int x,y;
|
|
||||||
int buttons;
|
|
||||||
|
|
||||||
char* text_client;
|
|
||||||
char* text_server;
|
|
||||||
|
|
||||||
image_t* grep_image;
|
|
||||||
int x_origin,y_origin;
|
|
||||||
|
|
||||||
enum { SLEEP,VISUALGREP,WAITFORUPDATE } state;
|
|
||||||
result_t result;
|
|
||||||
} private_resource_t;
|
|
||||||
|
|
||||||
/* resource management */
|
|
||||||
|
|
||||||
#define MAX_RESOURCE_COUNT 20
|
|
||||||
|
|
||||||
static private_resource_t resource_pool[MAX_RESOURCE_COUNT];
|
|
||||||
static int resource_count=0;
|
|
||||||
|
|
||||||
static private_resource_t* get_resource(int resource)
|
|
||||||
{
|
|
||||||
if(resource>=MAX_RESOURCE_COUNT || resource<0 || resource_pool[resource].client==0)
|
|
||||||
return NULL;
|
|
||||||
return resource_pool+resource;
|
|
||||||
}
|
|
||||||
|
|
||||||
static private_resource_t* get_next_resource(void)
|
|
||||||
{
|
|
||||||
if(resource_count<MAX_RESOURCE_COUNT) {
|
|
||||||
memset(resource_pool+resource_count,0,sizeof(private_resource_t));
|
|
||||||
resource_count++;
|
|
||||||
return resource_pool+resource_count-1;
|
|
||||||
} else {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for(i=0;i<MAX_RESOURCE_COUNT && resource_pool[i].client;i++);
|
|
||||||
if(i<MAX_RESOURCE_COUNT)
|
|
||||||
return resource_pool+i;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void free_resource(int resource)
|
|
||||||
{
|
|
||||||
private_resource_t* res=get_resource(resource);
|
|
||||||
if(res)
|
|
||||||
res->client=NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* hooks */
|
|
||||||
|
|
||||||
static void got_key(rfbBool down,rfbKeySym keysym,rfbClientRec* cl)
|
|
||||||
{
|
|
||||||
private_resource_t* res=(private_resource_t*)cl->screen->screenData;
|
|
||||||
|
|
||||||
res->keydown=down;
|
|
||||||
res->keysym=keysym;
|
|
||||||
res->result|=RESULT_KEY;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void got_mouse(int buttons,int x,int y,rfbClientRec* cl)
|
|
||||||
{
|
|
||||||
private_resource_t* res=(private_resource_t*)cl->screen->screenData;
|
|
||||||
|
|
||||||
res->buttons=buttons;
|
|
||||||
res->x=x;
|
|
||||||
res->y=y;
|
|
||||||
res->result|=RESULT_MOUSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void got_text(char* str,int len,rfbClientRec* cl)
|
|
||||||
{
|
|
||||||
private_resource_t* res=(private_resource_t*)cl->screen->screenData;
|
|
||||||
|
|
||||||
if (res->text_client)
|
|
||||||
free(res->text_client);
|
|
||||||
res->text_client=strdup(str);
|
|
||||||
res->result|=RESULT_TEXT_CLIENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void got_text_from_server(rfbClient* cl, const char *str, int textlen)
|
|
||||||
{
|
|
||||||
private_resource_t* res=(private_resource_t*)cl->clientData;
|
|
||||||
|
|
||||||
if (res->text_server)
|
|
||||||
free(res->text_server);
|
|
||||||
res->text_server=strdup(str);
|
|
||||||
res->result|=RESULT_TEXT_SERVER;
|
|
||||||
}
|
|
||||||
|
|
||||||
static rfbBool malloc_frame_buffer(rfbClient* cl)
|
|
||||||
{
|
|
||||||
private_resource_t* res=(private_resource_t*)cl->clientData;
|
|
||||||
|
|
||||||
if(!res->server) {
|
|
||||||
int w=cl->width,h=cl->height;
|
|
||||||
|
|
||||||
res->client->frameBuffer=malloc(w*4*h);
|
|
||||||
|
|
||||||
res->server=rfbGetScreen(NULL,NULL,w,h,8,3,4);
|
|
||||||
res->server->screenData=res;
|
|
||||||
res->server->port=res->listen_port;
|
|
||||||
res->server->frameBuffer=res->client->frameBuffer;
|
|
||||||
res->server->kbdAddEvent=got_key;
|
|
||||||
res->server->ptrAddEvent=got_mouse;
|
|
||||||
res->server->setXCutText=got_text;
|
|
||||||
rfbInitServer(res->server);
|
|
||||||
} else {
|
|
||||||
/* TODO: realloc if necessary */
|
|
||||||
/* TODO: resolution change: send NewFBSize */
|
|
||||||
/* TODO: if the origin is out of bounds, reset to 0 */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool_t do_visual_grep(private_resource_t* res,int x,int y,int w,int h)
|
|
||||||
{
|
|
||||||
rfbClient* cl;
|
|
||||||
image_t* image;
|
|
||||||
int x_start,y_start,x_end=x+w-1,y_end=y+h-1;
|
|
||||||
bool_t found=0;
|
|
||||||
|
|
||||||
if(res==0 || (cl=res->client)==0 || (image=res->grep_image)==0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
x_start=x-image->width;
|
|
||||||
y_start=y-image->height;
|
|
||||||
if(x_start<0) x_start=0;
|
|
||||||
if(y_start<0) y_start=0;
|
|
||||||
if(x_end+image->width>cl->width) x_end=cl->width-image->width;
|
|
||||||
if(y_end+image->height>cl->height) y_end=cl->height-image->height;
|
|
||||||
|
|
||||||
/* find image and set x_origin,y_origin if found */
|
|
||||||
for(y=y_start;y<y_end;y++)
|
|
||||||
for(x=x_start;x<x_end;x++) {
|
|
||||||
bool_t matching=1;
|
|
||||||
int i,j;
|
|
||||||
for(j=0;matching && j<image->height;j++)
|
|
||||||
for(i=0;matching && i<image->width;i++)
|
|
||||||
if(memcmp(cl->frameBuffer+4*(x+i+cl->width*(y+j)),image->buffer+4*(i+image->width*j),3))
|
|
||||||
matching=0;
|
|
||||||
if(matching) {
|
|
||||||
private_resource_t* res=(private_resource_t*)cl->clientData;
|
|
||||||
res->x_origin=x;
|
|
||||||
res->y_origin=y;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void got_frame_buffer(rfbClient* cl,int x,int y,int w,int h)
|
|
||||||
{
|
|
||||||
private_resource_t* res=(private_resource_t*)cl->clientData;
|
|
||||||
|
|
||||||
assert(res->server);
|
|
||||||
|
|
||||||
if(res->grep_image && do_visual_grep(res,x,y,w,h)) {
|
|
||||||
res->result|=RESULT_FOUNDIMAGE;
|
|
||||||
}
|
|
||||||
if(res->server) {
|
|
||||||
rfbMarkRectAsModified(res->server,x,y,x+w,y+h);
|
|
||||||
}
|
|
||||||
|
|
||||||
res->result|=RESULT_SCREEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* init/shutdown functions */
|
|
||||||
|
|
||||||
resource_t initvnc(const char* server,int server_port,int listen_port)
|
|
||||||
{
|
|
||||||
private_resource_t* res=get_next_resource();
|
|
||||||
int dummy=0;
|
|
||||||
|
|
||||||
if(res==0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* remember for later */
|
|
||||||
res->listen_port=listen_port;
|
|
||||||
|
|
||||||
res->text_client = NULL;
|
|
||||||
res->text_server = NULL;
|
|
||||||
|
|
||||||
res->client=rfbGetClient(8,3,4);
|
|
||||||
res->client->clientData=(void*)res;
|
|
||||||
res->client->GotFrameBufferUpdate=got_frame_buffer;
|
|
||||||
res->client->MallocFrameBuffer=malloc_frame_buffer;
|
|
||||||
res->client->GotXCutText=got_text_from_server;
|
|
||||||
res->client->serverHost=strdup(server);
|
|
||||||
res->client->serverPort=server_port;
|
|
||||||
res->client->appData.encodingsString="raw";
|
|
||||||
if(!rfbInitClient(res->client,&dummy,NULL)) {
|
|
||||||
res->client=NULL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return res-resource_pool;
|
|
||||||
}
|
|
||||||
|
|
||||||
void closevnc(resource_t resource)
|
|
||||||
{
|
|
||||||
private_resource_t* res=get_resource(resource);
|
|
||||||
if(res==0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(res->server)
|
|
||||||
rfbScreenCleanup(res->server);
|
|
||||||
|
|
||||||
assert(res->client);
|
|
||||||
|
|
||||||
rfbClientCleanup(res->client);
|
|
||||||
|
|
||||||
res->client=NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* PNM (image) helpers */
|
|
||||||
|
|
||||||
bool_t savepnm(resource_t resource,const char* filename,int x1,int y1,int x2,int y2)
|
|
||||||
{
|
|
||||||
private_resource_t* res=get_resource(resource);
|
|
||||||
int i,j,w,h;
|
|
||||||
uint32_t* buffer;
|
|
||||||
FILE* f;
|
|
||||||
|
|
||||||
if(res==0 || res->client==0)
|
|
||||||
return 0;
|
|
||||||
assert(res->client->format.depth==24);
|
|
||||||
|
|
||||||
w=res->client->width;
|
|
||||||
h=res->client->height;
|
|
||||||
buffer=(uint32_t*)res->client->frameBuffer;
|
|
||||||
|
|
||||||
if(res==0 || x1>x2 || y1>y2 || x1<0 || x2>=w || y1<0 || y2>=h)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
f=fopen(filename,"wb");
|
|
||||||
|
|
||||||
if(f==0)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
fprintf(f,"P6\n%d %d\n255\n",1+x2-x1,1+y2-y1);
|
|
||||||
for(j=y1;j<=y2;j++)
|
|
||||||
for(i=x1;i<=x2;i++) {
|
|
||||||
fwrite(buffer+i+j*w,3,1,f);
|
|
||||||
}
|
|
||||||
if(fclose(f))
|
|
||||||
return FALSE;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static image_t* loadpnm(const char* filename)
|
|
||||||
{
|
|
||||||
FILE* f=fopen(filename,"rb");
|
|
||||||
char buffer[1024];
|
|
||||||
int i,j,w,h;
|
|
||||||
image_t* image;
|
|
||||||
|
|
||||||
if(f==0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if(!fgets(buffer,1024,f) || strcmp("P6\n",buffer)) {
|
|
||||||
fclose(f);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
fgets(buffer,1024,f);
|
|
||||||
if(feof(f)) {
|
|
||||||
fclose(f);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
} while(buffer[0]=='#');
|
|
||||||
|
|
||||||
if( sscanf(buffer,"%d %d",&w,&h)!=2
|
|
||||||
|| !fgets(buffer,1024,f) || strcmp("255\n",buffer)) {
|
|
||||||
fclose(f);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
image=(image_t*)malloc(sizeof(image_t));
|
|
||||||
image->width=w;
|
|
||||||
image->height=h;
|
|
||||||
image->buffer=malloc(w*4*h);
|
|
||||||
if(!image->buffer) {
|
|
||||||
fclose(f);
|
|
||||||
free(image);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(j=0;j<h;j++)
|
|
||||||
for(i=0;i<w;i++)
|
|
||||||
if(fread(image->buffer+4*(i+w*j),3,1,f)!=1) {
|
|
||||||
fprintf(stderr,"Could not read 3 bytes at %d,%d\n",i,j);
|
|
||||||
fclose(f);
|
|
||||||
free(image->buffer);
|
|
||||||
free(image);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(f);
|
|
||||||
|
|
||||||
return image;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void free_image(image_t* image)
|
|
||||||
{
|
|
||||||
if(image->buffer)
|
|
||||||
free(image->buffer);
|
|
||||||
free(image);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void copy_line(rfbScreenInfo *dest, char *backup,
|
|
||||||
int x0, int y0, int x1, int y1, int color_offset)
|
|
||||||
{
|
|
||||||
uint8_t *d = (uint8_t *)dest->frameBuffer, *s = (uint8_t *)backup;
|
|
||||||
int i;
|
|
||||||
int steps0 = x1 > x0 ? x1 - x0 : x0 - x1;
|
|
||||||
int steps1 = y1 > y0 ? y1 - y0 : y0 - y1;
|
|
||||||
|
|
||||||
if (steps1 > steps0)
|
|
||||||
steps0 = steps1;
|
|
||||||
else if (steps0 == 0)
|
|
||||||
steps0 = 1;
|
|
||||||
|
|
||||||
for (i = 0; i <= steps0; i++) {
|
|
||||||
int j, index = 4 * (x0 + i * (x1 - x0) / steps0
|
|
||||||
+ dest->width * (y0 + i * (y1 - y0) / steps0));
|
|
||||||
for (j = 0; j < 4; j++)
|
|
||||||
d[index + j] = s[index + j] + color_offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
rfbMarkRectAsModified(dest, x0 - 5, y0 - 5, x1 + 1, y1 + 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
result_t displaypnm(resource_t resource, const char *filename,
|
|
||||||
coordinate_t x, coordinate_t y, bool_t border,
|
|
||||||
timeout_t timeout_in_seconds)
|
|
||||||
{
|
|
||||||
private_resource_t* res = get_resource(resource);
|
|
||||||
image_t *image;
|
|
||||||
char* fake_frame_buffer;
|
|
||||||
char* backup;
|
|
||||||
int w, h, i, j, w2, h2;
|
|
||||||
result_t result;
|
|
||||||
|
|
||||||
if (res == NULL || res->server == NULL ||
|
|
||||||
(image = loadpnm(filename)) == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
w = res->server->width;
|
|
||||||
h = res->server->height;
|
|
||||||
fake_frame_buffer = malloc(w * 4 * h);
|
|
||||||
if(!fake_frame_buffer)
|
|
||||||
return 0;
|
|
||||||
memcpy(fake_frame_buffer, res->server->frameBuffer, w * 4 * h);
|
|
||||||
|
|
||||||
backup = res->server->frameBuffer;
|
|
||||||
res->server->frameBuffer = fake_frame_buffer;
|
|
||||||
|
|
||||||
w2 = image->width;
|
|
||||||
if (x + w2 > w)
|
|
||||||
w2 = w - x;
|
|
||||||
h2 = image->height;
|
|
||||||
if (y + h2 > h)
|
|
||||||
h2 = h - y;
|
|
||||||
for (j = 0; j < h2; j++)
|
|
||||||
memcpy(fake_frame_buffer + 4 * (x + (y + j) * w),
|
|
||||||
image->buffer + j * 4 * image->width, 4 * w2);
|
|
||||||
free(image);
|
|
||||||
if (border) {
|
|
||||||
copy_line(res->server, backup, x, y, x + w2, y, 0x80);
|
|
||||||
copy_line(res->server, backup, x, y, x, y + h2, 0x80);
|
|
||||||
copy_line(res->server, backup, x + w2, y, x + w2, y + h2, 0x80);
|
|
||||||
copy_line(res->server, backup, x, y + h2, x + w2, y + h2, 0x80);
|
|
||||||
}
|
|
||||||
rfbMarkRectAsModified(res->server,
|
|
||||||
x - 1, y - 1, x + w2 + 1, y + h2 + 1);
|
|
||||||
|
|
||||||
result = waitforinput(resource, timeout_in_seconds);
|
|
||||||
|
|
||||||
res->server->frameBuffer=backup;
|
|
||||||
free(fake_frame_buffer);
|
|
||||||
rfbMarkRectAsModified(res->server,
|
|
||||||
x - 1, y - 1, x + w2 + 1, y + h2 + 1);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* process() and friends */
|
|
||||||
|
|
||||||
/* this function returns only if res->result in return_mask */
|
|
||||||
static result_t private_process(resource_t resource,timeout_t timeout_in_seconds,result_t return_mask)
|
|
||||||
{
|
|
||||||
private_resource_t* res=get_resource(resource);
|
|
||||||
fd_set fds;
|
|
||||||
struct timeval tv,tv_start,tv_end;
|
|
||||||
unsigned long timeout=(unsigned long)(timeout_in_seconds*1000000UL);
|
|
||||||
int count,max_fd;
|
|
||||||
|
|
||||||
if(res==0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
assert(res->client);
|
|
||||||
|
|
||||||
gettimeofday(&tv_start,NULL);
|
|
||||||
res->result=0;
|
|
||||||
|
|
||||||
do {
|
|
||||||
unsigned long timeout_done;
|
|
||||||
|
|
||||||
if(res->server) {
|
|
||||||
rfbBool loop;
|
|
||||||
do {
|
|
||||||
loop=rfbProcessEvents(res->server,res->server->deferUpdateTime);
|
|
||||||
} while(loop && (res->result&return_mask)==0
|
|
||||||
&& rfbIsActive(res->server));
|
|
||||||
|
|
||||||
if(!rfbIsActive(res->server))
|
|
||||||
return RESULT_SHUTDOWN;
|
|
||||||
|
|
||||||
if((res->result&return_mask)!=0)
|
|
||||||
return res->result;
|
|
||||||
|
|
||||||
memcpy((char*)&fds,(const char*)&(res->server->allFds),sizeof(fd_set));
|
|
||||||
max_fd=res->server->maxFd;
|
|
||||||
} else {
|
|
||||||
FD_ZERO(&fds);
|
|
||||||
max_fd=0;
|
|
||||||
}
|
|
||||||
FD_SET(res->client->sock,&fds);
|
|
||||||
if(res->client->sock>max_fd)
|
|
||||||
max_fd=res->client->sock;
|
|
||||||
|
|
||||||
gettimeofday(&tv_end,NULL);
|
|
||||||
timeout_done=tv_end.tv_usec-tv_start.tv_usec+
|
|
||||||
1000000L*(tv_end.tv_sec-tv_start.tv_sec);
|
|
||||||
if(timeout_done>=timeout)
|
|
||||||
return RESULT_TIMEOUT;
|
|
||||||
|
|
||||||
tv.tv_usec=((timeout-timeout_done)%1000000);
|
|
||||||
tv.tv_sec=(timeout-timeout_done)/1000000;
|
|
||||||
|
|
||||||
count=select(max_fd+1,&fds,NULL,NULL,&tv);
|
|
||||||
if(count<0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if(count>0) {
|
|
||||||
if(FD_ISSET(res->client->sock,&fds)) {
|
|
||||||
if(!HandleRFBServerMessage(res->client)) {
|
|
||||||
closevnc(resource);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if((res->result&return_mask)!=0)
|
|
||||||
return res->result;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
res->result|=RESULT_TIMEOUT;
|
|
||||||
return res->result;
|
|
||||||
}
|
|
||||||
} while(1);
|
|
||||||
|
|
||||||
return RESULT_TIMEOUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
result_t process(resource_t res,timeout_t timeout)
|
|
||||||
{
|
|
||||||
return private_process(res,timeout,RESULT_TIMEOUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
result_t waitforanything(resource_t res,timeout_t timeout)
|
|
||||||
{
|
|
||||||
return private_process(res,timeout,-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
result_t waitforinput(resource_t res,timeout_t timeout)
|
|
||||||
{
|
|
||||||
return private_process(res,timeout,RESULT_KEY|RESULT_MOUSE|RESULT_TIMEOUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
result_t waitforupdate(resource_t res,timeout_t timeout)
|
|
||||||
{
|
|
||||||
return private_process(res,timeout,RESULT_SCREEN|RESULT_TIMEOUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
result_t visualgrep(resource_t resource,const char* filename,timeout_t timeout)
|
|
||||||
{
|
|
||||||
private_resource_t* res=get_resource(resource);
|
|
||||||
image_t* image;
|
|
||||||
result_t result;
|
|
||||||
|
|
||||||
if(res==0 || res->client==0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* load filename and set res->grep_image to this image */
|
|
||||||
image=loadpnm(filename);
|
|
||||||
if(image==0)
|
|
||||||
return 0;
|
|
||||||
if(res->grep_image)
|
|
||||||
free_image(res->grep_image);
|
|
||||||
res->grep_image=image;
|
|
||||||
|
|
||||||
if(do_visual_grep(res,0,0,res->client->width,res->client->height))
|
|
||||||
return RESULT_FOUNDIMAGE;
|
|
||||||
|
|
||||||
result=private_process(resource,timeout,RESULT_FOUNDIMAGE|RESULT_TIMEOUT);
|
|
||||||
|
|
||||||
/* free image */
|
|
||||||
if(res->grep_image) {
|
|
||||||
free_image(res->grep_image);
|
|
||||||
res->grep_image=NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* auxiliary function for alert */
|
|
||||||
|
|
||||||
#include "default8x16.h"
|
|
||||||
|
|
||||||
static void center_text(rfbScreenInfo* screen,const char* message,int* x,int* y,int* w,int* h)
|
|
||||||
{
|
|
||||||
rfbFontData* font=&default8x16Font;
|
|
||||||
const char* pointer;
|
|
||||||
int j,x1,y1,x2,y2,line_count=0;
|
|
||||||
if(message==0 || screen==0)
|
|
||||||
return;
|
|
||||||
rfbWholeFontBBox(font,&x1,&y1,&x2,&y2);
|
|
||||||
for(line_count=1,pointer=message;*pointer;pointer++)
|
|
||||||
if(*pointer=='\n')
|
|
||||||
line_count++;
|
|
||||||
|
|
||||||
*h=(y2-y1)*line_count;
|
|
||||||
assert(*h>0);
|
|
||||||
|
|
||||||
if(*h>screen->height)
|
|
||||||
*h=screen->height;
|
|
||||||
|
|
||||||
*x=0; *w=screen->width; *y=(screen->height-*h)/2;
|
|
||||||
|
|
||||||
rfbFillRect(screen,*x,*y,*x+*w,*y+*h,0xff0000);
|
|
||||||
|
|
||||||
for(pointer=message,j=0;j<line_count;j++) {
|
|
||||||
const char* eol;
|
|
||||||
int x_cur,y_cur=*y-y1+j*(y2-y1),width;
|
|
||||||
|
|
||||||
for(width=0,eol=pointer;*eol && *eol!='\n';eol++)
|
|
||||||
width+=rfbWidthOfChar(font,*eol);
|
|
||||||
if(width>screen->width)
|
|
||||||
width=screen->width;
|
|
||||||
|
|
||||||
x_cur=(screen->width-width)/2;
|
|
||||||
for(;pointer!=eol;pointer++)
|
|
||||||
x_cur+=rfbDrawCharWithClip(screen,font,
|
|
||||||
x_cur,y_cur,*pointer,
|
|
||||||
0,0,screen->width,screen->height,
|
|
||||||
0xffffffff,0xffffffff);
|
|
||||||
pointer++;
|
|
||||||
}
|
|
||||||
rfbMarkRectAsModified(screen,*x,*y,*x+*w,*y+*h);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* this is an overlay which is shown for a certain time */
|
|
||||||
|
|
||||||
result_t alert(resource_t resource,const char* message,timeout_t timeout)
|
|
||||||
{
|
|
||||||
private_resource_t* res=get_resource(resource);
|
|
||||||
char* fake_frame_buffer;
|
|
||||||
char* backup;
|
|
||||||
int x,y,w,h;
|
|
||||||
result_t result;
|
|
||||||
|
|
||||||
if(res == NULL || res->server==NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
w=res->server->width;
|
|
||||||
h=res->server->height;
|
|
||||||
|
|
||||||
fake_frame_buffer=malloc(w*4*h);
|
|
||||||
if(!fake_frame_buffer)
|
|
||||||
return -1;
|
|
||||||
memcpy(fake_frame_buffer,res->server->frameBuffer,w*4*h);
|
|
||||||
|
|
||||||
backup=res->server->frameBuffer;
|
|
||||||
res->server->frameBuffer=fake_frame_buffer;
|
|
||||||
center_text(res->server,message,&x,&y,&w,&h);
|
|
||||||
fprintf(stderr,"%s\n",message);
|
|
||||||
|
|
||||||
result=waitforinput(resource,timeout);
|
|
||||||
|
|
||||||
res->server->frameBuffer=backup;
|
|
||||||
free(fake_frame_buffer);
|
|
||||||
rfbMarkRectAsModified(res->server,x,y,x+w,y+h);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
/* inspect last events */
|
|
||||||
|
|
||||||
keysym_t getkeysym(resource_t res)
|
|
||||||
{
|
|
||||||
private_resource_t* r=get_resource(res);
|
|
||||||
return r->keysym;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool_t getkeydown(resource_t res)
|
|
||||||
{
|
|
||||||
private_resource_t* r=get_resource(res);
|
|
||||||
return r->keydown;
|
|
||||||
}
|
|
||||||
|
|
||||||
coordinate_t getx(resource_t res)
|
|
||||||
{
|
|
||||||
private_resource_t* r=get_resource(res);
|
|
||||||
return r->x;
|
|
||||||
}
|
|
||||||
|
|
||||||
coordinate_t gety(resource_t res)
|
|
||||||
{
|
|
||||||
private_resource_t* r=get_resource(res);
|
|
||||||
return r->y;
|
|
||||||
}
|
|
||||||
|
|
||||||
buttons_t getbuttons(resource_t res)
|
|
||||||
{
|
|
||||||
private_resource_t* r=get_resource(res);
|
|
||||||
return r->buttons;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *gettext_client(resource_t res)
|
|
||||||
{
|
|
||||||
private_resource_t* r=get_resource(res);
|
|
||||||
return r->text_client;
|
|
||||||
}
|
|
||||||
|
|
||||||
result_t rubberband(resource_t resource, coordinate_t x0, coordinate_t y0)
|
|
||||||
{
|
|
||||||
private_resource_t* res=get_resource(resource);
|
|
||||||
char* fake_frame_buffer;
|
|
||||||
char* backup;
|
|
||||||
int w, h, x, y;
|
|
||||||
|
|
||||||
if(res == NULL || res->server==NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
x = res->x;
|
|
||||||
y = res->y;
|
|
||||||
w = res->server->width;
|
|
||||||
h = res->server->height;
|
|
||||||
fake_frame_buffer = malloc(w * 4 * h);
|
|
||||||
if(!fake_frame_buffer)
|
|
||||||
return 0;
|
|
||||||
memcpy(fake_frame_buffer, res->server->frameBuffer, w * 4 * h);
|
|
||||||
|
|
||||||
backup = res->server->frameBuffer;
|
|
||||||
res->server->frameBuffer = fake_frame_buffer;
|
|
||||||
|
|
||||||
while (res->buttons) {
|
|
||||||
result_t r = waitforinput(resource, 1000000L);
|
|
||||||
if (x == res->x && y == res->y)
|
|
||||||
continue;
|
|
||||||
copy_line(res->server, backup, x0, y0, x, y0, 0);
|
|
||||||
copy_line(res->server, backup, x0, y0, x0, y, 0);
|
|
||||||
copy_line(res->server, backup, x, y0, x, y, 0);
|
|
||||||
copy_line(res->server, backup, x0, y, x, y, 0);
|
|
||||||
x = res->x;
|
|
||||||
y = res->y;
|
|
||||||
copy_line(res->server, backup, x0, y0, x, y0, 0x80);
|
|
||||||
copy_line(res->server, backup, x0, y0, x0, y, 0x80);
|
|
||||||
copy_line(res->server, backup, x, y0, x, y, 0x80);
|
|
||||||
copy_line(res->server, backup, x0, y, x, y, 0x80);
|
|
||||||
}
|
|
||||||
|
|
||||||
copy_line(res->server, backup, x0, y0, x, y0, 0);
|
|
||||||
copy_line(res->server, backup, x0, y0, x0, y, 0);
|
|
||||||
copy_line(res->server, backup, x, y0, x, y, 0);
|
|
||||||
copy_line(res->server, backup, x0, y, x, y, 0);
|
|
||||||
|
|
||||||
res->server->frameBuffer=backup;
|
|
||||||
free(fake_frame_buffer);
|
|
||||||
|
|
||||||
return RESULT_MOUSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *gettext_server(resource_t res)
|
|
||||||
{
|
|
||||||
private_resource_t* r=get_resource(res);
|
|
||||||
return r->text_server;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* send events to the server */
|
|
||||||
|
|
||||||
bool_t sendkey(resource_t res,keysym_t keysym,bool_t keydown)
|
|
||||||
{
|
|
||||||
private_resource_t* r=get_resource(res);
|
|
||||||
if(r==NULL)
|
|
||||||
return 0;
|
|
||||||
return SendKeyEvent(r->client,keysym,keydown);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool_t sendascii(resource_t res,const char *string)
|
|
||||||
{
|
|
||||||
timeout_t delay = 0.1;
|
|
||||||
private_resource_t* r=get_resource(res);
|
|
||||||
int i;
|
|
||||||
if(r==NULL)
|
|
||||||
return 0;
|
|
||||||
while (*string) {
|
|
||||||
int keysym = *string;
|
|
||||||
int need_shift = 0;
|
|
||||||
|
|
||||||
if (keysym >= 8 && keysym < ' ')
|
|
||||||
keysym += 0xff00;
|
|
||||||
else if (keysym >= 'A' && keysym <= 'Z')
|
|
||||||
need_shift = 1;
|
|
||||||
else if (keysym > '~') {
|
|
||||||
fprintf(stderr, "String contains non-ASCII "
|
|
||||||
"character 0x%02x\n", *string);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (need_shift) {
|
|
||||||
if (!SendKeyEvent(r->client,0xffe1,1))
|
|
||||||
return FALSE;
|
|
||||||
waitforinput(r,delay);
|
|
||||||
}
|
|
||||||
for (i = 1; i >= 0; i--) {
|
|
||||||
if (!SendKeyEvent(r->client,keysym,i))
|
|
||||||
return FALSE;
|
|
||||||
waitforinput(r,delay);
|
|
||||||
}
|
|
||||||
if (need_shift) {
|
|
||||||
if (!SendKeyEvent(r->client,0xffe1,0))
|
|
||||||
return FALSE;
|
|
||||||
waitforinput(r,delay);
|
|
||||||
}
|
|
||||||
string++;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool_t sendmouse(resource_t res,coordinate_t x,coordinate_t y,buttons_t buttons)
|
|
||||||
{
|
|
||||||
private_resource_t* r=get_resource(res);
|
|
||||||
if(r==NULL)
|
|
||||||
return 0;
|
|
||||||
return SendPointerEvent(r->client,x,y,buttons);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool_t sendtext(resource_t res, const char *string)
|
|
||||||
{
|
|
||||||
private_resource_t* r=get_resource(res);
|
|
||||||
if(r==NULL)
|
|
||||||
return 0;
|
|
||||||
return SendClientCutText(r->client, (char *)string, (int)strlen(string));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool_t sendtext_to_server(resource_t res, const char *string)
|
|
||||||
{
|
|
||||||
private_resource_t* r=get_resource(res);
|
|
||||||
if(r==NULL)
|
|
||||||
return 0;
|
|
||||||
rfbSendServerCutText(r->server, (char *)string, (int)strlen(string));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* for visual grepping */
|
|
||||||
|
|
||||||
coordinate_t getxorigin(resource_t res)
|
|
||||||
{
|
|
||||||
private_resource_t* r=get_resource(res);
|
|
||||||
return r->x_origin;
|
|
||||||
}
|
|
||||||
|
|
||||||
coordinate_t getyorigin(resource_t res)
|
|
||||||
{
|
|
||||||
private_resource_t* r=get_resource(res);
|
|
||||||
return r->y_origin;
|
|
||||||
}
|
|
||||||
|
|
@ -1,120 +0,0 @@
|
|||||||
#ifndef NACRO_H
|
|
||||||
#define NACRO_H
|
|
||||||
|
|
||||||
#ifdef SWIG
|
|
||||||
%module nacro
|
|
||||||
|
|
||||||
%{
|
|
||||||
|
|
||||||
/* types used */
|
|
||||||
|
|
||||||
/* 0=false, every other value=true */
|
|
||||||
typedef int bool_t;
|
|
||||||
|
|
||||||
/* a keysym: identical with ASCII for values between 0-127 */
|
|
||||||
typedef int keysym_t;
|
|
||||||
|
|
||||||
/* this can be negative, because of a new origin set via visual grep */
|
|
||||||
typedef int coordinate_t;
|
|
||||||
|
|
||||||
/* left button is 1<<0, middle button is 1<<1, right button is 1<<2 */
|
|
||||||
typedef unsigned char buttons_t;
|
|
||||||
|
|
||||||
/* this is sort of a "file descriptor" for the proxy */
|
|
||||||
typedef int resource_t;
|
|
||||||
|
|
||||||
/* the timeout, specified in microseconds, for process() and friends */
|
|
||||||
typedef double timeout_t;
|
|
||||||
|
|
||||||
/* the return values of process() and friends */
|
|
||||||
typedef int result_t;
|
|
||||||
/*
|
|
||||||
%constant int RESULT_TIMEOUT=1;
|
|
||||||
%constant int RESULT_KEY=2;
|
|
||||||
%constant int RESULT_MOUSE=4;
|
|
||||||
%constant int RESULT_TEXT_CLIENT=8;
|
|
||||||
%constant int RESULT_TEXT_CLIENT=16;
|
|
||||||
%constant int RESULT_SCREEN=32;
|
|
||||||
%constant int RESULT_FOUNDIMAGE=64;
|
|
||||||
%constant int RESULT_SHUTDOWN=128;
|
|
||||||
*/
|
|
||||||
|
|
||||||
%}
|
|
||||||
|
|
||||||
#endif // SWIG
|
|
||||||
|
|
||||||
typedef int bool_t;
|
|
||||||
typedef int keysym_t;
|
|
||||||
typedef int coordinate_t;
|
|
||||||
typedef unsigned char buttons_t;
|
|
||||||
typedef int resource_t;
|
|
||||||
typedef double timeout_t;
|
|
||||||
typedef int result_t;
|
|
||||||
#define RESULT_TIMEOUT 1
|
|
||||||
#define RESULT_KEY 2
|
|
||||||
#define RESULT_MOUSE 4
|
|
||||||
#define RESULT_TEXT_CLIENT 8
|
|
||||||
#define RESULT_TEXT_SERVER 16
|
|
||||||
#define RESULT_SCREEN 32
|
|
||||||
#define RESULT_FOUNDIMAGE 64
|
|
||||||
#define RESULT_SHUTDOWN 128
|
|
||||||
|
|
||||||
/* init/shutdown */
|
|
||||||
|
|
||||||
resource_t initvnc(const char* server,int serverPort,int listenPort);
|
|
||||||
void closevnc(resource_t res);
|
|
||||||
|
|
||||||
/* run the event loop for a while: process() and friends:
|
|
||||||
* process() returns only on timeout,
|
|
||||||
* waitforanything returns on any event (input, output or timeout),
|
|
||||||
* waitforupdate() returns only on timeout or screen update,
|
|
||||||
* waitforinput() returns only on timeout or user input,
|
|
||||||
* visualgrep() returns only on timeout or if the specified PNM was found
|
|
||||||
* (in that case, x_origin and y_origin are set to the upper left
|
|
||||||
* corner of the matched image). */
|
|
||||||
|
|
||||||
result_t process(resource_t res,timeout_t seconds);
|
|
||||||
result_t waitforanything(resource_t res,timeout_t seconds);
|
|
||||||
result_t waitforupdate(resource_t res,timeout_t seconds);
|
|
||||||
result_t waitforinput(resource_t res,timeout_t seconds);
|
|
||||||
result_t visualgrep(resource_t res,const char* filename,timeout_t seconds);
|
|
||||||
|
|
||||||
/* inspect last events */
|
|
||||||
|
|
||||||
keysym_t getkeysym(resource_t res);
|
|
||||||
bool_t getkeydown(resource_t res);
|
|
||||||
|
|
||||||
coordinate_t getx(resource_t res);
|
|
||||||
coordinate_t gety(resource_t res);
|
|
||||||
buttons_t getbuttons(resource_t res);
|
|
||||||
|
|
||||||
const char *gettext_client(resource_t res);
|
|
||||||
const char *gettext_server(resource_t res);
|
|
||||||
|
|
||||||
/* send events to the server */
|
|
||||||
|
|
||||||
bool_t sendkey(resource_t res,keysym_t keysym,bool_t keydown);
|
|
||||||
bool_t sendascii(resource_t res,const char *string);
|
|
||||||
bool_t sendmouse(resource_t res,coordinate_t x,coordinate_t y,buttons_t buttons);
|
|
||||||
bool_t sendtext(resource_t res, const char *string);
|
|
||||||
bool_t sendtext_to_server(resource_t res, const char *string);
|
|
||||||
|
|
||||||
/* for visual grepping */
|
|
||||||
|
|
||||||
coordinate_t getxorigin(resource_t res);
|
|
||||||
coordinate_t getyorigin(resource_t res);
|
|
||||||
|
|
||||||
bool_t savepnm(resource_t res,const char* filename,coordinate_t x1, coordinate_t y1, coordinate_t x2, coordinate_t y2);
|
|
||||||
|
|
||||||
result_t displaypnm(resource_t res, const char *filename, coordinate_t x, coordinate_t y, bool_t border, timeout_t timeout);
|
|
||||||
|
|
||||||
/* this displays an overlay which is shown for a certain time */
|
|
||||||
|
|
||||||
result_t alert(resource_t res,const char* message,timeout_t timeout);
|
|
||||||
|
|
||||||
/* display a rectangular rubber band between (x0, y0) and the current
|
|
||||||
mouse pointer, as long as a button us pressed. */
|
|
||||||
|
|
||||||
result_t rubberband(resource_t res, coordinate_t x0, coordinate_t y0);
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,282 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
use Getopt::Long;
|
|
||||||
use nacro;
|
|
||||||
|
|
||||||
$output="my_script";
|
|
||||||
$server="localhost";
|
|
||||||
$port=5900;
|
|
||||||
$listen_port=5923;
|
|
||||||
$timing=0;
|
|
||||||
$symbolic=0;
|
|
||||||
$compact=0;
|
|
||||||
$compact_dragging=0;
|
|
||||||
|
|
||||||
if(!GetOptions(
|
|
||||||
"script:s" => \$output,
|
|
||||||
"listen:i" => \$listen_port,
|
|
||||||
"timing" => \$timing,
|
|
||||||
"symbolic" => \$symbolic,
|
|
||||||
"compact" => \$compact,
|
|
||||||
"compact-dragging" => \$compact_dragging,
|
|
||||||
) || $#ARGV!=0) {
|
|
||||||
print STDERR "Usage: $ARGV0 [--script output_name] [--listen listen_port] [--timing]\n\t[--symbolic] [--compact] [--compact-dragging] server[:port]\n";
|
|
||||||
exit 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
$output=~s/\.pl$//;
|
|
||||||
|
|
||||||
if ($timing) {
|
|
||||||
eval 'use Time::HiRes';
|
|
||||||
$timing=0 if $@;
|
|
||||||
$starttime=-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($symbolic) {
|
|
||||||
eval 'use X11::Keysyms qw(%Keysyms)';
|
|
||||||
$symbolic=0 if $@;
|
|
||||||
%sym_name = reverse %Keysyms;
|
|
||||||
}
|
|
||||||
|
|
||||||
$server=$ARGV[0];
|
|
||||||
|
|
||||||
if($server=~/^(.*):(\d+)$/) {
|
|
||||||
$server=$1;
|
|
||||||
$port=$2;
|
|
||||||
if($2<100) {
|
|
||||||
$port+=5900;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if($listen_port<100) {
|
|
||||||
$listen_port+=5900;
|
|
||||||
}
|
|
||||||
|
|
||||||
# do not overwrite script
|
|
||||||
|
|
||||||
if(stat("$output.pl")) {
|
|
||||||
print STDERR "Will not overwrite $output.pl\n";
|
|
||||||
exit 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
# start connection
|
|
||||||
$vnc=nacro::initvnc($server,$port,$listen_port);
|
|
||||||
|
|
||||||
if($vnc<0) {
|
|
||||||
print STDERR "Could not initialize $server:$port\n";
|
|
||||||
exit 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
open OUT, ">$output.pl";
|
|
||||||
print OUT "#!/usr/bin/perl\n";
|
|
||||||
print OUT "\n";
|
|
||||||
if ($symbolic) {
|
|
||||||
print OUT "use X11::Keysyms qw(\%sym);\n";
|
|
||||||
}
|
|
||||||
print OUT "use nacro;\n";
|
|
||||||
print OUT "\n";
|
|
||||||
print OUT "\$x_origin=0; \$y_origin=0;\n";
|
|
||||||
print OUT "\$vnc=nacro::initvnc(\"$server\",$port,$listen_port);\n";
|
|
||||||
|
|
||||||
$mode="passthru";
|
|
||||||
$image_counter=1;
|
|
||||||
$magickey=0;
|
|
||||||
$x_origin=0; $y_origin=0;
|
|
||||||
|
|
||||||
sub writetiming () {
|
|
||||||
if ($timing) {
|
|
||||||
$now=Time::HiRes::time();
|
|
||||||
if ($starttime>0) {
|
|
||||||
print OUT "nacro::process(\$vnc," . ($now - $starttime) . ");\n";
|
|
||||||
}
|
|
||||||
$starttime=$now;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$last_button = -1;
|
|
||||||
|
|
||||||
sub handle_mouse {
|
|
||||||
my $x = shift;
|
|
||||||
my $y = shift;
|
|
||||||
my $buttons = shift;
|
|
||||||
if(nacro::sendmouse($vnc,$x,$y,$buttons)) {
|
|
||||||
$x-=$x_origin; $y-=$y_origin;
|
|
||||||
writetiming();
|
|
||||||
print OUT "nacro::sendmouse(\$vnc,\$x_origin"
|
|
||||||
. ($x>=0?"+":"")."$x,\$y_origin"
|
|
||||||
. ($y>=0?"+":"")."$y,$buttons);\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub toggle_text {
|
|
||||||
my $text = shift;
|
|
||||||
if ($text eq "Timing") {
|
|
||||||
return $text . " is " . ($timing ? "on" : "off");
|
|
||||||
} elsif ($text eq "Key presses") {
|
|
||||||
return $text . " are recorded " . ($symbolic ? "symbolically"
|
|
||||||
: "numerically");
|
|
||||||
} elsif ($text eq "Mouse moves") {
|
|
||||||
return $text . " are recorded " . ($compact ? "compacted"
|
|
||||||
: "verbosely");
|
|
||||||
} elsif ($text eq "Mouse drags") {
|
|
||||||
return $text . " are recorded " . ($compact ? "compacted"
|
|
||||||
: "verbosely");
|
|
||||||
}
|
|
||||||
return $text . ": <unknown>";
|
|
||||||
}
|
|
||||||
|
|
||||||
$menu_message = "VisualNaCro: press 'q' to quit,\n"
|
|
||||||
. "'i' to display current settings,\n"
|
|
||||||
. "'c', 'r' to toggle compact mouse movements or drags,\n"
|
|
||||||
. "'d' to display current reference image,\n"
|
|
||||||
. "or mark reference rectangle by dragging";
|
|
||||||
|
|
||||||
while(1) {
|
|
||||||
$result=nacro::waitforinput($vnc,999999);
|
|
||||||
if($result==0) {
|
|
||||||
# server went away
|
|
||||||
close OUT;
|
|
||||||
exit 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if($mode eq "passthru") {
|
|
||||||
if($result&$nacro::RESULT_KEY) {
|
|
||||||
$keysym=nacro::getkeysym($vnc);
|
|
||||||
$keydown=nacro::getkeydown($vnc);
|
|
||||||
if(nacro::sendkey($vnc,$keysym,$keydown)) {
|
|
||||||
writetiming();
|
|
||||||
if ($symbolic and exists $sym_name{$keysym}) {
|
|
||||||
print OUT 'nacro::sendkey($vnc,$sym{'.$sym_name{$keysym}."},$keydown);\n";
|
|
||||||
} else {
|
|
||||||
print OUT "nacro::sendkey(\$vnc,$keysym,$keydown);\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if($keysym==0xffe3 || $keysym==0xffe4) {
|
|
||||||
if (!$keydown) {
|
|
||||||
# Control pressed
|
|
||||||
$magickey++;
|
|
||||||
if ($magickey > 1) {
|
|
||||||
$magickey = 0;
|
|
||||||
$mode = "menu";
|
|
||||||
nacro::alert($vnc,
|
|
||||||
$menu_message, 10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$magickey=0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if($result&$nacro::RESULT_MOUSE) {
|
|
||||||
$x=nacro::getx($vnc);
|
|
||||||
$y=nacro::gety($vnc);
|
|
||||||
$buttons=nacro::getbuttons($vnc);
|
|
||||||
if ($buttons != $last_buttons) {
|
|
||||||
if (!$buttons && $compact_dragging) {
|
|
||||||
handle_mouse($x, $y, $last_buttons);
|
|
||||||
}
|
|
||||||
$last_buttons = $buttons;
|
|
||||||
} else {
|
|
||||||
if (($buttons && $compact_dragging) ||
|
|
||||||
(!$buttons && $compact)) {
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
handle_mouse($x, $y, $buttons);
|
|
||||||
}
|
|
||||||
if ($result & $nacro::RESULT_TEXT_CLIENT) {
|
|
||||||
my $text = nacro::gettext_client($vnc);
|
|
||||||
if (nacro::sendtext($vnc,$text)) {
|
|
||||||
writetiming();
|
|
||||||
print OUT "nacro::sendtext(\$vnc, q(\Q$text\E));\n";
|
|
||||||
print "got text from client: $text\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($result & $nacro::RESULT_TEXT_SERVER) {
|
|
||||||
my $text = nacro::gettext_server($vnc);
|
|
||||||
if (nacro::sendtext_to_server($vnc,$text)) {
|
|
||||||
writetiming();
|
|
||||||
print OUT "nacro::sendtext_to_server(\$vnc, q(\Q$text\E));\n";
|
|
||||||
print "got text from server: $text\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if($result&$nacro::RESULT_KEY) {
|
|
||||||
$keysym=nacro::getkeysym($vnc);
|
|
||||||
$keydown=nacro::getkeydown($vnc);
|
|
||||||
if($keysym==ord('q')) {
|
|
||||||
# shutdown
|
|
||||||
close OUT;
|
|
||||||
nacro::closevnc($vnc);
|
|
||||||
exit 0;
|
|
||||||
} elsif ($keysym == ord('d')) {
|
|
||||||
$pnm=$output.($image_counter - 1).".pnm";
|
|
||||||
$res = nacro::displaypnm($vnc, $pnm,
|
|
||||||
$x_origin, $y_origin, 1, 10);
|
|
||||||
#0, 0, 1, 10);
|
|
||||||
if ($res == 0) {
|
|
||||||
nacro::alert($vnc, "Error displaying "
|
|
||||||
. $pnm, 10);
|
|
||||||
}
|
|
||||||
} elsif ($keysym == ord('i')) {
|
|
||||||
nacro::alert($vnc, "Current settings:\n"
|
|
||||||
. "\n"
|
|
||||||
. "Script: $output\n"
|
|
||||||
. "Server: $server\n"
|
|
||||||
. "Listening on port: $port\n"
|
|
||||||
. toggle_text("Timing") . "\n"
|
|
||||||
. toggle_text("Key presses") . "\n"
|
|
||||||
. toggle_text("Mouse moves") . "\n"
|
|
||||||
. toggle_text("Mouse drags"), 10);
|
|
||||||
} elsif ($keysym == ord('c')) {
|
|
||||||
$compact = !$compact;
|
|
||||||
nacro::alert($vnc,
|
|
||||||
toggle_text("Mouse moves"), 10);
|
|
||||||
} elsif ($keysym == ord('r')) {
|
|
||||||
$compact_dragging = !$compact_dragging;
|
|
||||||
nacro::alert($vnc,
|
|
||||||
toggle_text("Mouse drags"), 10);
|
|
||||||
} else {
|
|
||||||
nacro::alert($vnc,"Unknown key",10);
|
|
||||||
}
|
|
||||||
$mode="passthru";
|
|
||||||
}
|
|
||||||
if($result&$nacro::RESULT_MOUSE) {
|
|
||||||
$x=nacro::getx($vnc);
|
|
||||||
$y=nacro::gety($vnc);
|
|
||||||
$buttons=nacro::getbuttons($vnc);
|
|
||||||
if(($buttons&1)==1) {
|
|
||||||
print STDERR "start draggin: $x $y\n";
|
|
||||||
$start_x=$x;
|
|
||||||
$start_y=$y;
|
|
||||||
nacro::rubberband($vnc, $x, $y);
|
|
||||||
$x=nacro::getx($vnc);
|
|
||||||
$y=nacro::gety($vnc);
|
|
||||||
if($start_x==$x && $start_y==$y) {
|
|
||||||
# reset
|
|
||||||
print OUT "\$x_origin=0; \$y_origin=0;\n";
|
|
||||||
} else {
|
|
||||||
if($start_x>$x) {
|
|
||||||
$dummy=$x; $x=$start_x; $start_x=$dummy;
|
|
||||||
}
|
|
||||||
if($start_y>$y) {
|
|
||||||
$dummy=$y; $y=$start_y; $start_y=$dummy;
|
|
||||||
}
|
|
||||||
$pnm=$output.$image_counter.".pnm";
|
|
||||||
$image_counter++;
|
|
||||||
if(!nacro::savepnm($vnc,$pnm,$start_x,$start_y,$x,$y)) {
|
|
||||||
nacro::alert($vnc,"Saving $pnm failed!",10);
|
|
||||||
} else {
|
|
||||||
$x_origin=$start_x;
|
|
||||||
$y_origin=$start_y;
|
|
||||||
nacro::alert($vnc,"Got new origin: $x_origin $y_origin",10);
|
|
||||||
print OUT "if(nacro::visualgrep(\$vnc,\"$pnm\",999999)) {\n"
|
|
||||||
. "\t\$x_origin=nacro::getxorigin(\$vnc);\n"
|
|
||||||
. "\t\$y_origin=nacro::getyorigin(\$vnc);\n}\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$mode="passthru";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -1,57 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# Run this to generate all the initial makefiles, etc.
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
srcdir=`dirname $0`
|
|
||||||
test -z "$srcdir" && srcdir=.
|
|
||||||
|
|
||||||
DIE=0
|
|
||||||
|
|
||||||
AUTOMAKE=automake-1.4
|
|
||||||
ACLOCAL=aclocal-1.4
|
|
||||||
|
|
||||||
($AUTOMAKE --version) < /dev/null > /dev/null 2>&1 || {
|
|
||||||
AUTOMAKE=automake
|
|
||||||
ACLOCAL=aclocal
|
|
||||||
}
|
|
||||||
|
|
||||||
(autoconf --version) < /dev/null > /dev/null 2>&1 || {
|
|
||||||
echo
|
|
||||||
echo "You must have autoconf installed to compile libvncserver."
|
|
||||||
echo "Download the appropriate package for your distribution,"
|
|
||||||
echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
|
|
||||||
DIE=1
|
|
||||||
}
|
|
||||||
|
|
||||||
($AUTOMAKE --version) < /dev/null > /dev/null 2>&1 || {
|
|
||||||
echo
|
|
||||||
echo "You must have automake installed to compile libvncserver."
|
|
||||||
echo "Get ftp://sourceware.cygnus.com/pub/automake/automake-1.4.tar.gz"
|
|
||||||
echo "(or a newer version if it is available)"
|
|
||||||
DIE=1
|
|
||||||
}
|
|
||||||
|
|
||||||
if test "$DIE" -eq 1; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
(test -f $srcdir/rfb/rfb.h) || {
|
|
||||||
echo "You must run this script in the top-level libvncserver directory"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if test -z "$*"; then
|
|
||||||
echo "I am going to run ./configure with no arguments - if you wish "
|
|
||||||
echo "to pass any to it, please specify them on the $0 command line."
|
|
||||||
fi
|
|
||||||
|
|
||||||
$ACLOCAL $ACLOCAL_FLAGS
|
|
||||||
autoheader
|
|
||||||
$AUTOMAKE --add-missing --copy
|
|
||||||
autoconf
|
|
||||||
|
|
||||||
echo "Running ./configure --enable-maintainer-mode" "$@"
|
|
||||||
$srcdir/configure --enable-maintainer-mode "$@"
|
|
||||||
|
|
||||||
echo "Now type 'make' to compile libvncserver."
|
|
@ -1,60 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
@encodings=();
|
|
||||||
for($i=0;$i<256*5;$i++) {
|
|
||||||
$encodings[$i]="0";
|
|
||||||
}
|
|
||||||
|
|
||||||
$out="";
|
|
||||||
$counter=0;
|
|
||||||
$fontname="default";
|
|
||||||
|
|
||||||
$i=0;
|
|
||||||
$searchfor="";
|
|
||||||
$nullx="0x";
|
|
||||||
|
|
||||||
while(<>) {
|
|
||||||
if(/^FONT (.*)$/) {
|
|
||||||
$fontname=$1;
|
|
||||||
$fontname=~y/\"//d;
|
|
||||||
} elsif(/^ENCODING (.*)$/) {
|
|
||||||
$glyphindex=$1;
|
|
||||||
$searchfor="BBX";
|
|
||||||
$dwidth=0;
|
|
||||||
} elsif(/^DWIDTH (.*) (.*)/) {
|
|
||||||
$dwidth=$1;
|
|
||||||
} elsif(/^BBX (.*) (.*) (.*) (.*)$/) {
|
|
||||||
($width,$height,$x,$y)=($1,$2,$3,$4);
|
|
||||||
@encodings[$glyphindex*5..($glyphindex*5+4)]=($counter,$width,$height,$x,$y);
|
|
||||||
if($dwidth != 0) {
|
|
||||||
$encodings[$glyphindex*5+1]=$dwidth;
|
|
||||||
} else {
|
|
||||||
$dwidth=$width;
|
|
||||||
}
|
|
||||||
$searchfor="BITMAP";
|
|
||||||
} elsif(/^BITMAP/) {
|
|
||||||
$i=1;
|
|
||||||
} elsif($i>0) {
|
|
||||||
if($i>$height) {
|
|
||||||
$i=0;
|
|
||||||
$out.=" /* $glyphindex */\n";
|
|
||||||
} else {
|
|
||||||
if(int(($dwidth+7)/8) > int(($width+7)/8)) {
|
|
||||||
$_ .= "00"x(int(($dwidth+7)/8)-int(($width+7)/8));
|
|
||||||
}
|
|
||||||
$_=substr($_,0,(int(($dwidth+7)/8)*2));
|
|
||||||
$counter+=(int(($dwidth+7)/8));
|
|
||||||
s/(..)/$nullx$1,/g;
|
|
||||||
$out.=$_;
|
|
||||||
$i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
print "unsigned char " . $fontname . "FontData[$counter]={\n" . $out;
|
|
||||||
print "};\nint " . $fontname . "FontMetaData[256*5]={\n";
|
|
||||||
for($i=0;$i<256*5;$i++) {
|
|
||||||
print $encodings[$i] . ",";
|
|
||||||
}
|
|
||||||
print "};\nrfbFontData " . $fontname . "Font={" .
|
|
||||||
$fontname . "FontData, " . $fontname . "FontMetaData};\n";
|
|
@ -1,3 +0,0 @@
|
|||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
|||||||
EXTRA_DIST=VncViewer.jar index.vnc javaviewer.pseudo_proxy.patch
|
|
||||||
|
|
||||||
SUBDIRS = ssl
|
|
||||||
DIST_SUBDIRS = ssl
|
|
||||||
|
|
Binary file not shown.
@ -1,18 +0,0 @@
|
|||||||
<!-- index.vnc - default html page for Java VNC viewer applet. On any file
|
|
||||||
ending in .vnc, the HTTP server embedded in Xvnc will substitute the
|
|
||||||
following variables when preceded by a dollar: USER, DESKTOP, DISPLAY,
|
|
||||||
APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT, PARAMS. Use two dollar
|
|
||||||
signs ($$) to get a dollar sign in the generated html. -->
|
|
||||||
|
|
||||||
<HTML>
|
|
||||||
<TITLE>
|
|
||||||
$USER's $DESKTOP desktop ($DISPLAY)
|
|
||||||
</TITLE>
|
|
||||||
<APPLET CODE=VncViewer.class ARCHIVE=VncViewer.jar
|
|
||||||
WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
|
|
||||||
<param name=PORT value=$PORT>
|
|
||||||
<param name="Open New Window" value=yes>
|
|
||||||
</APPLET>
|
|
||||||
<BR>
|
|
||||||
<A href="http://www.tightvnc.com/">www.TightVNC.com</A>
|
|
||||||
</HTML>
|
|
@ -1,141 +0,0 @@
|
|||||||
diff -ru vnc_javasrc/OptionsFrame.java proxy_vnc_javasrc/OptionsFrame.java
|
|
||||||
--- vnc_javasrc/OptionsFrame.java Fri Jul 5 08:17:23 2002
|
|
||||||
+++ proxy_vnc_javasrc/OptionsFrame.java Thu Aug 22 23:24:44 2002
|
|
||||||
@@ -70,6 +70,12 @@
|
|
||||||
|
|
||||||
Label[] labels = new Label[names.length];
|
|
||||||
Choice[] choices = new Choice[names.length];
|
|
||||||
+
|
|
||||||
+ Label proxyHostLabel;
|
|
||||||
+ TextField proxyHostEdit;
|
|
||||||
+ Label proxyPortLabel;
|
|
||||||
+ TextField proxyPortEdit;
|
|
||||||
+
|
|
||||||
Button closeButton;
|
|
||||||
VncViewer viewer;
|
|
||||||
|
|
||||||
@@ -93,6 +99,9 @@
|
|
||||||
boolean shareDesktop;
|
|
||||||
boolean viewOnly;
|
|
||||||
|
|
||||||
+ String proxyHost;
|
|
||||||
+ int proxyPort;
|
|
||||||
+
|
|
||||||
//
|
|
||||||
// Constructor. Set up the labels and choices from the names and values
|
|
||||||
// arrays.
|
|
||||||
@@ -126,6 +135,32 @@
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+ // TODO: find a way to set these to defaults from browser
|
|
||||||
+ proxyPort = viewer.readIntParameter("Use Proxy Port", -1);
|
|
||||||
+ if(proxyPort>-1) {
|
|
||||||
+ proxyHost = viewer.readParameter("Use Proxy Host", false);
|
|
||||||
+ if(proxyHost == null)
|
|
||||||
+ proxyHost = viewer.host;
|
|
||||||
+
|
|
||||||
+ proxyHostLabel = new Label("Proxy Host");
|
|
||||||
+ gbc.gridwidth = 1;
|
|
||||||
+ gridbag.setConstraints(proxyHostLabel,gbc);
|
|
||||||
+ add(proxyHostLabel);
|
|
||||||
+ proxyHostEdit = new TextField();
|
|
||||||
+ gbc.gridwidth = GridBagConstraints.REMAINDER;
|
|
||||||
+ gridbag.setConstraints(proxyHostEdit,gbc);
|
|
||||||
+ add(proxyHostEdit);
|
|
||||||
+
|
|
||||||
+ proxyPortLabel = new Label("Proxy Port");
|
|
||||||
+ gbc.gridwidth = 1;
|
|
||||||
+ gridbag.setConstraints(proxyPortLabel,gbc);
|
|
||||||
+ add(proxyPortLabel);
|
|
||||||
+ proxyPortEdit = new TextField();
|
|
||||||
+ gbc.gridwidth = GridBagConstraints.REMAINDER;
|
|
||||||
+ gridbag.setConstraints(proxyPortEdit,gbc);
|
|
||||||
+ add(proxyPortEdit);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
closeButton = new Button("Close");
|
|
||||||
gbc.gridwidth = GridBagConstraints.REMAINDER;
|
|
||||||
gridbag.setConstraints(closeButton, gbc);
|
|
||||||
@@ -161,6 +196,11 @@
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if(proxyPort>-1) {
|
|
||||||
+ proxyPortEdit.setText(Integer.toString(proxyPort));
|
|
||||||
+ proxyHostEdit.setText(proxyHost);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
// Make the booleans and encodings array correspond to the state of the GUI
|
|
||||||
|
|
||||||
setEncodings();
|
|
||||||
@@ -361,8 +401,12 @@
|
|
||||||
//
|
|
||||||
|
|
||||||
public void actionPerformed(ActionEvent evt) {
|
|
||||||
- if (evt.getSource() == closeButton)
|
|
||||||
+ if (evt.getSource() == closeButton) {
|
|
||||||
setVisible(false);
|
|
||||||
+ proxyHost = proxyHostEdit.getText();
|
|
||||||
+ proxyPort = Integer.parseInt(proxyPortEdit.getText());
|
|
||||||
+ System.err.println("proxy is " + proxyHost + ":" + proxyPort);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
diff -ru vnc_javasrc/RfbProto.java proxy_vnc_javasrc/RfbProto.java
|
|
||||||
--- vnc_javasrc/RfbProto.java Sun Aug 4 18:39:35 2002
|
|
||||||
+++ proxy_vnc_javasrc/RfbProto.java Thu Aug 22 22:53:53 2002
|
|
||||||
@@ -119,12 +119,51 @@
|
|
||||||
viewer = v;
|
|
||||||
host = h;
|
|
||||||
port = p;
|
|
||||||
- sock = new Socket(host, port);
|
|
||||||
+ if(viewer.options.proxyPort>-1)
|
|
||||||
+ sock = new Socket(viewer.options.proxyHost, viewer.options.proxyPort);
|
|
||||||
+ else
|
|
||||||
+ sock = new Socket(host, port);
|
|
||||||
is = new DataInputStream(new BufferedInputStream(sock.getInputStream(),
|
|
||||||
16384));
|
|
||||||
os = sock.getOutputStream();
|
|
||||||
+ if(viewer.options.proxyPort>-1)
|
|
||||||
+ negotiateProxy(host,port);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ // this is inefficient as hell, but only used once per connection
|
|
||||||
+ String readLine() {
|
|
||||||
+ byte[] ba = new byte[1];
|
|
||||||
+ String s = new String("");
|
|
||||||
+
|
|
||||||
+ ba[0]=0;
|
|
||||||
+ try {
|
|
||||||
+ while(ba[0] != 0xa) {
|
|
||||||
+ ba[0] = (byte)is.readUnsignedByte();
|
|
||||||
+ s += new String(ba);
|
|
||||||
+ }
|
|
||||||
+ } catch(Exception e) {
|
|
||||||
+ e.printStackTrace();
|
|
||||||
+ }
|
|
||||||
+ return s;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ void negotiateProxy(String realHost,int realPort) throws IOException {
|
|
||||||
+ String line;
|
|
||||||
+
|
|
||||||
+ // this would be the correct way, but we want to trick strict proxies.
|
|
||||||
+ // line = "CONNECT " + realHost + ":" + realPort + " HTTP/1.1\r\nHost: " + realHost + ":" + realPort + "\r\n\r\n";
|
|
||||||
+ line = "GET " + realHost + ":" + realPort + "/proxied.connection HTTP/1.0\r\nPragma: No-Cache\r\nProxy-Connection: Keep-Alive\r\n\r\n";
|
|
||||||
+ os.write(line.getBytes());
|
|
||||||
+
|
|
||||||
+ line = readLine();
|
|
||||||
+ System.err.println("Proxy said: " + line);
|
|
||||||
+ if(!(line.substring(0,7)+line.substring(8,12)).equalsIgnoreCase("HTTP/1. 200")) {
|
|
||||||
+ IOException e = new IOException(line);
|
|
||||||
+ throw e;
|
|
||||||
+ }
|
|
||||||
+ while(!line.equals("\r\n") && !line.equals("\n"))
|
|
||||||
+ line = readLine();
|
|
||||||
+ }
|
|
||||||
|
|
||||||
void close() {
|
|
||||||
try {
|
|
@ -1,2 +0,0 @@
|
|||||||
EXTRA_DIST=VncViewer.jar index.vnc SignedVncViewer.jar proxy.vnc README ss_vncviewer onetimekey UltraViewerSSL.jar SignedUltraViewerSSL.jar ultra.vnc ultrasigned.vnc ultraproxy.vnc
|
|
||||||
|
|
@ -1,338 +0,0 @@
|
|||||||
This directory contains a patched Java applet VNC viewer that is SSL
|
|
||||||
enabled.
|
|
||||||
|
|
||||||
The patches in the *.patch files are relative to the source tarball:
|
|
||||||
|
|
||||||
tightvnc-1.3dev7_javasrc.tar.gz
|
|
||||||
|
|
||||||
currently (4/06) available here:
|
|
||||||
|
|
||||||
http://prdownloads.sourceforge.net/vnc-tight/tightvnc-1.3dev7_javasrc.tar.gz?download
|
|
||||||
|
|
||||||
It also includes some simple patches to:
|
|
||||||
|
|
||||||
- fix richcursor colors
|
|
||||||
|
|
||||||
- make the Java Applet cursor (not the cursor drawn to the canvas
|
|
||||||
framebuffer) invisible when it is inside the canvas.
|
|
||||||
|
|
||||||
- allow Tab (and some other) keystrokes to be sent to the vnc
|
|
||||||
server instead of doing widget traversal.
|
|
||||||
|
|
||||||
|
|
||||||
This SSL applet should work with any VNC viewer that has an SSL tunnel in
|
|
||||||
front of it. It has been tested on x11vnc and using the stunnel tunnel
|
|
||||||
to other VNC servers.
|
|
||||||
|
|
||||||
By default this Vnc Viewer will only do SSL. To do unencrypted traffic
|
|
||||||
see the "DisableSSL" applet parameter (e.g. set it to Yes in index.vnc).
|
|
||||||
|
|
||||||
Proxies: they are a general problem with java socket applets (a socket
|
|
||||||
connection does not go through the proxy). See the info in the proxy.vnc
|
|
||||||
file for a workaround. It uses SignedVncViewer.jar which is simply
|
|
||||||
a signed version of VncViewer.jar. The basic idea is the user clicks
|
|
||||||
"Yes" to trust the applet and then it can connect directly to the proxy
|
|
||||||
and issue a CONNECT request.
|
|
||||||
|
|
||||||
This applet has been tested on versions 1.4.2 and 1.5.0 of the Sun
|
|
||||||
Java plugin. It may not work on older releases or different vendor VM's.
|
|
||||||
Send full Java Console output for failures.
|
|
||||||
|
|
||||||
---------------------------------------------------------------
|
|
||||||
Tips:
|
|
||||||
|
|
||||||
When doing single-port proxy connections (e.g. both VNC and HTTPS
|
|
||||||
thru port 5900) it helps to move through the 'do you trust this site'
|
|
||||||
dialogs quickly. x11vnc has to wait to see if the traffic is VNC or
|
|
||||||
HTTP and this can cause timeouts if you don't move thru them quickly.
|
|
||||||
|
|
||||||
You may have to restart your browser completely if it gets into a
|
|
||||||
weird state. For one case we saw the JVM requesting VncViewer.class
|
|
||||||
even when no such file exists.
|
|
||||||
|
|
||||||
|
|
||||||
---------------------------------------------------------------
|
|
||||||
Extras:
|
|
||||||
|
|
||||||
ss_vncviewer (not Java):
|
|
||||||
|
|
||||||
Wrapper script for native VNC viewer to connect to x11vnc in
|
|
||||||
SSL mode. Script launches stunnel(8) and then connects to it
|
|
||||||
via localhost which in turn is then redirected to x11vnc via an
|
|
||||||
SSL tunnel. stunnel(8) must be installed and available in PATH.
|
|
||||||
|
|
||||||
|
|
||||||
Running Java SSL VncViewer from the command line:
|
|
||||||
|
|
||||||
From this directory:
|
|
||||||
|
|
||||||
java -cp ./VncViewer.jar VncViewer HOST <thehost> PORT <theport>
|
|
||||||
|
|
||||||
substitute <thehost> and <theport> with the actual values.
|
|
||||||
You can add any other parameters, e.g.: ignoreProxy yes
|
|
||||||
|
|
||||||
---------------------------------------------------------------
|
|
||||||
UltraVNC:
|
|
||||||
|
|
||||||
The UltraVNC java viewer has also been patched to support SSL. Various
|
|
||||||
bugs in the UltraVNC java viewer were also fixed. This viewer can be
|
|
||||||
useful because is support UltraVNC filetransfer, and so it works on
|
|
||||||
Unix, etc.
|
|
||||||
|
|
||||||
UltraViewerSSL.jar
|
|
||||||
SignedUltraViewerSSL.jar
|
|
||||||
ultra.vnc
|
|
||||||
ultraproxy.vnc
|
|
||||||
ultravnc-102-JavaViewer-ssl-etc.patch
|
|
||||||
|
|
||||||
---------------------------------------------------------------
|
|
||||||
Applet Parameters:
|
|
||||||
|
|
||||||
Some additional applet parameters can be set via the URL, e.g.
|
|
||||||
|
|
||||||
http://host:5800/?param=value
|
|
||||||
http://host:5800/ultra.vnc?param=value
|
|
||||||
https://host:5900/ultra.vnc?param=value
|
|
||||||
|
|
||||||
etc. If running java from command line as show above, it comes
|
|
||||||
in as java ... VncViewer param value ...
|
|
||||||
|
|
||||||
There is a limitation with libvncserver that param and value can
|
|
||||||
only be alphanumeric, underscore, "+" (for space), or "."
|
|
||||||
|
|
||||||
We have added some applet parameters to the stock VNC java
|
|
||||||
viewers. Here are the applet parameters:
|
|
||||||
|
|
||||||
Both TightVNC and UltraVNC Java viewers:
|
|
||||||
|
|
||||||
HOST
|
|
||||||
string, default: none.
|
|
||||||
The Hostname to connect to.
|
|
||||||
|
|
||||||
PORT
|
|
||||||
number, default: 0
|
|
||||||
The VNC server port to connect to.
|
|
||||||
|
|
||||||
Open New Window
|
|
||||||
yes/no, default: no
|
|
||||||
Run applet in separate frame.
|
|
||||||
|
|
||||||
Show Controls
|
|
||||||
yes/no, default: yes
|
|
||||||
Show Controls button panel.
|
|
||||||
|
|
||||||
Show Offline Desktop
|
|
||||||
yes/no, default: no
|
|
||||||
Do we continue showing desktop on remote disconnect?
|
|
||||||
|
|
||||||
Defer screen updates
|
|
||||||
number, default: 20
|
|
||||||
Milliseconds delay
|
|
||||||
|
|
||||||
Defer cursor updates
|
|
||||||
number, default: 10
|
|
||||||
Milliseconds delay
|
|
||||||
|
|
||||||
Defer update requests
|
|
||||||
number, default: 50
|
|
||||||
Milliseconds delay
|
|
||||||
|
|
||||||
PASSWORD
|
|
||||||
string, default: none
|
|
||||||
VNC session password in plain text.
|
|
||||||
|
|
||||||
ENCPASSWORD
|
|
||||||
string, default: none
|
|
||||||
VNC session password in encrypted in DES with KNOWN FIXED
|
|
||||||
key. It is a hex string. This is like the ~/.vnc/passwd format.
|
|
||||||
|
|
||||||
|
|
||||||
The following are added by x11vnc and/or ssvnc project
|
|
||||||
|
|
||||||
VNCSERVERPORT
|
|
||||||
number, default: 0
|
|
||||||
Like PORT, but if there is a firewall this is the Actual VNC
|
|
||||||
server port. PORT might be a redir port on the firewall.
|
|
||||||
|
|
||||||
DisableSSL
|
|
||||||
yes/no, default: no
|
|
||||||
Do unencrypted connection, no SSL.
|
|
||||||
|
|
||||||
httpsPort
|
|
||||||
number, default: none
|
|
||||||
When checking for proxy, use this at the url port number.
|
|
||||||
|
|
||||||
CONNECT
|
|
||||||
string, default: none
|
|
||||||
Sets to host:port for the CONNECT line to a Web proxy.
|
|
||||||
The Web proxy should connect us to it.
|
|
||||||
|
|
||||||
GET
|
|
||||||
yes/no, default: no
|
|
||||||
Set to do a special HTTP GET (/request.https.vnc.connection)
|
|
||||||
to the vnc server that will cause it to switch to VNC instead.
|
|
||||||
This is to speedup/make more robust, the single port HTTPS and VNC
|
|
||||||
mode of x11vnc (e.g. both services thru port 5900, etc)
|
|
||||||
|
|
||||||
urlPrefix
|
|
||||||
string, default: none
|
|
||||||
set to a string that will be prefixed to all URL's when contacting
|
|
||||||
the VNC server. Idea is a special proxy will use this to indicate
|
|
||||||
internal hostname, etc.
|
|
||||||
|
|
||||||
oneTimeKey
|
|
||||||
string, default: none
|
|
||||||
set a special hex "key" to correspond to an SSL X.509 cert+key.
|
|
||||||
See the 'onetimekey' helper script. Can also be PROMPT to prompt
|
|
||||||
the user to paste the hex key string in.
|
|
||||||
|
|
||||||
This provides a Client-Side cert+key that the client will use to
|
|
||||||
authenticate itself by SSL To the VNC Server.
|
|
||||||
|
|
||||||
This is to try to work around the problem that the Java applet
|
|
||||||
cannot keep an SSL keystore on disk, etc. E.g. if they log
|
|
||||||
into an HTTPS website via password they are authenticated and
|
|
||||||
encrypted, then the website can safely put oneTimeKey=... on the
|
|
||||||
URL. The Vncviewer authenticates the VNC server with this key.
|
|
||||||
|
|
||||||
Note that there is currently a problem in that if x11vnc requires
|
|
||||||
Client Certificates the user cannot download the index.vnc HTML
|
|
||||||
and VncViewer.jar from the same x11vnc. Those need to come from
|
|
||||||
a different x11vnc or from a web server.
|
|
||||||
|
|
||||||
Note that the HTTPS website can also put the VNC Password
|
|
||||||
(e.g. a temporary/one-time one) in the parameter PASSWORD.
|
|
||||||
The Java Applet will automatically supply this VNC password
|
|
||||||
instead of prompting.
|
|
||||||
|
|
||||||
serverCert
|
|
||||||
string, default: none
|
|
||||||
set a special hex "cert" to correspond to an SSL X.509 cert
|
|
||||||
See the 'onetimekey -certonly' helper script.
|
|
||||||
|
|
||||||
This provides a Server-Side cert that the client will authenticate
|
|
||||||
the VNC Server against by SSL.
|
|
||||||
|
|
||||||
This is to try to work around the problem that the Java applet
|
|
||||||
cannot keep an SSL keystore on disk, etc. E.g. if they log
|
|
||||||
into an HTTPS website via password they are authenticated and
|
|
||||||
encrypted, then the website can safely put serverCert=... on the
|
|
||||||
URL.
|
|
||||||
|
|
||||||
Of course the VNC Server is sending this string to the Java
|
|
||||||
Applet, so this is only reasonable security if the VNC Viewer
|
|
||||||
already trusts the HTTPS retrieval of the URL + serverCert param
|
|
||||||
that it gets. This should be done over HTTPS not HTTP.
|
|
||||||
|
|
||||||
proxyHost
|
|
||||||
string, default: none
|
|
||||||
Do not try to guess the proxy's hostname, use the value in
|
|
||||||
proxyHost. Does not imply forceProxy (below.)
|
|
||||||
|
|
||||||
proxyPort
|
|
||||||
string, default: none
|
|
||||||
Do not try to guess the proxy's port number, use the value in
|
|
||||||
proxyPort. Does not imply forceProxy (below.)
|
|
||||||
|
|
||||||
forceProxy
|
|
||||||
yes/no, default: no
|
|
||||||
Assume there is a proxy and force its use.
|
|
||||||
|
|
||||||
If a string other than "yes" or "no" is given, it implies "yes"
|
|
||||||
and uses the string for proxyHost and proxyPort (see above).
|
|
||||||
In this case the string must be of the form "hostname+port".
|
|
||||||
Note that it is "+" and not ":" before the port number.
|
|
||||||
|
|
||||||
ignoreProxy
|
|
||||||
yes/no, default: no
|
|
||||||
Don't check for a proxy, assume there is none.
|
|
||||||
|
|
||||||
trustAllVncCerts
|
|
||||||
yes/no, default: no
|
|
||||||
Automatically trust any cert received from the VNC server
|
|
||||||
(obviously this could be dangerous and lead to man in the
|
|
||||||
middle attack). Do not ask the user to verify any of these
|
|
||||||
certs from the VNC server.
|
|
||||||
|
|
||||||
trustUrlVncCert
|
|
||||||
yes/no, default: no
|
|
||||||
Automatically trust any cert that the web browsers has accepted.
|
|
||||||
E.g. the user said "Yes" or "Continue" to a web browser dialog
|
|
||||||
regarding a certificate. If we get the same cert (chain) from
|
|
||||||
the VNC server we trust it without prompting the user.
|
|
||||||
|
|
||||||
debugCerts
|
|
||||||
yes/no, default: no
|
|
||||||
Print out every cert in the Server, TrustUrl, TrustAll chains.
|
|
||||||
|
|
||||||
|
|
||||||
TightVNC Java viewer only:
|
|
||||||
|
|
||||||
Offer Relogin
|
|
||||||
yes/no, default: yes
|
|
||||||
"Offer Relogin" set to "No" disables "Login again"
|
|
||||||
|
|
||||||
SocketFactory
|
|
||||||
string, default: none
|
|
||||||
set Java Socket class factory.
|
|
||||||
|
|
||||||
UltraVNC Java viewer only:
|
|
||||||
|
|
||||||
None.
|
|
||||||
|
|
||||||
The following are added by x11vnc and/or ssvnc project
|
|
||||||
|
|
||||||
ftpDropDown
|
|
||||||
string, default: none
|
|
||||||
Sets the file transfer "drives" dropdown to the "." separated
|
|
||||||
list. Use "+" for space. The default is
|
|
||||||
|
|
||||||
My+Documents.Desktop.Home
|
|
||||||
|
|
||||||
for 3 entries in the dropdown in addition to the "drives"
|
|
||||||
(e.g. C:\) These items should be expanded properly by the VNC
|
|
||||||
Server. x11vnc will prepend $HOME to them, which is normally
|
|
||||||
what one wants. To include a "/" use "_2F_". Another example:
|
|
||||||
|
|
||||||
Home.Desktop.bin_2F_linux
|
|
||||||
|
|
||||||
If an item is prefixed with "TOP_" then the item is inserted at
|
|
||||||
the top of the drop down rather than being appended to the end.
|
|
||||||
E.g. to try to initially load the user homedir instead of /:
|
|
||||||
|
|
||||||
TOP_Home.My+Documents.Desktop
|
|
||||||
|
|
||||||
If ftpDropDown is set to the empty string, "", then no special
|
|
||||||
locations, [Desktop] etc., are placed in the drop down. Only the
|
|
||||||
ultravnc "drives" will appear.
|
|
||||||
|
|
||||||
ftpOnly
|
|
||||||
yes/no, default: no
|
|
||||||
The VNC viewer only shows the filetransfer panel, no desktop
|
|
||||||
is displayed.
|
|
||||||
|
|
||||||
graftFtp
|
|
||||||
yes/no, default: no
|
|
||||||
As ftpOnly, the VNC viewer only shows the filetransfer panel,
|
|
||||||
no desktop is displayed, however it is "grafted" onto an existing
|
|
||||||
SSVNC unix vncviewer. The special SSVNC vncviewer merges the two
|
|
||||||
channels.
|
|
||||||
|
|
||||||
dsmActive
|
|
||||||
yes/no, default: no
|
|
||||||
Special usage mode with the SSVNC unix vncviewer. The UltraVNC
|
|
||||||
DSM encryption is active. Foolishly, UltraVNC DSM encryption
|
|
||||||
*MODIFIES* the VNC protocol when active (it is not a pure tunnel).
|
|
||||||
This option indicates to modify the VNC protocol to make this work.
|
|
||||||
Usually only used with graftFtp and SSVNC unix vncviewer.
|
|
||||||
|
|
||||||
delayAuthPanel
|
|
||||||
yes/no, default: no
|
|
||||||
This is another special usage mode with the SSVNC unix vncviewer.
|
|
||||||
A login panel is delayed (not shown at startup.) Could be useful
|
|
||||||
for non SSVNC usage too.
|
|
||||||
|
|
||||||
ignoreMSLogonCheck
|
|
||||||
yes/no, default: no
|
|
||||||
Similar to delayAuthPanel, do not put up a popup asking for
|
|
||||||
Windows username, etc.
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,26 +0,0 @@
|
|||||||
<!--
|
|
||||||
index.vnc - default HTML page for TightVNC Java viewer applet, to be
|
|
||||||
used with Xvnc. On any file ending in .vnc, the HTTP server embedded in
|
|
||||||
Xvnc will substitute the following variables when preceded by a dollar:
|
|
||||||
USER, DESKTOP, DISPLAY, APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT,
|
|
||||||
PARAMS. Use two dollar signs ($$) to get a dollar sign in the generated
|
|
||||||
HTML page.
|
|
||||||
|
|
||||||
NOTE: the $PARAMS variable is not supported by the standard VNC, so
|
|
||||||
make sure you have TightVNC on the server side, if you're using this
|
|
||||||
variable.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<HTML>
|
|
||||||
<TITLE>
|
|
||||||
$USER's $DESKTOP desktop ($DISPLAY)
|
|
||||||
</TITLE>
|
|
||||||
<APPLET CODE=VncViewer.class ARCHIVE=VncViewer.jar
|
|
||||||
WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
|
|
||||||
<param name=PORT value=$PORT>
|
|
||||||
<param name="Open New Window" value=yes>
|
|
||||||
$PARAMS
|
|
||||||
</APPLET>
|
|
||||||
<BR>
|
|
||||||
<A href="http://www.karlrunge.com/x11vnc">x11vnc site</A>
|
|
||||||
</HTML>
|
|
@ -1,65 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# usage: onetimekey path/to/mycert.pem
|
|
||||||
# onetimekey -certonly path/to/mycert.pem
|
|
||||||
#
|
|
||||||
# Takes an openssl cert+key pem file and turns into a long string
|
|
||||||
# for the x11vnc SSL VNC Java Viewer.
|
|
||||||
#
|
|
||||||
# The Java applet URL parameter can be oneTimeKey=<str> where str is
|
|
||||||
# the output of this program, or can be oneTimeKey=PROMPT in which
|
|
||||||
# case the applet will ask you to paste in the string.
|
|
||||||
#
|
|
||||||
# The problem trying to be solved here is it is difficult to get
|
|
||||||
# the Java applet to have or use a keystore with the key saved
|
|
||||||
# in it. Also, as the name implies, an HTTPS server can create
|
|
||||||
# a one time key to send to the applet (the user has already
|
|
||||||
# logged in via password to the HTTPS server).
|
|
||||||
#
|
|
||||||
# Note oneTimeKey is to provide a CLIENT Certificate for the viewer
|
|
||||||
# to authenticate itself to the VNC Server.
|
|
||||||
#
|
|
||||||
# There is also the serverCert=<str> Applet parameter. This is
|
|
||||||
# a cert to authenticate the VNC server against. To create that
|
|
||||||
# string with this tool specify -certonly as the first argument.
|
|
||||||
|
|
||||||
certonly=""
|
|
||||||
if [ "X$1" = "X-certonly" ]; then
|
|
||||||
shift
|
|
||||||
certonly=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
in=$1
|
|
||||||
der=/tmp/1time$$.der
|
|
||||||
touch $der
|
|
||||||
chmod 600 $der
|
|
||||||
|
|
||||||
openssl pkcs8 -topk8 -nocrypt -in "$in" -out "$der" -outform der
|
|
||||||
|
|
||||||
pbinhex=/tmp/pbinhex.$$
|
|
||||||
cat > $pbinhex <<END
|
|
||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
\$str = '';
|
|
||||||
while (1) {
|
|
||||||
\$c = getc(STDIN);
|
|
||||||
last if \$c eq '';
|
|
||||||
\$str .= sprintf("%02x", unpack("C", \$c));
|
|
||||||
}
|
|
||||||
|
|
||||||
print "\$str\n";
|
|
||||||
END
|
|
||||||
|
|
||||||
chmod 700 $pbinhex
|
|
||||||
|
|
||||||
str1=`$pbinhex < "$der"`
|
|
||||||
rm -f "$der"
|
|
||||||
|
|
||||||
n=`grep -n 'BEGIN CERTIFICATE' $in | awk -F: '{print $1}' | head -1`
|
|
||||||
str2=`tail +$n $in | $pbinhex`
|
|
||||||
if [ "X$certonly" = "X1" ]; then
|
|
||||||
echo "$str2"
|
|
||||||
else
|
|
||||||
echo "$str1,$str2"
|
|
||||||
fi
|
|
||||||
rm -f $pbinhex
|
|
@ -1,73 +0,0 @@
|
|||||||
<!--
|
|
||||||
index.vnc - default HTML page for TightVNC Java viewer applet, to be
|
|
||||||
used with Xvnc. On any file ending in .vnc, the HTTP server embedded in
|
|
||||||
Xvnc will substitute the following variables when preceded by a dollar:
|
|
||||||
USER, DESKTOP, DISPLAY, APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT,
|
|
||||||
PARAMS. Use two dollar signs ($$) to get a dollar sign in the generated
|
|
||||||
HTML page.
|
|
||||||
|
|
||||||
NOTE: the $PARAMS variable is not supported by the standard VNC, so
|
|
||||||
make sure you have TightVNC on the server side, if you're using this
|
|
||||||
variable.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
The idea behind using the signed applet in SignedVncViewer.jar for
|
|
||||||
firewall proxies:
|
|
||||||
|
|
||||||
Java socket applets and http proxies do not get along well.
|
|
||||||
|
|
||||||
Java security allows the applet to connect back via a socket to the
|
|
||||||
originating host, but the browser/plugin Proxy settings are not used for
|
|
||||||
socket connections (only http and the like). So the socket connection
|
|
||||||
fails in the proxy environment.
|
|
||||||
|
|
||||||
The applet is not allowed to open a socket connection to the proxy (since
|
|
||||||
that would let it connect to just about any host, e.g. CONNECT method).
|
|
||||||
|
|
||||||
This is indpendent of SSL but of course fails for that socket connection
|
|
||||||
as well. I.e. this is a problem for non-SSL VNC Viewers as well.
|
|
||||||
|
|
||||||
Solution? Sign the applet and have the user click on "Yes" that they
|
|
||||||
fully trust the applet. Then the applet can connect to any host via
|
|
||||||
sockets, in particular the proxy. It next issues the request
|
|
||||||
|
|
||||||
CONNECT host:port HTTP/1.1
|
|
||||||
Host: host:port
|
|
||||||
|
|
||||||
and if the proxy supports the CONNECT method we are finally connected to
|
|
||||||
the VNC server.
|
|
||||||
|
|
||||||
For SSL connections, SSL is layered on top of this socket. However note
|
|
||||||
this scheme will work for non-SSL applet proxy tunnelling as well.
|
|
||||||
|
|
||||||
It should be able to get non-SSL VNC connections to work via GET
|
|
||||||
command but that has not been done yet.
|
|
||||||
|
|
||||||
Note that some proxies only allow CONNECT to only these the ports 443
|
|
||||||
(HTTPS) and 563 (SNEWS). So you would have to run the VNC server on
|
|
||||||
those ports.
|
|
||||||
|
|
||||||
SignedVncViewer.jar is just a signed version of VncViewer.jar
|
|
||||||
|
|
||||||
The URL to use for this file: https://host:port/proxy.vnc
|
|
||||||
|
|
||||||
Note VNCSERVERPORT, we assume $PARAMS will have the correct PORT setting
|
|
||||||
(e.g. 563), not the one libvncserver puts in....
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
<HTML>
|
|
||||||
<TITLE>
|
|
||||||
$USER's $DESKTOP desktop ($DISPLAY)
|
|
||||||
</TITLE>
|
|
||||||
<APPLET CODE=VncViewer.class ARCHIVE=SignedVncViewer.jar
|
|
||||||
WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
|
|
||||||
<param name=VNCSERVERPORT value=$PORT>
|
|
||||||
<param name="Open New Window" value=yes>
|
|
||||||
$PARAMS
|
|
||||||
</APPLET>
|
|
||||||
<BR>
|
|
||||||
<A href="http://www.karlrunge.com/x11vnc">x11vnc site</A>
|
|
||||||
</HTML>
|
|
File diff suppressed because it is too large
Load Diff
@ -1,57 +0,0 @@
|
|||||||
--- vnc_javasrc.orig/VncCanvas.java 2004-10-10 02:15:54.000000000 -0400
|
|
||||||
+++ vnc_javasrc/VncCanvas.java 2006-03-27 22:34:02.000000000 -0500
|
|
||||||
@@ -28,6 +28,7 @@
|
|
||||||
import java.lang.*;
|
|
||||||
import java.util.zip.*;
|
|
||||||
|
|
||||||
+import java.util.Collections;
|
|
||||||
|
|
||||||
//
|
|
||||||
// VncCanvas is a subclass of Canvas which draws a VNC desktop on it.
|
|
||||||
@@ -81,6 +82,20 @@
|
|
||||||
cm8 = new DirectColorModel(8, 7, (7 << 3), (3 << 6));
|
|
||||||
cm24 = new DirectColorModel(24, 0xFF0000, 0x00FF00, 0x0000FF);
|
|
||||||
|
|
||||||
+ // kludge to not show any Java cursor in the canvas since we are
|
|
||||||
+ // showing the soft cursor (should be a user setting...)
|
|
||||||
+ Cursor dot = Toolkit.getDefaultToolkit().createCustomCursor(
|
|
||||||
+ Toolkit.getDefaultToolkit().createImage(new byte[4]), new Point(0,0),
|
|
||||||
+ "dot");
|
|
||||||
+ this.setCursor(dot);
|
|
||||||
+
|
|
||||||
+ // while we are at it... get rid of the keyboard traversals that
|
|
||||||
+ // make it so we can't type a Tab character:
|
|
||||||
+ this.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,
|
|
||||||
+ Collections.EMPTY_SET);
|
|
||||||
+ this.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS,
|
|
||||||
+ Collections.EMPTY_SET);
|
|
||||||
+
|
|
||||||
colors = new Color[256];
|
|
||||||
for (int i = 0; i < 256; i++)
|
|
||||||
colors[i] = new Color(cm8.getRGB(i));
|
|
||||||
@@ -1387,9 +1402,9 @@
|
|
||||||
result = cm8.getRGB(pixBuf[i]);
|
|
||||||
} else {
|
|
||||||
result = 0xFF000000 |
|
|
||||||
- (pixBuf[i * 4 + 1] & 0xFF) << 16 |
|
|
||||||
- (pixBuf[i * 4 + 2] & 0xFF) << 8 |
|
|
||||||
- (pixBuf[i * 4 + 3] & 0xFF);
|
|
||||||
+ (pixBuf[i * 4 + 2] & 0xFF) << 16 |
|
|
||||||
+ (pixBuf[i * 4 + 1] & 0xFF) << 8 |
|
|
||||||
+ (pixBuf[i * 4 + 0] & 0xFF);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
result = 0; // Transparent pixel
|
|
||||||
@@ -1403,9 +1418,9 @@
|
|
||||||
result = cm8.getRGB(pixBuf[i]);
|
|
||||||
} else {
|
|
||||||
result = 0xFF000000 |
|
|
||||||
- (pixBuf[i * 4 + 1] & 0xFF) << 16 |
|
|
||||||
- (pixBuf[i * 4 + 2] & 0xFF) << 8 |
|
|
||||||
- (pixBuf[i * 4 + 3] & 0xFF);
|
|
||||||
+ (pixBuf[i * 4 + 2] & 0xFF) << 16 |
|
|
||||||
+ (pixBuf[i * 4 + 1] & 0xFF) << 8 |
|
|
||||||
+ (pixBuf[i * 4 + 0] & 0xFF);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
result = 0; // Transparent pixel
|
|
File diff suppressed because it is too large
Load Diff
@ -1,28 +0,0 @@
|
|||||||
<!--
|
|
||||||
index.vnc - default HTML page for TightVNC Java viewer applet, to be
|
|
||||||
used with Xvnc. On any file ending in .vnc, the HTTP server embedded in
|
|
||||||
Xvnc will substitute the following variables when preceded by a dollar:
|
|
||||||
USER, DESKTOP, DISPLAY, APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT,
|
|
||||||
PARAMS. Use two dollar signs ($$) to get a dollar sign in the generated
|
|
||||||
HTML page.
|
|
||||||
|
|
||||||
NOTE: the $PARAMS variable is not supported by the standard VNC, so
|
|
||||||
make sure you have TightVNC on the server side, if you're using this
|
|
||||||
variable.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<HTML>
|
|
||||||
<TITLE>
|
|
||||||
$USER's $DESKTOP desktop ($DISPLAY)
|
|
||||||
</TITLE>
|
|
||||||
<APPLET CODE=VncViewer.class ARCHIVE=UltraViewerSSL.jar
|
|
||||||
WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
|
|
||||||
<param name=PORT value=$PORT>
|
|
||||||
<param name="Open New Window" value=yes>
|
|
||||||
<param name="ignoreMSLogonCheck" value=yes>
|
|
||||||
<param name="delayAuthPanel" value=yes>
|
|
||||||
$PARAMS
|
|
||||||
</APPLET>
|
|
||||||
<BR>
|
|
||||||
<A href="http://www.karlrunge.com/x11vnc">x11vnc site</A>
|
|
||||||
</HTML>
|
|
@ -1,28 +0,0 @@
|
|||||||
<!--
|
|
||||||
index.vnc - default HTML page for TightVNC Java viewer applet, to be
|
|
||||||
used with Xvnc. On any file ending in .vnc, the HTTP server embedded in
|
|
||||||
Xvnc will substitute the following variables when preceded by a dollar:
|
|
||||||
USER, DESKTOP, DISPLAY, APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT,
|
|
||||||
PARAMS. Use two dollar signs ($$) to get a dollar sign in the generated
|
|
||||||
HTML page.
|
|
||||||
|
|
||||||
NOTE: the $PARAMS variable is not supported by the standard VNC, so
|
|
||||||
make sure you have TightVNC on the server side, if you're using this
|
|
||||||
variable.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<HTML>
|
|
||||||
<TITLE>
|
|
||||||
$USER's $DESKTOP desktop ($DISPLAY)
|
|
||||||
</TITLE>
|
|
||||||
<APPLET CODE=VncViewer.class ARCHIVE=SignedUltraViewerSSL.jar
|
|
||||||
WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
|
|
||||||
<param name="Open New Window" value=yes>
|
|
||||||
<param name="ignoreMSLogonCheck" value=yes>
|
|
||||||
<param name="delayAuthPanel" value=yes>
|
|
||||||
<param name=VNCSERVERPORT value=$PORT>
|
|
||||||
$PARAMS
|
|
||||||
</APPLET>
|
|
||||||
<BR>
|
|
||||||
<A href="http://www.karlrunge.com/x11vnc">x11vnc site</A>
|
|
||||||
</HTML>
|
|
@ -1,28 +0,0 @@
|
|||||||
<!--
|
|
||||||
index.vnc - default HTML page for TightVNC Java viewer applet, to be
|
|
||||||
used with Xvnc. On any file ending in .vnc, the HTTP server embedded in
|
|
||||||
Xvnc will substitute the following variables when preceded by a dollar:
|
|
||||||
USER, DESKTOP, DISPLAY, APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT,
|
|
||||||
PARAMS. Use two dollar signs ($$) to get a dollar sign in the generated
|
|
||||||
HTML page.
|
|
||||||
|
|
||||||
NOTE: the $PARAMS variable is not supported by the standard VNC, so
|
|
||||||
make sure you have TightVNC on the server side, if you're using this
|
|
||||||
variable.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<HTML>
|
|
||||||
<TITLE>
|
|
||||||
$USER's $DESKTOP desktop ($DISPLAY)
|
|
||||||
</TITLE>
|
|
||||||
<APPLET CODE=VncViewer.class ARCHIVE=SignedUltraViewerSSL.jar
|
|
||||||
WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
|
|
||||||
<param name=PORT value=$PORT>
|
|
||||||
<param name="Open New Window" value=yes>
|
|
||||||
<param name="ignoreMSLogonCheck" value=yes>
|
|
||||||
<param name="delayAuthPanel" value=yes>
|
|
||||||
$PARAMS
|
|
||||||
</APPLET>
|
|
||||||
<BR>
|
|
||||||
<A href="http://www.karlrunge.com/x11vnc">x11vnc site</A>
|
|
||||||
</HTML>
|
|
File diff suppressed because it is too large
Load Diff
@ -1,9 +0,0 @@
|
|||||||
.deps
|
|
||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
SDLvncviewer
|
|
||||||
ppmtest
|
|
||||||
vnc2mpg
|
|
||||||
*.avi
|
|
||||||
*.mpg
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
|||||||
INCLUDES = -I$(top_srcdir)
|
|
||||||
LDADD = ../libvncclient/libvncclient.la @WSOCKLIB@
|
|
||||||
|
|
||||||
if WITH_FFMPEG
|
|
||||||
FFMPEG_HOME=@with_ffmpeg@
|
|
||||||
|
|
||||||
if HAVE_MP3LAME
|
|
||||||
MP3LAME_LIB=-lmp3lame
|
|
||||||
endif
|
|
||||||
|
|
||||||
vnc2mpg_CFLAGS=-I$(FFMPEG_HOME)/libavformat -I$(FFMPEG_HOME)/libavcodec -I$(FFMPEG_HOME)/libavutil
|
|
||||||
vnc2mpg_LDADD=$(LDADD) $(FFMPEG_HOME)/libavformat/libavformat.a $(FFMPEG_HOME)/libavcodec/libavcodec.a $(MP3LAME_LIB) -lm
|
|
||||||
|
|
||||||
FFMPEG_CLIENT=vnc2mpg
|
|
||||||
endif
|
|
||||||
|
|
||||||
if HAVE_LIBSDL
|
|
||||||
SDLVIEWER=SDLvncviewer
|
|
||||||
|
|
||||||
SDLvncviewer_CFLAGS=$(SDL_CFLAGS)
|
|
||||||
|
|
||||||
if HAVE_X11
|
|
||||||
X11_LIB=-lX11
|
|
||||||
endif
|
|
||||||
|
|
||||||
# thanks to autoconf, this looks ugly
|
|
||||||
SDLvncviewer_LDADD=$(LDADD) $(SDL_LIBS) $(X11_LIB)
|
|
||||||
endif
|
|
||||||
|
|
||||||
noinst_PROGRAMS=ppmtest $(SDLVIEWER) $(FFMPEG_CLIENT) backchannel
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,553 +0,0 @@
|
|||||||
#include <SDL.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <rfb/rfbclient.h>
|
|
||||||
#include "scrap.c"
|
|
||||||
|
|
||||||
struct { int sdl; int rfb; } buttonMapping[]={
|
|
||||||
{1, rfbButton1Mask},
|
|
||||||
{2, rfbButton2Mask},
|
|
||||||
{3, rfbButton3Mask},
|
|
||||||
{4, rfbButton4Mask},
|
|
||||||
{5, rfbButton5Mask},
|
|
||||||
{0,0}
|
|
||||||
};
|
|
||||||
|
|
||||||
static int enableResizable, viewOnly, listenLoop, buttonMask;
|
|
||||||
#ifdef SDL_ASYNCBLIT
|
|
||||||
int sdlFlags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL;
|
|
||||||
#else
|
|
||||||
int sdlFlags = SDL_HWSURFACE | SDL_HWACCEL;
|
|
||||||
#endif
|
|
||||||
static int realWidth, realHeight, bytesPerPixel, rowStride;
|
|
||||||
static char *sdlPixels;
|
|
||||||
|
|
||||||
static int rightAltKeyDown, leftAltKeyDown;
|
|
||||||
|
|
||||||
static rfbBool resize(rfbClient* client) {
|
|
||||||
int width=client->width,height=client->height,
|
|
||||||
depth=client->format.bitsPerPixel;
|
|
||||||
|
|
||||||
if (enableResizable)
|
|
||||||
sdlFlags |= SDL_RESIZABLE;
|
|
||||||
|
|
||||||
client->updateRect.x = client->updateRect.y = 0;
|
|
||||||
client->updateRect.w = width; client->updateRect.h = height;
|
|
||||||
rfbBool okay=SDL_VideoModeOK(width,height,depth,sdlFlags);
|
|
||||||
if(!okay)
|
|
||||||
for(depth=24;!okay && depth>4;depth/=2)
|
|
||||||
okay=SDL_VideoModeOK(width,height,depth,sdlFlags);
|
|
||||||
if(okay) {
|
|
||||||
SDL_Surface* sdl=SDL_SetVideoMode(width,height,depth,sdlFlags);
|
|
||||||
rfbClientSetClientData(client, SDL_Init, sdl);
|
|
||||||
client->width = sdl->pitch / (depth / 8);
|
|
||||||
if (sdlPixels) {
|
|
||||||
free(client->frameBuffer);
|
|
||||||
sdlPixels = NULL;
|
|
||||||
}
|
|
||||||
client->frameBuffer=sdl->pixels;
|
|
||||||
|
|
||||||
client->format.bitsPerPixel=depth;
|
|
||||||
client->format.redShift=sdl->format->Rshift;
|
|
||||||
client->format.greenShift=sdl->format->Gshift;
|
|
||||||
client->format.blueShift=sdl->format->Bshift;
|
|
||||||
client->format.redMax=sdl->format->Rmask>>client->format.redShift;
|
|
||||||
client->format.greenMax=sdl->format->Gmask>>client->format.greenShift;
|
|
||||||
client->format.blueMax=sdl->format->Bmask>>client->format.blueShift;
|
|
||||||
SetFormatAndEncodings(client);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
SDL_Surface* sdl=rfbClientGetClientData(client, SDL_Init);
|
|
||||||
rfbClientLog("Could not set resolution %dx%d!\n",
|
|
||||||
client->width,client->height);
|
|
||||||
if(sdl) {
|
|
||||||
client->width=sdl->pitch / (depth / 8);
|
|
||||||
client->height=sdl->h;
|
|
||||||
} else {
|
|
||||||
client->width=0;
|
|
||||||
client->height=0;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
SDL_WM_SetCaption(client->desktopName, "SDL");
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static rfbKeySym SDL_key2rfbKeySym(SDL_KeyboardEvent* e) {
|
|
||||||
rfbKeySym k = 0;
|
|
||||||
switch(e->keysym.sym) {
|
|
||||||
case SDLK_BACKSPACE: k = XK_BackSpace; break;
|
|
||||||
case SDLK_TAB: k = XK_Tab; break;
|
|
||||||
case SDLK_CLEAR: k = XK_Clear; break;
|
|
||||||
case SDLK_RETURN: k = XK_Return; break;
|
|
||||||
case SDLK_PAUSE: k = XK_Pause; break;
|
|
||||||
case SDLK_ESCAPE: k = XK_Escape; break;
|
|
||||||
case SDLK_SPACE: k = XK_space; break;
|
|
||||||
case SDLK_DELETE: k = XK_Delete; break;
|
|
||||||
case SDLK_KP0: k = XK_KP_0; break;
|
|
||||||
case SDLK_KP1: k = XK_KP_1; break;
|
|
||||||
case SDLK_KP2: k = XK_KP_2; break;
|
|
||||||
case SDLK_KP3: k = XK_KP_3; break;
|
|
||||||
case SDLK_KP4: k = XK_KP_4; break;
|
|
||||||
case SDLK_KP5: k = XK_KP_5; break;
|
|
||||||
case SDLK_KP6: k = XK_KP_6; break;
|
|
||||||
case SDLK_KP7: k = XK_KP_7; break;
|
|
||||||
case SDLK_KP8: k = XK_KP_8; break;
|
|
||||||
case SDLK_KP9: k = XK_KP_9; break;
|
|
||||||
case SDLK_KP_PERIOD: k = XK_KP_Decimal; break;
|
|
||||||
case SDLK_KP_DIVIDE: k = XK_KP_Divide; break;
|
|
||||||
case SDLK_KP_MULTIPLY: k = XK_KP_Multiply; break;
|
|
||||||
case SDLK_KP_MINUS: k = XK_KP_Subtract; break;
|
|
||||||
case SDLK_KP_PLUS: k = XK_KP_Add; break;
|
|
||||||
case SDLK_KP_ENTER: k = XK_KP_Enter; break;
|
|
||||||
case SDLK_KP_EQUALS: k = XK_KP_Equal; break;
|
|
||||||
case SDLK_UP: k = XK_Up; break;
|
|
||||||
case SDLK_DOWN: k = XK_Down; break;
|
|
||||||
case SDLK_RIGHT: k = XK_Right; break;
|
|
||||||
case SDLK_LEFT: k = XK_Left; break;
|
|
||||||
case SDLK_INSERT: k = XK_Insert; break;
|
|
||||||
case SDLK_HOME: k = XK_Home; break;
|
|
||||||
case SDLK_END: k = XK_End; break;
|
|
||||||
case SDLK_PAGEUP: k = XK_Page_Up; break;
|
|
||||||
case SDLK_PAGEDOWN: k = XK_Page_Down; break;
|
|
||||||
case SDLK_F1: k = XK_F1; break;
|
|
||||||
case SDLK_F2: k = XK_F2; break;
|
|
||||||
case SDLK_F3: k = XK_F3; break;
|
|
||||||
case SDLK_F4: k = XK_F4; break;
|
|
||||||
case SDLK_F5: k = XK_F5; break;
|
|
||||||
case SDLK_F6: k = XK_F6; break;
|
|
||||||
case SDLK_F7: k = XK_F7; break;
|
|
||||||
case SDLK_F8: k = XK_F8; break;
|
|
||||||
case SDLK_F9: k = XK_F9; break;
|
|
||||||
case SDLK_F10: k = XK_F10; break;
|
|
||||||
case SDLK_F11: k = XK_F11; break;
|
|
||||||
case SDLK_F12: k = XK_F12; break;
|
|
||||||
case SDLK_F13: k = XK_F13; break;
|
|
||||||
case SDLK_F14: k = XK_F14; break;
|
|
||||||
case SDLK_F15: k = XK_F15; break;
|
|
||||||
case SDLK_NUMLOCK: k = XK_Num_Lock; break;
|
|
||||||
case SDLK_CAPSLOCK: k = XK_Caps_Lock; break;
|
|
||||||
case SDLK_SCROLLOCK: k = XK_Scroll_Lock; break;
|
|
||||||
case SDLK_RSHIFT: k = XK_Shift_R; break;
|
|
||||||
case SDLK_LSHIFT: k = XK_Shift_L; break;
|
|
||||||
case SDLK_RCTRL: k = XK_Control_R; break;
|
|
||||||
case SDLK_LCTRL: k = XK_Control_L; break;
|
|
||||||
case SDLK_RALT: k = XK_Alt_R; break;
|
|
||||||
case SDLK_LALT: k = XK_Alt_L; break;
|
|
||||||
case SDLK_RMETA: k = XK_Meta_R; break;
|
|
||||||
case SDLK_LMETA: k = XK_Meta_L; break;
|
|
||||||
#if 0
|
|
||||||
/* TODO: find out keysyms */
|
|
||||||
case SDLK_LSUPER: k = XK_LSuper; break; /* left "windows" key */
|
|
||||||
case SDLK_RSUPER: k = XK_RSuper; break; /* right "windows" key */
|
|
||||||
case SDLK_COMPOSE: k = XK_Compose; break;
|
|
||||||
#endif
|
|
||||||
case SDLK_MODE: k = XK_Mode_switch; break;
|
|
||||||
case SDLK_HELP: k = XK_Help; break;
|
|
||||||
case SDLK_PRINT: k = XK_Print; break;
|
|
||||||
case SDLK_SYSREQ: k = XK_Sys_Req; break;
|
|
||||||
case SDLK_BREAK: k = XK_Break; break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
if (k == 0 && e->keysym.sym >= SDLK_a && e->keysym.sym <= SDLK_z) {
|
|
||||||
k = XK_a + e->keysym.sym - SDLK_a;
|
|
||||||
if (e->keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT))
|
|
||||||
k &= ~0x20;
|
|
||||||
}
|
|
||||||
if (k == 0) {
|
|
||||||
if (e->keysym.unicode < 0x100)
|
|
||||||
k = e->keysym.unicode;
|
|
||||||
else
|
|
||||||
rfbClientLog("Unknown keysym: %d\n",e->keysym.sym);
|
|
||||||
}
|
|
||||||
|
|
||||||
return k;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t get(rfbClient *cl, int x, int y)
|
|
||||||
{
|
|
||||||
switch (bytesPerPixel) {
|
|
||||||
case 1: return ((uint8_t *)cl->frameBuffer)[x + y * cl->width];
|
|
||||||
case 2: return ((uint16_t *)cl->frameBuffer)[x + y * cl->width];
|
|
||||||
case 4: return ((uint32_t *)cl->frameBuffer)[x + y * cl->width];
|
|
||||||
default:
|
|
||||||
rfbClientErr("Unknown bytes/pixel: %d", bytesPerPixel);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void put(int x, int y, uint32_t v)
|
|
||||||
{
|
|
||||||
switch (bytesPerPixel) {
|
|
||||||
case 1: ((uint8_t *)sdlPixels)[x + y * rowStride] = v; break;
|
|
||||||
case 2: ((uint16_t *)sdlPixels)[x + y * rowStride] = v; break;
|
|
||||||
case 4: ((uint32_t *)sdlPixels)[x + y * rowStride] = v; break;
|
|
||||||
default:
|
|
||||||
rfbClientErr("Unknown bytes/pixel: %d", bytesPerPixel);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void resizeRectangleToReal(rfbClient *cl, int x, int y, int w, int h)
|
|
||||||
{
|
|
||||||
int i0 = x * realWidth / cl->width;
|
|
||||||
int i1 = ((x + w) * realWidth - 1) / cl->width + 1;
|
|
||||||
int j0 = y * realHeight / cl->height;
|
|
||||||
int j1 = ((y + h) * realHeight - 1) / cl->height + 1;
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
for (j = j0; j < j1; j++)
|
|
||||||
for (i = i0; i < i1; i++) {
|
|
||||||
int x0 = i * cl->width / realWidth;
|
|
||||||
int x1 = ((i + 1) * cl->width - 1) / realWidth + 1;
|
|
||||||
int y0 = j * cl->height / realHeight;
|
|
||||||
int y1 = ((j + 1) * cl->height - 1) / realHeight + 1;
|
|
||||||
uint32_t r = 0, g = 0, b = 0;
|
|
||||||
|
|
||||||
for (y = y0; y < y1; y++)
|
|
||||||
for (x = x0; x < x1; x++) {
|
|
||||||
uint32_t v = get(cl, x, y);
|
|
||||||
#define REDSHIFT cl->format.redShift
|
|
||||||
#define REDMAX cl->format.redMax
|
|
||||||
#define GREENSHIFT cl->format.greenShift
|
|
||||||
#define GREENMAX cl->format.greenMax
|
|
||||||
#define BLUESHIFT cl->format.blueShift
|
|
||||||
#define BLUEMAX cl->format.blueMax
|
|
||||||
r += (v >> REDSHIFT) & REDMAX;
|
|
||||||
g += (v >> GREENSHIFT) & GREENMAX;
|
|
||||||
b += (v >> BLUESHIFT) & BLUEMAX;
|
|
||||||
}
|
|
||||||
r /= (x1 - x0) * (y1 - y0);
|
|
||||||
g /= (x1 - x0) * (y1 - y0);
|
|
||||||
b /= (x1 - x0) * (y1 - y0);
|
|
||||||
|
|
||||||
put(i, j, (r << REDSHIFT) | (g << GREENSHIFT) |
|
|
||||||
(b << BLUESHIFT));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void update(rfbClient* cl,int x,int y,int w,int h) {
|
|
||||||
if (sdlPixels) {
|
|
||||||
resizeRectangleToReal(cl, x, y, w, h);
|
|
||||||
w = ((x + w) * realWidth - 1) / cl->width + 1;
|
|
||||||
h = ((y + h) * realHeight - 1) / cl->height + 1;
|
|
||||||
x = x * realWidth / cl->width;
|
|
||||||
y = y * realHeight / cl->height;
|
|
||||||
w -= x;
|
|
||||||
h -= y;
|
|
||||||
}
|
|
||||||
SDL_UpdateRect(rfbClientGetClientData(cl, SDL_Init), x, y, w, h);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void setRealDimension(rfbClient *client, int w, int h)
|
|
||||||
{
|
|
||||||
SDL_Surface* sdl;
|
|
||||||
|
|
||||||
if (w < 0) {
|
|
||||||
const SDL_VideoInfo *info = SDL_GetVideoInfo();
|
|
||||||
w = info->current_h;
|
|
||||||
h = info->current_w;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (w == realWidth && h == realHeight)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!sdlPixels) {
|
|
||||||
int size;
|
|
||||||
|
|
||||||
sdlPixels = (char *)client->frameBuffer;
|
|
||||||
rowStride = client->width;
|
|
||||||
|
|
||||||
bytesPerPixel = client->format.bitsPerPixel / 8;
|
|
||||||
size = client->width * bytesPerPixel * client->height;
|
|
||||||
client->frameBuffer = malloc(size);
|
|
||||||
if (!client->frameBuffer) {
|
|
||||||
rfbClientErr("Could not allocate %d bytes", size);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
memcpy(client->frameBuffer, sdlPixels, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
sdl = rfbClientGetClientData(client, SDL_Init);
|
|
||||||
if (sdl->w != w || sdl->h != h) {
|
|
||||||
int depth = sdl->format->BitsPerPixel;
|
|
||||||
sdl = SDL_SetVideoMode(w, h, depth, sdlFlags);
|
|
||||||
rfbClientSetClientData(client, SDL_Init, sdl);
|
|
||||||
sdlPixels = sdl->pixels;
|
|
||||||
rowStride = sdl->pitch / (depth / 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
realWidth = w;
|
|
||||||
realHeight = h;
|
|
||||||
update(client, 0, 0, client->width, client->height);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void kbd_leds(rfbClient* cl, int value, int pad) {
|
|
||||||
/* note: pad is for future expansion 0=unused */
|
|
||||||
fprintf(stderr,"Led State= 0x%02X\n", value);
|
|
||||||
fflush(stderr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* trivial support for textchat */
|
|
||||||
static void text_chat(rfbClient* cl, int value, char *text) {
|
|
||||||
switch(value) {
|
|
||||||
case rfbTextChatOpen:
|
|
||||||
fprintf(stderr,"TextChat: We should open a textchat window!\n");
|
|
||||||
TextChatOpen(cl);
|
|
||||||
break;
|
|
||||||
case rfbTextChatClose:
|
|
||||||
fprintf(stderr,"TextChat: We should close our window!\n");
|
|
||||||
break;
|
|
||||||
case rfbTextChatFinished:
|
|
||||||
fprintf(stderr,"TextChat: We should close our window!\n");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr,"TextChat: Received \"%s\"\n", text);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
fflush(stderr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __MINGW32__
|
|
||||||
#define LOG_TO_FILE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LOG_TO_FILE
|
|
||||||
#include <stdarg.h>
|
|
||||||
static void
|
|
||||||
log_to_file(const char *format, ...)
|
|
||||||
{
|
|
||||||
FILE* logfile;
|
|
||||||
static char* logfile_str=0;
|
|
||||||
va_list args;
|
|
||||||
char buf[256];
|
|
||||||
time_t log_clock;
|
|
||||||
|
|
||||||
if(!rfbEnableClientLogging)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(logfile_str==0) {
|
|
||||||
logfile_str=getenv("VNCLOG");
|
|
||||||
if(logfile_str==0)
|
|
||||||
logfile_str="vnc.log";
|
|
||||||
}
|
|
||||||
|
|
||||||
logfile=fopen(logfile_str,"a");
|
|
||||||
|
|
||||||
va_start(args, format);
|
|
||||||
|
|
||||||
time(&log_clock);
|
|
||||||
strftime(buf, 255, "%d/%m/%Y %X ", localtime(&log_clock));
|
|
||||||
fprintf(logfile,buf);
|
|
||||||
|
|
||||||
vfprintf(logfile, format, args);
|
|
||||||
fflush(logfile);
|
|
||||||
|
|
||||||
va_end(args);
|
|
||||||
fclose(logfile);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static void cleanup(rfbClient* cl)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
just in case we're running in listenLoop:
|
|
||||||
close viewer window by restarting SDL video subsystem
|
|
||||||
*/
|
|
||||||
SDL_QuitSubSystem(SDL_INIT_VIDEO);
|
|
||||||
SDL_InitSubSystem(SDL_INIT_VIDEO);
|
|
||||||
if(cl)
|
|
||||||
rfbClientCleanup(cl);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static rfbBool handleSDLEvent(rfbClient *cl, SDL_Event *e)
|
|
||||||
{
|
|
||||||
switch(e->type) {
|
|
||||||
#if SDL_MAJOR_VERSION > 1 || SDL_MINOR_VERSION >= 2
|
|
||||||
case SDL_VIDEOEXPOSE:
|
|
||||||
SendFramebufferUpdateRequest(cl, 0, 0,
|
|
||||||
cl->width, cl->height, FALSE);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case SDL_MOUSEBUTTONUP:
|
|
||||||
case SDL_MOUSEBUTTONDOWN:
|
|
||||||
case SDL_MOUSEMOTION:
|
|
||||||
{
|
|
||||||
int x, y, state, i;
|
|
||||||
if (viewOnly)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (e->type == SDL_MOUSEMOTION) {
|
|
||||||
x = e->motion.x;
|
|
||||||
y = e->motion.y;
|
|
||||||
state = e->motion.state;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
x = e->button.x;
|
|
||||||
y = e->button.y;
|
|
||||||
state = e->button.button;
|
|
||||||
for (i = 0; buttonMapping[i].sdl; i++)
|
|
||||||
if (state == buttonMapping[i].sdl) {
|
|
||||||
state = buttonMapping[i].rfb;
|
|
||||||
if (e->type == SDL_MOUSEBUTTONDOWN)
|
|
||||||
buttonMask |= state;
|
|
||||||
else
|
|
||||||
buttonMask &= ~state;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sdlPixels) {
|
|
||||||
x = x * cl->width / realWidth;
|
|
||||||
y = y * cl->height / realHeight;
|
|
||||||
}
|
|
||||||
SendPointerEvent(cl, x, y, buttonMask);
|
|
||||||
buttonMask &= ~(rfbButton4Mask | rfbButton5Mask);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SDL_KEYUP:
|
|
||||||
case SDL_KEYDOWN:
|
|
||||||
if (viewOnly)
|
|
||||||
break;
|
|
||||||
SendKeyEvent(cl, SDL_key2rfbKeySym(&e->key),
|
|
||||||
e->type == SDL_KEYDOWN ? TRUE : FALSE);
|
|
||||||
if (e->key.keysym.sym == SDLK_RALT)
|
|
||||||
rightAltKeyDown = e->type == SDL_KEYDOWN;
|
|
||||||
if (e->key.keysym.sym == SDLK_LALT)
|
|
||||||
leftAltKeyDown = e->type == SDL_KEYDOWN;
|
|
||||||
break;
|
|
||||||
case SDL_QUIT:
|
|
||||||
if(listenLoop)
|
|
||||||
{
|
|
||||||
cleanup(cl);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rfbClientCleanup(cl);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
case SDL_ACTIVEEVENT:
|
|
||||||
if (!e->active.gain && rightAltKeyDown) {
|
|
||||||
SendKeyEvent(cl, XK_Alt_R, FALSE);
|
|
||||||
rightAltKeyDown = FALSE;
|
|
||||||
rfbClientLog("released right Alt key\n");
|
|
||||||
}
|
|
||||||
if (!e->active.gain && leftAltKeyDown) {
|
|
||||||
SendKeyEvent(cl, XK_Alt_L, FALSE);
|
|
||||||
leftAltKeyDown = FALSE;
|
|
||||||
rfbClientLog("released left Alt key\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e->active.gain && lost_scrap()) {
|
|
||||||
static char *data = NULL;
|
|
||||||
static int len = 0;
|
|
||||||
get_scrap(T('T', 'E', 'X', 'T'), &len, &data);
|
|
||||||
if (len)
|
|
||||||
SendClientCutText(cl, data, len);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SDL_SYSWMEVENT:
|
|
||||||
clipboard_filter(e);
|
|
||||||
break;
|
|
||||||
case SDL_VIDEORESIZE:
|
|
||||||
setRealDimension(cl, e->resize.w, e->resize.h);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
rfbClientLog("ignore SDL event: 0x%x\n", e->type);
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void got_selection(rfbClient *cl, const char *text, int len)
|
|
||||||
{
|
|
||||||
put_scrap(T('T', 'E', 'X', 'T'), len, text);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef mac
|
|
||||||
#define main SDLmain
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int main(int argc,char** argv) {
|
|
||||||
rfbClient* cl;
|
|
||||||
int i, j;
|
|
||||||
SDL_Event e;
|
|
||||||
|
|
||||||
#ifdef LOG_TO_FILE
|
|
||||||
rfbClientLog=rfbClientErr=log_to_file;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (i = 1, j = 1; i < argc; i++)
|
|
||||||
if (!strcmp(argv[i], "-viewonly"))
|
|
||||||
viewOnly = 1;
|
|
||||||
else if (!strcmp(argv[i], "-resizable"))
|
|
||||||
enableResizable = 1;
|
|
||||||
else if (!strcmp(argv[i], "-listen")) {
|
|
||||||
listenLoop = 1;
|
|
||||||
argv[i] = "-listennofork";
|
|
||||||
++j;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (i != j)
|
|
||||||
argv[j] = argv[i];
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
argc = j;
|
|
||||||
|
|
||||||
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE);
|
|
||||||
SDL_EnableUNICODE(1);
|
|
||||||
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,
|
|
||||||
SDL_DEFAULT_REPEAT_INTERVAL);
|
|
||||||
atexit(SDL_Quit);
|
|
||||||
signal(SIGINT, exit);
|
|
||||||
|
|
||||||
do {
|
|
||||||
/* 16-bit: cl=rfbGetClient(5,3,2); */
|
|
||||||
cl=rfbGetClient(8,3,4);
|
|
||||||
cl->MallocFrameBuffer=resize;
|
|
||||||
cl->canHandleNewFBSize = TRUE;
|
|
||||||
cl->GotFrameBufferUpdate=update;
|
|
||||||
cl->HandleKeyboardLedState=kbd_leds;
|
|
||||||
cl->HandleTextChat=text_chat;
|
|
||||||
cl->GotXCutText = got_selection;
|
|
||||||
cl->listenPort = LISTEN_PORT_OFFSET;
|
|
||||||
if(!rfbInitClient(cl,&argc,argv))
|
|
||||||
{
|
|
||||||
cl = NULL; /* rfbInitClient has already freed the client struct */
|
|
||||||
cleanup(cl);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
init_scrap();
|
|
||||||
|
|
||||||
while(1) {
|
|
||||||
if(SDL_PollEvent(&e)) {
|
|
||||||
/*
|
|
||||||
handleSDLEvent() return 0 if user requested window close.
|
|
||||||
In this case, handleSDLEvent() will have called cleanup().
|
|
||||||
*/
|
|
||||||
if(!handleSDLEvent(cl, &e))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
i=WaitForMessage(cl,500);
|
|
||||||
if(i<0)
|
|
||||||
{
|
|
||||||
cleanup(cl);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(i)
|
|
||||||
if(!HandleRFBServerMessage(cl))
|
|
||||||
{
|
|
||||||
cleanup(cl);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while(listenLoop);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@ -1,99 +0,0 @@
|
|||||||
/* A simple example of an RFB client */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <rfb/rfbclient.h>
|
|
||||||
|
|
||||||
static void HandleRect(rfbClient* client, int x, int y, int w, int h) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The client part of the back channel extension example.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define rfbBackChannel 155
|
|
||||||
|
|
||||||
typedef struct backChannelMsg {
|
|
||||||
uint8_t type;
|
|
||||||
uint8_t pad1;
|
|
||||||
uint16_t pad2;
|
|
||||||
uint32_t size;
|
|
||||||
} backChannelMsg;
|
|
||||||
|
|
||||||
static void sendMessage(rfbClient* client, char* text)
|
|
||||||
{
|
|
||||||
backChannelMsg msg;
|
|
||||||
uint32_t length = strlen(text)+1;
|
|
||||||
|
|
||||||
msg.type = rfbBackChannel;
|
|
||||||
msg.size = rfbClientSwap32IfLE(length);
|
|
||||||
if(!WriteToRFBServer(client, (char*)&msg, sizeof(msg)) ||
|
|
||||||
!WriteToRFBServer(client, text, length)) {
|
|
||||||
rfbClientLog("enableBackChannel: write error (%d: %s)", errno, strerror(errno));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static rfbBool handleBackChannelMessage(rfbClient* client,
|
|
||||||
rfbServerToClientMsg* message)
|
|
||||||
{
|
|
||||||
backChannelMsg msg;
|
|
||||||
char* text;
|
|
||||||
|
|
||||||
if(message->type != rfbBackChannel)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
rfbClientSetClientData(client, sendMessage, sendMessage);
|
|
||||||
|
|
||||||
if(!ReadFromRFBServer(client, ((char*)&msg)+1, sizeof(msg)-1))
|
|
||||||
return TRUE;
|
|
||||||
msg.size = rfbClientSwap32IfLE(msg.size);
|
|
||||||
text = malloc(msg.size);
|
|
||||||
if(!ReadFromRFBServer(client, text, msg.size)) {
|
|
||||||
free(text);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
rfbClientLog("got back channel message: %s\n", text);
|
|
||||||
free(text);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int backChannelEncodings[] = { rfbBackChannel, 0 };
|
|
||||||
|
|
||||||
static rfbClientProtocolExtension backChannel = {
|
|
||||||
backChannelEncodings, /* encodings */
|
|
||||||
NULL, /* handleEncoding */
|
|
||||||
handleBackChannelMessage, /* handleMessage */
|
|
||||||
NULL /* next extension */
|
|
||||||
};
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
rfbClient* client = rfbGetClient(8,3,4);
|
|
||||||
|
|
||||||
client->GotFrameBufferUpdate = HandleRect;
|
|
||||||
rfbClientRegisterExtension(&backChannel);
|
|
||||||
|
|
||||||
if (!rfbInitClient(client,&argc,argv))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
/* After each idle second, send a message */
|
|
||||||
if(WaitForMessage(client,1000000)>0)
|
|
||||||
HandleRFBServerMessage(client);
|
|
||||||
else if(rfbClientGetClientData(client, sendMessage))
|
|
||||||
sendMessage(client, "Dear Server,\n"
|
|
||||||
"thank you for understanding "
|
|
||||||
"back channel messages!");
|
|
||||||
}
|
|
||||||
|
|
||||||
rfbClientCleanup(client);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@ -1,97 +0,0 @@
|
|||||||
/* A simple example of an RFB client */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <rfb/rfbclient.h>
|
|
||||||
|
|
||||||
static void PrintRect(rfbClient* client, int x, int y, int w, int h) {
|
|
||||||
rfbClientLog("Received an update for %d,%d,%d,%d.\n",x,y,w,h);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SaveFramebufferAsPPM(rfbClient* client, int x, int y, int w, int h) {
|
|
||||||
static time_t t=0,t1;
|
|
||||||
FILE* f;
|
|
||||||
int i,j;
|
|
||||||
rfbPixelFormat* pf=&client->format;
|
|
||||||
int bpp=pf->bitsPerPixel/8;
|
|
||||||
int row_stride=client->width*bpp;
|
|
||||||
|
|
||||||
/* save one picture only if the last is older than 2 seconds */
|
|
||||||
t1=time(NULL);
|
|
||||||
if(t1-t>2)
|
|
||||||
t=t1;
|
|
||||||
else
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* assert bpp=4 */
|
|
||||||
if(bpp!=4 && bpp!=2) {
|
|
||||||
rfbClientLog("bpp = %d (!=4)\n",bpp);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
f=fopen("framebuffer.ppm","wb");
|
|
||||||
if(!f) {
|
|
||||||
rfbClientErr("Could not open framebuffer.ppm\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(f,"P6\n# %s\n%d %d\n255\n",client->desktopName,client->width,client->height);
|
|
||||||
for(j=0;j<client->height*row_stride;j+=row_stride)
|
|
||||||
for(i=0;i<client->width*bpp;i+=bpp) {
|
|
||||||
unsigned char* p=client->frameBuffer+j+i;
|
|
||||||
unsigned int v;
|
|
||||||
if(bpp==4)
|
|
||||||
v=*(unsigned int*)p;
|
|
||||||
else if(bpp==2)
|
|
||||||
v=*(unsigned short*)p;
|
|
||||||
else
|
|
||||||
v=*(unsigned char*)p;
|
|
||||||
fputc((v>>pf->redShift)*256/(pf->redMax+1),f);
|
|
||||||
fputc((v>>pf->greenShift)*256/(pf->greenMax+1),f);
|
|
||||||
fputc((v>>pf->blueShift)*256/(pf->blueMax+1),f);
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
rfbClient* client = rfbGetClient(8,3,4);
|
|
||||||
time_t t=time(NULL);
|
|
||||||
|
|
||||||
if(argc>1 && !strcmp("-print",argv[1])) {
|
|
||||||
client->GotFrameBufferUpdate = PrintRect;
|
|
||||||
argv[1]=argv[0]; argv++; argc--;
|
|
||||||
} else
|
|
||||||
client->GotFrameBufferUpdate = SaveFramebufferAsPPM;
|
|
||||||
|
|
||||||
/* The -listen option is used to make us a daemon process which listens for
|
|
||||||
incoming connections from servers, rather than actively connecting to a
|
|
||||||
given server. The -tunnel and -via options are useful to create
|
|
||||||
connections tunneled via SSH port forwarding. We must test for the
|
|
||||||
-listen option before invoking any Xt functions - this is because we use
|
|
||||||
forking, and Xt doesn't seem to cope with forking very well. For -listen
|
|
||||||
option, when a successful incoming connection has been accepted,
|
|
||||||
listenForIncomingConnections() returns, setting the listenSpecified
|
|
||||||
flag. */
|
|
||||||
|
|
||||||
if (!rfbInitClient(client,&argc,argv))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
/* TODO: better wait for update completion */
|
|
||||||
while (time(NULL)-t<5) {
|
|
||||||
static int i=0;
|
|
||||||
fprintf(stderr,"\r%d",i++);
|
|
||||||
if(WaitForMessage(client,50)<0)
|
|
||||||
break;
|
|
||||||
if(!HandleRFBServerMessage(client))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
rfbClientCleanup(client);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@ -1,558 +0,0 @@
|
|||||||
/* Handle clipboard text and data in arbitrary formats */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#include <SDL.h>
|
|
||||||
#include <SDL_syswm.h>
|
|
||||||
#else
|
|
||||||
#include <SDL/SDL.h>
|
|
||||||
#include <SDL/SDL_syswm.h>
|
|
||||||
#endif
|
|
||||||
#include "scrap.h"
|
|
||||||
#include "rfb/rfbconfig.h"
|
|
||||||
|
|
||||||
/* Determine what type of clipboard we are using */
|
|
||||||
#if defined(__unix__) && !defined(__QNXNTO__) && defined(LIBVNCSERVER_HAVE_X11)
|
|
||||||
#define X11_SCRAP
|
|
||||||
#elif defined(__WIN32__)
|
|
||||||
#define WIN_SCRAP
|
|
||||||
#elif defined(__QNXNTO__)
|
|
||||||
#define QNX_SCRAP
|
|
||||||
#else
|
|
||||||
#warning Unknown window manager for clipboard handling
|
|
||||||
#endif /* scrap type */
|
|
||||||
|
|
||||||
/* System dependent data types */
|
|
||||||
#if defined(X11_SCRAP)
|
|
||||||
typedef Atom scrap_type;
|
|
||||||
static Atom XA_TARGETS, XA_TEXT, XA_COMPOUND_TEXT, XA_UTF8_STRING;
|
|
||||||
#elif defined(WIN_SCRAP)
|
|
||||||
typedef UINT scrap_type;
|
|
||||||
#elif defined(QNX_SCRAP)
|
|
||||||
typedef uint32_t scrap_type;
|
|
||||||
#define Ph_CL_TEXT T('T', 'E', 'X', 'T')
|
|
||||||
#else
|
|
||||||
typedef int scrap_type;
|
|
||||||
#endif /* scrap type */
|
|
||||||
|
|
||||||
/* System dependent variables */
|
|
||||||
#if defined(X11_SCRAP)
|
|
||||||
static Display *SDL_Display;
|
|
||||||
static Window SDL_Window;
|
|
||||||
static void (*Lock_Display)(void);
|
|
||||||
static void (*Unlock_Display)(void);
|
|
||||||
static Atom XA_UTF8_STRING;
|
|
||||||
#elif defined(WIN_SCRAP)
|
|
||||||
static HWND SDL_Window;
|
|
||||||
#elif defined(QNX_SCRAP)
|
|
||||||
static unsigned short InputGroup;
|
|
||||||
#endif /* scrap type */
|
|
||||||
|
|
||||||
#define FORMAT_PREFIX "SDL_scrap_0x"
|
|
||||||
|
|
||||||
static scrap_type convert_format(int type)
|
|
||||||
{
|
|
||||||
switch (type) {
|
|
||||||
case T('T', 'E', 'X', 'T'):
|
|
||||||
#if defined(X11_SCRAP)
|
|
||||||
return XA_UTF8_STRING ? XA_UTF8_STRING : XA_STRING;
|
|
||||||
#elif defined(WIN_SCRAP)
|
|
||||||
return CF_TEXT;
|
|
||||||
#elif defined(QNX_SCRAP)
|
|
||||||
return Ph_CL_TEXT;
|
|
||||||
#endif /* scrap type */
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
char format[sizeof(FORMAT_PREFIX)+8+1];
|
|
||||||
|
|
||||||
sprintf(format, "%s%08lx", FORMAT_PREFIX,
|
|
||||||
(unsigned long)type);
|
|
||||||
#if defined(X11_SCRAP)
|
|
||||||
return XInternAtom(SDL_Display, format, False);
|
|
||||||
#elif defined(WIN_SCRAP)
|
|
||||||
return RegisterClipboardFormat(format);
|
|
||||||
#endif /* scrap type */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert internal data to scrap format */
|
|
||||||
static int convert_data(int type, char *dst, const char *src, int srclen)
|
|
||||||
{
|
|
||||||
int dstlen;
|
|
||||||
|
|
||||||
dstlen = 0;
|
|
||||||
switch (type) {
|
|
||||||
case T('T', 'E', 'X', 'T'):
|
|
||||||
if (dst) {
|
|
||||||
while (--srclen >= 0) {
|
|
||||||
#if defined(__unix__)
|
|
||||||
if (*src == '\r') {
|
|
||||||
*dst++ = '\n';
|
|
||||||
++dstlen;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#elif defined(__WIN32__)
|
|
||||||
if (*src == '\r') {
|
|
||||||
*dst++ = '\r';
|
|
||||||
++dstlen;
|
|
||||||
*dst++ = '\n';
|
|
||||||
++dstlen;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
*dst++ = *src;
|
|
||||||
++dstlen;
|
|
||||||
}
|
|
||||||
++src;
|
|
||||||
}
|
|
||||||
*dst = '\0';
|
|
||||||
++dstlen;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
while (--srclen >= 0) {
|
|
||||||
#if defined(__unix__)
|
|
||||||
if (*src == '\r')
|
|
||||||
++dstlen;
|
|
||||||
else
|
|
||||||
#elif defined(__WIN32__)
|
|
||||||
if (*src == '\r') {
|
|
||||||
++dstlen;
|
|
||||||
++dstlen;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
++dstlen;
|
|
||||||
}
|
|
||||||
++src;
|
|
||||||
}
|
|
||||||
++dstlen;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (dst) {
|
|
||||||
*(int *)dst = srclen;
|
|
||||||
dst += sizeof(int);
|
|
||||||
memcpy(dst, src, srclen);
|
|
||||||
}
|
|
||||||
dstlen = sizeof(int)+srclen;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return(dstlen);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert scrap data to internal format */
|
|
||||||
static int convert_scrap(int type, char *dst, char *src, int srclen)
|
|
||||||
{
|
|
||||||
int dstlen;
|
|
||||||
|
|
||||||
dstlen = 0;
|
|
||||||
switch (type) {
|
|
||||||
case T('T', 'E', 'X', 'T'):
|
|
||||||
{
|
|
||||||
if (srclen == 0)
|
|
||||||
srclen = strlen(src);
|
|
||||||
if (dst) {
|
|
||||||
while (--srclen >= 0) {
|
|
||||||
#if defined(__WIN32__)
|
|
||||||
if (*src == '\r')
|
|
||||||
/* drop extraneous '\r' */;
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
if (*src == '\n') {
|
|
||||||
*dst++ = '\r';
|
|
||||||
++dstlen;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*dst++ = *src;
|
|
||||||
++dstlen;
|
|
||||||
}
|
|
||||||
++src;
|
|
||||||
}
|
|
||||||
*dst = '\0';
|
|
||||||
++dstlen;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
while (--srclen >= 0) {
|
|
||||||
#if defined(__WIN32__)
|
|
||||||
/* drop extraneous '\r' */;
|
|
||||||
if (*src != '\r')
|
|
||||||
#endif
|
|
||||||
++dstlen;
|
|
||||||
++src;
|
|
||||||
}
|
|
||||||
++dstlen;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
dstlen = *(int *)src;
|
|
||||||
if (dst)
|
|
||||||
memcpy(dst, src + sizeof(int),
|
|
||||||
srclen ? srclen - sizeof(int) : dstlen);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return dstlen;
|
|
||||||
}
|
|
||||||
|
|
||||||
int init_scrap(void)
|
|
||||||
{
|
|
||||||
SDL_SysWMinfo info;
|
|
||||||
int retval;
|
|
||||||
|
|
||||||
/* Grab the window manager specific information */
|
|
||||||
retval = -1;
|
|
||||||
SDL_SetError("SDL is not running on known window manager");
|
|
||||||
|
|
||||||
SDL_VERSION(&info.version);
|
|
||||||
if (SDL_GetWMInfo(&info)) {
|
|
||||||
/* Save the information for later use */
|
|
||||||
#if defined(X11_SCRAP)
|
|
||||||
if (info.subsystem == SDL_SYSWM_X11) {
|
|
||||||
SDL_Display = info.info.x11.display;
|
|
||||||
SDL_Window = info.info.x11.window;
|
|
||||||
Lock_Display = info.info.x11.lock_func;
|
|
||||||
Unlock_Display = info.info.x11.unlock_func;
|
|
||||||
|
|
||||||
/* Enable the special window hook events */
|
|
||||||
SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE);
|
|
||||||
SDL_SetEventFilter(clipboard_filter);
|
|
||||||
|
|
||||||
XA_TARGETS = XInternAtom(SDL_Display, "TARGETS", False);
|
|
||||||
XA_TEXT = XInternAtom(SDL_Display, "TEXT", False);
|
|
||||||
XA_COMPOUND_TEXT = XInternAtom(SDL_Display,
|
|
||||||
"COMPOUND_TEXT", False);
|
|
||||||
XA_UTF8_STRING = XInternAtom(SDL_Display,
|
|
||||||
"UTF8_STRING", False);
|
|
||||||
|
|
||||||
retval = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
SDL_SetError("SDL is not running on X11");
|
|
||||||
#elif defined(WIN_SCRAP)
|
|
||||||
SDL_Window = info.window;
|
|
||||||
retval = 0;
|
|
||||||
#elif defined(QNX_SCRAP)
|
|
||||||
InputGroup = PhInputGroup(NULL);
|
|
||||||
retval = 0;
|
|
||||||
#endif /* scrap type */
|
|
||||||
}
|
|
||||||
return(retval);
|
|
||||||
}
|
|
||||||
|
|
||||||
int lost_scrap(void)
|
|
||||||
{
|
|
||||||
int retval;
|
|
||||||
|
|
||||||
#if defined(X11_SCRAP)
|
|
||||||
if (Lock_Display)
|
|
||||||
Lock_Display();
|
|
||||||
retval = (XGetSelectionOwner(SDL_Display, XA_PRIMARY) != SDL_Window);
|
|
||||||
if (Unlock_Display)
|
|
||||||
Unlock_Display();
|
|
||||||
#elif defined(WIN_SCRAP)
|
|
||||||
retval = (GetClipboardOwner() != SDL_Window);
|
|
||||||
#elif defined(QNX_SCRAP)
|
|
||||||
retval = (PhInputGroup(NULL) != InputGroup);
|
|
||||||
#endif /* scrap type */
|
|
||||||
|
|
||||||
return(retval);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_scrap(int type, int srclen, const char *src)
|
|
||||||
{
|
|
||||||
scrap_type format;
|
|
||||||
int dstlen;
|
|
||||||
char *dst;
|
|
||||||
|
|
||||||
format = convert_format(type);
|
|
||||||
dstlen = convert_data(type, NULL, src, srclen);
|
|
||||||
|
|
||||||
#if defined(X11_SCRAP)
|
|
||||||
dst = (char *)malloc(dstlen);
|
|
||||||
if (dst != NULL) {
|
|
||||||
if (Lock_Display)
|
|
||||||
Lock_Display();
|
|
||||||
convert_data(type, dst, src, srclen);
|
|
||||||
XChangeProperty(SDL_Display, DefaultRootWindow(SDL_Display),
|
|
||||||
XA_CUT_BUFFER0, format, 8, PropModeReplace,
|
|
||||||
(unsigned char *)dst, dstlen);
|
|
||||||
free(dst);
|
|
||||||
if (lost_scrap())
|
|
||||||
XSetSelectionOwner(SDL_Display, XA_PRIMARY,
|
|
||||||
SDL_Window, CurrentTime);
|
|
||||||
if (Unlock_Display)
|
|
||||||
Unlock_Display();
|
|
||||||
}
|
|
||||||
#elif defined(WIN_SCRAP)
|
|
||||||
if (OpenClipboard(SDL_Window)) {
|
|
||||||
HANDLE hMem;
|
|
||||||
|
|
||||||
hMem = GlobalAlloc((GMEM_MOVEABLE|GMEM_DDESHARE), dstlen);
|
|
||||||
if (hMem != NULL) {
|
|
||||||
dst = (char *)GlobalLock(hMem);
|
|
||||||
convert_data(type, dst, src, srclen);
|
|
||||||
GlobalUnlock(hMem);
|
|
||||||
EmptyClipboard();
|
|
||||||
SetClipboardData(format, hMem);
|
|
||||||
}
|
|
||||||
CloseClipboard();
|
|
||||||
}
|
|
||||||
#elif defined(QNX_SCRAP)
|
|
||||||
#if (_NTO_VERSION < 620) /* before 6.2.0 releases */
|
|
||||||
#define PhClipboardHdr PhClipHeader
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
PhClipboardHdr clheader = { Ph_CLIPBOARD_TYPE_TEXT, 0, NULL };
|
|
||||||
int* cldata;
|
|
||||||
int status;
|
|
||||||
|
|
||||||
dst = (char *)malloc(dstlen+4);
|
|
||||||
if (dst != NULL) {
|
|
||||||
cldata = (int*)dst;
|
|
||||||
*cldata = type;
|
|
||||||
convert_data(type, dst+4, src, srclen);
|
|
||||||
clheader.data = dst;
|
|
||||||
#if (_NTO_VERSION < 620) /* before 6.2.0 releases */
|
|
||||||
if (dstlen > 65535)
|
|
||||||
/* maximum photon clipboard size :(*/
|
|
||||||
clheader.length = 65535;
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
clheader.length = dstlen+4;
|
|
||||||
status = PhClipboardCopy(InputGroup, 1, &clheader);
|
|
||||||
if (status == -1)
|
|
||||||
fprintf(stderr,
|
|
||||||
"Photon: copy to clipboard failed!\n");
|
|
||||||
free(dst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* scrap type */
|
|
||||||
}
|
|
||||||
|
|
||||||
void get_scrap(int type, int *dstlen, char **dst)
|
|
||||||
{
|
|
||||||
scrap_type format;
|
|
||||||
|
|
||||||
*dstlen = 0;
|
|
||||||
format = convert_format(type);
|
|
||||||
|
|
||||||
#if defined(X11_SCRAP)
|
|
||||||
{
|
|
||||||
Window owner;
|
|
||||||
Atom selection;
|
|
||||||
Atom seln_type;
|
|
||||||
int seln_format;
|
|
||||||
unsigned long nbytes;
|
|
||||||
unsigned long overflow;
|
|
||||||
char *src;
|
|
||||||
|
|
||||||
if (Lock_Display)
|
|
||||||
Lock_Display();
|
|
||||||
owner = XGetSelectionOwner(SDL_Display, XA_PRIMARY);
|
|
||||||
if (Unlock_Display)
|
|
||||||
Unlock_Display();
|
|
||||||
if ((owner == None) || (owner == SDL_Window)) {
|
|
||||||
owner = DefaultRootWindow(SDL_Display);
|
|
||||||
selection = XA_CUT_BUFFER0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
int selection_response = 0;
|
|
||||||
SDL_Event event;
|
|
||||||
|
|
||||||
owner = SDL_Window;
|
|
||||||
if (Lock_Display)
|
|
||||||
Lock_Display();
|
|
||||||
selection = XInternAtom(SDL_Display, "SDL_SELECTION",
|
|
||||||
False);
|
|
||||||
XConvertSelection(SDL_Display, XA_PRIMARY, format,
|
|
||||||
selection, owner, CurrentTime);
|
|
||||||
if (Unlock_Display)
|
|
||||||
Unlock_Display();
|
|
||||||
while (!selection_response) {
|
|
||||||
SDL_WaitEvent(&event);
|
|
||||||
if (event.type == SDL_SYSWMEVENT) {
|
|
||||||
XEvent xevent =
|
|
||||||
event.syswm.msg->event.xevent;
|
|
||||||
|
|
||||||
if ((xevent.type == SelectionNotify) &&
|
|
||||||
(xevent.xselection.requestor
|
|
||||||
== owner))
|
|
||||||
selection_response = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Lock_Display)
|
|
||||||
Lock_Display();
|
|
||||||
if (XGetWindowProperty(SDL_Display, owner, selection,
|
|
||||||
0, INT_MAX/4, False, format, &seln_type,
|
|
||||||
&seln_format, &nbytes, &overflow,
|
|
||||||
(unsigned char **)&src) == Success) {
|
|
||||||
if (seln_type == format) {
|
|
||||||
*dstlen = convert_scrap(type, NULL,
|
|
||||||
src, nbytes);
|
|
||||||
*dst = (char *)realloc(*dst, *dstlen);
|
|
||||||
if (*dst == NULL)
|
|
||||||
*dstlen = 0;
|
|
||||||
else
|
|
||||||
convert_scrap(type, *dst, src, nbytes);
|
|
||||||
}
|
|
||||||
XFree(src);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Unlock_Display)
|
|
||||||
Unlock_Display();
|
|
||||||
#elif defined(WIN_SCRAP)
|
|
||||||
if (IsClipboardFormatAvailable(format) && OpenClipboard(SDL_Window)) {
|
|
||||||
HANDLE hMem;
|
|
||||||
char *src;
|
|
||||||
|
|
||||||
hMem = GetClipboardData(format);
|
|
||||||
if (hMem != NULL) {
|
|
||||||
src = (char *)GlobalLock(hMem);
|
|
||||||
*dstlen = convert_scrap(type, NULL, src, 0);
|
|
||||||
*dst = (char *)realloc(*dst, *dstlen);
|
|
||||||
if (*dst == NULL)
|
|
||||||
*dstlen = 0;
|
|
||||||
else
|
|
||||||
convert_scrap(type, *dst, src, 0);
|
|
||||||
GlobalUnlock(hMem);
|
|
||||||
}
|
|
||||||
CloseClipboard();
|
|
||||||
}
|
|
||||||
#elif defined(QNX_SCRAP)
|
|
||||||
#if (_NTO_VERSION < 620) /* before 6.2.0 releases */
|
|
||||||
{
|
|
||||||
void* clhandle;
|
|
||||||
PhClipHeader* clheader;
|
|
||||||
int* cldata;
|
|
||||||
|
|
||||||
clhandle = PhClipboardPasteStart(InputGroup);
|
|
||||||
if (clhandle != NULL) {
|
|
||||||
clheader = PhClipboardPasteType(clhandle,
|
|
||||||
Ph_CLIPBOARD_TYPE_TEXT);
|
|
||||||
if (clheader != NULL) {
|
|
||||||
cldata = clheader->data;
|
|
||||||
if ((clheader->length>4) && (*cldata == type)) {
|
|
||||||
*dstlen = convert_scrap(type, NULL,
|
|
||||||
(char*)clheader->data+4,
|
|
||||||
clheader->length-4);
|
|
||||||
*dst = (char *)realloc(*dst, *dstlen);
|
|
||||||
if (*dst == NULL)
|
|
||||||
*dstlen = 0;
|
|
||||||
else
|
|
||||||
convert_scrap(type, *dst,
|
|
||||||
(char*)clheader->data+4,
|
|
||||||
clheader->length-4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
PhClipboardPasteFinish(clhandle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else /* 6.2.0 and 6.2.1 and future releases */
|
|
||||||
{
|
|
||||||
void* clhandle;
|
|
||||||
PhClipboardHdr* clheader;
|
|
||||||
int* cldata;
|
|
||||||
|
|
||||||
clheader=PhClipboardRead(InputGroup, Ph_CLIPBOARD_TYPE_TEXT);
|
|
||||||
if (clheader!=NULL) {
|
|
||||||
cldata=clheader->data;
|
|
||||||
if ((clheader->length>4) && (*cldata==type)) {
|
|
||||||
*dstlen = convert_scrap(type, NULL,
|
|
||||||
(char*)clheader->data+4,
|
|
||||||
clheader->length-4);
|
|
||||||
*dst = (char *)realloc(*dst, *dstlen);
|
|
||||||
if (*dst == NULL)
|
|
||||||
*dstlen = 0;
|
|
||||||
else
|
|
||||||
convert_scrap(type, *dst,
|
|
||||||
(char*)clheader->data+4,
|
|
||||||
clheader->length-4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* scrap type */
|
|
||||||
}
|
|
||||||
|
|
||||||
int clipboard_filter(const SDL_Event *event)
|
|
||||||
{
|
|
||||||
#if defined(X11_SCRAP)
|
|
||||||
/* Post all non-window manager specific events */
|
|
||||||
if (event->type != SDL_SYSWMEVENT)
|
|
||||||
return(1);
|
|
||||||
|
|
||||||
/* Handle window-manager specific clipboard events */
|
|
||||||
switch (event->syswm.msg->event.xevent.type) {
|
|
||||||
/* Copy the selection from XA_CUT_BUFFER0 to the requested property */
|
|
||||||
case SelectionRequest: {
|
|
||||||
XSelectionRequestEvent *req;
|
|
||||||
XEvent sevent;
|
|
||||||
int seln_format;
|
|
||||||
unsigned long nbytes;
|
|
||||||
unsigned long overflow;
|
|
||||||
unsigned char *seln_data;
|
|
||||||
|
|
||||||
req = &event->syswm.msg->event.xevent.xselectionrequest;
|
|
||||||
if (req->target == XA_TARGETS) {
|
|
||||||
Atom supported[] = {
|
|
||||||
XA_TEXT, XA_COMPOUND_TEXT, XA_UTF8_STRING,
|
|
||||||
XA_TARGETS, XA_STRING
|
|
||||||
};
|
|
||||||
XEvent response;
|
|
||||||
|
|
||||||
XChangeProperty(SDL_Display, req->requestor,
|
|
||||||
req->property, req->target, 32, PropModeReplace,
|
|
||||||
(unsigned char*)supported,
|
|
||||||
sizeof(supported) / sizeof(supported[0]));
|
|
||||||
response.xselection.property=None;
|
|
||||||
response.xselection.type= SelectionNotify;
|
|
||||||
response.xselection.display= req->display;
|
|
||||||
response.xselection.requestor= req->requestor;
|
|
||||||
response.xselection.selection=req->selection;
|
|
||||||
response.xselection.target= req->target;
|
|
||||||
response.xselection.time = req->time;
|
|
||||||
XSendEvent (SDL_Display, req->requestor,0,0,&response);
|
|
||||||
XFlush (SDL_Display);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sevent.xselection.type = SelectionNotify;
|
|
||||||
sevent.xselection.display = req->display;
|
|
||||||
sevent.xselection.selection = req->selection;
|
|
||||||
sevent.xselection.target = None;
|
|
||||||
sevent.xselection.property = req->property;
|
|
||||||
sevent.xselection.requestor = req->requestor;
|
|
||||||
sevent.xselection.time = req->time;
|
|
||||||
if (XGetWindowProperty(SDL_Display,
|
|
||||||
DefaultRootWindow(SDL_Display), XA_CUT_BUFFER0,
|
|
||||||
0, INT_MAX/4, False, req->target,
|
|
||||||
&sevent.xselection.target, &seln_format,
|
|
||||||
&nbytes, &overflow, &seln_data) == Success) {
|
|
||||||
if (sevent.xselection.target == req->target) {
|
|
||||||
if (sevent.xselection.target == XA_STRING &&
|
|
||||||
nbytes > 0 &&
|
|
||||||
seln_data[nbytes-1] == '\0')
|
|
||||||
--nbytes;
|
|
||||||
XChangeProperty(SDL_Display, req->requestor,
|
|
||||||
req->property, sevent.xselection.target,
|
|
||||||
seln_format, PropModeReplace,
|
|
||||||
seln_data, nbytes);
|
|
||||||
sevent.xselection.property = req->property;
|
|
||||||
}
|
|
||||||
XFree(seln_data);
|
|
||||||
}
|
|
||||||
XSendEvent(SDL_Display,req->requestor,False,0,&sevent);
|
|
||||||
XSync(SDL_Display, False);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Post the event for X11 clipboard reading above */
|
|
||||||
#endif /* X11_SCRAP */
|
|
||||||
return(1);
|
|
||||||
}
|
|
@ -1,18 +0,0 @@
|
|||||||
/* Handle clipboard text and data in arbitrary formats */
|
|
||||||
|
|
||||||
/* Miscellaneous defines */
|
|
||||||
#define T(A, B, C, D) (int)((A<<24)|(B<<16)|(C<<8)|(D<<0))
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
extern int init_scrap(void);
|
|
||||||
extern int lost_scrap(void);
|
|
||||||
extern void put_scrap(int type, int srclen, const char *src);
|
|
||||||
extern void get_scrap(int type, int *dstlen, char **dst);
|
|
||||||
extern int clipboard_filter(const SDL_Event *event);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif /* __cplusplus */
|
|
@ -1,435 +0,0 @@
|
|||||||
/*
|
|
||||||
* Simple movie writer for vnc; based on Libavformat API example from FFMPEG
|
|
||||||
*
|
|
||||||
* Copyright (c) 2003 Fabrice Bellard, 2004 Johannes E. Schindelin
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#ifndef M_PI
|
|
||||||
#define M_PI 3.1415926535897931
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "avformat.h"
|
|
||||||
#include <rfb/rfbclient.h>
|
|
||||||
|
|
||||||
#define STREAM_FRAME_RATE 25 /* 25 images/s */
|
|
||||||
|
|
||||||
/**************************************************************/
|
|
||||||
/* video output */
|
|
||||||
|
|
||||||
AVFrame *picture, *tmp_picture;
|
|
||||||
uint8_t *video_outbuf;
|
|
||||||
int frame_count, video_outbuf_size;
|
|
||||||
|
|
||||||
/* add a video output stream */
|
|
||||||
AVStream *add_video_stream(AVFormatContext *oc, int codec_id, int w, int h)
|
|
||||||
{
|
|
||||||
AVCodecContext *c;
|
|
||||||
AVStream *st;
|
|
||||||
|
|
||||||
st = av_new_stream(oc, 0);
|
|
||||||
if (!st) {
|
|
||||||
fprintf(stderr, "Could not alloc stream\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if LIBAVFORMAT_BUILD<4629
|
|
||||||
c = &st->codec;
|
|
||||||
#else
|
|
||||||
c = st->codec;
|
|
||||||
#endif
|
|
||||||
c->codec_id = codec_id;
|
|
||||||
c->codec_type = CODEC_TYPE_VIDEO;
|
|
||||||
|
|
||||||
/* put sample parameters */
|
|
||||||
c->bit_rate = 800000;
|
|
||||||
/* resolution must be a multiple of two */
|
|
||||||
c->width = w;
|
|
||||||
c->height = h;
|
|
||||||
/* frames per second */
|
|
||||||
#if LIBAVCODEC_BUILD<4754
|
|
||||||
c->frame_rate = STREAM_FRAME_RATE;
|
|
||||||
c->frame_rate_base = 1;
|
|
||||||
#else
|
|
||||||
c->time_base.den = STREAM_FRAME_RATE;
|
|
||||||
c->time_base.num = 1;
|
|
||||||
c->pix_fmt = PIX_FMT_YUV420P;
|
|
||||||
#endif
|
|
||||||
c->gop_size = 12; /* emit one intra frame every twelve frames at most */
|
|
||||||
if (c->codec_id == CODEC_ID_MPEG2VIDEO) {
|
|
||||||
/* just for testing, we also add B frames */
|
|
||||||
c->max_b_frames = 2;
|
|
||||||
}
|
|
||||||
if (c->codec_id == CODEC_ID_MPEG1VIDEO){
|
|
||||||
/* needed to avoid using macroblocks in which some coeffs overflow
|
|
||||||
this doesnt happen with normal video, it just happens here as the
|
|
||||||
motion of the chroma plane doesnt match the luma plane */
|
|
||||||
c->mb_decision=2;
|
|
||||||
}
|
|
||||||
/* some formats want stream headers to be seperate */
|
|
||||||
if(!strcmp(oc->oformat->name, "mp4") || !strcmp(oc->oformat->name, "mov") || !strcmp(oc->oformat->name, "3gp"))
|
|
||||||
c->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
|
||||||
|
|
||||||
return st;
|
|
||||||
}
|
|
||||||
|
|
||||||
AVFrame *alloc_picture(int pix_fmt, int width, int height)
|
|
||||||
{
|
|
||||||
AVFrame *picture;
|
|
||||||
uint8_t *picture_buf;
|
|
||||||
int size;
|
|
||||||
|
|
||||||
picture = avcodec_alloc_frame();
|
|
||||||
if (!picture)
|
|
||||||
return NULL;
|
|
||||||
size = avpicture_get_size(pix_fmt, width, height);
|
|
||||||
picture_buf = malloc(size);
|
|
||||||
if (!picture_buf) {
|
|
||||||
av_free(picture);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
avpicture_fill((AVPicture *)picture, picture_buf,
|
|
||||||
pix_fmt, width, height);
|
|
||||||
return picture;
|
|
||||||
}
|
|
||||||
|
|
||||||
void open_video(AVFormatContext *oc, AVStream *st)
|
|
||||||
{
|
|
||||||
AVCodec *codec;
|
|
||||||
AVCodecContext *c;
|
|
||||||
|
|
||||||
#if LIBAVFORMAT_BUILD<4629
|
|
||||||
c = &st->codec;
|
|
||||||
#else
|
|
||||||
c = st->codec;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* find the video encoder */
|
|
||||||
codec = avcodec_find_encoder(c->codec_id);
|
|
||||||
if (!codec) {
|
|
||||||
fprintf(stderr, "codec not found\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* open the codec */
|
|
||||||
if (avcodec_open(c, codec) < 0) {
|
|
||||||
fprintf(stderr, "could not open codec\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
video_outbuf = NULL;
|
|
||||||
if (!(oc->oformat->flags & AVFMT_RAWPICTURE)) {
|
|
||||||
/* allocate output buffer */
|
|
||||||
/* XXX: API change will be done */
|
|
||||||
video_outbuf_size = 200000;
|
|
||||||
video_outbuf = malloc(video_outbuf_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* allocate the encoded raw picture */
|
|
||||||
picture = alloc_picture(c->pix_fmt, c->width, c->height);
|
|
||||||
if (!picture) {
|
|
||||||
fprintf(stderr, "Could not allocate picture\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if the output format is not RGB565, then a temporary RGB565
|
|
||||||
picture is needed too. It is then converted to the required
|
|
||||||
output format */
|
|
||||||
tmp_picture = NULL;
|
|
||||||
if (c->pix_fmt != PIX_FMT_RGB565) {
|
|
||||||
tmp_picture = alloc_picture(PIX_FMT_RGB565, c->width, c->height);
|
|
||||||
if (!tmp_picture) {
|
|
||||||
fprintf(stderr, "Could not allocate temporary picture\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void write_video_frame(AVFormatContext *oc, AVStream *st)
|
|
||||||
{
|
|
||||||
int out_size, ret;
|
|
||||||
AVCodecContext *c;
|
|
||||||
AVFrame *picture_ptr;
|
|
||||||
|
|
||||||
#if LIBAVFORMAT_BUILD<4629
|
|
||||||
c = &st->codec;
|
|
||||||
#else
|
|
||||||
c = st->codec;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (c->pix_fmt != PIX_FMT_RGB565) {
|
|
||||||
/* as we only generate a RGB565 picture, we must convert it
|
|
||||||
to the codec pixel format if needed */
|
|
||||||
img_convert((AVPicture *)picture, c->pix_fmt,
|
|
||||||
(AVPicture *)tmp_picture, PIX_FMT_RGB565,
|
|
||||||
c->width, c->height);
|
|
||||||
}
|
|
||||||
picture_ptr = picture;
|
|
||||||
|
|
||||||
|
|
||||||
if (oc->oformat->flags & AVFMT_RAWPICTURE) {
|
|
||||||
/* raw video case. The API will change slightly in the near
|
|
||||||
futur for that */
|
|
||||||
AVPacket pkt;
|
|
||||||
av_init_packet(&pkt);
|
|
||||||
|
|
||||||
pkt.flags |= PKT_FLAG_KEY;
|
|
||||||
pkt.stream_index= st->index;
|
|
||||||
pkt.data= (uint8_t *)picture_ptr;
|
|
||||||
pkt.size= sizeof(AVPicture);
|
|
||||||
|
|
||||||
ret = av_write_frame(oc, &pkt);
|
|
||||||
} else {
|
|
||||||
/* encode the image */
|
|
||||||
out_size = avcodec_encode_video(c, video_outbuf, video_outbuf_size, picture_ptr);
|
|
||||||
/* if zero size, it means the image was buffered */
|
|
||||||
if (out_size != 0) {
|
|
||||||
AVPacket pkt;
|
|
||||||
av_init_packet(&pkt);
|
|
||||||
|
|
||||||
pkt.pts= c->coded_frame->pts;
|
|
||||||
if(c->coded_frame->key_frame)
|
|
||||||
pkt.flags |= PKT_FLAG_KEY;
|
|
||||||
pkt.stream_index= st->index;
|
|
||||||
pkt.data= video_outbuf;
|
|
||||||
pkt.size= out_size;
|
|
||||||
|
|
||||||
/* write the compressed frame in the media file */
|
|
||||||
ret = av_write_frame(oc, &pkt);
|
|
||||||
} else {
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ret != 0) {
|
|
||||||
fprintf(stderr, "Error while writing video frame\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
frame_count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void close_video(AVFormatContext *oc, AVStream *st)
|
|
||||||
{
|
|
||||||
avcodec_close(st->codec);
|
|
||||||
av_free(picture->data[0]);
|
|
||||||
av_free(picture);
|
|
||||||
if (tmp_picture) {
|
|
||||||
av_free(tmp_picture->data[0]);
|
|
||||||
av_free(tmp_picture);
|
|
||||||
}
|
|
||||||
av_free(video_outbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *filename;
|
|
||||||
static AVOutputFormat *fmt;
|
|
||||||
static AVFormatContext *oc;
|
|
||||||
static AVStream *video_st;
|
|
||||||
static double video_pts;
|
|
||||||
|
|
||||||
static int movie_open(int w, int h) {
|
|
||||||
if (fmt->video_codec != CODEC_ID_NONE) {
|
|
||||||
video_st = add_video_stream(oc, fmt->video_codec, w, h);
|
|
||||||
} else
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
/* set the output parameters (must be done even if no
|
|
||||||
parameters). */
|
|
||||||
if (av_set_parameters(oc, NULL) < 0) {
|
|
||||||
fprintf(stderr, "Invalid output format parameters\n");
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
dump_format(oc, 0, filename, 1);
|
|
||||||
|
|
||||||
/* now that all the parameters are set, we can open the audio and
|
|
||||||
video codecs and allocate the necessary encode buffers */
|
|
||||||
if (video_st)
|
|
||||||
open_video(oc, video_st);
|
|
||||||
|
|
||||||
/* open the output file, if needed */
|
|
||||||
if (!(fmt->flags & AVFMT_NOFILE)) {
|
|
||||||
if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
|
|
||||||
fprintf(stderr, "Could not open '%s'\n", filename);
|
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* write the stream header, if any */
|
|
||||||
av_write_header(oc);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int movie_close() {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* close each codec */
|
|
||||||
close_video(oc, video_st);
|
|
||||||
|
|
||||||
/* write the trailer, if any */
|
|
||||||
av_write_trailer(oc);
|
|
||||||
|
|
||||||
/* free the streams */
|
|
||||||
for(i = 0; i < oc->nb_streams; i++) {
|
|
||||||
av_freep(&oc->streams[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(fmt->flags & AVFMT_NOFILE)) {
|
|
||||||
/* close the output file */
|
|
||||||
url_fclose(&oc->pb);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* free the stream */
|
|
||||||
av_free(oc);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static rfbBool quit=FALSE;
|
|
||||||
static void signal_handler(int signal) {
|
|
||||||
fprintf(stderr,"Cleaning up.\n");
|
|
||||||
quit=TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************/
|
|
||||||
/* VNC callback functions */
|
|
||||||
static rfbBool resize(rfbClient* client) {
|
|
||||||
static rfbBool first=TRUE;
|
|
||||||
if(!first) {
|
|
||||||
movie_close();
|
|
||||||
perror("I don't know yet how to change resolutions!\n");
|
|
||||||
}
|
|
||||||
movie_open(client->width, client->height);
|
|
||||||
signal(SIGINT,signal_handler);
|
|
||||||
if(tmp_picture)
|
|
||||||
client->frameBuffer=tmp_picture->data[0];
|
|
||||||
else
|
|
||||||
client->frameBuffer=picture->data[0];
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void update(rfbClient* client,int x,int y,int w,int h) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************/
|
|
||||||
/* media file output */
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
time_t stop=0;
|
|
||||||
rfbClient* client;
|
|
||||||
int i,j;
|
|
||||||
|
|
||||||
/* get a vnc client structure (don't connect yet). */
|
|
||||||
client = rfbGetClient(5,3,2);
|
|
||||||
client->format.redShift=11; client->format.redMax=31;
|
|
||||||
client->format.greenShift=5; client->format.greenMax=63;
|
|
||||||
client->format.blueShift=0; client->format.blueMax=31;
|
|
||||||
|
|
||||||
/* initialize libavcodec, and register all codecs and formats */
|
|
||||||
av_register_all();
|
|
||||||
|
|
||||||
if(!strncmp(argv[argc-1],":",1) ||
|
|
||||||
!strncmp(argv[argc-1],"127.0.0.1",9) ||
|
|
||||||
!strncmp(argv[argc-1],"localhost",9))
|
|
||||||
client->appData.encodingsString="raw";
|
|
||||||
|
|
||||||
filename=0;
|
|
||||||
for(i=1;i<argc;i++) {
|
|
||||||
j=i;
|
|
||||||
if(argc>i+1 && !strcmp("-o",argv[i])) {
|
|
||||||
filename=argv[2];
|
|
||||||
j+=2;
|
|
||||||
} else if(argc>i+1 && !strcmp("-t",argv[i])) {
|
|
||||||
stop=time(0)+atoi(argv[i+1]);
|
|
||||||
j+=2;
|
|
||||||
}
|
|
||||||
if(j>i) {
|
|
||||||
argc-=j-i;
|
|
||||||
memmove(argv+i,argv+j,(argc-i)*sizeof(char*));
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* auto detect the output format from the name. default is
|
|
||||||
mpeg. */
|
|
||||||
fmt = filename?guess_format(NULL, filename, NULL):0;
|
|
||||||
if (!fmt) {
|
|
||||||
printf("Could not deduce output format from file extension: using MPEG.\n");
|
|
||||||
fmt = guess_format("mpeg", NULL, NULL);
|
|
||||||
}
|
|
||||||
if (!fmt) {
|
|
||||||
fprintf(stderr, "Could not find suitable output format\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* allocate the output media context */
|
|
||||||
oc = av_alloc_format_context();
|
|
||||||
if (!oc) {
|
|
||||||
fprintf(stderr, "Memory error\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
oc->oformat = fmt;
|
|
||||||
snprintf(oc->filename, sizeof(oc->filename), "%s", filename);
|
|
||||||
|
|
||||||
/* add the audio and video streams using the default format codecs
|
|
||||||
and initialize the codecs */
|
|
||||||
video_st = NULL;
|
|
||||||
|
|
||||||
/* open VNC connection */
|
|
||||||
client->MallocFrameBuffer=resize;
|
|
||||||
client->GotFrameBufferUpdate=update;
|
|
||||||
if(!rfbInitClient(client,&argc,argv)) {
|
|
||||||
printf("usage: %s [-o output_file] [-t seconds] server:port\n"
|
|
||||||
"Shoot a movie from a VNC server.\n", argv[0]);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if(client->serverPort==-1)
|
|
||||||
client->vncRec->doNotSleep = TRUE; /* vncrec playback */
|
|
||||||
|
|
||||||
/* main loop */
|
|
||||||
|
|
||||||
while(!quit) {
|
|
||||||
int i=WaitForMessage(client,1000000/STREAM_FRAME_RATE);
|
|
||||||
if(i<0) {
|
|
||||||
movie_close();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(i)
|
|
||||||
if(!HandleRFBServerMessage(client))
|
|
||||||
quit=TRUE;
|
|
||||||
else {
|
|
||||||
/* compute current audio and video time */
|
|
||||||
video_pts = (double)video_st->pts.val * video_st->time_base.num / video_st->time_base.den;
|
|
||||||
|
|
||||||
/* write interleaved audio and video frames */
|
|
||||||
write_video_frame(oc, video_st);
|
|
||||||
}
|
|
||||||
if(stop!=0 && stop<time(0))
|
|
||||||
quit=TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
movie_close();
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,894 +0,0 @@
|
|||||||
# Process this file with autoconf to produce a configure script.
|
|
||||||
AC_INIT(LibVNCServer, 0.9.7, http://sourceforge.net/projects/libvncserver)
|
|
||||||
AM_INIT_AUTOMAKE(LibVNCServer, 0.9.7)
|
|
||||||
AM_CONFIG_HEADER(rfbconfig.h)
|
|
||||||
AX_PREFIX_CONFIG_H([rfb/rfbconfig.h])
|
|
||||||
|
|
||||||
# Checks for programs.
|
|
||||||
AC_PROG_CC
|
|
||||||
AM_PROG_CC_C_O
|
|
||||||
if test -z "$CC"; then
|
|
||||||
CCLD="\$(CC)"
|
|
||||||
else
|
|
||||||
CCLD="$CC"
|
|
||||||
fi
|
|
||||||
test "x$GCC" = "xyes" && CFLAGS="$CFLAGS -Wall"
|
|
||||||
AC_PROG_MAKE_SET
|
|
||||||
AC_PROG_LIBTOOL
|
|
||||||
AC_PATH_PROG([AR], [ar], [/usr/bin/ar],
|
|
||||||
[$PATH:/usr/ccs/bin])
|
|
||||||
|
|
||||||
# Options
|
|
||||||
AH_TEMPLATE(WITH_TIGHTVNC_FILETRANSFER, [Disable TightVNCFileTransfer protocol])
|
|
||||||
AC_ARG_WITH(tightvnc-filetransfer,
|
|
||||||
[ --without-filetransfer disable TightVNC file transfer protocol],
|
|
||||||
, [ with_tightvnc_filetransfer=yes ])
|
|
||||||
# AC_DEFINE moved to after libpthread check.
|
|
||||||
|
|
||||||
# WebSockets support
|
|
||||||
AC_CHECK_LIB(resolv, __b64_ntop, HAVE_B64="true", HAVE_B64="false")
|
|
||||||
AH_TEMPLATE(WITH_WEBSOCKETS, [Disable WebSockets support])
|
|
||||||
AC_ARG_WITH(websockets,
|
|
||||||
[ --without-websockets disable WebSockets support],
|
|
||||||
, [ with_websockets=yes ])
|
|
||||||
# AC_DEFINE moved to after libresolve check.
|
|
||||||
|
|
||||||
AH_TEMPLATE(ALLOW24BPP, [Enable 24 bit per pixel in native framebuffer])
|
|
||||||
AC_ARG_WITH(24bpp,
|
|
||||||
[ --without-24bpp disable 24 bpp framebuffers],
|
|
||||||
, [ with_24bpp=yes ])
|
|
||||||
if test "x$with_24bpp" = "xyes"; then
|
|
||||||
AC_DEFINE(ALLOW24BPP)
|
|
||||||
fi
|
|
||||||
AH_TEMPLATE(FFMPEG, [Use ffmpeg (for vnc2mpg)])
|
|
||||||
AC_ARG_WITH(ffmpeg,
|
|
||||||
[ --with-ffmpeg=dir set ffmpeg home directory],,)
|
|
||||||
AC_SUBST(with_ffmpeg)
|
|
||||||
AM_CONDITIONAL(WITH_FFMPEG, test ! -z "$with_ffmpeg")
|
|
||||||
if test ! -z "$with_ffmpeg"; then
|
|
||||||
AC_CHECK_LIB(mp3lame, lame_init, HAVE_MP3LAME="true", HAVE_MP3LAME="false" )
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(HAVE_MP3LAME, test "$HAVE_MP3LAME" = "true")
|
|
||||||
|
|
||||||
# Seem to need this dummy here to induce the 'checking for egrep... grep -E', etc.
|
|
||||||
# before it seemed to be inside the with_jpeg conditional.
|
|
||||||
AC_CHECK_HEADER(thenonexistentheader.h, HAVE_THENONEXISTENTHEADER_H="true")
|
|
||||||
|
|
||||||
# Checks for X libraries
|
|
||||||
HAVE_X11="false"
|
|
||||||
AC_PATH_XTRA
|
|
||||||
AH_TEMPLATE(HAVE_X11, [X11 build environment present])
|
|
||||||
|
|
||||||
# See if we are to build x11vnc:
|
|
||||||
AH_TEMPLATE(HAVE_SYSTEM_LIBVNCSERVER, [Use the system libvncserver build environment for x11vnc.])
|
|
||||||
AC_ARG_WITH(system-libvncserver,
|
|
||||||
[ --with-system-libvncserver use installed libvncserver for x11vnc]
|
|
||||||
[ --with-system-libvncserver=DIR use libvncserver installed in DIR for x11vnc],,)
|
|
||||||
AC_ARG_WITH(x11vnc,
|
|
||||||
[ --with-x11vnc configure for building the x11vnc subdir (if present)]
|
|
||||||
[ you will need to cd to x11vnc and run 'make' etc.],,)
|
|
||||||
|
|
||||||
if test ! -z "$with_x11vnc" -a "$with_x11vnc" = "yes"; then
|
|
||||||
build_x11vnc="yes"
|
|
||||||
elif test "$PACKAGE_NAME" = "x11vnc"; then
|
|
||||||
build_x11vnc="yes"
|
|
||||||
else
|
|
||||||
build_x11vnc="no"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# x11vnc only:
|
|
||||||
if test "$build_x11vnc" = "yes"; then
|
|
||||||
|
|
||||||
AH_TEMPLATE(HAVE_XSHM, [MIT-SHM extension build environment present])
|
|
||||||
AH_TEMPLATE(HAVE_XTEST, [XTEST extension build environment present])
|
|
||||||
AH_TEMPLATE(HAVE_XTESTGRABCONTROL, [XTEST extension has XTestGrabControl])
|
|
||||||
AH_TEMPLATE(HAVE_XKEYBOARD, [XKEYBOARD extension build environment present])
|
|
||||||
AH_TEMPLATE(HAVE_LIBXINERAMA, [XINERAMA extension build environment present])
|
|
||||||
AH_TEMPLATE(HAVE_LIBXRANDR, [XRANDR extension build environment present])
|
|
||||||
AH_TEMPLATE(HAVE_LIBXFIXES, [XFIXES extension build environment present])
|
|
||||||
AH_TEMPLATE(HAVE_LIBXDAMAGE, [XDAMAGE extension build environment present])
|
|
||||||
AH_TEMPLATE(HAVE_LIBXTRAP, [DEC-XTRAP extension build environment present])
|
|
||||||
AH_TEMPLATE(HAVE_RECORD, [RECORD extension build environment present])
|
|
||||||
AH_TEMPLATE(HAVE_SOLARIS_XREADSCREEN, [Solaris XReadScreen available])
|
|
||||||
AH_TEMPLATE(HAVE_IRIX_XREADDISPLAY, [IRIX XReadDisplay available])
|
|
||||||
AH_TEMPLATE(HAVE_FBPM, [FBPM extension build environment present])
|
|
||||||
AH_TEMPLATE(HAVE_DPMS, [DPMS extension build environment present])
|
|
||||||
AH_TEMPLATE(HAVE_LINUX_VIDEODEV_H, [video4linux build environment present])
|
|
||||||
AH_TEMPLATE(HAVE_LINUX_FB_H, [linux fb device build environment present])
|
|
||||||
AH_TEMPLATE(HAVE_LINUX_INPUT_H, [linux/input.h present])
|
|
||||||
AH_TEMPLATE(HAVE_LINUX_UINPUT_H, [linux uinput device build environment present])
|
|
||||||
AH_TEMPLATE(HAVE_MACOSX_NATIVE_DISPLAY, [build MacOS X native display support])
|
|
||||||
|
|
||||||
AC_ARG_WITH(xkeyboard,
|
|
||||||
[ --without-xkeyboard disable xkeyboard extension support],,)
|
|
||||||
AC_ARG_WITH(xinerama,
|
|
||||||
[ --without-xinerama disable xinerama extension support],,)
|
|
||||||
AC_ARG_WITH(xrandr,
|
|
||||||
[ --without-xrandr disable xrandr extension support],,)
|
|
||||||
AC_ARG_WITH(xfixes,
|
|
||||||
[ --without-xfixes disable xfixes extension support],,)
|
|
||||||
AC_ARG_WITH(xdamage,
|
|
||||||
[ --without-xdamage disable xdamage extension support],,)
|
|
||||||
AC_ARG_WITH(xtrap,
|
|
||||||
[ --without-xtrap disable xtrap extension support],,)
|
|
||||||
AC_ARG_WITH(xrecord,
|
|
||||||
[ --without-xrecord disable xrecord extension support],,)
|
|
||||||
AC_ARG_WITH(fbpm,
|
|
||||||
[ --without-fbpm disable fbpm extension support],,)
|
|
||||||
AC_ARG_WITH(dpms,
|
|
||||||
[ --without-dpms disable dpms extension support],,)
|
|
||||||
AC_ARG_WITH(v4l,
|
|
||||||
[ --without-v4l disable video4linux support],,)
|
|
||||||
AC_ARG_WITH(fbdev,
|
|
||||||
[ --without-fbdev disable linux fb device support],,)
|
|
||||||
AC_ARG_WITH(uinput,
|
|
||||||
[ --without-uinput disable linux uinput device support],,)
|
|
||||||
AC_ARG_WITH(macosx-native,
|
|
||||||
[ --without-macosx-native disable MacOS X native display support],,)
|
|
||||||
|
|
||||||
fi
|
|
||||||
# end x11vnc only.
|
|
||||||
|
|
||||||
if test "x$with_x" = "xno"; then
|
|
||||||
HAVE_X11="false"
|
|
||||||
elif test "$X_CFLAGS" != "-DX_DISPLAY_MISSING"; then
|
|
||||||
AC_CHECK_LIB(X11, XGetImage, [AC_DEFINE(HAVE_X11) HAVE_X11="true"],
|
|
||||||
HAVE_X11="false",
|
|
||||||
$X_LIBS $X_PRELIBS -lX11 $X_EXTRA_LIBS)
|
|
||||||
|
|
||||||
# x11vnc only:
|
|
||||||
if test $HAVE_X11 = "true" -a "$build_x11vnc" = "yes"; then
|
|
||||||
X_PRELIBS="$X_PRELIBS -lXext"
|
|
||||||
|
|
||||||
AC_CHECK_LIB(Xext, XShmGetImage,
|
|
||||||
[AC_DEFINE(HAVE_XSHM)], ,
|
|
||||||
$X_LIBS $X_PRELIBS -lX11 $X_EXTRA_LIBS)
|
|
||||||
|
|
||||||
AC_CHECK_LIB(Xext, XReadScreen,
|
|
||||||
[AC_DEFINE(HAVE_SOLARIS_XREADSCREEN)], ,
|
|
||||||
$X_LIBS $X_PRELIBS -lX11 $X_EXTRA_LIBS)
|
|
||||||
|
|
||||||
AC_CHECK_HEADER(X11/extensions/readdisplay.h,
|
|
||||||
[AC_DEFINE(HAVE_IRIX_XREADDISPLAY)], ,
|
|
||||||
[#include <X11/Xlib.h>])
|
|
||||||
|
|
||||||
if test "x$with_fbpm" != "xno"; then
|
|
||||||
AC_CHECK_LIB(Xext, FBPMForceLevel,
|
|
||||||
[AC_DEFINE(HAVE_FBPM)], ,
|
|
||||||
$X_LIBS $X_PRELIBS -lX11 $X_EXTRA_LIBS)
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$with_dpms" != "xno"; then
|
|
||||||
AC_CHECK_LIB(Xext, DPMSForceLevel,
|
|
||||||
[AC_DEFINE(HAVE_DPMS)], ,
|
|
||||||
$X_LIBS $X_PRELIBS -lX11 $X_EXTRA_LIBS)
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CHECK_LIB(Xtst, XTestGrabControl,
|
|
||||||
X_PRELIBS="-lXtst $X_PRELIBS"
|
|
||||||
[AC_DEFINE(HAVE_XTESTGRABCONTROL) HAVE_XTESTGRABCONTROL="true"], ,
|
|
||||||
$X_LIBS $X_PRELIBS -lX11 $X_EXTRA_LIBS)
|
|
||||||
|
|
||||||
AC_CHECK_LIB(Xtst, XTestFakeKeyEvent,
|
|
||||||
X_PRELIBS="-lXtst $X_PRELIBS"
|
|
||||||
[AC_DEFINE(HAVE_XTEST) HAVE_XTEST="true"], ,
|
|
||||||
$X_LIBS $X_PRELIBS -lX11 $X_EXTRA_LIBS)
|
|
||||||
|
|
||||||
if test "x$with_xrecord" != "xno"; then
|
|
||||||
AC_CHECK_LIB(Xtst, XRecordEnableContextAsync,
|
|
||||||
X_PRELIBS="-lXtst $X_PRELIBS"
|
|
||||||
[AC_DEFINE(HAVE_RECORD)], ,
|
|
||||||
$X_LIBS $X_PRELIBS -lX11 $X_EXTRA_LIBS)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# we use XTRAP on X11R5, or user can set X11VNC_USE_XTRAP
|
|
||||||
if test "x$with_xtrap" != "xno"; then
|
|
||||||
if test ! -z "$X11VNC_USE_XTRAP" -o -z "$HAVE_XTESTGRABCONTROL"; then
|
|
||||||
AC_CHECK_LIB(XTrap, XETrapSetGrabServer,
|
|
||||||
X_PRELIBS="$X_PRELIBS -lXTrap"
|
|
||||||
[AC_DEFINE(HAVE_LIBXTRAP)], ,
|
|
||||||
$X_LIBS $X_PRELIBS -lX11 $X_EXTRA_LIBS)
|
|
||||||
# tru64 uses libXETrap.so
|
|
||||||
AC_CHECK_LIB(XETrap, XETrapSetGrabServer,
|
|
||||||
X_PRELIBS="$X_PRELIBS -lXETrap"
|
|
||||||
[AC_DEFINE(HAVE_LIBXTRAP)], ,
|
|
||||||
$X_LIBS $X_PRELIBS -lX11 $X_EXTRA_LIBS)
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$with_xkeyboard" != "xno"; then
|
|
||||||
saved_CPPFLAGS="$CPPFLAGS"
|
|
||||||
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
|
|
||||||
AC_CHECK_HEADER(X11/XKBlib.h, HAVE_XKBLIB_H="true",
|
|
||||||
HAVE_XKBLIB_H="false", [#include <X11/Xlib.h>])
|
|
||||||
CPPFLAGS="$saved_CPPFLAGS"
|
|
||||||
if test $HAVE_XKBLIB_H = "true"; then
|
|
||||||
AC_CHECK_LIB(X11, XkbSelectEvents,
|
|
||||||
[AC_DEFINE(HAVE_XKEYBOARD)], ,
|
|
||||||
$X_LIBS $X_PRELIBS -lX11 $X_EXTRA_LIBS)
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$with_xinerama" != "xno"; then
|
|
||||||
AC_CHECK_LIB(Xinerama, XineramaQueryScreens,
|
|
||||||
X_PRELIBS="$X_PRELIBS -lXinerama"
|
|
||||||
[AC_DEFINE(HAVE_LIBXINERAMA)], ,
|
|
||||||
$X_LIBS $X_PRELIBS -lX11 $X_EXTRA_LIBS)
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$with_xrandr" != "xno"; then
|
|
||||||
AC_CHECK_LIB(Xrandr, XRRSelectInput,
|
|
||||||
X_PRELIBS="$X_PRELIBS -lXrandr"
|
|
||||||
[AC_DEFINE(HAVE_LIBXRANDR) HAVE_LIBXRANDR="true"], ,
|
|
||||||
$X_LIBS $X_PRELIBS -lX11 $X_EXTRA_LIBS)
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$with_xfixes" != "xno"; then
|
|
||||||
AC_CHECK_LIB(Xfixes, XFixesGetCursorImage,
|
|
||||||
X_PRELIBS="$X_PRELIBS -lXfixes"
|
|
||||||
[AC_DEFINE(HAVE_LIBXFIXES) HAVE_LIBXFIXES="true"], ,
|
|
||||||
$X_LIBS $X_PRELIBS -lX11 $X_EXTRA_LIBS)
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$with_xdamage" != "xno"; then
|
|
||||||
AC_CHECK_LIB(Xdamage, XDamageQueryExtension,
|
|
||||||
X_PRELIBS="$X_PRELIBS -lXdamage"
|
|
||||||
[AC_DEFINE(HAVE_LIBXDAMAGE) HAVE_LIBXDAMAGE="true"], ,
|
|
||||||
$X_LIBS $X_PRELIBS -lX11 $X_EXTRA_LIBS)
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test ! -z "$HAVE_LIBXFIXES" -o ! -z "$HAVE_LIBXDAMAGE"; then
|
|
||||||
# need /usr/sfw/lib in RPATH for Solaris 10 and later
|
|
||||||
case `(uname -sr) 2>/dev/null` in
|
|
||||||
"SunOS 5"*) X_EXTRA_LIBS="$X_EXTRA_LIBS -R/usr/sfw/lib" ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
if test ! -z "$HAVE_LIBXRANDR"; then
|
|
||||||
# also need /usr/X11/include for Solaris 10 10/08 and later
|
|
||||||
case `(uname -sr) 2>/dev/null` in
|
|
||||||
"SunOS 5"*) CPPFLAGS="$CPPFLAGS -I/usr/X11/include" ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
X_LIBS="$X_LIBS $X_PRELIBS -lX11 $X_EXTRA_LIBS"
|
|
||||||
fi
|
|
||||||
# end x11vnc only.
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST(X_LIBS)
|
|
||||||
AM_CONDITIONAL(HAVE_X11, test $HAVE_X11 != "false")
|
|
||||||
|
|
||||||
# x11vnc only:
|
|
||||||
if test "$build_x11vnc" = "yes"; then
|
|
||||||
|
|
||||||
if test "x$HAVE_X11" = "xfalse" -a "x$with_x" != "xno"; then
|
|
||||||
AC_MSG_ERROR([
|
|
||||||
==========================================================================
|
|
||||||
*** A working X window system build environment is required to build ***
|
|
||||||
x11vnc. Make sure any required X development packages are installed.
|
|
||||||
If they are installed in non-standard locations, one can use the
|
|
||||||
--x-includes=DIR and --x-libraries=DIR configure options or set the
|
|
||||||
CPPFLAGS and LDFLAGS environment variables to indicate where the X
|
|
||||||
window system header files and libraries may be found. On 64+32 bit
|
|
||||||
machines you may need to point to lib64 or lib32 directories to pick up
|
|
||||||
the correct word size.
|
|
||||||
|
|
||||||
If you want to build x11vnc without X support (e.g. for -rawfb use only
|
|
||||||
or for native Mac OS X), specify the --without-x configure option.
|
|
||||||
==========================================================================
|
|
||||||
])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$HAVE_X11" = "xtrue" -a "x$HAVE_XTEST" != "xtrue"; then
|
|
||||||
AC_MSG_WARN([
|
|
||||||
==========================================================================
|
|
||||||
*** A working build environment for the XTEST extension was not found ***
|
|
||||||
(libXtst). An x11vnc built this way will be *ONLY BARELY USABLE*.
|
|
||||||
You will be able to move the mouse but not click or type. There can
|
|
||||||
also be deadlocks if an application grabs the X server.
|
|
||||||
|
|
||||||
It is recommended that you install the necessary development packages
|
|
||||||
for XTEST (perhaps it is named something like libxtst-dev) and run
|
|
||||||
configure again.
|
|
||||||
==========================================================================
|
|
||||||
])
|
|
||||||
sleep 5
|
|
||||||
fi
|
|
||||||
|
|
||||||
# set some ld -R nonsense
|
|
||||||
#
|
|
||||||
uname_s=`(uname -s) 2>/dev/null`
|
|
||||||
ld_minus_R="yes"
|
|
||||||
if test "x$uname_s" = "xHP-UX"; then
|
|
||||||
ld_minus_R="no"
|
|
||||||
elif test "x$uname_s" = "xOSF1"; then
|
|
||||||
ld_minus_R="no"
|
|
||||||
elif test "x$uname_s" = "xDarwin"; then
|
|
||||||
ld_minus_R="no"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$with_v4l" != "xno"; then
|
|
||||||
AC_CHECK_HEADER(linux/videodev.h,
|
|
||||||
[AC_DEFINE(HAVE_LINUX_VIDEODEV_H)],,)
|
|
||||||
fi
|
|
||||||
if test "x$with_fbdev" != "xno"; then
|
|
||||||
AC_CHECK_HEADER(linux/fb.h,
|
|
||||||
[AC_DEFINE(HAVE_LINUX_FB_H)],,)
|
|
||||||
fi
|
|
||||||
if test "x$with_uinput" != "xno"; then
|
|
||||||
AC_CHECK_HEADER(linux/input.h,
|
|
||||||
[AC_DEFINE(HAVE_LINUX_INPUT_H) HAVE_LINUX_INPUT_H="true"],,)
|
|
||||||
if test "x$HAVE_LINUX_INPUT_H" = "xtrue"; then
|
|
||||||
AC_CHECK_HEADER(linux/uinput.h,
|
|
||||||
[AC_DEFINE(HAVE_LINUX_UINPUT_H)],, [#include <linux/input.h>])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$with_macosx_native" != "xno"; then
|
|
||||||
AC_DEFINE(HAVE_MACOSX_NATIVE_DISPLAY)
|
|
||||||
fi
|
|
||||||
|
|
||||||
AH_TEMPLATE(HAVE_AVAHI, [Avahi/mDNS client build environment present])
|
|
||||||
AC_ARG_WITH(avahi,
|
|
||||||
[ --without-avahi disable support for Avahi/mDNS]
|
|
||||||
[ --with-avahi=DIR use avahi include/library files in DIR],,)
|
|
||||||
if test "x$with_avahi" != "xno"; then
|
|
||||||
printf "checking for avahi... "
|
|
||||||
if test ! -z "$with_avahi" -a "x$with_avahi" != "xyes"; then
|
|
||||||
AVAHI_CFLAGS="-I$with_avahi/include"
|
|
||||||
AVAHI_LIBS="-L$with_avahi/lib -lavahi-common -lavahi-client"
|
|
||||||
echo "using $with_avahi"
|
|
||||||
with_avahi=yes
|
|
||||||
elif pkg-config --atleast-version=0.6.4 avahi-client >/dev/null 2>&1; then
|
|
||||||
AVAHI_CFLAGS=`pkg-config --cflags avahi-client`
|
|
||||||
AVAHI_LIBS=`pkg-config --libs avahi-client`
|
|
||||||
with_avahi=yes
|
|
||||||
echo yes
|
|
||||||
else
|
|
||||||
with_avahi=no
|
|
||||||
echo no
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test "x$with_avahi" = "xyes"; then
|
|
||||||
AC_DEFINE(HAVE_AVAHI)
|
|
||||||
AC_SUBST(AVAHI_CFLAGS)
|
|
||||||
AC_SUBST(AVAHI_LIBS)
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
# end x11vnc only.
|
|
||||||
|
|
||||||
|
|
||||||
AH_TEMPLATE(HAVE_LIBCRYPT, [libcrypt library present])
|
|
||||||
AC_ARG_WITH(crypt,
|
|
||||||
[ --without-crypt disable support for libcrypt],,)
|
|
||||||
if test "x$with_crypt" != "xno"; then
|
|
||||||
AC_CHECK_FUNCS([crypt], HAVE_LIBC_CRYPT="true")
|
|
||||||
if test -z "$HAVE_LIBC_CRYPT"; then
|
|
||||||
AC_CHECK_LIB(crypt, crypt,
|
|
||||||
CRYPT_LIBS="-lcrypt"
|
|
||||||
[AC_DEFINE(HAVE_LIBCRYPT)], ,)
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AC_SUBST(CRYPT_LIBS)
|
|
||||||
|
|
||||||
# some OS's need both -lssl and -lcrypto on link line:
|
|
||||||
AH_TEMPLATE(HAVE_LIBCRYPTO, [openssl libcrypto library present])
|
|
||||||
AC_ARG_WITH(crypto,
|
|
||||||
[ --without-crypto disable support for openssl libcrypto],,)
|
|
||||||
|
|
||||||
AH_TEMPLATE(HAVE_LIBSSL, [openssl libssl library present])
|
|
||||||
AC_ARG_WITH(ssl,
|
|
||||||
[ --without-ssl disable support for openssl libssl]
|
|
||||||
[ --with-ssl=DIR use openssl include/library files in DIR],,)
|
|
||||||
|
|
||||||
if test "x$with_crypto" != "xno" -a "x$with_ssl" != "xno"; then
|
|
||||||
if test ! -z "$with_ssl" -a "x$with_ssl" != "xyes"; then
|
|
||||||
saved_CPPFLAGS="$CPPFLAGS"
|
|
||||||
saved_LDFLAGS="$LDFLAGS"
|
|
||||||
CPPFLAGS="$CPPFLAGS -I$with_ssl/include"
|
|
||||||
LDFLAGS="$LDFLAGS -L$with_ssl/lib"
|
|
||||||
if test "x$ld_minus_R" = "xno"; then
|
|
||||||
:
|
|
||||||
elif test "x$GCC" = "xyes"; then
|
|
||||||
LDFLAGS="$LDFLAGS -Xlinker -R$with_ssl/lib"
|
|
||||||
else
|
|
||||||
LDFLAGS="$LDFLAGS -R$with_ssl/lib"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AC_CHECK_LIB(crypto, RAND_file_name,
|
|
||||||
[AC_DEFINE(HAVE_LIBCRYPTO) HAVE_LIBCRYPTO="true"], ,)
|
|
||||||
if test ! -z "$with_ssl" -a "x$with_ssl" != "xyes"; then
|
|
||||||
if test "x$HAVE_LIBCRYPTO" != "xtrue"; then
|
|
||||||
CPPFLAGS="$saved_CPPFLAGS"
|
|
||||||
LDFLAGS="$saved_LDFLAGS"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
AH_TEMPLATE(HAVE_X509_PRINT_EX_FP, [open ssl X509_print_ex_fp available])
|
|
||||||
if test "x$with_ssl" != "xno"; then
|
|
||||||
if test "x$HAVE_LIBCRYPTO" = "xtrue"; then
|
|
||||||
AC_CHECK_LIB(ssl, SSL_library_init,
|
|
||||||
SSL_LIBS="-lssl -lcrypto"
|
|
||||||
[AC_DEFINE(HAVE_LIBSSL) HAVE_LIBSSL="true"], ,
|
|
||||||
-lcrypto)
|
|
||||||
else
|
|
||||||
AC_CHECK_LIB(ssl, SSL_library_init,
|
|
||||||
SSL_LIBS="-lssl"
|
|
||||||
[AC_DEFINE(HAVE_LIBSSL) HAVE_LIBSSL="true"], ,)
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AC_SUBST(SSL_LIBS)
|
|
||||||
|
|
||||||
if test "x$HAVE_LIBSSL" != "xtrue" -a "x$with_ssl" != "xno"; then
|
|
||||||
AC_MSG_WARN([
|
|
||||||
==========================================================================
|
|
||||||
*** The openssl encryption library libssl.so was not found. ***
|
|
||||||
An x11vnc built this way will not support SSL encryption. To enable
|
|
||||||
SSL install the necessary development packages (perhaps it is named
|
|
||||||
something like libssl-dev) and run configure again.
|
|
||||||
==========================================================================
|
|
||||||
])
|
|
||||||
sleep 5
|
|
||||||
elif test "x$with_ssl" != "xno"; then
|
|
||||||
AC_CHECK_LIB(ssl, X509_print_ex_fp,
|
|
||||||
[AC_DEFINE(HAVE_X509_PRINT_EX_FP) HAVE_X509_PRINT_EX_FP="true"], , $SSL_LIBS
|
|
||||||
)
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Checks for libraries.
|
|
||||||
|
|
||||||
if test ! -z "$with_system_libvncserver" -a "x$with_system_libvncserver" != "xno"; then
|
|
||||||
printf "checking for system libvncserver... "
|
|
||||||
vneed="0.9.1"
|
|
||||||
if test "X$VNEED" != "X"; then
|
|
||||||
vneed=$VNEED
|
|
||||||
fi
|
|
||||||
if test "x$with_system_libvncserver" != "xyes"; then
|
|
||||||
rflag=""
|
|
||||||
if test "x$ld_minus_R" = "xno"; then
|
|
||||||
:
|
|
||||||
elif test "x$GCC" = "xyes"; then
|
|
||||||
rflag="-Xlinker -R$with_system_libvncserver/lib"
|
|
||||||
else
|
|
||||||
rflag="-R$with_system_libvncserver/lib"
|
|
||||||
fi
|
|
||||||
cmd="$with_system_libvncserver/bin/libvncserver-config"
|
|
||||||
if $cmd --version 1>/dev/null 2>&1; then
|
|
||||||
cvers=`$cmd --version 2>/dev/null`
|
|
||||||
cscore=`echo "$cvers" | tr '.' ' ' | awk '{print 10000 * $1 + 100 * $2 + $3}'`
|
|
||||||
nscore=`echo "$vneed" | tr '.' ' ' | awk '{print 10000 * $1 + 100 * $2 + $3}'`
|
|
||||||
|
|
||||||
if test $cscore -lt $nscore; then
|
|
||||||
echo "no"
|
|
||||||
with_system_libvncserver=no
|
|
||||||
AC_MSG_ERROR([
|
|
||||||
==========================================================================
|
|
||||||
*** Need libvncserver version $vneed, have version $cvers ***
|
|
||||||
You are building with a system installed libvncserver and it is not
|
|
||||||
new enough.
|
|
||||||
==========================================================================
|
|
||||||
])
|
|
||||||
else
|
|
||||||
SYSTEM_LIBVNCSERVER_CFLAGS="-I$with_system_libvncserver/include"
|
|
||||||
SYSTEM_LIBVNCSERVER_LIBS="-L$with_system_libvncserver/lib $rflag -lvncserver -lvncclient"
|
|
||||||
echo "using $with_system_libvncserver"
|
|
||||||
with_system_libvncserver=yes
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo " *** cannot run $cmd *** " 1>&2
|
|
||||||
with_system_libvncserver=no
|
|
||||||
echo no
|
|
||||||
fi
|
|
||||||
elif libvncserver-config --version 1>/dev/null 2>&1; then
|
|
||||||
rflag=""
|
|
||||||
rprefix=`libvncserver-config --prefix`
|
|
||||||
if test "x$ld_minus_R" = "xno"; then
|
|
||||||
:
|
|
||||||
elif test "x$GCC" = "xyes"; then
|
|
||||||
rflag=" -Xlinker -R$rprefix/lib "
|
|
||||||
else
|
|
||||||
rflag=" -R$rprefix/lib "
|
|
||||||
fi
|
|
||||||
cvers=`libvncserver-config --version 2>/dev/null`
|
|
||||||
cscore=`echo "$cvers" | tr '.' ' ' | awk '{print 10000 * $1 + 100 * $2 + $3}'`
|
|
||||||
nscore=`echo "$vneed" | tr '.' ' ' | awk '{print 10000 * $1 + 100 * $2 + $3}'`
|
|
||||||
|
|
||||||
if test $cscore -lt $nscore; then
|
|
||||||
echo "no"
|
|
||||||
AC_MSG_ERROR([
|
|
||||||
==========================================================================
|
|
||||||
*** Need libvncserver version $vneed, have version $cvers ***
|
|
||||||
You are building with a system installed libvncserver and it is not
|
|
||||||
new enough.
|
|
||||||
==========================================================================
|
|
||||||
])
|
|
||||||
else
|
|
||||||
SYSTEM_LIBVNCSERVER_CFLAGS=`libvncserver-config --cflags`
|
|
||||||
SYSTEM_LIBVNCSERVER_LIBS="$rflag"`libvncserver-config --libs`
|
|
||||||
with_system_libvncserver=yes
|
|
||||||
echo yes
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
with_system_libvncserver=no
|
|
||||||
echo no
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$with_system_libvncserver" = "xyes"; then
|
|
||||||
AC_DEFINE(HAVE_SYSTEM_LIBVNCSERVER)
|
|
||||||
AC_SUBST(SYSTEM_LIBVNCSERVER_CFLAGS)
|
|
||||||
AC_SUBST(SYSTEM_LIBVNCSERVER_LIBS)
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(HAVE_SYSTEM_LIBVNCSERVER, test "x$with_system_libvncserver" = "xyes")
|
|
||||||
|
|
||||||
|
|
||||||
AC_ARG_WITH(jpeg,
|
|
||||||
[ --without-jpeg disable support for jpeg]
|
|
||||||
[ --with-jpeg=DIR use jpeg include/library files in DIR],,)
|
|
||||||
|
|
||||||
# At this point:
|
|
||||||
# no jpeg on command line with_jpeg=""
|
|
||||||
# -with-jpeg with_jpeg="yes"
|
|
||||||
# -without-jpeg with_jpeg="no"
|
|
||||||
# -with-jpeg=/foo/dir with_jpeg="/foo/dir"
|
|
||||||
|
|
||||||
if test "x$with_jpeg" != "xno"; then
|
|
||||||
if test ! -z "$with_jpeg" -a "x$with_jpeg" != "xyes"; then
|
|
||||||
# add user supplied directory to flags:
|
|
||||||
saved_CPPFLAGS="$CPPFLAGS"
|
|
||||||
saved_LDFLAGS="$LDFLAGS"
|
|
||||||
CPPFLAGS="$CPPFLAGS -I$with_jpeg/include"
|
|
||||||
LDFLAGS="$LDFLAGS -L$with_jpeg/lib"
|
|
||||||
if test "x$ld_minus_R" = "xno"; then
|
|
||||||
:
|
|
||||||
elif test "x$GCC" = "xyes"; then
|
|
||||||
# this is not complete... in general a rat's nest.
|
|
||||||
LDFLAGS="$LDFLAGS -Xlinker -R$with_jpeg/lib"
|
|
||||||
else
|
|
||||||
LDFLAGS="$LDFLAGS -R$with_jpeg/lib"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AC_CHECK_HEADER(jpeglib.h, HAVE_JPEGLIB_H="true")
|
|
||||||
if test "x$HAVE_JPEGLIB_H" = "xtrue"; then
|
|
||||||
AC_CHECK_LIB(jpeg, jpeg_CreateCompress, , HAVE_JPEGLIB_H="")
|
|
||||||
fi
|
|
||||||
if test ! -z "$with_jpeg" -a "x$with_jpeg" != "xyes"; then
|
|
||||||
if test "x$HAVE_JPEGLIB_H" != "xtrue"; then
|
|
||||||
# restore old flags on failure:
|
|
||||||
CPPFLAGS="$saved_CPPFLAGS"
|
|
||||||
LDFLAGS="$saved_LDFLAGS"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test "$build_x11vnc" = "yes"; then
|
|
||||||
if test "x$HAVE_JPEGLIB_H" != "xtrue"; then
|
|
||||||
AC_MSG_WARN([
|
|
||||||
==========================================================================
|
|
||||||
*** The libjpeg compression library was not found. ***
|
|
||||||
This may lead to reduced performance, especially over slow links.
|
|
||||||
If libjpeg is in a non-standard location use --with-jpeg=DIR to
|
|
||||||
indicate the header file is in DIR/include/jpeglib.h and the library
|
|
||||||
in DIR/lib/libjpeg.a. A copy of libjpeg may be obtained from:
|
|
||||||
ftp://ftp.uu.net/graphics/jpeg/
|
|
||||||
==========================================================================
|
|
||||||
])
|
|
||||||
sleep 5
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_ARG_WITH(png,
|
|
||||||
[ --without-png disable support for png]
|
|
||||||
[ --with-png=DIR use png include/library files in DIR],,)
|
|
||||||
|
|
||||||
# At this point:
|
|
||||||
# no png on command line with_png=""
|
|
||||||
# -with-png with_png="yes"
|
|
||||||
# -without-png with_png="no"
|
|
||||||
# -with-png=/foo/dir with_png="/foo/dir"
|
|
||||||
|
|
||||||
if test "x$with_png" != "xno"; then
|
|
||||||
if test ! -z "$with_png" -a "x$with_png" != "xyes"; then
|
|
||||||
# add user supplied directory to flags:
|
|
||||||
saved_CPPFLAGS="$CPPFLAGS"
|
|
||||||
saved_LDFLAGS="$LDFLAGS"
|
|
||||||
CPPFLAGS="$CPPFLAGS -I$with_png/include"
|
|
||||||
LDFLAGS="$LDFLAGS -L$with_png/lib"
|
|
||||||
if test "x$ld_minus_R" = "xno"; then
|
|
||||||
:
|
|
||||||
elif test "x$GCC" = "xyes"; then
|
|
||||||
# this is not complete... in general a rat's nest.
|
|
||||||
LDFLAGS="$LDFLAGS -Xlinker -R$with_png/lib"
|
|
||||||
else
|
|
||||||
LDFLAGS="$LDFLAGS -R$with_png/lib"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AC_CHECK_HEADER(png.h, HAVE_PNGLIB_H="true")
|
|
||||||
if test "x$HAVE_PNGLIB_H" = "xtrue"; then
|
|
||||||
AC_CHECK_LIB(png, png_create_write_struct, , HAVE_PNGLIB_H="")
|
|
||||||
fi
|
|
||||||
if test ! -z "$with_png" -a "x$with_png" != "xyes"; then
|
|
||||||
if test "x$HAVE_PNGLIB_H" != "xtrue"; then
|
|
||||||
# restore old flags on failure:
|
|
||||||
CPPFLAGS="$saved_CPPFLAGS"
|
|
||||||
LDFLAGS="$saved_LDFLAGS"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test "$build_x11vnc" = "yes"; then
|
|
||||||
if test "x$HAVE_PNGLIB_H" != "xtrue"; then
|
|
||||||
AC_MSG_WARN([
|
|
||||||
==========================================================================
|
|
||||||
*** The libpng compression library was not found. ***
|
|
||||||
This may lead to reduced performance, especially over slow links.
|
|
||||||
If libpng is in a non-standard location use --with-png=DIR to
|
|
||||||
indicate the header file is in DIR/include/png.h and the library
|
|
||||||
in DIR/lib/libpng.a. A copy of libpng may be obtained from:
|
|
||||||
http://www.libpng.org/pub/png/libpng.html
|
|
||||||
==========================================================================
|
|
||||||
])
|
|
||||||
sleep 5
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_ARG_WITH(libz,
|
|
||||||
[ --without-libz disable support for deflate],,)
|
|
||||||
AC_ARG_WITH(zlib,
|
|
||||||
[ --without-zlib disable support for deflate]
|
|
||||||
[ --with-zlib=DIR use zlib include/library files in DIR],,)
|
|
||||||
|
|
||||||
if test "x$with_zlib" != "xno" -a "x$with_libz" != "xno"; then
|
|
||||||
if test ! -z "$with_zlib" -a "x$with_zlib" != "xyes"; then
|
|
||||||
saved_CPPFLAGS="$CPPFLAGS"
|
|
||||||
saved_LDFLAGS="$LDFLAGS"
|
|
||||||
CPPFLAGS="$CPPFLAGS -I$with_zlib/include"
|
|
||||||
LDFLAGS="$LDFLAGS -L$with_zlib/lib"
|
|
||||||
if test "x$ld_minus_R" = "xno"; then
|
|
||||||
:
|
|
||||||
elif test "x$GCC" = "xyes"; then
|
|
||||||
LDFLAGS="$LDFLAGS -Xlinker -R$with_zlib/lib"
|
|
||||||
else
|
|
||||||
LDFLAGS="$LDFLAGS -R$with_zlib/lib"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AC_CHECK_HEADER(zlib.h, HAVE_ZLIB_H="true")
|
|
||||||
if test "x$HAVE_ZLIB_H" = "xtrue"; then
|
|
||||||
AC_CHECK_LIB(z, deflate, , HAVE_ZLIB_H="")
|
|
||||||
fi
|
|
||||||
if test ! -z "$with_zlib" -a "x$with_zlib" != "xyes"; then
|
|
||||||
if test "x$HAVE_ZLIB_H" != "xtrue"; then
|
|
||||||
CPPFLAGS="$saved_CPPFLAGS"
|
|
||||||
LDFLAGS="$saved_LDFLAGS"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test "$build_x11vnc" = "yes"; then
|
|
||||||
if test "x$HAVE_ZLIB_H" != "xtrue"; then
|
|
||||||
AC_MSG_WARN([
|
|
||||||
==========================================================================
|
|
||||||
*** The libz compression library was not found. ***
|
|
||||||
This may lead to reduced performance, especially over slow links.
|
|
||||||
If libz is in a non-standard location use --with-zlib=DIR to indicate the
|
|
||||||
header file is in DIR/include/zlib.h and the library in DIR/lib/libz.a.
|
|
||||||
A copy of libz may be obtained from: http://www.gzip.org/zlib/
|
|
||||||
==========================================================================
|
|
||||||
])
|
|
||||||
sleep 5
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_ARG_WITH(pthread,
|
|
||||||
[ --without-pthread disable support for libpthread],,)
|
|
||||||
|
|
||||||
if test "x$with_pthread" != "xno"; then
|
|
||||||
AC_CHECK_HEADER(pthread.h, HAVE_PTHREAD_H="true")
|
|
||||||
if test ! -z "$HAVE_PTHREAD_H"; then
|
|
||||||
AC_CHECK_LIB(pthread, pthread_mutex_lock)
|
|
||||||
AC_CHECK_LIB(pthread, pthread_mutex_lock, HAVE_LIBPTHREAD="true")
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(HAVE_LIBPTHREAD, test ! -z "$HAVE_LIBPTHREAD")
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([for __thread])
|
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM(, [static __thread int p = 0])],
|
|
||||||
[AC_DEFINE(HAVE_TLS, 1,
|
|
||||||
Define to 1 if compiler supports __thread)
|
|
||||||
AC_MSG_RESULT([yes])],
|
|
||||||
[AC_MSG_RESULT([no])])
|
|
||||||
|
|
||||||
# tightvnc-filetransfer implemented using threads:
|
|
||||||
if test -z "$HAVE_LIBPTHREAD"; then
|
|
||||||
with_tightvnc_filetransfer=""
|
|
||||||
fi
|
|
||||||
if test "x$with_tightvnc_filetransfer" = "xyes"; then
|
|
||||||
AC_DEFINE(WITH_TIGHTVNC_FILETRANSFER)
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(WITH_TIGHTVNC_FILETRANSFER, test "$with_tightvnc_filetransfer" = "yes")
|
|
||||||
|
|
||||||
# websockets implemented using base64 from resolve
|
|
||||||
if test "x$HAVE_B64" != "xtrue"; then
|
|
||||||
with_websockets=""
|
|
||||||
fi
|
|
||||||
if test "x$with_websockets" = "xyes"; then
|
|
||||||
LIBS="$LIBS -lresolv"
|
|
||||||
AC_DEFINE(WITH_WEBSOCKETS)
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(WITH_WEBSOCKETS, test "$with_websockets" = "yes")
|
|
||||||
|
|
||||||
AM_CONDITIONAL(HAVE_LIBZ, test ! -z "$HAVE_ZLIB_H")
|
|
||||||
AM_CONDITIONAL(HAVE_LIBJPEG, test ! -z "$HAVE_JPEGLIB_H")
|
|
||||||
AM_CONDITIONAL(HAVE_LIBPNG, test ! -z "$HAVE_PNGLIB_H")
|
|
||||||
|
|
||||||
|
|
||||||
SDLCONFIG="sdl-config"
|
|
||||||
AC_ARG_WITH(sdl-config,
|
|
||||||
[[ --with-sdl-config=FILE
|
|
||||||
Use the given path to sdl-config when determining
|
|
||||||
SDL configuration; defaults to "sdl-config"]],
|
|
||||||
[
|
|
||||||
if test "$withval" != "yes" -a "$withval" != ""; then
|
|
||||||
SDLCONFIG=$withval
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
if test -z "$with_sdl"; then
|
|
||||||
if $SDLCONFIG --version >/dev/null 2>&1; then
|
|
||||||
with_sdl=yes
|
|
||||||
SDL_CFLAGS=`$SDLCONFIG --cflags`
|
|
||||||
SDL_LIBS=`$SDLCONFIG --libs`
|
|
||||||
else
|
|
||||||
with_sdl=no
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(HAVE_LIBSDL, test "x$with_sdl" = "xyes")
|
|
||||||
AC_SUBST(SDL_CFLAGS)
|
|
||||||
AC_SUBST(SDL_LIBS)
|
|
||||||
|
|
||||||
|
|
||||||
AC_CANONICAL_HOST
|
|
||||||
MINGW=`echo $host_os | grep mingw32 2>/dev/null`
|
|
||||||
AM_CONDITIONAL(MINGW, test ! -z "$MINGW" )
|
|
||||||
if test ! -z "$MINGW"; then
|
|
||||||
WSOCKLIB="-lws2_32"
|
|
||||||
fi
|
|
||||||
AC_SUBST(WSOCKLIB)
|
|
||||||
|
|
||||||
# Checks for GnuTLS
|
|
||||||
AH_TEMPLATE(WITH_CLIENT_TLS, [Enable support for gnutls in libvncclient])
|
|
||||||
AC_ARG_WITH(gnutls,
|
|
||||||
[ --without-gnutls disable support for gnutls],,)
|
|
||||||
AC_ARG_WITH(client-tls,
|
|
||||||
[ --without-client-tls disable support for gnutls in libvncclient],,)
|
|
||||||
|
|
||||||
if test "x$with_gnutls" != "xno"; then
|
|
||||||
PKG_CHECK_MODULES(GNUTLS, gnutls >= 2.4.0, , with_client_tls=no)
|
|
||||||
CFLAGS="$CFLAGS $GNUTLS_CFLAGS"
|
|
||||||
LIBS="$LIBS $GNUTLS_LIBS"
|
|
||||||
if test "x$with_client_tls" != "xno"; then
|
|
||||||
AC_DEFINE(WITH_CLIENT_TLS)
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Checks for header files.
|
|
||||||
AC_HEADER_STDC
|
|
||||||
AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h sys/timeb.h syslog.h unistd.h])
|
|
||||||
|
|
||||||
# x11vnc only:
|
|
||||||
if test "$build_x11vnc" = "yes"; then
|
|
||||||
AC_CHECK_HEADERS([pwd.h sys/wait.h utmpx.h termios.h sys/ioctl.h sys/stropts.h])
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Checks for typedefs, structures, and compiler characteristics.
|
|
||||||
AC_C_CONST
|
|
||||||
AC_C_INLINE
|
|
||||||
AC_C_BIGENDIAN
|
|
||||||
AC_TYPE_SIZE_T
|
|
||||||
AC_HEADER_TIME
|
|
||||||
AC_HEADER_SYS_WAIT
|
|
||||||
AC_TYPE_SOCKLEN_T
|
|
||||||
if test ! -d ./rfb; then
|
|
||||||
echo "creating subdir ./rfb for rfbint.h"
|
|
||||||
mkdir ./rfb
|
|
||||||
fi
|
|
||||||
AC_CREATE_STDINT_H(rfb/rfbint.h)
|
|
||||||
AC_CACHE_CHECK([for in_addr_t],
|
|
||||||
vnc_cv_inaddrt, [
|
|
||||||
AC_TRY_COMPILE([#include <sys/types.h>
|
|
||||||
#include <netinet/in.h>],
|
|
||||||
[in_addr_t foo; return 0;],
|
|
||||||
[inaddrt=yes],
|
|
||||||
[inaddrt=no]),
|
|
||||||
])
|
|
||||||
AH_TEMPLATE(NEED_INADDR_T, [Need a typedef for in_addr_t])
|
|
||||||
if test $inaddrt = no ; then
|
|
||||||
AC_DEFINE(NEED_INADDR_T)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Checks for library functions.
|
|
||||||
AC_FUNC_MEMCMP
|
|
||||||
AC_FUNC_STAT
|
|
||||||
AC_FUNC_STRFTIME
|
|
||||||
AC_FUNC_VPRINTF
|
|
||||||
AC_FUNC_FORK
|
|
||||||
AC_CHECK_LIB(nsl,gethostbyname)
|
|
||||||
AC_CHECK_LIB(socket,socket)
|
|
||||||
|
|
||||||
uname_s=`(uname -s) 2>/dev/null`
|
|
||||||
if test "x$uname_s" = "xHP-UX"; then
|
|
||||||
# need -lsec for getspnam()
|
|
||||||
LDFLAGS="$LDFLAGS -lsec"
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CHECK_FUNCS([ftime gethostbyname gethostname gettimeofday inet_ntoa memmove memset mmap mkfifo select socket strchr strcspn strdup strerror strstr])
|
|
||||||
# x11vnc only:
|
|
||||||
if test "$build_x11vnc" = "yes"; then
|
|
||||||
AC_CHECK_FUNCS([setsid setpgrp getpwuid getpwnam getspnam getuid geteuid setuid setgid seteuid setegid initgroups waitpid setutxent grantpt shmat])
|
|
||||||
fi
|
|
||||||
|
|
||||||
# check, if shmget is in cygipc.a
|
|
||||||
AC_CHECK_LIB(cygipc,shmget)
|
|
||||||
AM_CONDITIONAL(CYGIPC, test "$HAVE_CYGIPC" = "true")
|
|
||||||
|
|
||||||
# Check if /dev/vcsa1 exists, if so, define LINUX
|
|
||||||
AM_CONDITIONAL(LINUX, test -c /dev/vcsa1)
|
|
||||||
|
|
||||||
# Check for OS X specific header
|
|
||||||
AC_CHECK_HEADER(ApplicationServices/ApplicationServices.h, HAVE_OSX="true")
|
|
||||||
AM_CONDITIONAL(OSX, test "$HAVE_OSX" = "true")
|
|
||||||
|
|
||||||
# On Solaris 2.7, write() returns ENOENT when it really means EAGAIN
|
|
||||||
AH_TEMPLATE(ENOENT_WORKAROUND, [work around when write() returns ENOENT but does not mean it])
|
|
||||||
case `(uname -sr) 2>/dev/null` in
|
|
||||||
"SunOS 5.7")
|
|
||||||
AC_DEFINE(ENOENT_WORKAROUND)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Check for rpm SOURCES path
|
|
||||||
printf "checking for rpm sources path... "
|
|
||||||
RPMSOURCEDIR="NOT-FOUND"
|
|
||||||
for directory in packages OpenLinux redhat RedHat rpm RPM "" ; do
|
|
||||||
if test -d /usr/src/${directory}/SOURCES; then
|
|
||||||
RPMSOURCEDIR="/usr/src/${directory}/SOURCES/"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
echo "$RPMSOURCEDIR"
|
|
||||||
AM_CONDITIONAL(HAVE_RPM, test "$RPMSOURCEDIR" != "NOT-FOUND")
|
|
||||||
AM_CONDITIONAL(WITH_X11VNC, test "$build_x11vnc" = "yes")
|
|
||||||
AC_SUBST(RPMSOURCEDIR)
|
|
||||||
|
|
||||||
AC_CONFIG_FILES([Makefile
|
|
||||||
libvncserver/Makefile
|
|
||||||
contrib/Makefile
|
|
||||||
examples/Makefile
|
|
||||||
vncterm/Makefile
|
|
||||||
classes/Makefile
|
|
||||||
classes/ssl/Makefile
|
|
||||||
libvncclient/Makefile
|
|
||||||
client_examples/Makefile
|
|
||||||
test/Makefile
|
|
||||||
libvncserver-config
|
|
||||||
LibVNCServer.spec])
|
|
||||||
#
|
|
||||||
# x11vnc only:
|
|
||||||
#
|
|
||||||
if test "$build_x11vnc" = "yes"; then
|
|
||||||
#
|
|
||||||
# NOTE: if you are using the LibVNCServer-X.Y.Z.tar.gz source
|
|
||||||
# tarball and nevertheless want to run autoconf (i.e. aclocal,
|
|
||||||
# autoheader, automake, autoconf) AGAIN (perhaps you have a
|
|
||||||
# special target system, e.g. embedded) then you will need to
|
|
||||||
# comment out the following 'AC_CONFIG_FILES' line to avoid
|
|
||||||
# automake error messages like:
|
|
||||||
#
|
|
||||||
# configure.ac:690: required file `x11vnc/Makefile.in' not found
|
|
||||||
#
|
|
||||||
AC_CONFIG_FILES([x11vnc/Makefile x11vnc/misc/Makefile x11vnc/misc/turbovnc/Makefile])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CONFIG_COMMANDS([chmod-libvncserver-config],[chmod a+x libvncserver-config])
|
|
||||||
AC_OUTPUT
|
|
||||||
chmod a+x ./libvncserver-config
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
# convert a linux console font (8x16 format) to a font definition
|
|
||||||
# suitable for processing with LibVNCServer
|
|
||||||
|
|
||||||
#if($#ARGV == 0) { exit; }
|
|
||||||
|
|
||||||
foreach $i (@ARGV) {
|
|
||||||
$fontname = $i;
|
|
||||||
$fontname =~ s/\.fnt$//;
|
|
||||||
$fontname =~ s/^.*\///g;
|
|
||||||
$fontname =~ y/+/_/;
|
|
||||||
|
|
||||||
print STDERR "$i -> $fontname\n";
|
|
||||||
|
|
||||||
open IN, "<$i";
|
|
||||||
print STDERR read(IN,$x,4096);
|
|
||||||
close(IN);
|
|
||||||
|
|
||||||
open OUT, ">$fontname.h";
|
|
||||||
print OUT "unsigned char ".$fontname."FontData[4096+1]={";
|
|
||||||
for($i=0;$i<4096;$i++) {
|
|
||||||
if(($i%16)==0) {
|
|
||||||
print OUT "\n";
|
|
||||||
}
|
|
||||||
printf OUT "0x%02x,", ord(substr($x,$i));
|
|
||||||
}
|
|
||||||
|
|
||||||
print OUT "\n};\nint ".$fontname."FontMetaData[256*5+1]={\n";
|
|
||||||
for($i=0;$i<256;$i++) {
|
|
||||||
print OUT ($i*16).",8,16,0,0,";
|
|
||||||
}
|
|
||||||
|
|
||||||
print OUT "};\nrfbFontData ".$fontname."Font = { ".$fontname."FontData, "
|
|
||||||
.$fontname."FontMetaData };\n";
|
|
||||||
|
|
||||||
close OUT;
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
x11vnc
|
|
||||||
zippy
|
|
||||||
.deps
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
|||||||
INCLUDES = -I$(top_srcdir)
|
|
||||||
LDADD = ../libvncserver/libvncserver.la @WSOCKLIB@
|
|
||||||
|
|
||||||
noinst_PROGRAMS=zippy
|
|
||||||
|
|
||||||
zippy_SOURCES=zippy.c
|
|
||||||
|
|
@ -1,179 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <rfb/rfb.h>
|
|
||||||
#include <rfb/keysym.h>
|
|
||||||
#include <rfb/default8x16.h>
|
|
||||||
|
|
||||||
static int maxx=400, maxy=400, bpp=4;
|
|
||||||
/* odd maxx doesn't work (vncviewer bug) */
|
|
||||||
|
|
||||||
/* Here we create a structure so that every client has it's own pointer */
|
|
||||||
|
|
||||||
/* turns the framebuffer black */
|
|
||||||
void blank_framebuffer(char* frame_buffer, int x1, int y1, int x2, int y2);
|
|
||||||
/* displays a red bar, a green bar, and a blue bar */
|
|
||||||
void draw_primary_colors (char* frame_buffer, int x1, int y1, int x2, int y2);
|
|
||||||
void linecount (char* frame_buffer);
|
|
||||||
/* handles mouse events */
|
|
||||||
void on_mouse_event (int buttonMask,int x,int y,rfbClientPtr cl);
|
|
||||||
/* handles keyboard events */
|
|
||||||
void on_key_press (rfbBool down,rfbKeySym key,rfbClientPtr cl);
|
|
||||||
|
|
||||||
int main (int argc, char **argv)
|
|
||||||
{
|
|
||||||
rfbScreenInfoPtr server;
|
|
||||||
|
|
||||||
if(!rfbProcessSizeArguments(&maxx,&maxy,&bpp,&argc,argv))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
server = rfbGetScreen (&argc, argv, maxx, maxy, 8, 3, bpp);
|
|
||||||
server->desktopName = "Zippy das wundersquirrel\'s VNC server";
|
|
||||||
server->frameBuffer = (char*)malloc(maxx*maxy*bpp);
|
|
||||||
server->alwaysShared = TRUE;
|
|
||||||
server->kbdAddEvent = on_key_press;
|
|
||||||
server->ptrAddEvent = on_mouse_event;
|
|
||||||
|
|
||||||
rfbInitServer (server);
|
|
||||||
|
|
||||||
blank_framebuffer(server->frameBuffer, 0, 0, maxx, maxy);
|
|
||||||
rfbRunEventLoop (server, -1, FALSE);
|
|
||||||
free(server->frameBuffer);
|
|
||||||
rfbScreenCleanup (server);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void blank_framebuffer(char* frame_buffer, int x1, int y1, int x2, int y2)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i=0; i < maxx * maxy * bpp; i++) frame_buffer[i]=(char) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void draw_primary_colors (char* frame_buffer, int x1, int y1, int x2, int y2)
|
|
||||||
{
|
|
||||||
int i, j, current_pixel;
|
|
||||||
for (i=y1; i < y2; i++){
|
|
||||||
for (j=x1; j < x2; j++) {
|
|
||||||
current_pixel = (i*x2 + j) * bpp;
|
|
||||||
if (i < y2 ) {
|
|
||||||
frame_buffer[current_pixel+0] = (char) 128;
|
|
||||||
frame_buffer[current_pixel+1] = (char) 0;
|
|
||||||
frame_buffer[current_pixel+2] = (char) 0;
|
|
||||||
}
|
|
||||||
if (i < y2/3*2) {
|
|
||||||
frame_buffer[current_pixel+0] = (char) 0;
|
|
||||||
frame_buffer[current_pixel+1] = (char) 128;
|
|
||||||
frame_buffer[current_pixel+2] = (char) 0;
|
|
||||||
}
|
|
||||||
if (i < y2/3) {
|
|
||||||
frame_buffer[current_pixel+0] = (char) 0;
|
|
||||||
frame_buffer[current_pixel+1] = (char) 0;
|
|
||||||
frame_buffer[current_pixel+2] = (char) 128;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Dscho's versions (slower, but works for bpp != 3 or 4) */
|
|
||||||
static void draw_primary_colours_generic(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2)
|
|
||||||
{
|
|
||||||
rfbPixelFormat f=s->serverFormat;
|
|
||||||
int i,j;
|
|
||||||
for(j=y1;j<y2;j++)
|
|
||||||
for(i=x1;i<x2;i++)
|
|
||||||
if(j<y1*2/3+y2/3)
|
|
||||||
rfbDrawPixel(s,i,j,f.redMax<<f.redShift);
|
|
||||||
else if(j<y1/3+y2*2/3)
|
|
||||||
rfbDrawPixel(s,i,j,f.greenMax<<f.greenShift);
|
|
||||||
else
|
|
||||||
rfbDrawPixel(s,i,j,f.blueMax<<f.blueShift);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void draw_primary_colours_generic_fast(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2)
|
|
||||||
{
|
|
||||||
rfbPixelFormat f=s->serverFormat;
|
|
||||||
int i,j,y3=(y1*2+y2)/3,y4=(y1+y2*2)/3;
|
|
||||||
/* draw first pixel */
|
|
||||||
rfbDrawPixel(s,x1,y1,f.redMax<<f.redShift);
|
|
||||||
rfbDrawPixel(s,x1,y3,f.greenMax<<f.greenShift);
|
|
||||||
rfbDrawPixel(s,x1,y4,f.blueMax<<f.blueShift);
|
|
||||||
/* then copy stripes */
|
|
||||||
for(j=0;j<y2-y4;j++)
|
|
||||||
for(i=x1;i<x2;i++) {
|
|
||||||
#define ADDR(x,y) s->frameBuffer+(x)*bpp+(y)*s->paddedWidthInBytes
|
|
||||||
memcpy(ADDR(i,j+y1),ADDR(x1,y1),bpp);
|
|
||||||
memcpy(ADDR(i,j+y3),ADDR(x1,y3),bpp);
|
|
||||||
memcpy(ADDR(i,j+y4),ADDR(x1,y4),bpp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void draw_primary_colours_generic_ultrafast(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2)
|
|
||||||
{
|
|
||||||
rfbPixelFormat f=s->serverFormat;
|
|
||||||
int y3=(y1*2+y2)/3,y4=(y1+y2*2)/3;
|
|
||||||
/* fill rectangles */
|
|
||||||
rfbFillRect(s,x1,y1,x2,y3,f.redMax<<f.redShift);
|
|
||||||
rfbFillRect(s,x1,y3,x2,y4,f.greenMax<<f.greenShift);
|
|
||||||
rfbFillRect(s,x1,y4,x2,y2,f.blueMax<<f.blueShift);
|
|
||||||
}
|
|
||||||
|
|
||||||
void linecount (char* frame_buffer)
|
|
||||||
{
|
|
||||||
int i,j,k, current_pixel;
|
|
||||||
for (i=maxy-4; i>maxy-20; i-=4)
|
|
||||||
for (j=0; j<4; j++) for (k=0; k < maxx; k++) {
|
|
||||||
current_pixel = (i*j*maxx + k) * bpp;
|
|
||||||
if (i%2 == 0) {
|
|
||||||
frame_buffer[current_pixel+0] = (char) 0;
|
|
||||||
frame_buffer[current_pixel+1] = (char) 0;
|
|
||||||
frame_buffer[current_pixel+2] = (char) 128;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i%2 == 1) {
|
|
||||||
frame_buffer[current_pixel+0] = (char) 128;
|
|
||||||
frame_buffer[current_pixel+1] = (char) 0;
|
|
||||||
frame_buffer[current_pixel+2] = (char) 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void on_key_press (rfbBool down,rfbKeySym key,rfbClientPtr cl)
|
|
||||||
{
|
|
||||||
if (down) /* or else the action occurs on both the press and depress */
|
|
||||||
switch (key) {
|
|
||||||
|
|
||||||
case XK_b:
|
|
||||||
case XK_B:
|
|
||||||
blank_framebuffer(cl->screen->frameBuffer, 0, 0, maxx, maxy);
|
|
||||||
rfbDrawString(cl->screen,&default8x16Font,20,maxy-20,"Hello, World!",0xffffff);
|
|
||||||
rfbMarkRectAsModified(cl->screen,0, 0,maxx,maxy);
|
|
||||||
rfbLog("Framebuffer blanked\n");
|
|
||||||
break;
|
|
||||||
case XK_p:
|
|
||||||
case XK_P:
|
|
||||||
/* draw_primary_colors (cl->screen->frameBuffer, 0, 0, maxx, maxy); */
|
|
||||||
draw_primary_colours_generic_ultrafast (cl->screen, 0, 0, maxx, maxy);
|
|
||||||
rfbMarkRectAsModified(cl->screen,0, 0,maxx,maxy);
|
|
||||||
rfbLog("Primary colors displayed\n");
|
|
||||||
break;
|
|
||||||
case XK_Q:
|
|
||||||
case XK_q:
|
|
||||||
rfbLog("Exiting now\n");
|
|
||||||
exit(0);
|
|
||||||
case XK_C:
|
|
||||||
case XK_c:
|
|
||||||
rfbDrawString(cl->screen,&default8x16Font,20,100,"Hello, World!",0xffffff);
|
|
||||||
rfbMarkRectAsModified(cl->screen,0, 0,maxx,maxy);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
rfbLog("The %c key was pressed\n", (char) key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void on_mouse_event (int buttonMask,int x,int y,rfbClientPtr cl)
|
|
||||||
{
|
|
||||||
printf("buttonMask: %i\n"
|
|
||||||
"x: %i\n" "y: %i\n", buttonMask, x, y);
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
#cvs --help-commands 2>&1 | sed "s/[ ][ ]*/ /g" | cut -d " " -f 2
|
|
||||||
add|admin|annotate|checkout|commit|diff|edit|editors|export|history|import|\
|
|
||||||
init|log|login|logout|pserver|rdiff|release|remove|rtag|server|status|\
|
|
||||||
tag|unedit|update|watch|watchers)
|
|
||||||
cmd="$1"; shift;;
|
|
||||||
*) cmd=update;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
cvs -z3 -d :pserver:anonymous@cvs.libvncserver.sf.net:/cvsroot/libvncserver $cmd "$@"
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
Makefile
|
|
||||||
*test
|
|
||||||
example
|
|
||||||
fontsel
|
|
||||||
pnmshow
|
|
||||||
pnmshow24
|
|
||||||
storepasswd
|
|
||||||
vncev
|
|
||||||
Makefile.in
|
|
||||||
.deps
|
|
||||||
simple
|
|
||||||
simple15
|
|
||||||
colourmaptest
|
|
||||||
regiontest
|
|
||||||
mac
|
|
||||||
filetransfer
|
|
||||||
backchannel
|
|
||||||
rotate
|
|
@ -1,141 +0,0 @@
|
|||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char* filename; /* this file is the pipe (set by user) */
|
|
||||||
char is_server; /* this is set by open_control_file */
|
|
||||||
int fd; /* this is set by open_control_file */
|
|
||||||
} single_instance_struct;
|
|
||||||
|
|
||||||
/* returns fd, is_server is set to -1 if server, 0 if client */
|
|
||||||
int open_control_file(single_instance_struct* str)
|
|
||||||
{
|
|
||||||
struct stat buf;
|
|
||||||
|
|
||||||
if(stat(str->filename,&buf)) {
|
|
||||||
mkfifo(str->filename,128|256);
|
|
||||||
str->is_server=-1;
|
|
||||||
str->fd=open(str->filename,O_NONBLOCK|O_RDONLY);
|
|
||||||
} else {
|
|
||||||
str->fd=open(str->filename,O_NONBLOCK|O_WRONLY);
|
|
||||||
if(errno==ENXIO) {
|
|
||||||
str->is_server=-1;
|
|
||||||
str->fd=open(str->filename,O_NONBLOCK|O_RDONLY);
|
|
||||||
} else
|
|
||||||
str->is_server=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return(str->fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
void delete_control_file(single_instance_struct* str)
|
|
||||||
{
|
|
||||||
remove(str->filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
void close_control_file(single_instance_struct* str)
|
|
||||||
{
|
|
||||||
close(str->fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef void (*event_dispatcher)(char* message);
|
|
||||||
|
|
||||||
int get_next_message(char* buffer,int len,single_instance_struct* str,int usecs)
|
|
||||||
{
|
|
||||||
struct timeval tv;
|
|
||||||
fd_set fdset;
|
|
||||||
int num_fds;
|
|
||||||
|
|
||||||
FD_ZERO(&fdset);
|
|
||||||
FD_SET(str->fd,&fdset);
|
|
||||||
tv.tv_sec=0;
|
|
||||||
tv.tv_usec=usecs;
|
|
||||||
|
|
||||||
num_fds=select(str->fd+1,&fdset,NULL,NULL,&tv);
|
|
||||||
if(num_fds) {
|
|
||||||
int reallen;
|
|
||||||
|
|
||||||
reallen=read(str->fd,buffer,len);
|
|
||||||
if(reallen==0) {
|
|
||||||
close(str->fd);
|
|
||||||
str->fd=open(str->filename,O_NONBLOCK|O_RDONLY);
|
|
||||||
num_fds--;
|
|
||||||
}
|
|
||||||
buffer[reallen]=0;
|
|
||||||
#ifdef DEBUG_1INSTANCE
|
|
||||||
if(reallen!=0) rfbLog("message received: %s.\n",buffer);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return(num_fds);
|
|
||||||
}
|
|
||||||
|
|
||||||
int dispatch_event(single_instance_struct* str,event_dispatcher dispatcher,int usecs)
|
|
||||||
{
|
|
||||||
char buffer[1024];
|
|
||||||
int num_fds;
|
|
||||||
|
|
||||||
if((num_fds=get_next_message(buffer,1024,str,usecs)) && buffer[0])
|
|
||||||
dispatcher(buffer);
|
|
||||||
|
|
||||||
return(num_fds);
|
|
||||||
}
|
|
||||||
|
|
||||||
int loop_if_server(single_instance_struct* str,event_dispatcher dispatcher)
|
|
||||||
{
|
|
||||||
open_control_file(str);
|
|
||||||
if(str->is_server) {
|
|
||||||
while(1)
|
|
||||||
dispatch_event(str,dispatcher,50);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(str->fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
void send_message(single_instance_struct* str,char* message)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG_1INSTANCE
|
|
||||||
int i=
|
|
||||||
#endif
|
|
||||||
write(str->fd,message,strlen(message));
|
|
||||||
#ifdef DEBUG_1INSTANCE
|
|
||||||
rfbLog("send: %s => %d(%d)\n",message,i,strlen(message));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DEBUG_MAIN
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
single_instance_struct str1 = { "/tmp/1instance" };
|
|
||||||
|
|
||||||
void my_dispatcher(char* message)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG_1INSTANCE
|
|
||||||
rfbLog("Message arrived: %s.\n",message);
|
|
||||||
#endif
|
|
||||||
if(!strcmp(message,"quit")) {
|
|
||||||
delete_control_file(str1);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc,char** argv)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
loop_if_server(str1,my_dispatcher);
|
|
||||||
|
|
||||||
for(i=1;i<argc;i++)
|
|
||||||
send_event(str1,argv[i]);
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,22 +0,0 @@
|
|||||||
INCLUDES = -I$(top_srcdir)
|
|
||||||
LDADD = ../libvncserver/libvncserver.la @WSOCKLIB@
|
|
||||||
|
|
||||||
if OSX
|
|
||||||
MAC=mac
|
|
||||||
mac_LDFLAGS=-framework ApplicationServices -framework Carbon -framework IOKit
|
|
||||||
endif
|
|
||||||
|
|
||||||
if WITH_TIGHTVNC_FILETRANSFER
|
|
||||||
FILETRANSFER=filetransfer
|
|
||||||
endif
|
|
||||||
|
|
||||||
if HAVE_LIBPTHREAD
|
|
||||||
BLOOPTEST=blooptest
|
|
||||||
endif
|
|
||||||
|
|
||||||
noinst_HEADERS=radon.h rotatetemplate.c
|
|
||||||
|
|
||||||
noinst_PROGRAMS=example pnmshow regiontest pnmshow24 fontsel \
|
|
||||||
vncev storepasswd colourmaptest simple simple15 $(MAC) \
|
|
||||||
$(FILETRANSFER) backchannel $(BLOOPTEST) camera rotate
|
|
||||||
|
|
@ -1,113 +0,0 @@
|
|||||||
#include <rfb/rfb.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is a simple example demonstrating a protocol extension.
|
|
||||||
*
|
|
||||||
* The "back channel" permits sending commands between client and server.
|
|
||||||
* It works by sending plain text messages.
|
|
||||||
*
|
|
||||||
* As suggested in the RFB protocol, the back channel is enabled by asking
|
|
||||||
* for a "pseudo encoding", and enabling the back channel on the client side
|
|
||||||
* as soon as it gets a back channel message from the server.
|
|
||||||
*
|
|
||||||
* This implements the server part.
|
|
||||||
*
|
|
||||||
* Note: If you design your own extension and want it to be useful for others,
|
|
||||||
* too, you should make sure that
|
|
||||||
*
|
|
||||||
* - your server as well as your client can speak to other clients and
|
|
||||||
* servers respectively (i.e. they are nice if they are talking to a
|
|
||||||
* program which does not know about your extension).
|
|
||||||
*
|
|
||||||
* - if the machine is little endian, all 16-bit and 32-bit integers are
|
|
||||||
* swapped before they are sent and after they are received.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define rfbBackChannel 155
|
|
||||||
|
|
||||||
typedef struct backChannelMsg {
|
|
||||||
uint8_t type;
|
|
||||||
uint8_t pad1;
|
|
||||||
uint16_t pad2;
|
|
||||||
uint32_t size;
|
|
||||||
} backChannelMsg;
|
|
||||||
|
|
||||||
rfbBool enableBackChannel(rfbClientPtr cl, void** data, int encoding)
|
|
||||||
{
|
|
||||||
if(encoding == rfbBackChannel) {
|
|
||||||
backChannelMsg msg;
|
|
||||||
const char* text="Server acknowledges back channel encoding\n";
|
|
||||||
uint32_t length = strlen(text)+1;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
rfbLog("Enabling the back channel\n");
|
|
||||||
|
|
||||||
msg.type = rfbBackChannel;
|
|
||||||
msg.size = Swap32IfLE(length);
|
|
||||||
if((n = rfbWriteExact(cl, (char*)&msg, sizeof(msg))) <= 0 ||
|
|
||||||
(n = rfbWriteExact(cl, text, length)) <= 0) {
|
|
||||||
rfbLogPerror("enableBackChannel: write");
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static rfbBool handleBackChannelMessage(rfbClientPtr cl, void* data,
|
|
||||||
const rfbClientToServerMsg* message)
|
|
||||||
{
|
|
||||||
if(message->type == rfbBackChannel) {
|
|
||||||
backChannelMsg msg;
|
|
||||||
char* text;
|
|
||||||
int n;
|
|
||||||
if((n = rfbReadExact(cl, ((char*)&msg)+1, sizeof(backChannelMsg)-1)) <= 0) {
|
|
||||||
if(n != 0)
|
|
||||||
rfbLogPerror("handleBackChannelMessage: read");
|
|
||||||
rfbCloseClient(cl);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
msg.size = Swap32IfLE(msg.size);
|
|
||||||
if((text = malloc(msg.size)) == NULL) {
|
|
||||||
rfbErr("Could not allocate %d bytes\n", msg.size);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
if((n = rfbReadExact(cl, text, msg.size)) <= 0) {
|
|
||||||
if(n != 0)
|
|
||||||
rfbLogPerror("handleBackChannelMessage: read");
|
|
||||||
rfbCloseClient(cl);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
rfbLog("got message:\n%s\n", text);
|
|
||||||
free(text);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int backChannelEncodings[] = {rfbBackChannel, 0};
|
|
||||||
|
|
||||||
static rfbProtocolExtension backChannelExtension = {
|
|
||||||
NULL, /* newClient */
|
|
||||||
NULL, /* init */
|
|
||||||
backChannelEncodings, /* pseudoEncodings */
|
|
||||||
enableBackChannel, /* enablePseudoEncoding */
|
|
||||||
handleBackChannelMessage, /* handleMessage */
|
|
||||||
NULL, /* close */
|
|
||||||
NULL, /* usage */
|
|
||||||
NULL, /* processArgument */
|
|
||||||
NULL /* next extension */
|
|
||||||
};
|
|
||||||
|
|
||||||
int main(int argc,char** argv)
|
|
||||||
{
|
|
||||||
rfbScreenInfoPtr server;
|
|
||||||
|
|
||||||
rfbRegisterProtocolExtension(&backChannelExtension);
|
|
||||||
|
|
||||||
server=rfbGetScreen(&argc,argv,400,300,8,3,4);
|
|
||||||
server->frameBuffer=(char*)malloc(400*300*4);
|
|
||||||
rfbInitServer(server);
|
|
||||||
rfbRunEventLoop(server,-1,FALSE);
|
|
||||||
return(0);
|
|
||||||
}
|
|
@ -1,2 +0,0 @@
|
|||||||
#define BACKGROUND_LOOP_TEST
|
|
||||||
#include "example.c"
|
|
@ -1,152 +0,0 @@
|
|||||||
|
|
||||||
/*
|
|
||||||
* Question: I need to display a live camera image via VNC. Until now I just
|
|
||||||
* grab an image, set the rect to modified and do a 0.1 s sleep to give the
|
|
||||||
* system time to transfer the data.
|
|
||||||
* This is obviously a solution which doesn't scale very well to different
|
|
||||||
* connection speeds/cpu horsepowers, so I wonder if there is a way for the
|
|
||||||
* server application to determine if the updates have been sent. This would
|
|
||||||
* cause the live image update rate to always be the maximum the connection
|
|
||||||
* supports while avoiding excessive loads.
|
|
||||||
*
|
|
||||||
* Thanks in advance,
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Christian Daschill
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Answer: Originally, I thought about using seperate threads and using a
|
|
||||||
* mutex to determine when the frame buffer was being accessed by any client
|
|
||||||
* so we could determine a safe time to take a picture. The probem is, we
|
|
||||||
* are lock-stepping everything with framebuffer access. Why not be a
|
|
||||||
* single-thread application and in-between rfbProcessEvents perform a
|
|
||||||
* camera snapshot. And this is what I do here. It guarantees that the
|
|
||||||
* clients have been serviced before taking another picture.
|
|
||||||
*
|
|
||||||
* The downside to this approach is that the more clients you have, there is
|
|
||||||
* less time available for you to service the camera equating to reduced
|
|
||||||
* frame rate. (or, your clients are on really slow links). Increasing your
|
|
||||||
* systems ethernet transmit queues may help improve the overall performance
|
|
||||||
* as the libvncserver should not stall on transmitting to any single
|
|
||||||
* client.
|
|
||||||
*
|
|
||||||
* Another solution would be to provide a seperate framebuffer for each
|
|
||||||
* client and use mutexes to determine if any particular client is ready for
|
|
||||||
* a snapshot. This way, your not updating a framebuffer for a slow client
|
|
||||||
* while it is being transferred.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <rfb/rfb.h>
|
|
||||||
|
|
||||||
|
|
||||||
#define WIDTH 640
|
|
||||||
#define HEIGHT 480
|
|
||||||
#define BPP 4
|
|
||||||
|
|
||||||
/* 15 frames per second (if we can) */
|
|
||||||
#define PICTURE_TIMEOUT (1.0/15.0)
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* throttle camera updates
|
|
||||||
*/
|
|
||||||
int TimeToTakePicture() {
|
|
||||||
static struct timeval now={0,0}, then={0,0};
|
|
||||||
double elapsed, dnow, dthen;
|
|
||||||
|
|
||||||
gettimeofday(&now,NULL);
|
|
||||||
|
|
||||||
dnow = now.tv_sec + (now.tv_usec /1000000.0);
|
|
||||||
dthen = then.tv_sec + (then.tv_usec/1000000.0);
|
|
||||||
elapsed = dnow - dthen;
|
|
||||||
|
|
||||||
if (elapsed > PICTURE_TIMEOUT)
|
|
||||||
memcpy((char *)&then, (char *)&now, sizeof(struct timeval));
|
|
||||||
return elapsed > PICTURE_TIMEOUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* simulate grabbing a picture from some device
|
|
||||||
*/
|
|
||||||
int TakePicture(unsigned char *buffer)
|
|
||||||
{
|
|
||||||
static int last_line=0, fps=0, fcount=0;
|
|
||||||
int line=0;
|
|
||||||
int i,j;
|
|
||||||
struct timeval now;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* simulate grabbing data from a device by updating the entire framebuffer
|
|
||||||
*/
|
|
||||||
|
|
||||||
for(j=0;j<HEIGHT;++j) {
|
|
||||||
for(i=0;i<WIDTH;++i) {
|
|
||||||
buffer[(j*WIDTH+i)*BPP+0]=(i+j)*128/(WIDTH+HEIGHT); /* red */
|
|
||||||
buffer[(j*WIDTH+i)*BPP+1]=i*128/WIDTH; /* green */
|
|
||||||
buffer[(j*WIDTH+i)*BPP+2]=j*256/HEIGHT; /* blue */
|
|
||||||
}
|
|
||||||
buffer[j*WIDTH*BPP+0]=0xff;
|
|
||||||
buffer[j*WIDTH*BPP+1]=0xff;
|
|
||||||
buffer[j*WIDTH*BPP+2]=0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* simulate the passage of time
|
|
||||||
*
|
|
||||||
* draw a simple black line that moves down the screen. The faster the
|
|
||||||
* client, the more updates it will get, the smoother it will look!
|
|
||||||
*/
|
|
||||||
gettimeofday(&now,NULL);
|
|
||||||
line = now.tv_usec / (1000000/HEIGHT);
|
|
||||||
if (line>HEIGHT) line=HEIGHT-1;
|
|
||||||
memset(&buffer[(WIDTH * BPP) * line], 0, (WIDTH * BPP));
|
|
||||||
|
|
||||||
/* frames per second (informational only) */
|
|
||||||
fcount++;
|
|
||||||
if (last_line > line) {
|
|
||||||
fps = fcount;
|
|
||||||
fcount = 0;
|
|
||||||
}
|
|
||||||
last_line = line;
|
|
||||||
fprintf(stderr,"%03d/%03d Picture (%03d fps)\r", line, HEIGHT, fps);
|
|
||||||
|
|
||||||
/* success! We have a new picture! */
|
|
||||||
return (1==1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Single-threaded application that interleaves client servicing with taking
|
|
||||||
* pictures from the camera. This way, we do not update the framebuffer
|
|
||||||
* while an encoding is working on it too (banding, and image artifacts).
|
|
||||||
*/
|
|
||||||
int main(int argc,char** argv)
|
|
||||||
{
|
|
||||||
long usec;
|
|
||||||
|
|
||||||
rfbScreenInfoPtr server=rfbGetScreen(&argc,argv,WIDTH,HEIGHT,8,3,BPP);
|
|
||||||
server->desktopName = "Live Video Feed Example";
|
|
||||||
server->frameBuffer=(char*)malloc(WIDTH*HEIGHT*BPP);
|
|
||||||
server->alwaysShared=(1==1);
|
|
||||||
|
|
||||||
/* Initialize the server */
|
|
||||||
rfbInitServer(server);
|
|
||||||
|
|
||||||
/* Loop, processing clients and taking pictures */
|
|
||||||
while (rfbIsActive(server)) {
|
|
||||||
if (TimeToTakePicture())
|
|
||||||
if (TakePicture((unsigned char *)server->frameBuffer))
|
|
||||||
rfbMarkRectAsModified(server,0,0,WIDTH,HEIGHT);
|
|
||||||
|
|
||||||
usec = server->deferUpdateTime*1000;
|
|
||||||
rfbProcessEvents(server,usec);
|
|
||||||
}
|
|
||||||
return(0);
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
#include <rfb/rfb.h>
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc,char** argv)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
uint8_t bytes[256*3];
|
|
||||||
|
|
||||||
rfbScreenInfoPtr server=rfbGetScreen(&argc,argv,256,256,8,1,1);
|
|
||||||
|
|
||||||
server->serverFormat.trueColour=FALSE;
|
|
||||||
server->colourMap.count=256;
|
|
||||||
server->colourMap.is16=FALSE;
|
|
||||||
for(i=0;i<256;i++) {
|
|
||||||
bytes[i*3+0]=255-i; /* red */
|
|
||||||
bytes[i*3+1]=0; /* green */
|
|
||||||
bytes[i*3+2]=i; /* blue */
|
|
||||||
}
|
|
||||||
bytes[128*3+0]=0xff;
|
|
||||||
bytes[128*3+1]=0;
|
|
||||||
bytes[128*3+2]=0;
|
|
||||||
server->colourMap.data.bytes=bytes;
|
|
||||||
|
|
||||||
server->frameBuffer=(char*)malloc(256*256);
|
|
||||||
for(i=0;i<256*256;i++)
|
|
||||||
server->frameBuffer[i]=(i/256);
|
|
||||||
|
|
||||||
rfbInitServer(server);
|
|
||||||
rfbRunEventLoop(server,-1,FALSE);
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
@ -1,336 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* This is an example of how to use libvncserver.
|
|
||||||
*
|
|
||||||
* libvncserver example
|
|
||||||
* Copyright (C) 2001 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
|
|
||||||
*
|
|
||||||
* This is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This software is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this software; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
|
||||||
* USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#define sleep Sleep
|
|
||||||
#else
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __IRIX__
|
|
||||||
#include <netdb.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <rfb/rfb.h>
|
|
||||||
#include <rfb/keysym.h>
|
|
||||||
|
|
||||||
static const int bpp=4;
|
|
||||||
static int maxx=800, maxy=600;
|
|
||||||
/* TODO: odd maxx doesn't work (vncviewer bug) */
|
|
||||||
|
|
||||||
/* This initializes a nice (?) background */
|
|
||||||
|
|
||||||
static void initBuffer(unsigned char* buffer)
|
|
||||||
{
|
|
||||||
int i,j;
|
|
||||||
for(j=0;j<maxy;++j) {
|
|
||||||
for(i=0;i<maxx;++i) {
|
|
||||||
buffer[(j*maxx+i)*bpp+0]=(i+j)*128/(maxx+maxy); /* red */
|
|
||||||
buffer[(j*maxx+i)*bpp+1]=i*128/maxx; /* green */
|
|
||||||
buffer[(j*maxx+i)*bpp+2]=j*256/maxy; /* blue */
|
|
||||||
}
|
|
||||||
buffer[j*maxx*bpp+0]=0xff;
|
|
||||||
buffer[j*maxx*bpp+1]=0xff;
|
|
||||||
buffer[j*maxx*bpp+2]=0xff;
|
|
||||||
buffer[j*maxx*bpp+3]=0xff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Here we create a structure so that every client has it's own pointer */
|
|
||||||
|
|
||||||
typedef struct ClientData {
|
|
||||||
rfbBool oldButton;
|
|
||||||
int oldx,oldy;
|
|
||||||
} ClientData;
|
|
||||||
|
|
||||||
static void clientgone(rfbClientPtr cl)
|
|
||||||
{
|
|
||||||
free(cl->clientData);
|
|
||||||
}
|
|
||||||
|
|
||||||
static enum rfbNewClientAction newclient(rfbClientPtr cl)
|
|
||||||
{
|
|
||||||
cl->clientData = (void*)calloc(sizeof(ClientData),1);
|
|
||||||
cl->clientGoneHook = clientgone;
|
|
||||||
return RFB_CLIENT_ACCEPT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* switch to new framebuffer contents */
|
|
||||||
|
|
||||||
static void newframebuffer(rfbScreenInfoPtr screen, int width, int height)
|
|
||||||
{
|
|
||||||
unsigned char *oldfb, *newfb;
|
|
||||||
|
|
||||||
maxx = width;
|
|
||||||
maxy = height;
|
|
||||||
oldfb = (unsigned char*)screen->frameBuffer;
|
|
||||||
newfb = (unsigned char*)malloc(maxx * maxy * bpp);
|
|
||||||
initBuffer(newfb);
|
|
||||||
rfbNewFramebuffer(screen, (char*)newfb, maxx, maxy, 8, 3, bpp);
|
|
||||||
free(oldfb);
|
|
||||||
|
|
||||||
/*** FIXME: Re-install cursor. ***/
|
|
||||||
}
|
|
||||||
|
|
||||||
/* aux function to draw a line */
|
|
||||||
|
|
||||||
static void drawline(unsigned char* buffer,int rowstride,int bpp,int x1,int y1,int x2,int y2)
|
|
||||||
{
|
|
||||||
int i,j;
|
|
||||||
i=x1-x2; j=y1-y2;
|
|
||||||
if(i==0 && j==0) {
|
|
||||||
for(i=0;i<bpp;i++)
|
|
||||||
buffer[y1*rowstride+x1*bpp+i]=0xff;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(i<0) i=-i;
|
|
||||||
if(j<0) j=-j;
|
|
||||||
if(i<j) {
|
|
||||||
if(y1>y2) { i=y2; y2=y1; y1=i; i=x2; x2=x1; x1=i; }
|
|
||||||
for(j=y1;j<=y2;j++)
|
|
||||||
for(i=0;i<bpp;i++)
|
|
||||||
buffer[j*rowstride+(x1+(j-y1)*(x2-x1)/(y2-y1))*bpp+i]=0xff;
|
|
||||||
} else {
|
|
||||||
if(x1>x2) { i=y2; y2=y1; y1=i; i=x2; x2=x1; x1=i; }
|
|
||||||
for(i=x1;i<=x2;i++)
|
|
||||||
for(j=0;j<bpp;j++)
|
|
||||||
buffer[(y1+(i-x1)*(y2-y1)/(x2-x1))*rowstride+i*bpp+j]=0xff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Here the pointer events are handled */
|
|
||||||
|
|
||||||
static void doptr(int buttonMask,int x,int y,rfbClientPtr cl)
|
|
||||||
{
|
|
||||||
ClientData* cd=cl->clientData;
|
|
||||||
|
|
||||||
if(x>=0 && y>=0 && x<maxx && y<maxy) {
|
|
||||||
if(buttonMask) {
|
|
||||||
int i,j,x1,x2,y1,y2;
|
|
||||||
|
|
||||||
if(cd->oldButton==buttonMask) { /* draw a line */
|
|
||||||
drawline((unsigned char*)cl->screen->frameBuffer,cl->screen->paddedWidthInBytes,bpp,
|
|
||||||
x,y,cd->oldx,cd->oldy);
|
|
||||||
x1=x; y1=y;
|
|
||||||
if(x1>cd->oldx) x1++; else cd->oldx++;
|
|
||||||
if(y1>cd->oldy) y1++; else cd->oldy++;
|
|
||||||
rfbMarkRectAsModified(cl->screen,x,y,cd->oldx,cd->oldy);
|
|
||||||
} else { /* draw a point (diameter depends on button) */
|
|
||||||
int w=cl->screen->paddedWidthInBytes;
|
|
||||||
x1=x-buttonMask; if(x1<0) x1=0;
|
|
||||||
x2=x+buttonMask; if(x2>maxx) x2=maxx;
|
|
||||||
y1=y-buttonMask; if(y1<0) y1=0;
|
|
||||||
y2=y+buttonMask; if(y2>maxy) y2=maxy;
|
|
||||||
|
|
||||||
for(i=x1*bpp;i<x2*bpp;i++)
|
|
||||||
for(j=y1;j<y2;j++)
|
|
||||||
cl->screen->frameBuffer[j*w+i]=(char)0xff;
|
|
||||||
rfbMarkRectAsModified(cl->screen,x1,y1,x2,y2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we could get a selection like that:
|
|
||||||
rfbGotXCutText(cl->screen,"Hallo",5);
|
|
||||||
*/
|
|
||||||
} else
|
|
||||||
cd->oldButton=0;
|
|
||||||
|
|
||||||
cd->oldx=x; cd->oldy=y; cd->oldButton=buttonMask;
|
|
||||||
}
|
|
||||||
rfbDefaultPtrAddEvent(buttonMask,x,y,cl);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* aux function to draw a character to x, y */
|
|
||||||
|
|
||||||
#include "radon.h"
|
|
||||||
|
|
||||||
/* Here the key events are handled */
|
|
||||||
|
|
||||||
static void dokey(rfbBool down,rfbKeySym key,rfbClientPtr cl)
|
|
||||||
{
|
|
||||||
if(down) {
|
|
||||||
if(key==XK_Escape)
|
|
||||||
rfbCloseClient(cl);
|
|
||||||
else if(key==XK_F12)
|
|
||||||
/* close down server, disconnecting clients */
|
|
||||||
rfbShutdownServer(cl->screen,TRUE);
|
|
||||||
else if(key==XK_F11)
|
|
||||||
/* close down server, but wait for all clients to disconnect */
|
|
||||||
rfbShutdownServer(cl->screen,FALSE);
|
|
||||||
else if(key==XK_Page_Up) {
|
|
||||||
initBuffer((unsigned char*)cl->screen->frameBuffer);
|
|
||||||
rfbMarkRectAsModified(cl->screen,0,0,maxx,maxy);
|
|
||||||
} else if (key == XK_Up) {
|
|
||||||
if (maxx < 1024) {
|
|
||||||
if (maxx < 800) {
|
|
||||||
newframebuffer(cl->screen, 800, 600);
|
|
||||||
} else {
|
|
||||||
newframebuffer(cl->screen, 1024, 768);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if(key==XK_Down) {
|
|
||||||
if (maxx > 640) {
|
|
||||||
if (maxx > 800) {
|
|
||||||
newframebuffer(cl->screen, 800, 600);
|
|
||||||
} else {
|
|
||||||
newframebuffer(cl->screen, 640, 480);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if(key>=' ' && key<0x100) {
|
|
||||||
ClientData* cd=cl->clientData;
|
|
||||||
int x1=cd->oldx,y1=cd->oldy,x2,y2;
|
|
||||||
cd->oldx+=rfbDrawCharWithClip(cl->screen,&radonFont,cd->oldx,cd->oldy,(char)key,0,0,cl->screen->width,cl->screen->height,0x00ffffff,0x00ffffff);
|
|
||||||
rfbFontBBox(&radonFont,(char)key,&x1,&y1,&x2,&y2);
|
|
||||||
rfbMarkRectAsModified(cl->screen,x1,y1,x2-1,y2-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Example for an XCursor (foreground/background only) */
|
|
||||||
|
|
||||||
#ifdef JUST_AN_EXAMPLE
|
|
||||||
|
|
||||||
static int exampleXCursorWidth=9,exampleXCursorHeight=7;
|
|
||||||
static char exampleXCursor[]=
|
|
||||||
" "
|
|
||||||
" xx xx "
|
|
||||||
" xx xx "
|
|
||||||
" xxx "
|
|
||||||
" xx xx "
|
|
||||||
" xx xx "
|
|
||||||
" ";
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Example for a rich cursor (full-colour) */
|
|
||||||
|
|
||||||
static void MakeRichCursor(rfbScreenInfoPtr rfbScreen)
|
|
||||||
{
|
|
||||||
int i,j,w=32,h=32;
|
|
||||||
rfbCursorPtr c = rfbScreen->cursor;
|
|
||||||
char bitmap[]=
|
|
||||||
" "
|
|
||||||
" xxxxxx "
|
|
||||||
" xxxxxxxxxxxxxxxxx "
|
|
||||||
" xxxxxxxxxxxxxxxxxxxxxx "
|
|
||||||
" xxxxx xxxxxxxx xxxxxxxx "
|
|
||||||
" xxxxxxxxxxxxxxxxxxxxxxxxxxx "
|
|
||||||
" xxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
|
|
||||||
" xxxxx xxxxxxxxxxx xxxxxxx "
|
|
||||||
" xxxx xxxxxxxxx xxxxxx "
|
|
||||||
" xxxxx xxxxxxxxxxx xxxxxxx "
|
|
||||||
" xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
|
|
||||||
" xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
|
|
||||||
" xxxxxxxxxxxx xxxxxxxxxxxxxxx "
|
|
||||||
" xxxxxxxxxxxxxxxxxxxxxxxxxxxx "
|
|
||||||
" xxxxxxxxxxxxxxxxxxxxxxxxxxxx "
|
|
||||||
" xxxxxxxxxxx xxxxxxxxxxxxxx "
|
|
||||||
" xxxxxxxxxx xxxxxxxxxxxx "
|
|
||||||
" xxxxxxxxx xxxxxxxxx "
|
|
||||||
" xxxxxxxxxx xxxxxxxxx "
|
|
||||||
" xxxxxxxxxxxxxxxxxxx "
|
|
||||||
" xxxxxxxxxxxxxxxxxxx "
|
|
||||||
" xxxxxxxxxxxxxxxxxxx "
|
|
||||||
" xxxxxxxxxxxxxxxxx "
|
|
||||||
" xxxxxxxxxxxxxxx "
|
|
||||||
" xxxx xxxxxxxxxxxxx "
|
|
||||||
" xx x xxxxxxxxxxx "
|
|
||||||
" xxx xxxxxxxxxxx "
|
|
||||||
" xxxx xxxxxxxxxxx "
|
|
||||||
" xxxxxx xxxxxxxxxxxx "
|
|
||||||
" xxxxxxxxxxxxxxxxxxxxxx "
|
|
||||||
" xxxxxxxxxxxxxxxx "
|
|
||||||
" ";
|
|
||||||
c=rfbScreen->cursor = rfbMakeXCursor(w,h,bitmap,bitmap);
|
|
||||||
c->xhot = 16; c->yhot = 24;
|
|
||||||
|
|
||||||
c->richSource = (unsigned char*)malloc(w*h*bpp);
|
|
||||||
c->cleanupRichSource = TRUE;
|
|
||||||
for(j=0;j<h;j++) {
|
|
||||||
for(i=0;i<w;i++) {
|
|
||||||
c->richSource[j*w*bpp+i*bpp+0]=i*0xff/w;
|
|
||||||
c->richSource[j*w*bpp+i*bpp+1]=(i+j)*0xff/(w+h);
|
|
||||||
c->richSource[j*w*bpp+i*bpp+2]=j*0xff/h;
|
|
||||||
c->richSource[j*w*bpp+i*bpp+3]=0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialization */
|
|
||||||
|
|
||||||
int main(int argc,char** argv)
|
|
||||||
{
|
|
||||||
rfbScreenInfoPtr rfbScreen =
|
|
||||||
rfbGetScreen(&argc,argv,maxx,maxy,8,3,bpp);
|
|
||||||
rfbScreen->desktopName = "LibVNCServer Example";
|
|
||||||
rfbScreen->frameBuffer = (char*)malloc(maxx*maxy*bpp);
|
|
||||||
rfbScreen->alwaysShared = TRUE;
|
|
||||||
rfbScreen->ptrAddEvent = doptr;
|
|
||||||
rfbScreen->kbdAddEvent = dokey;
|
|
||||||
rfbScreen->newClientHook = newclient;
|
|
||||||
rfbScreen->httpDir = "../classes";
|
|
||||||
rfbScreen->httpEnableProxyConnect = TRUE;
|
|
||||||
|
|
||||||
initBuffer((unsigned char*)rfbScreen->frameBuffer);
|
|
||||||
rfbDrawString(rfbScreen,&radonFont,20,100,"Hello, World!",0xffffff);
|
|
||||||
|
|
||||||
/* This call creates a mask and then a cursor: */
|
|
||||||
/* rfbScreen->defaultCursor =
|
|
||||||
rfbMakeXCursor(exampleCursorWidth,exampleCursorHeight,exampleCursor,0);
|
|
||||||
*/
|
|
||||||
|
|
||||||
MakeRichCursor(rfbScreen);
|
|
||||||
|
|
||||||
/* initialize the server */
|
|
||||||
rfbInitServer(rfbScreen);
|
|
||||||
|
|
||||||
#ifndef BACKGROUND_LOOP_TEST
|
|
||||||
#ifdef USE_OWN_LOOP
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0;rfbIsActive(rfbScreen);i++) {
|
|
||||||
fprintf(stderr,"%d\r",i);
|
|
||||||
rfbProcessEvents(rfbScreen,100000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* this is the blocking event loop, i.e. it never returns */
|
|
||||||
/* 40000 are the microseconds to wait on select(), i.e. 0.04 seconds */
|
|
||||||
rfbRunEventLoop(rfbScreen,40000,FALSE);
|
|
||||||
#endif /* OWN LOOP */
|
|
||||||
#else
|
|
||||||
#if !defined(LIBVNCSERVER_HAVE_LIBPTHREAD)
|
|
||||||
#error "I need pthreads for that."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* this is the non-blocking event loop; a background thread is started */
|
|
||||||
rfbRunEventLoop(rfbScreen,-1,TRUE);
|
|
||||||
fprintf(stderr, "Running background loop...\n");
|
|
||||||
/* now we could do some cool things like rendering in idle time */
|
|
||||||
while(1) sleep(5); /* render(); */
|
|
||||||
#endif /* BACKGROUND_LOOP */
|
|
||||||
|
|
||||||
free(rfbScreen->frameBuffer);
|
|
||||||
rfbScreenCleanup(rfbScreen);
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
@ -1,93 +0,0 @@
|
|||||||
# Microsoft Developer Studio Project File - Name="example" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
|
||||||
# ** NICHT BEARBEITEN **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103
|
|
||||||
|
|
||||||
CFG=example - Win32 Debug
|
|
||||||
!MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
|
|
||||||
!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "example.mak".
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben
|
|
||||||
!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "example.mak" CFG="example - Win32 Debug"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Für die Konfiguration stehen zur Auswahl:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "example - Win32 Release" (basierend auf "Win32 (x86) Console Application")
|
|
||||||
!MESSAGE "example - Win32 Debug" (basierend auf "Win32 (x86) Console Application")
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP AllowPerConfigDependencies 0
|
|
||||||
# PROP Scc_ProjName ""
|
|
||||||
# PROP Scc_LocalPath ""
|
|
||||||
CPP=cl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "example - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "Release"
|
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "Release"
|
|
||||||
# PROP Intermediate_Dir "Release"
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /W3 /GX /O2 /I "zlib" /I "libjpeg" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
|
||||||
# ADD BASE RSC /l 0x407 /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x407 /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib zlib.lib /nologo /subsystem:console /machine:I386 /nodefaultlib:"msvcrt.lib"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "example - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "Debug"
|
|
||||||
# PROP BASE Intermediate_Dir "Debug"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "Debug"
|
|
||||||
# PROP Intermediate_Dir "Debug"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "zlib" /I "libjpeg" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
|
||||||
# ADD BASE RSC /l 0x407 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x407 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib zlib.lib /nologo /subsystem:console /debug /machine:I386 /nodefaultlib:"msvcrt.lib" /pdbtype:sept
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "example - Win32 Release"
|
|
||||||
# Name "example - Win32 Debug"
|
|
||||||
# Begin Group "Sources"
|
|
||||||
|
|
||||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\example.c
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# End Target
|
|
||||||
# End Project
|
|
@ -1,11 +0,0 @@
|
|||||||
#include <rfb/rfb.h>
|
|
||||||
|
|
||||||
int main(int argc,char** argv)
|
|
||||||
{
|
|
||||||
rfbScreenInfoPtr server=rfbGetScreen(&argc,argv,400,300,8,3,4);
|
|
||||||
server->frameBuffer=(char*)malloc(400*300*4);
|
|
||||||
rfbRegisterTightVNCFileTransferExtension();
|
|
||||||
rfbInitServer(server);
|
|
||||||
rfbRunEventLoop(server,-1,FALSE);
|
|
||||||
return(0);
|
|
||||||
}
|
|
@ -1,73 +0,0 @@
|
|||||||
#include <rfb/rfb.h>
|
|
||||||
|
|
||||||
#define FONTDIR "/usr/lib/kbd/consolefonts/"
|
|
||||||
#define DEFAULTFONT FONTDIR "default8x16"
|
|
||||||
|
|
||||||
static char *fontlist[50]={
|
|
||||||
"8x16alt", "b.fnt", "c.fnt", "default8x16", "m.fnt", "ml.fnt", "mod_d.fnt",
|
|
||||||
"mod_s.fnt", "mr.fnt", "mu.fnt", "r.fnt", "rl.fnt", "ro.fnt", "s.fnt",
|
|
||||||
"sc.fnt", "scrawl_s.fnt", "scrawl_w.fnt", "sd.fnt", "t.fnt",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static rfbScreenInfoPtr rfbScreen = NULL;
|
|
||||||
static rfbFontDataPtr curFont = NULL;
|
|
||||||
static void showFont(int index)
|
|
||||||
{
|
|
||||||
char buffer[1024];
|
|
||||||
|
|
||||||
if(!rfbScreen) return;
|
|
||||||
|
|
||||||
if(curFont)
|
|
||||||
rfbFreeFont(curFont);
|
|
||||||
|
|
||||||
strcpy(buffer,FONTDIR);
|
|
||||||
strcat(buffer,fontlist[index]);
|
|
||||||
curFont = rfbLoadConsoleFont(buffer);
|
|
||||||
|
|
||||||
rfbFillRect(rfbScreen,210,30-20,210+10*16,30-20+256*20/16,0xb77797);
|
|
||||||
if(curFont) {
|
|
||||||
int i,j;
|
|
||||||
for(j=0;j<256;j+=16)
|
|
||||||
for(i=0;i<16;i++)
|
|
||||||
rfbDrawCharWithClip(rfbScreen,curFont,210+10*i,30+j*20/16,j+i,
|
|
||||||
0,0,640,480,0xffffff,0x000000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc,char** argv)
|
|
||||||
{
|
|
||||||
rfbFontDataPtr font;
|
|
||||||
rfbScreenInfoPtr s=rfbGetScreen(&argc,argv,640,480,8,3,3);
|
|
||||||
int i,j;
|
|
||||||
|
|
||||||
s->frameBuffer=(char*)malloc(640*480*3);
|
|
||||||
rfbInitServer(s);
|
|
||||||
|
|
||||||
for(j=0;j<480;j++)
|
|
||||||
for(i=0;i<640;i++) {
|
|
||||||
s->frameBuffer[(j*640+i)*3+0]=j*256/480;
|
|
||||||
s->frameBuffer[(j*640+i)*3+1]=i*256/640;
|
|
||||||
s->frameBuffer[(j*640+i)*3+2]=(i+j)*256/(480+640);
|
|
||||||
}
|
|
||||||
|
|
||||||
rfbScreen = s;
|
|
||||||
font=rfbLoadConsoleFont(DEFAULTFONT);
|
|
||||||
if(!font) {
|
|
||||||
rfbErr("Couldn't find %s\n",DEFAULTFONT);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(j=0;j<0 && rfbIsActive(s);j++)
|
|
||||||
rfbProcessEvents(s,900000);
|
|
||||||
|
|
||||||
i = rfbSelectBox(s,font,fontlist,10,20,200,300,0xffdfdf,0x602040,2,showFont);
|
|
||||||
rfbLog("Selection: %d: %s\n",i,(i>=0)?fontlist[i]:"cancelled");
|
|
||||||
|
|
||||||
rfbFreeFont(font);
|
|
||||||
free(s->frameBuffer);
|
|
||||||
rfbScreenCleanup(s);
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
@ -1,551 +0,0 @@
|
|||||||
|
|
||||||
/*
|
|
||||||
* OSXvnc Copyright (C) 2001 Dan McGuirk <mcguirk@incompleteness.net>.
|
|
||||||
* Original Xvnc code Copyright (C) 1999 AT&T Laboratories Cambridge.
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Cut in two parts by Johannes Schindelin (2001): libvncserver and OSXvnc.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* This file implements every system specific function for Mac OS X.
|
|
||||||
*
|
|
||||||
* It includes the keyboard functions:
|
|
||||||
*
|
|
||||||
void KbdAddEvent(down, keySym, cl)
|
|
||||||
rfbBool down;
|
|
||||||
rfbKeySym keySym;
|
|
||||||
rfbClientPtr cl;
|
|
||||||
void KbdReleaseAllKeys()
|
|
||||||
*
|
|
||||||
* the mouse functions:
|
|
||||||
*
|
|
||||||
void PtrAddEvent(buttonMask, x, y, cl)
|
|
||||||
int buttonMask;
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
rfbClientPtr cl;
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <ApplicationServices/ApplicationServices.h>
|
|
||||||
#include <Carbon/Carbon.h>
|
|
||||||
/* zlib doesn't like Byte already defined */
|
|
||||||
#undef Byte
|
|
||||||
#undef TRUE
|
|
||||||
#undef rfbBool
|
|
||||||
#include <rfb/rfb.h>
|
|
||||||
#include <rfb/keysym.h>
|
|
||||||
|
|
||||||
#include <IOKit/pwr_mgt/IOPMLib.h>
|
|
||||||
#include <IOKit/pwr_mgt/IOPM.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
rfbBool rfbNoDimming = FALSE;
|
|
||||||
rfbBool rfbNoSleep = TRUE;
|
|
||||||
|
|
||||||
static pthread_mutex_t dimming_mutex;
|
|
||||||
static unsigned long dim_time;
|
|
||||||
static unsigned long sleep_time;
|
|
||||||
static mach_port_t master_dev_port;
|
|
||||||
static io_connect_t power_mgt;
|
|
||||||
static rfbBool initialized = FALSE;
|
|
||||||
static rfbBool dim_time_saved = FALSE;
|
|
||||||
static rfbBool sleep_time_saved = FALSE;
|
|
||||||
|
|
||||||
static int
|
|
||||||
saveDimSettings(void)
|
|
||||||
{
|
|
||||||
if (IOPMGetAggressiveness(power_mgt,
|
|
||||||
kPMMinutesToDim,
|
|
||||||
&dim_time) != kIOReturnSuccess)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
dim_time_saved = TRUE;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
restoreDimSettings(void)
|
|
||||||
{
|
|
||||||
if (!dim_time_saved)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (IOPMSetAggressiveness(power_mgt,
|
|
||||||
kPMMinutesToDim,
|
|
||||||
dim_time) != kIOReturnSuccess)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
dim_time_saved = FALSE;
|
|
||||||
dim_time = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
saveSleepSettings(void)
|
|
||||||
{
|
|
||||||
if (IOPMGetAggressiveness(power_mgt,
|
|
||||||
kPMMinutesToSleep,
|
|
||||||
&sleep_time) != kIOReturnSuccess)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
sleep_time_saved = TRUE;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
restoreSleepSettings(void)
|
|
||||||
{
|
|
||||||
if (!sleep_time_saved)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (IOPMSetAggressiveness(power_mgt,
|
|
||||||
kPMMinutesToSleep,
|
|
||||||
sleep_time) != kIOReturnSuccess)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
sleep_time_saved = FALSE;
|
|
||||||
sleep_time = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
rfbDimmingInit(void)
|
|
||||||
{
|
|
||||||
pthread_mutex_init(&dimming_mutex, NULL);
|
|
||||||
|
|
||||||
if (IOMasterPort(bootstrap_port, &master_dev_port) != kIOReturnSuccess)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (!(power_mgt = IOPMFindPowerManagement(master_dev_port)))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (rfbNoDimming) {
|
|
||||||
if (saveDimSettings() < 0)
|
|
||||||
return -1;
|
|
||||||
if (IOPMSetAggressiveness(power_mgt,
|
|
||||||
kPMMinutesToDim, 0) != kIOReturnSuccess)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rfbNoSleep) {
|
|
||||||
if (saveSleepSettings() < 0)
|
|
||||||
return -1;
|
|
||||||
if (IOPMSetAggressiveness(power_mgt,
|
|
||||||
kPMMinutesToSleep, 0) != kIOReturnSuccess)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
initialized = TRUE;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
rfbUndim(void)
|
|
||||||
{
|
|
||||||
int result = -1;
|
|
||||||
|
|
||||||
pthread_mutex_lock(&dimming_mutex);
|
|
||||||
|
|
||||||
if (!initialized)
|
|
||||||
goto DONE;
|
|
||||||
|
|
||||||
if (!rfbNoDimming) {
|
|
||||||
if (saveDimSettings() < 0)
|
|
||||||
goto DONE;
|
|
||||||
if (IOPMSetAggressiveness(power_mgt, kPMMinutesToDim, 0) != kIOReturnSuccess)
|
|
||||||
goto DONE;
|
|
||||||
if (restoreDimSettings() < 0)
|
|
||||||
goto DONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!rfbNoSleep) {
|
|
||||||
if (saveSleepSettings() < 0)
|
|
||||||
goto DONE;
|
|
||||||
if (IOPMSetAggressiveness(power_mgt, kPMMinutesToSleep, 0) != kIOReturnSuccess)
|
|
||||||
goto DONE;
|
|
||||||
if (restoreSleepSettings() < 0)
|
|
||||||
goto DONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = 0;
|
|
||||||
|
|
||||||
DONE:
|
|
||||||
pthread_mutex_unlock(&dimming_mutex);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
rfbDimmingShutdown(void)
|
|
||||||
{
|
|
||||||
int result = -1;
|
|
||||||
|
|
||||||
if (!initialized)
|
|
||||||
goto DONE;
|
|
||||||
|
|
||||||
pthread_mutex_lock(&dimming_mutex);
|
|
||||||
if (dim_time_saved)
|
|
||||||
if (restoreDimSettings() < 0)
|
|
||||||
goto DONE;
|
|
||||||
if (sleep_time_saved)
|
|
||||||
if (restoreSleepSettings() < 0)
|
|
||||||
goto DONE;
|
|
||||||
|
|
||||||
result = 0;
|
|
||||||
|
|
||||||
DONE:
|
|
||||||
pthread_mutex_unlock(&dimming_mutex);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
rfbScreenInfoPtr rfbScreen;
|
|
||||||
|
|
||||||
void rfbShutdown(rfbClientPtr cl);
|
|
||||||
|
|
||||||
/* some variables to enable special behaviour */
|
|
||||||
int startTime = -1, maxSecsToConnect = 0;
|
|
||||||
rfbBool disconnectAfterFirstClient = TRUE;
|
|
||||||
|
|
||||||
/* Where do I get the "official" list of Mac key codes?
|
|
||||||
Ripped these out of a Mac II emulator called Basilisk II
|
|
||||||
that I found on the net. */
|
|
||||||
static int keyTable[] = {
|
|
||||||
/* The alphabet */
|
|
||||||
XK_A, 0, /* A */
|
|
||||||
XK_B, 11, /* B */
|
|
||||||
XK_C, 8, /* C */
|
|
||||||
XK_D, 2, /* D */
|
|
||||||
XK_E, 14, /* E */
|
|
||||||
XK_F, 3, /* F */
|
|
||||||
XK_G, 5, /* G */
|
|
||||||
XK_H, 4, /* H */
|
|
||||||
XK_I, 34, /* I */
|
|
||||||
XK_J, 38, /* J */
|
|
||||||
XK_K, 40, /* K */
|
|
||||||
XK_L, 37, /* L */
|
|
||||||
XK_M, 46, /* M */
|
|
||||||
XK_N, 45, /* N */
|
|
||||||
XK_O, 31, /* O */
|
|
||||||
XK_P, 35, /* P */
|
|
||||||
XK_Q, 12, /* Q */
|
|
||||||
XK_R, 15, /* R */
|
|
||||||
XK_S, 1, /* S */
|
|
||||||
XK_T, 17, /* T */
|
|
||||||
XK_U, 32, /* U */
|
|
||||||
XK_V, 9, /* V */
|
|
||||||
XK_W, 13, /* W */
|
|
||||||
XK_X, 7, /* X */
|
|
||||||
XK_Y, 16, /* Y */
|
|
||||||
XK_Z, 6, /* Z */
|
|
||||||
XK_a, 0, /* a */
|
|
||||||
XK_b, 11, /* b */
|
|
||||||
XK_c, 8, /* c */
|
|
||||||
XK_d, 2, /* d */
|
|
||||||
XK_e, 14, /* e */
|
|
||||||
XK_f, 3, /* f */
|
|
||||||
XK_g, 5, /* g */
|
|
||||||
XK_h, 4, /* h */
|
|
||||||
XK_i, 34, /* i */
|
|
||||||
XK_j, 38, /* j */
|
|
||||||
XK_k, 40, /* k */
|
|
||||||
XK_l, 37, /* l */
|
|
||||||
XK_m, 46, /* m */
|
|
||||||
XK_n, 45, /* n */
|
|
||||||
XK_o, 31, /* o */
|
|
||||||
XK_p, 35, /* p */
|
|
||||||
XK_q, 12, /* q */
|
|
||||||
XK_r, 15, /* r */
|
|
||||||
XK_s, 1, /* s */
|
|
||||||
XK_t, 17, /* t */
|
|
||||||
XK_u, 32, /* u */
|
|
||||||
XK_v, 9, /* v */
|
|
||||||
XK_w, 13, /* w */
|
|
||||||
XK_x, 7, /* x */
|
|
||||||
XK_y, 16, /* y */
|
|
||||||
XK_z, 6, /* z */
|
|
||||||
|
|
||||||
/* Numbers */
|
|
||||||
XK_0, 29, /* 0 */
|
|
||||||
XK_1, 18, /* 1 */
|
|
||||||
XK_2, 19, /* 2 */
|
|
||||||
XK_3, 20, /* 3 */
|
|
||||||
XK_4, 21, /* 4 */
|
|
||||||
XK_5, 23, /* 5 */
|
|
||||||
XK_6, 22, /* 6 */
|
|
||||||
XK_7, 26, /* 7 */
|
|
||||||
XK_8, 28, /* 8 */
|
|
||||||
XK_9, 25, /* 9 */
|
|
||||||
|
|
||||||
/* Symbols */
|
|
||||||
XK_exclam, 18, /* ! */
|
|
||||||
XK_at, 19, /* @ */
|
|
||||||
XK_numbersign, 20, /* # */
|
|
||||||
XK_dollar, 21, /* $ */
|
|
||||||
XK_percent, 23, /* % */
|
|
||||||
XK_asciicircum, 22, /* ^ */
|
|
||||||
XK_ampersand, 26, /* & */
|
|
||||||
XK_asterisk, 28, /* * */
|
|
||||||
XK_parenleft, 25, /* ( */
|
|
||||||
XK_parenright, 29, /* ) */
|
|
||||||
XK_minus, 27, /* - */
|
|
||||||
XK_underscore, 27, /* _ */
|
|
||||||
XK_equal, 24, /* = */
|
|
||||||
XK_plus, 24, /* + */
|
|
||||||
XK_grave, 10, /* ` */ /* XXX ? */
|
|
||||||
XK_asciitilde, 10, /* ~ */
|
|
||||||
XK_bracketleft, 33, /* [ */
|
|
||||||
XK_braceleft, 33, /* { */
|
|
||||||
XK_bracketright, 30, /* ] */
|
|
||||||
XK_braceright, 30, /* } */
|
|
||||||
XK_semicolon, 41, /* ; */
|
|
||||||
XK_colon, 41, /* : */
|
|
||||||
XK_apostrophe, 39, /* ' */
|
|
||||||
XK_quotedbl, 39, /* " */
|
|
||||||
XK_comma, 43, /* , */
|
|
||||||
XK_less, 43, /* < */
|
|
||||||
XK_period, 47, /* . */
|
|
||||||
XK_greater, 47, /* > */
|
|
||||||
XK_slash, 44, /* / */
|
|
||||||
XK_question, 44, /* ? */
|
|
||||||
XK_backslash, 42, /* \ */
|
|
||||||
XK_bar, 42, /* | */
|
|
||||||
|
|
||||||
/* "Special" keys */
|
|
||||||
XK_space, 49, /* Space */
|
|
||||||
XK_Return, 36, /* Return */
|
|
||||||
XK_Delete, 117, /* Delete */
|
|
||||||
XK_Tab, 48, /* Tab */
|
|
||||||
XK_Escape, 53, /* Esc */
|
|
||||||
XK_Caps_Lock, 57, /* Caps Lock */
|
|
||||||
XK_Num_Lock, 71, /* Num Lock */
|
|
||||||
XK_Scroll_Lock, 107, /* Scroll Lock */
|
|
||||||
XK_Pause, 113, /* Pause */
|
|
||||||
XK_BackSpace, 51, /* Backspace */
|
|
||||||
XK_Insert, 114, /* Insert */
|
|
||||||
|
|
||||||
/* Cursor movement */
|
|
||||||
XK_Up, 126, /* Cursor Up */
|
|
||||||
XK_Down, 125, /* Cursor Down */
|
|
||||||
XK_Left, 123, /* Cursor Left */
|
|
||||||
XK_Right, 124, /* Cursor Right */
|
|
||||||
XK_Page_Up, 116, /* Page Up */
|
|
||||||
XK_Page_Down, 121, /* Page Down */
|
|
||||||
XK_Home, 115, /* Home */
|
|
||||||
XK_End, 119, /* End */
|
|
||||||
|
|
||||||
/* Numeric keypad */
|
|
||||||
XK_KP_0, 82, /* KP 0 */
|
|
||||||
XK_KP_1, 83, /* KP 1 */
|
|
||||||
XK_KP_2, 84, /* KP 2 */
|
|
||||||
XK_KP_3, 85, /* KP 3 */
|
|
||||||
XK_KP_4, 86, /* KP 4 */
|
|
||||||
XK_KP_5, 87, /* KP 5 */
|
|
||||||
XK_KP_6, 88, /* KP 6 */
|
|
||||||
XK_KP_7, 89, /* KP 7 */
|
|
||||||
XK_KP_8, 91, /* KP 8 */
|
|
||||||
XK_KP_9, 92, /* KP 9 */
|
|
||||||
XK_KP_Enter, 76, /* KP Enter */
|
|
||||||
XK_KP_Decimal, 65, /* KP . */
|
|
||||||
XK_KP_Add, 69, /* KP + */
|
|
||||||
XK_KP_Subtract, 78, /* KP - */
|
|
||||||
XK_KP_Multiply, 67, /* KP * */
|
|
||||||
XK_KP_Divide, 75, /* KP / */
|
|
||||||
|
|
||||||
/* Function keys */
|
|
||||||
XK_F1, 122, /* F1 */
|
|
||||||
XK_F2, 120, /* F2 */
|
|
||||||
XK_F3, 99, /* F3 */
|
|
||||||
XK_F4, 118, /* F4 */
|
|
||||||
XK_F5, 96, /* F5 */
|
|
||||||
XK_F6, 97, /* F6 */
|
|
||||||
XK_F7, 98, /* F7 */
|
|
||||||
XK_F8, 100, /* F8 */
|
|
||||||
XK_F9, 101, /* F9 */
|
|
||||||
XK_F10, 109, /* F10 */
|
|
||||||
XK_F11, 103, /* F11 */
|
|
||||||
XK_F12, 111, /* F12 */
|
|
||||||
|
|
||||||
/* Modifier keys */
|
|
||||||
XK_Shift_L, 56, /* Shift Left */
|
|
||||||
XK_Shift_R, 56, /* Shift Right */
|
|
||||||
XK_Control_L, 59, /* Ctrl Left */
|
|
||||||
XK_Control_R, 59, /* Ctrl Right */
|
|
||||||
XK_Meta_L, 58, /* Logo Left (-> Option) */
|
|
||||||
XK_Meta_R, 58, /* Logo Right (-> Option) */
|
|
||||||
XK_Alt_L, 55, /* Alt Left (-> Command) */
|
|
||||||
XK_Alt_R, 55, /* Alt Right (-> Command) */
|
|
||||||
|
|
||||||
/* Weirdness I can't figure out */
|
|
||||||
#if 0
|
|
||||||
XK_3270_PrintScreen, 105, /* PrintScrn */
|
|
||||||
??? 94, 50, /* International */
|
|
||||||
XK_Menu, 50, /* Menu (-> International) */
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
|
||||||
KbdAddEvent(rfbBool down, rfbKeySym keySym, struct _rfbClientRec* cl)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
CGKeyCode keyCode = -1;
|
|
||||||
int found = 0;
|
|
||||||
|
|
||||||
if(((int)cl->clientData)==-1) return; /* viewOnly */
|
|
||||||
|
|
||||||
rfbUndim();
|
|
||||||
|
|
||||||
for (i = 0; i < (sizeof(keyTable) / sizeof(int)); i += 2) {
|
|
||||||
if (keyTable[i] == keySym) {
|
|
||||||
keyCode = keyTable[i+1];
|
|
||||||
found = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found) {
|
|
||||||
rfbErr("warning: couldn't figure out keycode for X keysym %d (0x%x)\n",
|
|
||||||
(int)keySym, (int)keySym);
|
|
||||||
} else {
|
|
||||||
/* Hopefully I can get away with not specifying a CGCharCode.
|
|
||||||
(Why would you need both?) */
|
|
||||||
CGPostKeyboardEvent((CGCharCode)0, keyCode, down);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
PtrAddEvent(buttonMask, x, y, cl)
|
|
||||||
int buttonMask;
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
rfbClientPtr cl;
|
|
||||||
{
|
|
||||||
CGPoint position;
|
|
||||||
|
|
||||||
if(((int)cl->clientData)==-1) return; /* viewOnly */
|
|
||||||
|
|
||||||
rfbUndim();
|
|
||||||
|
|
||||||
position.x = x;
|
|
||||||
position.y = y;
|
|
||||||
|
|
||||||
CGPostMouseEvent(position, TRUE, 8,
|
|
||||||
(buttonMask & (1 << 0)) ? TRUE : FALSE,
|
|
||||||
(buttonMask & (1 << 1)) ? TRUE : FALSE,
|
|
||||||
(buttonMask & (1 << 2)) ? TRUE : FALSE,
|
|
||||||
(buttonMask & (1 << 3)) ? TRUE : FALSE,
|
|
||||||
(buttonMask & (1 << 4)) ? TRUE : FALSE,
|
|
||||||
(buttonMask & (1 << 5)) ? TRUE : FALSE,
|
|
||||||
(buttonMask & (1 << 6)) ? TRUE : FALSE,
|
|
||||||
(buttonMask & (1 << 7)) ? TRUE : FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
rfbBool viewOnly = FALSE, sharedMode = FALSE;
|
|
||||||
|
|
||||||
void
|
|
||||||
ScreenInit(int argc, char**argv)
|
|
||||||
{
|
|
||||||
int bitsPerSample=CGDisplayBitsPerSample(kCGDirectMainDisplay);
|
|
||||||
rfbScreen = rfbGetScreen(&argc,argv,
|
|
||||||
CGDisplayPixelsWide(kCGDirectMainDisplay),
|
|
||||||
CGDisplayPixelsHigh(kCGDirectMainDisplay),
|
|
||||||
bitsPerSample,
|
|
||||||
CGDisplaySamplesPerPixel(kCGDirectMainDisplay),4);
|
|
||||||
rfbScreen->serverFormat.redShift = bitsPerSample*2;
|
|
||||||
rfbScreen->serverFormat.greenShift = bitsPerSample*1;
|
|
||||||
rfbScreen->serverFormat.blueShift = 0;
|
|
||||||
|
|
||||||
gethostname(rfbScreen->thisHost, 255);
|
|
||||||
rfbScreen->paddedWidthInBytes = CGDisplayBytesPerRow(kCGDirectMainDisplay);
|
|
||||||
rfbScreen->frameBuffer =
|
|
||||||
(char *)CGDisplayBaseAddress(kCGDirectMainDisplay);
|
|
||||||
|
|
||||||
/* we cannot write to the frame buffer */
|
|
||||||
rfbScreen->cursor = NULL;
|
|
||||||
|
|
||||||
rfbScreen->ptrAddEvent = PtrAddEvent;
|
|
||||||
rfbScreen->kbdAddEvent = KbdAddEvent;
|
|
||||||
|
|
||||||
if(sharedMode) {
|
|
||||||
rfbScreen->alwaysShared = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
rfbInitServer(rfbScreen);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
refreshCallback(CGRectCount count, const CGRect *rectArray, void *ignore)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if(startTime>0 && time(0)>startTime+maxSecsToConnect)
|
|
||||||
rfbShutdown(0);
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
|
||||||
rfbMarkRectAsModified(rfbScreen,
|
|
||||||
rectArray[i].origin.x,rectArray[i].origin.y,
|
|
||||||
rectArray[i].origin.x + rectArray[i].size.width,
|
|
||||||
rectArray[i].origin.y + rectArray[i].size.height);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clientGone(rfbClientPtr cl)
|
|
||||||
{
|
|
||||||
rfbShutdown(cl);
|
|
||||||
}
|
|
||||||
|
|
||||||
enum rfbNewClientAction newClient(rfbClientPtr cl)
|
|
||||||
{
|
|
||||||
if(startTime>0 && time(0)>startTime+maxSecsToConnect)
|
|
||||||
rfbShutdown(cl);
|
|
||||||
|
|
||||||
if(disconnectAfterFirstClient)
|
|
||||||
cl->clientGoneHook = clientGone;
|
|
||||||
|
|
||||||
cl->clientData=(void*)((viewOnly)?-1:0);
|
|
||||||
|
|
||||||
return(RFB_CLIENT_ACCEPT);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc,char *argv[])
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for(i=argc-1;i>0;i--)
|
|
||||||
if(i<argc-1 && strcmp(argv[i],"-wait4client")==0) {
|
|
||||||
maxSecsToConnect = atoi(argv[i+1])/1000;
|
|
||||||
startTime = time(0);
|
|
||||||
} else if(strcmp(argv[i],"-runforever")==0) {
|
|
||||||
disconnectAfterFirstClient = FALSE;
|
|
||||||
} else if(strcmp(argv[i],"-viewonly")==0) {
|
|
||||||
viewOnly=TRUE;
|
|
||||||
} else if(strcmp(argv[i],"-shared")==0) {
|
|
||||||
sharedMode=TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
rfbDimmingInit();
|
|
||||||
|
|
||||||
ScreenInit(argc,argv);
|
|
||||||
rfbScreen->newClientHook = newClient;
|
|
||||||
|
|
||||||
/* enter background event loop */
|
|
||||||
rfbRunEventLoop(rfbScreen,40,TRUE);
|
|
||||||
|
|
||||||
/* enter OS X loop */
|
|
||||||
CGRegisterScreenRefreshCallback(refreshCallback, NULL);
|
|
||||||
RunApplicationEventLoop();
|
|
||||||
|
|
||||||
rfbDimmingShutdown();
|
|
||||||
|
|
||||||
return(0); /* never ... */
|
|
||||||
}
|
|
||||||
|
|
||||||
void rfbShutdown(rfbClientPtr cl)
|
|
||||||
{
|
|
||||||
rfbScreenCleanup(rfbScreen);
|
|
||||||
rfbDimmingShutdown();
|
|
||||||
exit(0);
|
|
||||||
}
|
|
@ -1,121 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <rfb/rfb.h>
|
|
||||||
#include <rfb/keysym.h>
|
|
||||||
|
|
||||||
#ifndef HAVE_HANDLEKEY
|
|
||||||
static void HandleKey(rfbBool down,rfbKeySym key,rfbClientPtr cl)
|
|
||||||
{
|
|
||||||
if(down && (key==XK_Escape || key=='q' || key=='Q'))
|
|
||||||
rfbCloseClient(cl);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int main(int argc,char** argv)
|
|
||||||
{
|
|
||||||
FILE* in=stdin;
|
|
||||||
int i,j,k,l,width,height,paddedWidth;
|
|
||||||
char buffer[1024];
|
|
||||||
rfbScreenInfoPtr rfbScreen;
|
|
||||||
enum { BW, GRAY, TRUECOLOUR } picType=TRUECOLOUR;
|
|
||||||
int bytesPerPixel,bitsPerPixelInFile;
|
|
||||||
|
|
||||||
if(argc>1) {
|
|
||||||
in=fopen(argv[1],"rb");
|
|
||||||
if(!in) {
|
|
||||||
printf("Couldn't find file %s.\n",argv[1]);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fgets(buffer,1024,in);
|
|
||||||
if(!strncmp(buffer,"P6",2)) {
|
|
||||||
picType=TRUECOLOUR;
|
|
||||||
bytesPerPixel=4; bitsPerPixelInFile=3*8;
|
|
||||||
} else if(!strncmp(buffer,"P5",2)) {
|
|
||||||
picType=GRAY;
|
|
||||||
bytesPerPixel=1; bitsPerPixelInFile=1*8;
|
|
||||||
} else if(!strncmp(buffer,"P4",2)) {
|
|
||||||
picType=BW;
|
|
||||||
bytesPerPixel=1; bitsPerPixelInFile=1;
|
|
||||||
} else {
|
|
||||||
printf("Not a ppm.\n");
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* skip comments */
|
|
||||||
do {
|
|
||||||
fgets(buffer,1024,in);
|
|
||||||
} while(buffer[0]=='#');
|
|
||||||
|
|
||||||
/* get width & height */
|
|
||||||
sscanf(buffer,"%d %d",&width,&height);
|
|
||||||
rfbLog("Got width %d and height %d.\n",width,height);
|
|
||||||
if(picType!=BW)
|
|
||||||
fgets(buffer,1024,in);
|
|
||||||
else
|
|
||||||
width=1+((width-1)|7);
|
|
||||||
|
|
||||||
/* vncviewers have problems with widths which are no multiple of 4. */
|
|
||||||
paddedWidth = width;
|
|
||||||
if(width&3)
|
|
||||||
paddedWidth+=4-(width&3);
|
|
||||||
|
|
||||||
/* initialize data for vnc server */
|
|
||||||
rfbScreen = rfbGetScreen(&argc,argv,paddedWidth,height,8,(bitsPerPixelInFile+7)/8,bytesPerPixel);
|
|
||||||
if(argc>1)
|
|
||||||
rfbScreen->desktopName = argv[1];
|
|
||||||
else
|
|
||||||
rfbScreen->desktopName = "Picture";
|
|
||||||
rfbScreen->alwaysShared = TRUE;
|
|
||||||
rfbScreen->kbdAddEvent = HandleKey;
|
|
||||||
|
|
||||||
/* enable http */
|
|
||||||
rfbScreen->httpDir = "../classes";
|
|
||||||
|
|
||||||
/* allocate picture and read it */
|
|
||||||
rfbScreen->frameBuffer = (char*)malloc(paddedWidth*bytesPerPixel*height);
|
|
||||||
fread(rfbScreen->frameBuffer,width*bitsPerPixelInFile/8,height,in);
|
|
||||||
fclose(in);
|
|
||||||
|
|
||||||
if(picType!=TRUECOLOUR) {
|
|
||||||
rfbScreen->serverFormat.trueColour=FALSE;
|
|
||||||
rfbScreen->colourMap.count=256;
|
|
||||||
rfbScreen->colourMap.is16=FALSE;
|
|
||||||
rfbScreen->colourMap.data.bytes=malloc(256*3);
|
|
||||||
for(i=0;i<256;i++)
|
|
||||||
memset(rfbScreen->colourMap.data.bytes+3*i,i,3);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(picType) {
|
|
||||||
case TRUECOLOUR:
|
|
||||||
/* correct the format to 4 bytes instead of 3 (and pad to paddedWidth) */
|
|
||||||
for(j=height-1;j>=0;j--) {
|
|
||||||
for(i=width-1;i>=0;i--)
|
|
||||||
for(k=2;k>=0;k--)
|
|
||||||
rfbScreen->frameBuffer[(j*paddedWidth+i)*4+k]=
|
|
||||||
rfbScreen->frameBuffer[(j*width+i)*3+k];
|
|
||||||
for(i=width*4;i<paddedWidth*4;i++)
|
|
||||||
rfbScreen->frameBuffer[j*paddedWidth*4+i]=0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GRAY:
|
|
||||||
break;
|
|
||||||
case BW:
|
|
||||||
/* correct the format from 1 bit to 8 bits */
|
|
||||||
for(j=height-1;j>=0;j--)
|
|
||||||
for(i=width-1;i>=0;i-=8) {
|
|
||||||
l=(unsigned char)rfbScreen->frameBuffer[(j*width+i)/8];
|
|
||||||
for(k=7;k>=0;k--)
|
|
||||||
rfbScreen->frameBuffer[j*paddedWidth+i+7-k]=(l&(1<<k))?0:255;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initialize server */
|
|
||||||
rfbInitServer(rfbScreen);
|
|
||||||
|
|
||||||
/* run event loop */
|
|
||||||
rfbRunEventLoop(rfbScreen,40000,FALSE);
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
@ -1,94 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <rfb/rfb.h>
|
|
||||||
#include <rfb/keysym.h>
|
|
||||||
|
|
||||||
#ifndef LIBVNCSERVER_ALLOW24BPP
|
|
||||||
int main() {
|
|
||||||
printf("I need the ALLOW24BPP LibVNCServer flag to work\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
|
|
||||||
static void HandleKey(rfbBool down,rfbKeySym key,rfbClientPtr cl)
|
|
||||||
{
|
|
||||||
if(down && (key==XK_Escape || key=='q' || key=='Q'))
|
|
||||||
rfbCloseClient(cl);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc,char** argv)
|
|
||||||
{
|
|
||||||
FILE* in=stdin;
|
|
||||||
int j,width,height,paddedWidth;
|
|
||||||
char buffer[1024];
|
|
||||||
rfbScreenInfoPtr rfbScreen;
|
|
||||||
|
|
||||||
if(argc>1) {
|
|
||||||
in=fopen(argv[1],"rb");
|
|
||||||
if(!in) {
|
|
||||||
printf("Couldn't find file %s.\n",argv[1]);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fgets(buffer,1024,in);
|
|
||||||
if(strncmp(buffer,"P6",2)) {
|
|
||||||
printf("Not a ppm.\n");
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* skip comments */
|
|
||||||
do {
|
|
||||||
fgets(buffer,1024,in);
|
|
||||||
} while(buffer[0]=='#');
|
|
||||||
|
|
||||||
/* get width & height */
|
|
||||||
sscanf(buffer,"%d %d",&width,&height);
|
|
||||||
rfbLog("Got width %d and height %d.\n",width,height);
|
|
||||||
fgets(buffer,1024,in);
|
|
||||||
|
|
||||||
/* vncviewers have problems with widths which are no multiple of 4. */
|
|
||||||
paddedWidth = width;
|
|
||||||
|
|
||||||
/* if your vncviewer doesn't have problems with a width
|
|
||||||
which is not a multiple of 4, you can comment this. */
|
|
||||||
if(width&3)
|
|
||||||
paddedWidth+=4-(width&3);
|
|
||||||
|
|
||||||
/* initialize data for vnc server */
|
|
||||||
rfbScreen = rfbGetScreen(&argc,argv,paddedWidth,height,8,3,3);
|
|
||||||
if(argc>1)
|
|
||||||
rfbScreen->desktopName = argv[1];
|
|
||||||
else
|
|
||||||
rfbScreen->desktopName = "Picture";
|
|
||||||
rfbScreen->alwaysShared = TRUE;
|
|
||||||
rfbScreen->kbdAddEvent = HandleKey;
|
|
||||||
|
|
||||||
/* enable http */
|
|
||||||
rfbScreen->httpDir = "../classes";
|
|
||||||
|
|
||||||
/* allocate picture and read it */
|
|
||||||
rfbScreen->frameBuffer = (char*)malloc(paddedWidth*3*height);
|
|
||||||
fread(rfbScreen->frameBuffer,width*3,height,in);
|
|
||||||
fclose(in);
|
|
||||||
|
|
||||||
/* pad to paddedWidth */
|
|
||||||
if(width != paddedWidth) {
|
|
||||||
int padCount = 3*(paddedWidth - width);
|
|
||||||
for(j=height-1;j>=0;j--) {
|
|
||||||
memmove(rfbScreen->frameBuffer+3*paddedWidth*j,
|
|
||||||
rfbScreen->frameBuffer+3*width*j,
|
|
||||||
3*width);
|
|
||||||
memset(rfbScreen->frameBuffer+3*paddedWidth*(j+1)-padCount,
|
|
||||||
0,padCount);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initialize server */
|
|
||||||
rfbInitServer(rfbScreen);
|
|
||||||
|
|
||||||
/* run event loop */
|
|
||||||
rfbRunEventLoop(rfbScreen,40000,FALSE);
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
#endif
|
|
@ -1,195 +0,0 @@
|
|||||||
static unsigned char radonFontData[2280]={
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 32 */
|
|
||||||
0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x10,0x00,0x00, /* 33 */
|
|
||||||
0x00,0x28,0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 34 */
|
|
||||||
0x00,0x44,0x44,0xba,0x44,0x44,0x44,0xba,0x44,0x44,0x00,0x00, /* 35 */
|
|
||||||
0x10,0x7e,0x80,0x90,0x80,0x7c,0x02,0x12,0x02,0xfc,0x10,0x00, /* 36 */
|
|
||||||
0x00,0x62,0x92,0x94,0x68,0x10,0x2c,0x52,0x92,0x8c,0x00,0x00, /* 37 */
|
|
||||||
0x00,0x60,0x90,0x90,0x40,0x20,0x90,0x8a,0x84,0x7a,0x00,0x00, /* 38 */
|
|
||||||
0x00,0x10,0x10,0x10,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 39 */
|
|
||||||
0x00,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x00,0x00, /* 40 */
|
|
||||||
0x00,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x00,0x00, /* 41 */
|
|
||||||
0x00,0x10,0x92,0x54,0x10,0x10,0x54,0x92,0x10,0x00,0x00,0x00, /* 42 */
|
|
||||||
0x00,0x00,0x10,0x10,0x10,0xd6,0x10,0x10,0x10,0x00,0x00,0x00, /* 43 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x30,0x00, /* 44 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00, /* 45 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00, /* 46 */
|
|
||||||
0x00,0x02,0x02,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00, /* 47 */
|
|
||||||
0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x82,0x7c,0x00,0x00, /* 48 */
|
|
||||||
0x00,0x08,0x28,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00, /* 49 */
|
|
||||||
0x00,0xfc,0x02,0x02,0x02,0x7c,0x80,0x80,0x00,0xfe,0x00,0x00, /* 50 */
|
|
||||||
0x00,0xfc,0x02,0x02,0x02,0x3c,0x02,0x02,0x02,0xfc,0x00,0x00, /* 51 */
|
|
||||||
0x00,0x82,0x82,0x82,0x82,0x7a,0x02,0x02,0x02,0x02,0x00,0x00, /* 52 */
|
|
||||||
0x00,0xfe,0x00,0x80,0x80,0x7c,0x02,0x02,0x02,0xfc,0x00,0x00, /* 53 */
|
|
||||||
0x00,0x7c,0x80,0x80,0xbc,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 54 */
|
|
||||||
0x00,0xfc,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00, /* 55 */
|
|
||||||
0x00,0x7c,0x82,0x82,0x82,0x7c,0x82,0x82,0x82,0x7c,0x00,0x00, /* 56 */
|
|
||||||
0x00,0x7c,0x82,0x82,0x82,0x82,0x7a,0x02,0x02,0xfc,0x00,0x00, /* 57 */
|
|
||||||
0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00, /* 58 */
|
|
||||||
0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x10,0x10,0x60,0x00,0x00, /* 59 */
|
|
||||||
0x00,0x08,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x08,0x00,0x00, /* 60 */
|
|
||||||
0x00,0x00,0x00,0x00,0xfe,0x00,0xfe,0x00,0x00,0x00,0x00,0x00, /* 61 */
|
|
||||||
0x00,0x10,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x10,0x00,0x00, /* 62 */
|
|
||||||
0x00,0xfc,0x02,0x02,0x02,0x1c,0x20,0x20,0x00,0x20,0x00,0x00, /* 63 */
|
|
||||||
0x00,0x7c,0x82,0x8a,0x92,0x92,0x92,0x8c,0x80,0x7c,0x00,0x00, /* 64 */
|
|
||||||
0x00,0x7c,0x82,0x82,0x82,0x82,0xba,0x82,0x82,0x82,0x00,0x00, /* 65 */
|
|
||||||
0x00,0xbc,0x82,0x82,0x82,0xbc,0x82,0x82,0x82,0xbc,0x00,0x00, /* 66 */
|
|
||||||
0x00,0x7c,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x7c,0x00,0x00, /* 67 */
|
|
||||||
0x00,0xbc,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xbc,0x00,0x00, /* 68 */
|
|
||||||
0x00,0x7c,0x80,0x80,0x80,0xb8,0x80,0x80,0x80,0x7c,0x00,0x00, /* 69 */
|
|
||||||
0x00,0x7c,0x80,0x80,0x80,0xb8,0x80,0x80,0x80,0x80,0x00,0x00, /* 70 */
|
|
||||||
0x00,0x7c,0x80,0x80,0x80,0x80,0x9a,0x82,0x82,0x7c,0x00,0x00, /* 71 */
|
|
||||||
0x00,0x82,0x82,0x82,0x82,0xba,0x82,0x82,0x82,0x82,0x00,0x00, /* 72 */
|
|
||||||
0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 73 */
|
|
||||||
0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x84,0x78,0x00,0x00, /* 74 */
|
|
||||||
0x00,0x82,0x82,0x82,0x82,0xbc,0x82,0x82,0x82,0x82,0x00,0x00, /* 75 */
|
|
||||||
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x7e,0x00,0x00, /* 76 */
|
|
||||||
0x00,0x7c,0x82,0x92,0x92,0x92,0x92,0x82,0x82,0x82,0x00,0x00, /* 77 */
|
|
||||||
0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x00,0x00, /* 78 */
|
|
||||||
0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 79 */
|
|
||||||
0x00,0xbc,0x82,0x82,0x82,0xbc,0x80,0x80,0x80,0x80,0x00,0x00, /* 80 */
|
|
||||||
0x00,0x7c,0x82,0x82,0x82,0x82,0x8a,0x8a,0x82,0x7c,0x00,0x00, /* 81 */
|
|
||||||
0x00,0xbc,0x82,0x82,0x82,0xbc,0x82,0x82,0x82,0x82,0x00,0x00, /* 82 */
|
|
||||||
0x00,0x7e,0x80,0x80,0x80,0x7c,0x02,0x02,0x02,0xfc,0x00,0x00, /* 83 */
|
|
||||||
0x00,0xfe,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 84 */
|
|
||||||
0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 85 */
|
|
||||||
0x00,0x82,0x82,0x82,0x82,0x82,0x84,0x88,0x90,0xa0,0x00,0x00, /* 86 */
|
|
||||||
0x00,0x82,0x82,0x82,0x82,0x92,0x92,0x92,0x82,0x7c,0x00,0x00, /* 87 */
|
|
||||||
0x00,0x82,0x82,0x82,0x82,0x7c,0x82,0x82,0x82,0x82,0x00,0x00, /* 88 */
|
|
||||||
0x00,0x82,0x82,0x82,0x82,0x7c,0x00,0x10,0x10,0x10,0x00,0x00, /* 89 */
|
|
||||||
0x00,0xfc,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x7e,0x00,0x00, /* 90 */
|
|
||||||
0x00,0x1c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x1c,0x00,0x00, /* 91 */
|
|
||||||
0x00,0x80,0x80,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00, /* 92 */
|
|
||||||
0x00,0x38,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x38,0x00,0x00, /* 93 */
|
|
||||||
0x00,0x38,0x44,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 94 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00, /* 95 */
|
|
||||||
0x00,0x08,0x08,0x08,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 96 */
|
|
||||||
0x00,0x00,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 97 */
|
|
||||||
0x00,0x00,0x40,0x40,0x5c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 98 */
|
|
||||||
0x00,0x00,0x00,0x00,0x3c,0x40,0x40,0x40,0x40,0x3c,0x00,0x00, /* 99 */
|
|
||||||
0x00,0x00,0x02,0x02,0x3a,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 100 */
|
|
||||||
0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x5c,0x40,0x3c,0x00,0x00, /* 101 */
|
|
||||||
0x00,0x00,0x0c,0x10,0x10,0x10,0x54,0x10,0x10,0x10,0x00,0x00, /* 102 */
|
|
||||||
0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3a,0x02,0x3c, /* 103 */
|
|
||||||
0x00,0x00,0x40,0x40,0x5c,0x42,0x42,0x42,0x42,0x42,0x00,0x00, /* 104 */
|
|
||||||
0x00,0x00,0x08,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00, /* 105 */
|
|
||||||
0x00,0x00,0x08,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x30, /* 106 */
|
|
||||||
0x00,0x00,0x40,0x40,0x42,0x42,0x5c,0x42,0x42,0x42,0x00,0x00, /* 107 */
|
|
||||||
0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00, /* 108 */
|
|
||||||
0x00,0x00,0x00,0x00,0x7c,0x82,0x92,0x92,0x92,0x92,0x00,0x00, /* 109 */
|
|
||||||
0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x00,0x00, /* 110 */
|
|
||||||
0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 111 */
|
|
||||||
0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x5c,0x40,0x40, /* 112 */
|
|
||||||
0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3a,0x02,0x02, /* 113 */
|
|
||||||
0x00,0x00,0x00,0x00,0x0c,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 114 */
|
|
||||||
0x00,0x00,0x00,0x00,0x3e,0x40,0x3c,0x02,0x02,0x7c,0x00,0x00, /* 115 */
|
|
||||||
0x00,0x00,0x10,0x10,0x10,0x54,0x10,0x10,0x10,0x0c,0x00,0x00, /* 116 */
|
|
||||||
0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 117 */
|
|
||||||
0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x44,0x48,0x50,0x00,0x00, /* 118 */
|
|
||||||
0x00,0x00,0x00,0x00,0x92,0x92,0x92,0x92,0x82,0x7c,0x00,0x00, /* 119 */
|
|
||||||
0x00,0x00,0x00,0x00,0x42,0x42,0x3c,0x42,0x42,0x42,0x00,0x00, /* 120 */
|
|
||||||
0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3a,0x02,0x3c, /* 121 */
|
|
||||||
0x00,0x00,0x00,0x00,0x7c,0x02,0x0c,0x30,0x40,0x3e,0x00,0x00, /* 122 */
|
|
||||||
0x00,0x1c,0x20,0x20,0x20,0x40,0x20,0x20,0x20,0x1c,0x00,0x00, /* 123 */
|
|
||||||
0x00,0x10,0x10,0x10,0x10,0x00,0x10,0x10,0x10,0x10,0x00,0x00, /* 124 */
|
|
||||||
0x00,0x38,0x04,0x04,0x04,0x02,0x04,0x04,0x04,0x38,0x00,0x00, /* 125 */
|
|
||||||
0x00,0x04,0x38,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 126 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160 */
|
|
||||||
0x00,0x10,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 161 */
|
|
||||||
0x00,0x00,0x08,0x3e,0x40,0x48,0x48,0x40,0x3e,0x08,0x00,0x00, /* 162 */
|
|
||||||
0x00,0x1c,0x20,0x20,0x20,0xa8,0x20,0x20,0x42,0xbc,0x00,0x00, /* 163 */
|
|
||||||
0x00,0x00,0x82,0x38,0x44,0x44,0x44,0x38,0x82,0x00,0x00,0x00, /* 164 */
|
|
||||||
0x00,0x82,0x82,0x82,0x7c,0x00,0x54,0x10,0x54,0x10,0x00,0x00, /* 165 */
|
|
||||||
0x00,0x10,0x10,0x10,0x00,0x00,0x00,0x10,0x10,0x10,0x00,0x00, /* 166 */
|
|
||||||
0x00,0x38,0x40,0x38,0x44,0x44,0x44,0x44,0x38,0x04,0x38,0x00, /* 167 */
|
|
||||||
0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168 */
|
|
||||||
0x00,0x7c,0x82,0x9a,0xa2,0xa2,0xa2,0x9a,0x82,0x7c,0x00,0x00, /* 169 */
|
|
||||||
0x38,0x04,0x34,0x44,0x38,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 170 */
|
|
||||||
0x00,0x00,0x00,0x24,0x48,0x00,0x48,0x24,0x00,0x00,0x00,0x00, /* 171 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0xfc,0x02,0x02,0x02,0x00,0x00,0x00, /* 172 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00, /* 173 */
|
|
||||||
0x00,0x7c,0x82,0x92,0xaa,0xb2,0xaa,0xaa,0x82,0x7c,0x00,0x00, /* 174 */
|
|
||||||
0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 175 */
|
|
||||||
0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176 */
|
|
||||||
0x00,0x10,0x10,0xd6,0x10,0x10,0x00,0xfe,0x00,0x00,0x00,0x00, /* 177 */
|
|
||||||
0x38,0x04,0x18,0x20,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 178 */
|
|
||||||
0x38,0x04,0x38,0x04,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 179 */
|
|
||||||
0x18,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 180 */
|
|
||||||
0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x58,0x40,0x40, /* 181 */
|
|
||||||
0x00,0x79,0xfa,0xfa,0xfa,0x7a,0x02,0x0a,0x0a,0x0a,0x0a,0x00, /* 182 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 183 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x10,0x00, /* 184 */
|
|
||||||
0x08,0x18,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 185 */
|
|
||||||
0x38,0x44,0x44,0x38,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00, /* 186 */
|
|
||||||
0x00,0x00,0x00,0x48,0x24,0x00,0x24,0x48,0x00,0x00,0x00,0x00, /* 187 */
|
|
||||||
0x20,0xa2,0x22,0x22,0x24,0x08,0x10,0x29,0x49,0x85,0x01,0x01, /* 188 */
|
|
||||||
0x20,0xa2,0x22,0x22,0x24,0x08,0x10,0x2e,0x41,0x86,0x08,0x0f, /* 189 */
|
|
||||||
0xe0,0x12,0xe2,0x12,0xe4,0x08,0x10,0x29,0x49,0x85,0x01,0x01, /* 190 */
|
|
||||||
0x00,0x08,0x00,0x08,0x08,0x70,0x80,0x80,0x80,0x7e,0x00,0x00, /* 191 */
|
|
||||||
0x20,0x18,0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 192 */
|
|
||||||
0x08,0x30,0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 193 */
|
|
||||||
0x38,0x44,0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 194 */
|
|
||||||
0x32,0x4c,0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 195 */
|
|
||||||
0x6c,0x00,0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 196 */
|
|
||||||
0x38,0x44,0x38,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 197 */
|
|
||||||
0x00,0x77,0x88,0x88,0x88,0x8b,0xa8,0x88,0x88,0x8b,0x00,0x00, /* 198 */
|
|
||||||
0x00,0x7c,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x6c,0x10,0x20, /* 199 */
|
|
||||||
0x20,0x18,0x00,0x7c,0x80,0x80,0xb8,0x80,0x80,0x7c,0x00,0x00, /* 200 */
|
|
||||||
0x08,0x30,0x00,0x7c,0x80,0x80,0xb8,0x80,0x80,0x7c,0x00,0x00, /* 201 */
|
|
||||||
0x38,0x44,0x00,0x7c,0x80,0x80,0xb8,0x80,0x80,0x7c,0x00,0x00, /* 202 */
|
|
||||||
0x6c,0x00,0x00,0x7c,0x80,0x80,0xb8,0x80,0x80,0x7c,0x00,0x00, /* 203 */
|
|
||||||
0x20,0x18,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 204 */
|
|
||||||
0x08,0x30,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 205 */
|
|
||||||
0x38,0x44,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 206 */
|
|
||||||
0x6c,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 207 */
|
|
||||||
0x00,0xbc,0x82,0x82,0x82,0xb2,0x82,0x82,0x82,0xbc,0x00,0x00, /* 208 */
|
|
||||||
0x32,0x4c,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x00,0x00, /* 209 */
|
|
||||||
0x20,0x18,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 210 */
|
|
||||||
0x08,0x30,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 211 */
|
|
||||||
0x38,0x44,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 212 */
|
|
||||||
0x32,0x4c,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 213 */
|
|
||||||
0x6c,0x00,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 214 */
|
|
||||||
0x00,0x00,0x00,0x00,0x44,0x28,0x00,0x28,0x44,0x00,0x00,0x00, /* 215 */
|
|
||||||
0x00,0x7a,0x84,0x82,0x8a,0x92,0xa2,0x82,0x42,0xbc,0x00,0x00, /* 216 */
|
|
||||||
0x20,0x18,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 217 */
|
|
||||||
0x08,0x30,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 218 */
|
|
||||||
0x38,0x44,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 219 */
|
|
||||||
0x6c,0x00,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 220 */
|
|
||||||
0x08,0xb2,0x82,0x82,0x82,0x7c,0x00,0x10,0x10,0x10,0x00,0x00, /* 221 */
|
|
||||||
0x00,0x80,0x80,0xbc,0x82,0x82,0x82,0xbc,0x80,0x80,0x00,0x00, /* 222 */
|
|
||||||
0x00,0x3c,0x42,0x42,0x42,0x5c,0x42,0x42,0x42,0x9c,0x00,0x00, /* 223 */
|
|
||||||
0x20,0x18,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 224 */
|
|
||||||
0x08,0x30,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 225 */
|
|
||||||
0x38,0x44,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 226 */
|
|
||||||
0x32,0x4c,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 227 */
|
|
||||||
0x6c,0x00,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 228 */
|
|
||||||
0x18,0x24,0x18,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 229 */
|
|
||||||
0x00,0x00,0x00,0x00,0x6c,0x12,0x52,0x94,0x90,0x6e,0x00,0x00, /* 230 */
|
|
||||||
0x00,0x00,0x00,0x00,0x3c,0x40,0x40,0x40,0x40,0x34,0x08,0x10, /* 231 */
|
|
||||||
0x20,0x18,0x00,0x00,0x3c,0x42,0x42,0x5c,0x40,0x3c,0x00,0x00, /* 232 */
|
|
||||||
0x08,0x30,0x00,0x00,0x3c,0x42,0x42,0x5c,0x40,0x3c,0x00,0x00, /* 233 */
|
|
||||||
0x38,0x44,0x00,0x00,0x3c,0x42,0x42,0x5c,0x40,0x3c,0x00,0x00, /* 234 */
|
|
||||||
0x6c,0x00,0x00,0x00,0x3c,0x42,0x42,0x5c,0x40,0x3c,0x00,0x00, /* 235 */
|
|
||||||
0x20,0x18,0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 236 */
|
|
||||||
0x08,0x30,0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 237 */
|
|
||||||
0x38,0x44,0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 238 */
|
|
||||||
0x6c,0x00,0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 239 */
|
|
||||||
0x00,0x14,0x08,0x14,0x02,0x3a,0x42,0x42,0x42,0x3c,0x00,0x00, /* 240 */
|
|
||||||
0x00,0x32,0x4c,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x00,0x00, /* 241 */
|
|
||||||
0x20,0x18,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 242 */
|
|
||||||
0x08,0x30,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 243 */
|
|
||||||
0x38,0x44,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 244 */
|
|
||||||
0x32,0x4c,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 245 */
|
|
||||||
0x6c,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 246 */
|
|
||||||
0x00,0x00,0x00,0x00,0x38,0x00,0xfe,0x00,0x38,0x00,0x00,0x00, /* 247 */
|
|
||||||
0x00,0x00,0x00,0x00,0x3a,0x44,0x4a,0x52,0x22,0x5c,0x00,0x00, /* 248 */
|
|
||||||
0x20,0x18,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 249 */
|
|
||||||
0x08,0x30,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 250 */
|
|
||||||
0x38,0x44,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 251 */
|
|
||||||
0x6c,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 252 */
|
|
||||||
0x04,0x18,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3a,0x02,0x3c, /* 253 */
|
|
||||||
0x00,0x80,0x80,0x9c,0xa2,0x82,0xa2,0x9c,0x80,0x80,0x00,0x00, /* 254 */
|
|
||||||
};
|
|
||||||
static int radonFontMetaData[256*5]={
|
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,12,0,-2,12,8,12,0,-2,24,8,12,0,-2,36,8,12,0,-2,48,8,12,0,-2,60,8,12,0,-2,72,8,12,0,-2,84,8,12,0,-2,96,8,12,0,-2,108,8,12,0,-2,120,8,12,0,-2,132,8,12,0,-2,144,8,12,0,-2,156,8,12,0,-2,168,8,12,0,-2,180,8,12,0,-2,192,8,12,0,-2,204,8,12,0,-2,216,8,12,0,-2,228,8,12,0,-2,240,8,12,0,-2,252,8,12,0,-2,264,8,12,0,-2,276,8,12,0,-2,288,8,12,0,-2,300,8,12,0,-2,312,8,12,0,-2,324,8,12,0,-2,336,8,12,0,-2,348,8,12,0,-2,360,8,12,0,-2,372,8,12,0,-2,384,8,12,0,-2,396,8,12,0,-2,408,8,12,0,-2,420,8,12,0,-2,432,8,12,0,-2,444,8,12,0,-2,456,8,12,0,-2,468,8,12,0,-2,480,8,12,0,-2,492,8,12,0,-2,504,8,12,0,-2,516,8,12,0,-2,528,8,12,0,-2,540,8,12,0,-2,552,8,12,0,-2,564,8,12,0,-2,576,8,12,0,-2,588,8,12,0,-2,600,8,12,0,-2,612,8,12,0,-2,624,8,12,0,-2,636,8,12,0,-2,648,8,12,0,-2,660,8,12,0,-2,672,8,12,0,-2,684,8,12,0,-2,696,8,12,0,-2,708,8,12,0,-2,720,8,12,0,-2,732,8,12,0,-2,744,8,12,0,-2,756,8,12,0,-2,768,8,12,0,-2,780,8,12,0,-2,792,8,12,0,-2,804,8,12,0,-2,816,8,12,0,-2,828,8,12,0,-2,840,8,12,0,-2,852,8,12,0,-2,864,8,12,0,-2,876,8,12,0,-2,888,8,12,0,-2,900,8,12,0,-2,912,8,12,0,-2,924,8,12,0,-2,936,8,12,0,-2,948,8,12,0,-2,960,8,12,0,-2,972,8,12,0,-2,984,8,12,0,-2,996,8,12,0,-2,1008,8,12,0,-2,1020,8,12,0,-2,1032,8,12,0,-2,1044,8,12,0,-2,1056,8,12,0,-2,1068,8,12,0,-2,1080,8,12,0,-2,1092,8,12,0,-2,1104,8,12,0,-2,1116,8,12,0,-2,1128,8,12,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1140,8,12,0,-2,1152,8,12,0,-2,1164,8,12,0,-2,1176,8,12,0,-2,1188,8,12,0,-2,1200,8,12,0,-2,1212,8,12,0,-2,1224,8,12,0,-2,1236,8,12,0,-2,1248,8,12,0,-2,1260,8,12,0,-2,1272,8,12,0,-2,1284,8,12,0,-2,1296,8,12,0,-2,1308,8,12,0,-2,1320,8,12,0,-2,1332,8,12,0,-2,1344,8,12,0,-2,1356,8,12,0,-2,1368,8,12,0,-2,1380,8,12,0,-2,1392,8,12,0,-2,1404,8,12,0,-2,1416,8,12,0,-2,1428,8,12,0,-2,1440,8,12,0,-2,1452,8,12,0,-2,1464,8,12,0,-2,1476,8,12,0,-2,1488,8,12,0,-2,1500,8,12,0,-2,1512,8,12,0,-2,1524,8,12,0,-2,1536,8,12,0,-2,1548,8,12,0,-2,1560,8,12,0,-2,1572,8,12,0,-2,1584,8,12,0,-2,1596,8,12,0,-2,1608,8,12,0,-2,1620,8,12,0,-2,1632,8,12,0,-2,1644,8,12,0,-2,1656,8,12,0,-2,1668,8,12,0,-2,1680,8,12,0,-2,1692,8,12,0,-2,1704,8,12,0,-2,1716,8,12,0,-2,1728,8,12,0,-2,1740,8,12,0,-2,1752,8,12,0,-2,1764,8,12,0,-2,1776,8,12,0,-2,1788,8,12,0,-2,1800,8,12,0,-2,1812,8,12,0,-2,1824,8,12,0,-2,1836,8,12,0,-2,1848,8,12,0,-2,1860,8,12,0,-2,1872,8,12,0,-2,1884,8,12,0,-2,1896,8,12,0,-2,1908,8,12,0,-2,1920,8,12,0,-2,1932,8,12,0,-2,1944,8,12,0,-2,1956,8,12,0,-2,1968,8,12,0,-2,1980,8,12,0,-2,1992,8,12,0,-2,2004,8,12,0,-2,2016,8,12,0,-2,2028,8,12,0,-2,2040,8,12,0,-2,2052,8,12,0,-2,2064,8,12,0,-2,2076,8,12,0,-2,2088,8,12,0,-2,2100,8,12,0,-2,2112,8,12,0,-2,2124,8,12,0,-2,2136,8,12,0,-2,2148,8,12,0,-2,2160,8,12,0,-2,2172,8,12,0,-2,2184,8,12,0,-2,2196,8,12,0,-2,2208,8,12,0,-2,2220,8,12,0,-2,2232,8,12,0,-2,2244,8,12,0,-2,2256,8,12,0,-2,2268,8,12,0,-2,0,0,0,0,0,};
|
|
||||||
static rfbFontData radonFont={radonFontData, radonFontMetaData};
|
|
@ -1,3 +0,0 @@
|
|||||||
#define SRA_TEST
|
|
||||||
#include "../libvncserver/rfbregion.c"
|
|
||||||
|
|
@ -1,92 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <rfb/rfb.h>
|
|
||||||
#include <rfb/keysym.h>
|
|
||||||
|
|
||||||
static int gcd(int x, int y)
|
|
||||||
{
|
|
||||||
if (x == 0)
|
|
||||||
return y;
|
|
||||||
return gcd((y % x), x);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define CONCAT2(a,b) a##b
|
|
||||||
#define CONCAT2E(a,b) CONCAT2(a,b)
|
|
||||||
#define CONCAT3(a,b,c) a##b##c
|
|
||||||
#define CONCAT3E(a,b,c) CONCAT3(a,b,c)
|
|
||||||
|
|
||||||
#define FUNCNAME rfbRotate
|
|
||||||
#define FUNC(i, j) (h - 1 - j + i * h)
|
|
||||||
#define SWAPDIMENSIONS
|
|
||||||
#define OUT 8
|
|
||||||
#include "rotatetemplate.c"
|
|
||||||
#define OUT 16
|
|
||||||
#include "rotatetemplate.c"
|
|
||||||
#define OUT 32
|
|
||||||
#include "rotatetemplate.c"
|
|
||||||
#undef FUNCNAME
|
|
||||||
#undef FUNC
|
|
||||||
|
|
||||||
#define FUNCNAME rfbRotateCounterClockwise
|
|
||||||
#define FUNC(i, j) (j + (w - 1 - i) * h)
|
|
||||||
#define OUT 8
|
|
||||||
#include "rotatetemplate.c"
|
|
||||||
#define OUT 16
|
|
||||||
#include "rotatetemplate.c"
|
|
||||||
#define OUT 32
|
|
||||||
#include "rotatetemplate.c"
|
|
||||||
#undef FUNCNAME
|
|
||||||
#undef FUNC
|
|
||||||
#undef SWAPDIMENSIONS
|
|
||||||
|
|
||||||
#define FUNCNAME rfbFlipHorizontally
|
|
||||||
#define FUNC(i, j) ((w - 1 - i) + j * w)
|
|
||||||
#define OUT 8
|
|
||||||
#include "rotatetemplate.c"
|
|
||||||
#define OUT 16
|
|
||||||
#include "rotatetemplate.c"
|
|
||||||
#define OUT 32
|
|
||||||
#include "rotatetemplate.c"
|
|
||||||
#undef FUNCNAME
|
|
||||||
#undef FUNC
|
|
||||||
|
|
||||||
#define FUNCNAME rfbFlipVertically
|
|
||||||
#define FUNC(i, j) (i + (h - 1 - j) * w)
|
|
||||||
#define OUT 8
|
|
||||||
#include "rotatetemplate.c"
|
|
||||||
#define OUT 16
|
|
||||||
#include "rotatetemplate.c"
|
|
||||||
#define OUT 32
|
|
||||||
#include "rotatetemplate.c"
|
|
||||||
#undef FUNCNAME
|
|
||||||
#undef FUNC
|
|
||||||
|
|
||||||
#define FUNCNAME rfbRotateHundredAndEighty
|
|
||||||
#define FUNC(i, j) ((w - 1 - i) + (h - 1 - j) * w)
|
|
||||||
#define OUT 8
|
|
||||||
#include "rotatetemplate.c"
|
|
||||||
#define OUT 16
|
|
||||||
#include "rotatetemplate.c"
|
|
||||||
#define OUT 32
|
|
||||||
#include "rotatetemplate.c"
|
|
||||||
#undef FUNCNAME
|
|
||||||
#undef FUNC
|
|
||||||
|
|
||||||
static void HandleKey(rfbBool down,rfbKeySym key,rfbClientPtr cl)
|
|
||||||
{
|
|
||||||
if(down) {
|
|
||||||
if (key==XK_Escape || key=='q' || key=='Q')
|
|
||||||
rfbCloseClient(cl);
|
|
||||||
else if (key == 'r')
|
|
||||||
rfbRotate(cl->screen);
|
|
||||||
else if (key == 'R')
|
|
||||||
rfbRotateCounterClockwise(cl->screen);
|
|
||||||
else if (key == 'f')
|
|
||||||
rfbFlipHorizontally(cl->screen);
|
|
||||||
else if (key == 'F')
|
|
||||||
rfbFlipVertically(cl->screen);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define HAVE_HANDLEKEY
|
|
||||||
#include "pnmshow.c"
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
|||||||
#define OUT_T CONCAT3E(uint,OUT,_t)
|
|
||||||
#define FUNCTION CONCAT2E(FUNCNAME,OUT)
|
|
||||||
|
|
||||||
static void FUNCTION(rfbScreenInfoPtr screen)
|
|
||||||
{
|
|
||||||
OUT_T* buffer = (OUT_T*)screen->frameBuffer;
|
|
||||||
int i, j, w = screen->width, h = screen->height;
|
|
||||||
OUT_T* newBuffer = (OUT_T*)malloc(w * h * sizeof(OUT_T));
|
|
||||||
|
|
||||||
for (j = 0; j < h; j++)
|
|
||||||
for (i = 0; i < w; i++)
|
|
||||||
newBuffer[FUNC(i, j)] = buffer[i + j * w];
|
|
||||||
|
|
||||||
memcpy(buffer, newBuffer, w * h * sizeof(OUT_T));
|
|
||||||
free(newBuffer);
|
|
||||||
|
|
||||||
#ifdef SWAPDIMENSIONS
|
|
||||||
screen->width = h;
|
|
||||||
screen->paddedWidthInBytes = h * OUT / 8;
|
|
||||||
screen->height = w;
|
|
||||||
|
|
||||||
{
|
|
||||||
rfbClientIteratorPtr iterator;
|
|
||||||
rfbClientPtr cl;
|
|
||||||
iterator = rfbGetClientIterator(screen);
|
|
||||||
while ((cl = rfbClientIteratorNext(iterator)) != NULL)
|
|
||||||
cl->newFBSizePending = 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
rfbMarkRectAsModified(screen, 0, 0, screen->width, screen->height);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if OUT == 32
|
|
||||||
void FUNCNAME(rfbScreenInfoPtr screen) {
|
|
||||||
if (screen->serverFormat.bitsPerPixel == 32)
|
|
||||||
CONCAT2E(FUNCNAME,32)(screen);
|
|
||||||
else if (screen->serverFormat.bitsPerPixel == 16)
|
|
||||||
CONCAT2E(FUNCNAME,16)(screen);
|
|
||||||
else if (screen->serverFormat.bitsPerPixel == 8)
|
|
||||||
CONCAT2E(FUNCNAME,8)(screen);
|
|
||||||
else {
|
|
||||||
rfbErr("Unsupported pixel depth: %d\n",
|
|
||||||
screen->serverFormat.bitsPerPixel);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef FUNCTION
|
|
||||||
#undef OUT
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
|||||||
#include <rfb/rfb.h>
|
|
||||||
|
|
||||||
int main(int argc,char** argv)
|
|
||||||
{
|
|
||||||
rfbScreenInfoPtr server=rfbGetScreen(&argc,argv,400,300,8,3,4);
|
|
||||||
server->frameBuffer=(char*)malloc(400*300*4);
|
|
||||||
rfbInitServer(server);
|
|
||||||
rfbRunEventLoop(server,-1,FALSE);
|
|
||||||
return(0);
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
/* This example shows how to use 15-bit (which is handled as 16-bit
|
|
||||||
internally). */
|
|
||||||
|
|
||||||
#include <rfb/rfb.h>
|
|
||||||
|
|
||||||
int main(int argc,char** argv)
|
|
||||||
{
|
|
||||||
int i,j;
|
|
||||||
uint16_t* f;
|
|
||||||
|
|
||||||
rfbScreenInfoPtr server=rfbGetScreen(&argc,argv,400,300,5,3,2);
|
|
||||||
|
|
||||||
server->frameBuffer=(char*)malloc(400*300*2);
|
|
||||||
f=(uint16_t*)server->frameBuffer;
|
|
||||||
for(j=0;j<300;j++)
|
|
||||||
for(i=0;i<400;i++)
|
|
||||||
f[j*400+i]=/* red */ ((j*32/300) << 10) |
|
|
||||||
/* green */ (((j+400-i)*32/700) << 5) |
|
|
||||||
/* blue */ ((i*32/400));
|
|
||||||
|
|
||||||
rfbInitServer(server);
|
|
||||||
rfbRunEventLoop(server,-1,FALSE);
|
|
||||||
return(0);
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* OSXvnc Copyright (C) 2001 Dan McGuirk <mcguirk@incompleteness.net>.
|
|
||||||
* Original Xvnc code Copyright (C) 1999 AT&T Laboratories Cambridge.
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* This is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This software is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this software; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
|
||||||
* USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <rfb/rfb.h>
|
|
||||||
|
|
||||||
static void usage(void)
|
|
||||||
{
|
|
||||||
printf("\nusage: storepasswd <password> <filename>\n\n");
|
|
||||||
|
|
||||||
printf("Stores a password in encrypted format.\n");
|
|
||||||
printf("The resulting file can be used with the -rfbauth argument to OSXvnc.\n\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
if (argc != 3)
|
|
||||||
usage();
|
|
||||||
|
|
||||||
if (rfbEncryptAndStorePasswd(argv[1], argv[2]) != 0) {
|
|
||||||
printf("storing password failed.\n");
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
printf("storing password succeeded.\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,128 +0,0 @@
|
|||||||
/* This program is a simple server to show events coming from the client */
|
|
||||||
#ifdef __STRICT_ANSI__
|
|
||||||
#define _BSD_SOURCE
|
|
||||||
#endif
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#ifndef __MINGW32__
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#endif
|
|
||||||
#include <rfb/rfb.h>
|
|
||||||
#include <rfb/default8x16.h>
|
|
||||||
|
|
||||||
#define width 100
|
|
||||||
#define height 100
|
|
||||||
static char f[width*height];
|
|
||||||
static char* keys[0x400];
|
|
||||||
|
|
||||||
static int hex2number(unsigned char c)
|
|
||||||
{
|
|
||||||
if(c>'f') return(-1);
|
|
||||||
else if(c>'F')
|
|
||||||
return(10+c-'a');
|
|
||||||
else if(c>'9')
|
|
||||||
return(10+c-'A');
|
|
||||||
else
|
|
||||||
return(c-'0');
|
|
||||||
}
|
|
||||||
|
|
||||||
static void read_keys(void)
|
|
||||||
{
|
|
||||||
int i,j,k;
|
|
||||||
char buffer[1024];
|
|
||||||
FILE* keysyms=fopen("keysym.h","r");
|
|
||||||
|
|
||||||
memset(keys,0,0x400*sizeof(char*));
|
|
||||||
|
|
||||||
if(!keysyms)
|
|
||||||
return;
|
|
||||||
|
|
||||||
while(!feof(keysyms)) {
|
|
||||||
fgets(buffer,1024,keysyms);
|
|
||||||
if(!strncmp(buffer,"#define XK_",strlen("#define XK_"))) {
|
|
||||||
for(i=strlen("#define XK_");buffer[i] && buffer[i]!=' '
|
|
||||||
&& buffer[i]!='\t';i++);
|
|
||||||
if(buffer[i]==0) /* don't support wrapped lines */
|
|
||||||
continue;
|
|
||||||
buffer[i]=0;
|
|
||||||
for(i++;buffer[i] && buffer[i]!='0';i++);
|
|
||||||
if(buffer[i]==0 || buffer[i+1]!='x') continue;
|
|
||||||
for(j=0,i+=2;(k=hex2number(buffer[i]))>=0;i++)
|
|
||||||
j=j*16+k;
|
|
||||||
if(keys[j&0x3ff]) {
|
|
||||||
char* x=(char*)malloc(1+strlen(keys[j&0x3ff])+1+strlen(buffer+strlen("#define ")));
|
|
||||||
strcpy(x,keys[j&0x3ff]);
|
|
||||||
strcat(x,",");
|
|
||||||
strcat(x,buffer+strlen("#define "));
|
|
||||||
free(keys[j&0x3ff]);
|
|
||||||
keys[j&0x3ff]=x;
|
|
||||||
} else
|
|
||||||
keys[j&0x3ff] = strdup(buffer+strlen("#define "));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
fclose(keysyms);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int lineHeight=16,lineY=height-16;
|
|
||||||
static void output(rfbScreenInfoPtr s,char* line)
|
|
||||||
{
|
|
||||||
rfbDoCopyRect(s,0,0,width,height-lineHeight,0,-lineHeight);
|
|
||||||
rfbDrawString(s,&default8x16Font,10,lineY,line,0x01);
|
|
||||||
rfbLog("%s\n",line);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dokey(rfbBool down,rfbKeySym k,rfbClientPtr cl)
|
|
||||||
{
|
|
||||||
char buffer[1024+32];
|
|
||||||
|
|
||||||
sprintf(buffer,"%s: %s (0x%x)",
|
|
||||||
down?"down":"up",keys[k&0x3ff]?keys[k&0x3ff]:"",(unsigned int)k);
|
|
||||||
output(cl->screen,buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void doptr(int buttonMask,int x,int y,rfbClientPtr cl)
|
|
||||||
{
|
|
||||||
char buffer[1024];
|
|
||||||
if(buttonMask) {
|
|
||||||
sprintf(buffer,"Ptr: mouse button mask 0x%x at %d,%d",buttonMask,x,y);
|
|
||||||
output(cl->screen,buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static enum rfbNewClientAction newclient(rfbClientPtr cl)
|
|
||||||
{
|
|
||||||
char buffer[1024];
|
|
||||||
struct sockaddr_in addr;
|
|
||||||
unsigned int len=sizeof(addr),ip;
|
|
||||||
|
|
||||||
getpeername(cl->sock,(struct sockaddr*)&addr,&len);
|
|
||||||
ip=ntohl(addr.sin_addr.s_addr);
|
|
||||||
sprintf(buffer,"Client connected from ip %d.%d.%d.%d",
|
|
||||||
(ip>>24)&0xff,(ip>>16)&0xff,(ip>>8)&0xff,ip&0xff);
|
|
||||||
output(cl->screen,buffer);
|
|
||||||
return RFB_CLIENT_ACCEPT;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc,char** argv)
|
|
||||||
{
|
|
||||||
rfbScreenInfoPtr s=rfbGetScreen(&argc,argv,width,height,8,1,1);
|
|
||||||
s->colourMap.is16=FALSE;
|
|
||||||
s->colourMap.count=2;
|
|
||||||
s->colourMap.data.bytes=(unsigned char*)"\xd0\xd0\xd0\x30\x01\xe0";
|
|
||||||
s->serverFormat.trueColour=FALSE;
|
|
||||||
s->frameBuffer=f;
|
|
||||||
s->kbdAddEvent=dokey;
|
|
||||||
s->ptrAddEvent=doptr;
|
|
||||||
s->newClientHook=newclient;
|
|
||||||
|
|
||||||
memset(f,0,width*height);
|
|
||||||
read_keys();
|
|
||||||
rfbInitServer(s);
|
|
||||||
|
|
||||||
while(1) {
|
|
||||||
rfbProcessEvents(s,999999);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,191 +0,0 @@
|
|||||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>LibVNCServer/LibVNCClient</title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<h1>LibVNCServer/LibVNCClient</h1>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
If you have problems updating with CVS, here is a <a href=LibVNCServer-0.8pre.tar.gz>preliminary version</a>. If you are looking for more information
|
|
||||||
on Karl's wonderful x11vnc, either download it
|
|
||||||
<a href=http://sourceforge.net/project/showfiles.php?group_id=32584>here</a>, or
|
|
||||||
look at <a href=http://www.karlrunge.com/x11vnc/>x11vnc's homepage</a>.
|
|
||||||
<p>
|
|
||||||
|
|
||||||
<h2> News </h2>
|
|
||||||
<strong>2005/09/29</strong> LibVNCServer now sports a brand new method to extend the protocol, thanks to Rohit Kumar! He also extended the library to support RFB 3.7. Furthermore, he contributed TightVNC file transfer protocol support to LibVNCServer!
|
|
||||||
<p>
|
|
||||||
<strong>2005/05/25</strong> LibVNCClient now features ZRLE decoding!
|
|
||||||
<p>
|
|
||||||
<strong>2005/05/15</strong> Another round of valgrinding completed. This time it is augmented by changes instigated by using Linus' sparse. In the course, the complete sources were converted to ANSI C.
|
|
||||||
<p>
|
|
||||||
<strong>2005/05/07</strong> The member socketInitDone was renamed to socketState, and no longer contains a bool value. This allows us to quit a server cleanly from the event loop via rfbShutdownServer(), so that the structures can be cleaned up properly. This is demonstrated in examples/example.c.
|
|
||||||
<p>
|
|
||||||
<strong>2005/01/21</strong> The function rfbMakeMaskFromAlphaSource() applies a Floyd-Steinberg dither to approximate a binary mask from a cursor with alpha channel. A demonstration can be found in test/cursortest.c.
|
|
||||||
<p>
|
|
||||||
<strong>2005/01/16</strong> Renamed this page to reflect that LibVNCClient is actually very usable.
|
|
||||||
<p>
|
|
||||||
<strong>2005/01/16</strong> Karl Runge has done awesome work to support cursors with alpha blending! You can try it with x11vnc as in CVS, or wait a few more days for x11vnc to be released officially!
|
|
||||||
<p>
|
|
||||||
<strong>2005/01/15</strong> Happy new year! It begins with a new macro recorder based on LibVNCServer/LibVNCClient using perl as script language. The macro recorder is itself written in perl, and writes out perl scripts, acting as a VNC proxy, so that you can connect a vncviewer to it, and it records all your input, possibly looking for a certain button, image, word, etc. before continuing. I called it VisualNaCro, and it's in CVS.
|
|
||||||
<p>
|
|
||||||
<strong>2004/12/20</strong> Just before christmas, a new release! Version 0.7 brings you the first non-beta of LibVNCServer...
|
|
||||||
<p>
|
|
||||||
<strong>2004/12/02</strong> Finally MinGW32 support. I only had problems with a vncviewer which wouldn't connect to localhost: I use SDLvncviewer...
|
|
||||||
<p>
|
|
||||||
<strong>2004/12/01</strong> LibVNCClient is getting better and better... Expect a very powerful client soon!
|
|
||||||
<p>
|
|
||||||
<strong>2004/10/16</strong> LibVNCServer has automated test, thanks to LibVNCClient (included). It doesn't do ZRLE yet, and exposed some bugs, the only remaining of these is CoRRE (not sure yet if it's a bug in the client or the server).
|
|
||||||
<p>
|
|
||||||
<strong>2004/09/14</strong> Added
|
|
||||||
<a href=http://libvncserver.sourceforge.net/success.html>
|
|
||||||
Success stories</a>.
|
|
||||||
<p>
|
|
||||||
<strong>2004/09/07</strong> The API was cleaned up. The structures and functions now have a prefix (mostly "rfb", sometimes "zrle" or "sra") in order not to clutter the namespace, while the structure's members don't need such a prefix.
|
|
||||||
<p>
|
|
||||||
<strong>2004/08/17</strong> I finally came around to fix mouse behaviour in QEMU's VNC frontend for Windows 98. Please find the patch <a href=qemu/>here</a>. If mouse behaves strangely, try to wiggle the pointer to a free spot on the desktop, hit Ctrl+Shift and release them. After that, the mouse should behave nicely.
|
|
||||||
<p>
|
|
||||||
<strong>2004/06/07</strong> After silently being added almost a year ago, libvncclient's API was modified for real use, and three examples were added: ppmtest (a very simple demo), SDLvncviewer, and vnc2mpg (which lets you record your VNC session to a movie). Automated regression tests of the libraries are planned.
|
|
||||||
<p>
|
|
||||||
<strong>2004/06/02</strong> <a href=http://www.karlrunge.com/x11vnc/>x11vnc</a>-0.6.1 was released! This reflects the long way the original, small example has gone, improved in many possible ways and having a broad user base.
|
|
||||||
<p>
|
|
||||||
<strong>2004/05/29</strong> Some <a href=qemu/>patches</a> were created for <a href=http://fabrice.bellard.free.fr/qemu/>QEMU</a>, a FAST! emulator by Fabrice Bellard, to control those sessions with a vncviewer.
|
|
||||||
<p>
|
|
||||||
<strong>2004/02/29</strong> LibVNCServer is listed as a project using <a href=http://valgrind.kde.org/>Valgrind</a>!
|
|
||||||
<p>
|
|
||||||
<strong>2003/11/07</strong> Version 0.6 is out! x11vnc performance boosts! You no longer need a c++ compiler in order to have ZRLE coding! LinuxVNC was added (This is to the text console what x11vnc is to X11)!
|
|
||||||
<p>
|
|
||||||
<strong>2003/02/21</strong> rdp2vnc is in rdesktop's CVS.
|
|
||||||
<p>
|
|
||||||
<strong>2003/02/19</strong> A preliminary patch for rdesktop (CVS) to make
|
|
||||||
rdp2vnc, a translator from Windows Terminal Server's protocol to VNC's protocol,
|
|
||||||
is <a href=rdesktop-cvs+vnc.diff.gz>available</a>. It needs a new version of
|
|
||||||
libvncserver; try CVS until I release 0.6.
|
|
||||||
<p>
|
|
||||||
<strong>2003/02/09</strong> Version 0.5 is out! Features include autoconf based configure, rpm package (YMMV), cleanup of directory structure, NEW x11vnc! ZRLE encoding! HTTP tunnelling through LibVNCServer's HTTP support! Many bug fixes!
|
|
||||||
<p>
|
|
||||||
<strong>2002/07/28</strong> Version 0.4 is out! Biggest feature: NewFB encoding. Quite a few bugfixes also (Thanks to all!).
|
|
||||||
<p>
|
|
||||||
<strong>2001/12/14</strong> A new version of
|
|
||||||
<a href=http://prdownloads.sourceforge.net/libvncserver/rdesktop-1.1.0+vnc-0.2.tar.gz>rdesktop+vnc</a> is available!
|
|
||||||
(Includes support for other platforms keyboard mapping with plain rdesktop!)
|
|
||||||
<p>
|
|
||||||
<strong>2001/10/23</strong> Added a link to my homepage at the end.
|
|
||||||
<p>
|
|
||||||
<strong>2001/10/18</strong> I released the rdp2vnc extensions as well as
|
|
||||||
patches for general keyboard handling, working inside Xvnc and
|
|
||||||
process_text2 (the famous "font:" error) to rdesktop. Please find it on
|
|
||||||
the <a href=http://sourceforge.net/project/showfiles.php?group_id=32584>
|
|
||||||
download page</a>.
|
|
||||||
<p>
|
|
||||||
<strong>2001/10/13</strong> A snapshot of
|
|
||||||
<a href=http://sourceforge.net/project/showfiles.php?group_id=32584>
|
|
||||||
LibVNCServer</a> and
|
|
||||||
<a href=http://sourceforge.net/project/showfiles.php?group_id=32584>
|
|
||||||
RDP2VNC</a>
|
|
||||||
is now available. You can also download the
|
|
||||||
<a href=http://sourceforge.net/project/showfiles.php?group_id=32584>
|
|
||||||
diff</a> against rdesktop-1.1.0.
|
|
||||||
rdp2vnc also contains the patches for keyboards other than PC keyboards,
|
|
||||||
and you can specify "-k fr" again.
|
|
||||||
|
|
||||||
<p><br>
|
|
||||||
|
|
||||||
<h2> Introduction </h2>
|
|
||||||
If you don't know VNC, have a look at
|
|
||||||
<a href=http://www.uk.research.att.com/vnc/>the original VNC</a> or at
|
|
||||||
<a href=http://www.tridiavnc.com/>Tridia VNC</a>, who also have commercial
|
|
||||||
support for it.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|
|
||||||
Now that you know what it is, maybe you want to make your own server.
|
|
||||||
If this is not the case, you can ignore the rest of this page an go on
|
|
||||||
surfing the internet.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|
|
||||||
Now that you want to make a VNC server, that is, a server which speaks
|
|
||||||
the RFB protocol, you can download this library from
|
|
||||||
<a href=http://sf.net/projects/libvncserver/>sourceforge</a>.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|
|
||||||
The simplest server looks like this:<br><br>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
#include <rfb/rfb.h>
|
|
||||||
|
|
||||||
int main(int argc,char** argv)
|
|
||||||
{
|
|
||||||
rfbScreenInfoPtr server=rfbGetScreen(&argc,argv,400,300,8,3,4);
|
|
||||||
server->frameBuffer=malloc(400*300*4);
|
|
||||||
rfbInitServer(server);
|
|
||||||
rfbRunEventLoop(server,-1,FALSE);
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
This sample creates a 400x300 frame buffer in true colour. There are
|
|
||||||
4 bytes per pixel, because 3 (which are only used instead of all 4) is
|
|
||||||
such an odd number. Then the server is initialized and a blocking event
|
|
||||||
loop is started.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Of course, this program only shows rubbish (whatever is in the frame
|
|
||||||
buffer you malloc'd), but it proves that writing a server can be
|
|
||||||
very easy.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
For details (especially if you want to write a real server) look into the
|
|
||||||
provided examples, pnmshow.c and example.c, and into the README. You find
|
|
||||||
there documentation for much more complicated servers.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Serious comments, suggestions, pizzas, etc. go to
|
|
||||||
<a href=mailto:Johannes.Schindelin@RuBBISHgmx.de>me</a>
|
|
||||||
(delete the RuBBISH).
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Here are some links:
|
|
||||||
|
|
||||||
<p>
|
|
||||||
LibVNCServer is an adapted
|
|
||||||
<a href=http://www.redstonesoftware.com/vnc.html>OSXvnc-server</a> by
|
|
||||||
<a href=mailto:mcguirk@incompleteness.net>Dan McGuirk</a>,
|
|
||||||
which is in turn an adapted original
|
|
||||||
<a href=http://www.uk.research.att.com/vnc/>Xvnc</a>.
|
|
||||||
<p>
|
|
||||||
I use it to to drive a
|
|
||||||
<strong>Windows Terminal Server (RDP) to RFB converter</strong> with it.
|
|
||||||
Much work has been done to make
|
|
||||||
<a href=http://www.rdesktop.org/>rdesktop</a>
|
|
||||||
a good X client to Windows Terminal Services (both NT and 2000, see
|
|
||||||
<a href=http://bibl4.oru.se/projects/rdesktop/>rdesktop patches</a>).
|
|
||||||
Previous work was done by <a href=mailto:tme23@cam.ac.uk>Tim Edmonds</a>
|
|
||||||
who has set up such a converter named
|
|
||||||
<a href=http://www-lce.eng.cam.ac.uk/~tme23/vdesktop/>vdesktop</a>
|
|
||||||
including a single client server and a multi client server, rdp2vnc.
|
|
||||||
Unfortunately he used the example code from rfbcounter, which can encode only
|
|
||||||
RRE, which is not a good compression.
|
|
||||||
<p>
|
|
||||||
<a href=http://libvncserver.sourceforge.net/success.html>Other people</a>
|
|
||||||
have used this library as well.
|
|
||||||
<p>
|
|
||||||
If you want to know about other of my projects, look at
|
|
||||||
<a href=http://wrzx69.rz.uni-wuerzburg.de/~gene099/index.html>my homepage</a>.
|
|
||||||
<hr>
|
|
||||||
Project hosted on the fantastic
|
|
||||||
<A href="http://sourceforge.net">
|
|
||||||
<IMG src="http://sourceforge.net/sflogo.php?group_id=32584"
|
|
||||||
width="88" height="31" border="0" alt="SourceForge Logo"></A><br>
|
|
||||||
<!-- Created: Thu Sep 27 12:27:41 MESZ 2001 -->
|
|
||||||
<!-- hhmts start -->
|
|
||||||
Last modified: Mon Jan 17 18:23:00 MESZ 2005
|
|
||||||
<!-- hhmts end -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,5 +0,0 @@
|
|||||||
.deps
|
|
||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
libvncclient.a
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
|||||||
INCLUDES = -I$(top_srcdir)
|
|
||||||
|
|
||||||
libvncclient_la_SOURCES=cursor.c listen.c rfbproto.c sockets.c vncviewer.c minilzo.c tls.c
|
|
||||||
|
|
||||||
noinst_HEADERS=lzoconf.h minilzo.h tls.h
|
|
||||||
|
|
||||||
rfbproto.o: rfbproto.c corre.c hextile.c rre.c tight.c zlib.c zrle.c ultra.c
|
|
||||||
|
|
||||||
EXTRA_DIST=corre.c hextile.c rre.c tight.c zlib.c zrle.c ultra.c tls.c
|
|
||||||
|
|
||||||
$(libvncclient_la_OBJECTS): ../rfb/rfbclient.h
|
|
||||||
|
|
||||||
lib_LTLIBRARIES=libvncclient.la
|
|
||||||
|
|
||||||
|
|
@ -1,70 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* This is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This software is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this software; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
|
||||||
* USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* corre.c - handle CoRRE encoding.
|
|
||||||
*
|
|
||||||
* This file shouldn't be compiled directly. It is included multiple times by
|
|
||||||
* rfbproto.c, each time with a different definition of the macro BPP. For
|
|
||||||
* each value of BPP, this file defines a function which handles a CoRRE
|
|
||||||
* encoded rectangle with BPP bits per pixel.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define HandleCoRREBPP CONCAT2E(HandleCoRRE,BPP)
|
|
||||||
#define CARDBPP CONCAT3E(uint,BPP,_t)
|
|
||||||
|
|
||||||
static rfbBool
|
|
||||||
HandleCoRREBPP (rfbClient* client, int rx, int ry, int rw, int rh)
|
|
||||||
{
|
|
||||||
rfbRREHeader hdr;
|
|
||||||
int i;
|
|
||||||
CARDBPP pix;
|
|
||||||
uint8_t *ptr;
|
|
||||||
int x, y, w, h;
|
|
||||||
|
|
||||||
if (!ReadFromRFBServer(client, (char *)&hdr, sz_rfbRREHeader))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
hdr.nSubrects = rfbClientSwap32IfLE(hdr.nSubrects);
|
|
||||||
|
|
||||||
if (!ReadFromRFBServer(client, (char *)&pix, sizeof(pix)))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
FillRectangle(client, rx, ry, rw, rh, pix);
|
|
||||||
|
|
||||||
if (!ReadFromRFBServer(client, client->buffer, hdr.nSubrects * (4 + (BPP / 8))))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
ptr = (uint8_t *)client->buffer;
|
|
||||||
|
|
||||||
for (i = 0; i < hdr.nSubrects; i++) {
|
|
||||||
pix = *(CARDBPP *)ptr;
|
|
||||||
ptr += BPP/8;
|
|
||||||
x = *ptr++;
|
|
||||||
y = *ptr++;
|
|
||||||
w = *ptr++;
|
|
||||||
h = *ptr++;
|
|
||||||
|
|
||||||
FillRectangle(client, rx+x, ry+y, w, h, pix);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef CARDBPP
|
|
@ -1,179 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2001,2002 Constantin Kaplinsky. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* This is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This software is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this software; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
|
||||||
* USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* cursor.c - code to support cursor shape updates (XCursor and
|
|
||||||
* RichCursor preudo-encodings).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <rfb/rfbclient.h>
|
|
||||||
|
|
||||||
|
|
||||||
#define OPER_SAVE 0
|
|
||||||
#define OPER_RESTORE 1
|
|
||||||
|
|
||||||
#define RGB24_TO_PIXEL(bpp,r,g,b) \
|
|
||||||
((((uint##bpp##_t)(r) & 0xFF) * client->format.redMax + 127) / 255 \
|
|
||||||
<< client->format.redShift | \
|
|
||||||
(((uint##bpp##_t)(g) & 0xFF) * client->format.greenMax + 127) / 255 \
|
|
||||||
<< client->format.greenShift | \
|
|
||||||
(((uint##bpp##_t)(b) & 0xFF) * client->format.blueMax + 127) / 255 \
|
|
||||||
<< client->format.blueShift)
|
|
||||||
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
* HandleCursorShape(). Support for XCursor and RichCursor shape
|
|
||||||
* updates. We emulate cursor operating on the frame buffer (that is
|
|
||||||
* why we call it "software cursor").
|
|
||||||
********************************************************************/
|
|
||||||
|
|
||||||
rfbBool HandleCursorShape(rfbClient* client,int xhot, int yhot, int width, int height, uint32_t enc)
|
|
||||||
{
|
|
||||||
int bytesPerPixel;
|
|
||||||
size_t bytesPerRow, bytesMaskData;
|
|
||||||
rfbXCursorColors rgb;
|
|
||||||
uint32_t colors[2];
|
|
||||||
char *buf;
|
|
||||||
uint8_t *ptr;
|
|
||||||
int x, y, b;
|
|
||||||
|
|
||||||
bytesPerPixel = client->format.bitsPerPixel / 8;
|
|
||||||
bytesPerRow = (width + 7) / 8;
|
|
||||||
bytesMaskData = bytesPerRow * height;
|
|
||||||
|
|
||||||
if (width * height == 0)
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
/* Allocate memory for pixel data and temporary mask data. */
|
|
||||||
if(client->rcSource)
|
|
||||||
free(client->rcSource);
|
|
||||||
|
|
||||||
client->rcSource = malloc(width * height * bytesPerPixel);
|
|
||||||
if (client->rcSource == NULL)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
buf = malloc(bytesMaskData);
|
|
||||||
if (buf == NULL) {
|
|
||||||
free(client->rcSource);
|
|
||||||
client->rcSource = NULL;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read and decode cursor pixel data, depending on the encoding type. */
|
|
||||||
|
|
||||||
if (enc == rfbEncodingXCursor) {
|
|
||||||
/* Read and convert background and foreground colors. */
|
|
||||||
if (!ReadFromRFBServer(client, (char *)&rgb, sz_rfbXCursorColors)) {
|
|
||||||
free(client->rcSource);
|
|
||||||
client->rcSource = NULL;
|
|
||||||
free(buf);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
colors[0] = RGB24_TO_PIXEL(32, rgb.backRed, rgb.backGreen, rgb.backBlue);
|
|
||||||
colors[1] = RGB24_TO_PIXEL(32, rgb.foreRed, rgb.foreGreen, rgb.foreBlue);
|
|
||||||
|
|
||||||
/* Read 1bpp pixel data into a temporary buffer. */
|
|
||||||
if (!ReadFromRFBServer(client, buf, bytesMaskData)) {
|
|
||||||
free(client->rcSource);
|
|
||||||
client->rcSource = NULL;
|
|
||||||
free(buf);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert 1bpp data to byte-wide color indices. */
|
|
||||||
ptr = client->rcSource;
|
|
||||||
for (y = 0; y < height; y++) {
|
|
||||||
for (x = 0; x < width / 8; x++) {
|
|
||||||
for (b = 7; b >= 0; b--) {
|
|
||||||
*ptr = buf[y * bytesPerRow + x] >> b & 1;
|
|
||||||
ptr += bytesPerPixel;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (b = 7; b > 7 - width % 8; b--) {
|
|
||||||
*ptr = buf[y * bytesPerRow + x] >> b & 1;
|
|
||||||
ptr += bytesPerPixel;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert indices into the actual pixel values. */
|
|
||||||
switch (bytesPerPixel) {
|
|
||||||
case 1:
|
|
||||||
for (x = 0; x < width * height; x++)
|
|
||||||
client->rcSource[x] = (uint8_t)colors[client->rcSource[x]];
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
for (x = 0; x < width * height; x++)
|
|
||||||
((uint16_t *)client->rcSource)[x] = (uint16_t)colors[client->rcSource[x * 2]];
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
for (x = 0; x < width * height; x++)
|
|
||||||
((uint32_t *)client->rcSource)[x] = colors[client->rcSource[x * 4]];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else { /* enc == rfbEncodingRichCursor */
|
|
||||||
|
|
||||||
if (!ReadFromRFBServer(client, (char *)client->rcSource, width * height * bytesPerPixel)) {
|
|
||||||
free(client->rcSource);
|
|
||||||
client->rcSource = NULL;
|
|
||||||
free(buf);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read and decode mask data. */
|
|
||||||
|
|
||||||
if (!ReadFromRFBServer(client, buf, bytesMaskData)) {
|
|
||||||
free(client->rcSource);
|
|
||||||
client->rcSource = NULL;
|
|
||||||
free(buf);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
client->rcMask = malloc(width * height);
|
|
||||||
if (client->rcMask == NULL) {
|
|
||||||
free(client->rcSource);
|
|
||||||
client->rcSource = NULL;
|
|
||||||
free(buf);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr = client->rcMask;
|
|
||||||
for (y = 0; y < height; y++) {
|
|
||||||
for (x = 0; x < width / 8; x++) {
|
|
||||||
for (b = 7; b >= 0; b--) {
|
|
||||||
*ptr++ = buf[y * bytesPerRow + x] >> b & 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (b = 7; b > 7 - width % 8; b--) {
|
|
||||||
*ptr++ = buf[y * bytesPerRow + x] >> b & 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client->GotCursorShape != NULL) {
|
|
||||||
client->GotCursorShape(client, xhot, yhot, width, height, bytesPerPixel);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(buf);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,127 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* This is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This software is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this software; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
|
||||||
* USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* hextile.c - handle hextile encoding.
|
|
||||||
*
|
|
||||||
* This file shouldn't be compiled directly. It is included multiple times by
|
|
||||||
* rfbproto.c, each time with a different definition of the macro BPP. For
|
|
||||||
* each value of BPP, this file defines a function which handles a hextile
|
|
||||||
* encoded rectangle with BPP bits per pixel.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define HandleHextileBPP CONCAT2E(HandleHextile,BPP)
|
|
||||||
#define CARDBPP CONCAT3E(uint,BPP,_t)
|
|
||||||
|
|
||||||
static rfbBool
|
|
||||||
HandleHextileBPP (rfbClient* client, int rx, int ry, int rw, int rh)
|
|
||||||
{
|
|
||||||
CARDBPP bg, fg;
|
|
||||||
int i;
|
|
||||||
uint8_t *ptr;
|
|
||||||
int x, y, w, h;
|
|
||||||
int sx, sy, sw, sh;
|
|
||||||
uint8_t subencoding;
|
|
||||||
uint8_t nSubrects;
|
|
||||||
|
|
||||||
for (y = ry; y < ry+rh; y += 16) {
|
|
||||||
for (x = rx; x < rx+rw; x += 16) {
|
|
||||||
w = h = 16;
|
|
||||||
if (rx+rw - x < 16)
|
|
||||||
w = rx+rw - x;
|
|
||||||
if (ry+rh - y < 16)
|
|
||||||
h = ry+rh - y;
|
|
||||||
|
|
||||||
if (!ReadFromRFBServer(client, (char *)&subencoding, 1))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (subencoding & rfbHextileRaw) {
|
|
||||||
if (!ReadFromRFBServer(client, client->buffer, w * h * (BPP / 8)))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
CopyRectangle(client, (uint8_t *)client->buffer, x, y, w, h);
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (subencoding & rfbHextileBackgroundSpecified)
|
|
||||||
if (!ReadFromRFBServer(client, (char *)&bg, sizeof(bg)))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
FillRectangle(client, x, y, w, h, bg);
|
|
||||||
|
|
||||||
if (subencoding & rfbHextileForegroundSpecified)
|
|
||||||
if (!ReadFromRFBServer(client, (char *)&fg, sizeof(fg)))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (!(subencoding & rfbHextileAnySubrects)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ReadFromRFBServer(client, (char *)&nSubrects, 1))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
ptr = (uint8_t*)client->buffer;
|
|
||||||
|
|
||||||
if (subencoding & rfbHextileSubrectsColoured) {
|
|
||||||
if (!ReadFromRFBServer(client, client->buffer, nSubrects * (2 + (BPP / 8))))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
for (i = 0; i < nSubrects; i++) {
|
|
||||||
#if BPP==8
|
|
||||||
GET_PIXEL8(fg, ptr);
|
|
||||||
#elif BPP==16
|
|
||||||
GET_PIXEL16(fg, ptr);
|
|
||||||
#elif BPP==32
|
|
||||||
GET_PIXEL32(fg, ptr);
|
|
||||||
#else
|
|
||||||
#error "Invalid BPP"
|
|
||||||
#endif
|
|
||||||
sx = rfbHextileExtractX(*ptr);
|
|
||||||
sy = rfbHextileExtractY(*ptr);
|
|
||||||
ptr++;
|
|
||||||
sw = rfbHextileExtractW(*ptr);
|
|
||||||
sh = rfbHextileExtractH(*ptr);
|
|
||||||
ptr++;
|
|
||||||
|
|
||||||
FillRectangle(client, x+sx, y+sy, sw, sh, fg);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if (!ReadFromRFBServer(client, client->buffer, nSubrects * 2))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
for (i = 0; i < nSubrects; i++) {
|
|
||||||
sx = rfbHextileExtractX(*ptr);
|
|
||||||
sy = rfbHextileExtractY(*ptr);
|
|
||||||
ptr++;
|
|
||||||
sw = rfbHextileExtractW(*ptr);
|
|
||||||
sh = rfbHextileExtractH(*ptr);
|
|
||||||
ptr++;
|
|
||||||
|
|
||||||
FillRectangle(client, x+sx, y+sy, sw, sh, fg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef CARDBPP
|
|
@ -1,171 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* This is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This software is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this software; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
|
||||||
* USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* listen.c - listen for incoming connections
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __STRICT_ANSI__
|
|
||||||
#define _BSD_SOURCE
|
|
||||||
#endif
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#ifdef __MINGW32__
|
|
||||||
#define close closesocket
|
|
||||||
#include <winsock2.h>
|
|
||||||
#else
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <sys/utsname.h>
|
|
||||||
#endif
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <rfb/rfbclient.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* listenForIncomingConnections() - listen for incoming connections from
|
|
||||||
* servers, and fork a new process to deal with each connection.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
listenForIncomingConnections(rfbClient* client)
|
|
||||||
{
|
|
||||||
#ifdef __MINGW32__
|
|
||||||
/* FIXME */
|
|
||||||
rfbClientErr("listenForIncomingConnections on MinGW32 NOT IMPLEMENTED\n");
|
|
||||||
return;
|
|
||||||
#else
|
|
||||||
int listenSocket;
|
|
||||||
fd_set fds;
|
|
||||||
|
|
||||||
client->listenSpecified = TRUE;
|
|
||||||
|
|
||||||
listenSocket = ListenAtTcpPort(client->listenPort);
|
|
||||||
|
|
||||||
if ((listenSocket < 0))
|
|
||||||
return;
|
|
||||||
|
|
||||||
rfbClientLog("%s -listen: Listening on port %d\n",
|
|
||||||
client->programName,client->listenPort);
|
|
||||||
rfbClientLog("%s -listen: Command line errors are not reported until "
|
|
||||||
"a connection comes in.\n", client->programName);
|
|
||||||
|
|
||||||
while (TRUE) {
|
|
||||||
|
|
||||||
/* reap any zombies */
|
|
||||||
int status, pid;
|
|
||||||
while ((pid= wait3(&status, WNOHANG, (struct rusage *)0))>0);
|
|
||||||
|
|
||||||
/* TODO: callback for discard any events (like X11 events) */
|
|
||||||
|
|
||||||
FD_ZERO(&fds);
|
|
||||||
|
|
||||||
FD_SET(listenSocket, &fds);
|
|
||||||
|
|
||||||
select(listenSocket+1, &fds, NULL, NULL, NULL);
|
|
||||||
|
|
||||||
if (FD_ISSET(listenSocket, &fds)) {
|
|
||||||
client->sock = AcceptTcpConnection(listenSocket);
|
|
||||||
if (client->sock < 0)
|
|
||||||
return;
|
|
||||||
if (!SetNonBlocking(client->sock))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Now fork off a new process to deal with it... */
|
|
||||||
|
|
||||||
switch (fork()) {
|
|
||||||
|
|
||||||
case -1:
|
|
||||||
rfbClientErr("fork\n");
|
|
||||||
return;
|
|
||||||
|
|
||||||
case 0:
|
|
||||||
/* child - return to caller */
|
|
||||||
close(listenSocket);
|
|
||||||
return;
|
|
||||||
|
|
||||||
default:
|
|
||||||
/* parent - go round and listen again */
|
|
||||||
close(client->sock);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* listenForIncomingConnectionsNoFork() - listen for incoming connections
|
|
||||||
* from servers, but DON'T fork, instead just wait timeout microseconds.
|
|
||||||
* If timeout is negative, block indefinitly.
|
|
||||||
* Returns 1 on success (there was an incoming connection on the listen socket
|
|
||||||
* and we accepted it successfully), -1 on error, 0 on timeout.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int
|
|
||||||
listenForIncomingConnectionsNoFork(rfbClient* client, int timeout)
|
|
||||||
{
|
|
||||||
fd_set fds;
|
|
||||||
struct timeval to;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
to.tv_sec= timeout / 1000000;
|
|
||||||
to.tv_usec= timeout % 1000000;
|
|
||||||
|
|
||||||
client->listenSpecified = TRUE;
|
|
||||||
|
|
||||||
if (client->listenSock < 0)
|
|
||||||
{
|
|
||||||
client->listenSock = ListenAtTcpPort(client->listenPort);
|
|
||||||
|
|
||||||
if (client->listenSock < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
rfbClientLog("%s -listennofork: Listening on port %d\n",
|
|
||||||
client->programName,client->listenPort);
|
|
||||||
rfbClientLog("%s -listennofork: Command line errors are not reported until "
|
|
||||||
"a connection comes in.\n", client->programName);
|
|
||||||
}
|
|
||||||
|
|
||||||
FD_ZERO(&fds);
|
|
||||||
|
|
||||||
FD_SET(client->listenSock, &fds);
|
|
||||||
|
|
||||||
if (timeout < 0)
|
|
||||||
r = select(client->listenSock+1, &fds, NULL, NULL, NULL);
|
|
||||||
else
|
|
||||||
r = select(client->listenSock+1, &fds, NULL, NULL, &to);
|
|
||||||
|
|
||||||
if (r > 0)
|
|
||||||
{
|
|
||||||
client->sock = AcceptTcpConnection(client->listenSock);
|
|
||||||
if (client->sock < 0)
|
|
||||||
return -1;
|
|
||||||
if (!SetNonBlocking(client->sock))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
close(client->listenSock);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* r is now either 0 (timeout) or -1 (error) */
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,451 +0,0 @@
|
|||||||
/* lzoconf.h -- configuration for the LZO real-time data compression library
|
|
||||||
|
|
||||||
This file is part of the LZO real-time data compression library.
|
|
||||||
|
|
||||||
Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
The LZO library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2 of
|
|
||||||
the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The LZO library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with the LZO library; see the file COPYING.
|
|
||||||
If not, write to the Free Software Foundation, Inc.,
|
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/opensource/lzo/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __LZOCONF_H
|
|
||||||
#define __LZOCONF_H
|
|
||||||
|
|
||||||
#define LZO_VERSION 0x1080
|
|
||||||
#define LZO_VERSION_STRING "1.08"
|
|
||||||
#define LZO_VERSION_DATE "Jul 12 2002"
|
|
||||||
|
|
||||||
/* internal Autoconf configuration file - only used when building LZO */
|
|
||||||
#if defined(LZO_HAVE_CONFIG_H)
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// LZO requires a conforming <limits.h>
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(CHAR_BIT) || (CHAR_BIT != 8)
|
|
||||||
# error "invalid CHAR_BIT"
|
|
||||||
#endif
|
|
||||||
#if !defined(UCHAR_MAX) || !defined(UINT_MAX) || !defined(ULONG_MAX)
|
|
||||||
# error "check your compiler installation"
|
|
||||||
#endif
|
|
||||||
#if (USHRT_MAX < 1) || (UINT_MAX < 1) || (ULONG_MAX < 1)
|
|
||||||
# error "your limits.h macros are broken"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* workaround a cpp bug under hpux 10.20 */
|
|
||||||
#define LZO_0xffffffffL 4294967295ul
|
|
||||||
|
|
||||||
#if !defined(LZO_UINT32_C)
|
|
||||||
# if (UINT_MAX < LZO_0xffffffffL)
|
|
||||||
# define LZO_UINT32_C(c) c ## UL
|
|
||||||
# else
|
|
||||||
# define LZO_UINT32_C(c) c ## U
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// architecture defines
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(__LZO_WIN) && !defined(__LZO_DOS) && !defined(__LZO_OS2)
|
|
||||||
# if defined(__WINDOWS__) || defined(_WINDOWS) || defined(_Windows)
|
|
||||||
# define __LZO_WIN
|
|
||||||
# elif defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
|
|
||||||
# define __LZO_WIN
|
|
||||||
# elif defined(__NT__) || defined(__NT_DLL__) || defined(__WINDOWS_386__)
|
|
||||||
# define __LZO_WIN
|
|
||||||
# elif defined(__DOS__) || defined(__MSDOS__) || defined(MSDOS)
|
|
||||||
# define __LZO_DOS
|
|
||||||
# elif defined(__OS2__) || defined(__OS2V2__) || defined(OS2)
|
|
||||||
# define __LZO_OS2
|
|
||||||
# elif defined(__palmos__)
|
|
||||||
# define __LZO_PALMOS
|
|
||||||
# elif defined(__TOS__) || defined(__atarist__)
|
|
||||||
# define __LZO_TOS
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (UINT_MAX < LZO_0xffffffffL)
|
|
||||||
# if defined(__LZO_WIN)
|
|
||||||
# define __LZO_WIN16
|
|
||||||
# elif defined(__LZO_DOS)
|
|
||||||
# define __LZO_DOS16
|
|
||||||
# elif defined(__LZO_PALMOS)
|
|
||||||
# define __LZO_PALMOS16
|
|
||||||
# elif defined(__LZO_TOS)
|
|
||||||
# define __LZO_TOS16
|
|
||||||
# elif defined(__C166__)
|
|
||||||
# else
|
|
||||||
/* porting hint: for pure 16-bit architectures try compiling
|
|
||||||
* everything with -D__LZO_STRICT_16BIT */
|
|
||||||
# error "16-bit target not supported - contact me for porting hints"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__LZO_i386)
|
|
||||||
# if defined(__LZO_DOS) || defined(__LZO_WIN16)
|
|
||||||
# define __LZO_i386
|
|
||||||
# elif defined(__i386__) || defined(__386__) || defined(_M_IX86)
|
|
||||||
# define __LZO_i386
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__LZO_STRICT_16BIT)
|
|
||||||
# if (UINT_MAX < LZO_0xffffffffL)
|
|
||||||
# include <lzo16bit.h>
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* memory checkers */
|
|
||||||
#if !defined(__LZO_CHECKER)
|
|
||||||
# if defined(__BOUNDS_CHECKING_ON)
|
|
||||||
# define __LZO_CHECKER
|
|
||||||
# elif defined(__CHECKER__)
|
|
||||||
# define __LZO_CHECKER
|
|
||||||
# elif defined(__INSURE__)
|
|
||||||
# define __LZO_CHECKER
|
|
||||||
# elif defined(__PURIFY__)
|
|
||||||
# define __LZO_CHECKER
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// integral and pointer types
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* Integral types with 32 bits or more */
|
|
||||||
#if !defined(LZO_UINT32_MAX)
|
|
||||||
# if (UINT_MAX >= LZO_0xffffffffL)
|
|
||||||
typedef unsigned int lzo_uint32;
|
|
||||||
typedef int lzo_int32;
|
|
||||||
# define LZO_UINT32_MAX UINT_MAX
|
|
||||||
# define LZO_INT32_MAX INT_MAX
|
|
||||||
# define LZO_INT32_MIN INT_MIN
|
|
||||||
# elif (ULONG_MAX >= LZO_0xffffffffL)
|
|
||||||
typedef unsigned long lzo_uint32;
|
|
||||||
typedef long lzo_int32;
|
|
||||||
# define LZO_UINT32_MAX ULONG_MAX
|
|
||||||
# define LZO_INT32_MAX LONG_MAX
|
|
||||||
# define LZO_INT32_MIN LONG_MIN
|
|
||||||
# else
|
|
||||||
# error "lzo_uint32"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* lzo_uint is used like size_t */
|
|
||||||
#if !defined(LZO_UINT_MAX)
|
|
||||||
# if (UINT_MAX >= LZO_0xffffffffL)
|
|
||||||
typedef unsigned int lzo_uint;
|
|
||||||
typedef int lzo_int;
|
|
||||||
# define LZO_UINT_MAX UINT_MAX
|
|
||||||
# define LZO_INT_MAX INT_MAX
|
|
||||||
# define LZO_INT_MIN INT_MIN
|
|
||||||
# elif (ULONG_MAX >= LZO_0xffffffffL)
|
|
||||||
typedef unsigned long lzo_uint;
|
|
||||||
typedef long lzo_int;
|
|
||||||
# define LZO_UINT_MAX ULONG_MAX
|
|
||||||
# define LZO_INT_MAX LONG_MAX
|
|
||||||
# define LZO_INT_MIN LONG_MIN
|
|
||||||
# else
|
|
||||||
# error "lzo_uint"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef int lzo_bool;
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// memory models
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* Memory model for the public code segment. */
|
|
||||||
#if !defined(__LZO_CMODEL)
|
|
||||||
# if defined(__LZO_DOS16) || defined(__LZO_WIN16)
|
|
||||||
# define __LZO_CMODEL __far
|
|
||||||
# elif defined(__LZO_i386) && defined(__WATCOMC__)
|
|
||||||
# define __LZO_CMODEL __near
|
|
||||||
# else
|
|
||||||
# define __LZO_CMODEL
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Memory model for the public data segment. */
|
|
||||||
#if !defined(__LZO_DMODEL)
|
|
||||||
# if defined(__LZO_DOS16) || defined(__LZO_WIN16)
|
|
||||||
# define __LZO_DMODEL __far
|
|
||||||
# elif defined(__LZO_i386) && defined(__WATCOMC__)
|
|
||||||
# define __LZO_DMODEL __near
|
|
||||||
# else
|
|
||||||
# define __LZO_DMODEL
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Memory model that allows to access memory at offsets of lzo_uint. */
|
|
||||||
#if !defined(__LZO_MMODEL)
|
|
||||||
# if (LZO_UINT_MAX <= UINT_MAX)
|
|
||||||
# define __LZO_MMODEL
|
|
||||||
# elif defined(__LZO_DOS16) || defined(__LZO_WIN16)
|
|
||||||
# define __LZO_MMODEL __huge
|
|
||||||
# define LZO_999_UNSUPPORTED
|
|
||||||
# elif defined(__LZO_PALMOS16) || defined(__LZO_TOS16)
|
|
||||||
# define __LZO_MMODEL
|
|
||||||
# else
|
|
||||||
# error "__LZO_MMODEL"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* no typedef here because of const-pointer issues */
|
|
||||||
#define lzo_byte unsigned char __LZO_MMODEL
|
|
||||||
#define lzo_bytep unsigned char __LZO_MMODEL *
|
|
||||||
#define lzo_charp char __LZO_MMODEL *
|
|
||||||
#define lzo_voidp void __LZO_MMODEL *
|
|
||||||
#define lzo_shortp short __LZO_MMODEL *
|
|
||||||
#define lzo_ushortp unsigned short __LZO_MMODEL *
|
|
||||||
#define lzo_uint32p lzo_uint32 __LZO_MMODEL *
|
|
||||||
#define lzo_int32p lzo_int32 __LZO_MMODEL *
|
|
||||||
#define lzo_uintp lzo_uint __LZO_MMODEL *
|
|
||||||
#define lzo_intp lzo_int __LZO_MMODEL *
|
|
||||||
#define lzo_voidpp lzo_voidp __LZO_MMODEL *
|
|
||||||
#define lzo_bytepp lzo_bytep __LZO_MMODEL *
|
|
||||||
|
|
||||||
#ifndef lzo_sizeof_dict_t
|
|
||||||
# define lzo_sizeof_dict_t sizeof(lzo_bytep)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// calling conventions and function types
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* linkage */
|
|
||||||
#if !defined(__LZO_EXTERN_C)
|
|
||||||
# ifdef __cplusplus
|
|
||||||
# define __LZO_EXTERN_C extern "C"
|
|
||||||
# else
|
|
||||||
# define __LZO_EXTERN_C extern
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* calling convention */
|
|
||||||
#if !defined(__LZO_CDECL)
|
|
||||||
# if defined(__LZO_DOS16) || defined(__LZO_WIN16)
|
|
||||||
# define __LZO_CDECL __LZO_CMODEL __cdecl
|
|
||||||
# elif defined(__LZO_i386) && defined(_MSC_VER)
|
|
||||||
# define __LZO_CDECL __LZO_CMODEL __cdecl
|
|
||||||
# elif defined(__LZO_i386) && defined(__WATCOMC__)
|
|
||||||
# define __LZO_CDECL __LZO_CMODEL __cdecl
|
|
||||||
# else
|
|
||||||
# define __LZO_CDECL __LZO_CMODEL
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if !defined(__LZO_ENTRY)
|
|
||||||
# define __LZO_ENTRY __LZO_CDECL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* C++ exception specification for extern "C" function types */
|
|
||||||
#if !defined(__cplusplus)
|
|
||||||
# undef LZO_NOTHROW
|
|
||||||
# define LZO_NOTHROW
|
|
||||||
#elif !defined(LZO_NOTHROW)
|
|
||||||
# define LZO_NOTHROW
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef int
|
|
||||||
(__LZO_ENTRY *lzo_compress_t) ( const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem );
|
|
||||||
|
|
||||||
typedef int
|
|
||||||
(__LZO_ENTRY *lzo_decompress_t) ( const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem );
|
|
||||||
|
|
||||||
typedef int
|
|
||||||
(__LZO_ENTRY *lzo_optimize_t) ( lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem );
|
|
||||||
|
|
||||||
typedef int
|
|
||||||
(__LZO_ENTRY *lzo_compress_dict_t)(const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem,
|
|
||||||
const lzo_byte *dict, lzo_uint dict_len );
|
|
||||||
|
|
||||||
typedef int
|
|
||||||
(__LZO_ENTRY *lzo_decompress_dict_t)(const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem,
|
|
||||||
const lzo_byte *dict, lzo_uint dict_len );
|
|
||||||
|
|
||||||
|
|
||||||
/* assembler versions always use __cdecl */
|
|
||||||
typedef int
|
|
||||||
(__LZO_CDECL *lzo_compress_asm_t)( const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem );
|
|
||||||
|
|
||||||
typedef int
|
|
||||||
(__LZO_CDECL *lzo_decompress_asm_t)( const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem );
|
|
||||||
|
|
||||||
|
|
||||||
/* a progress indicator callback function */
|
|
||||||
typedef void (__LZO_ENTRY *lzo_progress_callback_t) (lzo_uint, lzo_uint);
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// export information
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* DLL export information */
|
|
||||||
#if !defined(__LZO_EXPORT1)
|
|
||||||
# define __LZO_EXPORT1
|
|
||||||
#endif
|
|
||||||
#if !defined(__LZO_EXPORT2)
|
|
||||||
# define __LZO_EXPORT2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* exported calling convention for C functions */
|
|
||||||
#if !defined(LZO_PUBLIC)
|
|
||||||
# define LZO_PUBLIC(_rettype) \
|
|
||||||
__LZO_EXPORT1 _rettype __LZO_EXPORT2 __LZO_ENTRY
|
|
||||||
#endif
|
|
||||||
#if !defined(LZO_EXTERN)
|
|
||||||
# define LZO_EXTERN(_rettype) __LZO_EXTERN_C LZO_PUBLIC(_rettype)
|
|
||||||
#endif
|
|
||||||
#if !defined(LZO_PRIVATE)
|
|
||||||
# define LZO_PRIVATE(_rettype) static _rettype __LZO_ENTRY
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* exported __cdecl calling convention for assembler functions */
|
|
||||||
#if !defined(LZO_PUBLIC_CDECL)
|
|
||||||
# define LZO_PUBLIC_CDECL(_rettype) \
|
|
||||||
__LZO_EXPORT1 _rettype __LZO_EXPORT2 __LZO_CDECL
|
|
||||||
#endif
|
|
||||||
#if !defined(LZO_EXTERN_CDECL)
|
|
||||||
# define LZO_EXTERN_CDECL(_rettype) __LZO_EXTERN_C LZO_PUBLIC_CDECL(_rettype)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* exported global variables (LZO currently uses no static variables and
|
|
||||||
* is fully thread safe) */
|
|
||||||
#if !defined(LZO_PUBLIC_VAR)
|
|
||||||
# define LZO_PUBLIC_VAR(_type) \
|
|
||||||
__LZO_EXPORT1 _type __LZO_EXPORT2 __LZO_DMODEL
|
|
||||||
#endif
|
|
||||||
#if !defined(LZO_EXTERN_VAR)
|
|
||||||
# define LZO_EXTERN_VAR(_type) extern LZO_PUBLIC_VAR(_type)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// error codes and prototypes
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* Error codes for the compression/decompression functions. Negative
|
|
||||||
* values are errors, positive values will be used for special but
|
|
||||||
* normal events.
|
|
||||||
*/
|
|
||||||
#define LZO_E_OK 0
|
|
||||||
#define LZO_E_ERROR (-1)
|
|
||||||
#define LZO_E_OUT_OF_MEMORY (-2) /* not used right now */
|
|
||||||
#define LZO_E_NOT_COMPRESSIBLE (-3) /* not used right now */
|
|
||||||
#define LZO_E_INPUT_OVERRUN (-4)
|
|
||||||
#define LZO_E_OUTPUT_OVERRUN (-5)
|
|
||||||
#define LZO_E_LOOKBEHIND_OVERRUN (-6)
|
|
||||||
#define LZO_E_EOF_NOT_FOUND (-7)
|
|
||||||
#define LZO_E_INPUT_NOT_CONSUMED (-8)
|
|
||||||
|
|
||||||
|
|
||||||
/* lzo_init() should be the first function you call.
|
|
||||||
* Check the return code !
|
|
||||||
*
|
|
||||||
* lzo_init() is a macro to allow checking that the library and the
|
|
||||||
* compiler's view of various types are consistent.
|
|
||||||
*/
|
|
||||||
#define lzo_init() __lzo_init2(LZO_VERSION,(int)sizeof(short),(int)sizeof(int),\
|
|
||||||
(int)sizeof(long),(int)sizeof(lzo_uint32),(int)sizeof(lzo_uint),\
|
|
||||||
(int)lzo_sizeof_dict_t,(int)sizeof(char *),(int)sizeof(lzo_voidp),\
|
|
||||||
(int)sizeof(lzo_compress_t))
|
|
||||||
LZO_EXTERN(int) __lzo_init2(unsigned,int,int,int,int,int,int,int,int,int);
|
|
||||||
|
|
||||||
/* version functions (useful for shared libraries) */
|
|
||||||
LZO_EXTERN(unsigned) lzo_version(void);
|
|
||||||
LZO_EXTERN(const char *) lzo_version_string(void);
|
|
||||||
LZO_EXTERN(const char *) lzo_version_date(void);
|
|
||||||
LZO_EXTERN(const lzo_charp) _lzo_version_string(void);
|
|
||||||
LZO_EXTERN(const lzo_charp) _lzo_version_date(void);
|
|
||||||
|
|
||||||
/* string functions */
|
|
||||||
LZO_EXTERN(int)
|
|
||||||
lzo_memcmp(const lzo_voidp _s1, const lzo_voidp _s2, lzo_uint _len);
|
|
||||||
LZO_EXTERN(lzo_voidp)
|
|
||||||
lzo_memcpy(lzo_voidp _dest, const lzo_voidp _src, lzo_uint _len);
|
|
||||||
LZO_EXTERN(lzo_voidp)
|
|
||||||
lzo_memmove(lzo_voidp _dest, const lzo_voidp _src, lzo_uint _len);
|
|
||||||
LZO_EXTERN(lzo_voidp)
|
|
||||||
lzo_memset(lzo_voidp _s, int _c, lzo_uint _len);
|
|
||||||
|
|
||||||
/* checksum functions */
|
|
||||||
LZO_EXTERN(lzo_uint32)
|
|
||||||
lzo_adler32(lzo_uint32 _adler, const lzo_byte *_buf, lzo_uint _len);
|
|
||||||
LZO_EXTERN(lzo_uint32)
|
|
||||||
lzo_crc32(lzo_uint32 _c, const lzo_byte *_buf, lzo_uint _len);
|
|
||||||
|
|
||||||
/* misc. */
|
|
||||||
LZO_EXTERN(lzo_bool) lzo_assert(int _expr);
|
|
||||||
LZO_EXTERN(int) _lzo_config_check(void);
|
|
||||||
typedef union { lzo_bytep p; lzo_uint u; } __lzo_pu_u;
|
|
||||||
typedef union { lzo_bytep p; lzo_uint32 u32; } __lzo_pu32_u;
|
|
||||||
typedef union { void *vp; lzo_bytep bp; lzo_uint32 u32; long l; } lzo_align_t;
|
|
||||||
|
|
||||||
/* align a char pointer on a boundary that is a multiple of `size' */
|
|
||||||
LZO_EXTERN(unsigned) __lzo_align_gap(const lzo_voidp _ptr, lzo_uint _size);
|
|
||||||
#define LZO_PTR_ALIGN_UP(_ptr,_size) \
|
|
||||||
((_ptr) + (lzo_uint) __lzo_align_gap((const lzo_voidp)(_ptr),(lzo_uint)(_size)))
|
|
||||||
|
|
||||||
/* deprecated - only for backward compatibility */
|
|
||||||
#define LZO_ALIGN(_ptr,_size) LZO_PTR_ALIGN_UP(_ptr,_size)
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -1,100 +0,0 @@
|
|||||||
/* minilzo.h -- mini subset of the LZO real-time data compression library
|
|
||||||
|
|
||||||
This file is part of the LZO real-time data compression library.
|
|
||||||
|
|
||||||
Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
The LZO library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2 of
|
|
||||||
the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The LZO library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with the LZO library; see the file COPYING.
|
|
||||||
If not, write to the Free Software Foundation, Inc.,
|
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/opensource/lzo/
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NOTE:
|
|
||||||
* the full LZO package can be found at
|
|
||||||
* http://www.oberhumer.com/opensource/lzo/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __MINILZO_H
|
|
||||||
#define __MINILZO_H
|
|
||||||
|
|
||||||
#define MINILZO_VERSION 0x1080
|
|
||||||
|
|
||||||
#ifdef __LZOCONF_H
|
|
||||||
# error "you cannot use both LZO and miniLZO"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef LZO_HAVE_CONFIG_H
|
|
||||||
#include "lzoconf.h"
|
|
||||||
|
|
||||||
#if !defined(LZO_VERSION) || (LZO_VERSION != MINILZO_VERSION)
|
|
||||||
# error "version mismatch in header files"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
//
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* Memory required for the wrkmem parameter.
|
|
||||||
* When the required size is 0, you can also pass a NULL pointer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define LZO1X_MEM_COMPRESS LZO1X_1_MEM_COMPRESS
|
|
||||||
#define LZO1X_1_MEM_COMPRESS ((lzo_uint32) (16384L * lzo_sizeof_dict_t))
|
|
||||||
#define LZO1X_MEM_DECOMPRESS (0)
|
|
||||||
|
|
||||||
|
|
||||||
/* compression */
|
|
||||||
LZO_EXTERN(int)
|
|
||||||
lzo1x_1_compress ( const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem );
|
|
||||||
|
|
||||||
/* decompression */
|
|
||||||
LZO_EXTERN(int)
|
|
||||||
lzo1x_decompress ( const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem /* NOT USED */ );
|
|
||||||
|
|
||||||
/* safe decompression with overrun testing */
|
|
||||||
LZO_EXTERN(int)
|
|
||||||
lzo1x_decompress_safe ( const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem /* NOT USED */ );
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user