|
@@ -42,6 +42,25 @@ static struct {
|
|
|
{KF|12, 0xffc9},
|
|
|
};
|
|
|
|
|
|
+static char shiftkey[128] = {
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, /* nul soh stx etx eot enq ack bel */
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, /* bs ht nl vt np cr so si */
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, /* dle dc1 dc2 dc3 dc4 nak syn etb */
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, /* can em sub esc fs gs rs us */
|
|
|
+ 0, 1, 1, 1, 1, 1, 1, 0, /* sp ! " # $ % & ' */
|
|
|
+ 1, 1, 1, 1, 0, 0, 0, 0, /* ( ) * + , - . / */
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0 1 2 3 4 5 6 7 */
|
|
|
+ 0, 0, 1, 0, 1, 0, 1, 1, /* 8 9 : ; < = > ? */
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, /* @ A B C D E F G */
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, /* H I J K L M N O */
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, /* P Q R S T U V W */
|
|
|
+ 1, 1, 1, 0, 0, 0, 1, 1, /* X Y Z [ \ ] ^ _ */
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, /* ` a b c d e f g */
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, /* h i j k l m n o */
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, /* p q r s t u v w */
|
|
|
+ 0, 0, 0, 1, 1, 1, 1, 0, /* x y z { | } ~ del */
|
|
|
+};
|
|
|
+
|
|
|
ulong
|
|
|
runetoksym(Rune r)
|
|
|
{
|
|
@@ -114,11 +133,22 @@ readkbd(Vnc *v)
|
|
|
keyevent(v, r+0x60, 1); /* 0x60: make capital letter */
|
|
|
keyevent(v, r+0x60, 0);
|
|
|
keyevent(v, Xctl, 0);
|
|
|
- } else {
|
|
|
+ }else{
|
|
|
+ /*
|
|
|
+ * to send an upper case letter or shifted
|
|
|
+ * punctuation, mac os x vnc server,
|
|
|
+ * at least, needs a `shift' sent first.
|
|
|
+ */
|
|
|
+ if(!shift && r == ks && r < sizeof shiftkey && shiftkey[r]){
|
|
|
+ shift = 1;
|
|
|
+ keyevent(v, Xshift, 1);
|
|
|
+ }
|
|
|
keyevent(v, ks, 1);
|
|
|
- keyevent(v, ks, 0); /* vmware does autorepeat,
|
|
|
- shut it up with an UP
|
|
|
- */
|
|
|
+ /*
|
|
|
+ * up event needed by vmware inside linux vnc server,
|
|
|
+ * perhaps others.
|
|
|
+ */
|
|
|
+ keyevent(v, ks, 0);
|
|
|
}
|
|
|
|
|
|
if(alt){
|