Byla vydána verze 7.0 open source platformy pro správu vlastního cloudu OpenNebula (Wikipedie). Kódový název nové verze je Phoenix. Přehled novinek v poznámkách k vydání v aktualizované dokumentaci.
E-mailový klient Thunderbird byl vydán ve verzi 140.0 ESR „Eclipse“. Jde o vydání s dlouhodobou podporou, shrnující novinky v upozorněních, vzhledu, správě složek a správě účtů. Pozor, nezaměňovat s průběžným vydáním 140.0, které bylo dostupné o týden dříve.
Organizace Video Games Europe reprezentující vydavatele počítačových her publikovala prohlášení k občanské iniciativě Stop Destroying Videogames.
Společnost Raspberry Pi nově nabzí Raspberry Pi Camera Module 3 Sensor Assembly, tj. samostatné senzorové moduly z Raspberry Pi Camera Module 3.
Cathode Ray Dude v novém videu ukazuje autorádio Empeg Car (později Rio Car) z let 1999–2001. Šlo o jeden z prvních přehrávačů MP3 do auta. Běží na něm Linux. Vyrobeno bylo jen asi pět tisíc kusů, ale zůstala kolem nich živá komunita, viz např. web riocar.org.
Open source platforma Home Assistant (Demo, GitHub, Wikipedie) pro monitorování a řízení inteligentní domácnosti byla vydána v nové verzi 2025.7.
Wayland byl vydán ve verzi 1.24.0. Jde o menší vydání po více než roce. Více funkcionality bývá přidáváno v průběžných vydáních Wayland Protocols.
Textový editor Geany byl vydán ve verzi 2.1. Jde o udržovací vydání po bezmála dvou letech. Obsahuje drobná vylepšení vyhledávání, aktualizace podpory zvýrazňování syntaxe a dále převážně opravy chyb.
Byly zveřejněny videozáznamy, dostupné také s prezentacemi přímo z programu, a také fotogalerie z open source komunitní konference DevConf.CZ 2025 konané od 12. do 14. června v Brně.
Navigace se soukromím CoMaps postavena nad OpenStreetMap je nově k dispozici v Google Play, App Store i F-Droid. Jedná se o komunitní fork aplikace Organic Maps.
void EventPumpX11::waitForWork() { UISystemX11* uiSystem = UI_SYSTEM(); int fd = uiSystem->_fd; int fdSize = fd + 1; fd_set fdSet; struct timeval tval; FD_ZERO(&fdSet); FD_SET(fd, &fdSet); TimeDelta delay = _delayedWorkTime - Time::now(); if (delay > TimeDelta()) { // Go to sleep. X11 will wake us to process X events. We also set interval // to wake up if there are planned tasks to specific time (Timers). int64_t udelay = delay.inMicroseconds(); tval.tv_sec = (int)(udelay / 1000000); tval.tv_usec = (int)(udelay % 1000000); if (tval.tv_usec <= 100) tval.tv_usec = 100; int ret = ::select(fdSize, &fdSet, NULL, NULL, &tval); // TODO: Check for select result } else { // It looks like delayedWorkTime indicates a time in the past, so we // need to call doDelayedWork now. _delayedWorkTime = Time(); } }kde fd je deskriptor, který jsem obdržel pomocí ConnectionNumber(Display*) (Xlib). O co mi jde, potřeboval bych probudit event loop, když chci z jiného vlákna poslat událost do toho hlavního, které čeká buď na událost z X11 nebo na vypršení časového limitu potřebného pro jiné úkoly (delay). Myslím, že správná cesta bude vytvořit vlastní file descriptor, na který pošlu 1 byte v případě, že budu chtít probudit event loop, ale nějak nevím jak přesně na to (toto jsem ještě nikdy nedělal). Použít fd_set a do masky dát vlastní fd? Stačí mi nakopnutí správným směrem ;)
void EventPumpX11::waitForWork() { UISystemX11* uiSystem = UI_SYSTEM(); int fd = uiSystem->_fd; int fdSize = fog_max(fd, uiSystem->_wakeUpPipe[0]) + 1; fd_set fdSet; struct timeval tval; struct timeval* ptval = NULL; FD_ZERO(&fdSet); FD_SET(fd, &fdSet); FD_SET(uiSystem->_wakeUpPipe[0], &fdSet); if (_delayedWorkTime.isNull()) { // There are no scheduled tasks, so ptval is NULL and this tells to select() // that it should wait infitine time. } else { TimeDelta delay = _delayedWorkTime - Time::now(); if (delay > TimeDelta()) { // Go to sleep. X11 will wake us to process X events and we also set // interval to wake up to run planned tasks (usually Timers). int64_t udelay = delay.inMicroseconds(); tval.tv_sec = (int)(udelay / 1000000); tval.tv_usec = (int)(udelay % 1000000); if (tval.tv_usec <= 100) tval.tv_usec = 100; ptval = &tval; } else { // It looks like delayedWorkTime indicates a time in the past, so we // need to call doDelayedWork now. _delayedWorkTime = Time(); return; } } int ret = ::select(fdSize, &fdSet, NULL, NULL, ptval); if (ret < 0) { fog_debug("Fog::EventPumpX11::waitForWork() - select() failed (errno=%d).", errno); } if (ret > 0) { if (FD_ISSET(uiSystem->_wakeUpPipe[0], &fdSet)) { // Dummy c, the actual value is out of our interest. uint8_t c; read(uiSystem->_wakeUpPipe[0], &c, 1); _wakeUpSent.cmpXchg(1, 0); } } }a Kód pro probuzen9 z jiiného vlákna vypadá takto:
void EventPumpX11::sendWakeUp() { if (_wakeUpSent.cmpXchg(0, 1)) { UISystemX11* uiSystem = UI_SYSTEM(); uint8_t c = 'W'; write(uiSystem->_wakeUpPipe[1], &c, 1); } }požil jsem atomické operace k tomu, abych do pipe neposílal příliš moc, teď tam je normálně jen ten 1 BYTE, který probudí select. Funguje to, ale samořejmě to může obsahovat chyby (zase tak moc jsem to neotestoval)... Ke kompletnosti ještě vytvoření pipe:
// Create wakeup pipe. if (pipe(_wakeUpPipe) < 0) { fog_debug("Fog::UISystemX11::Can't create wakeup pipe"); goto fail; }K zápisu používám _wakeUpPipe[1] a ke čtení _wakeUpPipe[0], doufám, že jsem to pochopil správně...:)
Tiskni
Sdílej: