wok-next rev 19011

busybox/fbvnc: wheelmouse support (again)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Mar 28 23:15:26 2016 +0200 (2016-03-28)
parents 364e68c766fd
children 564e1bce3c80
files busybox/stuff/busybox-1.23-diff.u busybox/stuff/busybox-1.23-fbvnc.u
line diff
     1.1 --- a/busybox/stuff/busybox-1.23-diff.u	Mon Mar 28 18:51:16 2016 +0200
     1.2 +++ b/busybox/stuff/busybox-1.23-diff.u	Mon Mar 28 23:15:26 2016 +0200
     1.3 @@ -31,7 +31,7 @@
     1.4   			i = MIN(i, j);
     1.5   		}
     1.6   		if (i == 0)
     1.7 -@@ -879,7 +879,9 @@
     1.8 +@@ -869,7 +879,9 @@
     1.9   		 * Using list.len to specify its length,
    1.10   		 * add_to_dirlist will remove it. */
    1.11   		list[i].len = strlen(p[i]);
    1.12 @@ -42,7 +42,7 @@
    1.13   				add_to_dirlist, skip_dir, &list[i], 0);
    1.14   		/* Sort dl alphabetically.
    1.15   		 * GNU diff does this ignoring any number of trailing dots.
    1.16 -@@ -993,7 +995,7 @@
    1.17 +@@ -983,7 +995,7 @@
    1.18   #if ENABLE_FEATURE_DIFF_LONG_OPTIONS
    1.19   	applet_long_options = diff_longopts;
    1.20   #endif
     2.1 --- a/busybox/stuff/busybox-1.23-fbvnc.u	Mon Mar 28 18:51:16 2016 +0200
     2.2 +++ b/busybox/stuff/busybox-1.23-fbvnc.u	Mon Mar 28 23:15:26 2016 +0200
     2.3 @@ -1,8 +1,8 @@
     2.4     text    data     bss     dec     hex filename
     2.5 -   3118       0       0    3118     c2e util-linux/fbvnc.o
     2.6 +   3119       0       0    3119     c2f util-linux/fbvnc.o
     2.7  --- /dev/null
     2.8  +++ busybox/util-linux/fbvnc.c
     2.9 -@@ -0,0 +1,562 @@
    2.10 +@@ -0,0 +1,549 @@
    2.11  +/* vi: set sw=4 ts=4: */
    2.12  +/*
    2.13  + * A small linux framebuffer VNC viewer
    2.14 @@ -30,8 +30,7 @@
    2.15  +//usage:	"[VNC_SERVER] [PORT]"
    2.16  +//usage:#define fbvnc_full_usage "\n\n"
    2.17  +//usage:     "A linux framebuffer VNC viewer."
    2.18 -+//usage:     "\nTo exit, move mouse to upper left corner and press ESC."
    2.19 -+//usage:     "\nor press any mouse button and press ESC or press ESC ^C."
    2.20 ++//usage:     "\nTo exit, press any mouse button and press ESC."
    2.21  +
    2.22  +#include "libbb.h"
    2.23  +#include "vnc.h"
    2.24 @@ -146,6 +145,7 @@
    2.25  +#define srv_rows	scroll[1].srv_size
    2.26  +#define or		scroll[1].offset
    2.27  +#define mr		scroll[1].pos
    2.28 ++	char rat_buttons;
    2.29  +	int fb_fd;
    2.30  +	void *fb_ptr;
    2.31  +	int bpp;
    2.32 @@ -401,32 +401,30 @@
    2.33  +	return status;
    2.34  +}
    2.35  +
    2.36 -+static char rat_buttons;
    2.37  +static void rat_event(void)
    2.38  +{
    2.39 ++	static u8 btn2vnc[8] = {
    2.40 ++		0, VNC_BUTTON1_MASK, VNC_BUTTON3_MASK, 
    2.41 ++		VNC_BUTTON1_MASK + VNC_BUTTON3_MASK, VNC_BUTTON2_MASK, 
    2.42 ++		VNC_BUTTON1_MASK + VNC_BUTTON2_MASK,
    2.43 ++		VNC_BUTTON2_MASK + VNC_BUTTON3_MASK,
    2.44 ++		VNC_BUTTON1_MASK + VNC_BUTTON2_MASK + VNC_BUTTON3_MASK
    2.45 ++	};
    2.46  +	signed char ie[4];
    2.47  +	struct vnc_client_ratevent me = {VNC_CLIENT_RATEVENT};
    2.48 -+	int mask = 0;
    2.49  +	int refresh;
    2.50  +
    2.51  +	xread(G.rat_fd, &ie, sizeof(ie));
    2.52  +	G.mc += ie[1];
    2.53  +	G.mr -= ie[2];
    2.54  +	refresh = 2 - update_scroll(&G.scroll[0]) - update_scroll(&G.scroll[1]);
    2.55 -+	rat_buttons = ie[0] & 7;
    2.56 -+	if (ie[0] & 0x01)
    2.57 -+		mask |= VNC_BUTTON1_MASK;
    2.58 -+	if (ie[0] & 0x04)
    2.59 -+		mask |= VNC_BUTTON2_MASK;
    2.60 -+	if (ie[0] & 0x02)
    2.61 -+		mask |= VNC_BUTTON3_MASK;
    2.62 ++	me.mask = btn2vnc[G.rat_buttons = ie[0] & 7];
    2.63  +	if (ie[3] > 0)		/* wheel up */
    2.64 -+		mask |= VNC_BUTTON4_MASK;
    2.65 ++		me.mask |= VNC_BUTTON4_MASK;
    2.66  +	if (ie[3] < 0)		/* wheel down */
    2.67 -+		mask |= VNC_BUTTON5_MASK;
    2.68 ++		me.mask |= VNC_BUTTON5_MASK;
    2.69  +	me.y = htons(G.mr);
    2.70  +	me.x = htons(G.mc);
    2.71 -+	me.mask = mask;
    2.72  +	write(G.vnc_fd, &me, sizeof(me));
    2.73  +	if (refresh)
    2.74  +		vnc_refresh(0);
    2.75 @@ -448,51 +446,43 @@
    2.76  +	if ((nr = read(0, key, sizeof(key))) <= 0 )
    2.77  +		killed(1);
    2.78  +	for (i = 0; i < nr; i++) {
    2.79 -+		int k = -1;
    2.80 ++		int j, k;
    2.81  +		int mod[4];
    2.82 -+		int nmod = 0;
    2.83 ++		int nmod;
    2.84 ++
    2.85 ++		k = nmod = 0;
    2.86  +		switch (key[i]) {
    2.87  +		case 0x08:
    2.88  +		case 0x7f:
    2.89  +			k = 0xff08;
    2.90  +			break;
    2.91 -+		case 0x09:
    2.92 -+			k = 0xff09;
    2.93 -+			break;
    2.94  +		case 0x1b:
    2.95 -+			if (G.oc + G.mc + G.or + G.mr == 0 || rat_buttons)
    2.96 ++			if (G.rat_buttons)
    2.97  +				killed(0);
    2.98  +			if (i + 2 < nr && key[i + 1] == '[') {
    2.99 -+				if (key[i + 2] == 'A')
   2.100 -+					k = 0xff52;
   2.101 -+				if (key[i + 2] == 'B')
   2.102 -+					k = 0xff54;
   2.103 -+				if (key[i + 2] == 'C')
   2.104 -+					k = 0xff53;
   2.105 -+				if (key[i + 2] == 'D')
   2.106 -+					k = 0xff51;
   2.107 -+				if (key[i + 2] == 'H')
   2.108 -+					k = 0xff50;
   2.109 -+				if (k > 0) {
   2.110 ++				static const char arr2vnc[] = "HDACB";
   2.111 ++				char *p = strchr(arr2vnc, key[i + 2]);
   2.112 ++
   2.113 ++				if (p) {
   2.114 ++					k = p - arr2vnc + 0xff50;
   2.115  +					i += 2;
   2.116  +					break;
   2.117  +				}
   2.118  +			}
   2.119 -+			k = 0xff1b;
   2.120  +			if (i + 1 < nr) {
   2.121  +				mod[nmod++] = 0xffe9;
   2.122 -+				k = key[++i];
   2.123 -+				if (k == 0x03) /* esc-^C quit */
   2.124 -+					killed(0);
   2.125 ++				i++;
   2.126  +			}
   2.127 -+			break;
   2.128 ++		case 0x09:
   2.129  +		case 0x0d:
   2.130 -+			k = 0xff0d;
   2.131 -+			break;
   2.132 -+		case 0x0c:	/* ^L: redraw */
   2.133 -+			vnc_refresh(0);
   2.134 ++			k = 0xff00;
   2.135 ++			goto getkey;
   2.136 ++		case 0x0c:	/* Mouse button + ^L: redraw */
   2.137 ++			if (G.rat_buttons)
   2.138 ++				vnc_refresh(0);
   2.139  +		default:
   2.140 -+			k = (unsigned char) key[i];
   2.141 ++		getkey:
   2.142 ++			k += (unsigned char) key[i];
   2.143  +		}
   2.144  +		if ((k >= 'A' && k <= 'Z') || strchr(":\"<>?{}|+_()*&^%$#@!~", k))
   2.145  +			mod[nmod++] = 0xffe1;
   2.146 @@ -500,15 +490,12 @@
   2.147  +			k += 'a' - 1;
   2.148  +			mod[nmod++] = 0xffe3;
   2.149  +		}
   2.150 -+		if (k > 0) {
   2.151 -+			int j;
   2.152 -+			mod[nmod] = k;
   2.153 -+			for (j = 0; j <= nmod; j++)
   2.154 -+				press(mod[j], 1);
   2.155 -+			press(k, 0);
   2.156 -+			for (j = 0; j < nmod; j++)
   2.157 -+				press(mod[j], 0);
   2.158 -+		}
   2.159 ++		mod[nmod] = k;
   2.160 ++		for (j = 0; j <= nmod; j++)
   2.161 ++			press(mod[j], 1);
   2.162 ++		press(k, 0);
   2.163 ++		for (j = 0; j < nmod; j++)
   2.164 ++			press(mod[j], 0);
   2.165  +	}
   2.166  +}
   2.167  +