xpra icon
Bug tracker and wiki

Ticket #842: clipboard-html5-macos.patch

File clipboard-html5-macos.patch, 3.7 KB (added by Antoine Martin, 3 years ago)

PoC to fix the HTML5 clipboard synchronization with macos clients (tested with chrome)

  • html5/js/Client.js

     
    515515        //FIXME: look them up!
    516516        var alt = "mod1";
    517517        var meta = "mod1";
     518        var control = "control";
     519        //swap
     520        if (Utilities.isMacOS()) {
     521                meta = "control";
     522                control = "mod1";
     523                console.debug("macos!");
     524        }
     525        var new_modifiers = modifiers.slice();
     526        console.debug("original modifiers=", modifiers);
    518527        var index = modifiers.indexOf("alt");
    519528        if (index>=0)
    520                 modifiers[index] = alt;
     529                new_modifiers[index] = alt;
    521530        index = modifiers.indexOf("meta");
    522531        if (index>=0)
    523                 modifiers[index] = meta;
     532                new_modifiers[index] = meta;
     533        index = modifiers.indexOf("control");
     534        if (index>=0)
     535                new_modifiers[index] = control;
    524536        //show("get_modifiers() modifiers="+modifiers.toSource());
    525         return modifiers;
     537        console.debug("updated modifiers=", new_modifiers, "for meta=", meta, ", control=", control);
     538        return new_modifiers;
    526539}
    527540
    528541XpraClient.prototype._check_browser_language = function(key_layout) {
     
    577590        var keycode = event.which || event.keyCode;
    578591        var str = event.key || String.fromCharCode(keycode);
    579592
    580         if (this.debug) {
    581                 console.debug("processKeyEvent(", pressed, ", ", event, ") key=", keyname, "keycode=", keycode);
    582         }
     593        console.debug("processKeyEvent(", pressed, ", ", event, ") key=", keyname, "keycode=", keycode);
    583594
    584595        //sync numlock
    585596        if (keycode==144 && pressed) {
     
    621632                keyname = keyname.replace("_L", "_R")
    622633
    623634        var modifiers = this._keyb_get_modifiers(event);
     635        //TODO: translate modifiers here
    624636        if (this.caps_lock)
    625637                modifiers.push("lock");
    626638        if (this.num_lock && this.num_lock_mod)
     
    632644        if ((this.caps_lock && shift) || (!this.caps_lock && !shift))
    633645                str = str.toLowerCase();
    634646
     647        var ostr = str;
     648        if (Utilities.isMacOS()) {
     649                if (keyname=="Control_L") {
     650                        keyname = "Meta_L";
     651                        str = "meta";
     652                }
     653                else if (keyname=="Meta_L") {
     654                        keyname = "Control_L";
     655                        str = "control";
     656                }
     657                else if (keyname=="Control_R") {
     658                        keyname = "Meta_R";
     659                        str = "meta";
     660                }
     661                else if (keyname=="Meta_R") {
     662                        keyname = "Control_R";
     663                        str = "control";
     664                }
     665        }
     666
     667       
    635668        if (this.topwindow != null) {
    636669                //send via a timer so we get a chance to capture the clipboard value,
    637670                //before we send control-V to the server:
     671                console.debug("modifiers=", modifiers);
    638672                var packet = ["key-action", this.topwindow, keyname, pressed, modifiers, keyval, str, keycode, group];
    639673                var me = this;
    640674                setTimeout(function () {
    641                         //show("win="+win.toSource()+", keycode="+keycode+", modifiers=["+modifiers+"], str="+str);
     675                        console.debug("packet=", packet);
    642676                        me.send(packet);
    643677                        if (me.debug) {
    644678                                console.debug(packet);
    645679                        }
     680                        console.debug("pressed=", pressed, "MacOS=", Utilities.isMacOS(), "ostr=", ostr);
     681                        if (pressed && Utilities.isMacOS() && modifiers.indexOf("control")>=0 && ostr!="meta") {
     682                                //macos will swallow the key release event, so simulate one now:
     683                                packet = ["key-action", me.topwindow, keyname, false, modifiers, keyval, str, keycode, group];
     684                                me.send(packet);
     685                                console.debug("cancelling");
     686                        }
    646687                }, 0);
    647688        }
    648689        if (this.clipboard_enabled) {
     
    658699                        return true;
    659700                }
    660701                var control = modifiers.indexOf("control")>=0;
     702                var shift = modifiers.indexOf("shift")>=0;
    661703                if (control) {
    662704                        var l = keyname.toLowerCase();
    663                         if (control && (l=="c" || l=="x" || l=="v")) {
     705                        //(note: macos uses Control + Shift + V)
     706                        if (l=="c" || l=="x" || l=="v") {
    664707                                return true;
    665708                        }
    666709                }
    667710        }
    668         //this.log("keyname=", keyname, "modifiers=", modifiers);
     711        //console.debug("keyname=", keyname, "modifiers=", modifiers);
    669712        return false;
    670713}
    671714