Systémové prvky GUI - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Seriály

Více seriálů



Začínáme s

Systémové prvky GUI

15. července 2010, 00.00 | Dnes se již ponoříme do "opravdických" novinek samotné objektové knihovny AppKit, a začneme novou možností specifikovat požadované nastavení systémových prvků GUI.

V současnosti se v našem seriálu, věnovaném programování v Cocoa, zabýváme novinkami systému 10.6 Irbis ("Snow Leopard") pro vývojáře. V minulém dílu jsme se začali zabývat aplikačními službami: soustředili jsme se na podporu "fast killing", jež je sice z technických důvodů implementována v knihovně Foundation, ale až na výjimky má smysl právě pro aplikace. Dnes se již ponoříme do "opravdických" novinek samotné objektové knihovny AppKit, a začneme novou možností specifikovat požadované nastavení systémových prvků GUI.

Řada aplikací potřebuje speciální nastavení těchto prvků: skrytí hlavní nabídky při horním okraji obrazovky, skrytí doku (ať již podmíněné s možností jej kdykoli zobrazit najetím myší k odpovídajícímu okraji obrazovky, nebo nepodmíněné, kdy uživatel dok vidět nesmí vůbec), uzamčení celé obrazovky pro danou aplikaci v tzv. "kioskovém" režimu apod. Až dosud bylo nutné těchto efektů dosahovat pomocí kombinace API nižší úrovně (typicky Carbonu), specifikace položek typu LSUIElement v konfiguračním souboru aplikace "Info.plist" a všelijakých triků (z nichž asi nejběžnějším bylo zobrazení vlastního okna přes celou obrazovku v nejvyšší úrovni, takže překrylo všechny ostatní grafické prvky). Irbis nicméně nabízí nové API, jehož prostřednictvím je možné dosáhnout požadovaných efektů čistě a korektně.

"Presentační přepínače"

Aparát, který k tomu AppKit v Mac OS X 10.6 používá, je jednoduchý: systém definuje řadu přepínačů, jež specifikují všechny možné (nebo alespoň všechny Applem uznávané ☺) potenciální varianty nastavení systémových prvků GUI pro danou aplikaci. Tyto přepínače jsou nazvány "presentation options", a jsou definovány jako hodnoty nového typu NSApplicationPresentationOptions (samozřejmě s využitím nového přístupu Irbisu, kdy jsou pro lepší kompatibilitu výčtové typy fakticky deklarovány jako NSUInteger).

Třída NSApplication nabízí trojici základních služeb pro práci s těmito přepínači. Prvé dvě jsou zcela samozřejmé

-(NSApplicationPresentationOptions)
  presentationOptions;
-(void)setPresentationOptions:
  (NSApplicationPresentationOptions)new;

z nichž první zjistí platné nastavení pro aplikaci, jež ji volá; druhá naopak vyžádané nastavení uloží.

Toto nastavení ale nemusí odpovídat aktuálnímu stavu systému: pokud volající aplikace není aktivní, řídí se nabídka, dok atd. podle nastavení daného aplikací v popředí. Chceme-li, můžeme aktuálně platné nastavení zjistit pomocí třetí služby:

-(NSApplicationPresentationOptions)
  currentSystemPresentationOptions;

Chceme-li sledovat změny platného nastavení, můžeme využít toho, že na tyto služby se můžeme dívat jako na atributy presentationOptions (měnitelný) a currentSystemPresentationOptions (pouze ke čtení) aplikačního objektu; tyto atributy jsou plně kompatibilní se systémem KVO (Key-Value Observing), a můžeme si vyžádat automatické zasílání notifikací při jejich jakékoli změně pomocí standardního systémového API (my jsme se systému KVO věnovali již před časem v dílu Sledování změn objektů a následujících).

Konkrétní možnosti nastavení

V současnosti AppKit definuje následující konkrétní hodnoty přepínačů v rámci typu NSApplicationPresentationOptions; tyto přepínače lze podle potřeby také vzájemně kombinovat pomocí bitového součtu ("|"), ale samozřejmě ne všechny kombinace jsou přípustné:

NSApplicationPresentationDefault: standardní nastavení pro běžné aplikace (vylučuje se s kterýmkoli z přepínačů, jde o nulovou hodnotu, tedy žádný z nich);

NSApplicationPresentationAutoHideDock: dok je skryt, ale objeví se, pokud myší najedeme k odpovídajícímu okraji obrazovky (vylučuje se s následujícím přepínačem NSApplicationPresentationHideDock);

NSApplicationPresentationHideDock: dok je skryt a nelze jej nijak zobrazit, dokud je aplikace, jež si toto nastavení vyžádala, aktivní (vylučuje se s minulým přepínačem NSApplicationPresentationAutoHideDock);

NSApplicationPresentationAutoHideMenuBar: hlavní nabídka je skryta, ale objeví se, pokud myší najedeme k hornímu okraji obrazovky (vylučuje se s následujícím přepínačem NSApplicationPresentationHideMenuBar; naopak při jeho použití je povinný jeden z přepínačů NSApplicationPresentationAutoHideDock nebo NSApplicationPresentationHideDock, tj. nelze skrýt nabídku a ponechat dok – Steve ví, co k tomuto poměrně nesmyslnému požadavku Apple vede);

NSApplicationPresentationHideMenuBar: hlavní nabídka je skryta a nelze ji nijak zobrazit, dokud je aplikace, jež si toto nastavení vyžádala, aktivní (vylučuje se s minulým přepínačem NSApplicationPresentationAutoHideMenuBar; naopak je – trochu podobně jako minule – při použití tohoto přepínače povinný také přepínač NSApplicationPresentationHideDock);

NSApplicationPresentationDisableAppleMenu: standardní položky nabídky Apple jsou zakázány;

NSApplicationPresentationDisableProcessSwitching: přepínání aplikací pomocí kombinace Command+Tab je zakázáno;

NSApplicationPresentationDisableForceQuit: zobrazení panelu pro násilné ukončení kterékoli z aplikací pomocí kombinace Command+Alt+Esc (nebo z hlavní nabídky) je zakázáno;

NSApplicationPresentationDisableSessionTermination: položky hlavní nabídky pro ukončení, restart a odhlášení uživatele jsou zakázány, stejně jako panel, který se standardně zobrazí po stisknutí vypínače (není-li mu přiřazeno uspání počítače);

NSApplicationPresentationDisableHideApplication: skrytí aplikace je zakázáno;

NSApplicationPresentationDisableMenuBarTransparency: průhlednost hlavní nabídky je zakázána.

Pro kterýkoli z přepínačů NSApplicationPresentationDisableProcessSwitching, NSApplicationPresentationDisableForceQuit, NSApplicationPresentationDisableSessionTermination a NSApplicationPresentationDisableMenuBarTransparency je zároveň povinný buď přepínač NSApplicationPresentationAutoHideDock nebo NSApplicationPresentationHideDock; i zde je smysl požadavku značně nejasný, nicméně takto se v Apple rozhodli podmínky stanovit...

Pokud některé z těchto prapodivných omezení nedodržíme, služba setPresentationOptions: nic neprovede a vyvolá výjimku NSInvalidArgumentException.

Nová podpora na úrovni třídy NSView

Třída NSView již od verse Mac OS X 10.5 Leopard nabízí službu enterFullScreenMode:withOptions: pro situace, kdy chceme umístit rámec přes celou obrazovku (typicky tedy jde právě o aplikace "kioskového" typu, případně hry, což je z hlediska práce s obrazovkou v zásadě totéž). My jsme si dosud tuto službu nepopisovali vzhledem k jejímu spíše okrajovému využití; jen ale pro ty, kdo s ní pracují, se zmíníme o tom, že nyní v jejím slovníku atributů může být položka s klíčem NSFullScreenModeApplicationPresentationOptions, jejíž hodnotou je požadovaná sada výše popsaných přepínačů (uložená v podobě objektu třídy NSNumber, vytvořeného např. pomocí standardní zprávy numberWithUnsignedInteger:).

Za zmínku snad stojí také to, že při použití tohoto klíče nedojde v žádném případě k uzamčení obrazovky pro danou aplikaci ("capturing screen"); pro spolehlivé zamezení tedy lze do slovníku v Irbisu přidat s klíčem NSFullScreenModeApplicationPresentationOptions položku

[NSNumber numberWithUnsignedInteger:
  [[NSApplication sharedApplication]
  presentationOptions]

Konečně pak ti, kdo tuto službu používají, mohou v Irbisu zprávu posílat i rámcům, jež nejsou uloženy v žádném okně (požadavek existence okna v tomto případě byla v Leopardu chyba, a v Apple ji opravili).

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Tipy a Triky  

 » Rubriky  » Začínáme s  

 » Rubriky  » Software  

 

 

 

Nejčtenější články
Nejlépe hodnocené články
Apple kurzy

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: