class Layouts { constructor() { this._layoutList = document.querySelector("#layouts-list"); this._dropdown = document.querySelector("#layouts-dropdown"); this._button = document.querySelector("#layouts-button"); this._layouts = []; this.layout = {}; this._init(); } _setDefault() { let name = this.layout.name; let description = this.layout.description; let short = this.layout.short_description; this._button.innerHTML = name.toUpperCase() + (short ? ` (${short})` : ""); //this._button.name = description } _setLayoutList() { let dropdown = this._dropdown; dropdown.innerHTML = ""; for (let i = 0; i < this._layouts.length; i++) { let name = this._layouts[i].name; let description = this._layouts[i].description; let short = this._layouts[i].short_description; let li = document.createElement("li"); let button = document.createElement("button"); button.innerHTML = name + (short ? ` (${short})` : ""); button.name = description; button.addEventListener("click", () => { this.layout = this._layouts[i]; this._setDefault(); lightdm.layout = this.layout; }); li.appendChild(button); dropdown.appendChild(li); } } _setKeydown() { let dropdown = this._dropdown; dropdown.addEventListener("keydown", (ev) => { if (ev.keyCode == 27) { dropdown.classList.add("hide"); this._button.focus(); } }); } _setButton() { let dropdown = this._dropdown; document.querySelector("#screen").addEventListener("click", (ev) => { if ( ev.target == this._button || ev.target.parentElement == this._button ) { dropdown.classList.toggle("hide"); } else if ( ev.target != dropdown && ev.target.closest(".dropdown") == null ) { dropdown.classList.add("hide"); } }); document.querySelector("#screen").addEventListener("focusin", (ev) => { if ( !dropdown.contains(document.activeElement) && document.activeElement != this._button ) { dropdown.classList.add("hide"); } }); } _init() { this.layout = lightdm.layout; this._layouts = greeter_config.layouts; this._setDefault(); this._setLayoutList(); this._setButton(); this._setKeydown(); } }