diff --git a/emhttp/plugins/dynamix.docker.manager/DockerContainers.page b/emhttp/plugins/dynamix.docker.manager/DockerContainers.page index 1412b71ba..a5acf32ea 100644 --- a/emhttp/plugins/dynamix.docker.manager/DockerContainers.page +++ b/emhttp/plugins/dynamix.docker.manager/DockerContainers.page @@ -21,8 +21,8 @@ Nchan="docker_load:stop" isTopNavTheme() ? -58: -44; // $themeHelper set in DefaultPageLayout.php +$top = $themeHelper->isTopNavTheme() ? 40 : 20; $busy = " "._('Please wait')."... "._('starting up containers'); $cpus = cpu_list(); ?> @@ -82,7 +82,7 @@ function LockButton() { $('#resetsort').removeClass('nohand').addClass('hand'); $('i.mover').show(); $('#docker_list .sortable').css({'cursor':'move'}); - +isTopNavTheme()):?> $('div.nav-item.LockButton').find('a').prop('title',"_(Lock sortable items)_"); $('div.nav-item.LockButton').find('b').removeClass('icon-u-lock green-text').addClass('icon-u-lock-open red-text'); @@ -99,7 +99,7 @@ function LockButton() { $('#resetsort').removeClass('hand').addClass('nohand'); $('i.mover').hide(); $('#docker_list .sortable').css({'cursor':'default'}); - +isTopNavTheme()):?> $('div.nav-item.LockButton').find('a').prop('title',"_(Unlock sortable items)_"); $('div.nav-item.LockButton').find('b').removeClass('icon-u-lock-open red-text').addClass('icon-u-lock green-text'); diff --git a/emhttp/plugins/dynamix.docker.manager/DockerSettings.page b/emhttp/plugins/dynamix.docker.manager/DockerSettings.page index 0203a7f89..32844a089 100644 --- a/emhttp/plugins/dynamix.docker.manager/DockerSettings.page +++ b/emhttp/plugins/dynamix.docker.manager/DockerSettings.page @@ -123,7 +123,7 @@ function hide_eth($network) { return in_array($network,$mgmt_port) && lan_port('wlan0',true)==1; } -$bgcolor = strstr('white,azure',$display['theme']) ? '#f2f2f2' : '#1c1c1c'; +$bgcolor = $themeHelper->isLightTheme() ? '#f2f2f2' : '#1c1c1c'; // $themeHelper set in DefaultPageLayout.php //Check if docker.cfg does exist $no_dockercfg = !is_file('/boot/config/docker.cfg'); diff --git a/emhttp/plugins/dynamix.docker.manager/include/CreateDocker.php b/emhttp/plugins/dynamix.docker.manager/include/CreateDocker.php index c47c50b16..0e77a6cb4 100644 --- a/emhttp/plugins/dynamix.docker.manager/include/CreateDocker.php +++ b/emhttp/plugins/dynamix.docker.manager/include/CreateDocker.php @@ -318,7 +318,8 @@ $authoringMode = $dockercfg['DOCKER_AUTHORING_MODE'] == "yes" ? true : false; $authoring = $authoringMode ? 'advanced' : 'noshow'; $disableEdit = $authoringMode ? 'false' : 'true'; $showAdditionalInfo = ''; -$bgcolor = strstr('white,azure',$display['theme']) ? '#f2f2f2' : '#1c1c1c'; + +$bgcolor = $themeHelper->isLightTheme() ? '#f2f2f2' : '#1c1c1c'; // $themeHelper set in DefaultPageLayout.php # Search for existing TAILSCALE_ entries in the Docker template $TS_existing_vars = false; diff --git a/emhttp/plugins/dynamix.gui.search/gui_search.page b/emhttp/plugins/dynamix.gui.search/gui_search.page index 414ca96bd..bbf63aa72 100644 --- a/emhttp/plugins/dynamix.gui.search/gui_search.page +++ b/emhttp/plugins/dynamix.gui.search/gui_search.page @@ -32,7 +32,7 @@ var browserName = (function(agent){ })(window.navigator.userAgent.toLowerCase()); $(function(){ - +isSidebarTheme()):?> $('.nav-item.gui_search').hover(function(){gui_search();},function(e){closeSearchBox(e);}); $.post('/plugins/dynamix.gui.search/include/exec.php',function(data) { @@ -51,7 +51,7 @@ function setupGUIsearch() { window.addEventListener('keydown',function(e){ if (!e.shiftKey && !e.altKey && (navigator.appVersion.indexOf('Mac')==-1 ? e.ctrlKey : e.metaKey) && e.keyCode==75) { e.preventDefault(); - + isTopNavTheme()):?> if (guiSearchBoxSpan()) closeSearchBox(e); else gui_search(); } @@ -63,7 +63,7 @@ function setupGUIsearch() { } function gui_search() { - +isTopNavTheme()):?> languageVisible = $('.nav-item.LanguageButton').is(':visible'); $('.nav-tile.right').prepend("").css('overflow','visible'); $('.nav-item.util,.nav-user.show').hide(); @@ -86,7 +86,7 @@ function gui_search() { function closeSearchBox(e) { e.stopPropagation(); $('#guiSearchBoxSpan').remove(); - +isTopNavTheme()):?> $('.nav-tile.right').css({'overflow-x':'auto','overflow-y':'hidden'}); $('.nav-item.util,.nav-user.show').show(); if (!languageVisible) $('.nav-item.LanguageButton').hide(); diff --git a/emhttp/plugins/dynamix.plugin.manager/PluginInstall.page b/emhttp/plugins/dynamix.plugin.manager/PluginInstall.page index 93ca7a556..f3e30735c 100644 --- a/emhttp/plugins/dynamix.plugin.manager/PluginInstall.page +++ b/emhttp/plugins/dynamix.plugin.manager/PluginInstall.page @@ -15,36 +15,50 @@ Tag="download" */ ?> **_(Enter URL of remote plugin file or local plugin file)_**
- - + + +
:plugin_install_help: diff --git a/emhttp/plugins/dynamix.vm.manager/VMMachines.page b/emhttp/plugins/dynamix.vm.manager/VMMachines.page index 9e4ef09e2..9b465d814 100644 --- a/emhttp/plugins/dynamix.vm.manager/VMMachines.page +++ b/emhttp/plugins/dynamix.vm.manager/VMMachines.page @@ -20,15 +20,18 @@ Markdown="false" getThemeName(); $cpus = cpu_list(); -$hover = in_array($theme,['white','azure']) ? 'rgba(0,0,0,0.1)' : 'rgba(255,255,255,0.1)'; -$bgcolor = in_array($theme,['white','azure']) ? '#f2f2f2' : '#1c1c1c'; -$fgcolor = in_array($theme,['white','azure']) ? '#1c1c1c' : '#f2f2f2'; -$incolor = $theme!='gray' ? $bgcolor : '#121510'; +$hover = $themeHelper->isLightTheme() ? 'rgba(0,0,0,0.1)' : 'rgba(255,255,255,0.1)'; +$bgcolor = $themeHelper->isLightTheme() ? '#f2f2f2' : '#1c1c1c'; +$fgcolor = $themeHelper->isLightTheme() ? '#1c1c1c' : '#f2f2f2'; +$incolor = $themeName !== 'gray' ? $bgcolor : '#121510'; function showCPUs($uuid) { - global $cpus; + global $cpus,$is_intel_cpu,$core_types; $vm = domain_to_config($uuid); $vcpu = $vm['domain']['vcpu']; $nopining = ""; @@ -38,12 +41,13 @@ function showCPUs($uuid) { unset($cpu1,$cpu2); [$cpu1, $cpu2] = my_preg_split('/[,-]/',$pair); $check = ($vcpu && in_array($cpu1, $vcpu)) ? 'fa-circle orange-text':'fa-circle-o'; + if ($is_intel_cpu && count($core_types) > 0) $core_type = "$core_types[$cpu1]"; else $core_type = ""; if (!$cpu2) { - echo ""; + echo ""; } else { - echo ""; + echo ""; $check = ($vcpu && in_array($cpu2, $vcpu)) ? 'fa-circle orange-text':'fa-circle-o'; - echo ""; + echo ""; } } echo "
vCPUs: {$vm['domain']['vcpus']} $nopining"; @@ -403,7 +407,7 @@ function LockButton() { $('#resetsort').removeClass('nohand').addClass('hand'); $('i.mover').show(); $('#kvm_list .sortable').css({'cursor':'move'}); - +isTopNavTheme()):?> $('div.nav-item.LockButton a').prop('title',"_(Lock sortable items)_"); $('div.nav-item.LockButton b').removeClass('icon-u-lock green-text').addClass('icon-u-lock-open red-text'); @@ -426,7 +430,7 @@ function LockButton() { $('#resetsort').removeClass('hand').addClass('nohand'); $('i.mover').hide(); $('#kvm_list .sortable').css({'cursor':'default'}); - +isTopNavTheme()):?> $('div.nav-item.LockButton a').prop('title',"_(Unlock sortable items)_"); $('div.nav-item.LockButton b').removeClass('icon-u-lock-open red-text').addClass('icon-u-lock green-text'); diff --git a/emhttp/plugins/dynamix.vm.manager/VMSettings.page b/emhttp/plugins/dynamix.vm.manager/VMSettings.page index 114aed13b..01b809ba1 100644 --- a/emhttp/plugins/dynamix.vm.manager/VMSettings.page +++ b/emhttp/plugins/dynamix.vm.manager/VMSettings.page @@ -92,7 +92,7 @@ if (is_file('/boot/syslinux/syslinux.cfg')) { $arrValidNetworks = getValidNetworks(); $pcie_acs_override = detect($bootcfg, $bootenv, 'pcie_acs_override'); $vfio_allow_unsafe = detect($bootcfg, $bootenv, 'allow_unsafe_interrupts'); -$bgcolor = strstr('white,azure',$display['theme']) ? '#f2f2f2' : '#1c1c1c'; +$bgcolor = $themeHelper->isLightTheme() ? '#f2f2f2' : '#1c1c1c'; // $themeHelper set in DefaultPageLayout.php $started = $var['fsState']=='Started'; $libvirt_up = $libvirt_running=='yes'; $libvirt_log = file_exists("/var/log/libvirt/libvirtd.log"); diff --git a/emhttp/plugins/dynamix.vm.manager/include/VMMachines.php b/emhttp/plugins/dynamix.vm.manager/include/VMMachines.php index 549fdb9f0..f1e9bcb3b 100644 --- a/emhttp/plugins/dynamix.vm.manager/include/VMMachines.php +++ b/emhttp/plugins/dynamix.vm.manager/include/VMMachines.php @@ -39,6 +39,7 @@ $i = 0; $kvm = ['var kvm=[];']; $show = explode(',',unscript(_var($_GET,'show'))); $path = _var($domain_cfg,'MEDIADIR'); +$pci_device_changes = comparePCIData(); foreach ($vms as $vm) { $res = $lv->get_domain_by_name($vm); @@ -52,6 +53,11 @@ foreach ($vms as $vm) { $image = substr($icon,-4)=='.png' ? "" : (substr($icon,0,5)=='icon-' ? "" : ""); $arrConfig = domain_to_config($uuid); $snapshots = getvmsnapshots($vm) ; + $vmpciids = $lv->domain_get_vm_pciids($vm); + $pcierror = false; + foreach($vmpciids as $pciid => $pcidetail) { + if (isset($pci_device_changes["0000:".$pciid])) $pcierror = true; + } $cdroms = $lv->get_cdrom_stats($res,true,true) ; if ($state == 'running') { $mem = $dom['memory']/1024; @@ -117,7 +123,7 @@ foreach ($vms as $vm) { unset($dom); if (!isset($domain_cfg["CONSOLE"])) $vmrcconsole = "web" ; else $vmrcconsole = $domain_cfg["CONSOLE"] ; if (!isset($domain_cfg["RDPOPT"])) $vmrcconsole .= ";no" ; else $vmrcconsole .= ";".$domain_cfg["RDPOPT"] ; - $menu = sprintf("onclick=\"addVMContext('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s', '%s')\"", addslashes($vm),addslashes($uuid),addslashes($template),$state,addslashes($vmrcurl),strtoupper($vmrcprotocol),addslashes($log),addslashes($fstype), $vmrcconsole,false,addslashes(str_replace('"',"'",$WebUI))); + $menu = sprintf("onclick=\"addVMContext('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s', '%s', %s)\"", addslashes($vm),addslashes($uuid),addslashes($template),$state,addslashes($vmrcurl),strtoupper($vmrcprotocol),addslashes($log),addslashes($fstype), $vmrcconsole,false,addslashes(str_replace('"',"'",$WebUI)),$pcierror); $kvm[] = "kvm.push({id:'$uuid',state:'$state'});"; switch ($state) { case 'running': @@ -196,7 +202,10 @@ foreach ($vms as $vm) { $title = _('Select ISO image'); $cdstr = $cdromcount." / 2"; echo ""; - echo "$image$vm
"._($status)."
"; + echo "$image"; + echo "$vm"; + if ($pcierror) echo ""; + echo "
"._($status)."
"; echo "$desc"; echo "$vcpu"; echo "$mem"; diff --git a/emhttp/plugins/dynamix.vm.manager/include/VMedit.php b/emhttp/plugins/dynamix.vm.manager/include/VMedit.php index 5d95904ba..e122b051d 100644 --- a/emhttp/plugins/dynamix.vm.manager/include/VMedit.php +++ b/emhttp/plugins/dynamix.vm.manager/include/VMedit.php @@ -22,7 +22,7 @@ if (substr($_SERVER['REQUEST_URI'],0,4) != '/VMs') { require_once "$docroot/webGui/include/Translations.php"; } -switch ($display['theme']) { +switch ($themeHelper->getThemeName()) { // $themeHelper set in DefaultPageLayout.php case 'gray' : $bgcolor = '#121510'; $border = '#606e7f'; $top = -44; break; case 'azure': $bgcolor = '#edeaef'; $border = '#606e7f'; $top = -44; break; case 'black': $bgcolor = '#212121'; $border = '#2b2b2b'; $top = -64; break; diff --git a/emhttp/plugins/dynamix.vm.manager/include/libvirt.php b/emhttp/plugins/dynamix.vm.manager/include/libvirt.php index 69f77f5c5..f46d829ca 100644 --- a/emhttp/plugins/dynamix.vm.manager/include/libvirt.php +++ b/emhttp/plugins/dynamix.vm.manager/include/libvirt.php @@ -839,6 +839,7 @@ class Libvirt { } } $audiodevs_used=[]; + $soundcards = ""; if (!empty($audios)) { foreach ($audios as $i => $audio) { $strSpecialAddressAudio = ""; @@ -847,21 +848,28 @@ class Libvirt { continue; } [$audio_bus, $audio_slot, $audio_function] = my_explode(":", str_replace('.', ':', $audio['id']), 3); - if ($audio_function != 0) { - if (isset($multidevices[$audio_bus])) { - $newaudio_bus = $multidevices[$audio_bus]; - if ($machine_type == "pc") $newaudio_slot = "0x01"; else $newaudio_slot = "0x00"; - $strSpecialAddressAudio = "
"; + if ($audio_bus == "virtual") + { + $soundcards .= " + + "; + } else { + if ($audio_function != 0) { + if (isset($multidevices[$audio_bus])) { + $newaudio_bus = $multidevices[$audio_bus]; + if ($machine_type == "pc") $newaudio_slot = "0x01"; else $newaudio_slot = "0x00"; + $strSpecialAddressAudio = "
"; + } } + $pcidevs .= " + + +
+ + $strSpecialAddressAudio + "; + $audiodevs_used[] = $audio['id']; } - $pcidevs .= " - - -
- - $strSpecialAddressAudio - "; - $audiodevs_used[] = $audio['id']; } } $pcidevs_used=[]; @@ -951,6 +959,7 @@ class Libvirt { $vmrc $scsicontroller + $soundcards $pcidevs $usbstr @@ -2257,6 +2266,35 @@ class Libvirt { return ['pci' => $devs_pci, 'usb' => $devs_usb]; } + function domain_get_sound_cards($domain) { + $soundcardslist = []; + $strDOMXML = $this->domain_get_xml($domain); + $xmldoc = new DOMDocument(); + $xmldoc->loadXML($strDOMXML); + $xpath = new DOMXPath($xmldoc); + $objNodes = $xpath->query('//domain/devices/sound'); + if ($objNodes->length > 0) { + foreach ($objNodes as $objNode) { + $soundcardslist[] = [ + 'model' => $xpath->query('@model', $objNode)->Item(0)->nodeValue + ]; + } + } + return $soundcardslist; + } + + function domain_get_vm_pciids($domain) { + $hostdevs=$this->domain_get_host_devices_pci($domain); + $vmpcidevs=[]; + foreach($hostdevs as $key => $dev) { + $vmpcidevs[$dev['id']] = [ + 'vendor_id' => ltrim($dev['vendor_id'] ?? "", '0x'), + 'device_id' => ltrim($dev['product_id'] ?? "", '0x'), + ]; + } + return $vmpcidevs; + } + function get_nic_info($domain) { $macs = $this->get_xpath($domain, "//domain/devices/interface/mac/@address", false); if (!$macs) return $this->_set_last_error(); diff --git a/emhttp/plugins/dynamix.vm.manager/include/libvirt_helpers.php b/emhttp/plugins/dynamix.vm.manager/include/libvirt_helpers.php index e5b7be2eb..35461b16a 100644 --- a/emhttp/plugins/dynamix.vm.manager/include/libvirt_helpers.php +++ b/emhttp/plugins/dynamix.vm.manager/include/libvirt_helpers.php @@ -971,6 +971,21 @@ class Array2XML { return $arrValidAudioDevices; } + function getValidSoundCards() { + $arrValidSoundCards = [ + 'ich6' => ['name' => 'ich6','id' => 'virtual::ich6'], + 'ich7' => ['name' => 'ich7','id' => 'virtual::ich7'], + 'ich9' => ['name' => 'ich9','id' => 'virtual::ich9'], + 'ac97' => ['name' => 'ac97','id' => 'virtual::ac97'], + 'es1370' => ['name' => 'es1370','id' => 'virtual::es1370'], + 'pcspk' => ['name' => 'pcspk','id' => 'virtual::pcspk'], + 'sb16' => ['name' => 'sb16','id' => 'virtual::sb16'], + 'usb' => ['name' => 'usb','id' => 'virtual::usb'], + 'virtio' => ['name' => 'virtio','id' => 'virtual::virtio'], + ]; + return $arrValidSoundCards; + } + function getValidOtherDevices() { $arrValidPCIDevices = getValidPCIDevices(); @@ -1277,6 +1292,7 @@ class Array2XML { $arrNICs = $lv->get_nic_info($res); $arrHostDevs = $lv->domain_get_host_devices_pci($res); $arrUSBDevs = $lv->domain_get_host_devices_usb($res); + $arrSoundCards = $lv->domain_get_sound_cards($res); $getcopypaste=getcopypaste($res); // Metadata Parsing @@ -1348,6 +1364,10 @@ class Array2XML { ]; } + if (!empty($arrSoundCards)) { + foreach ($arrSoundCards as $sckey => $soundcard) $arrAudioDevices[] = ['id' => "virtual::".$soundcard['model']]; + } + // Add claimed USB devices by this VM to the available USB devices /* foreach($arrUSBDevs as $arrUSB) { @@ -1532,6 +1552,7 @@ class Array2XML { unset($old['devices']['input']); // preserve vnc/spice port settings // unset($new['devices']['graphics']['@attributes']['port'],$new['devices']['graphics']['@attributes']['autoport']); + unset($old['devices']['sound']); unset($old['devices']['graphics']); if (!isset($new['devices']['graphics']['@attributes']['keymap']) && isset($old['devices']['graphics']['@attributes']['keymap'])) unset($old['devices']['graphics']['@attributes']['keymap']); // update parent arrays diff --git a/emhttp/plugins/dynamix.vm.manager/javascript/vmmanager.js b/emhttp/plugins/dynamix.vm.manager/javascript/vmmanager.js index e7899cb32..71431b8ff 100644 --- a/emhttp/plugins/dynamix.vm.manager/javascript/vmmanager.js +++ b/emhttp/plugins/dynamix.vm.manager/javascript/vmmanager.js @@ -83,7 +83,7 @@ function ajaxVMDispatchWebUI(params, spin){ } },'json'); } -function addVMContext(name, uuid, template, state, vmrcurl, vmrcprotocol, log, fstype="QEMU",consolein="web;no",usage=false,webui=""){ +function addVMContext(name, uuid, template, state, vmrcurl, vmrcprotocol, log, fstype="QEMU",consolein="web;no",usage=false,webui="",pcierror=false){ var opts = []; var path = location.pathname; var x = path.indexOf("?"); @@ -172,22 +172,28 @@ function addVMContext(name, uuid, template, state, vmrcurl, vmrcprotocol, log, f ajaxVMDispatch({action:"domain-destroy", uuid:uuid}, "loadlist"); }}); } else { - opts.push({text:_("Start"), icon:"fa-play", action:function(e) { - e.preventDefault(); - ajaxVMDispatch({action:"domain-start", uuid:uuid}, "loadlist"); - }}); - if (vmrcprotocol == "VNC" || vmrcprotocol == "SPICE") { - if (console == "web" || console == "both") { - opts.push({text:_("Start with console")+ " (" + vmrcprotocol + ")" , icon:"fa-play", action:function(e) { - e.preventDefault(); - ajaxVMDispatchconsole({action:"domain-start-console", uuid:uuid, vmrcurl:vmrcurl}, "loadlist") ; - }});} - if (console == "remote" || console == "both") { - opts.push({text:_("Start with remote-viewer")+ " (" + vmrcprotocol + ")" , icon:"fa-play", action:function(e) { - e.preventDefault(); - ajaxVMDispatchconsoleRV({action:"domain-start-consoleRV", uuid:uuid, vmrcurl:vmrcurl}, "loadlist") ; - }}); + if (!pcierror) { + opts.push({text:_("Start"), icon:"fa-play", action:function(e) { + e.preventDefault(); + ajaxVMDispatch({action:"domain-start", uuid:uuid}, "loadlist"); + }}); + if (vmrcprotocol == "VNC" || vmrcprotocol == "SPICE") { + if (console == "web" || console == "both") { + opts.push({text:_("Start with console")+ " (" + vmrcprotocol + ")" , icon:"fa-play", action:function(e) { + e.preventDefault(); + ajaxVMDispatchconsole({action:"domain-start-console", uuid:uuid, vmrcurl:vmrcurl}, "loadlist") ; + }});} + if (console == "remote" || console == "both") { + opts.push({text:_("Start with remote-viewer")+ " (" + vmrcprotocol + ")" , icon:"fa-play", action:function(e) { + e.preventDefault(); + ajaxVMDispatchconsoleRV({action:"domain-start-consoleRV", uuid:uuid, vmrcurl:vmrcurl}, "loadlist") ; + }}); + } } + } else { + opts.push({text:_("Start disabled due to PCI Changes"), icon:"fa fa-minus-circle orb red-orb", action:function(e) { + e.preventDefault(); + }}); } } opts.push({divider:true}); diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/.github/ISSUE_TEMPLATE/bug_report.md b/emhttp/plugins/dynamix.vm.manager/novnc/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..1b377d569 --- /dev/null +++ b/emhttp/plugins/dynamix.vm.manager/novnc/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,34 @@ +--- +name: Bug report +about: Create a report to help us improve + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Client (please complete the following information):** + - OS: [e.g. iOS] + - Browser: [e.g. chrome, safari] + - Browser version: [e.g. 22] + +**Server (please complete the following information):** + - noVNC version: [e.g. 1.0.0 or git commit id] + - VNC server: [e.g. QEMU, TigerVNC] + - WebSocket proxy: [e.g. websockify] + +**Additional context** +Add any other context about the problem here. diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/.github/ISSUE_TEMPLATE/config.yml b/emhttp/plugins/dynamix.vm.manager/novnc/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..cbd35aa75 --- /dev/null +++ b/emhttp/plugins/dynamix.vm.manager/novnc/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Question or discussion + url: https://groups.google.com/forum/?fromgroups#!forum/novnc + about: Ask a question or start a discussion diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/.github/ISSUE_TEMPLATE/feature_request.md b/emhttp/plugins/dynamix.vm.manager/novnc/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..066b2d920 --- /dev/null +++ b/emhttp/plugins/dynamix.vm.manager/novnc/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,17 @@ +--- +name: Feature request +about: Suggest an idea for this project + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/.github/workflows/deploy.yml b/emhttp/plugins/dynamix.vm.manager/novnc/.github/workflows/deploy.yml new file mode 100644 index 000000000..a11d3d0a5 --- /dev/null +++ b/emhttp/plugins/dynamix.vm.manager/novnc/.github/workflows/deploy.yml @@ -0,0 +1,97 @@ +name: Publish + +on: + push: + pull_request: + release: + types: [published] + +jobs: + npm: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: | + GITREV=$(git rev-parse --short HEAD) + echo $GITREV + sed -i "s/^\(.*\"version\".*\)\"\([^\"]\+\)\"\(.*\)\$/\1\"\2-g$GITREV\"\3/" package.json + if: github.event_name != 'release' + - uses: actions/setup-node@v4 + with: + # Needs to be explicitly specified for auth to work + registry-url: 'https://registry.npmjs.org' + - run: npm install + - uses: actions/upload-artifact@v4 + with: + name: npm + path: lib + - run: npm publish --access public + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + if: | + github.repository == 'novnc/noVNC' && + github.event_name == 'release' && + !github.event.release.prerelease + - run: npm publish --access public --tag beta + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + if: | + github.repository == 'novnc/noVNC' && + github.event_name == 'release' && + github.event.release.prerelease + - run: npm publish --access public --tag dev + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + if: | + github.repository == 'novnc/noVNC' && + github.event_name == 'push' && + github.event.ref == 'refs/heads/master' + snap: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: | + GITREV=$(git rev-parse --short HEAD) + echo $GITREV + sed -i "s/^\(.*\"version\".*\)\"\([^\"]\+\)\"\(.*\)\$/\1\"\2-g$GITREV\"\3/" package.json + if: github.event_name != 'release' + - run: | + VERSION=$(grep '"version"' package.json | cut -d '"' -f 4) + echo $VERSION + sed -i "s/^version:.*/version: '$VERSION'/" snap/snapcraft.yaml + - uses: snapcore/action-build@v1 + id: snapcraft + - uses: actions/upload-artifact@v4 + with: + name: snap + path: ${{ steps.snapcraft.outputs.snap }} + - uses: snapcore/action-publish@v1 + with: + snap: ${{ steps.snapcraft.outputs.snap }} + release: stable + env: + SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_LOGIN }} + if: | + github.repository == 'novnc/noVNC' && + github.event_name == 'release' && + !github.event.release.prerelease + - uses: snapcore/action-publish@v1 + with: + snap: ${{ steps.snapcraft.outputs.snap }} + release: beta + env: + SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_LOGIN }} + if: | + github.repository == 'novnc/noVNC' && + github.event_name == 'release' && + github.event.release.prerelease + - uses: snapcore/action-publish@v1 + with: + snap: ${{ steps.snapcraft.outputs.snap }} + release: edge + env: + SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_LOGIN }} + if: | + github.repository == 'novnc/noVNC' && + github.event_name == 'push' && + github.event.ref == 'refs/heads/master' diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/.github/workflows/lint.yml b/emhttp/plugins/dynamix.vm.manager/novnc/.github/workflows/lint.yml new file mode 100644 index 000000000..540bb9907 --- /dev/null +++ b/emhttp/plugins/dynamix.vm.manager/novnc/.github/workflows/lint.yml @@ -0,0 +1,19 @@ +name: Lint + +on: [push, pull_request] + +jobs: + eslint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + - run: npm update + - run: npm run lint + html: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + - run: npm update + - run: git ls-tree --name-only -r HEAD | grep -E "[.](html|css)$" | xargs ./utils/validate diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/.github/workflows/test.yml b/emhttp/plugins/dynamix.vm.manager/novnc/.github/workflows/test.yml new file mode 100644 index 000000000..b72195b52 --- /dev/null +++ b/emhttp/plugins/dynamix.vm.manager/novnc/.github/workflows/test.yml @@ -0,0 +1,28 @@ +name: Test + +on: [push, pull_request] + +jobs: + test: + strategy: + matrix: + os: + - ubuntu-latest + - windows-latest + browser: + - ChromeHeadless + - FirefoxHeadless + include: + - os: macos-latest + browser: Safari + - os: windows-latest + browser: EdgeHeadless + fail-fast: false + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + - run: npm update + - run: npm run test + env: + TEST_BROWSER_NAME: ${{ matrix.browser }} diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/.github/workflows/translate.yml b/emhttp/plugins/dynamix.vm.manager/novnc/.github/workflows/translate.yml new file mode 100644 index 000000000..a4da9cbfa --- /dev/null +++ b/emhttp/plugins/dynamix.vm.manager/novnc/.github/workflows/translate.yml @@ -0,0 +1,15 @@ +name: Translate + +on: [push, pull_request] + +jobs: + translate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + - run: npm update + - run: sudo apt-get install gettext + - run: make -C po update-pot + - run: make -C po update-po + - run: make -C po update-js diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/.gitignore b/emhttp/plugins/dynamix.vm.manager/novnc/.gitignore new file mode 100644 index 000000000..c178dbab4 --- /dev/null +++ b/emhttp/plugins/dynamix.vm.manager/novnc/.gitignore @@ -0,0 +1,12 @@ +*.pyc +*.o +tests/data_*.js +utils/rebind.so +utils/websockify +/node_modules +/build +/lib +recordings +*.swp +*~ +noVNC-*.tgz diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/.gitmodules b/emhttp/plugins/dynamix.vm.manager/novnc/.gitmodules new file mode 100644 index 000000000..e69de29bb diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/LICENSE.txt b/emhttp/plugins/dynamix.vm.manager/novnc/LICENSE.txt new file mode 100644 index 000000000..0581c11ed --- /dev/null +++ b/emhttp/plugins/dynamix.vm.manager/novnc/LICENSE.txt @@ -0,0 +1,62 @@ +noVNC is Copyright (C) 2022 The noVNC authors +(./AUTHORS) + +The noVNC core library files are licensed under the MPL 2.0 (Mozilla +Public License 2.0). The noVNC core library is composed of the +Javascript code necessary for full noVNC operation. This includes (but +is not limited to): + + core/**/*.js + app/*.js + test/playback.js + +The HTML, CSS, font and images files that included with the noVNC +source distibution (or repository) are not considered part of the +noVNC core library and are licensed under more permissive licenses. +The intent is to allow easy integration of noVNC into existing web +sites and web applications. + +The HTML, CSS, font and image files are licensed as follows: + + *.html : 2-Clause BSD license + + app/styles/*.css : 2-Clause BSD license + + app/styles/Orbitron* : SIL Open Font License 1.1 + (Copyright 2009 Matt McInerney) + + app/images/ : Creative Commons Attribution-ShareAlike + http://creativecommons.org/licenses/by-sa/3.0/ + +Some portions of noVNC are copyright to their individual authors. +Please refer to the individual source files and/or to the noVNC commit +history: https://github.com/novnc/noVNC/commits/master + +The are several files and projects that have been incorporated into +the noVNC core library. Here is a list of those files and the original +licenses (all MPL 2.0 compatible): + + core/base64.js : MPL 2.0 + + core/des.js : Various BSD style licenses + + vendor/pako/ : MIT + +Any other files not mentioned above are typically marked with +a copyright/license header at the top of the file. The default noVNC +license is MPL-2.0. + +The following license texts are included: + + docs/LICENSE.MPL-2.0 + docs/LICENSE.OFL-1.1 + docs/LICENSE.BSD-3-Clause (New BSD) + docs/LICENSE.BSD-2-Clause (Simplified BSD / FreeBSD) + vendor/pako/LICENSE (MIT) + +Or alternatively the license texts may be found here: + + http://www.mozilla.org/MPL/2.0/ + http://scripts.sil.org/OFL + http://en.wikipedia.org/wiki/BSD_licenses + https://opensource.org/licenses/MIT diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/error-handler.js b/emhttp/plugins/dynamix.vm.manager/novnc/app/error-handler.js index 67b63720c..5f6ffb674 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/error-handler.js +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/error-handler.js @@ -1,6 +1,6 @@ /* * noVNC: HTML5 VNC client - * Copyright (C) 2019 The noVNC Authors + * Copyright (C) 2019 The noVNC authors * Licensed under MPL 2.0 (see LICENSE.txt) * * See README.md for usage and integration instructions. diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/cs.json b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/cs.json index 589145ef3..dd31e6c18 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/cs.json +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/cs.json @@ -14,7 +14,7 @@ "Password is required": "Je vyžadováno heslo", "noVNC encountered an error:": "noVNC narazilo na chybu:", "Hide/Show the control bar": "Skrýt/zobrazit ovládací panel", - "Move/Drag Viewport": "Přesunout/přetáhnout výřez", + "Move/Drag viewport": "Přesunout/přetáhnout výřez", "viewport drag": "přesun výřezu", "Active Mouse Button": "Aktivní tlačítka myši", "No mousebutton": "Žádné", @@ -22,9 +22,9 @@ "Middle mousebutton": "Prostřední tlačítko myši", "Right mousebutton": "Pravé tlačítko myši", "Keyboard": "Klávesnice", - "Show Keyboard": "Zobrazit klávesnici", + "Show keyboard": "Zobrazit klávesnici", "Extra keys": "Extra klávesy", - "Show Extra Keys": "Zobrazit extra klávesy", + "Show extra keys": "Zobrazit extra klávesy", "Ctrl": "Ctrl", "Toggle Ctrl": "Přepnout Ctrl", "Alt": "Alt", @@ -45,13 +45,13 @@ "Clear": "Vymazat", "Fullscreen": "Celá obrazovka", "Settings": "Nastavení", - "Shared Mode": "Sdílený režim", - "View Only": "Pouze prohlížení", - "Clip to Window": "Přizpůsobit oknu", - "Scaling Mode:": "Přizpůsobení velikosti", + "Shared mode": "Sdílený režim", + "View only": "Pouze prohlížení", + "Clip to window": "Přizpůsobit oknu", + "Scaling mode:": "Přizpůsobení velikosti", "None": "Žádné", - "Local Scaling": "Místní", - "Remote Resizing": "Vzdálené", + "Local scaling": "Místní", + "Remote resizing": "Vzdálené", "Advanced": "Pokročilé", "Repeater ID:": "ID opakovače", "WebSocket": "WebSocket", @@ -59,9 +59,9 @@ "Host:": "Hostitel:", "Port:": "Port:", "Path:": "Cesta", - "Automatic Reconnect": "Automatická obnova připojení", - "Reconnect Delay (ms):": "Zpoždění připojení (ms)", - "Show Dot when No Cursor": "Tečka místo chybějícího kurzoru myši", + "Automatic reconnect": "Automatická obnova připojení", + "Reconnect delay (ms):": "Zpoždění připojení (ms)", + "Show dot when no cursor": "Tečka místo chybějícího kurzoru myši", "Logging:": "Logování:", "Disconnect": "Odpojit", "Connect": "Připojit", diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/de.json b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/de.json index 62e73360f..fa1546377 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/de.json +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/de.json @@ -13,7 +13,7 @@ "Password is required": "Passwort ist erforderlich", "noVNC encountered an error:": "Ein Fehler ist aufgetreten:", "Hide/Show the control bar": "Kontrollleiste verstecken/anzeigen", - "Move/Drag Viewport": "Ansichtsfenster verschieben/ziehen", + "Move/Drag viewport": "Ansichtsfenster verschieben/ziehen", "viewport drag": "Ansichtsfenster ziehen", "Active Mouse Button": "Aktive Maustaste", "No mousebutton": "Keine Maustaste", @@ -21,9 +21,9 @@ "Middle mousebutton": "Mittlere Maustaste", "Right mousebutton": "Rechte Maustaste", "Keyboard": "Tastatur", - "Show Keyboard": "Tastatur anzeigen", + "Show keyboard": "Tastatur anzeigen", "Extra keys": "Zusatztasten", - "Show Extra Keys": "Zusatztasten anzeigen", + "Show extra keys": "Zusatztasten anzeigen", "Ctrl": "Strg", "Toggle Ctrl": "Strg umschalten", "Alt": "Alt", @@ -44,13 +44,13 @@ "Clear": "Löschen", "Fullscreen": "Vollbild", "Settings": "Einstellungen", - "Shared Mode": "Geteilter Modus", - "View Only": "Nur betrachten", - "Clip to Window": "Auf Fenster begrenzen", - "Scaling Mode:": "Skalierungsmodus:", + "Shared mode": "Geteilter Modus", + "View only": "Nur betrachten", + "Clip to window": "Auf Fenster begrenzen", + "Scaling mode:": "Skalierungsmodus:", "None": "Keiner", - "Local Scaling": "Lokales skalieren", - "Remote Resizing": "Serverseitiges skalieren", + "Local scaling": "Lokales skalieren", + "Remote resizing": "Serverseitiges skalieren", "Advanced": "Erweitert", "Repeater ID:": "Repeater ID:", "WebSocket": "WebSocket", @@ -58,12 +58,17 @@ "Host:": "Server:", "Port:": "Port:", "Path:": "Pfad:", - "Automatic Reconnect": "Automatisch wiederverbinden", - "Reconnect Delay (ms):": "Wiederverbindungsverzögerung (ms):", + "Automatic reconnect": "Automatisch wiederverbinden", + "Reconnect delay (ms):": "Wiederverbindungsverzögerung (ms):", "Logging:": "Protokollierung:", "Disconnect": "Verbindung trennen", "Connect": "Verbinden", "Password:": "Passwort:", "Cancel": "Abbrechen", - "Canvas not supported.": "Canvas nicht unterstützt." + "Canvas not supported.": "Canvas nicht unterstützt.", + "Disconnect timeout": "Zeitüberschreitung beim Trennen", + "Local Downscaling": "Lokales herunterskalieren", + "Local Cursor": "Lokaler Mauszeiger", + "Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "'Clipping-Modus' aktiviert, Scrollbalken in 'IE-Vollbildmodus' werden nicht unterstützt", + "True Color": "True Color" } \ No newline at end of file diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/el.json b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/el.json index 4df3e03c4..57d67316c 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/el.json +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/el.json @@ -41,6 +41,7 @@ "Reset": "Επαναφορά", "Clipboard": "Πρόχειρο", "Edit clipboard content in the textarea below.": "Επεξεργαστείτε το περιεχόμενο του πρόχειρου στην περιοχή κειμένου παρακάτω.", + "Full Screen": "Πλήρης Οθόνη", "Settings": "Ρυθμίσεις", "Shared Mode": "Κοινόχρηστη Λειτουργία", "View Only": "Μόνο Θέαση", @@ -75,5 +76,25 @@ "Username:": "Κωδικός Χρήστη:", "Password:": "Κωδικός Πρόσβασης:", "Send Credentials": "Αποστολή Διαπιστευτηρίων", - "Cancel": "Ακύρωση" + "Cancel": "Ακύρωση", + "Password is required": "Απαιτείται ο κωδικός πρόσβασης", + "viewport drag": "σύρσιμο θεατού πεδίου", + "Active Mouse Button": "Ενεργό Πλήκτρο Ποντικιού", + "No mousebutton": "Χωρίς Πλήκτρο Ποντικιού", + "Left mousebutton": "Αριστερό Πλήκτρο Ποντικιού", + "Middle mousebutton": "Μεσαίο Πλήκτρο Ποντικιού", + "Right mousebutton": "Δεξί Πλήκτρο Ποντικιού", + "Clear": "Καθάρισμα", + "Canvas not supported.": "Δεν υποστηρίζεται το στοιχείο Canvas", + "Disconnect timeout": "Παρέλευση χρονικού ορίου αποσύνδεσης", + "Local Downscaling": "Τοπική Συρρίκνωση", + "Local Cursor": "Τοπικός Δρομέας", + "Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "Εφαρμογή λειτουργίας αποκοπής αφού δεν υποστηρίζονται οι λωρίδες κύλισης σε πλήρη οθόνη στον IE", + "True Color": "Πραγματικά Χρώματα", + "Style:": "Στυλ:", + "default": "προεπιλεγμένο", + "Apply": "Εφαρμογή", + "Connection": "Σύνδεση", + "Token:": "Διακριτικό:", + "Send Password": "Αποστολή Κωδικού Πρόσβασης" } \ No newline at end of file diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/es.json b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/es.json index b9e663a3d..bb088243c 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/es.json +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/es.json @@ -10,7 +10,7 @@ "Disconnect timeout": "Tiempo de desconexión agotado", "noVNC encountered an error:": "noVNC ha encontrado un error:", "Hide/Show the control bar": "Ocultar/Mostrar la barra de control", - "Move/Drag Viewport": "Mover/Arrastrar la ventana", + "Move/Drag viewport": "Mover/Arrastrar la ventana", "viewport drag": "Arrastrar la ventana", "Active Mouse Button": "Botón activo del ratón", "No mousebutton": "Ningún botón del ratón", @@ -18,7 +18,7 @@ "Middle mousebutton": "Botón central del ratón", "Right mousebutton": "Botón derecho del ratón", "Keyboard": "Teclado", - "Show Keyboard": "Mostrar teclado", + "Show keyboard": "Mostrar teclado", "Extra keys": "Teclas adicionales", "Show Extra Keys": "Mostrar Teclas Adicionales", "Ctrl": "Ctrl", @@ -43,13 +43,13 @@ "Settings": "Configuraciones", "Encrypt": "Encriptar", "Shared Mode": "Modo Compartido", - "View Only": "Solo visualización", - "Clip to Window": "Recortar al tamaño de la ventana", - "Scaling Mode:": "Modo de escalado:", + "View only": "Solo visualización", + "Clip to window": "Recortar al tamaño de la ventana", + "Scaling mode:": "Modo de escalado:", "None": "Ninguno", "Local Scaling": "Escalado Local", "Local Downscaling": "Reducción de escala local", - "Remote Resizing": "Cambio de tamaño remoto", + "Remote resizing": "Cambio de tamaño remoto", "Advanced": "Avanzado", "Local Cursor": "Cursor Local", "Repeater ID:": "ID del Repetidor:", @@ -57,8 +57,8 @@ "Host:": "Host:", "Port:": "Puerto:", "Path:": "Ruta:", - "Automatic Reconnect": "Reconexión automática", - "Reconnect Delay (ms):": "Retraso en la reconexión (ms):", + "Automatic reconnect": "Reconexión automática", + "Reconnect delay (ms):": "Retraso en la reconexión (ms):", "Logging:": "Registrando:", "Disconnect": "Desconectar", "Connect": "Conectar", diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/fr.json b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/fr.json index c0eeec7d3..c8607cebe 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/fr.json +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/fr.json @@ -1,9 +1,10 @@ { + "Running without HTTPS is not recommended, crashes or other issues are likely.": "Lancer sans HTTPS n'est pas recommandé, crashs ou autres problèmes en vue.", "Connecting...": "En cours de connexion...", "Disconnecting...": "Déconnexion en cours...", "Reconnecting...": "Reconnexion en cours...", "Internal error": "Erreur interne", - "Must set host": "Doit définir l'hôte", + "Failed to connect to server: ": "Échec de connexion au serveur ", "Connected (encrypted) to ": "Connecté (chiffré) à ", "Connected (unencrypted) to ": "Connecté (non chiffré) à ", "Something went wrong, connection is closed": "Quelque chose s'est mal passé, la connexion a été fermée", @@ -15,19 +16,19 @@ "noVNC encountered an error:": "noVNC a rencontré une erreur :", "Hide/Show the control bar": "Masquer/Afficher la barre de contrôle", "Drag": "Faire glisser", - "Move/Drag Viewport": "Déplacer/faire glisser le Viewport", + "Move/Drag viewport": "Déplacer la fenêtre de visualisation", "Keyboard": "Clavier", - "Show Keyboard": "Afficher le clavier", + "Show keyboard": "Afficher le clavier", "Extra keys": "Touches supplémentaires", - "Show Extra Keys": "Afficher les touches supplémentaires", + "Show extra keys": "Afficher les touches supplémentaires", "Ctrl": "Ctrl", "Toggle Ctrl": "Basculer Ctrl", "Alt": "Alt", "Toggle Alt": "Basculer Alt", "Toggle Windows": "Basculer Windows", - "Windows": "Windows", - "Send Tab": "Envoyer l'onglet", - "Tab": "l'onglet", + "Windows": "Fenêtre", + "Send Tab": "Envoyer Tab", + "Tab": "Tabulation", "Esc": "Esc", "Send Escape": "Envoyer Escape", "Ctrl+Alt+Del": "Ctrl+Alt+Del", @@ -39,16 +40,16 @@ "Reboot": "Redémarrer", "Reset": "Réinitialiser", "Clipboard": "Presse-papiers", - "Clear": "Effacer", - "Fullscreen": "Plein écran", + "Edit clipboard content in the textarea below.": "Editer le contenu du presse-papier dans la zone ci-dessous.", + "Full screen": "Plein écran", "Settings": "Paramètres", - "Shared Mode": "Mode partagé", - "View Only": "Afficher uniquement", - "Clip to Window": "Clip à fenêtre", - "Scaling Mode:": "Mode mise à l'échelle :", + "Shared mode": "Mode partagé", + "View only": "Afficher uniquement", + "Clip to window": "Ajuster à la fenêtre", + "Scaling mode:": "Mode mise à l'échelle :", "None": "Aucun", - "Local Scaling": "Mise à l'échelle locale", - "Remote Resizing": "Redimensionnement à distance", + "Local scaling": "Mise à l'échelle locale", + "Remote resizing": "Redimensionnement à distance", "Advanced": "Avancé", "Quality:": "Qualité :", "Compression level:": "Niveau de compression :", @@ -58,15 +59,24 @@ "Host:": "Hôte :", "Port:": "Port :", "Path:": "Chemin :", - "Automatic Reconnect": "Reconnecter automatiquemen", - "Reconnect Delay (ms):": "Délai de reconnexion (ms) :", - "Show Dot when No Cursor": "Afficher le point lorsqu'il n'y a pas de curseur", + "Automatic reconnect": "Reconnecter automatiquement", + "Reconnect delay (ms):": "Délai de reconnexion (ms) :", + "Show dot when no cursor": "Afficher le point lorsqu'il n'y a pas de curseur", "Logging:": "Se connecter :", "Version:": "Version :", "Disconnect": "Déconnecter", "Connect": "Connecter", + "Server identity": "Identité du serveur", + "The server has provided the following identifying information:": "Le serveur a fourni l'identification suivante :", + "Fingerprint:": "Empreinte digitale :", + "Please verify that the information is correct and press \"Approve\". Otherwise press \"Reject\".": "SVP, verifiez que l'information est correcte et pressez \"Accepter\". Sinon pressez \"Refuser\".", + "Approve": "Accepter", + "Reject": "Refuser", + "Credentials": "Envoyer les identifiants", "Username:": "Nom d'utilisateur :", "Password:": "Mot de passe :", - "Send Credentials": "Envoyer les identifiants", - "Cancel": "Annuler" + "Send credentials": "Envoyer les identifiants", + "Cancel": "Annuler", + "Must set host": "Doit définir l'hôte", + "Clear": "Effacer" } \ No newline at end of file diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/it.json b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/it.json index 18a7f7447..28e6f721b 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/it.json +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/it.json @@ -15,7 +15,7 @@ "noVNC encountered an error:": "noVNC ha riscontrato un errore:", "Hide/Show the control bar": "Nascondi/Mostra la barra di controllo", "Keyboard": "Tastiera", - "Show Keyboard": "Mostra tastiera", + "Show keyboard": "Mostra tastiera", "Extra keys": "Tasti Aggiuntivi", "Show Extra Keys": "Mostra Tasti Aggiuntivi", "Ctrl": "Ctrl", @@ -40,9 +40,9 @@ "Clear": "Pulisci", "Fullscreen": "Schermo intero", "Settings": "Impostazioni", - "Shared Mode": "Modalità condivisa", + "Shared mode": "Modalità condivisa", "View Only": "Sola Visualizzazione", - "Scaling Mode:": "Modalità di ridimensionamento:", + "Scaling mode:": "Modalità di ridimensionamento:", "None": "Nessuna", "Local Scaling": "Ridimensionamento Locale", "Remote Resizing": "Ridimensionamento Remoto", diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/ja.json b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/ja.json index 70fd7a5d1..4fc9b8a9e 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/ja.json +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/ja.json @@ -1,13 +1,14 @@ { - "HTTPS is required for full functionality": "すべての機能を使用するにはHTTPS接続が必要です", + "Running without HTTPS is not recommended, crashes or other issues are likely.": "HTTPS接続なしで実行することは推奨されません。クラッシュしたりその他の問題が発生したりする可能性があります。", "Connecting...": "接続しています...", "Disconnecting...": "切断しています...", "Reconnecting...": "再接続しています...", "Internal error": "内部エラー", "Must set host": "ホストを設定する必要があります", + "Failed to connect to server: ": "サーバーへの接続に失敗しました: ", "Connected (encrypted) to ": "接続しました (暗号化済み): ", "Connected (unencrypted) to ": "接続しました (暗号化されていません): ", - "Something went wrong, connection is closed": "何らかの問題で、接続が閉じられました", + "Something went wrong, connection is closed": "問題が発生したため、接続が閉じられました", "Failed to connect to server": "サーバーへの接続に失敗しました", "Disconnected": "切断しました", "New connection has been rejected with reason: ": "新規接続は次の理由で拒否されました: ", @@ -16,11 +17,11 @@ "noVNC encountered an error:": "noVNC でエラーが発生しました:", "Hide/Show the control bar": "コントロールバーを隠す/表示する", "Drag": "ドラッグ", - "Move/Drag Viewport": "ビューポートを移動/ドラッグ", + "Move/Drag viewport": "ビューポートを移動/ドラッグ", "Keyboard": "キーボード", - "Show Keyboard": "キーボードを表示", + "Show keyboard": "キーボードを表示", "Extra keys": "追加キー", - "Show Extra Keys": "追加キーを表示", + "Show extra keys": "追加キーを表示", "Ctrl": "Ctrl", "Toggle Ctrl": "Ctrl キーをトグル", "Alt": "Alt", @@ -41,15 +42,15 @@ "Reset": "リセット", "Clipboard": "クリップボード", "Edit clipboard content in the textarea below.": "以下の入力欄からクリップボードの内容を編集できます。", - "Full Screen": "全画面表示", + "Full screen": "全画面表示", "Settings": "設定", - "Shared Mode": "共有モード", - "View Only": "表示専用", - "Clip to Window": "ウィンドウにクリップ", - "Scaling Mode:": "スケーリングモード:", + "Shared mode": "共有モード", + "View only": "表示専用", + "Clip to window": "ウィンドウにクリップ", + "Scaling mode:": "スケーリングモード:", "None": "なし", - "Local Scaling": "ローカルスケーリング", - "Remote Resizing": "リモートでリサイズ", + "Local scaling": "ローカルでスケーリング", + "Remote resizing": "リモートでリサイズ", "Advanced": "高度", "Quality:": "品質:", "Compression level:": "圧縮レベル:", @@ -59,9 +60,9 @@ "Host:": "ホスト:", "Port:": "ポート:", "Path:": "パス:", - "Automatic Reconnect": "自動再接続", - "Reconnect Delay (ms):": "再接続する遅延 (ミリ秒):", - "Show Dot when No Cursor": "カーソルがないときにドットを表示する", + "Automatic reconnect": "自動再接続", + "Reconnect delay (ms):": "再接続する遅延 (ミリ秒):", + "Show dot when no cursor": "カーソルがないときにドットを表示する", "Logging:": "ロギング:", "Version:": "バージョン:", "Disconnect": "切断", @@ -75,6 +76,6 @@ "Credentials": "資格情報", "Username:": "ユーザー名:", "Password:": "パスワード:", - "Send Credentials": "資格情報を送信", + "Send credentials": "資格情報を送信", "Cancel": "キャンセル" } \ No newline at end of file diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/ko.json b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/ko.json index e4ecddcfd..47b0805c9 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/ko.json +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/ko.json @@ -14,7 +14,7 @@ "Password is required": "비밀번호가 필요합니다.", "noVNC encountered an error:": "noVNC에 오류가 발생했습니다:", "Hide/Show the control bar": "컨트롤 바 숨기기/보이기", - "Move/Drag Viewport": "움직이기/드래그 뷰포트", + "Move/Drag viewport": "움직이기/드래그 뷰포트", "viewport drag": "뷰포트 드래그", "Active Mouse Button": "마우스 버튼 활성화", "No mousebutton": "마우스 버튼 없음", @@ -22,9 +22,9 @@ "Middle mousebutton": "중간 마우스 버튼", "Right mousebutton": "오른쪽 마우스 버튼", "Keyboard": "키보드", - "Show Keyboard": "키보드 보이기", + "Show keyboard": "키보드 보이기", "Extra keys": "기타 키들", - "Show Extra Keys": "기타 키들 보이기", + "Show extra keys": "기타 키들 보이기", "Ctrl": "Ctrl", "Toggle Ctrl": "Ctrl 켜기/끄기", "Alt": "Alt", @@ -45,13 +45,13 @@ "Clear": "지우기", "Fullscreen": "전체화면", "Settings": "설정", - "Shared Mode": "공유 모드", - "View Only": "보기 전용", - "Clip to Window": "창에 클립", - "Scaling Mode:": "스케일링 모드:", + "Shared mode": "공유 모드", + "View only": "보기 전용", + "Clip to window": "창에 클립", + "Scaling mode:": "스케일링 모드:", "None": "없음", - "Local Scaling": "로컬 스케일링", - "Remote Resizing": "원격 크기 조절", + "Local scaling": "로컬 스케일링", + "Remote resizing": "원격 크기 조절", "Advanced": "고급", "Repeater ID:": "중계 ID", "WebSocket": "웹소켓", @@ -59,8 +59,8 @@ "Host:": "호스트:", "Port:": "포트:", "Path:": "위치:", - "Automatic Reconnect": "자동 재연결", - "Reconnect Delay (ms):": "재연결 지연 시간 (ms)", + "Automatic reconnect": "자동 재연결", + "Reconnect delay (ms):": "재연결 지연 시간 (ms)", "Logging:": "로깅", "Disconnect": "연결 해제", "Connect": "연결", diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/nl.json b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/nl.json index 0cdcc92a9..61f2df3c7 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/nl.json +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/nl.json @@ -1,36 +1,32 @@ { - "Connecting...": "Verbinden...", - "Disconnecting...": "Verbinding verbreken...", + "Running without HTTPS is not recommended, crashes or other issues are likely.": "Het is niet aan te raden om zonder HTTPS te werken, crashes of andere problemen zijn dan waarschijnlijk.", + "Connecting...": "Aan het verbinden…", + "Disconnecting...": "Bezig om verbinding te verbreken...", "Reconnecting...": "Opnieuw verbinding maken...", "Internal error": "Interne fout", - "Must set host": "Host moeten worden ingesteld", + "Failed to connect to server: ": "Verbinding maken met server is mislukt", "Connected (encrypted) to ": "Verbonden (versleuteld) met ", "Connected (unencrypted) to ": "Verbonden (onversleuteld) met ", "Something went wrong, connection is closed": "Er iets fout gelopen, verbinding werd verbroken", "Failed to connect to server": "Verbinding maken met server is mislukt", "Disconnected": "Verbinding verbroken", - "New connection has been rejected with reason: ": "Nieuwe verbinding is geweigerd omwille van de volgende reden: ", + "New connection has been rejected with reason: ": "Nieuwe verbinding is geweigerd met de volgende reden: ", "New connection has been rejected": "Nieuwe verbinding is geweigerd", - "Password is required": "Wachtwoord is vereist", + "Credentials are required": "Inloggegevens zijn nodig", "noVNC encountered an error:": "noVNC heeft een fout bemerkt:", "Hide/Show the control bar": "Verberg/Toon de bedieningsbalk", - "Move/Drag Viewport": "Verplaats/Versleep Kijkvenster", - "viewport drag": "kijkvenster slepen", - "Active Mouse Button": "Actieve Muisknop", - "No mousebutton": "Geen muisknop", - "Left mousebutton": "Linker muisknop", - "Middle mousebutton": "Middelste muisknop", - "Right mousebutton": "Rechter muisknop", + "Drag": "Sleep", + "Move/Drag viewport": "Verplaats/Versleep Kijkvenster", "Keyboard": "Toetsenbord", - "Show Keyboard": "Toon Toetsenbord", + "Show keyboard": "Toon Toetsenbord", "Extra keys": "Extra toetsen", - "Show Extra Keys": "Toon Extra Toetsen", + "Show extra keys": "Toon Extra Toetsen", "Ctrl": "Ctrl", "Toggle Ctrl": "Ctrl omschakelen", "Alt": "Alt", "Toggle Alt": "Alt omschakelen", - "Toggle Windows": "Windows omschakelen", - "Windows": "Windows", + "Toggle Windows": "Vensters omschakelen", + "Windows": "Vensters", "Send Tab": "Tab Sturen", "Tab": "Tab", "Esc": "Esc", @@ -44,30 +40,56 @@ "Reboot": "Herstarten", "Reset": "Resetten", "Clipboard": "Klembord", - "Clear": "Wissen", - "Fullscreen": "Volledig Scherm", + "Edit clipboard content in the textarea below.": "Edit de inhoud van het klembord in het tekstveld hieronder", + "Full screen": "Volledig Scherm", "Settings": "Instellingen", - "Shared Mode": "Gedeelde Modus", - "View Only": "Alleen Kijken", - "Clip to Window": "Randen buiten venster afsnijden", - "Scaling Mode:": "Schaalmodus:", + "Shared mode": "Gedeelde Modus", + "View only": "Alleen Kijken", + "Clip to window": "Randen buiten venster afsnijden", + "Scaling mode:": "Schaalmodus:", "None": "Geen", - "Local Scaling": "Lokaal Schalen", - "Remote Resizing": "Op Afstand Formaat Wijzigen", + "Local scaling": "Lokaal Schalen", + "Remote resizing": "Op Afstand Formaat Wijzigen", "Advanced": "Geavanceerd", + "Quality:": "Kwaliteit:", + "Compression level:": "Compressieniveau:", "Repeater ID:": "Repeater ID:", "WebSocket": "WebSocket", "Encrypt": "Versleutelen", "Host:": "Host:", "Port:": "Poort:", "Path:": "Pad:", - "Automatic Reconnect": "Automatisch Opnieuw Verbinden", - "Reconnect Delay (ms):": "Vertraging voor Opnieuw Verbinden (ms):", - "Show Dot when No Cursor": "Geef stip weer indien geen cursor", + "Automatic reconnect": "Automatisch Opnieuw Verbinden", + "Reconnect delay (ms):": "Vertraging voor Opnieuw Verbinden (ms):", + "Show dot when no cursor": "Geef stip weer indien geen cursor", "Logging:": "Logmeldingen:", + "Version:": "Versie:", "Disconnect": "Verbinding verbreken", "Connect": "Verbinden", + "Server identity": "Serveridentiteit", + "The server has provided the following identifying information:": "De server geeft de volgende identificerende informatie:", + "Fingerprint:": "Vingerafdruk:", + "Please verify that the information is correct and press \"Approve\". Otherwise press \"Reject\".": "Verifieer dat de informatie is correct en druk “OK”. Druk anders op “Afwijzen”.", + "Approve": "OK", + "Reject": "Afwijzen", + "Credentials": "Inloggegevens", + "Username:": "Gebruikersnaam:", "Password:": "Wachtwoord:", + "Send credentials": "Stuur inloggegevens", + "Cancel": "Annuleren", + "Must set host": "Host moeten worden ingesteld", + "Password is required": "Wachtwoord is vereist", + "viewport drag": "kijkvenster slepen", + "Active Mouse Button": "Actieve Muisknop", + "No mousebutton": "Geen muisknop", + "Left mousebutton": "Linker muisknop", + "Middle mousebutton": "Middelste muisknop", + "Right mousebutton": "Rechter muisknop", + "Clear": "Wissen", "Send Password": "Verzend Wachtwoord:", - "Cancel": "Annuleren" + "Disconnect timeout": "Timeout tijdens verbreken van verbinding", + "Local Downscaling": "Lokaal Neerschalen", + "Local Cursor": "Lokale Cursor", + "Canvas not supported.": "Canvas wordt niet ondersteund.", + "Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "''Clipping mode' ingeschakeld, omdat schuifbalken in volledige-scherm-modus in IE niet worden ondersteund" } \ No newline at end of file diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/pl.json b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/pl.json index 006ac7a55..87c169056 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/pl.json +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/pl.json @@ -21,9 +21,9 @@ "Middle mousebutton": "Środkowy przycisk myszy", "Right mousebutton": "Prawy przycisk myszy", "Keyboard": "Klawiatura", - "Show Keyboard": "Pokaż klawiaturę", + "Show keyboard": "Pokaż klawiaturę", "Extra keys": "Przyciski dodatkowe", - "Show Extra Keys": "Pokaż przyciski dodatkowe", + "Show extra keys": "Pokaż przyciski dodatkowe", "Ctrl": "Ctrl", "Toggle Ctrl": "Przełącz Ctrl", "Alt": "Alt", @@ -49,8 +49,8 @@ "Clip to Window": "Przytnij do Okna", "Scaling Mode:": "Tryb Skalowania:", "None": "Brak", - "Local Scaling": "Skalowanie lokalne", - "Remote Resizing": "Skalowanie zdalne", + "Local scaling": "Skalowanie lokalne", + "Remote resizing": "Skalowanie zdalne", "Advanced": "Zaawansowane", "Repeater ID:": "ID Repeatera:", "WebSocket": "WebSocket", @@ -58,12 +58,23 @@ "Host:": "Host:", "Port:": "Port:", "Path:": "Ścieżka:", - "Automatic Reconnect": "Automatycznie wznawiaj połączenie", - "Reconnect Delay (ms):": "Opóźnienie wznawiania (ms):", + "Automatic reconnect": "Automatycznie wznawiaj połączenie", + "Reconnect delay (ms):": "Opóźnienie wznawiania (ms):", "Logging:": "Poziom logowania:", "Disconnect": "Rozłącz", "Connect": "Połącz", "Password:": "Hasło:", "Cancel": "Anuluj", - "Canvas not supported.": "Element Canvas nie jest wspierany." + "Canvas not supported.": "Element Canvas nie jest wspierany.", + "Disconnect timeout": "Timeout rozłączenia", + "Local Downscaling": "Downscaling lokalny", + "Local Cursor": "Lokalny kursor", + "Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "Wymuszam clipping mode ponieważ paski przewijania nie są wspierane przez IE w trybie pełnoekranowym", + "True Color": "True Color", + "Style:": "Styl:", + "default": "domyślny", + "Apply": "Zapisz", + "Connection": "Połączenie", + "Token:": "Token:", + "Send Password": "Wyślij Hasło" } \ No newline at end of file diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/pt_BR.json b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/pt_BR.json index aa130f764..224b86efd 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/pt_BR.json +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/pt_BR.json @@ -15,11 +15,11 @@ "noVNC encountered an error:": "O noVNC encontrou um erro:", "Hide/Show the control bar": "Esconder/mostrar a barra de controles", "Drag": "Arrastar", - "Move/Drag Viewport": "Mover/arrastar a janela", + "Move/Drag viewport": "Mover/arrastar a janela", "Keyboard": "Teclado", - "Show Keyboard": "Mostrar teclado", + "Show keyboard": "Mostrar teclado", "Extra keys": "Teclas adicionais", - "Show Extra Keys": "Mostar teclas adicionais", + "Show extra keys": "Mostar teclas adicionais", "Ctrl": "Ctrl", "Toggle Ctrl": "Pressionar/soltar Ctrl", "Alt": "Alt", @@ -42,13 +42,13 @@ "Clear": "Limpar", "Fullscreen": "Tela cheia", "Settings": "Configurações", - "Shared Mode": "Modo compartilhado", - "View Only": "Apenas visualizar", - "Clip to Window": "Recortar à janela", - "Scaling Mode:": "Modo de dimensionamento:", + "Shared mode": "Modo compartilhado", + "View only": "Apenas visualizar", + "Clip to window": "Recortar à janela", + "Scaling mode:": "Modo de dimensionamento:", "None": "Nenhum", - "Local Scaling": "Local", - "Remote Resizing": "Remoto", + "Local scaling": "Local", + "Remote resizing": "Remoto", "Advanced": "Avançado", "Quality:": "Qualidade:", "Compression level:": "Nível de compressão:", @@ -58,15 +58,15 @@ "Host:": "Host:", "Port:": "Porta:", "Path:": "Caminho:", - "Automatic Reconnect": "Reconexão automática", - "Reconnect Delay (ms):": "Atraso da reconexão (ms)", - "Show Dot when No Cursor": "Mostrar ponto quando não há cursor", + "Automatic reconnect": "Reconexão automática", + "Reconnect delay (ms):": "Atraso da reconexão (ms)", + "Show dot when no cursor": "Mostrar ponto quando não há cursor", "Logging:": "Registros:", "Version:": "Versão:", "Disconnect": "Desconectar", "Connect": "Conectar", "Username:": "Nome de usuário:", "Password:": "Senha:", - "Send Credentials": "Enviar credenciais", + "Send credentials": "Enviar credenciais", "Cancel": "Cancelar" } \ No newline at end of file diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/ru.json b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/ru.json index cab97396e..bd1bb534a 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/ru.json +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/ru.json @@ -15,16 +15,16 @@ "noVNC encountered an error:": "Ошибка noVNC: ", "Hide/Show the control bar": "Скрыть/Показать контрольную панель", "Drag": "Переместить", - "Move/Drag Viewport": "Переместить окно", + "Move/Drag viewport": "Переместить окно", "Keyboard": "Клавиатура", - "Show Keyboard": "Показать клавиатуру", + "Show keyboard": "Показать клавиатуру", "Extra keys": "Дополнительные Кнопки", "Show Extra Keys": "Показать Дополнительные Кнопки", "Ctrl": "Ctrl", - "Toggle Ctrl": "Переключение нажатия Ctrl", + "Toggle Ctrl": "Зажать Ctrl", "Alt": "Alt", - "Toggle Alt": "Переключение нажатия Alt", - "Toggle Windows": "Переключение вкладок", + "Toggle Alt": "Зажать Alt", + "Toggle Windows": "Зажать Windows", "Windows": "Вкладка", "Send Tab": "Передать нажатие Tab", "Tab": "Tab", @@ -42,13 +42,13 @@ "Clear": "Очистить", "Fullscreen": "Во весь экран", "Settings": "Настройки", - "Shared Mode": "Общий режим", + "Shared mode": "Общий режим", "View Only": "Только Просмотр", - "Clip to Window": "В окно", - "Scaling Mode:": "Масштаб:", + "Clip to window": "В окно", + "Scaling mode:": "Масштаб:", "None": "Нет", - "Local Scaling": "Локльный масштаб", - "Remote Resizing": "Удаленная перенастройка размера", + "Local scaling": "Локальный масштаб", + "Remote resizing": "Удаленная перенастройка размера", "Advanced": "Дополнительно", "Quality:": "Качество", "Compression level:": "Уровень Сжатия", @@ -58,9 +58,9 @@ "Host:": "Сервер:", "Port:": "Порт:", "Path:": "Путь:", - "Automatic Reconnect": "Автоматическое переподключение", - "Reconnect Delay (ms):": "Задержка переподключения (мс):", - "Show Dot when No Cursor": "Показать точку вместо курсора", + "Automatic reconnect": "Автоматическое переподключение", + "Reconnect delay (ms):": "Задержка переподключения (мс):", + "Show dot when no cursor": "Показать точку вместо курсора", "Logging:": "Лог:", "Version:": "Версия", "Disconnect": "Отключение", diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/sv.json b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/sv.json index 80a400bfa..67f6675aa 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/sv.json +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/sv.json @@ -4,7 +4,6 @@ "Disconnecting...": "Kopplar ner...", "Reconnecting...": "Återansluter...", "Internal error": "Internt fel", - "Must set host": "Du måste specifiera en värd", "Failed to connect to server: ": "Misslyckades att ansluta till servern: ", "Connected (encrypted) to ": "Ansluten (krypterat) till ", "Connected (unencrypted) to ": "Ansluten (okrypterat) till ", @@ -17,11 +16,11 @@ "noVNC encountered an error:": "noVNC stötte på ett problem:", "Hide/Show the control bar": "Göm/Visa kontrollbaren", "Drag": "Dra", - "Move/Drag Viewport": "Flytta/Dra Vyn", + "Move/Drag viewport": "Flytta/Dra vyn", "Keyboard": "Tangentbord", - "Show Keyboard": "Visa Tangentbord", + "Show keyboard": "Visa tangentbord", "Extra keys": "Extraknappar", - "Show Extra Keys": "Visa Extraknappar", + "Show extra keys": "Visa extraknappar", "Ctrl": "Ctrl", "Toggle Ctrl": "Växla Ctrl", "Alt": "Alt", @@ -42,15 +41,15 @@ "Reset": "Återställ", "Clipboard": "Urklipp", "Edit clipboard content in the textarea below.": "Redigera urklippets innehåll i fältet nedan.", - "Full Screen": "Fullskärm", + "Full screen": "Fullskärm", "Settings": "Inställningar", - "Shared Mode": "Delat Läge", - "View Only": "Endast Visning", - "Clip to Window": "Begränsa till Fönster", - "Scaling Mode:": "Skalningsläge:", + "Shared mode": "Delat läge", + "View only": "Endast visning", + "Clip to window": "Begränsa till fönster", + "Scaling mode:": "Skalningsläge:", "None": "Ingen", - "Local Scaling": "Lokal Skalning", - "Remote Resizing": "Ändra Storlek", + "Local scaling": "Lokal skalning", + "Remote resizing": "Ändra storlek", "Advanced": "Avancerat", "Quality:": "Kvalitet:", "Compression level:": "Kompressionsnivå:", @@ -60,9 +59,9 @@ "Host:": "Värd:", "Port:": "Port:", "Path:": "Sökväg:", - "Automatic Reconnect": "Automatisk Återanslutning", - "Reconnect Delay (ms):": "Fördröjning (ms):", - "Show Dot when No Cursor": "Visa prick när ingen muspekare finns", + "Automatic reconnect": "Automatisk återanslutning", + "Reconnect delay (ms):": "Fördröjning (ms):", + "Show dot when no cursor": "Visa prick när ingen muspekare finns", "Logging:": "Loggning:", "Version:": "Version:", "Disconnect": "Koppla från", @@ -76,6 +75,9 @@ "Credentials": "Användaruppgifter", "Username:": "Användarnamn:", "Password:": "Lösenord:", - "Send Credentials": "Skicka Användaruppgifter", - "Cancel": "Avbryt" + "Send credentials": "Skicka användaruppgifter", + "Cancel": "Avbryt", + "Must set host": "Du måste specifiera en värd", + "HTTPS is required for full functionality": "HTTPS krävs för full funktionalitet", + "Clear": "Rensa" } \ No newline at end of file diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/tr.json b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/tr.json index 451c1b8a6..90f816244 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/tr.json +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/tr.json @@ -23,7 +23,7 @@ "Keyboard": "Klavye", "Show Keyboard": "Klavye Düzenini Göster", "Extra keys": "Ekstra tuşlar", - "Show Extra Keys": "Ekstra tuşları göster", + "Show extra keys": "Ekstra tuşları göster", "Ctrl": "Ctrl", "Toggle Ctrl": "Ctrl Değiştir ", "Alt": "Alt", diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/zh_CN.json b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/zh_CN.json index 3679eaddd..2898d2c1d 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/zh_CN.json +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/zh_CN.json @@ -1,31 +1,33 @@ { + "Running without HTTPS is not recommended, crashes or other issues are likely.": "不建议在没有 HTTPS 的情况下运行,可能会出现崩溃或出现其他问题。", "Connecting...": "连接中...", + "Disconnecting...": "正在断开连接...", + "Reconnecting...": "重新连接中...", + "Internal error": "内部错误", + "Must set host": "必须设置主机", + "Failed to connect to server: ": "无法连接到服务器:", "Connected (encrypted) to ": "已连接(已加密)到", "Connected (unencrypted) to ": "已连接(未加密)到", - "Disconnecting...": "正在断开连接...", + "Something went wrong, connection is closed": "出了点问题,连接已关闭", + "Failed to connect to server": "无法连接到服务器", "Disconnected": "已断开连接", - "Must set host": "必须设置主机", - "Reconnecting...": "重新连接中...", - "Password is required": "请提供密码", - "Disconnect timeout": "超时断开", + "New connection has been rejected with reason: ": "新连接被拒绝,原因如下:", + "New connection has been rejected": "新连接已被拒绝", + "Credentials are required": "需要凭证", "noVNC encountered an error:": "noVNC 遇到一个错误:", "Hide/Show the control bar": "显示/隐藏控制栏", - "Move/Drag Viewport": "移动/拖动窗口", - "viewport drag": "窗口拖动", - "Active Mouse Button": "启动鼠标按键", - "No mousebutton": "禁用鼠标按键", - "Left mousebutton": "鼠标左键", - "Middle mousebutton": "鼠标中键", - "Right mousebutton": "鼠标右键", + "Drag": "拖动", + "Move/Drag viewport": "移动/拖动窗口", "Keyboard": "键盘", - "Show Keyboard": "显示键盘", + "Show keyboard": "显示键盘", "Extra keys": "额外按键", - "Show Extra Keys": "显示额外按键", + "Show extra keys": "显示额外按键", "Ctrl": "Ctrl", "Toggle Ctrl": "切换 Ctrl", - "Edit clipboard content in the textarea below.": "在下面的文本区域中编辑剪贴板内容。", "Alt": "Alt", "Toggle Alt": "切换 Alt", + "Toggle Windows": "切换窗口", + "Windows": "窗口", "Send Tab": "发送 Tab 键", "Tab": "Tab", "Esc": "Esc", @@ -39,31 +41,53 @@ "Reboot": "重启", "Reset": "重置", "Clipboard": "剪贴板", - "Clear": "清除", - "Fullscreen": "全屏", + "Edit clipboard content in the textarea below.": "在下面的文本区域中编辑剪贴板内容。", + "Full screen": "全屏", "Settings": "设置", - "Encrypt": "加密", - "Shared Mode": "分享模式", - "View Only": "仅查看", - "Clip to Window": "限制/裁切窗口大小", - "Scaling Mode:": "缩放模式:", + "Shared mode": "分享模式", + "View only": "仅查看", + "Clip to window": "限制/裁切窗口大小", + "Scaling mode:": "缩放模式:", "None": "无", - "Local Scaling": "本地缩放", - "Local Downscaling": "降低本地尺寸", - "Remote Resizing": "远程调整大小", + "Local scaling": "本地缩放", + "Remote resizing": "远程调整大小", "Advanced": "高级", - "Local Cursor": "本地光标", + "Quality:": "品质:", + "Compression level:": "压缩级别:", "Repeater ID:": "中继站 ID", "WebSocket": "WebSocket", + "Encrypt": "加密", "Host:": "主机:", "Port:": "端口:", "Path:": "路径:", - "Automatic Reconnect": "自动重新连接", - "Reconnect Delay (ms):": "重新连接间隔 (ms):", + "Automatic reconnect": "自动重新连接", + "Reconnect delay (ms):": "重新连接间隔 (ms):", + "Show dot when no cursor": "无光标时显示点", "Logging:": "日志级别:", + "Version:": "版本:", "Disconnect": "断开连接", "Connect": "连接", + "Server identity": "服务器身份", + "The server has provided the following identifying information:": "服务器提供了以下识别信息:", + "Fingerprint:": "指纹:", + "Please verify that the information is correct and press \"Approve\". Otherwise press \"Reject\".": "请核实信息是否正确,并按 “同意”,否则按 “拒绝”。", + "Approve": "同意", + "Reject": "拒绝", + "Credentials": "凭证", + "Username:": "用户名:", "Password:": "密码:", + "Send credentials": "发送凭证", "Cancel": "取消", + "Password is required": "请提供密码", + "Disconnect timeout": "超时断开", + "viewport drag": "窗口拖动", + "Active Mouse Button": "启动鼠标按键", + "No mousebutton": "禁用鼠标按键", + "Left mousebutton": "鼠标左键", + "Middle mousebutton": "鼠标中键", + "Right mousebutton": "鼠标右键", + "Clear": "清除", + "Local Downscaling": "降低本地尺寸", + "Local Cursor": "本地光标", "Canvas not supported.": "不支持 Canvas。" } \ No newline at end of file diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/zh_TW.json b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/zh_TW.json index 8ddf813f0..9d292a315 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/zh_TW.json +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/locale/zh_TW.json @@ -14,7 +14,7 @@ "Password is required": "請提供密碼", "noVNC encountered an error:": "noVNC 遇到一個錯誤:", "Hide/Show the control bar": "顯示/隱藏控制列", - "Move/Drag Viewport": "拖放顯示範圍", + "Move/Drag viewport": "拖放顯示範圍", "viewport drag": "顯示範圍拖放", "Active Mouse Button": "啟用滑鼠按鍵", "No mousebutton": "無滑鼠按鍵", @@ -22,9 +22,9 @@ "Middle mousebutton": "滑鼠中鍵", "Right mousebutton": "滑鼠右鍵", "Keyboard": "鍵盤", - "Show Keyboard": "顯示鍵盤", + "Show keyboard": "顯示鍵盤", "Extra keys": "額外按鍵", - "Show Extra Keys": "顯示額外按鍵", + "Show extra keys": "顯示額外按鍵", "Ctrl": "Ctrl", "Toggle Ctrl": "切換 Ctrl", "Alt": "Alt", @@ -45,13 +45,13 @@ "Clear": "清除", "Fullscreen": "全螢幕", "Settings": "設定", - "Shared Mode": "分享模式", - "View Only": "僅檢視", - "Clip to Window": "限制/裁切視窗大小", - "Scaling Mode:": "縮放模式:", + "Shared mode": "分享模式", + "View only": "僅檢視", + "Clip to window": "限制/裁切視窗大小", + "Scaling mode:": "縮放模式:", "None": "無", - "Local Scaling": "本機縮放", - "Remote Resizing": "遠端調整大小", + "Local scaling": "本機縮放", + "Remote resizing": "遠端調整大小", "Advanced": "進階", "Repeater ID:": "中繼站 ID", "WebSocket": "WebSocket", @@ -59,8 +59,8 @@ "Host:": "主機:", "Port:": "連接埠:", "Path:": "路徑:", - "Automatic Reconnect": "自動重新連線", - "Reconnect Delay (ms):": "重新連線間隔 (ms):", + "Automatic reconnect": "自動重新連線", + "Reconnect delay (ms):": "重新連線間隔 (ms):", "Logging:": "日誌級別:", "Disconnect": "中斷連線", "Connect": "連線", diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/localization.js b/emhttp/plugins/dynamix.vm.manager/novnc/app/localization.js index 7d7e6e6af..c8257fdbe 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/localization.js +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/localization.js @@ -1,13 +1,13 @@ /* * noVNC: HTML5 VNC client - * Copyright (C) 2018 The noVNC Authors + * Copyright (C) 2018 The noVNC authors * Licensed under MPL 2.0 (see LICENSE.txt) * * See README.md for usage and integration instructions. */ /* - * Localization Utilities + * Localization utilities */ export class Localizer { diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/styles/base.css b/emhttp/plugins/dynamix.vm.manager/novnc/app/styles/base.css index f83ad4b93..87bfb45c5 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/styles/base.css +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/styles/base.css @@ -1,6 +1,6 @@ /* * noVNC base CSS - * Copyright (C) 2019 The noVNC Authors + * Copyright (C) 2019 The noVNC authors * noVNC is licensed under the MPL 2.0 (see LICENSE.txt) * This file is licensed under the 2-Clause BSD license (see LICENSE.txt). */ @@ -30,30 +30,31 @@ */ :root { - font-family: sans-serif; + font-family: sans-serif; + line-height: 1.6; } body { - margin:0; - padding:0; - /*Background image with light grey curve.*/ - background-color:#494949; - background-repeat:no-repeat; - background-position:right bottom; - height:100%; - touch-action: none; + margin:0; + padding:0; + /*Background image with light grey curve.*/ + background-color:#494949; + background-repeat:no-repeat; + background-position:right bottom; + height:100%; + touch-action: none; } html { - height:100%; + height:100%; } .noVNC_only_touch.noVNC_hidden { - display: none; + display: none; } .noVNC_disabled { - color: rgb(128, 128, 128); + color: var(--novnc-grey); } /* ---------------------------------------- @@ -62,33 +63,33 @@ html { */ .noVNC_spinner { - position: relative; + position: relative; } .noVNC_spinner, .noVNC_spinner::before, .noVNC_spinner::after { - width: 10px; - height: 10px; - border-radius: 2px; - box-shadow: -60px 10px 0 rgba(255, 255, 255, 0); - animation: noVNC_spinner 1.0s linear infinite; + width: 10px; + height: 10px; + border-radius: 2px; + box-shadow: -60px 10px 0 rgba(255, 255, 255, 0); + animation: noVNC_spinner 1.0s linear infinite; } .noVNC_spinner::before { - content: ""; - position: absolute; - left: 0px; - top: 0px; - animation-delay: -0.1s; + content: ""; + position: absolute; + left: 0px; + top: 0px; + animation-delay: -0.1s; } .noVNC_spinner::after { - content: ""; - position: absolute; - top: 0px; - left: 0px; - animation-delay: 0.1s; + content: ""; + position: absolute; + top: 0px; + left: 0px; + animation-delay: 0.1s; } @keyframes noVNC_spinner { - 0% { box-shadow: -60px 10px 0 rgba(255, 255, 255, 0); width: 20px; } - 25% { box-shadow: 20px 10px 0 rgba(255, 255, 255, 1); width: 10px; } - 50% { box-shadow: 60px 10px 0 rgba(255, 255, 255, 0); width: 10px; } + 0% { box-shadow: -60px 10px 0 rgba(255, 255, 255, 0); width: 20px; } + 25% { box-shadow: 20px 10px 0 rgba(255, 255, 255, 1); width: 10px; } + 50% { box-shadow: 60px 10px 0 rgba(255, 255, 255, 0); width: 10px; } } /* ---------------------------------------- @@ -97,39 +98,39 @@ html { */ .noVNC_center { - /* - * This is a workaround because webkit misrenders transforms and - * uses non-integer coordinates, resulting in blurry content. - * Ideally we'd use "top: 50%; transform: translateY(-50%);" on - * the objects instead. - */ - display: flex; - align-items: center; - justify-content: center; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - pointer-events: none; + /* + * This is a workaround because webkit misrenders transforms and + * uses non-integer coordinates, resulting in blurry content. + * Ideally we'd use "top: 50%; transform: translateY(-50%);" on + * the objects instead. + */ + display: flex; + align-items: center; + justify-content: center; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; } .noVNC_center > * { - pointer-events: auto; + pointer-events: auto; } .noVNC_vcenter { - display: flex !important; - flex-direction: column; - justify-content: center; - position: fixed; - top: 0; - left: 0; - height: 100%; - margin: 0 !important; - padding: 0 !important; - pointer-events: none; + display: flex !important; + flex-direction: column; + justify-content: center; + position: fixed; + top: 0; + left: 0; + height: 100%; + margin: 0 !important; + padding: 0 !important; + pointer-events: none; } .noVNC_vcenter > * { - pointer-events: auto; + pointer-events: auto; } /* ---------------------------------------- @@ -138,7 +139,7 @@ html { */ .noVNC_connect_layer { - z-index: 60; + z-index: 60; } /* ---------------------------------------- @@ -147,396 +148,404 @@ html { */ #noVNC_fallback_error { - z-index: 1000; - visibility: hidden; - /* Put a dark background in front of everything but the error, - and don't let mouse events pass through */ - background: rgba(0, 0, 0, 0.8); - pointer-events: all; + z-index: 1000; + visibility: hidden; + /* Put a dark background in front of everything but the error, + and don't let mouse events pass through */ + background: rgba(0, 0, 0, 0.8); + pointer-events: all; } #noVNC_fallback_error.noVNC_open { - visibility: visible; + visibility: visible; } #noVNC_fallback_error > div { - max-width: calc(100vw - 30px - 30px); - max-height: calc(100vh - 30px - 30px); - overflow: auto; + max-width: calc(100vw - 30px - 30px); + max-height: calc(100vh - 30px - 30px); + overflow: auto; - padding: 15px; + padding: 15px; - transition: 0.5s ease-in-out; + transition: 0.5s ease-in-out; - transform: translateY(-50px); - opacity: 0; + transform: translateY(-50px); + opacity: 0; - text-align: center; - font-weight: bold; - color: #fff; + text-align: center; + font-weight: bold; + color: #fff; - border-radius: 10px; - box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); - background: rgba(200,55,55,0.8); + border-radius: 12px; + box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); + background: rgba(200,55,55,0.8); } #noVNC_fallback_error.noVNC_open > div { - transform: translateY(0); - opacity: 1; + transform: translateY(0); + opacity: 1; } #noVNC_fallback_errormsg { - font-weight: normal; + font-weight: normal; } #noVNC_fallback_errormsg .noVNC_message { - display: inline-block; - text-align: left; - font-family: monospace; - white-space: pre-wrap; + display: inline-block; + text-align: left; + font-family: monospace; + white-space: pre-wrap; } #noVNC_fallback_error .noVNC_location { - font-style: italic; - font-size: 0.8em; - color: rgba(255, 255, 255, 0.8); + font-style: italic; + font-size: 0.8em; + color: rgba(255, 255, 255, 0.8); } #noVNC_fallback_error .noVNC_stack { - padding: 10px; - margin: 10px; - font-size: 0.8em; - text-align: left; - font-family: monospace; - white-space: pre; - border: 1px solid rgba(0, 0, 0, 0.5); - background: rgba(0, 0, 0, 0.2); - overflow: auto; + padding: 10px; + margin: 10px; + font-size: 0.8em; + text-align: left; + font-family: monospace; + white-space: pre; + border: 1px solid rgba(0, 0, 0, 0.5); + background: rgba(0, 0, 0, 0.2); + overflow: auto; } /* ---------------------------------------- - * Control Bar + * Control bar * ---------------------------------------- */ #noVNC_control_bar_anchor { - /* The anchor is needed to get z-stacking to work */ - position: fixed; - z-index: 10; + /* The anchor is needed to get z-stacking to work */ + position: fixed; + z-index: 10; - transition: 0.5s ease-in-out; + transition: 0.5s ease-in-out; - /* Edge misrenders animations wihthout this */ - transform: translateX(0); + /* Edge misrenders animations wihthout this */ + transform: translateX(0); } :root.noVNC_connected #noVNC_control_bar_anchor.noVNC_idle { - opacity: 0.8; + opacity: 0.8; } #noVNC_control_bar_anchor.noVNC_right { - left: auto; - right: 0; + left: auto; + right: 0; } #noVNC_control_bar { - position: relative; - left: -100%; + position: relative; + left: -100%; - transition: 0.5s ease-in-out; + transition: 0.5s ease-in-out; - background-color: rgb(110, 132, 163); - border-radius: 0 10px 10px 0; + background-color: var(--novnc-blue); + border-radius: 0 12px 12px 0; - user-select: none; - -webkit-user-select: none; - -webkit-touch-callout: none; /* Disable iOS image long-press popup */ + user-select: none; + -webkit-user-select: none; + -webkit-touch-callout: none; /* Disable iOS image long-press popup */ } #noVNC_control_bar.noVNC_open { - box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); - left: 0; + box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); + left: 0; } #noVNC_control_bar::before { - /* This extra element is to get a proper shadow */ - content: ""; - position: absolute; - z-index: -1; - height: 100%; - width: 30px; - left: -30px; - transition: box-shadow 0.5s ease-in-out; + /* This extra element is to get a proper shadow */ + content: ""; + position: absolute; + z-index: -1; + height: 100%; + width: 30px; + left: -30px; + transition: box-shadow 0.5s ease-in-out; } #noVNC_control_bar.noVNC_open::before { - box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); + box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); } .noVNC_right #noVNC_control_bar { - left: 100%; - border-radius: 10px 0 0 10px; + left: 100%; + border-radius: 12px 0 0 12px; } .noVNC_right #noVNC_control_bar.noVNC_open { - left: 0; + left: 0; } .noVNC_right #noVNC_control_bar::before { - visibility: hidden; + visibility: hidden; } #noVNC_control_bar_handle { - position: absolute; - left: -15px; - top: 0; - transform: translateY(35px); - width: calc(100% + 30px); - height: 50px; - z-index: -1; - cursor: pointer; - border-radius: 5px; - background-color: rgb(83, 99, 122); - background-image: url("../images/handle_bg.svg"); - background-repeat: no-repeat; - background-position: right; - box-shadow: 3px 3px 0px rgba(0, 0, 0, 0.5); + position: absolute; + left: -15px; + top: 0; + transform: translateY(35px); + width: calc(100% + 30px); + height: 50px; + z-index: -1; + cursor: pointer; + border-radius: 6px; + background-color: var(--novnc-darkblue); + background-image: url("../images/handle_bg.svg"); + background-repeat: no-repeat; + background-position: right; + box-shadow: 3px 3px 0px rgba(0, 0, 0, 0.5); } #noVNC_control_bar_handle:after { - content: ""; - transition: transform 0.5s ease-in-out; - background: url("../images/handle.svg"); - position: absolute; - top: 22px; /* (50px-6px)/2 */ - right: 5px; - width: 5px; - height: 6px; + content: ""; + transition: transform 0.5s ease-in-out; + background: url("../images/handle.svg"); + position: absolute; + top: 22px; /* (50px-6px)/2 */ + right: 5px; + width: 5px; + height: 6px; } #noVNC_control_bar.noVNC_open #noVNC_control_bar_handle:after { - transform: translateX(1px) rotate(180deg); + transform: translateX(1px) rotate(180deg); } :root:not(.noVNC_connected) #noVNC_control_bar_handle { - display: none; + display: none; } .noVNC_right #noVNC_control_bar_handle { - background-position: left; + background-position: left; } .noVNC_right #noVNC_control_bar_handle:after { - left: 5px; - right: 0; - transform: translateX(1px) rotate(180deg); + left: 5px; + right: 0; + transform: translateX(1px) rotate(180deg); } .noVNC_right #noVNC_control_bar.noVNC_open #noVNC_control_bar_handle:after { - transform: none; + transform: none; } /* Larger touch area for the handle, used when a touch screen is available */ #noVNC_control_bar_handle div { - position: absolute; - right: -35px; - top: 0; - width: 50px; - height: 100%; - display: none; + position: absolute; + right: -35px; + top: 0; + width: 50px; + height: 100%; + display: none; } @media (any-pointer: coarse) { - #noVNC_control_bar_handle div { - display: initial; - } + #noVNC_control_bar_handle div { + display: initial; + } } .noVNC_right #noVNC_control_bar_handle div { - left: -35px; - right: auto; + left: -35px; + right: auto; } #noVNC_control_bar > .noVNC_scroll { - max-height: 100vh; /* Chrome is buggy with 100% */ - overflow-x: hidden; - overflow-y: auto; - padding: 0 10px; + max-height: 100vh; /* Chrome is buggy with 100% */ + overflow-x: hidden; + overflow-y: auto; + padding: 0 10px; } #noVNC_control_bar > .noVNC_scroll > * { - display: block; - margin: 10px auto; + display: block; + margin: 10px auto; } /* Control bar hint */ #noVNC_hint_anchor { - position: fixed; - right: -50px; - left: auto; + position: fixed; + right: -50px; + left: auto; } #noVNC_control_bar_anchor.noVNC_right + #noVNC_hint_anchor { - left: -50px; - right: auto; + left: -50px; + right: auto; } #noVNC_control_bar_hint { - position: relative; - transform: scale(0); - width: 100px; - height: 50%; - max-height: 600px; + position: relative; + transform: scale(0); + width: 100px; + height: 50%; + max-height: 600px; - visibility: hidden; - opacity: 0; - transition: 0.2s ease-in-out; - background: transparent; - box-shadow: 0 0 10px black, inset 0 0 10px 10px rgba(110, 132, 163, 0.8); - border-radius: 10px; - transition-delay: 0s; + visibility: hidden; + opacity: 0; + transition: 0.2s ease-in-out; + background: transparent; + box-shadow: 0 0 10px black, inset 0 0 10px 10px var(--novnc-darkblue); + border-radius: 12px; + transition-delay: 0s; } #noVNC_control_bar_hint.noVNC_active { - visibility: visible; - opacity: 1; - transition-delay: 0.2s; - transform: scale(1); + visibility: visible; + opacity: 1; + transition-delay: 0.2s; + transform: scale(1); } #noVNC_control_bar_hint.noVNC_notransition { - transition: none !important; + transition: none !important; } /* Control bar buttons */ #noVNC_control_bar .noVNC_button { - padding: 4px 4px; - vertical-align: middle; - border:1px solid rgba(255, 255, 255, 0.2); - border-radius: 6px; - background-color: transparent; - background-image: unset; /* we don't want the gradiant from input.css */ + min-width: unset; + padding: 4px 4px; + vertical-align: middle; + border:1px solid rgba(255, 255, 255, 0.2); + border-radius: 6px; + background-color: transparent; } #noVNC_control_bar .noVNC_button.noVNC_selected { - border-color: rgba(0, 0, 0, 0.8); - background-color: rgba(0, 0, 0, 0.5); -} -#noVNC_control_bar .noVNC_button.noVNC_selected:not(:disabled):hover { - border-color: rgba(0, 0, 0, 0.4); - background-color: rgba(0, 0, 0, 0.2); -} -#noVNC_control_bar .noVNC_button:not(:disabled):hover { - background-color: rgba(255, 255, 255, 0.2); -} -#noVNC_control_bar .noVNC_button:not(:disabled):active { - padding-top: 5px; - padding-bottom: 3px; -} -#noVNC_control_bar .noVNC_button.noVNC_hidden { - display: none !important; -} - -/* Android browsers don't properly update hover state if touch events are - * intercepted, like they are when clicking on the remote screen. */ -@media (any-pointer: coarse) { - #noVNC_control_bar .noVNC_button:not(:disabled):hover { - background-color: transparent; - } - #noVNC_control_bar .noVNC_button.noVNC_selected:not(:disabled):hover { border-color: rgba(0, 0, 0, 0.8); background-color: rgba(0, 0, 0, 0.5); - } } - +#noVNC_control_bar .noVNC_button.noVNC_hidden { + display: none !important; +} /* Panels */ .noVNC_panel { - transform: translateX(25px); + transform: translateX(25px); - transition: 0.5s ease-in-out; + transition: 0.5s ease-in-out; - box-sizing: border-box; /* so max-width don't have to care about padding */ - max-width: calc(100vw - 75px - 25px); /* minus left and right margins */ - max-height: 100vh; /* Chrome is buggy with 100% */ - overflow-x: hidden; - overflow-y: auto; + box-sizing: border-box; /* so max-width don't have to care about padding */ + max-width: calc(100vw - 75px - 25px); /* minus left and right margins */ + max-height: 100vh; /* Chrome is buggy with 100% */ + overflow-x: hidden; + overflow-y: auto; - visibility: hidden; - opacity: 0; + visibility: hidden; + opacity: 0; - padding: 15px; + padding: 15px; - background: #fff; - border-radius: 10px; - color: #000; - border: 2px solid #E0E0E0; - box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); + background: #fff; + border-radius: 12px; + color: #000; + border: 2px solid #E0E0E0; + box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); } .noVNC_panel.noVNC_open { - visibility: visible; - opacity: 1; - transform: translateX(75px); + visibility: visible; + opacity: 1; + transform: translateX(75px); } .noVNC_right .noVNC_vcenter { - left: auto; - right: 0; + left: auto; + right: 0; } .noVNC_right .noVNC_panel { - transform: translateX(-25px); + transform: translateX(-25px); } .noVNC_right .noVNC_panel.noVNC_open { - transform: translateX(-75px); + transform: translateX(-75px); } .noVNC_panel > * { - display: block; - margin: 10px auto; + display: block; + margin: 10px auto; } .noVNC_panel > *:first-child { - margin-top: 0 !important; + margin-top: 0 !important; } .noVNC_panel > *:last-child { - margin-bottom: 0 !important; + margin-bottom: 0 !important; } .noVNC_panel hr { - border: none; - border-top: 1px solid rgb(192, 192, 192); + border: none; + border-top: 1px solid var(--novnc-lightgrey); + width: 100%; /*
inside a flexbox will otherwise be 0px wide */ } .noVNC_panel label { - display: block; - white-space: nowrap; - margin: 5px; + display: block; + white-space: nowrap; + margin: 5px; +} +@media (max-width: 540px) { + /* Allow wrapping on small screens */ + .noVNC_panel label { + white-space: unset; + } } .noVNC_panel li { - margin: 5px; + margin: 5px; +} + +.noVNC_panel button, +.noVNC_panel select, +.noVNC_panel textarea, +.noVNC_panel input:not([type=checkbox]):not([type=radio]) { + margin-left: 6px; + /* Prevent inputs in panels from being too wide */ + max-width: calc(100% - 6px - var(--input-xpadding) * 2); } .noVNC_panel .noVNC_heading { - background-color: rgb(110, 132, 163); - border-radius: 5px; - padding: 5px; - /* Compensate for padding in image */ - padding-right: 8px; - color: white; - font-size: 20px; - white-space: nowrap; + background-color: var(--novnc-blue); + border-radius: 6px; + padding: 5px 8px; + /* Compensate for padding in image */ + padding-right: 11px; + display: flex; + align-items: center; + gap: 6px; + color: white; + font-size: 20px; + font-weight: bold; + white-space: nowrap; } .noVNC_panel .noVNC_heading img { - vertical-align: bottom; + vertical-align: bottom; } -.noVNC_submit { - float: right; +.noVNC_panel form { + display: flex; + flex-direction: column; + gap: 12px +} + +.noVNC_panel .button_row { + margin-top: 10px; + display: flex; + gap: 10px; + justify-content: space-between; +} +.noVNC_panel .button_row *:only-child { + margin-left: auto; /* Align single buttons to the right */ } /* Expanders */ .noVNC_expander { - cursor: pointer; + cursor: pointer; } .noVNC_expander::before { - content: url("../images/expander.svg"); - display: inline-block; - margin-right: 5px; - transition: 0.2s ease-in-out; + content: url("../images/expander.svg"); + display: inline-block; + margin-right: 5px; + transition: 0.2s ease-in-out; } .noVNC_expander.noVNC_open::before { - transform: rotateZ(90deg); + transform: rotateZ(90deg); } .noVNC_expander ~ * { - margin: 5px; - margin-left: 10px; - padding: 5px; - background: rgba(0, 0, 0, 0.05); - border-radius: 5px; + margin: 5px; + margin-left: 10px; + padding: 5px; + background: rgba(0, 0, 0, 0.04); + border-radius: 6px; } .noVNC_expander:not(.noVNC_open) ~ * { - display: none; + display: none; } /* Control bar content */ #noVNC_control_bar .noVNC_logo { - font-size: 13px; + font-size: 13px; } .noVNC_logo + hr { @@ -546,356 +555,352 @@ html { } :root:not(.noVNC_connected) #noVNC_view_drag_button { - display: none; + display: none; } /* noVNC Touch Device only buttons */ :root:not(.noVNC_connected) #noVNC_mobile_buttons { - display: none; + display: none; } @media not all and (any-pointer: coarse) { - /* FIXME: The button for the virtual keyboard is the only button in this - group of "mobile buttons". It is bad to assume that no touch - devices have physical keyboards available. Hopefully we can get - a media query for this: - https://github.com/w3c/csswg-drafts/issues/3871 */ - :root.noVNC_connected #noVNC_mobile_buttons { - display: none; - } + /* FIXME: The button for the virtual keyboard is the only button in this + group of "mobile buttons". It is bad to assume that no touch + devices have physical keyboards available. Hopefully we can get + a media query for this: + https://github.com/w3c/csswg-drafts/issues/3871 */ + :root.noVNC_connected #noVNC_mobile_buttons { + display: none; + } } /* Extra manual keys */ :root:not(.noVNC_connected) #noVNC_toggle_extra_keys_button { - display: none; + display: none; } #noVNC_modifiers { - background-color: rgb(92, 92, 92); - border: none; - padding: 10px; + background-color: var(--novnc-darkgrey); + border: none; + padding: 10px; } /* Shutdown/Reboot */ :root:not(.noVNC_connected) #noVNC_power_button { - display: none; + display: none; } #noVNC_power { } #noVNC_power_buttons { - display: none; + display: none; } #noVNC_power input[type=button] { - width: 100%; + width: 100%; } /* Clipboard */ :root:not(.noVNC_connected) #noVNC_clipboard_button { - display: none; + display: none; } #noVNC_clipboard_text { - width: 360px; - min-width: 150px; - height: 160px; - min-height: 70px; + width: 360px; + min-width: 150px; + height: 160px; + min-height: 70px; - box-sizing: border-box; - max-width: 100%; - /* minus approximate height of title, height of subtitle, and margin */ - max-height: calc(100vh - 10em - 25px); + box-sizing: border-box; + max-width: 100%; + /* minus approximate height of title, height of subtitle, and margin */ + max-height: calc(100vh - 10em - 25px); } /* Settings */ #noVNC_settings { } #noVNC_settings ul { - list-style: none; - padding: 0px; + list-style: none; + padding: 0px; } #noVNC_setting_port { - width: 80px; + width: 80px; } #noVNC_setting_path { - width: 100px; + width: 100px; } /* Version */ .noVNC_version_wrapper { - font-size: small; + font-size: small; } .noVNC_version { - margin-left: 1rem; + margin-left: 1rem; } -/* Connection Controls */ +/* Connection controls */ :root:not(.noVNC_connected) #noVNC_disconnect_button { - display: none; + display: none; } /* ---------------------------------------- - * Status Dialog + * Status dialog * ---------------------------------------- */ #noVNC_status { - position: fixed; - top: 0; - left: 0; - width: 100%; - z-index: 100; - transform: translateY(-100%); + position: fixed; + top: 0; + left: 0; + width: 100%; + z-index: 100; + transform: translateY(-100%); - cursor: pointer; + cursor: pointer; - transition: 0.5s ease-in-out; + transition: 0.5s ease-in-out; - visibility: hidden; - opacity: 0; + visibility: hidden; + opacity: 0; - padding: 5px; + padding: 5px; - display: flex; - flex-direction: row; - justify-content: center; - align-content: center; + display: flex; + flex-direction: row; + justify-content: center; + align-content: center; - line-height: 1.6; - word-wrap: break-word; - color: #fff; + line-height: 1.6; + word-wrap: break-word; + color: #fff; - border-bottom: 1px solid rgba(0, 0, 0, 0.9); + border-bottom: 1px solid rgba(0, 0, 0, 0.9); } #noVNC_status.noVNC_open { - transform: translateY(0); - visibility: visible; - opacity: 1; + transform: translateY(0); + visibility: visible; + opacity: 1; } #noVNC_status::before { - content: ""; - display: inline-block; - width: 25px; - height: 25px; - margin-right: 5px; + content: ""; + display: inline-block; + width: 25px; + height: 25px; + margin-right: 5px; } #noVNC_status.noVNC_status_normal { - background: rgba(128,128,128,0.9); + background: rgba(128,128,128,0.9); } #noVNC_status.noVNC_status_normal::before { - content: url("../images/info.svg") " "; + content: url("../images/info.svg") " "; } #noVNC_status.noVNC_status_error { - background: rgba(200,55,55,0.9); + background: rgba(200,55,55,0.9); } #noVNC_status.noVNC_status_error::before { - content: url("../images/error.svg") " "; + content: url("../images/error.svg") " "; } #noVNC_status.noVNC_status_warn { - background: rgba(180,180,30,0.9); + background: rgba(180,180,30,0.9); } #noVNC_status.noVNC_status_warn::before { - content: url("../images/warning.svg") " "; + content: url("../images/warning.svg") " "; } /* ---------------------------------------- - * Connect Dialog + * Connect dialog * ---------------------------------------- */ #noVNC_connect_dlg { - transition: 0.5s ease-in-out; + transition: 0.5s ease-in-out; - transform: scale(0, 0); - visibility: hidden; - opacity: 0; + transform: scale(0, 0); + visibility: hidden; + opacity: 0; } #noVNC_connect_dlg.noVNC_open { - transform: scale(1, 1); - visibility: visible; - opacity: 1; + transform: scale(1, 1); + visibility: visible; + opacity: 1; } #noVNC_connect_dlg .noVNC_logo { - transition: 0.5s ease-in-out; - padding: 10px; - margin-bottom: 10px; + transition: 0.5s ease-in-out; + padding: 10px; + margin-bottom: 10px; - font-size: 80px; - text-align: center; + font-size: 80px; + text-align: center; - border-radius: 5px; + border-radius: 6px; } @media (max-width: 440px) { - #noVNC_connect_dlg { - max-width: calc(100vw - 100px); - } - #noVNC_connect_dlg .noVNC_logo { - font-size: calc(25vw - 30px); - } + #noVNC_connect_dlg { + max-width: calc(100vw - 100px); + } + #noVNC_connect_dlg .noVNC_logo { + font-size: calc(25vw - 30px); + } } #noVNC_connect_dlg div { - padding: 12px; + padding: 18px; - background-color: rgb(110, 132, 163); - border-radius: 12px; - text-align: center; - font-size: 20px; + background-color: var(--novnc-darkgrey); + border-radius: 12px; + text-align: center; + font-size: 20px; - box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); + box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); } #noVNC_connect_button { - width: 100%; - padding: 5px 30px; + width: 100%; + padding: 6px 30px; + cursor: pointer; + border-color: transparent; + border-radius: 12px; + background-color: var(--novnc-blue); + color: white; - cursor: pointer; - - border-color: rgb(83, 99, 122); - border-radius: 5px; - - background: linear-gradient(to top, rgb(110, 132, 163), rgb(99, 119, 147)); - color: white; - - /* This avoids it jumping around when :active */ - vertical-align: middle; -} -#noVNC_connect_button:hover { - background: linear-gradient(to top, rgb(110, 132, 163), rgb(105, 125, 155)); + display: flex; + justify-content: center; + place-items: center; + gap: 4px; } #noVNC_connect_button img { - vertical-align: bottom; - height: 1.3em; + vertical-align: bottom; + height: 1.3em; } /* ---------------------------------------- - * Server verification Dialog + * Server verification dialog * ---------------------------------------- */ #noVNC_verify_server_dlg { - position: relative; + position: relative; - transform: translateY(-50px); + transform: translateY(-50px); } #noVNC_verify_server_dlg.noVNC_open { - transform: translateY(0); + transform: translateY(0); } #noVNC_fingerprint_block { - margin: 10px; + margin: 10px; } /* ---------------------------------------- - * Password Dialog + * Password dialog * ---------------------------------------- */ #noVNC_credentials_dlg { - position: relative; + position: relative; - transform: translateY(-50px); + transform: translateY(-50px); } #noVNC_credentials_dlg.noVNC_open { - transform: translateY(0); + transform: translateY(0); } #noVNC_username_block.noVNC_hidden, #noVNC_password_block.noVNC_hidden { - display: none; + display: none; } /* ---------------------------------------- - * Main Area + * Main area * ---------------------------------------- */ /* Transition screen */ #noVNC_transition { - transition: 0.5s ease-in-out; + transition: 0.5s ease-in-out; - display: flex; - opacity: 0; - visibility: hidden; + display: flex; + opacity: 0; + visibility: hidden; - position: fixed; - top: 0; - left: 0; - bottom: 0; - right: 0; + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; - color: white; - background: rgba(0, 0, 0, 0.5); - z-index: 50; + color: white; + background: rgba(0, 0, 0, 0.5); + z-index: 50; - /*display: flex;*/ - align-items: center; - justify-content: center; - flex-direction: column; + /*display: flex;*/ + align-items: center; + justify-content: center; + flex-direction: column; } :root.noVNC_loading #noVNC_transition, :root.noVNC_connecting #noVNC_transition, :root.noVNC_disconnecting #noVNC_transition, :root.noVNC_reconnecting #noVNC_transition { - opacity: 1; - visibility: visible; + opacity: 1; + visibility: visible; } :root:not(.noVNC_reconnecting) #noVNC_cancel_reconnect_button { - display: none; + display: none; } #noVNC_transition_text { - font-size: 1.5em; + font-size: 1.5em; } /* Main container */ #noVNC_container { - width: 100%; - height: 100%; - background-color: #313131; - border-bottom-right-radius: 800px 600px; - /*border-top-left-radius: 800px 600px;*/ + width: 100%; + height: 100%; + background-color: #313131; + border-bottom-right-radius: 800px 600px; + /*border-top-left-radius: 800px 600px;*/ - /* If selection isn't disabled, long-pressing stuff in the sidebar - can accidentally select the container or the canvas. This can - happen when attempting to move the handle. */ - user-select: none; - -webkit-user-select: none; + /* If selection isn't disabled, long-pressing stuff in the sidebar + can accidentally select the container or the canvas. This can + happen when attempting to move the handle. */ + user-select: none; + -webkit-user-select: none; } #noVNC_keyboardinput { - width: 1px; - height: 1px; - background-color: #fff; - color: #fff; - border: 0; - position: absolute; - left: -40px; - z-index: -1; - ime-mode: disabled; + width: 1px; + height: 1px; + background-color: #fff; + color: #fff; + border: 0; + position: absolute; + left: -40px; + z-index: -1; + ime-mode: disabled; } /*Default noVNC logo.*/ /* From: http://fonts.googleapis.com/css?family=Orbitron:700 */ @font-face { - font-family: 'Orbitron'; - font-style: normal; - font-weight: 700; - src: local('?'), url('Orbitron700.woff') format('woff'), - url('Orbitron700.ttf') format('truetype'); + font-family: 'Orbitron'; + font-style: normal; + font-weight: 700; + src: local('?'), url('Orbitron700.woff') format('woff'), + url('Orbitron700.ttf') format('truetype'); } .noVNC_logo { - color:yellow; - font-family: 'Orbitron', 'OrbitronTTF', sans-serif; - line-height: 0.9; - text-shadow: 0.1em 0.1em 0 black; + color: var(--novnc-yellow); + font-family: 'Orbitron', 'OrbitronTTF', sans-serif; + line-height: 0.9; + text-shadow: 0.1em 0.1em 0 black; } .noVNC_logo span{ - color:green; + color: var(--novnc-green); } #noVNC_bell { - display: none; + display: none; } /* ---------------------------------------- @@ -904,19 +909,19 @@ html { */ @media screen and (max-width: 640px){ - #noVNC_logo { - font-size: 150px; - } + #noVNC_logo { + font-size: 150px; + } } @media screen and (min-width: 321px) and (max-width: 480px) { - #noVNC_logo { - font-size: 110px; - } + #noVNC_logo { + font-size: 110px; + } } @media screen and (max-width: 320px) { - #noVNC_logo { - font-size: 90px; - } + #noVNC_logo { + font-size: 90px; + } } diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/styles/constants.css b/emhttp/plugins/dynamix.vm.manager/novnc/app/styles/constants.css new file mode 100644 index 000000000..1123a3efc --- /dev/null +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/styles/constants.css @@ -0,0 +1,30 @@ +/* + * noVNC general CSS constant variables + * Copyright (C) 2025 The noVNC authors + * noVNC is licensed under the MPL 2.0 (see LICENSE.txt) + * This file is licensed under the 2-Clause BSD license (see LICENSE.txt). + */ + +/* ---------- COLORS ----------- */ + +:root { + --novnc-grey: rgb(128, 128, 128); + --novnc-lightgrey: rgb(192, 192, 192); + --novnc-darkgrey: rgb(92, 92, 92); + + /* Transparent to make button colors adapt to the background */ + --novnc-buttongrey: rgba(192, 192, 192, 0.5); + + --novnc-blue: rgb(110, 132, 163); + --novnc-lightblue: rgb(74, 144, 217); + --novnc-darkblue: rgb(83, 99, 122); + + --novnc-green: rgb(0, 128, 0); + --novnc-yellow: rgb(255, 255, 0); +} + +/* ------ MISC PROPERTIES ------ */ + +:root { + --input-xpadding: 1em; +} diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/app/styles/input.css b/emhttp/plugins/dynamix.vm.manager/novnc/app/styles/input.css index dc345aabc..8273d70ad 100644 --- a/emhttp/plugins/dynamix.vm.manager/novnc/app/styles/input.css +++ b/emhttp/plugins/dynamix.vm.manager/novnc/app/styles/input.css @@ -1,32 +1,170 @@ /* * noVNC general input element CSS - * Copyright (C) 2022 The noVNC Authors + * Copyright (C) 2025 The noVNC authors * noVNC is licensed under the MPL 2.0 (see LICENSE.txt) * This file is licensed under the 2-Clause BSD license (see LICENSE.txt). */ -/* - * Common for all inputs - */ -input, input::file-selector-button, button, select, textarea { - /* Respect standard font settings */ - font: inherit; +/* ------- SHARED BETWEEN INPUT ELEMENTS -------- */ - /* Disable default rendering */ - appearance: none; - background: none; +input, +textarea, +button, +select, +input::file-selector-button { + padding: 0.5em var(--input-xpadding); + border-radius: 6px; + appearance: none; + text-overflow: ellipsis; - padding: 5px; - border: 1px solid rgb(192, 192, 192); - border-radius: 5px; - color: black; - --bg-gradient: linear-gradient(to top, rgb(255, 255, 255) 80%, rgb(240, 240, 240)); - background-image: var(--bg-gradient); + /* Respect standard font settings */ + font: inherit; + line-height: 1.6; +} +input:disabled, +textarea:disabled, +button:disabled, +select:disabled, +label[disabled] { + opacity: 0.4; } -/* - * Buttons - */ +input:focus-visible, +textarea:focus-visible, +button:focus-visible, +select:focus-visible, +input:focus-visible::file-selector-button { + outline: 2px solid var(--novnc-lightblue); + outline-offset: 1px; +} + +/* ------- TEXT INPUT -------- */ + +input:not([type]), +input[type=date], +input[type=datetime-local], +input[type=email], +input[type=month], +input[type=number], +input[type=password], +input[type=search], +input[type=tel], +input[type=text], +input[type=time], +input[type=url], +input[type=week], +textarea { + border: 1px solid var(--novnc-lightgrey); + /* Account for borders on text inputs, buttons dont have borders */ + padding: calc(0.5em - 1px) var(--input-xpadding); +} +input:not([type]):focus-visible, +input[type=date]:focus-visible, +input[type=datetime-local]:focus-visible, +input[type=email]:focus-visible, +input[type=month]:focus-visible, +input[type=number]:focus-visible, +input[type=password]:focus-visible, +input[type=search]:focus-visible, +input[type=tel]:focus-visible, +input[type=text]:focus-visible, +input[type=time]:focus-visible, +input[type=url]:focus-visible, +input[type=week]:focus-visible, +textarea:focus-visible { + outline-offset: -1px; +} + +textarea { + margin: unset; /* Remove Firefox's built in margin */ + /* Prevent layout from shifting when scrollbars show */ + scrollbar-gutter: stable; + /* Make textareas show at minimum one line. This does not work when + using box-sizing border-box, in which case, vertical padding and + border width needs to be taken into account. */ + min-height: 1lh; + vertical-align: baseline; /* Firefox gives "text-bottom" by default */ +} + +/* ------- NUMBER PICKERS ------- */ + +/* We can't style the number spinner buttons: + https://github.com/w3c/csswg-drafts/issues/8777 */ +input[type=number]::-webkit-inner-spin-button, +input[type=number]::-webkit-outer-spin-button { + /* Get rid of increase/decrease buttons in WebKit */ + appearance: none; +} +input[type=number] { + /* Get rid of increase/decrease buttons in Firefox */ + appearance: textfield; +} + +/* ------- BUTTON ACTIVATIONS -------- */ + +/* A color overlay that depends on the activation level. The level can then be + set for different states on an element, for example hover and click on a + + + + + + +
+
+
+ Server identity +
+
+ The server has provided the following identifying information: +
+
+ Fingerprint: + +
+
+ Please verify that the information is correct and press + "Approve". Otherwise press "Reject". +
+
+ + +
+
+
+ + +
+
+
+ Credentials +
+
+ + +
+
+ + +
+
+ +
+
+
+ + +
+
+
+ +
+
+
+ + +
+ + +
+ + + + diff --git a/emhttp/plugins/dynamix.vm.manager/novnc/vnc_lite.html b/emhttp/plugins/dynamix.vm.manager/novnc/vnc_lite.html new file mode 100644 index 000000000..79d481460 --- /dev/null +++ b/emhttp/plugins/dynamix.vm.manager/novnc/vnc_lite.html @@ -0,0 +1,180 @@ + + + + + + noVNC + + + + + + + +
+
Loading
+
Send CtrlAltDel
+
+
+ +
+ + diff --git a/emhttp/plugins/dynamix.vm.manager/scripts/pcicheck.php b/emhttp/plugins/dynamix.vm.manager/scripts/pcicheck.php new file mode 100755 index 000000000..b8e116e45 --- /dev/null +++ b/emhttp/plugins/dynamix.vm.manager/scripts/pcicheck.php @@ -0,0 +1,37 @@ +#!/usr/bin/php + \ No newline at end of file diff --git a/emhttp/plugins/dynamix.vm.manager/templates/Custom.form.php b/emhttp/plugins/dynamix.vm.manager/templates/Custom.form.php index 3d3f0c5d5..5382cb95b 100644 --- a/emhttp/plugins/dynamix.vm.manager/templates/Custom.form.php +++ b/emhttp/plugins/dynamix.vm.manager/templates/Custom.form.php @@ -27,6 +27,7 @@ $arrValidMachineTypes = getValidMachineTypes(); $arrValidPCIDevices = getValidPCIDevices(); $arrValidGPUDevices = getValidGPUDevices(); $arrValidAudioDevices = getValidAudioDevices(); +$arrValidSoundCards = getValidSoundCards(); $arrValidOtherDevices = getValidOtherDevices(); $arrValidUSBDevices = getValidUSBDevices(); $arrValidDiskDrivers = getValidDiskDrivers(); @@ -556,16 +557,19 @@ if ($snapshots!=null && count($snapshots) && !$boolNew) {
1 ? 'checked' : 'checked disabled') : ''; + if ($is_intel_cpu && count($core_types) > 0) $core_type = "{$core_types[$cpu1]}"; else $core_type = ""; if (!$cpu2) { - echo ""; + echo ""; } else { - echo ""; + echo ""; $extra = ($arrConfig['domain']['vcpu'] && in_array($cpu2, $arrConfig['domain']['vcpu'])) ? ($arrConfig['domain']['vcpus'] > 1 ? 'checked' : 'checked disabled') : ''; - echo ""; + echo ""; } } ?> @@ -1442,6 +1446,7 @@ foreach ($arrConfig['shares'] as $i => $arrShare) { @@ -1467,6 +1472,7 @@ foreach ($arrConfig['shares'] as $i => $arrShare) { diff --git a/emhttp/plugins/dynamix.vm.manager/vnc.html b/emhttp/plugins/dynamix.vm.manager/vnc.html index edfe49b40..790871eb7 100644 --- a/emhttp/plugins/dynamix.vm.manager/vnc.html +++ b/emhttp/plugins/dynamix.vm.manager/vnc.html @@ -4,7 +4,7 @@ noVNC - - - - - - - - - - - - - - - - - - - - - - + - + @@ -63,6 +37,7 @@ + @@ -72,7 +47,56 @@ - + + @@ -85,7 +109,7 @@
- +
@@ -100,18 +124,18 @@ + title="Move/Drag viewport"> - +
+ id="noVNC_keyboard_button" class="noVNC_button" title="Show keyboard">
+ title="Show extra keys">
- + title="Full screen">
  • - +
  • - +

  • - +
  • - +

  • @@ -220,7 +256,11 @@
    WebSocket
    • - +
    • @@ -238,15 +278,23 @@

    • - +
    • - +

    • - +

    • @@ -267,7 +315,7 @@
- + @@ -282,7 +330,7 @@
- +
@@ -297,7 +345,7 @@
- +
@@ -307,21 +355,21 @@ The server has provided the following identifying information:
- Fingerprint: + Fingerprint:
Please verify that the information is correct and press "Approve". Otherwise press "Reject".
-
- - +
+ +
- +
@@ -335,17 +383,17 @@
-
- +
+
- +
- +
diff --git a/emhttp/plugins/dynamix/CPUvms.page b/emhttp/plugins/dynamix/CPUvms.page index 89e6e6f25..297ab883c 100644 --- a/emhttp/plugins/dynamix/CPUvms.page +++ b/emhttp/plugins/dynamix/CPUvms.page @@ -22,10 +22,12 @@ $cpus = cpu_list(); $total = count($cpus); $spinner = "
"; $cpuset = implode(';',$cpus); +$is_intel_cpu = is_intel_cpu(); +$core_types = $is_intel_cpu ? get_intel_core_types() : []; function create($type = "") { // create the table header. Make multiple rows when CPU cores are many ;) - global $total, $cpus; + global $total, $cpus, $is_intel_cpu, $core_types; $loop = floor(($total-1)/32) + 1; $text = []; for ($c = 0; $c < $loop; $c++) { @@ -39,8 +41,12 @@ function create($type = "") { } $label = implode('
', array_fill(0, $loop, 'CORES:' . ($cpu2 ? '
CORES:' : ''))); if ($type == "vm") echo "VCPUS"; + echo "$label" . implode(array_map(function($t) { - return "$t"; + global $is_intel_cpu, $core_types; + [$cpu1, $cpu2] = my_preg_split('/[,
]/',$t); + if ($is_intel_cpu && count($core_types) > 0) $core_type = "$core_types[$cpu1]"; else $core_type = ""; + return "$t"; }, $text)); } ?> @@ -175,7 +181,10 @@ function ct() { /* Inject thread to containers toggles */ if ($('a[onclick^="thread2containers"]').length === 0) { $('form[name=ct]').find('thead tr th:gt(1)').each((i, elem) => { - elem.innerHTML = elem.innerHTML.replace(/(\d+)/g, '$1'); + // Preserve the existing title if available + let existingTitle = elem.title || ""; + let newTitle = existingTitle ? existingTitle + " _(Toggle thread to containers)_" : "_(Toggle thread to containers)_"; + elem.innerHTML = elem.innerHTML.replace(/(\d+)/g, '$1'); }); } }); diff --git a/emhttp/plugins/dynamix/DashStats.page b/emhttp/plugins/dynamix/DashStats.page index cee8947d6..032a7d72b 100644 --- a/emhttp/plugins/dynamix/DashStats.page +++ b/emhttp/plugins/dynamix/DashStats.page @@ -14,19 +14,6 @@ Nchan="wg_poller,update_1,update_2,update_3,ups_status:stop,vm_dashusage" */ ?> /dev/null &"); +$themeHelper->updateDockerLogColor($docroot); // $themeHelper set in DefaultPageLayout.php exec("/etc/rc.d/rc.docker status >/dev/null",$dummy,$dockerd); exec("/etc/rc.d/rc.libvirt status >/dev/null",$dummy,$libvirtd); @@ -160,6 +146,7 @@ $bios = $bios['Vendor'].(isset($bios['Version']) ? ", "._("Version")." ".$bi $cpu = dmidecode('Processor Information','4',0); $cpumodel = str_ireplace(["Processor","(C)","(R)","(TM)"],["","©","®","™"],exec("grep -Pom1 '^model name\s+:\s*\K.+' /proc/cpuinfo") ?: $cpu['Version']); $cpumodel .= (strpos($cpumodel,'@')===false && !empty($cpu['Current Speed']) ? " @ {$cpu['Current Speed']}" : ""); +$cpu_vendor = $cpu['Manufacturer'] ?? ""; $total = exec("awk '/^MemTotal/{print $2*1024}' /proc/meminfo"); unset($ports); exec("ls --indicator-style=none /sys/class/net|grep -Po '^(bond|eth|wlan)\d+$'",$ports); @@ -200,7 +187,7 @@ $ramsize = my_scale($total,$unit,0,-1,1024)." $unit"; $low = $memory_maximum < $memory_installed; if ($low) $memory_maximum = pow(2,ceil(log($memory_installed)/log(2))); -switch ($theme) { +switch ($themeHelper->getThemeName()) { // $themeHelper set in DefaultPageLayout.php case 'white': $color = '#1c1b1b'; $grid = '#e3e3e3'; $c0 = '#a8a8a8'; $c1 = '#dcdcdc'; break; case 'black': $color = '#f2f2f2'; $grid = '#2b2b2b'; $c0 = '#787878'; $c1 = '#444444'; break; case 'azure': $color = '#606e7f'; $grid = '#f3f0f4'; $c0 = '#606e7f'; $c1 = '#eceaec'; break; @@ -263,6 +250,10 @@ switch ($theme) {

+
_(Processor)_
@@ -280,14 +271,16 @@ switch ($theme) { + "; + if ($is_intel_cpu && count($core_types) > 0) $core_type = "({$core_types[$cpu1]})"; else $core_type = ""; if ($cpu2) - echo "CPU $cpu1 - HT $cpu20%
0%
"; + echo "CPU $cpu1 $core_type - HT $cpu2 0%
0%
"; else - echo "CPU $cpu10%
"; + echo "CPU $cpu1 $core_type0%
"; echo ""; } ?> @@ -1563,7 +1556,7 @@ var sortableHelper = function(e,ui){ function LockButton() { if ($.cookie('lockbutton') == null) { $.cookie('lockbutton','lockbutton'); - +isTopNavTheme()):?> $('div.nav-item.LockButton a').prop('title',"_(Lock sortable items)_"); $('div.nav-item.LockButton b').removeClass('icon-u-lock green-text').addClass('icon-u-lock-open red-text'); @@ -1595,7 +1588,7 @@ function LockButton() { }}); } else { $.removeCookie('lockbutton'); - +isTopNavTheme()):?> $('div.nav-item.LockButton a').prop('title',"_(Unlock sortable items)_"); $('div.nav-item.LockButton b').removeClass('icon-u-lock-open red-text').addClass('icon-u-lock green-text'); diff --git a/emhttp/plugins/dynamix/DisplaySettings.page b/emhttp/plugins/dynamix/DisplaySettings.page index e15b0bb31..5738ba549 100644 --- a/emhttp/plugins/dynamix/DisplaySettings.page +++ b/emhttp/plugins/dynamix/DisplaySettings.page @@ -3,7 +3,7 @@ Title="Display Settings" Icon="icon-display" Tag="desktop" --- - -"; $icon = ""; $plugins = '/var/log/plugins'; @@ -129,8 +129,8 @@ $(function() { _(Display width)_: : :display_width_help: @@ -148,124 +148,123 @@ _(Language)_: _(Font size)_: : :display_font_size_help: _(Terminal font size)_: : :display_tty_size_help: _(Number format)_: : _(Number scaling)_: : _(Page view)_: : :display_page_view_help: _(Placement of Users menu)_: : :display_users_menu_help: _(Listing height)_: : :display_listing_height_help: _(Display device name)_: : _(Display world-wide-name in device ID)_: : :display_wwn_device_id_help: _(Display array totals)_: : _(Show array utilization indicator)_: : _(Temperature unit)_: : :display_temperature_unit_help: _(Dynamix color theme)_: : _(Used / Free columns)_: : _(Header custom text color)_: @@ -283,14 +282,14 @@ _(Header custom background color)_: _(Header show description)_: : _(Show banner)_: :