GNOME s lepší podporou fotek, KDE s obrazem v obraze pro Wayland

15. 6. 2025
Doba čtení: 5 minut

Sdílet

Radeon HD 2900 XT
Autor: F2FTech, podle licence: CC BY-SA 4.0
Radeon HD 2900 XT
Specifikace PCI Express 7.0 je hotova, Beta verze LibreOffice 25.8 ukazuje novinky a rychlejší běh s OOXML soubory, vývojová verze Wine 10.10 opravuje nejen 16 let starou chybu.

Týden v GNOME #204: nejen grafická knihovna Glycin

Dvěstěčtvrté shrnutí novinek projektu GNOME informuje o novinkách za období 6. až 13. června 2025. Adrian Vovk oznamuje to, o čem už si štěbetají vrabci i zprávičky na našem webu delší dobu: GNOME opouští podporu běhu na X11 / X.Org a přechází plně na Wayland, s podporou běhu X11 aplikací skrze XWayland. V tuto chvíli je v projektu sestavování s podporou X11 už vypnuté a věc je zevrubně testována a laděna pro budoucí GNOME 49, jehož raná alfa verze byla vydána. Dle zpětné vazby budou práce pokračovat, více v blogpostu Jordana Petridise.

Adrian dále připomíná, že samotné komponenty GNOME jako GDM či gnome-session jsou aktivně modernizovány tak, že bude zvýšena jejich závislost na systemd. Důležité je, aby s tímto zavčasu počítali vývojáři, kterým je k dispozici soupis potřebných informací na jeho blogu.

Za mě největší peckou zmíněnou v tomto týdnu, je nová knihovna pro zobrazování obrázků, a tedy i fotek. Stávající GdkPixbuf je v GNOME čtvrt století a kromě chybějící podpory řady formátů (mj. z hlediska náhledů v Souborech) jí schází i zohlednění barevných profilů apod.Glycin naproti tomu umí vše, včetně věrnosti barevného podání, automatické rotace dle EXIF, škálování a podpory více formátů. Psán je v Rustu, čili současně sandboxován a zabezpečen, což se hodí v situacích, kdy je například zjištěna díra ve WebP. Osobně toto velmi vítám, protože těch nekonzistencí v barevném podání snímku mezi různými aplikacemi a náhledy si v Linuxu / GNOME všímám často a dost mi to vadí. Podrobnější čtení k tématu Sophie Herold na svém blogu.

Z projektů třetích stran je zmíněn nástroj pro screenshoty Gradia, nástroj pro posílání souborů s Android zařízeními Packet či Bouncer pro firewall na bezdrátových spojeních.

Týden v KDE: experimentální podpora Wayland PiP v Plasmě 6.5.0

Jedinou pořádnou novinku stihli za uplynulý týden připravit vývojáři desktopového prostředí KDE, ale stojí za to. Prozatím v experimentální kvalitě implementuje vývojová verze Plasmy, z níž vzejde vydání 6.5.0, podporu Wayland protokolu picture-in-picture  – ten mohou aplikace (jako třeba Firefox) využívat pro tento typ zobrazení.

Z vylepšení UI došlo na jednu věc kolem přístupnosti (visuální zvonek) pro Plasmu 6.3.6, jednu pro Plasmu 6.4.0 (úprava widgetu aplikačního menu v Kickeru), dvě pro Plasmu 6.4.1 (vylepšený kontrast popisku titulků, ořezávání prázdných znaků ve vyhledávání v Discoveru), zbytek změn pak už míří do budoucí Plasmy 6.5.0.

Některé úpravy řeší třeba efekt Background Contrast v KWin , upravují chování na Waylandu. Je zde také novinka pro Spectacle – jasnější ukončení nahrávání obrazovky stejnou klávesovou zkratkou, jakou bylo počato. Nastavení displejů si konečně nemyslí, že primární obrazovkou je vždy integrovaný displej (v notebooku), používá obecnější terminologii.

Opraveno je několik chyb, včetně některých týkajících se Flatpaků, například chyba způsobující u Flatpakových verzí webových prohlížečů, že dialogy otevření/ukládání nepovolí zobrazit část s náhledy souborů. Pár oprav pak míří i do Frameworks 6.15 a Frameworks 6.16. Oproti minulému týdnu se nemění počet tří chyb s vysokou prioritou, z 21 na 23 vzrostl počet chyb, které uživatel typicky v Plasmě potká během pár minut.

Podrobnosti v tradičním shrnutí na blogu KDE z pera Nate Grahama.

Vývojová verze Wine 10.10

Projekt Wine má za sebou vydání další verze vývojové řady 10. Mezi novinkami přináší aktualizovanou verzi Mono engine 10.1.0 a schopnost obejít se bez knihovny OSMesa (Mesa knihovna pro Off-screen Rendering), lepší podporu pro generování Windows Runtime metadat v WIDL, aktualizaci pro Unicode CLDR 47 či podporu formátu P010 v Media Foundation. 

Opraveno je 38 chyb, kdy nejstarší si počkala od března 2009, ta s jepičím životem tentokrát žila jen dva dny.

Beta verze LibreOffice 25.8

LibreOffice 25.8 má ještě řadu týdnů do vydání, v rámci testování nově vydané beta verze ale již lze okusit chystané novinky. Nový Writer kupříkladu ukazuje rychlejší načítání souborů DOCX, Calc pak totéž pro XLSX. V Calcu je k dispozici řada nových funkcí: CHOOSECOLS, CHOOSEROWS, DROP, EXPAND, HSTACK, TAKE, TEXTAFTER, TEXTBEFORE, TEXTSPLIT, TOCOL, TOROW, VSTACK, WRAPCOLS a WRAPROWS (všechny připravil Xisco Faulí z The Document Foundation). 

Writer dostal podporu vkládání zalomení odstavce před tabulkami. Je zde klávesová zkratka Ctrl + Shift + F2 pro konverzi polí do plain textu. Importovat lze šifrovaný hybridní PDF, různých vylepšení doznala kontrola pravopisu a tezaurus. Naopak z projektu mizí podpora Microsoft Windows 7 and Windows 8/8.1 a za zastaralé jsou označeny buildy pro 32bit Windows. Všechny podrobnosti o nové verzi shrnuje záznam na Wiki projektu.

OpenGL 4.6 pro stařičké Radeony generací Evergreen a Cayman

Radeony HD 5000 (40nm Evergreen / Terascale2) z roku 2009 a HD 6900 (40nm Cayman / Terascale3) z roku 2010 nově mají v rámci Mesa k dispozici podporu OpenGL 4.6, a to s Gallium3D ovladačem Radeon R600g. Jde opět o práci „srdcaře“, samostatného vývojáře jménem Patrick Lerda, kterému tímto patří dík. Ovladač dále implementuje některé opravy, každopádně lze nyní konstatovat, že R600g přináší podporu OpenGL 4.6 pro Radeony od HD 2000 po HD 6000.

prace_s_linuxem_tip

Specifikace PCI Express 7.0 je hotova

Zatímco do PC světa konečně probublala obecně používaná sběrnice PCI Express 5.0 pro GPU i SSD, PCI-SIG už vydává specifikaci verze 7.0. Dochází k již tradiční míře zrychlení, kdy je nově dosahováno 128 GT/s na jedné lince, tedy 512 GB/s pro ×16 slot při obousměrné komunikaci. Použito je PAM4 signálu, vylepšena energetická efektivita rozhraní, a to vše při zachování zpětné kompatibility až po původní verzi rozhraní.

PCI-SIG dále oznamuje tzv. PCIe Optical Interconnect Solution, tedy specifikaci nového optického rozhraní , stavějící na verzích PCIe 6.4 a PCIe 7.0, které bude schopna propojovat, samozřejmě přes optická vlákna. Připomeňme, že úplně původně se před mnoha a mnoha lety hovořilo o tom, že „po metalice“ nepůjde přenášet data tak rychle, takže už PCI Express 4.0 mělo být optické. Nakonec se tak nestalo, ale optické řešení se nyní rodí v jiné podobě, s předpokladem využití pro propojování serverových racků, včetně podpory multiplexování a dalších věcí.

Autor článku

Příznivec open-source rád píšící i o ne-IT tématech. Odpůrce softwarových patentů a omezování občanských svobod ve prospěch korporací.

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }