4d51f6572b
Instead of having two times the check if the USB3 setting needs to be added to the config string it is now checked at one place only. If USB3 is checked for a non USB3 device it will be attached to the USB2 root hub of the xhci controller. Signed-off-by: Aaron Lauterer <a.lauterer@proxmox.com>
206 lines
4.5 KiB
JavaScript
206 lines
4.5 KiB
JavaScript
Ext.define('PVE.qemu.USBInputPanel', {
|
|
extend: 'Proxmox.panel.InputPanel',
|
|
mixins: ['Proxmox.Mixin.CBind' ],
|
|
|
|
autoComplete: false,
|
|
onlineHelp: 'qm_usb_passthrough',
|
|
|
|
controller: {
|
|
xclass: 'Ext.app.ViewController',
|
|
|
|
control: {
|
|
'field[name=usb]': {
|
|
change: function(field, newValue, oldValue) {
|
|
var hwidfield = this.lookupReference('hwid');
|
|
var portfield = this.lookupReference('port');
|
|
var usb3field = this.lookupReference('usb3');
|
|
if (field.inputValue === 'hostdevice') {
|
|
hwidfield.setDisabled(!newValue);
|
|
} else if(field.inputValue === 'port') {
|
|
portfield.setDisabled(!newValue);
|
|
} else if(field.inputValue === 'spice') {
|
|
usb3field.setDisabled(!newValue);
|
|
}
|
|
}
|
|
},
|
|
'pveUSBSelector': {
|
|
change: function(field, newValue, oldValue) {
|
|
var usbval = field.getUSBValue();
|
|
var usb3field = this.lookupReference('usb3');
|
|
var usb3 = /usb3/.test(usbval);
|
|
if(usb3 && !usb3field.isDisabled()) {
|
|
usb3field.savedVal = usb3field.getValue();
|
|
usb3field.setValue(true);
|
|
usb3field.setDisabled(true);
|
|
} else if(!usb3 && usb3field.isDisabled()){
|
|
var val = (usb3field.savedVal === undefined)?usb3field.originalValue:usb3field.savedVal;
|
|
usb3field.setValue(val);
|
|
usb3field.setDisabled(false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
setVMConfig: function(vmconfig) {
|
|
var me = this;
|
|
me.vmconfig = vmconfig;
|
|
},
|
|
|
|
onGetValues: function(values) {
|
|
var me = this;
|
|
if(!me.confid) {
|
|
var i;
|
|
for (i = 0; i < 6; i++) {
|
|
if (!me.vmconfig['usb' + i.toString()]) {
|
|
me.confid = 'usb' + i.toString();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
var val = "";
|
|
var type = me.down('radiofield').getGroupValue();
|
|
switch (type) {
|
|
case 'spice':
|
|
val = 'spice'; break;
|
|
case 'hostdevice':
|
|
case 'port':
|
|
val = me.down('pveUSBSelector[name=' + type + ']').getUSBValue();
|
|
break;
|
|
default:
|
|
throw "invalid type selected";
|
|
}
|
|
|
|
if (values.usb3) {
|
|
delete values.usb3;
|
|
val += ',usb3=1';
|
|
}
|
|
values[me.confid] = val;
|
|
return values;
|
|
},
|
|
|
|
items: [
|
|
{
|
|
xtype: 'fieldcontainer',
|
|
defaultType: 'radiofield',
|
|
items:[
|
|
{
|
|
name: 'usb',
|
|
inputValue: 'spice',
|
|
boxLabel: gettext('Spice Port'),
|
|
submitValue: false,
|
|
checked: true
|
|
},
|
|
{
|
|
name: 'usb',
|
|
inputValue: 'hostdevice',
|
|
boxLabel: gettext('Use USB Vendor/Device ID'),
|
|
submitValue: false
|
|
},
|
|
{
|
|
xtype: 'pveUSBSelector',
|
|
disabled: true,
|
|
type: 'device',
|
|
name: 'hostdevice',
|
|
cbind: { pveSelNode: '{pveSelNode}' },
|
|
editable: true,
|
|
reference: 'hwid',
|
|
allowBlank: false,
|
|
fieldLabel: 'Choose Device',
|
|
labelAlign: 'right',
|
|
submitValue: false
|
|
},
|
|
{
|
|
name: 'usb',
|
|
inputValue: 'port',
|
|
boxLabel: gettext('Use USB Port'),
|
|
submitValue: false
|
|
},
|
|
{
|
|
xtype: 'pveUSBSelector',
|
|
disabled: true,
|
|
name: 'port',
|
|
cbind: { pveSelNode: '{pveSelNode}' },
|
|
editable: true,
|
|
type: 'port',
|
|
reference: 'port',
|
|
allowBlank: false,
|
|
fieldLabel: gettext('Choose Port'),
|
|
labelAlign: 'right',
|
|
submitValue: false
|
|
},
|
|
{
|
|
xtype: 'checkbox',
|
|
name: 'usb3',
|
|
inputValue: true,
|
|
reference: 'usb3',
|
|
fieldLabel: gettext('Use USB3')
|
|
}
|
|
]
|
|
}
|
|
]
|
|
});
|
|
|
|
Ext.define('PVE.qemu.USBEdit', {
|
|
extend: 'Proxmox.window.Edit',
|
|
|
|
vmconfig: undefined,
|
|
|
|
isAdd: true,
|
|
|
|
subject: gettext('USB Device'),
|
|
|
|
|
|
initComponent : function() {
|
|
var me = this;
|
|
|
|
me.isCreate = !me.confid;
|
|
|
|
var ipanel = Ext.create('PVE.qemu.USBInputPanel', {
|
|
confid: me.confid,
|
|
pveSelNode: me.pveSelNode
|
|
});
|
|
|
|
Ext.apply(me, {
|
|
items: [ ipanel ]
|
|
});
|
|
|
|
me.callParent();
|
|
|
|
me.load({
|
|
success: function(response, options) {
|
|
ipanel.setVMConfig(response.result.data);
|
|
if (me.confid) {
|
|
var data = response.result.data[me.confid].split(',');
|
|
var port, hostdevice, usb3 = false;
|
|
var type = 'spice';
|
|
var i;
|
|
for (i = 0; i < data.length; i++) {
|
|
if (/^(host=)?(0x)?[a-zA-Z0-9]{4}\:(0x)?[a-zA-Z0-9]{4}$/.test(data[i])) {
|
|
hostdevice = data[i];
|
|
hostdevice = hostdevice.replace('host=', '').replace('0x','');
|
|
type = 'hostdevice';
|
|
} else if (/^(host=)?(\d+)\-(\d+(\.\d+)*)$/.test(data[i])) {
|
|
port = data[i];
|
|
port = port.replace('host=','');
|
|
type = 'port';
|
|
}
|
|
|
|
if (/^usb3=(1|on|true)$/.test(data[i])) {
|
|
usb3 = true;
|
|
}
|
|
}
|
|
var values = {
|
|
usb : type,
|
|
hostdevice: hostdevice,
|
|
port: port,
|
|
usb3: usb3
|
|
};
|
|
|
|
ipanel.setValues(values);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
});
|