linux 下vnc剪贴板改造之二

本文介绍了在Linux环境下,针对VNC剪贴板功能的一种简化改造方法,以解决非ASCII字符,如中文的支持问题。通过修改VNC服务器代码,结合xsel工具,实现了在VNC中流畅使用剪贴板,支持多种字符类型,包括ascii和中文字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     上一篇文章里介绍的linux下vnc使用剪贴板的方法可能比较复杂,也不见得很有效。比如对于//uxxxx这类的字符串,就无能为力。下面再介绍另外一种方法。相对来说比较简单,通常也更加有效。

 

      我们知道,rfb协议里剪贴板的格式是:

typedef struct _rfbClientCutTextMsg {
CARD8 type; /* always rfbClientCutText */
CARD8 pad1;
CARD16 pad2;
CARD32 length;
/* followed by char text[length] */
} rfbClientCutTextMsg;

typedef struct _rfbServerCutTextMsg {
CARD8 type; /* always rfbServerCutText */
CARD8 pad1;
CARD16 pad2;
CARD32 length;
/* followed by char text[length] */
} rfbServerCutTextMsg;

 

如果text里面的内容不是ascii,而是中文,那问题就解决了。对于rfbClientCutTextMsg消息,text里面放入中文应该没问题。对于rfbServerCutTextMsg消息,由于前面已经介绍过,发的只能是ascii内容。我的做法是不要使用cutbuffer了,转而使用selections。这里介绍一个工具xsel,使用它就以设置和获取服务器剪贴板的内容。

 

第一,在服务器中去掉传送和设置cutbuffer的功能。我使用的是tightvnc代码,主要修改的地方是在xserever/hw/vnc/init.c中的rfbRootPropertyChange函数,在这里去提服务器传送cutbuffer的功能。然后在rfbserver.c中去掉设置cutbuffer的代码。

第二,在rfbserver.c中,当收到rfbClientCutText消息时,使用echo str |xsel -ib,设置clipboard的内容。

第三,当剪贴板内容有变化时,使用xsel -ob,拿到内容,然后发送到客户端。

大体上就这三步,怎样在vnc服务器中知道剪贴板的数据有变化呢?我的做法是使用autocutsel,当clipboard里的内容有变化,就设置 cutbuffer的内容,一旦cutbuffer有变化,就在调用到rfbRootPropertyChange函数。我们就可以在里面使用xsel -ob获取剪贴板的内容了。

 

     通过以上的改造,现在我的vnc系统中已经可以正常使用剪贴板了。ascii字符、多字节字符都可以。当然了,只限字符串。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值