Fedora zve na dvoudenní testování (2. a 3. prosince), během kterého si můžete vyzkoušet nové webové uživatelské rozhraní (WebUI) projektu FreeIPA. Pomozte vychytat veškeré chyby a vylepšit uživatelskou zkušenost ještě předtím, než se tato verze dostane k uživatelům Fedory a celého linuxového ekosystému.
Eben Upton oznámil zdražení počítačů Raspberry Pi, kvůli růstu cen pamětí, a představil 1GB verzi Raspberry Pi 5 za 45 dolarů.
Linus Torvalds na YouTube kanálu Linus Tech Tips staví dokonalý linuxový počítač.
Po 9 týdnech vývoje od vydání Linuxu 6.17 oznámil Linus Torvalds vydání Linuxu 6.18. Přehled novinek a vylepšení na LWN.net: první a druhá polovina začleňovacího okna a Linux Kernel Newbies. Vypíchnout lze například podporu protokolu PSP (PSP Security Protocol, PSP encryption of TCP connections).
Byla vydána nová stabilní verze 25.11 linuxové distribuce NixOS (Wikipedie). Její kódové označení je Xantusia. Podrobný přehled novinek v poznámkách k vydání. O balíčky se v NixOS stará správce balíčků Nix.
Richard Hughes na Mastodonu oznámil, že se společnost Framework Computer stala sponzorem služby LVFS (Linux Vendor Firmware Service) umožňující aktualizovat firmware zařízení na počítačích s Linuxem.
Jak na webu co nejšíleněji zadávat datum? Jak to uživatelům co nejvíce znepříjemnit? V Bad UX World Cup 2025 (YouTube) se vybíraly ty nejšílenější UX návrhy. Vítězným návrhem se stal Perfect Date.
Společnost Collabora vydala (YouTube) na LibreOffice založený desktopový kancelářský balík Collabora Office. Pro Windows, macOS a Linux. Se stejným uživatelským rozhraním jako Collabora Online. Svůj desktopový kancelářský balík s rozhraním LibreOffice pojmenovala Collabora Office Classic.
Glen MacArthur vydal AV Linux (AVL) a MX Moksha (MXM) 25. S linuxovým jádrem Liquorix. AV Linux (Wikipedie) je linuxová distribuce optimalizována pro tvůrce audio a video obsahu. Nejnovější AV Linux vychází z MX Linuxu 25 a Debianu 13 Trixie. AV Linux přichází s desktopovým prostředím Enlightenment 0.27.1 a MX Moksha s prostředím Moksha 0.4.1 (fork Enlightenmentu).
Ubuntu pro testování nových verzí vydává měsíční snapshoty. Dnes vyšel 1. snapshot Ubuntu 26.04 LTS (Resolute Raccoon).
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: