Radicle, distribuovaná alternativa k softwaru pro spolupráci jako např. GitLab, byl vydán ve verzi 1.0. Nyní obsahuje nad gitem postavený, rozšiřitelný protokol pro diskuze a nakládání s patchi, autentizaci a autorizaci, integraci Toru a uživatelské rozhraní v příkazovém řádku či jednoduché webové rozhraní pro prohlížení repozitářů. Projekt byl dříve představen a diskutován na Linux Weekly News.
Byla vydána nová verze 6.7 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Přehled změn v příslušném seznamu. Tor Browser byl povýšen na verzi 13.5.3. Thunderbird na verzi 115.15.0. OnionShare z verze 2.2 na verzi 2.6.
Rozsudky Soudního dvora Evropské unie ve věcech C-465/20 P (Apple) a C-48/22 P (Google a Alphabet): Irsko poskytlo společnosti Apple protiprávní daňová zvýhodnění ve výši 13 miliard eur a je povinné je získat zpět. Byla potvrzena pokuta ve výši 2,4 miliardy eur uložená společnosti Google za to, že zneužívala svého dominantního postavení tím, že upřednostňovala vlastní službu srovnávání výrobků.
Apache Cassandra (Wikipedie), tj. open source NoSQL distribuovaná databáze, byla vydána v nové major verzi 5.0. Přehled novinek v příspěvku na blogu a v souboru NEWS na GitHubu.
Společnost MNT Research oznámila, že po open source noteboocích MNT Reform a MNT Pocket Reform bude následovat MNT Reform Next. Časem se objeví na Crowd Supply. Vývoj lze sledovat na Mastodonu.
Apple představil (YouTube) telefony iPhone 16 Pro a iPhone 16, hodinky Watch Series 10 a Watch Ultra 2 a sluchátka AirPods 4, AirPods Pro 2 a AirPods Max.
Byla vydána verze 0.9.0 operačního systému Redox OS (Wikipedie). Jedná se o mikrokernelový unixový operační systém naprogramovaný v programovacím jazyce Rust. Zdrojové kódy jsou k dispozici na GitLabu pod licencí MIT. Z novinek lze vypíchnout aplikace Files, Editor a Terminal z desktopového prostředí COSMIC, RustPython nebo webový server Simple HTTP Server.
Dnes ve 23:59 končí hlasování o přednáškách na konferenci LinuxDays 2024, která proběhne o víkendu 12. a 13. října v Praze.
Vývojáři KDE ve spolupráci se společností Slimbook oznámili 16palcový notebook KDE Slimbook VI s předinstalovaným KDE Neon s Plasmou 6. Uvnitř se nachází procesor AMD Ryzen 7 8845HS s integrovanou grafickou kartou Radeon 780M.
Ve Würzburgu dnes začala konference vývojářů a uživatelů desktopového prostředí KDE Akademy 2024. Sledovat lze také online (YouTube, Mastodon, 𝕏, …)
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: