[X2Go-Commits] [x2gokdrive] 01/01: add some support for HTML5 client (like converting pointer cursors to PNG format).
git-admin at x2go.org
git-admin at x2go.org
Fri Feb 12 02:31:07 CET 2021
This is an automated email from the git hooks/post-receive script.
x2go pushed a commit to branch master
in repository x2gokdrive.
commit 7707e4d35bd9a3c6bb904a1abf109dc528a7ea5e
Author: Oleksandr Shneyder <o.shneyder at phoca-gmbh.de>
Date: Thu Feb 11 19:30:52 2021 -0600
add some support for HTML5 client (like converting pointer cursors to PNG format).
---
debian/changelog | 1 +
x2gokdriveremote.c | 50 ++++++++++++++++++++++++++++++++++++++++----------
x2gokdriveremote.h | 8 +++++---
x2gokdriveselection.c | 4 ++--
4 files changed, 48 insertions(+), 15 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index a38d2b9..c65b49d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -16,6 +16,7 @@ x2gokdrive (0.0.0.1-0x2go1) UNRELEASED; urgency=medium
- reinit client version on new connection and awaka sending thread when client version recieved.
- support sending and recieving selections on demand. Support reading and writing INCR properties.
- move declaration of RemoteHostVars from x2gokdriveremote.h to x2gokdriveremote.c.
+ - add some support for HTML5 client (like converting pointer cursors to PNG format).
[ Mihai Moldovan ]
* Initial release:
diff --git a/x2gokdriveremote.c b/x2gokdriveremote.c
index 35ac570..a41cfb4 100644
--- a/x2gokdriveremote.c
+++ b/x2gokdriveremote.c
@@ -267,9 +267,18 @@ void remote_sendCursor(CursorPtr cursor)
{
if(cursor->bits->argb)
{
- cframe->size=cursor->bits->width*cursor->bits->height*4;
- cframe->data=malloc(cframe->size);
- memcpy(cframe->data, cursor->bits->argb, cframe->size);
+ if(remoteVars.client_os == WEB)
+ {
+ //for web client we need to convert cursor data to PNG format
+ cframe->data=(char*)png_compress( cursor->bits->width, cursor->bits->height,
+ (unsigned char *)cursor->bits->argb, &cframe->size, TRUE);
+ }
+ else
+ {
+ cframe->size=cursor->bits->width*cursor->bits->height*4;
+ cframe->data=malloc(cframe->size);
+ memcpy(cframe->data, cursor->bits->argb, cframe->size);
+ }
}
else
{
@@ -2412,6 +2421,11 @@ clientReadNotify(int fd, int ready, void *data)
client_sel_request_notify(sel);
break;
}
+ case KEEPALIVE:
+ {
+ //receive keepalive event, don't need to do anything
+ break;
+ }
default:
{
EPHYR_DBG("UNSUPPORTED EVENT: %d",event_type);
@@ -2436,7 +2450,7 @@ clientReadNotify(int fd, int ready, void *data)
void set_client_version(uint16_t ver, uint16_t os)
{
remoteVars.client_version=ver;
- if(os > OS_DARWIN)
+ if(os > WEB)
{
EPHYR_DBG("Unsupported OS, assuming OS_LINUX");
}
@@ -2773,7 +2787,7 @@ static void PngWriteCallback(png_structp png_ptr, png_bytep data, png_size_t le
}
unsigned char* png_compress( uint32_t image_width, uint32_t image_height,
- unsigned char* RGBA_buffer, uint32_t* png_size)
+ unsigned char* RGBA_buffer, uint32_t* png_size, BOOL compress_cursor)
{
struct
{
@@ -2781,17 +2795,33 @@ unsigned char* png_compress( uint32_t image_width, uint32_t image_height,
unsigned char *out;
} outdata;
unsigned char** rows = NULL;
+ int color_type;
+ int bpp;
+ png_structp p;
+ png_infop info_ptr;
+
+ if(compress_cursor)
+ {
+ color_type = PNG_COLOR_TYPE_RGB_ALPHA;
+ bpp = 4;
+ }
+ else
+ {
+ color_type = PNG_COLOR_TYPE_RGB;
+ bpp = CACHEBPP;
+ }
- png_structp p = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+ p = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
- png_infop info_ptr = png_create_info_struct(p);
+ info_ptr = png_create_info_struct(p);
setjmp(png_jmpbuf(p));
png_set_IHDR(p, info_ptr,image_width, image_height, 8,
- PNG_COLOR_TYPE_RGB,
+ color_type,
PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT,
PNG_FILTER_TYPE_DEFAULT);
+
*png_size=0;
rows = calloc(sizeof(unsigned char*), image_height);
@@ -2800,7 +2830,7 @@ unsigned char* png_compress( uint32_t image_width, uint32_t image_height,
outdata.out=0;
for (uint32_t y = 0; y < image_height; ++y)
- rows[y] = (unsigned char*)RGBA_buffer + y * image_width * CACHEBPP;
+ rows[y] = (unsigned char*)RGBA_buffer + y * image_width * bpp;
png_set_rows(p, info_ptr, &rows[0]);
@@ -2880,7 +2910,7 @@ unsigned char* image_compress(uint32_t image_width, uint32_t image_height,
if(remoteVars.compression==JPEG)
return jpeg_compress(remoteVars.jpegQuality, image_width, image_height, RGBA_buffer, compressed_size, bpp, fname);
else
- return png_compress(image_width, image_height, RGBA_buffer, compressed_size);
+ return png_compress(image_width, image_height, RGBA_buffer, compressed_size, FALSE);
}
static
diff --git a/x2gokdriveremote.h b/x2gokdriveremote.h
index e87c3ab..0b03917 100644
--- a/x2gokdriveremote.h
+++ b/x2gokdriveremote.h
@@ -96,7 +96,8 @@
//it used to tell server which features are supported by server
//Changes 0 - 1: sending and recieving client and OS version
//Changes 1 - 2: supporting extended selection and sending selection on demand
-#define FEATURE_VERSION 2
+//Changes 2 - 3: supporting web client, sending cursors in PNG format and know about KEEPALIVE event
+#define FEATURE_VERSION 3
#define EPHYR_WANT_DEBUG 1
@@ -137,7 +138,7 @@ enum Compressions{JPEG,PNG};
enum SelectionType{PRIMARY,CLIPBOARD};
enum SelectionMime{STRING,UTF_STRING,PIXMAP};
enum ClipboardMode{CLIP_NONE,CLIP_CLIENT,CLIP_SERVER,CLIP_BOTH};
-enum OS_VERSION{OS_LINUX, OS_WINDOWS, OS_DARWIN};
+enum OS_VERSION{OS_LINUX, OS_WINDOWS, OS_DARWIN, WEB};
#define DEFAULT_COMPRESSION JPEG
@@ -162,6 +163,7 @@ enum OS_VERSION{OS_LINUX, OS_WINDOWS, OS_DARWIN};
#define SELECTIONEVENT 9
#define CLIENTVERSION 10
#define DEMANDSELECTION 11
+#define KEEPALIVE 12
#define EVLENGTH 41
@@ -481,7 +483,7 @@ unsigned char* jpeg_compress(int quality, uint32_t image_width, uint32_t image_h
unsigned char* RGBA_buffer, uint32_t* jpeg_size, int bpp, char* fname);
unsigned char* png_compress(uint32_t image_width, uint32_t image_height,
- unsigned char* RGBA_buffer, uint32_t* png_size);
+ unsigned char* RGBA_buffer, uint32_t* png_size, BOOL compress_cursor);
void clientReadNotify(int fd, int ready, void *data);
diff --git a/x2gokdriveselection.c b/x2gokdriveselection.c
index e3e6857..85447a3 100644
--- a/x2gokdriveselection.c
+++ b/x2gokdriveselection.c
@@ -659,7 +659,7 @@ void read_selection_property(xcb_atom_t selection, xcb_atom_t property)
free(chunk->data);
chunk->data=compressed_data;
chunk->compressed_size=compressed_size;
-// EPHYR_DBG("compressed chunk from %d to %d", chunk->size, chunk->compressed_size);
+ EPHYR_DBG("compressed chunk from %d to %d", chunk->size, chunk->compressed_size);
}
}
}
@@ -722,7 +722,7 @@ void read_selection_property(xcb_atom_t selection, xcb_atom_t property)
remoteVars->selstruct.lastOutputChunk->next=chunk;
remoteVars->selstruct.lastOutputChunk=chunk;
}
-// EPHYR_DBG(" ADD CHUNK %p %p %p", remoteVars->selstruct.firstOutputChunk, remoteVars->selstruct.lastOutputChunk, chunk);
+ EPHYR_DBG(" ADD CHUNK %p %p %p", remoteVars->selstruct.firstOutputChunk, remoteVars->selstruct.lastOutputChunk, chunk);
pthread_cond_signal(&remoteVars->have_sendqueue_cond);
--
Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2gokdrive.git
More information about the x2go-commits
mailing list