V programovacím jazyce Go naprogramovaná webová aplikace pro spolupráci na zdrojových kódech pomocí gitu Gitea (Wikipedie) byla vydána v nové verzi 1.26.0. Přehled novinek v příspěvku na blogu.
Ve středu 29. dubna 2026 se v pražské kanceláři SUSE v Karlíně uskuteční 7. Mobile Linux Hackday, komunitní setkání zaměřené na Linux na mobilních zařízeních, kernelový vývoj i uživatelský prostor. Akce proběhne od 10:00 do večerních hodin. Hackday je určen všem zájemcům o praktickou práci s Linuxem na telefonech. Zaměří se na vývoj aplikací v userspace, například bankovní aplikace, zpracování obrazu z kamery nebo práci s NFC, i na úpravy
… více »LilyPond (Wikipedie) , tj. multiplatformní svobodný software určený pro sazbu notových zápisů, byl vydán ve verzi 2.26.0. Přehled novinek v aktualizované dokumentaci.
Byla vydána nová verze 11.0.0 otevřeného emulátoru procesorů a virtualizačního nástroje QEMU (Wikipedie). Přispělo 237 vývojářů. Provedeno bylo více než 2 500 commitů. Přehled úprav a nových vlastností v seznamu změn.
Společnost SpaceX amerického miliardáře Elona Muska oznámila, že si zajistila opci buď na akvizici startupu Cursor za 60 miliard dolarů (přes 1,2 bilionu Kč) do konce letošního roku, nebo na zaplacení deseti miliard dolarů za nové partnerství s touto firmou zabývající se generováním kódů. SpaceX se dále prosazuje na lukrativním trhu s vývojářskými nástroji pro umělou inteligenci (AI). Cursor, startup zabývající se prodejem modelů AI pro
… více »Díky AI modelu Claude Mythos Preview od společnost Anthropic bylo ve Firefoxu nalezeno a opraveno 271 zranitelností.
Byla vydána nová verze 2.54.0 distribuovaného systému správy verzí Git. Přispělo 137 vývojářů, z toho 66 nových. Přehled novinek v příspěvku na blogu GitHubu a v poznámkách k vydání.
Grafana (Wikipedie), tj. open source nástroj pro vizualizaci různých metrik a s ní související dotazování, upozorňování a lepší porozumění, byla vydána ve verzi 13.0. Přehled novinek v aktualizované dokumentaci a na YouTube. Stalo se tak na konferenci GrafanaCON 2026.
Na YouTube proběhl Framework [ Next Gen ] Event 2026. Společnost Framework představila nový Framework Laptop 13 Pro, vylepšení Framework Laptopu 16 a OCuLink Dev Kit pro připojení vysoce výkonných periferií jako jsou eGPU a bezdrátovou klávesnici s integrovaným touchpadem Framework Wireless Touchpad Keyboard.
Byl vydán Mozilla Firefox 150.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 150 bude brzy k dispozici také na Flathubu a Snapcraftu.
Protože už delší dobu dělám v PHPku, tak jsem se rozhodnul, že bych zkusil i něco jiného třeba v Pythonu, nebo C.
Chtěl bych si naprogramovat daemona powersave(v případě úspěchu bych ho samozřejmě zveřejnil), který by kontroloval aktivitu myši a klávesnice, prostě nějak jako fungujou gnome-power-manager, nebo kpowersave, aby po určité době něčinnosti spustil skript na uspani PC.
Tyto dva nástroje nepoužívám, protože si nechci na Gentoo instalovat gnome, nebo KDE knihovny. Takze jsem se rozhodnul napsat něco vlastního, ale nevím od čeho se mám odpíchnout, jestli existují nějaké funkce, na zjištění aktivity uživatele, jestli to jde nějak zjistit.
Neaktivitu uživatele lze zjistit např. pomocí fce XScreenSaverQueryInfo, tady máš ukázku v Pythonu, která využívá přímo C knihovny libX11.so a libXss.so.1 (tz. je z toho vidět i jak by se to dělalo přímo v C), get X idle time with python:
#!/usr/bin/python
import ctypes, os
class XScreenSaverInfo(ctypes.Structure):
""" typedef struct { ... } XScreenSaverInfo; """
_fields_ = [('window', ctypes.c_ulong), # screen saver window
('state', ctypes.c_int), # off,on,disabled
('kind', ctypes.c_int), # blanked,internal,external
('since', ctypes.c_ulong), # milliseconds
('idle', ctypes.c_ulong), # milliseconds
('event_mask', ctypes.c_ulong)] # events
class XScreenSaverSession(object):
def __init__( self):
self.xlib = ctypes.cdll.LoadLibrary( 'libX11.so')
self.dpy = self.xlib.XOpenDisplay( os.environ['DISPLAY'])
if not self.dpy:
raise Exception('Cannot open display')
self.root = self.xlib.XDefaultRootWindow( self.dpy)
self.xss = ctypes.cdll.LoadLibrary( 'libXss.so.1')
self.xss.XScreenSaverAllocInfo.restype = ctypes.POINTER(XScreenSaverInfo)
self.xss_info = self.xss.XScreenSaverAllocInfo()
def get_idle( self):
self.xss.XScreenSaverQueryInfo( self.dpy, self.root, self.xss_info)
return self.xss_info.contents.idle / 1000
if __name__ == "__main__":
s = XScreenSaverSession()
print s.get_idle()
Ovšem získanou hodnotu musíš ještě dále zpracovat kvůli chybě v X serveru, viz kpowersave/src/inactivity.cpp:
/*!
* This function workaround a fucking XServer idleTime bug in the
* XScreenSaverExtension, if dpms is running. In this case always the
* current dpms-state time is extracted from the current idletime.
* This mean: XScreenSaverInfo->idle is not the time since the last
* user activity, as descriped in the header file of the extension.
* This result in SUSE bug # and sf.net bug #
*
* Workaround: check if if XServer is in a dpms state, check the
* current timeout for this state and add this value to
* the current idle time and return.
*
* \param _idleTime a unsigned long value with the current ideletime fromm
* XScreenSaverInfo->idle
* \return a unsigned long with the corrected idletime
*/
unsigned long inactivity::workaroundCreepyXServer( unsigned long _idleTime ){
kdDebugFuncOut(trace);
int dummy;
CARD16 standby, suspend, off;
CARD16 state;
BOOL onoff;
Display *dpy = qt_xdisplay();
kdDebug() << "Current idleTime: " << _idleTime << endl;
if (DPMSQueryExtension(dpy, &dummy, &dummy)) {
if (DPMSCapable(dpy)) {
DPMSGetTimeouts(dpy, &standby, &suspend, &off);
DPMSInfo(dpy, &state, &onoff);
if (onoff) {
switch (state) {
case DPMSModeStandby:
kdDebug() << "DPMS enabled. Monitor in Standby. Standby: "
<< standby << " sec" << endl;
// this check is a littlebit paranoid, but be sure
if (_idleTime < (unsigned) (standby * 1000))
_idleTime += (standby * 1000);
break;
case DPMSModeSuspend:
kdDebug() << "DPMS enabled. Monitor in Suspend. Suspend: "
<< suspend << " sec" << endl;
if (_idleTime < (unsigned) ((suspend + standby) * 1000))
_idleTime += ((suspend + standby) * 1000);
break;
case DPMSModeOff:
kdDebug() << "DPMS enabled. Monitor is Off. Off: "
<< off << " sec" << endl;
if (_idleTime < (unsigned) ((off + suspend + standby) * 1000))
_idleTime += ((off + suspend + standby) * 1000);
break;
case DPMSModeOn:
default:
break;
}
}
}
}
kdDebug() << "Corrected idleTime: " << _idleTime << endl;
kdDebugFuncOut(trace);
return _idleTime;
}
def get_idle_worlkaround(self):
dpms=ctypes.cdll.LoadLibrary('libXext.so');
if dpms.DPMSQueryExtension(self.dpy,None,None):
if dpms.DPMSCapable(self.dpy)==1:
standby=suspend=off=state=0;
onoff=False;
dpms.DPMSGetTimeouts(self.dpy,standby,suspend,off);
dpms.DPMSInfo(self.dpy,state,onoff);
print "STATE";
print state;
Co dělám špatně?
Tiskni
Sdílej: