<div dir="ltr"><div>Hi team,</div><div><br></div><div>Thank you for the development of X2go, I'm using Kdrive on the Windows client on a daily basis and very happy with it!</div><div>I am also using the HTML client but faced limitations with the keyboard that I could fix.</div><div>I made the changes directly on the compiled JS but it all happens in [x2gohtmlclient.git] / src / x2gokdrivehtmlclient.js</div><div><br></div><div>CapsLock and AltGr modifier keys were not effective. Fix:</div><div>@@ -1419,10 +1691,17 @@ X2GoKDriveHTMLClient<br>         {<br>             v32[1] |= Mod4Mask;<br>         }<br>+  if (e.getModifierState("AltGraph")) {<br>+              v32[1] |= Mod5Mask;<br>+  }<br>+    if (e.getModifierState("CapsLock")) {<br>+              v32[1] |= LockMask;<br>+        }<br></div><div> <br>       v32[2] = this.web2pc105(e.keyCode);<br> <br>//                console.log(v32[1], v32[2]);<br> <br>         e.preventDefault();<br>         e.stopPropagation();</div><div><br></div><div><br></div><div>Minor issue with parsing:</div><div>@@ -1249,7 +1249,7 @@ X2GoKDriveHTMLClient<br>             case 111 :<br>                 return  106; ///<br>             case 106 :<br>-                return  63; //*<br>+                return  63; // * (putting a space before * here, so that nano/gedit do not get confused with syntax highlighting)<br>             case 109 :<br>                 return  82; //-<br></div><div><br></div><div><br></div><div>FYI, since I'm using a French keyboard, I also created a new keymap, but this should probably be written differently and add a UI setting in the HTML to choose the keyboard mapping.<br></div><div>-        v32[2] = this.web2pc105(e.keyCode);<br>+        v32[2] = this.web2pc105fr(e.keyCode);</div><div><br></div><div>@@ -1312,6 +1312,273 @@ X2GoKDriveHTMLClient<br>         return nativeCode;<br>     }<br> <br>+    web2pc105fr(nativeCode)<br>+    {<br>+        switch (nativeCode)<br>+        {<br>+            //1st row<br>+            case 222:<br>+                return 49; // ²<br>+            case   49:<br>+                return 10; //1<br>+            case 50:<br>+                return 11; //2<br>+            case 51:<br>+                return 12; //3<br>+            case 52:<br>+                return 13; //4<br>+            case 53:<br>+                return 14; //5<br>+            case 54:<br>+                return 15; //6<br>+            case 55:<br>+                return 16; //7<br>+            case 56:<br>+                return 17; //8<br>+            case 57:<br>+                return 18; //9<br>+            case 48:<br>+                return 19; //0<br>+            case 169:<br>+                return 20; //°<br>+            case 61:<br>+                return 21; //+<br>+            case 8:<br>+                return 22; //BSP<br>+<br>+            //2 row<br>+            case 9 :<br>+                return 23; //TAB<br>+            case 65:<br>+                return 24; //a<br>+            case 90:<br>+                return 25; //z<br>+            case 69 :<br>+                return 26; //e<br>+            case 82 :<br>+                return 27; //r<br>+            case 84 :<br>+                return 28; //t<br>+            case 89:<br>+                return 29; //y<br>+            case 85:<br>+                return 30; //u<br>+            case 73:<br>+                return 31; //i<br>+            case 79:<br>+                return 32; //o<br>+            case 80:<br>+                return 33; //p<br>+            case 160:<br>+                return 34; //[<br>+            case 164:<br>+                return 35; //]<br>+            case  13:<br>+                return 36; //ENT<br>+<br>+            //3 row<br>+            case 20 :<br>+                return  66; //CAPS<br>+            case 81 :<br>+                return  38; //q<br>+            case 83 :<br>+                return  39; //s<br>+            case 68 :<br>+                return  40; //d<br>+            case 70 :<br>+                return  41; //f<br>+            case 71 :<br>+                return  42; //g<br>+            case 72 :<br>+                return  43; //h<br>+            case 74 :<br>+                return  44; //j<br>+            case 75 :<br>+                return  45; //k<br>+            case 76 :<br>+                return  46; //l<br>+            case 77 :<br>+                return  47; //m<br>+            case 165 :<br>+                return  48; //ù<br>+            case 170 :<br>+                return  51; // *<br>+<br>+            //4 row<br>+            case 16 :<br>+                return  50; //Shift Left<br>+            case 60 :<br>+                return  94; //<<br>+            case 87 :<br>+                return  52; //w<br>+            case 88 :<br>+                return  53; //x<br>+            case 67 :<br>+                return  54; //c<br>+            case 86 :<br>+                return  55; //v<br>+            case 66 :<br>+                return  56; //b<br>+            case 78 :<br>+                return  57; //n<br>+            case 188 :<br>+                return  58; //,<br>+            case 59 :<br>+                return  59; //;<br>+            case 58 :<br>+                return  60; //:<br>+            case 161 :<br>+                return  61; //!<br>+            case 16 :<br>+                return  62; //Shift Right<br>+<br>+<br>+            //5 row<br>+            case 17 :<br>+                return  37; //LCTRL<br>+            case 91 :<br>+                return  133; //LMETA<br>+            case 18 :<br>+                return  64; //LALT<br>+            case 32 :<br>+                return  65; //SPACE<br>+            case 18 :<br>+                return  108; //RALT<br>+//            case 92 :<br>+//                return  134; //RMETA<br>+//            case 93 :<br>+//                return  135; //MENU<br>+            case 17 :<br>+                return  105; //RCTRL<br>+<br>+<br>+            //specials<br>+            case 27 :<br>+                return  9; //ESC<br>+            case 112 :<br>+                return  67; //F1<br>+            case 113 :<br>+                return  68; //F2<br>+            case 114 :<br>+                return  69; //F3<br>+            case 115 :<br>+                return  70; //F4<br>+            case 116 :<br>+                return  71; //F5<br>+            case 117 :<br>+                return  72; //F6<br>+            case 118 :<br>+                return  73; //F7<br>+            case 119 :<br>+                return  74; //F8<br>+            case 120 :<br>+                return  75; //F9<br>+            case 121 :<br>+                return  76; //F10<br>+            case 122 :<br>+                return  95; //F11<br>+            case 123 :<br>+                return  96; //F12<br>+<br>+            case 44 :<br>+                return  107; //print<br>+//            case 145 :<br>+//                return  78; //scroll<br>+//            case 19 :<br>+//                return  127; //break<br>+<br>+            case 45 :<br>+                return  118; //ins<br>+            case 36 :<br>+                return  110; //home<br>+            case 33 :<br>+                return  112; //pgup<br>+            case 46 :<br>+                return  119; //del<br>+            case 35 :<br>+                return  115; //end<br>+            case 34 :<br>+                return  117; //pgdn<br>+<br>+            //arrows<br>+            case 38 :<br>+                return  111;<br>+            case 37 :<br>+                return 113;<br>+            case 40 :<br>+                return 116;<br>+            case 39 :<br>+                return 114;<br>+<br>+            //numlock<br>+            case 144 :<br>+                return  77; //NLCK<br>+            case 111 :<br>+                return  106; ///<br>+            case 106 :<br>+                return  63; // *<br>+            case 109 :<br>+                return  82; //-<br>+<br>+            case 36 :<br>+                return  79; //home<br>+            case 38 :<br>+                return  80; //up<br>+            case 33 :<br>+                return  81; //pgup<br>+            case 107 :<br>+                return  86; //+<br>+<br>+            case 37 :<br>+                return  83; //left<br>+            case 12 :<br>+                return  84; //clear<br>+            case 39 :<br>+                return  85; //right<br>+<br>+            case 35 :<br>+                return  87; //end<br>+            case 40 :<br>+                return  88; //dwn<br>+            case 34 :<br>+                return  89; //pgdn<br>+            case 13 :<br>+                return  104; //enter<br>+<br>+            case 45 :<br>+                return  90; //ins<br>+            case 46 :<br>+                return  91; //del<br>+<br>+            case 96 :<br>+                return  90; //0<br>+            case 97 :<br>+                return  87; //1<br>+            case 98 :<br>+                return  88; //2<br>+            case 99 :<br>+                return  89; //3<br>+            case 100 :<br>+                return  83; //4<br>+            case 101 :<br>+                return  84; //5<br>+            case 102 :<br>+                return  85; //6<br>+            case 103 :<br>+                return  79; //7<br>+            case 104 :<br>+                return  80; //8<br>+            case 105 :<br>+                return  81; //9<br>+<br>+            case 110 :<br>+                return  91; //.<br>+<br>+<br>+        }<br>+        return nativeCode;<br>+    }<br>+</div><div><br></div><div>Cheers!</div><div><br></div><div>DjZU<br></div><div><br></div></div>