Minulý díl jsem zakončil popisem tří důležitých funkcí, které se vyskytují v hlavním konfiguračním souboru a deklarují klávesové zkratky pro ovládání různých součástek prostředí. Nyní již představím alespoň část konfigurace , konkrétně pak definici zkratek pro třídu WScreen. Když pominu úvodní řádky nápovědy, tak první výkonné příkazy vypadají následovně:
defbindings("WScreen", { bdoc("Switch to n:th object (workspace, full screen client window) ".. "within current screen."), kpress(META.."1", "WScreen.switch_nth(_, 0)"), kpress(META.."2", "WScreen.switch_nth(_, 1)"), kpress(META.."3", "WScreen.switch_nth(_, 2)"),
Jak je z výpisu patrné, byly zde použity všechny tři dříve komentované funkce. Dříve, než se pustím do bližšího komentáře ke konfiguraci, přidám ještě další deklaraci, která navazuje na výše uvedené příkazy:
bdoc("Switch to next/previous object within current screen."), kpress(META.."comma", "WScreen.switch_prev(_)"), kpress(META.."period", "WScreen.switch_next(_)"),
Podle nápovědy je možné zjistit, že oba příkazy se týkají přechodu na vybranou pracovní plochu v rámci jedné obrazovky. Jak už je ale v podobných případech zvykem, ovládání je nastavené na číslice a další „divné“ znaky. Proto jsem celou tuto sekci změnil následovně:
defbindings("WScreen", { bdoc("Switch to n:th object (workspace, full screen client window) ".. "within current screen."), kpress(META.."Control+F1", "WScreen.switch_nth(_, 0)"), kpress(META.."Control+F2", "WScreen.switch_nth(_, 1)"), kpress(META.."Control+F3", "WScreen.switch_nth(_, 2)"), kpress(META.."Control+F4", "WScreen.switch_nth(_, 3)"), kpress(META.."Control+F5", "WScreen.switch_nth(_, 4)"), bdoc("Switch to next/previous object within current screen."), kpress(META.."Left", "WScreen.switch_prev(_)"), kpress(META.."Right", "WScreen.switch_next(_)"),
Konkrétně se jedná o přepnutí na vybranou pracovní plochu pomocí kombinace Win+Ctrl+F1 – F5 a přechod na předchozí/následující pracovní plochu kombinací Win+šipka vlevo/vpravo. Ještě než se případní zájemci pustí do zkoušení uvedených funkcí, je třeba je upozornit na důležitou věc: není vůbec apriori jasné, kolik pracovních ploch je deklarováno (samozřejmě kromě té první a viditelné). Problém Notion je totiž v tom, že aktuální pracovní plochu nijak neoznačuje a neodlišuje od těch ostatních. Proto je vhodné na první pracovní ploše otevřít nějaké okno aplikace a následně použít další funkci, které je pořád v tom samém bloku deklarací:
bdoc("Create a new workspace of chosen default type."), kpress(META.."F9", "ioncore.create_ws(_)"),
Pomocí kombinace Win+F9 je tedy možné vytvořit prakticky libovolný počet ploch stejného typu, jako je ta základní. Pro daný účel bude samozřejmě stačit vytvoření pouze druhé pracovní plochy a vyzkoušet příkazy pro přechody mezi oběma plochami. Jenom pro doplnění uvedu další funkci, která vytváří také nové pracovní plochy. Od té jednoduché ji odlišuje možnost v dialogu zadat parametry nově vytvářené pracovní plochy (označení plochy a způsob rozložení oken = layout). Tato funkce je v sekci WMPlex.toplevel.
bdoc("Query for workspace to go to or create a new one."), kpress(ALTMETA.."F9", "mod_query.query_workspace(_)"),
Dále bych chtěl upozornit na deklaraci kombinovaných klávesových zkratek, které jsem zmiňoval v minulém dílu. Jedna z nich se nachází hned po prvních příkazech pro manipulaci s pracovními plochami (v textu jsem vynechal standardně zakomentované řádky)
submap(META.."K", { bdoc("Go to first region demanding attention or previously active one."), kpress("K", "mod_menu.grabmenu(_, _sub, 'focuslist')"), bdoc("Clear all tags."), kpress("T", "ioncore.tagged_clear()"), }),
Zde je nutné konkrétně jako první použít kombinaci kláves Win+K a až se objeví změněný kurzor, tak následně využít samostatně klávesy K nebo T. Průzkum dalších funkcí a klávesových zkratek nyní ponechám na případných uživatelích a přesunu se na úplný konec hlavního konfiguračního souboru. Tam se totiž nacházejí deklarace položek menu. V ní se vyskytují čtyři další funkce, které jsou podle nápovědy definovány následovně:
- hlavní menu, které může být jedno nebo více. Obsahuje název a seznam jednotlivých podřízených položek podle schématu
ioncore.defmenu(name, tab)
- kontextové menu je velmi podobně konstruované a umožní definovat opět jedno nebo více menu včetně podřízených položek. Rozdíl proti hlavnímu menu je v tom, že se kontextové menu samozřejmě definuje pro nějaký kontext, např. rámeček, klientské okno apod.
ioncore.defctxmenu(ctx, ...)
- oba uvedené typy menu pak mohou obsahovat dvě další úrovně. První z nich je funkce pro definici přímo podřízených položek menu. Funkce nastavuje název položky, příkaz k provedení nějaké akce a případný seznam omezení či nastavení
ioncore.menuentry(name, cmd, guard_or_opts)
- další možností je pak definice celého podřízeného menu, které se skládá z vlastních přímých položek. K jeho deklaraci se používá funkce, která nastavuje název podřízeného menu (name, název sekce, kde je toto podřízené menu deklarováno pomocí funkce defmenu a nastavení zvýrazněné položky při spuštění menu (options)
ioncore.submenu(name, sub_or_name, options)
Po teoretickém představení se vrátím ke konkrétní deklarací menu ve standardní konfiguraci WM. Jako první je asi logicky deklarované hlavní menu:
defmenu("mainmenu", { menuentry("Run...", "mod_query.query_exec(_)"), menuentry("Terminal", "mod_query.exec_on_merr(_, XTERM or 'xterm')"), menuentry("Lock screen", "notioncore.exec_on(_, notioncore.lookup_script('notion-lock'))"), menuentry("Help", "mod_query.query_man(_)"), menuentry("About Notion", "mod_query.show_about_ion(_)"), submenu("Styles", "stylemenu"), submenu("Session", "sessionmenu"), })
Jak je z předchozího textu zřejmé, jsou zde obsaženy celkem tři z výše uvedených systémových funkcí:
- defmenu – definuje hlavní menu pod uživatelským názvem mainmenu
- menuentry – deklaruje jednotlivé přímé položky menu
- submenu – definuje podřízené uživatelské menu
Konkrétně se dá konstatovat, že hlavní menu obsahuje celkem pět položek (jednoduchý spouštěč aplikací, spuštění terminálu, zamčení obrazovky, zobrazení nápovědy a informací o WM) a dvě podřízená menu. Jedno z nich je definováno na dalších řádcích:
-- Session control menudefmenu("sessionmenu", { menuentry("Save", "ioncore.snapshot()"), menuentry("Restart", "ioncore.restart()"), menuentry("Restart TWM", "ioncore.restart_other('twm')"), menuentry("Exit", "ioncore.shutdown()"), })
Jedná se o podřízené menu pro správu sezení, kde jsou definovány základní položky pro uložení, restart a ukončení sezení. Kromě hlavního a podřízeného menu je také definované menu kontextové a to dokonce pro několik situací. Jako ukázku zde uvedu jednoduché kontextové menu pro klientské okno, konkrétně pro jeho ukončení:
-- Context menu for client windows defctxmenu("WClientWin", "Client window", { menuentry("Kill", "WClientWin.kill(_)"), })
Kromě deklarace všech možných úrovní a položek menu je také důležité vědět, jakým způsobem se dá toto menu vyvolat. Pro hlavní menu je to naštěstí standardně nastaveno na začátku konfiguračního souboru, kde jsou celkem tři funkce, z toho jednu z nich jsem ještě podrobněji nepředstavil:
bdoc("Display the main menu."), kpress(ALTMETA.."F12", "mod_query.query_menu(_, _sub, 'mainmenu', 'Main menu:')"), mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),
Pouze pro přehled uvádím několik obrázků s otevřeným menu.
Deklarace samozřejmě patří do hlavního balíku deklarací klávesových zkratek pro správu oken (defbindings(„WScreen“, {). Jak jsem již uvedl, jsou zde dvě známé funkce – pro zobrazení nápovědy (bdoc) a klávesovou zkratku, která menu zobrazí pomocí klávesové kombinace Alt+F12 (kpress(…)). Dosud nepředstavená funkce mpress deklaruje spuštění nějaké akce pomocí stisku tlačítka myši. Kromě této funkce jsou pro ovládání myší k dispozici další funkce pro klik, dvojklik a tažení myší:
ioncore.mpress(buttonspec, cmd, guard) ioncore.mclick(buttonspec, cmd, guard) ioncore.mdblclick(buttonspec, cmd, guard) ioncore.mdrag(buttonspec, cmd, guard)
Je možné si všimnout, že všechny uvedené funkce mají stejnou strukturu deklarace, kdy se definuje tlačítko či kombinace tlačítek myši, prováděný příkaz a volitelná definice podmínek. Dalším rozdílem pro otevření menu pomocí klávesové zkratky a myši je použití různých funkcí pro příkaz. Pro klávesovou zkratku je použita funkce
mod_menu.menu(mplex, sub, menu_or_name, param)
Pro spuštění menu pomocí myši je však použita specializovaná funkce
mod_menu.pmenu(win, sub, menu_or_name)
Jenom pro doplnění uvedu speciální funkci pro spouštění menu pomocí klávesnice:
mod_menu.grabmenu(mplex, sub, menu_or_name, param)
Rozdíl proti běžnému spuštění je v tom, že se zde vstup „osahává“ a pomocí klávesové zkratky, kterou se menu otevírá, je možné procházet podřízené položky. Tento doplněk by měl pro objasnění tvorby klávesových zkratek, myších akcí, deklaraci a otevírání menu stačit a bude možné přejít do dalšího kroku. Tím bude podobně jako v předchozích popisovaných WM definice spouštění základních systémových a uživatelských aplikací. Pro jejich deklaraci může sloužit příklad spuštění terminálu, který je k dispozici v základní konfiguraci. Pro nastavení dalších akcí bude nutné upravit konfiguraci ve dvou souborech. Jako první upravím soubor cfg_notion.lua, kde je v základu definován příkaz pro spuštění terminálu (v minulém díle již konfigurovaný):
XTERM="lilyterm"
Pro ukázkovou konfiguraci doplním a upravím celou sekci následovně:
-- Systemove funkce prostredi LOCK = "i3lock --color=008080 --pointer=default --show-failed-attempts" SESSION = "oblogout" -- Spoustece aplikaci DMENU = "dmenu_run" GMRUN = "gmrun" ROFI = "rofi -show run -lines 20 -columns 2" -- Uzivatelske aplikace XTERM = "lilyterm" WEBBR = "netsurf" FIMAN = "xfe" TEDIT = "mousepad"
Po uložení změn je možné se vrátit do konfiguračního souboru cfg_notioncore.lua a v něm najít příkaz pro spuštění terminálu pomocí klávesové zkratky. Ten vypadá následovně:
bdoc("Run a terminal emulator."), kpress(ALTMETA.."F2", "mod_query.exec_on_merr(_, XTERM or 'xterm')"),
Pro spuštění terminálu je použita funkce, kterou nápověda doporučuje pro spuštění GUI aplikací. Existuje i obecnější funkce, kterou je možné použít také:
ioncore.exec_on(reg, cmd, merr_internal)
Tato funkce používá pro běh systémovou proměnnou DISPLAY k zobrazení na hlavním okně (reg). Pokud by se příkaz pro spuštění aplikace uvozoval jednou dvojtečkou, znamenalo by to spuštění aplikace v defaultním terminálu pomocí skriptu ion-runinxterm. Pokud by byl příkaz uvozen dvěma dvojtečkami, tento skript vyzve uživatele ke stisknutí klávesy Enter po ukončení příkazu v terminálu. Příklady lze nalézt i ve standardním konfiguračním souboru. Jenom pro úplnost uvedu ještě další příkaz pro spouštění aplikací, který kromě toho vrací i hodnotu PID nového procesu:
integer ioncore.exec(string cmd)
To by opět mohlo k teorii spouštění aplikací stačit a konkrétní nastavení konfigurace si nechám do dalšího dílu.
Dnešní díl jsem věnoval popisu deklarace klávesových zkratek obecně a konkrétně pak na příkladech definice hlavního a podřízeného menu. Konkrétní ukázkou také byla deklarace spouštění základních systémových i uživatelských aplikací. K nim byl na závěr dílu doplněn popis různých variant spouštění aplikací pomocí nástrojů WM. V příštím dílu dokončím uživatelskou konfiguraci spouštěných uživatelských aplikací a zaměřím se na panel a systémovou lištu.