Portál AbcLinuxu, 25. dubna 2024 17:30


Dotaz: Screenshot neaktivního okna v X

13.12.2010 01:37 Jaroslav Polakovič
Screenshot neaktivního okna v X
Přečteno: 345×
Odpovědět | Admin
Zdravím,

mám tu úkol pro opravdové fajnšmekry. :)

Řekněme, že mám k dispozici trusted java applet, takže můžu spouštět příkazy operačního systému a přes JNA používat i systémové API, a potřebuju udělat screenshot neaktivního (!) okna, u kterého však lze předpokládat, že žádnou svou částí "neleze pryč z obrazovky", není minimalizované a nachází se na aktivní ploše. Ve Windows toho lze dosáhnout přes Win32 API.

Ovšem Unix-based systémům příliš nerozumím, takže jsem naivně zkusil spustit xwd s parametrem ID rovnajícím se ID okna, které potřebuji sejmout. Výstupem sice je správný výřez obrazovky o velikosti žádaného okna, ovšem na obrázku jsou zachycena okna, která se nacházejí nad tím, které mě zajímá. To samé při přímém využití fce XGetImage z knihovny XLib. Jakékoli nastavení backing store v tomto případě nic moc neřeší.

Samozřejmě je možné programově přesunout žádané okno nad ostatní, udělat screenshot, a zase vše vrátit do původního stavu, já bych ovšem rád celou věc vyřešil bez toho - ideálně, aby se vše dělo na pozadí.

A zde právě uvítám geniální nápad. Vlastně jakýkoli nápad, protože já jsem ztracen.

Požadavkem je multiplatformnost (ideálně funkční na všech rozšířených distrech i na OSX) a co nejmenší nárok za cílového uživatele. Ideálně jediná věc, která by jej měla obtěžovat, je popup "Ano / Ne" při povolování práv appletu. Při samotném snímání screenshotu by ideálně měl uživatel mít možnost normálně se systémem pracovat, být jen minimálně omezen (např. je v pořádku nutnost zůstat celou dobu na jedné ploše).

Velice vám děkuji za všechny nápady!

Řešení dotazu:


Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

14.12.2010 23:28 Mips
Rozbalit Rozbalit vše Re: Screenshot neaktivního okna v X
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tohle je opravdu hodně speciální požadavek. Velmi pochybuji, že to lze udělat jen s pomocí Java API. Nejdřív bych se asi zeptal v linuxové či unixové poradně, zda na to vůbec existuje nativní API. V případě, že existuje, nabízí se použití JNI.
14.12.2010 23:41 Dero
Rozbalit Rozbalit vše Re: Screenshot neaktivního okna v X
Děkuji za odpověď.

Od položení dotazu jsem se trochu posunul. Experimentálně jsem zjistil, že nástroj import z kolekce ImageMagick takový screenshot vytvořit dokáže, takže se blíže podívám na zdrojové kódy a nechám se inspirovat.

A ano, dalším krokem je použití JNI pro přístup k nativnímu API napříč platformami. Jen pro zajímavost uvádím, že toho lze dosáhnout nejen na Xkách, ale i ve Windows a dokonce zřejmě i v nových verzích OS X (Leopard a Snow Leopard).
15.12.2010 08:07 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Screenshot neaktivního okna v X
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nedávno jsem řešil podobný problém - potřeboval jsem se podívat na obsah okna na vzdáleném počítači, kde byl spuštěný screensaver (zamknutá session). Obávám se, že to nějak jednoduše nepůjde, protože X server nemá nikde vyrenderované bitmapy částí oken, které nejsou v danou chvíli vidět. Kdyby je totiž měl, nebylo by při odkrytí části okna nutné generovat event pro příslušný proces, aby ji překreslil; zkuste např. odkrýt část okna programu, který je v daném okamžiku zastavený (stav T) - odkrytá část se nevykreslí, dokud proces opět nerozběhnete. Možná by to ale šlo obejít tím, že by se okno dočasně přesunulo nahoru, udělal se screenshot a pak by se zase vrátilo zpátky (pokud to jde).
15.12.2010 11:30 Dero
Rozbalit Rozbalit vše Re: Screenshot neaktivního okna v X
Také děkuji za odpověď.

Zajímavé však je, že nástroj import z kolekce ImageMagick dokáže udělat screenshot okna, které je částečně nebo úplně zakryté jiným oknem. Pravda, se zamknutou session nebo s oknem na jiné ploše / mimo obrazovku, si také neporadí. To mně ale nevadí. Jak jsem psal výše, musím blíž prozkoumat zdrojáky importu.
15.12.2010 11:59 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Screenshot neaktivního okna v X
On ho sice udělá, ale kdykoli jsem to zkoušel, tak zakrytá část okna byla na screenshotu černá (nebo vyplněná jinou barvou pozadí). Což by odpovídalo tomu, co jsem psal výše.
15.12.2010 12:08 Dero
Rozbalit Rozbalit vše Re: Screenshot neaktivního okna v X
Zkoušel jsem před pár dny nejnovější verzi importu na Ubuntu a screenshot okna obsahuje i ty části, které jsou zakryté jinými okny. To třeba XWD nedokáže. A ne, obrazovka neproblikne, nedochází k přesunutí okna na nejvyšší úroveň a rychlému vyfocení.

Rozjedu ještě nějakou další distribuci ve VM, abych to otestoval, ale rád bych doufal, že to je opravdu novou verzí nástroje, nikoli nastavením distribuce. Ačkoli chápu, že s přihlédnutím k principu fungování X je to podivné.
15.12.2010 15:14 l4m4
Rozbalit Rozbalit vše Re: Screenshot neaktivního okna v X
Jestli se to taky nechová jinak, když ti jede compositing...
15.12.2010 15:28 l4m4
Rozbalit Rozbalit vše Re: Screenshot neaktivního okna v X
Taky jsem si tu diskusi mohl nejdřív dočíst celou...
Řešení 1× (Dero)
15.12.2010 12:16 Luboš Luňák | skóre: 19 | blog: Seli
Rozbalit Rozbalit vše Re: Screenshot neaktivního okna v X
Odpovědět | | Sbalit | Link | Blokovat | Admin
Je potřeba mít okno přesměrované do pixmapy - buď musí běžet kompozitní manažer, nebo XCompositeRedirectWindow().
15.12.2010 12:45 Dero
Rozbalit Rozbalit vše Re: Screenshot neaktivního okna v X
Tohle je přesně to nasměrování, které jsem potřeboval. Označuji jako řešení a děkuji všem diskutujícím.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.