Používáte grafické rozhraní, a přesto preferujete minimalistická řešení na desktopu? Líbí se vám, když věci fungují optimálně a přitom je potěšení se na ně i koukat? Pak právě vás by mohl zajímat nový projekt xlunch.
V některém dalším blog postu napíšu o tom, jak jsem se za 4 dny znovu naučil základy zapomenutého Céčka, jak programovat pro Xlib, a jak používat Imlib2. Ale dnes jen stučně představím výsledek své práce. Jak známo, obrázek vydá za tisíc slov. Toto je aplikace xlunch, která má po zkompilování celkem 25KB, a slouží ke spouštění programů (klikem na ikonu) nebo příkazů (napsáním na klávesnici). Běží v celoobrazovkovém režimu, podporuje UTF-8, na svém pozadí umí zobrazit obrázek či použít váš aktuální wallpaper (pokud je nastaven na root window).
Vzhled je možné nastavit následujícími parametry:
-d desktop mód, běží na pozadí mimo window manager a forkuje spuštěné programy
-r ... použít aktuálně nastavený wallpaper, pokud je na 'root' oknu desktopu.
tento příkaz selže, pokud váš wallpaper není na root oknu.
-k schová příkazovou řádku a dovolí spustit jen přes ikonu
-g [file] cesta k wallpaperu v souboru JPG/PNG
-m [i] margin (integer) určuje mezeru mezi ikonami v pixelech
-p [i] padding (integer) určuje mezeru okolo ikon (uvnitř)
-b [i] border (integer) velikost okrajů celé obrazovky
-i [i] icon size (integer) velikost ikon v pixelech
-c [file] cesta ke konfiguračnímu souboru s definicí ikon
-n vynutí zobrazení v okně, namísto fullscreen
-t [i] top (integer) vzdálenost v pixelech od horního okraje obrazovky
-x [text] text zobrazený místo anglického 'Run: '
-f [name] font včetně velikosti za lomítkem, např.: DejaVuSans/10
Formát konfiguračního souboru (defaultně v /etc/xlunch/icons.conf):
title;icon_path;cmd
title;icon_path;cmd
title;icon_path;cmd
title;icon_path;cmd
Ideální je nabindovat spuštění xlunch na nějakou klávesovou kombinaci, třeba Alt+F2 ve fluxboxu, nebo mod+d v i3wm. Pokud máte rádi vizuální efekty, tak v .xsession spusťte ještě následující příkaz a dostane se vám krásného zprůhledňovacího přechodu při startu lunch (i ostatních aplikací):
xcompmgr -f
Ve vývoji plánuji dál příležitostně pokračovat, přidat třeba možnost xlunch ukončit (v případě že nechci nic spustit) klikem někam (zatím to jde jen klávesou Esc). Budu rád za vaše připomínky a podněty. Patche jsou rovněž více než vítány.
Video ukázku najdete na: youtube
no vazne mooc pekne :) v Xfce kde mam nastavene pro "maximalizovane okno" "nema okraj" a "nema titulek" je volba -n prakticka kdy zustane zobrazena navic jen lista :)
- pri vygenerovani conf z hodne polozek zjistuju ze ti schazi scrollbar i moznost scrolovani (ale vyhledava/filtruje pri zacatku psani i to co jinak bylo "pod obrazem" :)
- prakticke by bylo aby pri psani zacatku aplikace se pri zmacknuti enteru pustila ta prvni z vysledku, tedy aby nebylo potreba najet nejdriv sipkou na tu prvni (ale zas chvalim ze funguje jak dolu, tak vpravo :)
Ono když člověk píše příkaz a pak mačkne Enter, je těžké poznat, jestli chce odentrovat ten příkaz, nebo odentrovat první z ikonek. Proto jsem to vymyslel tak, že když napíšu příkaz, tak enter entruje ten příkaz. A pokud chci pustit enterem ikonku, tak musím nějak najet na tu ikonku. Buď kliknu myší, nebo se dá máčknout na klávesnici šipku dolu, nebo šipku vlevo, nebo Home, nebo Tab. Cokoli z toho přenese kurzor na první ikonu a enter ju spustí.
Proč Xlib když je xcb? Protože o programování pro X vůbec nic nevím :-). Výchozím bodem pro mě byl nějaký exampl z Imlib2, díky kterému jsem pochopil, jak dělat okna a fungovat s xlib. Nedokážu posoudit, jestli by použití xcb přineslo nějaké výhody.
Nemůžu mluvit za autora, ale na xcb není portováno např. Xft (písmo), ani imlib (obrázky), takže to bude asi důvod.
Reklamacééé - zdroják má 29 KB a binárka 33K ! Klamavá reklama ;-).
s -n mi to padá:
X Error of failed request: BadMatch (invalid parameter attributes)
Major opcode of failed request: 42 (X_SetInputFocus)
Serial number of failed request: 17
Current serial number in output stream: 17
Asi bych pro to měl užití i jako ne-fulscreen aplikaci, to by se -n hodilo, ale i takhle se mi to líbí - do icewm by se to mohlo velice dobře hodit i jako launcher ikon (to by ale chtělo, aby se to neukončilo po výběru aplikace - nějaký další přepínač ?)
Zajímavé, u mě na debianu 32bit to zkompiluje do velikosti 26676 B, a dá se to stripnout na 20424 B :-)
S parametrem -n to padá na BadMatch, a bez toho parametru to funguje? A ukončí se to s -n úplně vždy? To je dost zajímavé. Hodilo by se mi to reprodukovat. Jaký window manager a OS je použit? To bych potřeboval nějak pořešit, párkrát už jsem tenhle BadMatch viděl, ale úplně nevím, jak to debugovat, protože se mi to stalo jen náhodně, a při dalším spuštění už to prošlo bez problému. Děje se to na řádku, kde kradu input okenímu manažeru, takže to asi bude záviset na WM
Neukončení po výběru aplikace zatím neumím. Ono to těď zavolá nějaký exec(), který funguje tak, že spouštěnou aplikací nahradí aktuální proces. Vyřešit se to asi musí nějak forknutím, ale s tím nemám praktické zkušenosti.
Tak to by sedělo, tady 64bit ;-). Bez -n to funguje. Zkoušel jsem to na různých místech, padá vždycky. Debian 9, (Stretch), Window manager lxde + compiz + emerald jako dekorátor (večer můžu zkusit ještě icewm. Fakt je, že emerald občas padá sám od sebe, ale compiz sám jede celkem bez problémů.
Ten fork() by imho docela rozšířil univerzálnost použití (pak možná ještě zadání rozměrů přes -geometry ;-) ).
Tak jsem si s kódem chvilku pohrál a kdykoliv
attributes.override_redirect=0;
tak to buchne. Vypnul jsem 3D kostku a ostatní blbiny co mám zapnuté a chová se to stejně.
Mimochodem, non-SI jednotka "M" jako "Moješířka_monitoru" mne docela pobavila ;-).
attributes.override_redirect dělá právě to, že disabluje window manager pro tenhle program (aby tak šel udělat fullscreen bez dekorace okna). Zkoušel sem nainstalovat si emerald ale taky nějak bez úspěchu, debian nic takového nezná. Na nějakém fóru jsem našel, že emerald je mrtvý projekt ještě dýl než compiz (z toho skoro plyne že oba jsou dead).
Obecně víme kde to padá - na řádce 681 (XSetInputFocus) ... jen nevím proč, ani nevím jak to udělat aby to při chybě třeba nějak ignorovalo a pokračovalo dál.
Zkusíme něco. Přidal jsem tam, aby to XSetInputFocus volalo pouze když je aktivní fullscreen.
Prosím zkus stáhnout znovu z GITu a rekompilovat. Díky! :)
moc jsem ten kód nezkoumal, ale po kompilaci to s -n nepadá, ale vypadá to úplně stejně jako bez -n :-).
Omalovánky zvané Compiz + emerald rostou díky přátelské bandě francouzských pošuků tady:
deb http://download.tuxfamily.org/compiz/debian stretch main
> attributes.override_redirect dělá právě to, že disabluje window manager pro tenhle program (aby tak šel udělat fullscreen bez dekorace okna
Tak tohle je samozřejmě ta největší hovadina (promiňte), co jsem slyšel. Fullscreen stylem "override redirect" a nastavením okna na pozici 0,0 a velikost na šířku/výšku root okna dělají dodnes jen prasácké programy (převážně komerční hry). Počti třeba na 1). Hledej _NET_WM_STATE a _NET_WM_STATE_FULLSCREEN. To je správný způsob, jak si o fullscreen zažádat u window manageru.
1) https://specifications.freedesktop.org/wm-spec/1.3/ar01s05.html
Jak jsem psal už v blogu samotném, celý tenhle program jsem spáchal za 4 dny bez jakékoli znalosti Xlib, a s minimálníma základama C. Je s podivem že to vůbec funguje :)
Když jsem bádal nad tím, jak udělat fullscreen, našel jsem popis kde bylo vysvětleno, jak mplayer má problém právě s tím, že i když požádá window manager o fullscreen, někde to nemusí fungovat. A bylo tam popsáno právě použití override redirect, a to že funguje stoprocentně všude. Tudíž jsem to použil, aniž bych pochopil co jsem přesně udělal :) Bylo to na 3 řádky kódu.
Pokud je čistší cesta, která funguje všude, rád ji tam dám. Ale potřebuju nějaký pár-řádkový example. Odkaz na desetistránkovou specifikaci z freedesktop fakt nebudu číst, neb jsem příliš líný to pochopit, nemám v úmyslu se živit vývojem aplikací pro X. Prosím, pokud oněch pár řádků znáte, napište je. Děkuji.
> Zde je kod, 2 moznosti: http://pastebin.com/EHFAFSJj
zkompiluje se to OK, ale nefunguje to. Apka nastartuje v okne. Mam momentalne LXDE
Tak jsem to zkusil v lxde a jede mi to. Jak nainstaluju ten compiz? apt-get install compiz nefunguje.
viz https://brennan.io/2015/01/16/write-a-shell-in-c/#how-shells-start-processes
(z článku o psaní shellu pro linux)
Pěkné, pokud by se dalo přepínačem zablokovat spouštění příkazů, byl by to pěkný launcher pro různé kiosky.
> Pěkné, pokud by se dalo přepínačem zablokovat spouštění příkazů,
> byl by to pěkný launcher pro různé kiosky.
To je super nápad, udělám to ještě dnes.
Nicméně to má možná háček. Totiž, když uživatel spustí nějaký program, přijde o launcher.
Musím tedy do budoucna ještě vyřešit, jak nechat launcher aktivní (forknout proces před exec) a na pozadí (tj aby nebyl furt on top).
Možná mi něco uniká, ale ve fluxboxu by šlo jednoduše nastavit abyste ho spouštěl o vrstvu níž a ty vybrané aplikace nad ním.
Potom už by zbylo jen vyřešit to forknutí.
Přesně na podobný účel bych xlunch rád použil, prosím také o dodání možnosti blokace příkazů a "nesmrtelnosti" launcheru.
Děkuji
Děkuji všem za podnětné komentáře, vydal jsem právě novou verzi, která už dělá fullscreen tak jak by se správně mělo (v případě normálního spuštění), a umí i Desktop mód - v tomto módu funguje jako klikatelné pozadí, spouští aplikace pomocí fork, a nejde ukončit.
tak aktualni mi uz nejde pusit :) zkouseno pod Xfce (na Xubuntu 14.04, Xubuntu 16.04, Debian8, ArchLinux)
v obou *buntu mi to hlasi warning, abych pravdu rekl nevim jiste jestli to nebylo i predtim, to sem tedy zkousel jen pod 14.04 kdy mi to slo, v cas (=git pull) viz me prispevky nahore
$ ./recompile-and-run
xlunch.c: In function ‘run_command’:
xlunch.c:574:8: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat=]
printf("Error running %s : %d\n",cmd);
^
na zadnem distru se po spusteni nestane nic, zadna chyba, jen se to hned ukonci bez zobrazeni cehokoliv
zkousel sem s i bez -k -d -n -s -r :) cmdline z recompile_and_run , puvodni muj runscript, s muj i bez generovanej config...
tak sem zkusil checkout predchozich commitu a rozbije mi to 11f0cb3, pri 5e022f7 problem nemam :)
To je zajimave. Opravil jsem ten warning, ale proc to nejde spustit nevim, pac me to de :)
Pise to neco misto toho aby se to spustilo?
tak warning uz neni, ale prave ze nepise pri spusteni vuuubec nic, vypada to nejak takto :)
nobody@nopc:~$ xlunch
nobody@nopc:~$
hodil sem vystup z strace jestli te neco trkne :) http://pastebin.com/N0f0BpAS
exit 3 ... to je exit kod kdyz se tomu nepovede vytvorit soubor ve /var/run/xlunch.lock
Ted me tak uplne napadlo, ze vlastne nevim jestli je /var/run zapisovatelny uzivatelema ... asi ne co?
Prosim zkus stahnout nejnovejsi verzi, zmenil sem cestu na /tmp/xlunch.lock
do /var/run/ user zapis nema a bylo to ono :) aktualni verze z git uz se mi zas pousti ok, diky :)
bugreport: Makefile
- v pripade ze uz je jednou zkompilovane a/nebo vytvorenej icons.conf, tak uz to znovu neudela
- problem je s tim ze mas 2 sekce pojmenovane jako soubory v aktualnim adresari: xlunch a icons.conf
- resenim je zmenit nazvy obou sekci na velka pismena, nebo pridat tecku na zacatek, nebo zmenit nazev
btw: sledujes to tu, nebo radeji bugreport pres github issue nebo fork i na takovouhle drobnost?
Přidal jsem několik módů.
Fork mode = spouští aplikace jako fork a neukončí launcher
Desktop mode = drží se jako nejnižší okno, takže třeba na openboxu funguje jako pozadí s ikonami
Kiosk mode = neukáže run prompt, ani nejde spustit příkaz ručně napsáním, pouze výběr z ikon šipkami
Módy je možné kombinovat k dosažení kýženého výsledku, třeba všechny tři dohromady.
už se těším až to budu moci vyzkoušet - ještě malý námět - na původním eee (Xandros/Debian) byl tzv. ApplicationLauncher, který ještě navíc uměl rozdělit ikony na ploše podle "zaměření" - EEE bylo easy to Learn (slovníky a podobně) easy to Work (offíce atd) easy to Play (hry) + tam bylo nějaké "nastavení". Kdyby uměl tuto "dvojúrovňovost" (t.j. například ikonka "office" a pod ní writer/impress/calc) - třeba jako link na další "podkonfigurák", asi by neměl ve své třídě konkurenci.
No tak ono to jde velice snadno i se současným xlunchem.
Akorát si musíte udělat víc konfiguračních souborů.
Jeden bude jakože Master, a bude mít ikonky jakože složky, office, atd.
A po kliku se spustí zase xlunch, s parametrem jiného konfiguračního souboru kde už budou ikonky těch aplikací na spuštění.
Takže xlunch bude spouštět další xlunche. A máte úrovní kolik chcete :)
Kdybych neco podobne delal, tak pouziji slozku s linky. Obsah slozky zobrazim. Nastaveni bych tahal z textoveho souboru v te slozce. Tam by byla treba poloha ikonek. Navic, cela plocha, vcetne treba oramovani skupin by se dala vygenerovat jako obrazek. Pak bych teda uz pouzil slozku sett/, kde by teda bylo rozlozeni ikonek, skupin, obrazek pozadi, obrazek po vygenerovani. Tez by to mohlo mit vice obrazovek, jako tablet.
Jinak by to mohla byt zajimava legracka pri bootovani z flash / cd, kdyz na ni ma clovek servisni aplikace jako memtest a pod. Mam tu starsi Hiren's BootCD a nejvic mne tam prave otravovalo prave to psani a nemoznost si tam urcit treba vlastni seznam aplikaci, kategorie a nazvy.
-f na Xfce (Xubuntu 14.04 + Xfce 4.12 PPA) aplikaci spusti na pozadi, resp. xlunch je v popredi a nelze se na nic prepnout, tedy xlunch se chova jako by mel nastavenou "always on top"
-k chtelo by to jeste mod kdy nejde pustit zadny prikaz, ale jde pouzit psani pro filtrovani ikon, v tom pripade by mohlo prijit na radu i to co sem psal nahore, ze enter pusti prvni ikonu bez potreby najet na to sipkou ;)
-f je font. Asi spis -v, ne? jakoze fork mode.
Je nutne fork mode kombinovat s -d, jinak to nefunguje. Ono se da ocekavat, ze pri fork modu ten spoustec bezi jako na pozadi (tzn pod vsemi okny).
Asi by to chtelo nejak vychytat jeste lip, ale to by asi chtelo nejprve poradne vyresit ten fullscreen mod, protoze ten zpusobuje to ze je xlunch furt on top i kdyz vlastne nekdy nechcem :]
jasne, sorry.. myslel sem -v jako fork ;) s -d sem to zkusil kombinovat nez sem to psal, ale to zas spadne pod aktualne otevrena okna, tedy pri opravdovem desktop modu kdy nejsou zadne uz otevrene okna je to ok :)
Dobre prace, i kdyz sam pouzivam idesk.
Rozumite xlib? Mel bych dotaz trochu mimo: Vytvarim (nebo spise jsem prevzal) jednoducheho spravce oken, zalozeny na knihovne Fox. Jednim z problemu, se kterym nemohu hnout, je to, ze kdyz kliknete mysi kamkoliv do oblasti top-okna, melo by se dane okno aktivovat (ziskat fokus a "restacknout"). At zkousim cokoliv nedari se mi prijit na zpusob jak to zaridit. Funguje to jedine v pripade, ze uzivatel klikne na ram, ci do titulkove oblasti (tedy na prvky, ktere jsou vytvareny primo WM, takze si jejich udalosti obslouzi sam. Pokud klikne nekam do obsahu okna, uz o tom WM neni informovan).
Zkousel jsem hledat i ve zdrojovych kodech jinych WM, ale neobjevil jsem nic zajimaveho, ale je vsak mozne, ze mi neco unika. Kdyby jste nahodou vedel ci tusil, mohl bych poprosit o nasmerovani. predem diky.
> zkompiluje se to OK, ale nefunguje to. Apka nastartuje v okne. Mam momentalne LXDE
Mělo by to fungovat. Důležité je nejprve poslat map request a poté fullscreen request. Tohle mi normálně ukáźe fullscreen okno: http://pastebin.com/YgdWdpy5
> At zkousim cokoliv nedari se mi prijit na zpusob jak to zaridit. Funguje to jedine v pripade, ze uzivatel klikne na ram, ci do titulkove oblasti (tedy na prvky, ktere jsou vytvareny primo WM, takze si jejich udalosti obslouzi sam. Pokud klikne nekam do obsahu okna, uz o tom WM neni informovan).
Potřebujete na okno možná zavolat XSelectInput se správnými maskami, abyste byl informován o požadovaných událostech. Bez toho vám asi události z cizích oken chodit nebudou. Ale v tomhle se moc nevyznám.
Diky za reakce.
Obecne, udalosti "kliknuti" generuje XServer a posila je potom jednotlivym oknum. Jsem si jisty, ze jine WM je umi odchytit - ted jen prijit na to, jak. :(
[Jardik_ ] Ja to pochopil tak, ze XSelectInput( ) by mel WM zavolat na zacatku a od te chvile by mel zachytavat odpovidajici eventy. U me je to volani takhle:XSelectInput( DISPLAY, rootid, SubstructureRedirectMask | SubstructureNotifyMask | EnterWindowMask | KeyPressMask | KeyReleaseMask | PropertyChangeMask | ColormapChangeMask | ButtonPressMask | ButtonReleaseMask );... a bohuzel nic :( To ze by se mela tahle funkce volat pro kazde sledovane "cizi" okno je pro me nove... Zkusim timhle smerem zapatrat. Dik.
No ja sem makefile nikdy nepsal, a z toho co sem vykoukal z jinejch makefilu sem pochopil, ze kdyz tam napisu nazvy souboru ktere maji byt vygenerovane, tak je to uz podruhe nedela kdyz uz jednou jsou. A to je presne to co chci - kdyz uz se nejaky fajl vytvoril, tak neni duvod ho delat znovu. Je dost mozny, ze to chapu spatne :) jak by to melo byt lip? TM
ale vem si ze kdyz mam zkompilovane a dam git pull tak naslednej make uz to nove nezkompiluje, kdyz uz mam icons.conf a doinstaluju nejake aplikace (tedy prida se mi neco do /usr/share/applications) tak se uz mi take negeneruje znovu...
bezne make dela znovu kompilaci zmenenych casti, ale v tomto pripade kdyz by si toho clovek nevsimnul tak ma porad starej xlunch a starej conf, pridal si sice "make clean" coz to jakoze resi, ale stejne bych to zmenil ;)
tohle je ovsem idealeni reseni, kdy se kompiluje jen pri zmene zdrojaku :)
https://github.com/DX37/xlunch/commit/150010564081e210164388f5ebfe85f231e166b0
Ten github commit jsem akceptoval a dekuji za nej.
Obecne nechci genconf spoustet vic nez jednou, on je tam stejne jenom tak pro zacatek, aby clovek nemusel pridavat uplne rucne vsechny ikony, ale spravny postup je naeditovat si ty ikony rucne.
Opravil jsem nejake dalsi veci a pridal par malinkych featur, tak kdo ma zajem, muze zkusit nejnovejsi verzi.
aby nedoslo k mejlce, ten commit nebyl muj ;)
zkousel sem aktualni verzi a mutimonitor uz chodi ok a bez nastavovani xlunch :)
rozliseni je v poradku a co vic, sikovne se pusti xlunch na tom kde mam zrovna mys :)
(Xubuntu 14.04.5 + Xfce 4.12 PPA)
tip: do genconf pridej sort aby bylo dle abecedy:
-find $APPS | fgrep .desktop | while read DESKTOPFILE; do
+find $APPS | fgrep .desktop | sort | while read DESKTOPFILE; do
pripadne i podle casu modifikace a/nebo pridat razeni primo do xlunch, toho co jde, nebo pri rozsireni formatu conf i podle casu, kategorie, jmena desktop, jmena exe atd :)
Skvělá věc, stáhl jsem, zkompiloval a spustil ... na Debianu 7 šlape jak hodinky. Tedy aspoň při spuštění make test. Make install zas tak úplně dělat nechci, spíš zkusím vytvořit Debianí balíček a instalovat klasickým způsobem. Výsledek (pokud budu úspěšný) nabídnu samozřejmě sem.
Trochu mě to osvěžilo vzpomínky na jeden můj (neúspěšný) pokus o vytvoření funkce podobné expose z MacOS. Co by v tuto chvíli mělo být reálné, a co si hned zkusím: před vlastním spuštěním xlunch si sejmu obrazovku a podhodím ji prográmku jako background image. Uvidím, jak se mi to osvědčí :-)
pro expose like je dobre skippy-xd ;)
http://www.webupd8.org/2013/07/skippy-xd-expose-like-window-picker-for.html
Tomáš je autorem několika více či méně známých projektů jak z oblasti operačních systémů, tak internetu. V současnosti samozvaný expert na Linux, Bash, PHP a MySQL.
Přečteno 25 945×
Přečteno 23 974×
Přečteno 19 497×
Přečteno 18 283×
Přečteno 12 887×